From 83f0547d842598e23778937813c381441bfb732c Mon Sep 17 00:00:00 2001 From: Praveen Arimbrathodiyil Date: Fri, 25 Sep 2015 12:07:36 +0530 Subject: [PATCH] Imported Upstream version 8.0.2 --- .gitignore | 5 +- .rubocop.yml | 2 + CHANGELOG | 92 +- CHANGELOG-CI | 298 ++++++ Gemfile | 212 ++-- Gemfile.lock | 556 ++++++----- Procfile | 3 +- README.md | 2 +- VERSION | 2 +- app/assets/fonts/OFL.txt | 92 ++ app/assets/fonts/SourceSansPro-Black.ttf | Bin 0 -> 148368 bytes .../fonts/SourceSansPro-BlackItalic.ttf | Bin 0 -> 116360 bytes app/assets/fonts/SourceSansPro-Bold.ttf | Bin 0 -> 148932 bytes app/assets/fonts/SourceSansPro-BoldItalic.ttf | Bin 0 -> 116192 bytes app/assets/fonts/SourceSansPro-ExtraLight.ttf | Bin 0 -> 150528 bytes .../fonts/SourceSansPro-ExtraLightItalic.ttf | Bin 0 -> 117140 bytes app/assets/fonts/SourceSansPro-Italic.ttf | Bin 0 -> 117328 bytes app/assets/fonts/SourceSansPro-Light.ttf | Bin 0 -> 150244 bytes .../fonts/SourceSansPro-LightItalic.ttf | Bin 0 -> 116960 bytes app/assets/fonts/SourceSansPro-Regular.ttf | Bin 0 -> 149972 bytes app/assets/fonts/SourceSansPro-Semibold.ttf | Bin 0 -> 149636 bytes .../fonts/SourceSansPro-SemiboldItalic.ttf | Bin 0 -> 116424 bytes app/assets/images/ci/arch.jpg | Bin 0 -> 25222 bytes app/assets/images/ci/favicon.ico | Bin 0 -> 5430 bytes app/assets/images/ci/loader.gif | Bin 0 -> 4405 bytes app/assets/images/ci/no_avatar.png | Bin 0 -> 1337 bytes app/assets/images/ci/rails.png | Bin 0 -> 6646 bytes app/assets/images/ci/service_sample.png | Bin 0 -> 76024 bytes app/assets/javascripts/activities.js.coffee | 4 +- app/assets/javascripts/application.js.coffee | 12 +- .../blob/blob_file_dropzone.js.coffee | 67 ++ app/assets/javascripts/ci/Chart.min.js | 39 + .../javascripts/ci/application.js.coffee | 40 + app/assets/javascripts/ci/build.coffee | 41 + app/assets/javascripts/ci/pager.js.coffee | 42 + app/assets/javascripts/ci/projects.js.coffee | 6 + .../javascripts/commit/image-file.js.coffee | 9 +- app/assets/javascripts/dispatcher.js.coffee | 5 +- .../javascripts/dropzone_input.js.coffee | 1 + .../javascripts/issuable_context.js.coffee | 9 +- .../merge_request_widget.js.coffee | 2 +- app/assets/javascripts/notes.js.coffee | 4 +- app/assets/javascripts/project.js.coffee | 16 + .../javascripts/projects_list.js.coffee | 2 +- .../javascripts/syntax_highlight.coffee | 20 + app/assets/javascripts/zen_mode.js.coffee | 2 + app/assets/stylesheets/application.scss | 7 + app/assets/stylesheets/base/fonts.scss | 25 + app/assets/stylesheets/base/gl_bootstrap.scss | 28 +- app/assets/stylesheets/base/gl_variables.scss | 57 +- app/assets/stylesheets/base/layout.scss | 4 + app/assets/stylesheets/base/mixins.scss | 98 +- app/assets/stylesheets/base/variables.scss | 29 +- app/assets/stylesheets/ci/builds.scss | 70 ++ app/assets/stylesheets/ci/lint.scss | 10 + app/assets/stylesheets/ci/projects.scss | 93 ++ app/assets/stylesheets/ci/runners.scss | 36 + app/assets/stylesheets/ci/xterm.scss | 906 ++++++++++++++++++ app/assets/stylesheets/generic/avatar.scss | 7 +- app/assets/stylesheets/generic/blocks.scss | 49 +- app/assets/stylesheets/generic/buttons.scss | 18 +- app/assets/stylesheets/generic/callout.scss | 45 + app/assets/stylesheets/generic/common.scss | 41 +- app/assets/stylesheets/generic/files.scss | 37 +- app/assets/stylesheets/generic/filters.scss | 25 - app/assets/stylesheets/generic/header.scss | 97 +- app/assets/stylesheets/generic/issue_box.scss | 9 +- app/assets/stylesheets/generic/lists.scss | 56 +- .../stylesheets/generic/markdown_area.scss | 11 +- app/assets/stylesheets/generic/mobile.scss | 17 + .../stylesheets/generic/pagination.scss | 32 + app/assets/stylesheets/generic/selects.scss | 8 +- app/assets/stylesheets/generic/sidebar.scss | 118 ++- app/assets/stylesheets/generic/timeline.scss | 138 +-- .../stylesheets/generic/typography.scss | 12 + app/assets/stylesheets/generic/zen.scss | 4 +- app/assets/stylesheets/highlight/dark.scss | 6 + app/assets/stylesheets/highlight/monokai.scss | 6 + .../stylesheets/highlight/solarized_dark.scss | 5 + .../highlight/solarized_light.scss | 5 + app/assets/stylesheets/highlight/white.scss | 13 +- app/assets/stylesheets/pages/commit.scss | 17 - app/assets/stylesheets/pages/commits.scss | 6 +- app/assets/stylesheets/pages/dashboard.scss | 44 +- app/assets/stylesheets/pages/diff.scss | 16 +- app/assets/stylesheets/pages/editor.scss | 18 +- app/assets/stylesheets/pages/events.scss | 86 +- app/assets/stylesheets/pages/explore.scss | 8 + app/assets/stylesheets/pages/issuable.scss | 42 +- app/assets/stylesheets/pages/issues.scss | 14 +- .../stylesheets/pages/merge_requests.scss | 39 +- app/assets/stylesheets/pages/milestone.scss | 4 + app/assets/stylesheets/pages/note_form.scss | 18 +- app/assets/stylesheets/pages/notes.scss | 31 +- app/assets/stylesheets/pages/projects.scss | 221 +++-- app/assets/stylesheets/pages/search.scss | 18 +- app/assets/stylesheets/pages/snippets.scss | 24 + app/assets/stylesheets/pages/tree.scss | 57 +- .../stylesheets/themes/gitlab-theme.scss | 30 +- .../admin/application_settings_controller.rb | 12 + app/controllers/admin/hooks_controller.rb | 2 +- app/controllers/admin/labels_controller.rb | 58 ++ app/controllers/admin/projects_controller.rb | 1 + app/controllers/admin/users_controller.rb | 2 +- app/controllers/application_controller.rb | 51 +- app/controllers/autocomplete_controller.rb | 1 + .../ci/admin/application_controller.rb | 10 + .../admin/application_settings_controller.rb | 31 + app/controllers/ci/admin/builds_controller.rb | 18 + app/controllers/ci/admin/events_controller.rb | 9 + .../ci/admin/projects_controller.rb | 19 + .../ci/admin/runner_projects_controller.rb | 34 + .../ci/admin/runners_controller.rb | 69 ++ app/controllers/ci/application_controller.rb | 83 ++ app/controllers/ci/builds_controller.rb | 78 ++ app/controllers/ci/charts_controller.rb | 24 + app/controllers/ci/commits_controller.rb | 38 + app/controllers/ci/events_controller.rb | 21 + app/controllers/ci/lints_controller.rb | 26 + app/controllers/ci/projects_controller.rb | 125 +++ .../ci/runner_projects_controller.rb | 34 + app/controllers/ci/runners_controller.rb | 73 ++ app/controllers/ci/services_controller.rb | 59 ++ app/controllers/ci/triggers_controller.rb | 43 + app/controllers/ci/variables_controller.rb | 33 + app/controllers/ci/web_hooks_controller.rb | 53 + .../dashboard/projects_controller.rb | 15 + .../dashboard/snippets_controller.rb | 10 + app/controllers/dashboard_controller.rb | 46 +- .../explore/application_controller.rb | 2 + app/controllers/explore/groups_controller.rb | 3 - .../explore/projects_controller.rb | 5 +- .../explore/snippets_controller.rb | 6 + app/controllers/groups_controller.rb | 6 +- app/controllers/help_controller.rb | 7 + .../import/bitbucket_controller.rb | 23 +- app/controllers/import/fogbugz_controller.rb | 104 ++ app/controllers/import/github_controller.rb | 16 +- app/controllers/import/gitlab_controller.rb | 16 +- .../import/gitorious_controller.rb | 5 + .../import/google_code_controller.rb | 5 + app/controllers/invites_controller.rb | 4 +- app/controllers/namespaces_controller.rb | 2 +- .../oauth/applications_controller.rb | 2 +- .../profiles/two_factor_auths_controller.rb | 2 +- app/controllers/projects/blob_controller.rb | 84 +- .../projects/compare_controller.rb | 19 +- app/controllers/projects/forks_controller.rb | 12 +- app/controllers/projects/hooks_controller.rb | 3 +- .../projects/merge_requests_controller.rb | 19 +- .../projects/milestones_controller.rb | 7 +- .../projects/project_members_controller.rb | 2 +- app/controllers/projects/raw_controller.rb | 5 +- .../projects/services_controller.rb | 4 +- .../projects/snippets_controller.rb | 11 +- app/controllers/projects/wikis_controller.rb | 1 - app/controllers/projects_controller.rb | 10 +- app/controllers/root_controller.rb | 7 +- app/controllers/search_controller.rb | 4 +- app/controllers/sessions_controller.rb | 4 +- app/controllers/snippets_controller.rb | 8 +- app/controllers/users_controller.rb | 4 - app/finders/trending_projects_finder.rb | 3 +- app/helpers/application_helper.rb | 8 +- app/helpers/application_settings_helper.rb | 17 + app/helpers/auth_helper.rb | 8 +- app/helpers/ci/application_helper.rb | 54 ++ app/helpers/ci/builds_helper.rb | 19 + app/helpers/ci/commits_helper.rb | 24 + app/helpers/ci/gitlab_helper.rb | 36 + app/helpers/ci/icons_helper.rb | 11 + app/helpers/ci/projects_helper.rb | 36 + app/helpers/ci/routes_helper.rb | 29 + app/helpers/ci/runners_helper.rb | 22 + app/helpers/ci/triggers_helper.rb | 7 + app/helpers/ci/user_helper.rb | 15 + app/helpers/diff_helper.rb | 4 +- app/helpers/events_helper.rb | 22 +- app/helpers/explore_helper.rb | 2 +- app/helpers/gitlab_markdown_helper.rb | 51 +- app/helpers/gitlab_routing_helper.rb | 8 + app/helpers/graph_helper.rb | 5 +- app/helpers/groups_helper.rb | 11 +- app/helpers/icons_helper.rb | 2 +- app/helpers/notifications_helper.rb | 45 + app/helpers/page_layout_helper.rb | 30 + app/helpers/preferences_helper.rb | 27 +- app/helpers/projects_helper.rb | 40 +- app/helpers/tab_helper.rb | 8 + app/helpers/version_check_helper.rb | 2 +- app/helpers/wiki_helper.rb | 24 - app/mailers/base_mailer.rb | 32 + app/mailers/ci/emails/builds.rb | 17 + app/mailers/ci/notify.rb | 47 + app/mailers/email_rejection_mailer.rb | 21 + app/mailers/emails/issues.rb | 8 + app/mailers/emails/merge_requests.rb | 54 +- app/mailers/emails/notes.rb | 6 + app/mailers/notify.rb | 73 +- app/models/ability.rb | 1 + app/models/abuse_report.rb | 12 + app/models/application_setting.rb | 16 +- app/models/ci/application_setting.rb | 27 + app/models/ci/build.rb | 285 ++++++ app/models/ci/commit.rb | 267 ++++++ app/models/ci/event.rb | 27 + app/models/ci/project.rb | 210 ++++ app/models/ci/project_status.rb | 47 + app/models/ci/runner.rb | 80 ++ app/models/ci/runner_project.rb | 21 + app/models/ci/service.rb | 105 ++ app/models/ci/trigger.rb | 39 + app/models/ci/trigger_request.rb | 23 + app/models/ci/variable.rb | 25 + app/models/ci/web_hook.rb | 44 + app/models/concerns/issuable.rb | 6 + app/models/event.rb | 12 +- app/models/hooks/web_hook.rb | 5 +- app/models/issue.rb | 27 +- app/models/label.rb | 8 +- app/models/merge_request.rb | 68 +- app/models/merge_request_diff.rb | 32 +- app/models/milestone.rb | 7 + app/models/namespace.rb | 5 +- app/models/note.rb | 3 +- app/models/notification.rb | 21 +- app/models/project.rb | 60 +- .../project_services/buildkite_service.rb | 17 +- .../project_services/ci/hip_chat_message.rb | 78 ++ .../project_services/ci/hip_chat_service.rb | 93 ++ .../project_services/ci/mail_service.rb | 84 ++ .../project_services/ci/slack_message.rb | 97 ++ .../project_services/ci/slack_service.rb | 81 ++ app/models/project_services/ci_service.rb | 37 +- .../project_services/drone_ci_service.rb | 176 ++++ .../project_services/gitlab_ci_service.rb | 98 +- .../gitlab_issue_tracker_service.rb | 2 +- app/models/project_services/jira_service.rb | 2 +- app/models/project_services/slack_service.rb | 6 + app/models/repository.rb | 146 +++ app/models/sent_notification.rb | 79 ++ app/models/service.rb | 1 + app/models/user.rb | 138 +-- app/services/base_service.rb | 4 + app/services/ci/create_commit_service.rb | 50 + app/services/ci/create_project_service.rb | 30 + .../ci/create_trigger_request_service.rb | 17 + app/services/ci/event_service.rb | 31 + app/services/ci/image_for_build_service.rb | 31 + app/services/ci/register_build_service.rb | 40 + app/services/ci/test_hook_service.rb | 7 + app/services/ci/web_hook_service.rb | 36 + app/services/compare_service.rb | 44 +- app/services/event_create_service.rb | 4 + app/services/files/base_service.rb | 72 +- app/services/files/create_service.rb | 44 +- app/services/files/delete_service.rb | 33 +- app/services/files/update_service.rb | 36 +- app/services/git_push_service.rb | 28 +- .../merge_requests/auto_merge_service.rb | 30 - .../merge_requests/base_merge_service.rb | 10 - app/services/merge_requests/build_service.rb | 14 +- app/services/merge_requests/merge_service.rb | 51 +- .../merge_requests/post_merge_service.rb | 22 + .../merge_requests/refresh_service.rb | 4 +- app/services/milestones/destroy_service.rb | 27 + app/services/notification_service.rb | 11 +- app/services/projects/create_service.rb | 6 +- app/services/projects/destroy_service.rb | 1 - app/services/projects/download_service.rb | 43 + app/services/projects/fork_service.rb | 2 +- app/services/projects/transfer_service.rb | 6 - app/services/projects/upload_service.rb | 6 +- .../application_settings/_form.html.haml | 28 + app/views/admin/dashboard/index.html.haml | 4 + app/views/admin/hooks/index.html.haml | 8 + app/views/admin/labels/_form.html.haml | 35 + app/views/admin/labels/_label.html.haml | 5 + app/views/admin/labels/destroy.js.haml | 2 + app/views/admin/labels/edit.html.haml | 9 + app/views/admin/labels/index.html.haml | 16 + app/views/admin/labels/new.html.haml | 7 + app/views/admin/projects/index.html.haml | 6 + app/views/admin/users/index.html.haml | 2 +- .../application_settings/_form.html.haml | 24 + .../admin/application_settings/show.html.haml | 3 + app/views/ci/admin/builds/_build.html.haml | 32 + app/views/ci/admin/builds/index.html.haml | 28 + app/views/ci/admin/events/index.html.haml | 17 + .../ci/admin/projects/_project.html.haml | 29 + app/views/ci/admin/projects/index.html.haml | 15 + .../ci/admin/runner_projects/index.html.haml | 57 ++ app/views/ci/admin/runners/_runner.html.haml | 48 + app/views/ci/admin/runners/index.html.haml | 52 + app/views/ci/admin/runners/show.html.haml | 118 +++ app/views/ci/admin/runners/update.js.haml | 2 + app/views/ci/builds/_build.html.haml | 45 + app/views/ci/builds/show.html.haml | 170 ++++ app/views/ci/charts/_build_times.haml | 21 + app/views/ci/charts/_builds.haml | 41 + app/views/ci/charts/_overall.haml | 21 + app/views/ci/charts/show.html.haml | 4 + app/views/ci/commits/_commit.html.haml | 32 + app/views/ci/commits/show.html.haml | 87 ++ app/views/ci/errors/show.haml | 2 + app/views/ci/events/index.html.haml | 19 + app/views/ci/lints/_create.html.haml | 39 + app/views/ci/lints/create.js.haml | 2 + app/views/ci/lints/show.html.haml | 25 + .../ci/notify/build_fail_email.html.haml | 19 + app/views/ci/notify/build_fail_email.text.erb | 9 + .../ci/notify/build_success_email.html.haml | 20 + .../ci/notify/build_success_email.text.erb | 9 + app/views/ci/projects/_form.html.haml | 100 ++ app/views/ci/projects/_info.html.haml | 2 + app/views/ci/projects/_no_runners.html.haml | 8 + app/views/ci/projects/_project.html.haml | 37 + app/views/ci/projects/_public.html.haml | 16 + app/views/ci/projects/_search.html.haml | 11 + app/views/ci/projects/disabled.html.haml | 1 + app/views/ci/projects/edit.html.haml | 21 + app/views/ci/projects/index.html.haml | 30 + app/views/ci/projects/show.html.haml | 60 ++ app/views/ci/runners/_runner.html.haml | 35 + .../ci/runners/_shared_runners.html.haml | 23 + .../ci/runners/_specific_runners.html.haml | 29 + app/views/ci/runners/edit.html.haml | 27 + app/views/ci/runners/index.html.haml | 25 + app/views/ci/runners/show.html.haml | 64 ++ app/views/ci/services/_form.html.haml | 57 ++ app/views/ci/services/edit.html.haml | 1 + app/views/ci/services/index.html.haml | 22 + app/views/ci/shared/_guide.html.haml | 15 + app/views/ci/shared/_no_runners.html.haml | 7 + app/views/ci/triggers/_trigger.html.haml | 14 + app/views/ci/triggers/index.html.haml | 67 ++ app/views/ci/user_sessions/new.html.haml | 8 + app/views/ci/variables/show.html.haml | 39 + app/views/ci/web_hooks/index.html.haml | 92 ++ app/views/dashboard/_activities.html.haml | 6 +- app/views/dashboard/_activity_head.html.haml | 7 + app/views/dashboard/_groups_head.html.haml | 7 + app/views/dashboard/_projects_head.html.haml | 10 + app/views/dashboard/_snippets_head.html.haml | 7 + app/views/dashboard/activity.html.haml | 11 + app/views/dashboard/groups/index.html.haml | 39 +- app/views/dashboard/issues.html.haml | 12 +- app/views/dashboard/merge_requests.html.haml | 7 +- .../dashboard/milestones/_milestone.html.haml | 24 +- .../dashboard/milestones/index.html.haml | 28 +- .../{ => projects}/_projects.html.haml | 6 +- .../_zero_authorized_projects.html.haml | 0 .../index.atom.builder} | 6 +- app/views/dashboard/projects/index.html.haml | 16 + .../dashboard/projects/starred.html.haml | 23 +- app/views/dashboard/show.html.haml | 15 - app/views/dashboard/snippets/index.html.haml | 38 + .../devise/sessions/_new_crowd.html.haml | 9 + app/views/devise/shared/_signin_box.html.haml | 10 +- .../rejection.html.haml | 4 + .../rejection.text.haml | 4 + app/views/events/_commit.html.haml | 2 +- app/views/events/_event.html.haml | 4 +- app/views/events/_event_last_push.html.haml | 24 +- app/views/events/event/_common.html.haml | 5 +- app/views/events/event/_note.html.haml | 3 +- app/views/explore/_head.html.haml | 6 + app/views/explore/groups/index.html.haml | 30 +- .../explore/projects/_dropdown.html.haml | 27 + app/views/explore/projects/_filter.html.haml | 22 +- app/views/explore/projects/_project.html.haml | 24 - .../explore/projects/_projects.html.haml | 6 + app/views/explore/projects/index.html.haml | 22 +- app/views/explore/projects/starred.html.haml | 24 +- app/views/explore/projects/trending.html.haml | 29 +- app/views/explore/snippets/index.html.haml | 18 + app/views/groups/_projects.html.haml | 4 +- app/views/groups/edit.html.haml | 3 + .../groups/group_members/index.html.haml | 4 +- app/views/groups/issues.html.haml | 25 +- app/views/groups/merge_requests.html.haml | 23 +- .../groups/milestones/_header_title.html.haml | 1 + .../groups/milestones/_milestone.html.haml | 36 +- app/views/groups/milestones/index.html.haml | 26 +- app/views/groups/milestones/show.html.haml | 2 + app/views/groups/projects.html.haml | 9 +- app/views/groups/show.html.haml | 30 +- app/views/help/index.html.haml | 39 +- app/views/help/show.html.haml | 2 +- app/views/import/fogbugz/new.html.haml | 25 + .../import/fogbugz/new_user_map.html.haml | 49 + app/views/import/fogbugz/status.html.haml | 51 + .../kaminari/gitlab/_paginator.html.haml | 2 +- app/views/layouts/_head.html.haml | 1 + app/views/layouts/_page.html.haml | 15 +- app/views/layouts/ci/_info.html.haml | 2 + app/views/layouts/ci/_nav_admin.html.haml | 33 + app/views/layouts/ci/_nav_project.html.haml | 54 ++ app/views/layouts/ci/_page.html.haml | 26 + app/views/layouts/ci/admin.html.haml | 11 + app/views/layouts/ci/application.html.haml | 11 + app/views/layouts/ci/build.html.haml | 11 + app/views/layouts/ci/commit.html.haml | 11 + app/views/layouts/ci/notify.html.haml | 19 + app/views/layouts/ci/project.html.haml | 11 + app/views/layouts/dashboard.html.haml | 2 +- app/views/layouts/devise.html.haml | 2 +- app/views/layouts/explore.html.haml | 4 +- app/views/layouts/group.html.haml | 4 +- app/views/layouts/group_settings.html.haml | 1 + app/views/layouts/header/_default.html.haml | 26 +- app/views/layouts/header/_public.html.haml | 9 +- app/views/layouts/nav/_admin.html.haml | 13 +- app/views/layouts/nav/_dashboard.html.haml | 43 +- app/views/layouts/nav/_explore.html.haml | 33 +- app/views/layouts/nav/_group.html.haml | 61 +- app/views/layouts/nav/_profile.html.haml | 4 +- app/views/layouts/nav/_project.html.haml | 21 +- app/views/layouts/nav/_snippets.html.haml | 12 - app/views/layouts/notify.html.haml | 6 +- app/views/layouts/profile.html.haml | 4 +- app/views/layouts/project.html.haml | 4 +- app/views/layouts/project_settings.html.haml | 1 + app/views/layouts/snippets.html.haml | 4 +- app/views/notify/new_user_email.html.haml | 2 +- app/views/profiles/accounts/show.html.haml | 10 +- app/views/profiles/applications.html.haml | 9 +- app/views/profiles/audit_log.html.haml | 9 +- app/views/profiles/emails/index.html.haml | 10 +- app/views/profiles/keys/index.html.haml | 13 +- .../profiles/notifications/show.html.haml | 14 +- app/views/profiles/passwords/edit.html.haml | 10 +- app/views/profiles/passwords/new.html.haml | 2 +- app/views/profiles/preferences/show.html.haml | 16 +- app/views/profiles/show.html.haml | 14 +- app/views/projects/_activity.html.haml | 3 +- .../_bitbucket_import_modal.html.haml | 8 +- .../projects/_github_import_modal.html.haml | 8 +- .../projects/_gitlab_import_modal.html.haml | 8 +- app/views/projects/_home_panel.html.haml | 17 +- app/views/projects/_last_push.html.haml | 23 +- app/views/projects/_md_preview.html.haml | 4 +- app/views/projects/activity.html.haml | 3 + app/views/projects/blame/show.html.haml | 4 +- app/views/projects/blob/_actions.html.haml | 6 +- app/views/projects/blob/_blob.html.haml | 2 +- app/views/projects/blob/_editor.html.haml | 4 +- .../projects/blob/_header_title.html.haml | 1 + app/views/projects/blob/_upload.html.haml | 28 + app/views/projects/blob/edit.html.haml | 4 +- app/views/projects/blob/new.html.haml | 24 +- app/views/projects/blob/show.html.haml | 6 + app/views/projects/branches/_branch.html.haml | 13 +- app/views/projects/branches/_commit.html.haml | 7 + app/views/projects/branches/index.html.haml | 9 +- app/views/projects/branches/new.html.haml | 2 + .../projects/buttons/_dropdown.html.haml | 2 +- .../projects/buttons/_notifications.html.haml | 14 + .../projects/commit/_commit_box.html.haml | 2 +- app/views/projects/commit/show.html.haml | 1 + app/views/projects/commits/_head.html.haml | 10 +- .../projects/commits/_header_title.html.haml | 1 + app/views/projects/commits/show.html.haml | 26 +- app/views/projects/compare/_form.html.haml | 2 +- app/views/projects/compare/index.html.haml | 8 +- app/views/projects/compare/show.html.haml | 13 +- .../projects/deploy_keys/index.html.haml | 1 + app/views/projects/diffs/_diffs.html.haml | 7 +- app/views/projects/diffs/_stats.html.haml | 2 +- app/views/projects/edit.html.haml | 7 +- app/views/projects/empty.html.haml | 2 +- app/views/projects/forks/new.html.haml | 21 +- .../projects/graphs/_header_title.html.haml | 1 + app/views/projects/graphs/commits.html.haml | 80 +- app/views/projects/graphs/show.html.haml | 3 +- app/views/projects/hooks/index.html.haml | 8 + app/views/projects/imports/show.html.haml | 8 +- .../projects/issues/_discussion.html.haml | 23 +- .../projects/issues/_header_title.html.haml | 1 + app/views/projects/issues/_issue.html.haml | 2 +- app/views/projects/issues/_issues.html.haml | 11 +- app/views/projects/issues/index.html.haml | 6 +- app/views/projects/issues/new.html.haml | 2 + app/views/projects/issues/show.html.haml | 34 +- .../projects/labels/_header_title.html.haml | 1 + app/views/projects/labels/edit.html.haml | 2 + app/views/projects/labels/index.html.haml | 16 +- app/views/projects/labels/new.html.haml | 2 + .../merge_requests/_discussion.html.haml | 17 +- .../merge_requests/_header_title.html.haml | 1 + .../merge_requests/_merge_request.html.haml | 7 +- .../merge_requests/_merge_requests.html.haml | 11 +- .../merge_requests/_new_compare.html.haml | 4 +- .../merge_requests/_new_submit.html.haml | 8 +- .../projects/merge_requests/_show.html.haml | 14 +- .../projects/merge_requests/edit.html.haml | 2 + .../projects/merge_requests/index.html.haml | 6 +- .../projects/merge_requests/invalid.html.haml | 2 + .../{automerge.js.haml => merge.js.haml} | 0 .../projects/merge_requests/new.html.haml | 2 + .../merge_requests/show/_commits.html.haml | 2 +- .../merge_requests/show/_diffs.html.haml | 2 +- .../merge_requests/show/_mr_box.html.haml | 21 +- .../merge_requests/show/_mr_title.html.haml | 9 +- .../merge_requests/widget/_heading.html.haml | 3 +- .../merge_requests/widget/_open.html.haml | 2 - .../merge_requests/widget/_show.html.haml | 4 +- .../widget/open/_accept.html.haml | 4 +- .../widget/open/_no_satellite.html.haml | 3 - app/views/projects/milestones/_form.html.haml | 2 +- .../milestones/_header_title.html.haml | 1 + .../projects/milestones/_milestone.html.haml | 42 +- app/views/projects/milestones/edit.html.haml | 1 + app/views/projects/milestones/index.html.haml | 28 +- app/views/projects/milestones/new.html.haml | 1 + app/views/projects/milestones/show.html.haml | 2 + app/views/projects/network/show.html.haml | 1 + app/views/projects/network/show.json.erb | 2 +- app/views/projects/new.html.haml | 134 +-- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 2 +- app/views/projects/notes/_note.html.haml | 11 +- .../project_members/_header_title.html.haml | 1 + .../projects/project_members/import.html.haml | 2 + .../projects/project_members/index.html.haml | 43 +- app/views/projects/show.html.haml | 29 +- .../projects/snippets/_header_title.html.haml | 1 + .../projects/snippets/_snippet.html.haml | 15 - app/views/projects/snippets/edit.html.haml | 2 + app/views/projects/snippets/index.html.haml | 5 +- app/views/projects/snippets/new.html.haml | 2 + app/views/projects/snippets/show.html.haml | 2 + app/views/projects/tags/_tag.html.haml | 12 +- app/views/projects/tags/index.html.haml | 12 +- app/views/projects/tags/new.html.haml | 2 + app/views/projects/tree/_tree.html.haml | 2 +- app/views/projects/tree/show.html.haml | 1 + app/views/projects/wikis/_form.html.haml | 2 +- .../projects/wikis/_header_title.html.haml | 1 + .../projects/wikis/_main_links.html.haml | 11 +- app/views/projects/wikis/_nav.html.haml | 15 +- app/views/projects/wikis/edit.html.haml | 2 + app/views/projects/wikis/empty.html.haml | 2 + app/views/projects/wikis/git_access.html.haml | 19 +- app/views/projects/wikis/history.html.haml | 11 +- app/views/projects/wikis/pages.html.haml | 9 +- app/views/projects/wikis/show.html.haml | 29 +- app/views/search/_category.html.haml | 16 +- app/views/search/_filter.html.haml | 6 +- app/views/search/_form.html.haml | 12 +- app/views/search/_results.html.haml | 9 +- app/views/search/results/_blob.html.haml | 2 +- app/views/search/results/_milestone.html.haml | 9 + app/views/search/results/_project.html.haml | 6 - .../search/results/_snippet_blob.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 2 +- app/views/search/show.html.haml | 2 - app/views/shared/_clone_panel.html.haml | 6 +- app/views/shared/_event_filter.html.haml | 2 +- app/views/shared/_file_highlight.html.haml | 2 +- app/views/shared/_milestones_filter.html.haml | 7 +- app/views/shared/_project.html.haml | 16 - app/views/shared/_projects_list.html.haml | 17 - app/views/shared/groups/_group.html.haml | 22 + app/views/shared/issuable/_filter.html.haml | 9 +- app/views/shared/issuable/_form.html.haml | 4 +- app/views/shared/projects/_list.html.haml | 19 + app/views/shared/projects/_project.html.haml | 24 + .../{ => shared}/snippets/_snippet.html.haml | 18 +- app/views/snippets/_snippets.html.haml | 2 +- .../snippets/current_user_index.html.haml | 35 - app/views/snippets/index.html.haml | 24 +- app/views/snippets/show.html.haml | 17 +- app/views/snippets/user_index.html.haml | 14 - app/views/users/_projects.html.haml | 4 +- app/views/users/show.html.haml | 8 +- app/workers/auto_merge_worker.rb | 13 - app/workers/ci/hip_chat_notifier_worker.rb | 19 + app/workers/ci/slack_notifier_worker.rb | 10 + app/workers/ci/web_hook_worker.rb | 9 + app/workers/email_receiver_worker.rb | 51 + app/workers/emails_on_push_worker.rb | 33 +- app/workers/fork_registration_worker.rb | 12 - app/workers/merge_worker.rb | 23 + app/workers/repository_fork_worker.rb | 34 + app/workers/repository_import_worker.rb | 39 +- bin/background_jobs | 2 +- bin/ci/upgrade.rb | 3 + bin/daemon_with_pidfile | 33 + bin/mail_room | 50 + builds/.gitkeep | 0 config/environments/development.rb | 5 + config/gitlab.yml.example | 59 +- config/initializers/1_settings.rb | 34 +- config/initializers/3_grit_ext.rb | 5 - config/initializers/4_ci_app.rb | 10 + config/initializers/connection_fix.rb | 32 + config/initializers/cookies_serializer.rb | 3 + ..._url_options.rb => default_url_options.rb} | 2 +- config/initializers/devise.rb | 2 +- config/initializers/doorkeeper.rb | 3 +- .../{7_omniauth.rb => omniauth.rb} | 0 config/initializers/rack_attack.rb.example | 14 +- .../{6_rack_profiler.rb => rack_profiler.rb} | 2 +- config/initializers/secret_token.rb | 24 + config/initializers/session_store.rb | 9 +- .../initializers/{4_sidekiq.rb => sidekiq.rb} | 0 config/initializers/static_files.rb | 2 +- config/locales/devise.en.yml | 7 +- config/mail_room.yml.example | 29 + config/routes.rb | 167 +++- config/schedule.rb | 8 + config/secrets.yml.example | 12 + config/sidekiq.yml.example | 2 + db/fixtures/production/001_admin.rb | 2 +- ...50812080800_add_settings_import_sources.rb | 11 + ...14065925_remove_oauth_tokens_from_users.rb | 8 + ...50817163600_deduplicate_user_identities.rb | 14 + .../20150818213832_add_sent_notifications.rb | 13 + ...50824002011_add_enable_ssl_verification.rb | 5 + db/migrate/20150826001931_add_ci_tables.rb | 190 ++++ .../20150902001023_add_template_to_label.rb | 5 + db/migrate/20150914215247_add_ci_tags.rb | 23 + ...1905_enable_ssl_verification_by_default.rb | 5 + ...5_enable_ssl_verification_for_web_hooks.rb | 8 + ..._help_page_text_to_application_settings.rb | 5 + ...45038_add_index_for_committed_at_and_id.rb | 5 + ..._add_ci_enabled_to_application_settings.rb | 5 + ..._invalid_milestones_from_merge_requests.rb | 5 + ...20010715_add_consumed_timestep_to_users.rb | 5 + ...1119_add_line_code_to_sent_notification.rb | 5 + db/migrate/limits_to_mysql.rb | 4 + db/schema.rb | 288 +++++- doc/README.md | 24 + doc/api/README.md | 1 + doc/api/keys.md | 46 + doc/api/services.md | 666 ++++++++++++- doc/ci/README.md | 23 + doc/ci/api/README.md | 86 ++ doc/ci/api/builds.md | 41 + doc/ci/api/commits.md | 101 ++ doc/ci/api/projects.md | 154 +++ doc/ci/api/runners.md | 77 ++ doc/ci/deployment/README.md | 98 ++ doc/ci/docker/README.md | 4 + doc/ci/docker/using_docker_build.md | 112 +++ doc/ci/docker/using_docker_images.md | 203 ++++ doc/ci/examples/README.md | 5 + ...and-deploy-python-application-to-heroku.md | 72 ++ ...t-and-deploy-ruby-application-to-heroku.md | 67 ++ doc/ci/examples/test-clojure-application.md | 35 + doc/ci/permissions/README.md | 24 + doc/ci/quick_start/README.md | 119 +++ doc/ci/quick_start/build_status.png | Bin 0 -> 62140 bytes doc/ci/quick_start/commit_status.png | Bin 0 -> 33492 bytes doc/ci/quick_start/new_commit.png | Bin 0 -> 47527 bytes doc/ci/quick_start/projects.png | Bin 0 -> 37014 bytes doc/ci/quick_start/runners.png | Bin 0 -> 123048 bytes doc/ci/quick_start/runners_activated.png | Bin 0 -> 60769 bytes doc/ci/runners/README.md | 145 +++ doc/ci/runners/project_specific.png | Bin 0 -> 31408 bytes doc/ci/runners/shared_runner.png | Bin 0 -> 18366 bytes doc/ci/runners/shared_to_specific_admin.png | Bin 0 -> 5897 bytes doc/ci/variables/README.md | 95 ++ doc/ci/yaml/README.md | 204 ++++ doc/development/architecture.md | 6 +- doc/development/rake_tasks.md | 6 + doc/gitlab-basics/command-line-commands.md | 5 + doc/incoming_email/README.md | 207 ++++ doc/incoming_email/postfix.md | 310 ++++++ doc/install/database_mysql.md | 2 +- doc/install/installation.md | 88 +- doc/install/requirements.md | 4 +- doc/install/structure.md | 4 +- doc/integration/README.md | 2 +- doc/integration/crowd.md | 58 ++ .../gmail_action_buttons_for_gitlab.md | 22 + doc/integration/gmail_actions_button.png | Bin 0 -> 17321 bytes doc/integration/ldap.md | 20 + doc/integration/omniauth.md | 1 + doc/logs/logs.md | 12 +- doc/markdown/markdown.md | 2 +- doc/migrate_ci_to_ce/README.md | 322 +++++++ doc/profile/two_factor_authentication.md | 4 + doc/raketasks/backup_restore.md | 5 +- doc/raketasks/maintenance.md | 13 - doc/release/monthly.md | 10 +- doc/ssh/README.md | 2 + doc/update/6.x-or-7.x-to-7.14.md | 2 +- doc/update/7.14-to-8.0.md | 205 ++++ doc/update/patch_versions.md | 9 +- doc/web_hooks/ssl.png | Bin 0 -> 77165 bytes doc/web_hooks/web_hooks.md | 28 +- doc/workflow/README.md | 1 + doc/workflow/importing/README.md | 5 +- .../fogbugz_import_finished.png | Bin 0 -> 53276 bytes .../fogbugz_importer/fogbugz_import_login.png | Bin 0 -> 44444 bytes .../fogbugz_import_select_fogbogz.png | Bin 0 -> 35415 bytes .../fogbugz_import_select_project.png | Bin 0 -> 62552 bytes .../fogbugz_import_user_map.png | Bin 0 -> 157856 bytes .../importing/import_projects_from_fogbugz.md | 29 + .../importing/import_projects_from_github.md | 2 +- doc/workflow/merge_requests.md | 40 + docker/Dockerfile | 3 + features/admin/hooks.feature | 9 + features/admin/labels.feature | 38 + features/admin/projects.feature | 11 +- features/dashboard/dashboard.feature | 8 +- features/dashboard/event_filters.feature | 8 +- features/dashboard/new_project.feature | 19 +- features/explore/groups.feature | 14 - features/explore/projects.feature | 15 +- features/groups.feature | 18 + features/login_form.feature | 5 + features/project/hooks.feature | 5 + features/project/issues/milestones.feature | 8 +- features/project/project.feature | 6 + features/project/source/browse_files.feature | 23 + features/project/wiki.feature | 12 + features/search.feature | 15 + features/steps/admin/hooks.rb | 15 + features/steps/admin/labels.rb | 117 +++ features/steps/admin/projects.rb | 16 + features/steps/admin/settings.rb | 1 + features/steps/admin/users.rb | 6 +- features/steps/dashboard/help.rb | 2 +- features/steps/dashboard/merge_requests.rb | 8 +- features/steps/dashboard/new_project.rb | 31 +- features/steps/dashboard/starred_projects.rb | 2 +- features/steps/groups.rb | 31 +- features/steps/invites.rb | 2 +- features/steps/login_form.rb | 25 + features/steps/project/commits/commits.rb | 5 +- features/steps/project/fork.rb | 2 +- .../steps/project/forked_merge_requests.rb | 1 - features/steps/project/hooks.rb | 13 + features/steps/project/issues/milestones.rb | 7 +- features/steps/project/merge_requests.rb | 12 +- features/steps/project/project.rb | 18 +- features/steps/project/services.rb | 4 +- features/steps/project/source/browse_files.rb | 83 +- features/steps/project/wiki.rb | 9 +- features/steps/search.rb | 11 + features/steps/shared/active_tab.rb | 6 +- features/steps/shared/diff_note.rb | 2 +- features/steps/shared/paths.rb | 12 +- features/steps/shared/project.rb | 28 + features/steps/snippets/user.rb | 2 +- features/support/env.rb | 4 + features/user.feature | 5 - lib/api/api.rb | 1 + lib/api/entities.rb | 9 +- lib/api/files.rb | 50 +- lib/api/helpers.rb | 69 +- lib/api/keys.rb | 20 + lib/api/merge_requests.rb | 8 +- lib/api/projects.rb | 36 - lib/api/services.rb | 90 +- lib/api/users.rb | 2 +- lib/backup/builds.rb | 34 + lib/backup/database.rb | 8 +- lib/backup/manager.rb | 2 +- lib/ci/ansi2html.rb | 224 +++++ lib/ci/api/api.rb | 42 + lib/ci/api/builds.rb | 53 + lib/ci/api/commits.rb | 66 ++ lib/ci/api/entities.rb | 56 ++ lib/ci/api/helpers.rb | 41 + lib/ci/api/projects.rb | 210 ++++ lib/ci/api/runners.rb | 69 ++ lib/ci/api/triggers.rb | 49 + lib/ci/assets/.gitkeep | 0 lib/ci/charts.rb | 71 ++ lib/ci/current_settings.rb | 22 + lib/ci/git.rb | 5 + lib/ci/gitlab_ci_yaml_processor.rb | 198 ++++ lib/ci/migrate/builds.rb | 29 + lib/ci/migrate/database.rb | 67 ++ lib/ci/migrate/manager.rb | 72 ++ lib/ci/migrate/tags.rb | 42 + lib/ci/model.rb | 11 + lib/ci/project_list_builder.rb | 21 + lib/ci/scheduler.rb | 16 + lib/ci/static_model.rb | 49 + lib/ci/version_info.rb | 52 + lib/gitlab.rb | 1 - lib/gitlab/backend/grack_auth.rb | 49 +- lib/gitlab/backend/shell.rb | 14 - lib/gitlab/bitbucket_import/client.rb | 23 +- lib/gitlab/bitbucket_import/importer.rb | 49 +- lib/gitlab/bitbucket_import/key_adder.rb | 7 +- lib/gitlab/bitbucket_import/key_deleter.rb | 7 +- .../bitbucket_import/project_creator.rb | 12 +- lib/gitlab/color_schemes.rb | 67 ++ lib/gitlab/current_settings.rb | 17 +- lib/gitlab/email/attachment_uploader.rb | 35 + lib/gitlab/email/receiver.rb | 107 +++ lib/gitlab/email/reply_parser.rb | 79 ++ lib/gitlab/fogbugz_import/client.rb | 56 ++ lib/gitlab/fogbugz_import/importer.rb | 298 ++++++ lib/gitlab/fogbugz_import/project_creator.rb | 38 + lib/gitlab/fogbugz_import/repository.rb | 31 + lib/gitlab/git/hook.rb | 59 ++ lib/gitlab/github_import/importer.rb | 7 +- lib/gitlab/github_import/project_creator.rb | 13 +- lib/gitlab/gitlab_import/importer.rb | 17 +- lib/gitlab/gitlab_import/project_creator.rb | 12 +- lib/gitlab/import_formatter.rb | 4 +- lib/gitlab/import_sources.rb | 30 + lib/gitlab/incoming_email.rb | 43 + lib/gitlab/ldap/auth_hash.rb | 36 + lib/gitlab/ldap/config.rb | 4 + lib/gitlab/ldap/user.rb | 15 +- lib/gitlab/markdown.rb | 67 +- lib/gitlab/markdown/autolink_filter.rb | 9 +- .../markdown/commit_range_reference_filter.rb | 4 +- .../markdown/commit_reference_filter.rb | 4 +- .../markdown/cross_project_reference.rb | 2 + lib/gitlab/markdown/emoji_filter.rb | 3 +- .../external_issue_reference_filter.rb | 2 + lib/gitlab/markdown/external_link_filter.rb | 1 + lib/gitlab/markdown/issue_reference_filter.rb | 2 + lib/gitlab/markdown/label_reference_filter.rb | 4 +- .../merge_request_reference_filter.rb | 4 +- lib/gitlab/markdown/reference_filter.rb | 4 +- lib/gitlab/markdown/relative_link_filter.rb | 41 +- lib/gitlab/markdown/sanitization_filter.rb | 13 +- .../markdown/snippet_reference_filter.rb | 4 +- .../markdown/syntax_highlight_filter.rb | 45 + .../markdown/table_of_contents_filter.rb | 1 + lib/gitlab/markdown/task_list_filter.rb | 1 + lib/gitlab/markdown/user_reference_filter.rb | 4 +- lib/gitlab/o_auth/auth_hash.rb | 22 +- lib/gitlab/reference_extractor.rb | 10 +- lib/gitlab/satellite/action.rb | 58 -- lib/gitlab/satellite/compare_action.rb | 44 - .../satellite/files/delete_file_action.rb | 50 - .../satellite/files/edit_file_action.rb | 68 -- lib/gitlab/satellite/files/file_action.rb | 25 - lib/gitlab/satellite/files/new_file_action.rb | 67 -- lib/gitlab/satellite/logger.rb | 13 - lib/gitlab/satellite/merge_action.rb | 147 --- lib/gitlab/satellite/satellite.rb | 148 --- lib/gitlab/search_results.rb | 14 +- lib/gitlab/themes.rb | 18 + lib/gitlab/url_builder.rb | 10 +- lib/redcarpet/render/gitlab_html.rb | 46 - lib/support/init.d/gitlab | 151 ++- lib/support/init.d/gitlab.default.example | 19 + lib/support/nginx/gitlab | 47 +- lib/support/nginx/gitlab-ssl | 49 +- lib/support/nginx/gitlab_ci | 29 + lib/tasks/ci/.gitkeep | 0 lib/tasks/ci/cleanup.rake | 8 + lib/tasks/ci/migrate.rake | 87 ++ lib/tasks/ci/schedule_builds.rake | 6 + lib/tasks/gitlab/backup.rake | 21 + lib/tasks/gitlab/check.rake | 293 ++++-- lib/tasks/gitlab/enable_automerge.rake | 39 - lib/tasks/services.rake | 98 ++ public/ci/build-canceled.svg | 1 + public/ci/build-failed.svg | 1 + public/ci/build-pending.svg | 1 + public/ci/build-running.svg | 1 + public/ci/build-skipped.svg | 1 + public/ci/build-success.svg | 1 + public/ci/build-unknown.svg | 1 + public/ci/favicon.ico | Bin 0 -> 5430 bytes scripts/ci/prepare_build.sh | 22 + .../controllers/ci/commits_controller_spec.rb | 27 + .../ci/projects_controller_spec.rb | 50 + .../import/bitbucket_controller_spec.rb | 28 +- .../import/fogbugz_controller_spec.rb | 39 + .../import/github_controller_spec.rb | 21 +- .../import/gitlab_controller_spec.rb | 22 +- .../controllers/namespaces_controller_spec.rb | 10 +- .../two_factor_auths_controller_spec.rb | 4 +- .../projects/compare_controller_spec.rb | 26 + .../projects/milestones_controller_spec.rb | 10 + .../projects/raw_controller_spec.rb | 37 + spec/controllers/root_controller_spec.rb | 8 +- spec/controllers/uploads_controller_spec.rb | 8 - spec/factories/abuse_reports.rb | 12 + spec/factories/ci/builds.rb | 47 + spec/factories/ci/commits.rb | 75 ++ spec/factories/ci/events.rb | 24 + spec/factories/ci/projects.rb | 56 ++ spec/factories/ci/runner_projects.rb | 19 + spec/factories/ci/runners.rb | 38 + spec/factories/ci/trigger_requests.rb | 13 + spec/factories/ci/triggers.rb | 9 + spec/factories/ci/web_hook.rb | 6 + spec/factories/merge_requests.rb | 1 + spec/factories/notes.rb | 1 + spec/features/atom/dashboard_spec.rb | 4 +- spec/features/ci/admin/builds_spec.rb | 71 ++ spec/features/ci/admin/events_spec.rb | 20 + spec/features/ci/admin/projects_spec.rb | 19 + spec/features/ci/admin/runners_spec.rb | 65 ++ spec/features/ci/builds_spec.rb | 60 ++ spec/features/ci/commits_spec.rb | 69 ++ spec/features/ci/events_spec.rb | 22 + spec/features/ci/lint_spec.rb | 28 + spec/features/ci/projects_spec.rb | 60 ++ spec/features/ci/runners_spec.rb | 96 ++ spec/features/ci/triggers_spec.rb | 28 + spec/features/ci/variables_spec.rb | 28 + .../features/gitlab_flavored_markdown_spec.rb | 2 +- spec/features/markdown_spec.rb | 10 +- spec/features/profiles/preferences_spec.rb | 2 +- .../security/dashboard_access_spec.rb | 4 +- spec/features/security/group_access_spec.rb | 6 +- spec/fixtures/emails/android_gmail.eml | 177 ++++ spec/fixtures/emails/attachment.eml | 351 +++++++ spec/fixtures/emails/auto_reply.eml | 21 + spec/fixtures/emails/dutch.eml | 20 + spec/fixtures/emails/gmail_web.eml | 181 ++++ spec/fixtures/emails/html_paragraphs.eml | 205 ++++ spec/fixtures/emails/inline_reply.eml | 60 ++ spec/fixtures/emails/ios_default.eml | 136 +++ spec/fixtures/emails/newlines.eml | 84 ++ spec/fixtures/emails/no_content_reply.eml | 34 + spec/fixtures/emails/on_wrote.eml | 277 ++++++ spec/fixtures/emails/outlook.eml | 188 ++++ spec/fixtures/emails/paragraphs.eml | 42 + spec/fixtures/emails/plaintext_only.eml | 42 + spec/fixtures/emails/valid_reply.eml | 40 + spec/fixtures/emails/windows_8_metro.eml | 173 ++++ spec/fixtures/emails/wrong_reply_key.eml | 40 + spec/helpers/ci/application_helper_spec.rb | 37 + spec/helpers/ci/runners_helper_spec.rb | 18 + spec/helpers/events_helper_spec.rb | 5 +- spec/helpers/gitlab_markdown_helper_spec.rb | 24 +- spec/helpers/graph_helper_spec.rb | 16 + spec/helpers/preferences_helper_spec.rb | 102 +- .../syntax_highlight_spec.js.coffee | 42 + spec/javascripts/zen_mode_spec.js.coffee | 5 + spec/lib/ci/ansi2html_spec.rb | 134 +++ spec/lib/ci/charts_spec.rb | 17 + spec/lib/ci/gitlab_ci_yaml_processor_spec.rb | 313 ++++++ spec/lib/extracts_path_spec.rb | 2 +- spec/lib/gitlab/backend/grack_auth_spec.rb | 6 +- .../gitlab/bitbucket_import/client_spec.rb | 34 + .../bitbucket_import/project_creator_spec.rb | 7 +- spec/lib/gitlab/color_schemes_spec.rb | 45 + .../gitlab/email/attachment_uploader_spec.rb | 20 + spec/lib/gitlab/email/receiver_spec.rb | 138 +++ spec/lib/gitlab/email/reply_parser_spec.rb | 210 ++++ .../github_import/project_creator_spec.rb | 6 +- .../gitlab_import/project_creator_spec.rb | 6 +- .../gitlab/google_code_import/client_spec.rb | 2 +- .../google_code_import/importer_spec.rb | 2 +- spec/lib/gitlab/incoming_email_spec.rb | 61 ++ spec/lib/gitlab/ldap/auth_hash_spec.rb | 65 ++ spec/lib/gitlab/ldap/user_spec.rb | 24 +- .../gitlab/markdown/autolink_filter_spec.rb | 10 + .../commit_range_reference_filter_spec.rb | 5 - .../markdown/commit_reference_filter_spec.rb | 5 - .../external_issue_reference_filter_spec.rb | 5 - .../markdown/issue_reference_filter_spec.rb | 5 - .../markdown/label_reference_filter_spec.rb | 5 - .../merge_request_reference_filter_spec.rb | 5 - .../markdown/relative_link_filter_spec.rb | 26 +- .../markdown/snippet_reference_filter_spec.rb | 5 - .../markdown/syntax_highlight_filter_spec.rb | 19 + .../markdown/user_reference_filter_spec.rb | 6 - spec/lib/gitlab/o_auth/auth_hash_spec.rb | 6 +- spec/lib/gitlab/o_auth/user_spec.rb | 2 +- spec/lib/gitlab/reference_extractor_spec.rb | 8 +- spec/lib/gitlab/satellite/action_spec.rb | 116 --- .../lib/gitlab/satellite/merge_action_spec.rb | 118 --- spec/lib/gitlab/themes_spec.rb | 3 - spec/mailers/ci/notify_spec.rb | 36 + spec/mailers/notify_spec.rb | 6 +- spec/models/abuse_report_spec.rb | 12 + spec/models/application_setting_spec.rb | 1 + spec/models/ci/build_spec.rb | 350 +++++++ spec/models/ci/commit_spec.rb | 268 ++++++ spec/models/ci/mail_service_spec.rb | 184 ++++ .../project_services/hip_chat_message_spec.rb | 74 ++ .../project_services/hip_chat_service_spec.rb | 74 ++ .../ci/project_services/slack_message_spec.rb | 84 ++ .../ci/project_services/slack_service_spec.rb | 58 ++ spec/models/ci/project_spec.rb | 199 ++++ spec/models/ci/runner_project_spec.rb | 16 + spec/models/ci/runner_spec.rb | 70 ++ spec/models/ci/service_spec.rb | 49 + spec/models/ci/trigger_spec.rb | 17 + spec/models/ci/variable_spec.rb | 45 + spec/models/ci/web_hook_spec.rb | 63 ++ spec/models/concerns/issuable_spec.rb | 16 + spec/models/issue_spec.rb | 27 +- spec/models/merge_request_spec.rb | 3 +- spec/models/note_spec.rb | 7 + .../buildkite_service_spec.rb | 14 - .../project_services/drone_ci_service_spec.rb | 104 ++ .../gitlab_ci_service_spec.rb | 50 +- .../project_services/slack_service_spec.rb | 2 +- spec/models/project_spec.rb | 1 - spec/models/repository_spec.rb | 14 + spec/models/user_spec.rb | 139 +-- spec/requests/api/files_spec.rb | 40 +- spec/requests/api/keys_spec.rb | 39 + spec/requests/api/merge_requests_spec.rb | 51 +- spec/requests/api/projects_spec.rb | 2 +- spec/requests/api/services_spec.rb | 93 +- spec/requests/api/users_spec.rb | 56 ++ spec/requests/ci/api/builds_spec.rb | 115 +++ spec/requests/ci/api/commits_spec.rb | 65 ++ spec/requests/ci/api/projects_spec.rb | 268 ++++++ spec/requests/ci/api/runners_spec.rb | 83 ++ spec/requests/ci/api/triggers_spec.rb | 78 ++ spec/requests/ci/builds_spec.rb | 18 + spec/requests/ci/commits_spec.rb | 17 + spec/routing/project_routing_spec.rb | 14 +- spec/routing/routing_spec.rb | 6 +- .../services/ci/create_commit_service_spec.rb | 145 +++ .../ci/create_project_service_spec.rb | 37 + .../ci/create_trigger_request_service_spec.rb | 52 + spec/services/ci/event_service_spec.rb | 34 + .../ci/image_for_build_service_spec.rb | 48 + .../ci/register_build_service_spec.rb | 91 ++ spec/services/ci/web_hook_service_spec.rb | 36 + spec/services/event_create_service_spec.rb | 10 + spec/services/git_push_service_spec.rb | 63 +- .../merge_requests/create_service_spec.rb | 2 +- .../merge_requests/merge_service_spec.rb | 5 - spec/services/notification_service_spec.rb | 11 +- spec/services/projects/create_service_spec.rb | 19 + .../projects/download_service_spec.rb | 65 ++ spec/services/projects/fork_service_spec.rb | 8 +- spec/services/projects/upload_service_spec.rb | 48 +- spec/spec_helper.rb | 4 + spec/support/api_helpers.rb | 11 + spec/support/filter_spec_helper.rb | 2 +- spec/support/fixture_helpers.rb | 11 + spec/support/gitlab_stubs/gitlab_ci.yml | 63 ++ spec/support/gitlab_stubs/project_8.json | 45 + .../support/gitlab_stubs/project_8_hooks.json | 1 + spec/support/gitlab_stubs/projects.json | 1 + spec/support/gitlab_stubs/session.json | 20 + spec/support/gitlab_stubs/user.json | 20 + spec/support/login_helpers.rb | 4 + spec/support/markdown_feature.rb | 4 +- spec/support/matchers/markdown_matchers.rb | 3 + spec/support/mentionable_shared_examples.rb | 2 +- spec/support/relative_url.rb | 8 + spec/support/services_shared_context.rb | 21 + spec/support/setup_builds_storage.rb | 17 + spec/support/stub_configuration.rb | 4 + spec/support/stub_gitlab_calls.rb | 77 ++ spec/support/stub_gitlab_data.rb | 5 + spec/support/test_env.rb | 4 + spec/tasks/gitlab/backup_rake_spec.rb | 14 +- spec/views/help/index.html.haml_spec.rb | 41 + spec/workers/email_receiver_worker_spec.rb | 45 + spec/workers/emails_on_push_worker_spec.rb | 34 + spec/workers/fork_registration_worker_spec.rb | 10 - spec/workers/merge_worker_spec.rb | 28 + spec/workers/post_receive_spec.rb | 2 +- spec/workers/repository_fork_worker_spec.rb | 29 + 1061 files changed, 29449 insertions(+), 5114 deletions(-) create mode 100644 CHANGELOG-CI create mode 100755 app/assets/fonts/OFL.txt create mode 100755 app/assets/fonts/SourceSansPro-Black.ttf create mode 100755 app/assets/fonts/SourceSansPro-BlackItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Bold.ttf create mode 100755 app/assets/fonts/SourceSansPro-BoldItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-ExtraLight.ttf create mode 100755 app/assets/fonts/SourceSansPro-ExtraLightItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Italic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Light.ttf create mode 100755 app/assets/fonts/SourceSansPro-LightItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Regular.ttf create mode 100755 app/assets/fonts/SourceSansPro-Semibold.ttf create mode 100755 app/assets/fonts/SourceSansPro-SemiboldItalic.ttf create mode 100644 app/assets/images/ci/arch.jpg create mode 100644 app/assets/images/ci/favicon.ico create mode 100644 app/assets/images/ci/loader.gif create mode 100644 app/assets/images/ci/no_avatar.png create mode 100644 app/assets/images/ci/rails.png create mode 100644 app/assets/images/ci/service_sample.png create mode 100644 app/assets/javascripts/blob/blob_file_dropzone.js.coffee create mode 100644 app/assets/javascripts/ci/Chart.min.js create mode 100644 app/assets/javascripts/ci/application.js.coffee create mode 100644 app/assets/javascripts/ci/build.coffee create mode 100644 app/assets/javascripts/ci/pager.js.coffee create mode 100644 app/assets/javascripts/ci/projects.js.coffee create mode 100644 app/assets/javascripts/syntax_highlight.coffee create mode 100644 app/assets/stylesheets/base/fonts.scss create mode 100644 app/assets/stylesheets/ci/builds.scss create mode 100644 app/assets/stylesheets/ci/lint.scss create mode 100644 app/assets/stylesheets/ci/projects.scss create mode 100644 app/assets/stylesheets/ci/runners.scss create mode 100644 app/assets/stylesheets/ci/xterm.scss create mode 100644 app/assets/stylesheets/generic/callout.scss create mode 100644 app/assets/stylesheets/generic/pagination.scss create mode 100644 app/controllers/admin/labels_controller.rb create mode 100644 app/controllers/ci/admin/application_controller.rb create mode 100644 app/controllers/ci/admin/application_settings_controller.rb create mode 100644 app/controllers/ci/admin/builds_controller.rb create mode 100644 app/controllers/ci/admin/events_controller.rb create mode 100644 app/controllers/ci/admin/projects_controller.rb create mode 100644 app/controllers/ci/admin/runner_projects_controller.rb create mode 100644 app/controllers/ci/admin/runners_controller.rb create mode 100644 app/controllers/ci/application_controller.rb create mode 100644 app/controllers/ci/builds_controller.rb create mode 100644 app/controllers/ci/charts_controller.rb create mode 100644 app/controllers/ci/commits_controller.rb create mode 100644 app/controllers/ci/events_controller.rb create mode 100644 app/controllers/ci/lints_controller.rb create mode 100644 app/controllers/ci/projects_controller.rb create mode 100644 app/controllers/ci/runner_projects_controller.rb create mode 100644 app/controllers/ci/runners_controller.rb create mode 100644 app/controllers/ci/services_controller.rb create mode 100644 app/controllers/ci/triggers_controller.rb create mode 100644 app/controllers/ci/variables_controller.rb create mode 100644 app/controllers/ci/web_hooks_controller.rb create mode 100644 app/controllers/dashboard/snippets_controller.rb create mode 100644 app/controllers/explore/snippets_controller.rb create mode 100644 app/controllers/import/fogbugz_controller.rb create mode 100644 app/helpers/ci/application_helper.rb create mode 100644 app/helpers/ci/builds_helper.rb create mode 100644 app/helpers/ci/commits_helper.rb create mode 100644 app/helpers/ci/gitlab_helper.rb create mode 100644 app/helpers/ci/icons_helper.rb create mode 100644 app/helpers/ci/projects_helper.rb create mode 100644 app/helpers/ci/routes_helper.rb create mode 100644 app/helpers/ci/runners_helper.rb create mode 100644 app/helpers/ci/triggers_helper.rb create mode 100644 app/helpers/ci/user_helper.rb delete mode 100644 app/helpers/wiki_helper.rb create mode 100644 app/mailers/base_mailer.rb create mode 100644 app/mailers/ci/emails/builds.rb create mode 100644 app/mailers/ci/notify.rb create mode 100644 app/mailers/email_rejection_mailer.rb create mode 100644 app/models/ci/application_setting.rb create mode 100644 app/models/ci/build.rb create mode 100644 app/models/ci/commit.rb create mode 100644 app/models/ci/event.rb create mode 100644 app/models/ci/project.rb create mode 100644 app/models/ci/project_status.rb create mode 100644 app/models/ci/runner.rb create mode 100644 app/models/ci/runner_project.rb create mode 100644 app/models/ci/service.rb create mode 100644 app/models/ci/trigger.rb create mode 100644 app/models/ci/trigger_request.rb create mode 100644 app/models/ci/variable.rb create mode 100644 app/models/ci/web_hook.rb create mode 100644 app/models/project_services/ci/hip_chat_message.rb create mode 100644 app/models/project_services/ci/hip_chat_service.rb create mode 100644 app/models/project_services/ci/mail_service.rb create mode 100644 app/models/project_services/ci/slack_message.rb create mode 100644 app/models/project_services/ci/slack_service.rb create mode 100644 app/models/project_services/drone_ci_service.rb create mode 100644 app/models/sent_notification.rb create mode 100644 app/services/ci/create_commit_service.rb create mode 100644 app/services/ci/create_project_service.rb create mode 100644 app/services/ci/create_trigger_request_service.rb create mode 100644 app/services/ci/event_service.rb create mode 100644 app/services/ci/image_for_build_service.rb create mode 100644 app/services/ci/register_build_service.rb create mode 100644 app/services/ci/test_hook_service.rb create mode 100644 app/services/ci/web_hook_service.rb delete mode 100644 app/services/merge_requests/auto_merge_service.rb delete mode 100644 app/services/merge_requests/base_merge_service.rb create mode 100644 app/services/merge_requests/post_merge_service.rb create mode 100644 app/services/milestones/destroy_service.rb create mode 100644 app/services/projects/download_service.rb create mode 100644 app/views/admin/labels/_form.html.haml create mode 100644 app/views/admin/labels/_label.html.haml create mode 100644 app/views/admin/labels/destroy.js.haml create mode 100644 app/views/admin/labels/edit.html.haml create mode 100644 app/views/admin/labels/index.html.haml create mode 100644 app/views/admin/labels/new.html.haml create mode 100644 app/views/ci/admin/application_settings/_form.html.haml create mode 100644 app/views/ci/admin/application_settings/show.html.haml create mode 100644 app/views/ci/admin/builds/_build.html.haml create mode 100644 app/views/ci/admin/builds/index.html.haml create mode 100644 app/views/ci/admin/events/index.html.haml create mode 100644 app/views/ci/admin/projects/_project.html.haml create mode 100644 app/views/ci/admin/projects/index.html.haml create mode 100644 app/views/ci/admin/runner_projects/index.html.haml create mode 100644 app/views/ci/admin/runners/_runner.html.haml create mode 100644 app/views/ci/admin/runners/index.html.haml create mode 100644 app/views/ci/admin/runners/show.html.haml create mode 100644 app/views/ci/admin/runners/update.js.haml create mode 100644 app/views/ci/builds/_build.html.haml create mode 100644 app/views/ci/builds/show.html.haml create mode 100644 app/views/ci/charts/_build_times.haml create mode 100644 app/views/ci/charts/_builds.haml create mode 100644 app/views/ci/charts/_overall.haml create mode 100644 app/views/ci/charts/show.html.haml create mode 100644 app/views/ci/commits/_commit.html.haml create mode 100644 app/views/ci/commits/show.html.haml create mode 100644 app/views/ci/errors/show.haml create mode 100644 app/views/ci/events/index.html.haml create mode 100644 app/views/ci/lints/_create.html.haml create mode 100644 app/views/ci/lints/create.js.haml create mode 100644 app/views/ci/lints/show.html.haml create mode 100644 app/views/ci/notify/build_fail_email.html.haml create mode 100644 app/views/ci/notify/build_fail_email.text.erb create mode 100644 app/views/ci/notify/build_success_email.html.haml create mode 100644 app/views/ci/notify/build_success_email.text.erb create mode 100644 app/views/ci/projects/_form.html.haml create mode 100644 app/views/ci/projects/_info.html.haml create mode 100644 app/views/ci/projects/_no_runners.html.haml create mode 100644 app/views/ci/projects/_project.html.haml create mode 100644 app/views/ci/projects/_public.html.haml create mode 100644 app/views/ci/projects/_search.html.haml create mode 100644 app/views/ci/projects/disabled.html.haml create mode 100644 app/views/ci/projects/edit.html.haml create mode 100644 app/views/ci/projects/index.html.haml create mode 100644 app/views/ci/projects/show.html.haml create mode 100644 app/views/ci/runners/_runner.html.haml create mode 100644 app/views/ci/runners/_shared_runners.html.haml create mode 100644 app/views/ci/runners/_specific_runners.html.haml create mode 100644 app/views/ci/runners/edit.html.haml create mode 100644 app/views/ci/runners/index.html.haml create mode 100644 app/views/ci/runners/show.html.haml create mode 100644 app/views/ci/services/_form.html.haml create mode 100644 app/views/ci/services/edit.html.haml create mode 100644 app/views/ci/services/index.html.haml create mode 100644 app/views/ci/shared/_guide.html.haml create mode 100644 app/views/ci/shared/_no_runners.html.haml create mode 100644 app/views/ci/triggers/_trigger.html.haml create mode 100644 app/views/ci/triggers/index.html.haml create mode 100644 app/views/ci/user_sessions/new.html.haml create mode 100644 app/views/ci/variables/show.html.haml create mode 100644 app/views/ci/web_hooks/index.html.haml create mode 100644 app/views/dashboard/_activity_head.html.haml create mode 100644 app/views/dashboard/_groups_head.html.haml create mode 100644 app/views/dashboard/_projects_head.html.haml create mode 100644 app/views/dashboard/_snippets_head.html.haml create mode 100644 app/views/dashboard/activity.html.haml rename app/views/dashboard/{ => projects}/_projects.html.haml (71%) rename app/views/dashboard/{ => projects}/_zero_authorized_projects.html.haml (100%) rename app/views/dashboard/{show.atom.builder => projects/index.atom.builder} (52%) create mode 100644 app/views/dashboard/projects/index.html.haml delete mode 100644 app/views/dashboard/show.html.haml create mode 100644 app/views/dashboard/snippets/index.html.haml create mode 100644 app/views/devise/sessions/_new_crowd.html.haml create mode 100644 app/views/email_rejection_mailer/rejection.html.haml create mode 100644 app/views/email_rejection_mailer/rejection.text.haml create mode 100644 app/views/explore/_head.html.haml create mode 100644 app/views/explore/projects/_dropdown.html.haml delete mode 100644 app/views/explore/projects/_project.html.haml create mode 100644 app/views/explore/projects/_projects.html.haml create mode 100644 app/views/explore/snippets/index.html.haml create mode 100644 app/views/groups/milestones/_header_title.html.haml create mode 100644 app/views/import/fogbugz/new.html.haml create mode 100644 app/views/import/fogbugz/new_user_map.html.haml create mode 100644 app/views/import/fogbugz/status.html.haml create mode 100644 app/views/layouts/ci/_info.html.haml create mode 100644 app/views/layouts/ci/_nav_admin.html.haml create mode 100644 app/views/layouts/ci/_nav_project.html.haml create mode 100644 app/views/layouts/ci/_page.html.haml create mode 100644 app/views/layouts/ci/admin.html.haml create mode 100644 app/views/layouts/ci/application.html.haml create mode 100644 app/views/layouts/ci/build.html.haml create mode 100644 app/views/layouts/ci/commit.html.haml create mode 100644 app/views/layouts/ci/notify.html.haml create mode 100644 app/views/layouts/ci/project.html.haml delete mode 100644 app/views/layouts/nav/_snippets.html.haml create mode 100644 app/views/projects/blob/_header_title.html.haml create mode 100644 app/views/projects/blob/_upload.html.haml create mode 100644 app/views/projects/branches/_commit.html.haml create mode 100644 app/views/projects/buttons/_notifications.html.haml create mode 100644 app/views/projects/commits/_header_title.html.haml create mode 100644 app/views/projects/graphs/_header_title.html.haml create mode 100644 app/views/projects/issues/_header_title.html.haml create mode 100644 app/views/projects/labels/_header_title.html.haml create mode 100644 app/views/projects/merge_requests/_header_title.html.haml rename app/views/projects/merge_requests/{automerge.js.haml => merge.js.haml} (100%) delete mode 100644 app/views/projects/merge_requests/widget/open/_no_satellite.html.haml create mode 100644 app/views/projects/milestones/_header_title.html.haml create mode 100644 app/views/projects/project_members/_header_title.html.haml create mode 100644 app/views/projects/snippets/_header_title.html.haml delete mode 100644 app/views/projects/snippets/_snippet.html.haml create mode 100644 app/views/projects/wikis/_header_title.html.haml create mode 100644 app/views/search/results/_milestone.html.haml delete mode 100644 app/views/search/results/_project.html.haml delete mode 100644 app/views/shared/_project.html.haml delete mode 100644 app/views/shared/_projects_list.html.haml create mode 100644 app/views/shared/groups/_group.html.haml create mode 100644 app/views/shared/projects/_list.html.haml create mode 100644 app/views/shared/projects/_project.html.haml rename app/views/{ => shared}/snippets/_snippet.html.haml (53%) delete mode 100644 app/views/snippets/current_user_index.html.haml delete mode 100644 app/views/snippets/user_index.html.haml delete mode 100644 app/workers/auto_merge_worker.rb create mode 100644 app/workers/ci/hip_chat_notifier_worker.rb create mode 100644 app/workers/ci/slack_notifier_worker.rb create mode 100644 app/workers/ci/web_hook_worker.rb create mode 100644 app/workers/email_receiver_worker.rb delete mode 100644 app/workers/fork_registration_worker.rb create mode 100644 app/workers/merge_worker.rb create mode 100644 app/workers/repository_fork_worker.rb create mode 100644 bin/ci/upgrade.rb create mode 100755 bin/daemon_with_pidfile create mode 100755 bin/mail_room create mode 100644 builds/.gitkeep delete mode 100644 config/initializers/3_grit_ext.rb create mode 100644 config/initializers/4_ci_app.rb create mode 100644 config/initializers/connection_fix.rb create mode 100644 config/initializers/cookies_serializer.rb rename config/initializers/{8_default_url_options.rb => default_url_options.rb} (80%) rename config/initializers/{7_omniauth.rb => omniauth.rb} (100%) rename config/initializers/{6_rack_profiler.rb => rack_profiler.rb} (81%) rename config/initializers/{4_sidekiq.rb => sidekiq.rb} (100%) create mode 100644 config/mail_room.yml.example create mode 100644 config/schedule.rb create mode 100644 config/secrets.yml.example create mode 100644 config/sidekiq.yml.example create mode 100644 db/migrate/20150812080800_add_settings_import_sources.rb create mode 100644 db/migrate/20150814065925_remove_oauth_tokens_from_users.rb create mode 100644 db/migrate/20150817163600_deduplicate_user_identities.rb create mode 100644 db/migrate/20150818213832_add_sent_notifications.rb create mode 100644 db/migrate/20150824002011_add_enable_ssl_verification.rb create mode 100644 db/migrate/20150826001931_add_ci_tables.rb create mode 100644 db/migrate/20150902001023_add_template_to_label.rb create mode 100644 db/migrate/20150914215247_add_ci_tags.rb create mode 100644 db/migrate/20150915001905_enable_ssl_verification_by_default.rb create mode 100644 db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb create mode 100644 db/migrate/20150916114643_add_help_page_text_to_application_settings.rb create mode 100644 db/migrate/20150916145038_add_index_for_committed_at_and_id.rb create mode 100644 db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb create mode 100644 db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb create mode 100644 db/migrate/20150920010715_add_consumed_timestep_to_users.rb create mode 100644 db/migrate/20150920161119_add_line_code_to_sent_notification.rb create mode 100644 doc/api/keys.md create mode 100644 doc/ci/README.md create mode 100644 doc/ci/api/README.md create mode 100644 doc/ci/api/builds.md create mode 100644 doc/ci/api/commits.md create mode 100644 doc/ci/api/projects.md create mode 100644 doc/ci/api/runners.md create mode 100644 doc/ci/deployment/README.md create mode 100644 doc/ci/docker/README.md create mode 100644 doc/ci/docker/using_docker_build.md create mode 100644 doc/ci/docker/using_docker_images.md create mode 100644 doc/ci/examples/README.md create mode 100644 doc/ci/examples/test-and-deploy-python-application-to-heroku.md create mode 100644 doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md create mode 100644 doc/ci/examples/test-clojure-application.md create mode 100644 doc/ci/permissions/README.md create mode 100644 doc/ci/quick_start/README.md create mode 100644 doc/ci/quick_start/build_status.png create mode 100644 doc/ci/quick_start/commit_status.png create mode 100644 doc/ci/quick_start/new_commit.png create mode 100644 doc/ci/quick_start/projects.png create mode 100644 doc/ci/quick_start/runners.png create mode 100644 doc/ci/quick_start/runners_activated.png create mode 100644 doc/ci/runners/README.md create mode 100644 doc/ci/runners/project_specific.png create mode 100644 doc/ci/runners/shared_runner.png create mode 100644 doc/ci/runners/shared_to_specific_admin.png create mode 100644 doc/ci/variables/README.md create mode 100644 doc/ci/yaml/README.md create mode 100644 doc/incoming_email/README.md create mode 100644 doc/incoming_email/postfix.md create mode 100644 doc/integration/crowd.md create mode 100644 doc/integration/gmail_action_buttons_for_gitlab.md create mode 100644 doc/integration/gmail_actions_button.png create mode 100644 doc/migrate_ci_to_ce/README.md create mode 100644 doc/update/7.14-to-8.0.md create mode 100644 doc/web_hooks/ssl.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_finished.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_login.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_select_fogbogz.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_select_project.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_user_map.png create mode 100644 doc/workflow/importing/import_projects_from_fogbugz.md create mode 100644 doc/workflow/merge_requests.md create mode 100644 features/admin/hooks.feature create mode 100644 features/admin/labels.feature create mode 100644 features/login_form.feature create mode 100644 features/steps/admin/hooks.rb create mode 100644 features/steps/admin/labels.rb create mode 100644 features/steps/login_form.rb create mode 100644 lib/api/keys.rb create mode 100644 lib/backup/builds.rb create mode 100644 lib/ci/ansi2html.rb create mode 100644 lib/ci/api/api.rb create mode 100644 lib/ci/api/builds.rb create mode 100644 lib/ci/api/commits.rb create mode 100644 lib/ci/api/entities.rb create mode 100644 lib/ci/api/helpers.rb create mode 100644 lib/ci/api/projects.rb create mode 100644 lib/ci/api/runners.rb create mode 100644 lib/ci/api/triggers.rb create mode 100644 lib/ci/assets/.gitkeep create mode 100644 lib/ci/charts.rb create mode 100644 lib/ci/current_settings.rb create mode 100644 lib/ci/git.rb create mode 100644 lib/ci/gitlab_ci_yaml_processor.rb create mode 100644 lib/ci/migrate/builds.rb create mode 100644 lib/ci/migrate/database.rb create mode 100644 lib/ci/migrate/manager.rb create mode 100644 lib/ci/migrate/tags.rb create mode 100644 lib/ci/model.rb create mode 100644 lib/ci/project_list_builder.rb create mode 100644 lib/ci/scheduler.rb create mode 100644 lib/ci/static_model.rb create mode 100644 lib/ci/version_info.rb create mode 100644 lib/gitlab/color_schemes.rb create mode 100644 lib/gitlab/email/attachment_uploader.rb create mode 100644 lib/gitlab/email/receiver.rb create mode 100644 lib/gitlab/email/reply_parser.rb create mode 100644 lib/gitlab/fogbugz_import/client.rb create mode 100644 lib/gitlab/fogbugz_import/importer.rb create mode 100644 lib/gitlab/fogbugz_import/project_creator.rb create mode 100644 lib/gitlab/fogbugz_import/repository.rb create mode 100644 lib/gitlab/git/hook.rb create mode 100644 lib/gitlab/import_sources.rb create mode 100644 lib/gitlab/incoming_email.rb create mode 100644 lib/gitlab/ldap/auth_hash.rb create mode 100644 lib/gitlab/markdown/syntax_highlight_filter.rb delete mode 100644 lib/gitlab/satellite/action.rb delete mode 100644 lib/gitlab/satellite/compare_action.rb delete mode 100644 lib/gitlab/satellite/files/delete_file_action.rb delete mode 100644 lib/gitlab/satellite/files/edit_file_action.rb delete mode 100644 lib/gitlab/satellite/files/file_action.rb delete mode 100644 lib/gitlab/satellite/files/new_file_action.rb delete mode 100644 lib/gitlab/satellite/logger.rb delete mode 100644 lib/gitlab/satellite/merge_action.rb delete mode 100644 lib/gitlab/satellite/satellite.rb delete mode 100644 lib/redcarpet/render/gitlab_html.rb create mode 100644 lib/support/nginx/gitlab_ci create mode 100644 lib/tasks/ci/.gitkeep create mode 100644 lib/tasks/ci/cleanup.rake create mode 100644 lib/tasks/ci/migrate.rake create mode 100644 lib/tasks/ci/schedule_builds.rake delete mode 100644 lib/tasks/gitlab/enable_automerge.rake create mode 100644 lib/tasks/services.rake create mode 100644 public/ci/build-canceled.svg create mode 100644 public/ci/build-failed.svg create mode 100644 public/ci/build-pending.svg create mode 100644 public/ci/build-running.svg create mode 100644 public/ci/build-skipped.svg create mode 100644 public/ci/build-success.svg create mode 100644 public/ci/build-unknown.svg create mode 100644 public/ci/favicon.ico create mode 100755 scripts/ci/prepare_build.sh create mode 100644 spec/controllers/ci/commits_controller_spec.rb create mode 100644 spec/controllers/ci/projects_controller_spec.rb create mode 100644 spec/controllers/import/fogbugz_controller_spec.rb create mode 100644 spec/controllers/projects/raw_controller_spec.rb create mode 100644 spec/factories/ci/builds.rb create mode 100644 spec/factories/ci/commits.rb create mode 100644 spec/factories/ci/events.rb create mode 100644 spec/factories/ci/projects.rb create mode 100644 spec/factories/ci/runner_projects.rb create mode 100644 spec/factories/ci/runners.rb create mode 100644 spec/factories/ci/trigger_requests.rb create mode 100644 spec/factories/ci/triggers.rb create mode 100644 spec/factories/ci/web_hook.rb create mode 100644 spec/features/ci/admin/builds_spec.rb create mode 100644 spec/features/ci/admin/events_spec.rb create mode 100644 spec/features/ci/admin/projects_spec.rb create mode 100644 spec/features/ci/admin/runners_spec.rb create mode 100644 spec/features/ci/builds_spec.rb create mode 100644 spec/features/ci/commits_spec.rb create mode 100644 spec/features/ci/events_spec.rb create mode 100644 spec/features/ci/lint_spec.rb create mode 100644 spec/features/ci/projects_spec.rb create mode 100644 spec/features/ci/runners_spec.rb create mode 100644 spec/features/ci/triggers_spec.rb create mode 100644 spec/features/ci/variables_spec.rb create mode 100644 spec/fixtures/emails/android_gmail.eml create mode 100644 spec/fixtures/emails/attachment.eml create mode 100644 spec/fixtures/emails/auto_reply.eml create mode 100644 spec/fixtures/emails/dutch.eml create mode 100644 spec/fixtures/emails/gmail_web.eml create mode 100644 spec/fixtures/emails/html_paragraphs.eml create mode 100644 spec/fixtures/emails/inline_reply.eml create mode 100644 spec/fixtures/emails/ios_default.eml create mode 100644 spec/fixtures/emails/newlines.eml create mode 100644 spec/fixtures/emails/no_content_reply.eml create mode 100644 spec/fixtures/emails/on_wrote.eml create mode 100644 spec/fixtures/emails/outlook.eml create mode 100644 spec/fixtures/emails/paragraphs.eml create mode 100644 spec/fixtures/emails/plaintext_only.eml create mode 100644 spec/fixtures/emails/valid_reply.eml create mode 100644 spec/fixtures/emails/windows_8_metro.eml create mode 100644 spec/fixtures/emails/wrong_reply_key.eml create mode 100644 spec/helpers/ci/application_helper_spec.rb create mode 100644 spec/helpers/ci/runners_helper_spec.rb create mode 100644 spec/helpers/graph_helper_spec.rb create mode 100644 spec/javascripts/syntax_highlight_spec.js.coffee create mode 100644 spec/lib/ci/ansi2html_spec.rb create mode 100644 spec/lib/ci/charts_spec.rb create mode 100644 spec/lib/ci/gitlab_ci_yaml_processor_spec.rb create mode 100644 spec/lib/gitlab/color_schemes_spec.rb create mode 100644 spec/lib/gitlab/email/attachment_uploader_spec.rb create mode 100644 spec/lib/gitlab/email/receiver_spec.rb create mode 100644 spec/lib/gitlab/email/reply_parser_spec.rb create mode 100644 spec/lib/gitlab/incoming_email_spec.rb create mode 100644 spec/lib/gitlab/ldap/auth_hash_spec.rb create mode 100644 spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb delete mode 100644 spec/lib/gitlab/satellite/action_spec.rb delete mode 100644 spec/lib/gitlab/satellite/merge_action_spec.rb create mode 100644 spec/mailers/ci/notify_spec.rb create mode 100644 spec/models/ci/build_spec.rb create mode 100644 spec/models/ci/commit_spec.rb create mode 100644 spec/models/ci/mail_service_spec.rb create mode 100644 spec/models/ci/project_services/hip_chat_message_spec.rb create mode 100644 spec/models/ci/project_services/hip_chat_service_spec.rb create mode 100644 spec/models/ci/project_services/slack_message_spec.rb create mode 100644 spec/models/ci/project_services/slack_service_spec.rb create mode 100644 spec/models/ci/project_spec.rb create mode 100644 spec/models/ci/runner_project_spec.rb create mode 100644 spec/models/ci/runner_spec.rb create mode 100644 spec/models/ci/service_spec.rb create mode 100644 spec/models/ci/trigger_spec.rb create mode 100644 spec/models/ci/variable_spec.rb create mode 100644 spec/models/ci/web_hook_spec.rb create mode 100644 spec/models/project_services/drone_ci_service_spec.rb create mode 100644 spec/requests/api/keys_spec.rb create mode 100644 spec/requests/ci/api/builds_spec.rb create mode 100644 spec/requests/ci/api/commits_spec.rb create mode 100644 spec/requests/ci/api/projects_spec.rb create mode 100644 spec/requests/ci/api/runners_spec.rb create mode 100644 spec/requests/ci/api/triggers_spec.rb create mode 100644 spec/requests/ci/builds_spec.rb create mode 100644 spec/requests/ci/commits_spec.rb create mode 100644 spec/services/ci/create_commit_service_spec.rb create mode 100644 spec/services/ci/create_project_service_spec.rb create mode 100644 spec/services/ci/create_trigger_request_service_spec.rb create mode 100644 spec/services/ci/event_service_spec.rb create mode 100644 spec/services/ci/image_for_build_service_spec.rb create mode 100644 spec/services/ci/register_build_service_spec.rb create mode 100644 spec/services/ci/web_hook_service_spec.rb create mode 100644 spec/services/projects/download_service_spec.rb create mode 100644 spec/support/fixture_helpers.rb create mode 100644 spec/support/gitlab_stubs/gitlab_ci.yml create mode 100644 spec/support/gitlab_stubs/project_8.json create mode 100644 spec/support/gitlab_stubs/project_8_hooks.json create mode 100644 spec/support/gitlab_stubs/projects.json create mode 100644 spec/support/gitlab_stubs/session.json create mode 100644 spec/support/gitlab_stubs/user.json create mode 100644 spec/support/relative_url.rb create mode 100644 spec/support/services_shared_context.rb create mode 100644 spec/support/setup_builds_storage.rb create mode 100644 spec/support/stub_gitlab_calls.rb create mode 100644 spec/support/stub_gitlab_data.rb create mode 100644 spec/views/help/index.html.haml_spec.rb create mode 100644 spec/workers/email_receiver_worker_spec.rb create mode 100644 spec/workers/emails_on_push_worker_spec.rb delete mode 100644 spec/workers/fork_registration_worker_spec.rb create mode 100644 spec/workers/merge_worker_spec.rb create mode 100644 spec/workers/repository_fork_worker_spec.rb diff --git a/.gitignore b/.gitignore index 3e30fb8cf7..2a97eacad4 100644 --- a/.gitignore +++ b/.gitignore @@ -20,11 +20,13 @@ backups/* config/aws.yml config/database.yml config/gitlab.yml -config/initializers/omniauth.rb +config/gitlab_ci.yml config/initializers/rack_attack.rb config/initializers/smtp_settings.rb config/resque.yml config/unicorn.rb +config/mail_room.yml +config/secrets.yml coverage/* db/*.sqlite3 db/*.sqlite3-journal @@ -40,3 +42,4 @@ rails_best_practices_output.html /tags tmp/ vendor/bundle/* +builds/* diff --git a/.rubocop.yml b/.rubocop.yml index ea4d365761..05b8ecc3b0 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -998,7 +998,9 @@ AllCops: - 'tmp/**/*' - 'bin/**/*' - 'lib/backup/**/*' + - 'lib/ci/backup/**/*' - 'lib/tasks/**/*' + - 'lib/ci/migrate/**/*' - 'lib/email_validator.rb' - 'lib/gitlab/upgrader.rb' - 'lib/gitlab/seeder.rb' diff --git a/CHANGELOG b/CHANGELOG index 0f4928e852..4e877c2a66 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,13 +1,98 @@ Please view this file on the master branch, on stable branches it's out of date. +v 8.0.2 + - Fix default avatar not rendering in network graph (Stan Hu) + - Skip check_initd_configured_correctly on omnibus installs + - Prevent double-prefixing of help page paths + - Clarify confirmation text on user deletion + - Make commit graphs responsive to window width changes (Stan Hu) + - Fix top margin for sign-in button on public pages + - Fix LDAP attribute mapping + - Remove git refs used internally by GitLab from network graph (Stan Hu) + - Use standard Markdown font in Markdown preview instead of fixed-width font (Stan Hu) + - Fix Reply by email for non-UTF-8 messages. + - Add option to use StartTLS with Reply by email IMAP server. + +v 8.0.1 + - Improve CI migration procedure and documentation + +v 8.0.0 + - Fix Markdown links not showing up in dashboard activity feed (Stan Hu) + - Remove milestones from merge requests when milestones are deleted (Stan Hu) + - Fix HTML link that was improperly escaped in new user e-mail (Stan Hu) + - Fix broken sort in merge request API (Stan Hu) + - Bump rouge to 1.10.1 to remove warning noise and fix other syntax highlighting bugs (Stan Hu) + - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) + - Add "replace" and "upload" functionalities to allow user replace existing file and upload new file into current repository + - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) + - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) + - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) + - Fix broken Wiki Page History (Stan Hu) + - Import forked repositories asynchronously to prevent large repositories from timing out (Stan Hu) + - Prevent anchors from being hidden by header (Stan Hu) + - Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu) + - Sort issues by creation date in Bitbucket importer (Stan Hu) + - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu) + - Improve dropdown positioning on the project home page (Hannes Rosenögger) + - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu) + - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) + - Restrict users API endpoints to use integer IDs (Stan Hu) + - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) + - Remove satellites + - Better performance for web editor (switched from satellites to rugged) + - Faster merge + - Ability to fetch merge requests from refs/merge-requests/:id + - Allow displaying of archived projects in the admin interface (Artem Sidorenko) + - Allow configuration of import sources for new projects (Artem Sidorenko) + - Search for comments should be case insensetive + - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) + - Ability to search milestones + - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu) + - Move dashboard activity to separate page (for your projects and starred projects) + - Improve performance of git blame + - Limit content width to 1200px for most of pages to improve readability on big screens + - Fix 500 error when submit project snippet without body + - Improve search page usability + - Bring more UI consistency in way how projects, snippets and groups lists are rendered + - Make all profiles and group public + - Fixed login failure when extern_uid changes (Joel Koglin) + - Don't notify users without access to the project when they are (accidentally) mentioned in a note. + - Retrieving oauth token with LDAP credentials + - Load Application settings from running database unless env var USE_DB=false + - Added Drone CI integration (Kirill Zaitsev) + - Allow developers to retry builds + - Hide advanced project options for non-admin users + - Fail builds if no .gitlab-ci.yml is found + - Refactored service API and added automatically service docs generator (Kirill Zaitsev) + - Added web_url key project hook_attrs (Kirill Zaitsev) + - Add ability to get user information by ID of an SSH key via the API + - Fix bug which IE cannot show image at markdown when the image is raw file of gitlab + - Add support for Crowd + - Global Labels that are available to all projects + - Fix highlighting of deleted lines in diffs. + - Project notification level can be set on the project page itself + - Added service API endpoint to retrieve service parameters (Petheő Bence) + - Add FogBugz project import (Jared Szechy) + - Sort users autocomplete lists by user (Allister Antosik) + - Webhook for issue now contains repository field (Jungkook Park) + - Add ability to add custom text to the help page (Jeroen van Baarsen) + - Add pg_schema to backup config + - Removed API calls from CE to CI + +v 7.14.3 + - No changes + v 7.14.2 - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu) + - Allow configuration of LDAP attributes GitLab will use for the new user account. v 7.14.1 + - Improve abuse reports management from admin area + - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) + - Disabled DNS lookups for SSH in docker image (Rowan Wookey) - Only include base URL in OmniAuth full_host parameter (Stan Hu) - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu) - - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) - - Improve abuse reports management from admin area + - Ability to enable SSL verification for Webhooks v 7.14.0 - Fix bug where non-project members of the target project could set labels on new merge requests. @@ -85,7 +170,7 @@ v 7.13.4 v 7.13.3 - Fix bug causing Bitbucket importer to crash when OAuth application had been removed. - Allow users to send abuse reports - - Remove satellites + - Remove satellites - Link username to profile on Group Members page (Tom Webster) v 7.13.2 @@ -293,6 +378,7 @@ v 7.11.0 - Protect OmniAuth request phase against CSRF. - Don't send notifications to mentioned users that don't have access to the project in question. - Add search issues/MR by number + - Change plots to bar graphs in commit statistics screen - Move snippets UI to fluid layout - Improve UI for sidebar. Increase separation between navigation and content - Improve new project command options (Ben Bodenmiller) diff --git a/CHANGELOG-CI b/CHANGELOG-CI new file mode 100644 index 0000000000..d1ad661d88 --- /dev/null +++ b/CHANGELOG-CI @@ -0,0 +1,298 @@ +v7.14.0 (unreleased) + - Truncate commit messages after subject line in table + - Adjust CI config to support Docker executors + - Added Application Settings + - Randomize test database for CI tests + - Make YAML validation stricter + - Use avatars received from GitLab + - Refactor GitLab API usage to use either access_token or private_token depending on what was specified during login + - Allow to use access_token for API requests + - Fix project API listing returning empty list when first projects are not added to CI + - Allow to define variables from YAML + - Added support for CI skipped status + - Fix broken yaml error saving + - Add committed_at to commits to properly order last commit (the force push issue) + - Rename type(s) to stage(s) + - Fix navigation icons + - Add missing stage when doing retry + - Require variable keys to be not-empty and unique + - Fix variable saving issue + - Display variable saving errors in variables page not the project's + - Added Build Triggers API + +v7.13.1 + - Fix: user could steal specific runner + - Fix: don't send notifications for jobs with allow_failure set + - Fix invalid link to doc.gitlab.com + +v7.13.0 + - Fix inline edit runner-description + - Allow to specify image and services in yml that can be used with docker + - Fix: No runner notification can see managers only + - Fix service testing for slack + - Ability to cancel all builds in commit at once + - Disable colors in rake tasks automatically (if IO is not a TTY) + - Implemented "rake env:info". Rake task to receive system information + - Fix coverage calculation on commit page + - Enhance YAML validation + - Redirect back after authorization + - Change favicon + - Refactoring: Get rid of private_token usage in the frontend. + - Allow to specify allow_failure for job + - Build traces is stored in the file instead of database + - Make the builds path configurable + - Disable link to runner if it's not assigned to specific project + - Store all secrets in config/secrets.yml + - Encrypt variables + - Allow to specify flexible list of types in yaml + +v7.12.2 + - Revert: Runner without tag should pick builds without tag only + +v7.12.1 + - Runner without tag should pick builds without tag only + - Explicit error in the GitLab when commit not found. + - Fix: lint with relative subpath + - Update webhook example + - Improved Lint stability + - Add warning when .gitlab-ci.yml not found + - Improved validation for .gitlab-ci.yml + - Fix list of branches in only section + - Fix "Status Badge" button + +v7.12.0 + - Endless scroll on the dashboard + - Add notification if there are no runners + - Fix pagination on dashboard + - Remove ID column from runners list in the admin area + - Increase default timeout for builds to 60 minutes + - Using .gitlab-ci.yml file instead of jobs + - Link to the runner from the build page for admin user + - Ability to set secret variables for runner + - Dont retry build when push same commit in same ref twice + - Admin area: show amount of runners with last contact less than a minute ago + - Fix re-adding project with the same name but different gitlab_id + - Implementation of Lint (.gitlab-ci.yml validation tool) + - Updated rails to 4.1.11 + - API fix: project create call + - Link to web-editor with .gitlab-ci.yml + - Updated examples in the documentation + +v7.11.0 + - Deploy Jobs API calls + - Projects search on dashboard page + - Improved runners page + - Running and Pending tabs on admin builds page + - Fix [ci skip] tag, so you can skip CI triggering now + - Add HipChat notifications + - Clean up project advanced settings. + - Add a GitLab project path parameter to the project API + - Remove projects IDs from dashboard + - UI fix: Remove page headers from the admin area + - Improve Email templates + - Add backup/restore utility + - Coordinator stores information(version, platform, revision, etc.) about runners. + - Fixed pagination on dashboard + - Public accessible build and commit pages of public projects + - Fix vulnerability in the API when MySQL is used + +v7.10.1 + - Fix failing migration when update to 7.10 from 7.8 and older versions + +sidekiq_wirker_fix + - added sidekiq.yml + - integrated in script/background_jobs +v7.10.0 + - Projects sorting by last commit date + - Add project search at runner page + - Fix GitLab and CI projects collision + - Events for admin + - Events per projects + - Search for runners in admin area + - UI improvements: created separated admin section, removed useless project show page + - Runners sorting in admin area (by id) + - Remove protected_attributes gem + - Skip commit creation if there is no appropriate job + +v7.9.3 + - Contains no changes + - Developers can cancel and retry jobs + +v7.9.2 + - [Security] Already existing projects should not be served by shared runners + - Ability to run deploy job without test jobs (every push will trigger deploy job) + +v7.9.1 + - [Security] Adding explicit is_shared parameter to runner + - [Security] By default new projects are not served by shared runners + +v7.9.0 + - Reset user session if token is invalid + - Runner delete api endpoint + - Fix bug about showing edit button on commit page if user does not have permissions + - Allow to pass description and tag list during Runner's registration + - Added api for project jobs + - Implementation of deploy jobs after all parallel jobs(tests). + - Add scroll up/down buttons for better mobile experience with large build traces + - Add runner last contact (Kamil Trzciński) + - Allow to pause runners - when paused runner will not receive any new build (Kamil Trzciński) + - Add brakeman (security scanner for Ruby on Rails) + - Changed a color of the canceled builds + - Fix of show the same commits in different branches + +v7.8.2 + - Fix the broken build failed email + - Notify only pusher instead of commiter + +v7.8.0 + - Fix OAuth login with GitLab installed in relative URL + - GitLab CI has same version as GitLab since now + - Allow to pass description and tag list during Runner's registration (Kamil Trzciński) + - Update documentation (API, Install, Update) + - Skip refs field supports for wildcard branch name (ex. feature/*) + - Migrate E-mail notification to Services menu (Kamil Trzciński) + - Added Slack notifications (Kamil Trzciński) + - Disable turbolink on links pointing out to GitLab server + - Add test coverage parsing example for pytest-cov + - Upgrade raindrops gem + +v5.4.2 + - Fix exposure of project token via build data + +v5.4.1 + - Fix 500 if on builds page if build has no job + - Truncate project token from build trace + - Allow users with access to project see build trace + +v5.4.0 (Requires GitLab 7.7) + - Fixed 500 error for badge if build is pending + - Non-admin users can now register specific runners for their projects + - Project specific runners page which users can access + - Remove progress output from schedule_builds cron job + - Fix schedule_builds rake task + - Fix test webhook button + - Job can be branch specific or tag specific or both + - Shared runners builds projects which are not assigned to specific ones + - Job can be runner specific through tags + - Runner have tags + - Move job settings to separate page + - Add authorization level managing projects + - OAuth authentication via GitLab. + +v5.3 + - Remove annoying 'Done' message from schedule_builds cron job + - Fix a style issue with the navbar + - Skip CSRF check on the project's build page + - Fix showing wrong build script on admin projects page + - Add branch and commit message to build result emails + +v5.2 + - Improve performance by adding new indicies + - Separate Commit logic from Build logic in prep for Parallel Builds + - Parallel builds + - You can have multiple build scripts per project + +v5.1 + - Registration token and runner token are named differently + - Redirect to previous page after sign-in + - Dont show archived projects + - Add support for skip branches from build + - Add coverage parsing feature + - Update rails to 4.0.10 + - Look for a REVISION file before running `git log` + - All builds page for admin + +v5.0.1 + - Update rails to 4.0.5 + +v5.0.0 + - Set build timeout in minutes + - Web Hooks for builds + - Nprogress bar + - Remove extra spaces in build script + - Requires runner v5 + * All script commands executed as one file + * Cancel button works correctly now + * Runner stability increased + * Timeout applies to build now instead of line of script + +v4.3.0 + - Refactor build js + - Redirect to build page with sha + bid if build id is not provided + - Update rails to 4.0.3 + - Restyle project settings page + - Improve help page + - Replaced puma with unicorn + - Improved init.d script + - Add submodule init to default build script for new projects + +v4.2.0 + - Build duration chart + - Bootstrap 3 with responsive UI + - Improved init.d script + - Refactoring + - Changed http codes for POST /projects/:id/build action + - Turbolinks + +v4.1.0 + - Rails 4 + - Click on build branch to see other builds for this branch + - Email notifications (Jeroen Knoops) + +v4.0.0 + - Shared runners (no need to add runner to every project) + - Admin area (only available for GitLab admins) + - Hide all runners management into admin area + - Use http cloning for builds instead of deploy keys + - Allow choose between git clone and git fetch when get code for build + - Make build timeout actually works + - Requires GitLab 6.3 or higher + - GitLab CI settings go to GitLab project via api on creation + +v3.2.0 + - Limit visibility of projects by gitlab authorized projects + - Use one page for both gitlab and gitlab-ci projects + +v3.1.0 + - Login with both username, email or LDAP credentials (if GitLab 6.0+) + - Retry build button functionality + - UI fixes for resolution 1366px and lower + - Fix gravatar ssl warning + +v3.0.0 + - Build running functionality extracted in gitlab-ci-runner + - Added API for runners and builds + - Redesigned application + - Added charts + - Use GitLab auth + - Add projects via UI with few clicks + +v2.2.0 + - replaced unicorn with puma + - replaced grit with rugged + - Runner.rb more transactional safe now + - updated rails to 3.2.13 + - updated devise to 2.2 + - fixed issue when build left in running status if exception triggered + - rescue build timeout correctly + - badge helper with markdown & html + - increased test coverage to 85% + +v2.1.0 + - Removed horizontal scroll for build trace + - new status badges + - better encode + - added several CI_* env variables + +v2.0.0 + - Replace resque with sidekiq + - Run only one build at time per project + - Added whenever for schedule jobs + +v1.2.0 + - Added Github web hook support + - Added build schedule + +v1.1.0 + - Added JSON response for builds status + - Compatible with GitLab v4.0.0 \ No newline at end of file diff --git a/Gemfile b/Gemfile index fe05f0f9f6..5443374f8d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,14 @@ source "https://rubygems.org" -gem 'rails', '4.1.11' +def darwin_only(require_as) + RUBY_PLATFORM.include?('darwin') && require_as +end + +def linux_only(require_as) + RUBY_PLATFORM.include?('linux') && require_as +end + +gem 'rails', '4.1.12' # Specify a sprockets version due to security issue # See https://groups.google.com/forum/#!topic/rubyonrails-security/doAVp0YaTqY @@ -10,45 +18,41 @@ gem 'sprockets', '~> 2.12.3' gem "default_value_for", "~> 3.0.0" # Supported DBs -gem "mysql2", group: :mysql -gem "pg", group: :postgres +gem "mysql2", '~> 0.3.16', group: :mysql +gem "pg", '~> 0.18.2', group: :postgres # Authentication libraries -gem "devise", '3.2.4' -gem "devise-async", '0.9.0' +gem "devise", '~> 3.5.2' +gem "devise-async", '~> 0.9.0' gem 'omniauth', "~> 1.2.2" -gem 'omniauth-google-oauth2' -gem 'omniauth-twitter' -gem 'omniauth-github' -gem 'omniauth-shibboleth' -gem 'omniauth-kerberos', group: :kerberos -gem 'omniauth-gitlab' -gem 'omniauth-bitbucket' +gem 'omniauth-google-oauth2', '~> 0.2.5' +gem 'omniauth-twitter', '~> 1.0.1' +gem 'omniauth-github', '~> 1.1.1' +gem 'omniauth-shibboleth', '~> 1.1.1' +gem 'omniauth-kerberos', '~> 0.2.0', group: :kerberos +gem 'omniauth-gitlab', '~> 1.0.0' +gem 'omniauth-bitbucket', '~> 0.0.2' gem 'omniauth-saml', '~> 1.4.0' -gem 'doorkeeper', '2.1.3' +gem 'doorkeeper', '~> 2.1.3' +gem 'omniauth_crowd' gem "rack-oauth2", "~> 1.0.5" # Two-factor authentication -gem 'devise-two-factor' -gem 'rqrcode-rails3' -gem 'attr_encrypted', '1.3.4' +gem 'devise-two-factor', '~> 2.0.0' +gem 'rqrcode-rails3', '~> 0.1.7' +gem 'attr_encrypted', '~> 1.3.4' # Browser detection -gem "browser", '~> 0.8.0' +gem "browser", '~> 1.0.0' # Extracting information from a git repository # Provide access to Gitlab::Git library gem "gitlab_git", '~> 7.2.15' -# Ruby/Rack Git Smart-HTTP Server Handler -# GitLab fork with a lot of changes (improved thread-safety, better memory usage etc) -# For full list of changes see https://github.com/SaitoWu/grack/compare/master...gitlabhq:master -gem 'gitlab-grack', '~> 2.0.2', require: 'grack' - # LDAP Auth # GitLab fork with several improvements to original library. For full list of changes # see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master -gem 'gitlab_omniauth-ldap', '1.2.1', require: "omniauth-ldap" +gem 'gitlab_omniauth-ldap', '~> 1.2.1', require: "omniauth-ldap" # Git Wiki gem 'gollum-lib', '~> 4.0.2' @@ -63,47 +67,47 @@ gem "gitlab-linguist", "~> 3.0.1", require: "linguist" # API gem "grape", "~> 0.6.1" gem "grape-entity", "~> 0.4.2" -gem 'rack-cors', require: 'rack/cors' +gem 'rack-cors', '~> 0.2.9', require: 'rack/cors' # Format dates and times # based on human-friendly examples -gem "stamp" +gem "stamp", '~> 0.5.0' # Enumeration fields -gem 'enumerize' +gem 'enumerize', '~> 0.7.0' # Pagination gem "kaminari", "~> 0.15.1" # HAML -gem "haml-rails" +gem "haml-rails", '~> 0.5.3' # Files attachments -gem "carrierwave" +gem "carrierwave", '~> 0.9.0' # Drag and Drop UI -gem 'dropzonejs-rails' +gem 'dropzonejs-rails', '~> 0.7.1' # for aws storage gem "fog", "~> 1.25.0" -gem "unf" +gem "unf", '~> 0.1.4' # Authorization -gem "six" +gem "six", '~> 0.2.0' # Seed data -gem "seed-fu" +gem "seed-fu", '~> 2.3.5' # Markdown and HTML processing gem 'html-pipeline', '~> 1.11.0' -gem 'task_list', '1.0.2', require: 'task_list/railtie' -gem 'github-markup' +gem 'task_list', '~> 1.0.2', require: 'task_list/railtie' +gem 'github-markup', '~> 1.3.1' gem 'redcarpet', '~> 3.3.2' -gem 'RedCloth' +gem 'RedCloth', '~> 4.2.9' gem 'rdoc', '~>3.6' -gem 'org-ruby', '= 0.9.12' +gem 'org-ruby', '~> 0.9.12' gem 'creole', '~>0.3.6' -gem 'wikicloth', '=0.8.1' +gem 'wikicloth', '0.8.1' gem 'asciidoctor', '~> 1.5.2' # Diffs @@ -111,37 +115,38 @@ gem 'diffy', '~> 3.0.3' # Application server group :unicorn do - gem "unicorn", '~> 4.6.3' - gem 'unicorn-worker-killer' + gem "unicorn", '~> 4.8.2' + gem 'unicorn-worker-killer', '~> 0.4.2' end # State machine -gem "state_machine" +gem "state_machine", '~> 1.2.0' # Issue tags gem 'acts-as-taggable-on', '~> 3.4' # Background jobs -gem 'slim' -gem 'sinatra', require: nil -gem 'sidekiq', '~> 3.3' -gem 'sidetiq', '0.6.3' +gem 'slim', '~> 2.0.2' +gem 'sinatra', '~> 1.4.4', require: nil +gem 'sidekiq', '3.3.0' +gem 'sidetiq', '~> 0.6.3' # HTTP requests -gem "httparty" +gem "httparty", '~> 0.13.3' # Colored output to console -gem "colored" +gem "colored", '~> 1.2' +gem "colorize", '~> 0.5.8' # GitLab settings -gem 'settingslogic' +gem 'settingslogic', '~> 2.0.9' # Misc -gem "foreman" -gem 'version_sorter' + +gem 'version_sorter', '~> 2.0.0' # Cache -gem "redis-rails" +gem "redis-rails", '~> 4.0.0' # Campfire integration gem 'tinder', '~> 1.9.2' @@ -161,6 +166,9 @@ gem "slack-notifier", "~> 1.0.0" # Asana integration gem 'asana', '~> 0.0.6' +# FogBugz integration +gem 'ruby-fogbugz', '~> 0.2.1' + # d3 gem 'd3_rails', '~> 3.5.5' @@ -177,69 +185,70 @@ gem "sanitize", '~> 2.0' gem "rack-attack", '~> 4.3.0' # Ace editor -gem 'ace-rails-ap' +gem 'ace-rails-ap', '~> 2.0.1' # Keyboard shortcuts -gem 'mousetrap-rails' +gem 'mousetrap-rails', '~> 1.4.6' # Detect and convert string character encoding -gem 'charlock_holmes' +gem 'charlock_holmes', '~> 0.6.9.4' gem "sass-rails", '~> 4.0.5' -gem "coffee-rails" -gem "uglifier" +gem "coffee-rails", '~> 4.1.0' +gem "uglifier", '~> 2.3.2' gem 'turbolinks', '~> 2.5.0' -gem 'jquery-turbolinks' +gem 'jquery-turbolinks', '~> 2.0.1' -gem 'addressable' +gem 'addressable', '~> 2.3.8' gem 'bootstrap-sass', '~> 3.0' gem 'font-awesome-rails', '~> 4.2' gem 'gitlab_emoji', '~> 0.1' gem 'gon', '~> 5.0.0' gem 'jquery-atwho-rails', '~> 1.0.0' -gem 'jquery-rails', '3.1.3' -gem 'jquery-scrollto-rails' -gem 'jquery-ui-rails' -gem 'nprogress-rails' +gem 'jquery-rails', '~> 3.1.3' +gem 'jquery-scrollto-rails', '~> 1.4.3' +gem 'jquery-ui-rails', '~> 4.2.1' +gem 'nprogress-rails', '~> 0.1.2.3' gem 'raphael-rails', '~> 2.1.2' -gem 'request_store' +gem 'request_store', '~> 1.2.0' gem 'select2-rails', '~> 3.5.9' -gem 'virtus' +gem 'virtus', '~> 1.0.1' group :development do - gem 'brakeman', require: false - gem "annotate", "~> 2.6.0.beta2" - gem "letter_opener" - gem 'quiet_assets', '~> 1.0.1' - gem 'rack-mini-profiler', require: false + gem "foreman" + gem 'brakeman', '3.0.1', require: false + + gem "annotate", "~> 2.6.0" + gem "letter_opener", '~> 1.1.2' + gem 'quiet_assets', '~> 1.0.2' + gem 'rack-mini-profiler', '~> 0.9.0', require: false gem 'rerun', '~> 0.10.0' # Better errors handler - gem 'better_errors' - gem 'binding_of_caller' + gem 'better_errors', '~> 1.0.1' + gem 'binding_of_caller', '~> 0.7.2' # Docs generator - gem "sdoc" + gem "sdoc", '~> 0.3.20' # thin instead webrick - gem 'thin' + gem 'thin', '~> 1.6.1' end group :development, :test do - gem 'awesome_print' gem 'byebug', platform: :mri - gem 'fuubar', '~> 2.0.0' gem 'pry-rails' - gem 'coveralls', '~> 0.8.2', require: false + gem 'awesome_print', '~> 1.2.0' + gem 'fuubar', '~> 2.0.0' + gem 'database_cleaner', '~> 1.4.0' - gem 'factory_girl_rails' + gem 'factory_girl_rails', '~> 4.3.0' gem 'rspec-rails', '~> 3.3.0' - gem 'rubocop', '0.28.0', require: false - gem 'spinach-rails' + gem 'spinach-rails', '~> 0.2.1' # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826) - gem 'minitest', '~> 5.3.0' + gem 'minitest', '~> 5.7.0' # Generate Fake data gem 'ffaker', '~> 2.0.0' @@ -249,26 +258,57 @@ group :development, :test do gem 'poltergeist', '~> 1.6.0' gem 'teaspoon', '~> 1.0.0' - gem 'teaspoon-jasmine' + gem 'teaspoon-jasmine', '~> 2.2.0' - gem 'spring', '~> 1.3.1' - gem 'spring-commands-rspec', '~> 1.0.0' + gem 'spring', '~> 1.3.6' + gem 'spring-commands-rspec', '~> 1.0.4' gem 'spring-commands-spinach', '~> 1.0.0' gem 'spring-commands-teaspoon', '~> 0.0.2' + + gem 'rubocop', '~> 0.28.0', require: false + gem 'coveralls', '~> 0.8.2', require: false + gem 'simplecov', '~> 0.10.0', require: false end group :test do - gem 'simplecov', require: false gem 'shoulda-matchers', '~> 2.8.0', require: false gem 'email_spec', '~> 1.6.0' gem 'webmock', '~> 1.21.0' - gem 'test_after_commit' + gem 'test_after_commit', '~> 0.2.2' + gem 'sham_rack' end group :production do gem "gitlab_meta", '7.0' end -gem "newrelic_rpm" +gem "newrelic_rpm", '~> 3.9.4.245' +gem 'newrelic-grape' -gem 'octokit', '3.7.0' +gem 'octokit', '~> 3.7.0' + +gem "mail_room", "~> 0.5.2" + +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' + +# Scheduled +gem 'whenever', '~> 0.8.4', require: false + +# OAuth +gem 'oauth2', '~> 1.0.0' + +# Soft deletion +gem "paranoia", "~> 2.0" + +group :development, :test do + gem 'guard-rspec', '~> 4.2.0' + + gem 'rb-fsevent', require: darwin_only('rb-fsevent') + gem 'growl', require: darwin_only('growl') + gem 'rb-inotify', require: linux_only('rb-inotify') +end diff --git a/Gemfile.lock b/Gemfile.lock index d09d1f9dc6..3c16251497 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,31 +4,36 @@ GEM CFPropertyList (2.3.1) RedCloth (4.2.9) ace-rails-ap (2.0.1) - actionmailer (4.1.11) - actionpack (= 4.1.11) - actionview (= 4.1.11) + actionmailer (4.1.12) + actionpack (= 4.1.12) + actionview (= 4.1.12) mail (~> 2.5, >= 2.5.4) - actionpack (4.1.11) - actionview (= 4.1.11) - activesupport (= 4.1.11) + actionpack (4.1.12) + actionview (= 4.1.12) + activesupport (= 4.1.12) rack (~> 1.5.2) rack-test (~> 0.6.2) - actionview (4.1.11) - activesupport (= 4.1.11) + actionview (4.1.12) + activesupport (= 4.1.12) builder (~> 3.1) erubis (~> 2.7.0) - activemodel (4.1.11) - activesupport (= 4.1.11) + activemodel (4.1.12) + activesupport (= 4.1.12) builder (~> 3.1) - activerecord (4.1.11) - activemodel (= 4.1.11) - activesupport (= 4.1.11) + activerecord (4.1.12) + activemodel (= 4.1.12) + activesupport (= 4.1.12) arel (~> 5.0.0) + activerecord-deprecated_finders (1.0.4) + activerecord-session_store (0.1.1) + actionpack (>= 4.0.0, < 5) + activerecord (>= 4.0.0, < 5) + railties (>= 4.0.0, < 5) activeresource (4.0.0) activemodel (~> 4.0) activesupport (~> 4.0) rails-observers (~> 0.1.1) - activesupport (4.1.11) + activesupport (4.1.12) i18n (~> 0.6, >= 0.6.9) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -37,33 +42,34 @@ GEM acts-as-taggable-on (3.5.0) activerecord (>= 3.2, < 5) addressable (2.3.8) - annotate (2.6.0) - activerecord (>= 2.3.0) - rake (>= 0.8.7) + annotate (2.6.10) + activerecord (>= 3.2, <= 4.3) + rake (~> 10.4) arel (5.0.1.20140414130214) asana (0.0.6) activeresource (>= 3.2.3) asciidoctor (1.5.2) - ast (2.0.0) - astrolabe (1.3.0) - parser (>= 2.2.0.pre.3, < 3.0) + ast (2.1.0) + astrolabe (1.3.1) + parser (~> 2.2) attr_encrypted (1.3.4) encryptor (>= 1.3.0) attr_required (1.0.0) - autoprefixer-rails (5.1.11) + autoprefixer-rails (5.2.1.2) execjs json awesome_print (1.2.0) - axiom-types (0.0.5) - descendants_tracker (~> 0.0.1) - ice_nine (~> 0.9) - bcrypt (3.1.7) + axiom-types (0.1.1) + descendants_tracker (~> 0.0.4) + ice_nine (~> 0.11.0) + thread_safe (~> 0.3, >= 0.3.1) + bcrypt (3.1.10) better_errors (1.0.1) coderay (>= 1.0.0) erubis (>= 2.6.6) binding_of_caller (0.7.2) debug_inspector (>= 0.0.1) - bootstrap-sass (3.3.4.1) + bootstrap-sass (3.3.5) autoprefixer-rails (>= 5.0.0.1) sass (>= 3.2.19) brakeman (3.0.1) @@ -76,11 +82,9 @@ GEM ruby_parser (~> 3.5.0) sass (~> 3.0) terminal-table (~> 1.4) - browser (0.8.0) + browser (1.0.0) builder (3.2.2) - byebug (3.2.0) - columnize (~> 0.8) - debugger-linecache (~> 1.2) + byebug (6.0.2) cal-heatmap-rails (0.0.1) capybara (2.4.4) mime-types (>= 1.16) @@ -88,7 +92,7 @@ GEM rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) - capybara-screenshot (1.0.9) + capybara-screenshot (1.0.11) capybara (>= 1.0, < 3) launchy carrierwave (0.9.0) @@ -98,6 +102,8 @@ GEM celluloid (0.16.0) timers (~> 4.0.0) charlock_holmes (0.6.9.4) + chronic (0.10.2) + chunky_png (1.3.4) cliver (0.3.2) coderay (1.1.0) coercible (1.0.0) @@ -111,8 +117,7 @@ GEM coffee-script-source (1.9.1.1) colored (1.2) colorize (0.5.8) - columnize (0.9.0) - connection_pool (2.1.0) + connection_pool (2.2.0) coveralls (0.8.2) json (~> 1.8) rest-client (>= 1.6.8, < 2) @@ -122,65 +127,65 @@ GEM crack (0.4.2) safe_yaml (~> 1.0.0) creole (0.3.8) - d3_rails (3.5.5) + d3_rails (3.5.6) railties (>= 3.1.0) - daemons (1.1.9) + daemons (1.2.3) database_cleaner (1.4.1) debug_inspector (0.0.2) - debugger-linecache (1.2.0) - default_value_for (3.0.0) + default_value_for (3.0.1) activerecord (>= 3.2.0, < 5.0) - descendants_tracker (0.0.3) - devise (3.2.4) + descendants_tracker (0.0.4) + thread_safe (~> 0.3, >= 0.3.1) + devise (3.5.2) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) + responders thread_safe (~> 0.1) warden (~> 1.2.3) devise-async (0.9.0) devise (~> 3.2) - devise-two-factor (1.0.1) - activemodel + devise-two-factor (2.0.0) activesupport attr_encrypted (~> 1.3.2) - devise (~> 3.2.4) - rails - rotp (~> 1.6.1) + devise (~> 3.5.0) + railties + rotp (~> 2) diff-lcs (1.2.5) - diffy (3.0.3) + diffy (3.0.7) docile (1.1.5) domain_name (0.5.24) unf (>= 0.0.5, < 1.0.0) - doorkeeper (2.1.3) + doorkeeper (2.1.4) railties (>= 3.2) - dotenv (0.9.0) dropzonejs-rails (0.7.1) rails (> 3.1) + email_reply_parser (0.5.8) email_spec (1.6.0) launchy (~> 2.1) mail (~> 2.2) encryptor (1.3.0) enumerize (0.7.0) activesupport (>= 3.2) - equalizer (0.0.8) + equalizer (0.0.11) erubis (2.7.0) escape_utils (0.2.4) - eventmachine (1.0.4) - excon (0.45.3) - execjs (2.5.2) + eventmachine (1.0.8) + excon (0.45.4) + execjs (2.6.0) expression_parser (0.9.0) factory_girl (4.3.0) activesupport (>= 3.0.0) factory_girl_rails (4.3.0) factory_girl (~> 4.3.0) railties (>= 3.0.0) - faraday (0.8.9) + faraday (0.8.10) multipart-post (~> 1.2.0) - faraday_middleware (0.9.0) - faraday (>= 0.7.4, < 0.9) + faraday_middleware (0.10.0) + faraday (>= 0.7.4, < 0.10) fastercsv (1.5.5) ffaker (2.0.0) - ffi (1.9.8) + ffi (1.9.10) fission (0.5.0) CFPropertyList (~> 2.2) flowdock (0.7.0) @@ -201,11 +206,11 @@ GEM ipaddress (~> 0.5) nokogiri (~> 1.5, >= 1.5.11) opennebula - fog-brightbox (0.7.1) + fog-brightbox (0.9.0) fog-core (~> 1.22) fog-json inflecto (~> 0.0.2) - fog-core (1.30.0) + fog-core (1.32.1) builder excon (~> 0.45) formatador (~> 0.2) @@ -215,7 +220,7 @@ GEM fog-json (1.0.2) fog-core (~> 1.0) multi_json (~> 1.10) - fog-profitbricks (0.0.3) + fog-profitbricks (0.0.5) fog-core fog-xml nokogiri @@ -226,7 +231,7 @@ GEM fog-sakuracloud (1.0.1) fog-core fog-json - fog-softlayer (0.4.6) + fog-softlayer (0.4.7) fog-core fog-json fog-terremark (0.1.0) @@ -241,30 +246,26 @@ GEM fog-xml (0.1.2) fog-core nokogiri (~> 1.5, >= 1.5.11) - font-awesome-rails (4.2.0.0) + font-awesome-rails (4.4.0.0) railties (>= 3.2, < 5.0) - foreman (0.63.0) - dotenv (>= 0.7) - thor (>= 0.13.6) + foreman (0.78.0) + thor (~> 0.19.1) formatador (0.2.5) fuubar (2.0.0) rspec (~> 3.0) ruby-progressbar (~> 1.4) gemnasium-gitlab-service (0.2.6) rugged (~> 0.21) - gemojione (2.0.0) + gemojione (2.0.1) json - gherkin-ruby (0.3.1) - racc - github-markup (1.3.1) - posix-spawn (~> 0.3.8) + get_process_mem (0.2.0) + gherkin-ruby (0.3.2) + github-markup (1.3.3) gitlab-flowdock-git-hook (1.0.1) flowdock (~> 0.7) gitlab-grit (>= 2.4.1) multi_json - gitlab-grack (2.0.2) - rack (~> 1.5.1) - gitlab-grit (2.7.2) + gitlab-grit (2.7.3) charlock_holmes (~> 0.6) diff-lcs (~> 1.1) mime-types (~> 1.15) @@ -273,7 +274,7 @@ GEM charlock_holmes (~> 0.6.6) escape_utils (~> 0.2.4) mime-types (~> 1.19) - gitlab_emoji (0.1.0) + gitlab_emoji (0.1.1) gemojione (~> 2.0) gitlab_git (7.2.15) activesupport (~> 4.0) @@ -286,16 +287,16 @@ GEM omniauth (~> 1.0) pyu-ruby-sasl (~> 0.0.3.1) rubyntlm (~> 0.3) - gollum-grit_adapter (0.1.3) + gollum-grit_adapter (1.0.0) gitlab-grit (~> 2.7, >= 2.7.1) - gollum-lib (4.0.2) - github-markup (~> 1.3.1) - gollum-grit_adapter (~> 0.1, >= 0.1.1) + gollum-lib (4.0.3) + github-markup (~> 1.3.3) + gollum-grit_adapter (~> 1.0) nokogiri (~> 1.6.4) - rouge (~> 1.9) + rouge (~> 1.10.1) sanitize (~> 2.1.0) stringex (~> 2.5.1) - gon (5.0.1) + gon (5.0.4) actionpack (>= 2.3.0) json grape (0.6.1) @@ -308,9 +309,22 @@ GEM rack-accept rack-mount virtus (>= 1.0.0) - grape-entity (0.4.2) + grape-entity (0.4.8) activesupport multi_json (>= 1.3.2) + growl (1.0.3) + guard (2.13.0) + formatador (>= 0.2.4) + listen (>= 2.7, <= 4.0) + lumberjack (~> 1.0) + nenv (~> 0.1) + notiffany (~> 0.0) + pry (>= 0.9.12) + shellany (~> 0.0) + thor (>= 0.18.1) + guard-rspec (4.2.10) + guard (~> 2.1) + rspec (>= 2.14, < 4.0) haml (4.0.7) tilt haml-rails (0.5.3) @@ -321,24 +335,23 @@ GEM hashie (2.1.2) highline (1.6.21) hike (1.2.3) - hipchat (1.5.0) + hipchat (1.5.2) httparty mimemagic - hitimes (1.2.2) + hitimes (1.2.3) html-pipeline (1.11.0) activesupport (>= 2) nokogiri (~> 1.4) http-cookie (1.0.2) domain_name (~> 0.5) http_parser.rb (0.5.3) - httparty (0.13.3) + httparty (0.13.5) json (~> 1.8) multi_xml (>= 0.5.2) - httpauth (0.2.1) - httpclient (2.5.3.3) + httpclient (2.6.0.1) i18n (0.7.0) ice_cube (0.11.1) - ice_nine (0.10.0) + ice_nine (0.11.1) inflecto (0.0.2) ipaddress (0.8.0) jquery-atwho-rails (1.0.1) @@ -347,57 +360,66 @@ GEM thor (>= 0.14, < 2.0) jquery-scrollto-rails (1.4.3) railties (> 3.1, < 5.0) - jquery-turbolinks (2.0.1) + jquery-turbolinks (2.0.2) railties (>= 3.1.0) turbolinks jquery-ui-rails (4.2.1) railties (>= 3.2.16) json (1.8.3) - jwt (0.1.13) - multi_json (>= 1.5) + jwt (1.5.1) kaminari (0.15.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) - kgio (2.9.2) + kgio (2.9.3) launchy (2.4.3) addressable (~> 2.3) letter_opener (1.1.2) launchy (~> 2.2) - listen (2.10.0) + listen (2.10.1) celluloid (~> 0.16.0) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) + lumberjack (1.0.9) macaddr (1.7.1) systemu (~> 2.6.2) mail (2.6.3) mime-types (>= 1.16, < 3) + mail_room (0.5.2) method_source (0.8.2) mime-types (1.25.1) mimemagic (0.3.0) mini_portile (0.6.2) - minitest (5.3.5) + minitest (5.7.0) mousetrap-rails (1.4.6) multi_json (1.11.2) multi_xml (0.5.5) multipart-post (1.2.0) - mysql2 (0.3.16) + mysql2 (0.3.20) + nenv (0.2.0) + nested_form (0.3.2) net-ldap (0.11) net-scp (1.2.1) net-ssh (>= 2.6.5) net-ssh (2.9.2) netrc (0.10.3) + newrelic-grape (2.0.0) + grape + newrelic_rpm newrelic_rpm (3.9.4.245) nokogiri (1.6.6.2) mini_portile (~> 0.6.0) + notiffany (0.0.7) + nenv (~> 0.1) + shellany (~> 0.0) nprogress-rails (0.1.2.3) oauth (0.4.7) - oauth2 (0.8.1) - faraday (~> 0.8) - httpauth (~> 0.1) - jwt (~> 0.1.4) - multi_json (~> 1.0) + oauth2 (1.0.0) + faraday (>= 0.8, < 0.10) + jwt (~> 1.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) rack (~> 1.2) - octokit (3.7.0) + octokit (3.7.1) sawyer (~> 0.6.0, >= 0.5.3) omniauth (1.2.2) hashie (>= 1.2, < 4) @@ -406,34 +428,38 @@ GEM multi_json (~> 1.7) omniauth (~> 1.1) omniauth-oauth (~> 1.0) - omniauth-github (1.1.1) + omniauth-github (1.1.2) omniauth (~> 1.0) omniauth-oauth2 (~> 1.1) omniauth-gitlab (1.0.0) omniauth (~> 1.0) omniauth-oauth2 (~> 1.0) - omniauth-google-oauth2 (0.2.5) + omniauth-google-oauth2 (0.2.6) omniauth (> 1.0) omniauth-oauth2 (~> 1.1) omniauth-kerberos (0.2.0) omniauth-multipassword timfel-krb5-auth (~> 0.8) - omniauth-multipassword (0.4.1) + omniauth-multipassword (0.4.2) omniauth (~> 1.0) - omniauth-oauth (1.0.1) + omniauth-oauth (1.1.0) oauth omniauth (~> 1.0) - omniauth-oauth2 (1.1.1) - oauth2 (~> 0.8.0) - omniauth (~> 1.0) + omniauth-oauth2 (1.3.1) + oauth2 (~> 1.0) + omniauth (~> 1.2) omniauth-saml (1.4.1) omniauth (~> 1.1) ruby-saml (~> 1.0.0) - omniauth-shibboleth (1.1.1) + omniauth-shibboleth (1.1.2) omniauth (>= 1.0.0) omniauth-twitter (1.0.1) multi_json (~> 1.3) omniauth-oauth (~> 1.0) + omniauth_crowd (2.2.3) + activesupport + nokogiri (>= 1.4.4) + omniauth (~> 1.0) opennebula (4.12.1) json nokogiri @@ -441,7 +467,9 @@ GEM org-ruby (0.9.12) rubypants (~> 0.2) orm_adapter (0.5.0) - parser (2.2.0.2) + paranoia (2.1.3) + activerecord (~> 4.0) + parser (2.2.2.6) ast (>= 1.1, < 3.0) pg (0.18.2) poltergeist (1.6.0) @@ -449,60 +477,59 @@ GEM cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) - posix-spawn (0.3.9) + posix-spawn (0.3.11) powerpack (0.0.9) - pry (0.9.12.4) - coderay (~> 1.0) - method_source (~> 0.8) + pry (0.10.1) + coderay (~> 1.1.0) + method_source (~> 0.8.1) slop (~> 3.4) - pry-rails (0.3.2) + pry-rails (0.3.4) pry (>= 0.9.10) pyu-ruby-sasl (0.0.3.3) - quiet_assets (1.0.2) + quiet_assets (1.0.3) railties (>= 3.1, < 5.0) - racc (1.4.10) rack (1.5.5) rack-accept (0.4.5) rack (>= 0.4) rack-attack (4.3.0) rack rack-cors (0.2.9) - rack-mini-profiler (0.9.0) + rack-mini-profiler (0.9.7) rack (>= 1.1.3) rack-mount (0.8.3) rack (>= 1.0.0) - rack-oauth2 (1.0.8) + rack-oauth2 (1.0.10) activesupport (>= 2.3) attr_required (>= 0.0.5) - httpclient (>= 2.2.0.2) + httpclient (>= 2.4) multi_json (>= 1.3.6) rack (>= 1.1) - rack-protection (1.5.1) + rack-protection (1.5.3) rack rack-test (0.6.3) rack (>= 1.0) - rails (4.1.11) - actionmailer (= 4.1.11) - actionpack (= 4.1.11) - actionview (= 4.1.11) - activemodel (= 4.1.11) - activerecord (= 4.1.11) - activesupport (= 4.1.11) + rails (4.1.12) + actionmailer (= 4.1.12) + actionpack (= 4.1.12) + actionview (= 4.1.12) + activemodel (= 4.1.12) + activerecord (= 4.1.12) + activesupport (= 4.1.12) bundler (>= 1.3.0, < 2.0) - railties (= 4.1.11) + railties (= 4.1.12) sprockets-rails (~> 2.0) rails-observers (0.1.2) activemodel (~> 4.0) - railties (4.1.11) - actionpack (= 4.1.11) - activesupport (= 4.1.11) + railties (4.1.12) + actionpack (= 4.1.12) + activesupport (= 4.1.12) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rainbow (2.0.0) - raindrops (0.13.0) + raindrops (0.15.0) rake (10.4.2) raphael-rails (2.1.2) - rb-fsevent (0.9.4) + rb-fsevent (0.9.5) rb-inotify (0.9.5) ffi (>= 0.5.0) rbvmomi (1.8.2) @@ -517,10 +544,10 @@ GEM actionpack (~> 4) redis-rack (~> 1.5.0) redis-store (~> 1.1.0) - redis-activesupport (4.0.0) + redis-activesupport (4.1.1) activesupport (~> 4) redis-store (~> 1.1.0) - redis-namespace (1.5.1) + redis-namespace (1.5.2) redis (~> 3.0, >= 3.0.4) redis-rack (1.5.0) rack (~> 1.5) @@ -531,32 +558,35 @@ GEM redis-store (~> 1.1.0) redis-store (1.1.6) redis (>= 2.2) - request_store (1.0.5) + request_store (1.2.0) rerun (0.10.0) listen (~> 2.7, >= 2.7.3) + responders (1.1.2) + railties (>= 3.2, < 4.2) 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 (1.6.1) - rouge (1.9.1) - rqrcode (0.4.2) + rotp (2.1.1) + rouge (1.10.1) + rqrcode (0.7.0) + 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.1) + rspec-core (3.3.2) rspec-support (~> 3.3.0) - rspec-expectations (3.3.0) + rspec-expectations (3.3.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.3.0) - rspec-mocks (3.3.0) + rspec-mocks (3.3.2) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.3.0) - rspec-rails (3.3.2) + rspec-rails (3.3.3) actionpack (>= 3.0, < 4.3) activesupport (>= 3.0, < 4.3) railties (>= 3.0, < 4.3) @@ -571,16 +601,18 @@ GEM powerpack (~> 0.0.6) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.4) - ruby-progressbar (1.7.1) + ruby-fogbugz (0.2.1) + crack (~> 0.4) + ruby-progressbar (1.7.5) ruby-saml (1.0.0) nokogiri (>= 1.5.10) uuid (~> 2.3) - ruby2ruby (2.1.3) + ruby2ruby (2.1.4) ruby_parser (~> 3.1) sexp_processor (~> 4.0) ruby_parser (3.5.0) sexp_processor (~> 4.1) - rubyntlm (0.5.0) + rubyntlm (0.5.2) rubypants (0.2.0) rugged (0.22.2) safe_yaml (1.0.4) @@ -604,7 +636,10 @@ GEM select2-rails (3.5.9.3) thor (~> 0.14) settingslogic (2.0.9) - sexp_processor (4.4.5) + sexp_processor (4.6.0) + sham_rack (1.3.6) + rack + shellany (0.0.1) shoulda-matchers (2.8.0) activesupport (>= 3.0.0) sidekiq (3.3.0) @@ -623,19 +658,20 @@ GEM json (~> 1.8) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) - sinatra (1.4.4) + sinatra (1.4.6) rack (~> 1.4) rack-protection (~> 1.4) - tilt (~> 1.3, >= 1.3.4) + tilt (>= 1.3, < 3) six (0.2.0) slack-notifier (1.0.0) - slim (2.0.2) + slim (2.0.3) temple (~> 0.6.6) tilt (>= 1.3.3, < 2.1) slop (3.6.0) - spinach (0.8.7) - colorize (= 0.5.8) - gherkin-ruby (>= 0.3.1) + spinach (0.8.10) + colorize + gherkin-ruby (>= 0.3.2) + json spinach-rails (0.2.1) capybara (>= 2.0.0) railties (>= 3) @@ -666,31 +702,32 @@ GEM railties (>= 3.2.5, < 5) teaspoon-jasmine (2.2.0) teaspoon (>= 1.0.0) - temple (0.6.7) + temple (0.6.10) term-ansicolor (1.3.2) tins (~> 1.0) - terminal-table (1.4.5) - test_after_commit (0.2.2) - thin (1.6.1) - daemons (>= 1.0.9) - eventmachine (>= 1.0.0) - rack (>= 1.0.0) + terminal-table (1.5.2) + test_after_commit (0.2.7) + activerecord (>= 3.2) + thin (1.6.3) + daemons (~> 1.0, >= 1.0.9) + eventmachine (~> 1.0) + rack (~> 1.0) thor (0.19.1) thread_safe (0.3.5) tilt (1.4.1) - timers (4.0.1) + timers (4.0.4) hitimes timfel-krb5-auth (0.8.3) - tinder (1.9.3) + tinder (1.9.4) eventmachine (~> 1.0) - faraday (~> 0.8) + faraday (~> 0.8.9) faraday_middleware (~> 0.9) hashie (>= 1.0, < 3) json (~> 1.8.0) mime-types (~> 1.19) multi_json (~> 1.7) twitter-stream (~> 0.1) - tins (1.5.4) + tins (1.6.0) trollop (2.1.2) turbolinks (2.5.3) coffee-rails @@ -700,35 +737,39 @@ GEM simple_oauth (~> 0.1.4) tzinfo (1.2.2) thread_safe (~> 0.1) - uglifier (2.3.2) + uglifier (2.3.3) execjs (>= 0.3.0) json (>= 1.8.0) underscore-rails (1.4.4) unf (0.1.4) unf_ext unf_ext (0.0.7.1) - unicorn (4.6.3) + unicorn (4.8.3) kgio (~> 2.6) rack raindrops (~> 0.7) - unicorn-worker-killer (0.4.2) + unicorn-worker-killer (0.4.3) + get_process_mem (~> 0) unicorn (~> 4) uuid (2.3.8) macaddr (~> 1.0) version_sorter (2.0.0) - virtus (1.0.1) - axiom-types (~> 0.0.5) + virtus (1.0.5) + axiom-types (~> 0.1) coercible (~> 1.0) - descendants_tracker (~> 0.0.1) - equalizer (~> 0.0.7) + descendants_tracker (~> 0.0, >= 0.0.3) + equalizer (~> 0.0, >= 0.0.9) warden (1.2.3) rack (>= 1.0) webmock (1.21.0) addressable (>= 2.3.6) crack (>= 0.3.2) - websocket-driver (0.5.4) + websocket-driver (0.6.2) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) + whenever (0.8.4) + activesupport (>= 2.3.4) + chronic (>= 0.6.3) wikicloth (0.8.1) builder expression_parser @@ -740,143 +781,156 @@ PLATFORMS ruby DEPENDENCIES - RedCloth - ace-rails-ap + RedCloth (~> 4.2.9) + ace-rails-ap (~> 2.0.1) + activerecord-deprecated_finders (~> 1.0.3) + activerecord-session_store (~> 0.1.0) acts-as-taggable-on (~> 3.4) - addressable - annotate (~> 2.6.0.beta2) + addressable (~> 2.3.8) + annotate (~> 2.6.0) asana (~> 0.0.6) asciidoctor (~> 1.5.2) - attr_encrypted (= 1.3.4) - awesome_print - better_errors - binding_of_caller + attr_encrypted (~> 1.3.4) + awesome_print (~> 1.2.0) + better_errors (~> 1.0.1) + binding_of_caller (~> 0.7.2) bootstrap-sass (~> 3.0) - brakeman - browser (~> 0.8.0) + brakeman (= 3.0.1) + browser (~> 1.0.0) byebug cal-heatmap-rails (~> 0.0.1) capybara (~> 2.4.0) capybara-screenshot (~> 1.0.0) - carrierwave - charlock_holmes - coffee-rails - colored + carrierwave (~> 0.9.0) + charlock_holmes (~> 0.6.9.4) + coffee-rails (~> 4.1.0) + colored (~> 1.2) + colorize (~> 0.5.8) coveralls (~> 0.8.2) creole (~> 0.3.6) d3_rails (~> 3.5.5) database_cleaner (~> 1.4.0) default_value_for (~> 3.0.0) - devise (= 3.2.4) - devise-async (= 0.9.0) - devise-two-factor + devise (~> 3.5.2) + devise-async (~> 0.9.0) + devise-two-factor (~> 2.0.0) diffy (~> 3.0.3) - doorkeeper (= 2.1.3) - dropzonejs-rails + doorkeeper (~> 2.1.3) + dropzonejs-rails (~> 0.7.1) + email_reply_parser (~> 0.5.8) email_spec (~> 1.6.0) - enumerize - factory_girl_rails + enumerize (~> 0.7.0) + factory_girl_rails (~> 4.3.0) ffaker (~> 2.0.0) fog (~> 1.25.0) font-awesome-rails (~> 4.2) foreman fuubar (~> 2.0.0) gemnasium-gitlab-service (~> 0.2) - github-markup + github-markup (~> 1.3.1) gitlab-flowdock-git-hook (~> 1.0.1) - gitlab-grack (~> 2.0.2) gitlab-linguist (~> 3.0.1) gitlab_emoji (~> 0.1) gitlab_git (~> 7.2.15) gitlab_meta (= 7.0) - gitlab_omniauth-ldap (= 1.2.1) + gitlab_omniauth-ldap (~> 1.2.1) gollum-lib (~> 4.0.2) gon (~> 5.0.0) grape (~> 0.6.1) grape-entity (~> 0.4.2) - haml-rails + growl + guard-rspec (~> 4.2.0) + haml-rails (~> 0.5.3) hipchat (~> 1.5.0) html-pipeline (~> 1.11.0) - httparty + httparty (~> 0.13.3) jquery-atwho-rails (~> 1.0.0) - jquery-rails (= 3.1.3) - jquery-scrollto-rails - jquery-turbolinks - jquery-ui-rails + jquery-rails (~> 3.1.3) + jquery-scrollto-rails (~> 1.4.3) + jquery-turbolinks (~> 2.0.1) + jquery-ui-rails (~> 4.2.1) kaminari (~> 0.15.1) - letter_opener - minitest (~> 5.3.0) - mousetrap-rails - mysql2 - newrelic_rpm - nprogress-rails - octokit (= 3.7.0) + letter_opener (~> 1.1.2) + mail_room (~> 0.5.2) + minitest (~> 5.7.0) + mousetrap-rails (~> 1.4.6) + mysql2 (~> 0.3.16) + nested_form (~> 0.3.2) + newrelic-grape + newrelic_rpm (~> 3.9.4.245) + nprogress-rails (~> 0.1.2.3) + oauth2 (~> 1.0.0) + octokit (~> 3.7.0) omniauth (~> 1.2.2) - omniauth-bitbucket - omniauth-github - omniauth-gitlab - omniauth-google-oauth2 - omniauth-kerberos + omniauth-bitbucket (~> 0.0.2) + omniauth-github (~> 1.1.1) + omniauth-gitlab (~> 1.0.0) + omniauth-google-oauth2 (~> 0.2.5) + omniauth-kerberos (~> 0.2.0) omniauth-saml (~> 1.4.0) - omniauth-shibboleth - omniauth-twitter - org-ruby (= 0.9.12) - pg + omniauth-shibboleth (~> 1.1.1) + omniauth-twitter (~> 1.0.1) + omniauth_crowd + org-ruby (~> 0.9.12) + paranoia (~> 2.0) + pg (~> 0.18.2) poltergeist (~> 1.6.0) pry-rails - quiet_assets (~> 1.0.1) + quiet_assets (~> 1.0.2) rack-attack (~> 4.3.0) - rack-cors - rack-mini-profiler + rack-cors (~> 0.2.9) + rack-mini-profiler (~> 0.9.0) rack-oauth2 (~> 1.0.5) - rails (= 4.1.11) + rails (= 4.1.12) raphael-rails (~> 2.1.2) + rb-fsevent + rb-inotify rdoc (~> 3.6) redcarpet (~> 3.3.2) - redis-rails - request_store + redis-rails (~> 4.0.0) + request_store (~> 1.2.0) rerun (~> 0.10.0) - rqrcode-rails3 + rqrcode-rails3 (~> 0.1.7) rspec-rails (~> 3.3.0) - rubocop (= 0.28.0) + rubocop (~> 0.28.0) + ruby-fogbugz (~> 0.2.1) sanitize (~> 2.0) sass-rails (~> 4.0.5) - sdoc - seed-fu + sdoc (~> 0.3.20) + seed-fu (~> 2.3.5) select2-rails (~> 3.5.9) - settingslogic + settingslogic (~> 2.0.9) + sham_rack shoulda-matchers (~> 2.8.0) - sidekiq (~> 3.3) - sidetiq (= 0.6.3) - simplecov - sinatra - six + sidekiq (= 3.3.0) + sidetiq (~> 0.6.3) + simplecov (~> 0.10.0) + sinatra (~> 1.4.4) + six (~> 0.2.0) slack-notifier (~> 1.0.0) - slim - spinach-rails - spring (~> 1.3.1) - spring-commands-rspec (~> 1.0.0) + slim (~> 2.0.2) + spinach-rails (~> 0.2.1) + spring (~> 1.3.6) + spring-commands-rspec (~> 1.0.4) spring-commands-spinach (~> 1.0.0) spring-commands-teaspoon (~> 0.0.2) sprockets (~> 2.12.3) - stamp - state_machine - task_list (= 1.0.2) + stamp (~> 0.5.0) + state_machine (~> 1.2.0) + task_list (~> 1.0.2) teaspoon (~> 1.0.0) - teaspoon-jasmine - test_after_commit - thin + teaspoon-jasmine (~> 2.2.0) + test_after_commit (~> 0.2.2) + thin (~> 1.6.1) tinder (~> 1.9.2) turbolinks (~> 2.5.0) - uglifier + uglifier (~> 2.3.2) underscore-rails (~> 1.4.4) - unf - unicorn (~> 4.6.3) - unicorn-worker-killer - version_sorter - virtus + unf (~> 0.1.4) + unicorn (~> 4.8.2) + unicorn-worker-killer (~> 0.4.2) + version_sorter (~> 2.0.0) + virtus (~> 1.0.1) webmock (~> 1.21.0) + whenever (~> 0.8.4) wikicloth (= 0.8.1) - -BUNDLED WITH - 1.10.6 diff --git a/Procfile b/Procfile index 799b92729f..08880b9c42 100644 --- a/Procfile +++ b/Procfile @@ -1,2 +1,3 @@ web: bundle exec unicorn_rails -p ${PORT:="3000"} -E ${RAILS_ENV:="development"} -c ${UNICORN_CONFIG:="config/unicorn.rb"} -worker: bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q common -q default +worker: bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q default +# mail_room: bundle exec mail_room -q -c config/mail_room.yml diff --git a/README.md b/README.md index 52e12bb66a..99d5bc0b6c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![build status](https://ci.gitlab.com/projects/1/status.png?ref=master)](https://ci.gitlab.com/projects/1?ref=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.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) +[![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.svg?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) ## Canonical source diff --git a/VERSION b/VERSION index bd4a01e181..608c4e7100 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.14.3 \ No newline at end of file +8.0.2 \ No newline at end of file diff --git a/app/assets/fonts/OFL.txt b/app/assets/fonts/OFL.txt new file mode 100755 index 0000000000..a9b845ed1d --- /dev/null +++ b/app/assets/fonts/OFL.txt @@ -0,0 +1,92 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/assets/fonts/SourceSansPro-Black.ttf b/app/assets/fonts/SourceSansPro-Black.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cb89a2d171e4db582ffaae8b5fe465680921996b GIT binary patch literal 148368 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

CW;@Th7(XPUPmkZ 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Bold.ttf b/app/assets/fonts/SourceSansPro-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..50d81bdad58b06dbf4e3b6201cbdb31814aa5030 GIT binary patch literal 148932 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-ExtraLight.ttf b/app/assets/fonts/SourceSansPro-ExtraLight.ttf new file mode 100755 index 0000000000000000000000000000000000000000..bb4176c6fff742636a9ae8604cc22d2f21505bdf GIT binary patch literal 150528 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

*0fSY=GawYBfnK(*Pfl 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Italic.ttf b/app/assets/fonts/SourceSansPro-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e5a1a86e63104c52033259517e48c73fc9ee55ca GIT binary patch literal 117328 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 PgU%}(Gm}pK)bjrTSP7q7 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Light.ttf b/app/assets/fonts/SourceSansPro-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5f64679f6b98169bd9b877939b94e0387f503b88 GIT binary patch literal 150244 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 dL#lX9xsrRY)++$&uvPWs;azwZUc_v&cw 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 ZlT2_dG*WCr4b1T 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Regular.ttf b/app/assets/fonts/SourceSansPro-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..91e9ea5757fdff812d6690ca14f3a18589c0a723 GIT binary patch literal 149972 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

0T(9G^a8qt)`+5MkfPiowCC<|G& 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 HY0-ZHYYpa> literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Semibold.ttf b/app/assets/fonts/SourceSansPro-Semibold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5020594826b603961399cec009188a8d11a437d5 GIT binary patch literal 149636 zcmdSCd4N>al|O#(tKRqO+PbT{s%z=mx~r?Jt9svQn%;qiW@|RtK}2L}5tU6u0*Hht zQDcnb7-Nia5;Vjh8e@zxOvX6I7~>dqzz{X+7-LWoq5AhZ_r0oDMMEav$;=c0EVJ@;()+;eX+&KT3-pA;7AoG?7;=Hf$-FvddU}w+p%+76xzW$#~%IRXv^6=E*s_?umU-hBx zQB+v8^vcES)|$E|;f1>x%knMVG-}U%g4Z!tx(46-R;*ijW!lKy^^92`#xomNF5b9q zY>a8}z8CR*#>zF1D{9nxop*y zqnpo$zxFf6q$0+&Yt~$~bn)QnyKcq%4xzcDS1#VXF70Y5g8Fx&zJ2ZDE0?c3b#M;j zBV~-W_O82Xnre2oc@(Ih- zybB2X)g3#&EnojoG!}^dQ_6!H;J`AOL{R+UInArlKZEGc;rq{09uzIf--&-y<`D${ z&SdHAa+a!mpM{=)E<_Qg;V(;b@C}pp;RcEIKBAIF?43aIKy3+X%)_NT3X}GmUgFn?VrvE4fI)v8XhY4ND!YT3U~*nGN$O zuA}&T2kz-N3KN&kG zl`x-_&1$3?*2iC9eq1Z~7tGIFnMKOLcR|3@SPM@ddr8W|eLm~c46r^agyI(U`=n|- zb2YyEJ}csvGrbgGUHs21NBRJtPqI9^=T9)F=nwVjf4OKn$Ic5H5uFkX(JWT>G8@tF zA1*}uOBIX>jf*HxvJ!3{JBu-zg6k(Jf0nN-1F&x8z606gIE}{gf|4yhe*v1t z#+b(WVui;3e_kpz^ThLEv~jUgEfGImtPqb~s(g>l68uLzm{^D(|IzYKXyYPWZc$t-*W#%BZb zC|3ur1fwg#sU+T4$9VJqOegxbos~!&JkMD_ ziUXwxrBJyBaHZl$aZ6RKj_<~2iMho0CCb&#n)w;Pi&?E?XAyjNsrD-IU97zlNzX#m z9zVy*M0Cs`%Fo5J5h(Xj@U ziMVe-nW)@Pg#D;OspH3SJ&tQ9D;MPiD~Ap&$9u&U_1pO*w0Ro*)5RvERG`d7@u1kn zbq>p6V{C-aVFq!14E=Zu3xjPdwACqpzk60Er*yRK)Ry2Lgmhv34X)LTk(~RQ9eJ!pNnNzuz;=WW<#Y*w4Qz^tBPAP@`FaZ|(E_SU~ zzO&;>#VPeNgT@BmAq;!qN8eY2My-Ia#rHph4a`6vj<6Y+%@lx_gVJhzUX4DlW?s7T zZt#0I%i_O=ecTUQ-OUV2smGN{>~jI`3p6g)Pet0qQluQ{J_DZDu_5sH5UxVL*f&@S z`xYyJ{W*wo9Ay_3b|Wj~ZdSnFW929#AOD^Zr9(D&CXh3=n3c^rl6Q2CKkzJ@E6gD5wl#M;4Jag55dD9@vO zhC*%7v-c&GBe;JQh2FIlW$i@@JrjfP!2LRu3$L3LIJL7K<-#j{zmeI-PT~3}&1W#y zjO~>RY!7^6mM#3$Aihe&oB*~SbvL7|qxlTkEOEu0L(F^N`-u9e#~*-xI?jv`xO*-30I$r2`@?YM;JB#oh2EEn*UHcBo^Y|RW=S8@uxz%&vHIujw zOLyVB87Sl*118OdUA5u6KjD4<3Ee&n{`oEDQ$GfeoW$Jfarm2WfdhZwzMG{7@$sZ$gp4NAQ7$rD>3(I@taK=+5h*vws8rdIL71`1BxAeChElM()DluA@n1qOV!esrTY*mN|P*7iR704g-4}A zeqM6$-||=Z@A#|yKlp3>_xyGK27i-}Nlf~I^r&=1N`Y=lL3Ak%v7-#UJ&R?-7t3XN zEFU&U3mdItdU$0v4ya!EGnsAQH-F&isocIIGC=3-^=tUSyMTjfXJ zD_DS4vLL*W5UXZk7GX7@bR8^YspORG(lKJj&G1W(k;?$(m}~56-$1;QVK}rQl<1q z=|kypHig|QJth4}`l0lg^cCqR($mt zeUmk@xvY`RXLH!qY!lneM%k^5qHSMcKL&R_$t$I|rT>!tEPW*XRr-r`TKZV}M0$s% zWau%2FmsCDnNd3z)M{iMXloI>j%{N{DLN`}lIcjql)J=C|^H z=7%w+@9_6A?)B0{X__=5Ee4)HkRC^`ej+_Dy&?Sp@xdHTzDB39Xv#D`O;A&1Bt?H+r`9$Wm943d| z;dFQ$LB|ZoLdR`R$(iQNcNRJgPP5bItZ?=^7de-^O5OLmf8hR+`^WB|x}S6Z(xdgP z_UgRTz3&9wUr5n0M2G1w7km~1ohPt)Y%#l@-3yNSIeUryj-6nCWFNE7cnu%qs}$PY z%fHWm#oy-dVT2NC^C&pt3Gl^p(yP)*4b!B7Hie*#OXG>trU$f{3fjzy(8<9 zwlZ6}t;W`An{JzHTVvZ{J7Bw2(B@vyrqEtwFR|MNZNm0OL7R2#l|{)m|TA49Px7(4Z;djHldZxu22 zhxoTAfB)9Tw;n$E+dt&JHIK2A&!9Yg^2aAXIeGfz$0z@SPk%c3&dF0JkDSz>%sZKV z@}84-ot$xU%E`tPPo4Pj3HYNYZbrHH#O)_Go)|eX?L_E}$~Q{iu)b0JhUtwA#$Nx| z*EjtB`0uyh!REtp3oir_;)wT-6#*CJT28o3lY^6f6x<0rDNcW z*QD3gUci%lMS4}K@rrapI)%uH@+W~d@*lyZ59Jbvy^GHuKo@-^eJoUej>ZNV3~B^L z5O-plH#Ki--qYYY^-uFQ;3(>!=1ukfVs{!)lFG&ZG!I_{{@>Y+BpZ>a?_;`KQwPmS zn)d*7YZ>(KhtRyMp+TRNbkM?ohF<;=Xj=_z#;Q^ zCcB)Q*lJ$HuHeON4Sex++{QL?2fGIIuWPwi)2wM@+js@L4s+w}JjizNDjs4t@M?A= zuVFjEW4m~S?cohHFe25>xH~9(X>OaK_&@+fn{ET1Cp5>d^^L!ioE&mex4}LRyjr}J) zm6KS_IRUTaK0eHT#kaE#_945T``DelkNq5xfamyT_6yAJkMrx;zrt&}64B5H`3U;~ zU&bEitEElSHt9y`rj$m-CVc|?^s%&A+Ai&qK9$Z$XQgve6dF>31xeFnXtH2O3>u@R zNLnkclh#YuNY_eRq#e=?h#zU-Tc)tJyo9airECMYYq~U(*iF2a?M9s9OT3=#<&EqB zZ)0EP?d%}$U=PDb`WLKYeUD$pj_~E|hkOM)#;;&c@HOl={3iA?e$SVAAvp{~6J`Vp(bJ@bmql^da_DPp_9p;PhK?(p+?!cWUVDCPxad%Ij;~KH= zv+wI$w$I*eU$uDI;S{&H;)~_`Myl+G+3=jp@$ZZ|j>8=zmiX=Rk&z~}lS1v_5metd zf)-XQE#N9ZRp(JDH85a5tnm!ZnKtL}jxNjLj;;}l!(pFv`01fJhoA1UI7UWLD=m&G zFy4B3k%DtNa84`7_Zf04!*dRISPrw1efy}*;W;kH;T`+-S@xkH%IBl(=?egyT?pt< z0H6fg03{|JP0J29@GSVv!Gr3a(hZjwsbC^>P4rB1)F)xHZ+YGIn zGZsPI^KGo5rJ=N;Y(qJSavXj(V@s6(4s#=4#_#2Cf?qa(6JCJK^=sB?UQO|(Y)*M9 zHITX^^}{rC+M=|((+ktrrazqiR>qu+7cz@7_h-JB)s%H2JD9yB`{C@5bDTN%<($dw z%srY{p0^?IwR~s(=KLcCo`M|(FKaWjdaYd>&^Bnhv_snY+Ev<7?GEjJ?VZ~DwTHD& zYMsy(IsNPDg@r*LQCyM?E9OqZi8(v|5#x)xopZb&y@w@Npv+o9X9yHj_+?y&Aj z-ErN^x)Zt&bZ7J_dcA&&evkf;{$BmV`lI@1^)KpQ*T1VjZJ2LZWf(Q=Fzh$nX}I5T z*zly`xZ!1^-54-77`u!^#`(ro#!=%g<3Zz##@CJS8c&;;DaTY~Dl>&lEv8=64AUah z8q;ReF4IBN-KGakM@&zfo;ST}dbem@(edJ%;*R3M;yK03iq{o?P<+OmVlFV3m;>ep zbC-F@Jm0*^JZj!y-fuo*NwE}IN-RE0jitjfXqjVKW?5(1V%cLkWVzS!u;r-bS<8!- z*Ddc_PM54Id9LK8k~d4am8cZPtExgiEYzt=Cz1TW_`AV|~c_nDrT( z**4#H%=Vn^CEJ^}_iUe*N~L+F=2A~-xU{XbzjRjVlG3%M+e-J9-d=iN>Gw*XviI80 zI?^144x6LgQRnD%OmWP0yy$q{@vh^vlR0yoMb0v3$k_tlcm}-VHO|e>UCu+U0#}L4 z=c;jaxCUKwT+3YRTw7dwTqj%~xXzTNlogbfl=;eP$~wvh%kC>XS=LOGep0_<8 zd!pVfuhHxA?)R1WcKQzZ?(#k0d(`)oKj3fhcln3>^Zjf5oBg}|2mN>ZAM_vbKka|M zyuW-_`I7Rr<=2((F2A+>p7MvvA1i;R{Dtz@%HJ;kxI9{sRbi}fRs<`WD!MDCR~!r2 z1A#z8peryGm>*ab7!B+Q><`=-xIb_>@MPe4;N`%Hzz2adl_`}4l_iyTRh|t7gS&&L zs%BNaTy>)AgV5U0{h`C5Cqu_WFNaQqJ_wzuPN^=aE~(y9y{r0Q_1)DERv)Q;y88L* zSF2A|e^h-goDtTC?cqSUA>13D5ndEt6W$!&6Je2zh(2PE1R@QQuE8zPvlVK z-pIp|qmkp0muvEB%r(br3u^~!@2bnFn^SkV-dI0a|4Ktk!~TY2jTwyvjYW<2MqlH? z#ubfg8;>@A+|UY+77kd)An%Nvu&@pz1w!WJ)^y#y{x^VeXxB- z`@;5J?RT~xYk$4{OozT>wBzND4=1n*<_R?u=1({<;i=9*=fcj{CeEGsW>-Vk^ONRJ zI^Dgfdv*6{_qOgm-M4n%-TgrK;qGJI&vw7i{c87H-5+#++QWLXdh|WE9$!zmr=_R6 zXQ*dx&$6DiJ)3(T?RlkF-@C5&(LUBUqi<*5r~Uo?Yx)oLKidC#|J(f^^`9L`8OR$b z8gLE-2I>Yn2KonP3@jX2HLz}A^T3XQmj=rQmkd5S7@gcS`Ps>*r<6>YGiBG5ho*cq z)j4(1)CZ=%H&isVZs@_GSBK6_YnZlX+Tm%hOb<@qJ^jUDv|Hb)l z%|E>$Z9&n3@&!{CELpH~!SMwzEqHSwTj*RkxNy_L?=5`sGV^8AFI#xo=w;6?YFV^% z(VL5%i+dMuTm0sdyd}XUw=ZQ&ZA*KXu3CEQ()*VlT~@d(ysUrO>Sa5Z9bWd_viFut z%WIY|TK@3z*H+k9%wMr?#g-MjR_tGKc*V;r-dyqSijP;ETbZ}AXr+CnZ)MZUu9Z_( z&RMx+<(ie7R_<82Z{?wt-&^_g%GXwYu*$ruVb!)(kFEOUsy8n;Ufy!~!ppC_{K)0+ zt}a;JuzJ<%J6Auo`otA^R|Kw@e#M3>4qfrs6|Y_K=^Edfp*7d7xqrT4gk_Lb{=*R8m2_jO0F zPr1JQ`h(Y>*iyb_^_Ca5+PCi8dUWgAZFSoo+@7<&fBTN@`?ue@{r>HTw?Dc4`1Y5# zpVI}h!=cjv=9kM4YS=ZiaE-}&y&(>JEvxZ%caH}1Rf z_8afJ@q0HOyYaajU%K(l8{fO}(_Qm-t=cuZYsaqryYAd||E|Nkp4@eO*ULBAZwlPh za8uV!LpRO8Y1K`mH|@A-|4nz_^x#dWceC9&yNh<0?GEj3+1!WJ_uakk z!F@;eJ-zSweXs62weO>S=WfopS%0(r=D^K&-Td**(fwKbjr*PZgZrEIckiFRf8qYs z`#0_1x&OfayY@e@|Iz(V?f>QeSN6ZP|HE6lZ`pIpsROqjc>BxxFE9G?@q+{|bSt}6f2;4-mRq}S-FE9QZ%er?eB1onw%zvZZSUT8_K@??j6-V<9X<5HSIfV; z@T*6@`tj{kZeM--t+yY$Bj=7;ckI05p*!BZ)&8rVv#G_px^@K2Qmt4OS%ZA1Y`1dv!t+sH9IDIr6zu<;n4i`}Ki?=qCT#}S9* zr;j1tBiBJg1&<>Z$xnx>bq=jV=hZs2>AEWJ%ICUv?keRo_?c+NPp{&`YbzUqDOHVY zf}x*Q2c<*j*YFv?jxOT&{yO^Es%6Vo@$Q8qBMX5Zlg6U>CnOyJ{#x`$K{k(&%}c;O zhX6T*y;4I<0Bx*0IV?|fhr*_Gca&vUk)uwia&M4(U3om8n_THGT}0>NmzxT#c`11% z1*V_A9@+HUJ-@w<=M2@Xt*gJXW@z3c(t-0>T*FkJ4J)|m5N&lM+NHdE9Bp-kj7~zw*^+nuF7!Ro-QZNvkD&K=-^ED*6ahTS+SXAyQ;gx%waj}s+{rrH?& zj56Ko6}oAMzkmCK71K8M{qWn%u2{1)A|1HzzG+*A%NK6EcJtaOVm_b=#+Sc?_hutX zajCJ*rnhFxG@sX63Tj2 z#=Z_??^gRcZtNZOE{8hyd7@7a^vNiCY(*~};;mNnm^eAc4>sunhNyMbMzji3gl25$ zbT);2`5nd0!9Y)>WckvPaKV;S&b3_=)=gLVBF|(i=q<9zoROb*%Vp6Mj!MBCVvM9N zF-Cotq?0;E$3U*w$YcUf8ZF`zOs8L@5jx7!Uj*I}Xs(FXg@0YcqdaqTH2N6`7X6&3 zpWncp(KqGsVZXq8HK5w1ctb-p(-6%>n`jHI2<3tNi?P%E9z3tblva5@ovNoN$eW_( z1V4bET!mMLHtgK+GzrY7&Wsh{neQw^}x!d zh0d#YrDI*f>#}JKV3-}7DpJZvcU-ASNt04)*VnDDNs&@hHCKQZPi@)4JHbK~rn>rC z(^rW$Up3X%*O{WfjrFG${n7o6u~J4tHQcIkQP?Pv+f$&LXoQZzTFQ2ZXbIedoR~-; z%?asio}ZYKl6{qO0jdXYj$B>OOMvXUn`<`IN8iG@la1H_J)wiuitAxT?WzbVLm)W+@plgrB|ukP@+ z1&ZcPnKG{^(3Vp*vTbPU)>*;etgTarwvALRceanzuid(JZT(2Q6TOq|gb(z~gHF1% z)>NhH7^H$J4nYpILB7D2w75axI$?Fm+!|cEuxxLKU$2|j>G4dQSG#KTHwSxrFOv@F zLz5fphH8sH;*+mwt3qarpw&$50k{ioh7jvihQ?03XHQ^8BLR%Wj89+ zfowDExXTq-8KIlXNjHH`kvP>jsZozNs7WMhx=<4J4}xgk7yITakzMh41P_;TXaPkzuXfF?Y-q~2xQ%m*syrq~ z)3i|IYEQGhtGuc~YxU?ytRa`)-a5O!^ZKf9I{ZP8zQjCLj0H=>iQ zj1?q*XjJD4*=*r5{Z-Bh^BNoHO>jZg?5XVw=yZX;TE02@m1*mH9gg1h(}2s^IrOmv zxa6{qOX4z4{V2$x(=?I6acq1TIB`aqm@Vpi)24V-kkOL{u^nm1NAwT{;E@p=Ty>SArMD z_+Q0Vy@QRBrz)^Eh1WD@6lA1i8?uL%4`my(Q!?^18n4=Va9T!wT1t9;#?)KTtH)|r z)zn;G!~3I;MJ}(!2i^~TKF2fQ!T-?*#dzm}#sy-$Z<;`ARkAgV-?QMX6!WyvqmPd0n5Tp4|%uEaC7-(f2;uT9ez+tJrP=$=gJ8R%apGH8<} zuQ1+M#iLU@UqH-Pkid z_EpHxB0>-|0B~B;`!;Gy`#izku-Vl#=yy&k)nv`vXpR`GJHrh%4bn4@O}98*6XrLz zFYPL`+rnE+g)?XLPZxfMxd`;H08a0N{(4X% zPJhK2SFutwpE@9gME}AB`X{R341AL+=${95Tqx*Yh#nLPT9fgY>7Ri+IsQRCwF&yi z`sc-bF^S{qYlGmvv6w`kAP%bAUT3>7y(MB4h%F1p}c-JQy*jMvrGqZn4)}yslYQkvW}i-d7z7bY=+D zoo%xsPW{AQownCxb9G*Jd2?rb8+3;Sx@WHR0{C~jR^@YsTq9843_5#yeT%`JVEawzMxYyyXvRn1(*4olqLrRX%X06Ik(M=4LcUGFx zQ)lK?nEh?##jD)K~5n-GAFxDRkd7KlY<2dD~IA`iu zCu{yRCA>%@Oe#*E;*f4v0=0^YBb~05`BUra+n7>15SiM$vCMC;F5L({cA2$u`NHV) z+}#>3wMD-J25JF@zm%TE{4yUi7e$7YxPdy#iF2(qJfW$8R&{zXCS*ns&xBy#SnBhY zqKs_ZC`~A{THS7|wQN?@fa-|Xv+H7dz4PA?@>HmaMLkpmO{J-ksNfA zqExaoDu+uH<(-H^|7d}`rNZLPGiDjG9i}Fm-)}4R`}zCl&v`qmEg7k^G^v#p()<`^ zkU@+K(hr_VjHxIg6cwX!bRJFiH)>K`UrGT{p+#^)srwCoF0a83>)ra{be zUX&-|NCLr7$_ATwn5Ja%goacvb%q>!3OvWW6T!*p3PsP!LzBguCA@EuC7%$6t2!it#B-yPF(v(M*0Uv zMhK_Au{J3aI3@XXiak;pMsc52fHIebKr0kf!(23Z$`orT$Iz-y#Ovg_y38Wv-N`-$ zv5j3Y3-wU8&L$W(g`_%dt|T9-hu6IVa28M-6j1?joIVsB%f|# zS&4ai+@(WbE5_RR`+`^OY2)L`J_1dSAb8I8skw| zMI~^6e2oA(sA`NSpsd2hxaAo5L&pL_^TyaAD2d1#*(wDiic*@?0M8W11dq>CX!Gcb z!rtOV!;$H>T63+{?b4RG^~GU-adD_O7+G4j(`iK6 zP>`3NX>wLO?e+d5FJzGE(Vw|Eo1zH*lfwGr=&Q-7<9MYCH=p4{%;^WK}4mO3*%+gvrl2YkAK&mZ{v ziTZDx^&Kb9>UbwR2Erg{fg43PY2`RmtRx&|xqvBaV_4b{^B4+GE3?enu8n0rdv(c1 zOe*cL zAuA2r6gp&dugra*HG#Vc-QeQLfy^4)cYm76Ri4zbkt|?3M z`LKj!K8_)z&X`?s6;y21J555ErD(J{BRd_Dq0ElUCuAaWl%A8`yk_g(#*94N=VdhP zLa$uiWo6y2vDh_g_@ir**W2wn1wO#~0sjs9Sgfv1a1txd)E z2<@|?h!MEen?Uz;Q$hzGx^+u^wkbO$Q=eIN%~$T;(vnl0OX07Y&78fzKwqK9{|nCi zb+IvEFjSZp3)`JDRwwwuikX7Kh)P&S#aYp{DnP+GVPcXC)|Al$Z6QPLJSkw5r=h7t zeS5kt(_593`O~Xs0t28eW305c#?|N-xW_1VO>qc;BdbC0$=#fpQAh4`1Ex zSL^4-;A1|@5sBB=#o(e}SHl5;C_#SPIDbSj4D#@`%-HEGq9oM=;CVX)HZbrfejBC>N*^_J3n zg8?c_8at2qOFsIV248VYObd+5A5x8gq9@dd2|4U}VikeXb>urNX`)MVSeKkkTJw-s zvM4Nc3{=Zg+)@MT>4YKXT9IUwYH-w|yA<>lMw#zRDGHh*QgQV9r-!fOJ^ZK9&);~1 zr}9u_S?Ka_E_vu7IV}WoiuG47<>-J9XfB zXg5RAN2M2qe~!H>)E|+LlTiPQi^G9mVtvv_qJ8M2L^$aq`MqOFaMCYweVzm-y2x-% z3_gZk{G$IdT*ti$c#__c;pwsZqQ9g!1zb9>!X=-E^pRZOt-|@o32?6pmr^yPkL3D( z6%KlmK9J!RF*xBFryJ=b&_U<};0yaRJmwK=DK54mCLxNCr)mQiX#-b+HZT*wOaVNI z3}k>}ie%Ioa|xkO1Lvm*xuAqL*+n&DRI*pRMhqTGf}05r!ov~7Zs!AtzM9w#u@O{!aCHO~hf@V8E~y%&QP+zpwj1&}eg^@tr)_LPVq!yl=|41}MGe#SGO=%Hk) zfdNXZ>fwJ{vLtHa$f)9fs!LssKkEP3S@i08K^Mx;fSSRE%P-?=i0#J;a5Xf{A zvWPZmO-L3kWM_4k6lCi&N`z(2H56ytC@Ia?6c;3u$6lOCd`@%g&jnqvN{n&%0(&3{ zK0M}-kW+^K!Nfw37_euO;IwG}J5fJh)c>3vla4v{!6Wbj#`4lo-6VXIZuGY&LzT$&*l2( zV{nWU^2uUwjMGp;`^3+pKJ=Z^4)ji9eO;{n*kBUeqQFHyn7|Vm6JkCA4nV&ygeUqV z8xra#`Xd{JoXYK-Pw+=JXh=>49QHf0eUekT{#X*6OKHf*6n+p-n zx+$jVePoG!3Hcgop7t?3XJI}V$G=*=V|oijFDsva|VStBo?z zmiD%_PAYX!w%^L$j<%hCO6%*Y>8;qh*3)U>mzA&W8bY>T{nXH$z($dg)-*kYZb25S zK@`gO(<6F4Ge!+1-m03p#Pk4)1Isbf^cN}n583U)S)uGd+RY$m1Qd%qS_~B#?W(il zK>8v=;?3~oooUrov##yu--@1n{dJ_J4)k6#qw1OsE6U22Z{+>cuASx=$=v0`Tc%yN zfxmPm;TuMN!}XdhXuA;hLn~@~-00b8IBjyY5()}9(fG(Iaz@adR);9wjeJ08d3QV) zP-IXN?bDC|7+cU(sNaTR@Ob%fEFBQ3fxI?5zoDu!9Lolz0T^g;xiZs65)&(>NAk*y z!MfbQuGusUu_VmW^pcWXBdym!-sOIg+}#HN=_^@IFNA-V1Sk0t^))g1lIxQmliP{u zfiUzE=oW*+A0m06d{mFfNA=*enz=E0DpNUi{M9UMh2mvI;4;~BCFN~`@-D;G3WZK9 zqh3LD3Q1Ps4oRz6L5`*R$!iAbV&OO*PW9-L2SMX0ZeQNxiBYzscCgy(N^oMQBn-p$ zvKGB2GUxiic&_E@Y0XC1=9oF=sfoi8*WXP-PtYPM(K~oCIP8N0haEt^Cg>;X!w$5` z^+DG}xGoVc>?zfUJ*9Sp9*R9TnDm@Qc~0b83cM&&n((rU_go17;^J`N8>{c7yiMRM z+QB?mue9Sxf*ay+f@9N^~N9J3? z{lV4+)^;o*l!vrfea^T(ucfkg@+kjCs+?tjP9GQ z{#kRQS3?fX5Q+>zf0G!mT%4ys@@Yog0J)-|rwli7_!|Q5NP-*U^>G?-LVaBvK9~fz zC~%Q8D&AWp#{DziBig?Z{`n=~UnIdv{^fSgC&9@N5ODYbiS3ggAlDyDf|EXy>+>Y| zXdIrI1Xt^4Ujm++1iw4pjx`DXOdMW%3Ap1Da914eqa56LJGwX=xw&FqA@?ht;Na&W z=t0Wa4dT3|qnFs(fR&Ejd+QQ4ZOH)hn$YO!CK{M)r~Vx_Jy64!l|#xkoRLsQnfcCy^h z)6x+Q&IH9tB1%7%@V%<-OQ~C>3C>Vr-bE=oL2f%GYmt%1WK}kp@^%_zC{wbsl3=ez zQUO^_>8|YjuIgC6ay)}M;)-OZX>72LwRKt1r($`_{Hnx!X31PeRuZyCvT#Jm$ghNq zB+5b}JW+Ozh_M#+VIx(ZKO%f(xgAwTd_)`Yj9fp)Gw?7qx#GRh4#G!2C}i_O_~-oM z@Gp|!B!i+I$e^e%=i!R>X*r7K>Sw9_aq!PC0skTiPVI|!FeguJhvq6WToZ$1&WHTp zI9!Lbht&6yZz0!DkJSeQeJ>+4u1-{yaIpN9$~Z4KaAG}aM-3qIN>AeWA3ED zfe&(m<8U3$Cn6t3iFv};wBQUSg=@#f+SQEJSe8ERs-yrj1)VKo?|~e2mIG;7VB{i5 zWhSo0@KfEf-JrCqP$%cJRlrNdB$O8}U32A<$lkq8cVNHcXy1{^lf@p#r<(sm3dwsO zd3}8fjsz0;QcQ|`>H_G__)gGq(FoP2eggGqbugvk3G|l3!lY1+7ven$duQrnduK*h zjoUo4%1|}Av3{tgc+VfNX$@iXjKu07D_6iiry<}N-?^bgt5iu>lWbzE`bc&Y3G@(h z`15j_5bZs(3sFZRJ$Y=Ll7wQZACP!BcMf5T)Bh!HPG{%5?C6c|HNEYt`u*jDm$$dC z=*J1M{HgT0(?SC!T(@B9viZEh6$sAWHg)Q@IaO7&w@%K`Wi7wb4K^UY5&7CUAIL)^ z4}SU-XBk}#e&!PJvq|t{@pjH#9Ii=8g5MjjA5DTk8-rsTVIn@K;_!?lcpQICP8{x| zJoI>d9hVaNrM8n6uYVe6GOG3IJo6YGK1qOk65wBGisSA365z)*;W(Vm36gGun&@%Mz1;OhIsaX7s{Mpv&)*Vy~P!!=_eoZ|Tz zBDhU#%>{C=uIe_BwQ5K(!ixDqOqQ0^Dnue<16UaCLlxvh6*P$HUp~^1)1d%jo3D>D zvTYHl0y$-?9x3^h0DD2+zA|r-_hicfK_$oH{&=4Lx(hP-E6XifV}V&4F_t&v8O=Fa za$^52@yvb8g^B(7b!MYJw=S$4Q-eD4e7;7R&mV&pz?@l-%nFjxOxgib%Jck2aYwuDI>en7 zcN1|JCt?tX$K`R2NGlY{g`_uq9_Sp2S;RZTOjk;_68rtSSI&(u4LU6bsRDHJMiO$T*LE!u$5 zlpE$LW=~ald6lbeHZsCHx((XNCR?>D;F~&O>g)n}N5w$P#LiYB7k=blV_yOI*iQOK zW2BQ6p_jyd10gR0E}c>4NEgD-UK|cRAkWR@`o#Bg`;r33-T`Sjtg43+Rq$T=-5`2z z1?(dB6rjEg*YSt~A54N<2oAZScB+xjnv2QTT5yOBqb4#&y~G1vre?LOHdCpg&d~6f z!W431ARPyA48}yuyn+>6Xq1*LXk|)HEBDjF1(|_7`PhPb9g@#t=|{>;&PyBD#Y)Cz zY%wVEmlo1)gU7oUXJ{}Uzangf3@?wvfoGh~WGiCpY81etyxEZ04}w$RRUd6!-ev_cUknL{zPks6;5nYJi%cBo4~X#tayrD8EvRZ!+i} zqf3!<)B%J%ah)(0iOJi_8Yp?@M-#VI^z>{ze3*Yt?5sG!wPI(*kENQr)ZyXg7SRt5 ztbax0!z)FL0Q%cxnRtj0_j+pxOlZSp`n?D@1Z8G$Qu^GqzBQU5nF{W~$d2v$gH9fysKLmw_r0*CQu zji@e?x=tymf;~J)m8Seu%*C;Xh8GIHxC1SvOJ~_GMNS;Fj|Jm{*)GP%fRksb&v>6C z;e9#CxKV8DxIU|474<|A)Wx{aNh&$GW?+Sd(m`mwLOyqeP7RUghU&hSjVV9a_P~#} zZW{o)r%qv8%S$8I5|2;B+Ot8k8o2od&Ywf(>x68d=JmqQ5OAy|;~fh8Yw#PC`usf3 z)}=M$zA*<545dEG^$qNZQs2kUB*1kt9Mtl0jb^h_-z!CtQSqwaUHQ3ctR>eaJZGWj zKrRPgrrmgCh#9biR8LecXlPgcT+jKsVoG_CQ>J=hPWgreG?xu}8!q05w zVqMu#Z+JF8Gc`ReKig_(3%9n8cJb98)2^M=)c%e~JPSR%_H+MbGF^PMe+T_3Cptn$ z9+vwLq(2~@fJq~sIKu-MgTt3dgp+QT>z|9kL0|avF*tZg_7lNFXrE+X)YnMy`q0@4 z^>sMES;liP32sr^nFwBdM>>Yz#mFQ)(b^ZHKKY^N1pdHJ_)dsuVZ1MdpTT*;7lWTo zf>XcbcFtWK4&N!U9kN|={b&-L=qccutV_Ui;&30wUY&S-T^vsRf-Y6sNmJpHUidpMnv{2Peg&G9Ge@ zkZ%^>r&C0LBH2q~xbZ;dV{6YDs97YuB@cL=)?4NEW1M6bTRv7-k3APGAOFHuS=W{4 zC=Jw2%;Pq*m3ASyyRE@s7{|V1XVT>6s^A*iNN=sT);hPh#>*x9>^jx!T<}Jy8eoZ-9mhsO!|qs;NpHB>@ora4cq7h91f>%R+c?@?Lw& z3iF6{YC5lumb~;vCFmYo7^5JZ$PrLhsSD*@Wv$$pUC`ilRmAq2(I|&2ZLZAp>0)~s zHm^(eJhw4eo8wqIA-4C7`lwH}iq&aZAD}PfLt)M(^jutyli;7m<$(H5zKp1^NtC}_ z;Va4QsCvRjw2Idkax7>VBKgLQHR1G`apyKDlMFGZD1~=Rz71`}E(T}OQeuVR9NOts zEjY&nLS14lTCotC1m1csyFiy&F}cYZ+qq||XfAU(Em}S14-uok(Hq;rw^`>XF=nKA za3~AW&xJjF;mIw50&S#NiRAFFDNIB*6}tTzp)0Cnn&Q`BNXNQh3$Ql~x<$Y>2G~xa z+mq|VZKS^#}3(3*l## z{NoGYz$;eYOMA-je$kG`h~F)teiWg9iEu-_KK7sqTPN3-;&5M5eI3Ecze0>-g7iG} z!m^m|Q5Zq>6~;vd6O(!<4oHV8$ib{*5H|VqF(548$?QW@P`D8Bi6;d&Y$>thi70gk zLK#dU@l%8odu2=NrqxwWsxq1F<`RFkzr+-n;4klXmPf*lvJ!vDUs7x>c9(@~H}FqF zQyWXo6%D2Ch~Hz>mlPGd>%5M}@}gqnRIkTeWH%Q%DxIa3{tBBj&^sww0vgKu+s=cw z$lk%2)^L}gtsZeJ?0bvDjrb)UqPZS4PlOxT2?g#;g6rb&LB1rR9g70jz+afF>58|X zg81V;v@iCz37!cHp7|8NFG26U5Ps$o@Uuy9@+0JS&RrZ1KO(Vx;&HitRNlLxyqEkY z0Y}_7u|D|)GCU&z{=SMo{Eo!>tpwuN(VtV8E(G>+!=@a zXwOx=9UX_?9jB*?e;UQgaQ(^oVG$hy^A((pnf^Qk!IaizEZi`b$keHfnMK>}q8z3t{r=}>2)_GDwgp!u6m0goK7wsT^lGx6(akvzR z2l=}~Hsty`em}#n5-aZ|*^uFB@%q@mDB`6up63)eqFnqwfq%Wg{|tV4hw#4u4ttge zCwxSGjTD2!{$k%@9InIf@qqL!1YP;D^q+`j)~Z~rIK!%iQn!OWLB1|hp;EB_D}Z@6 zi6fm-1T+yDqYM%)#4&(t2z*ReTBwrOtZ@>Ua0+b_)@PHm7L6txcP4U3X@fp8NO@s> z3+I+bTYZPl5m?_mXm6fTQ#sUzQ&0PmHfqWXIS-UxX9|}@%DU}eE}cGaIJX$T)6hS` zQR~)AnJo`&Y+2stqhn-iW;B-;TO(5(y|ryxTYitO!rVtRR?aKHJf6-gm>ttdN>;ck zuu8N=C5EyWR^AOm2W+c*_+uHTbi$Ec_Tq2^!G$MFnQCpcJT1&{`ja>c#X8AT)gQ6Y z!BVbPs}w(i;2F)X$0irqV@D8}i>BPKo6d`71>+h&^GQjHQpYth=BU9M zlziqB9h*k!pz?-4iuuatbJN^TK7ypaCYD4XPDoSJ3zXGZcPej4@5B#Klz81ZmTOvz z)73hyGCaAaWNBR_*phM5sh`lT*Y=pLaJ^dycW3)-XM1PI1mel6u?YVVxI5t9#n0Ou zw|`ubN3}Bw@xhb$*>?!2eBP$IGDass`DKO_yw@)FWX5J=MjUVpt3v0)cyVa9JRo9q zY_qG+-r68(%#*yq{@M}@g3sG-P03hz?fQyE{-0Yz#l>MPkJ$^G`;5AV&|tCM)iJjL zi(jr1Yh^Th;qnr5)M9-R3uL}VSMLzS4#*+$DDB3%R+Z{5&2d|^m7Gjf>eS6gp~5KJ$o9K%y1%yaFWBh;L-IRF2O@FUAIvV~QF-{Yu%tB;4oN2@v>F zo~;^9(mIQ|9Y%%6Eos;vG3$vwryKC4x~tvPoH=%>2R@GIBrZioq}k9*#oCD z;j?jwn9?ET3??;0NOcn*#}lM|Qh=|_B*Y3Fy~uzi5=W%ad8pW_Ry}13&!0Rw`j;jA zm)M+Ew*=#W)eA26zw&>g@j;FoY#ZQ&!yx63De%t~xC8KM3GgozIL4XJrW`b-{`sW( z$bFOH$bD1W@1R^2rT$nF964x8eN9q3aeOqnN%gOa*H4eZVgJScU8NlzJ0|!GdG&&} z4*WvarD&^Ui>f}k>are#@hK8c038qicM=|(qs2N-(mqg^G8!W#rE2zQORk|Pdv$Dh zjA7)OC_6w6*aDu3aZzlOl*aEA<0L){KNg=wtXQ6NUI;&<%tbGRpG|_3A1k+W?&5Ix znThRVj;GX*Cc)v4$#59P#QN|96?jGxocwU{Uc}^M^^sdaaS8>l<5(Y!^-#$rWmr)zE6eo_i3G7ftSbOl+YoCZ_qH0GeW62B1a%T1bwX3Ii#RZso_k)@r3rcEKpp0xjd=!3ZkBw+<#-S0 z!r5pIc|61iir)Y^xJ&&k#s{Av2WL4nTdba-n}DNV7l%tpaIE)JyP$7v5}d|ghUX-~ zNe<-qMw8$qPcr-*!J#k^Uu5{TXAt@tZRdg4Ei*M z)(%B|id*hf)(&r^=kPbkQxcxDPR^(V^}5BD7(N?V4*oI zSqfM$9doNJMA|vx0$OF6kY@~TtgG8N$Zrcqzs@V13!S_XKW+kC$>+#ceGC3e@;T6M z34DvS$i2-*SY;A^@B65neWlF)RNJb0_DYRJDQQOYBqcFllNN$4tQiqYS_rl&$E#-o z`FtQ9f-KR2`^T^hjh`tJwHo4goywDnTwyB~N6wv2PpAFKK}+Oqi7Y(XbH(?HgGRGS z?7l(0`bZw9yL}zimfGULRC|eQQeKX~p~zb5dAFhy{obq4F_606DJq> zA{N`^a!YyM>cR$(y~X^4V1uF1JzQzRPX?K)%;q|exh#18l}wk}?y*)+^g8P*-C9qt z)7cy_54PLuDt$WtWP91{NZW>p-a@~rx0*Ww3p#`SHCA`~jH==$)7{bO6Fb(- zA1aG9ms>lkA|;XDK>6&Eg<&am3Ftv<0{;%&s?^*ECGxJ~79b08!Fh5PadsSnj>r{~ zM=h3`OX2w(4|GpDVx~5wDLp2i$D|+jy+P&Ivz|(4N_Ah7* z4%XS4YZ?bIfecPr<-F7Ck5m@>O7dsqTRcWzrNh!w7BE({`|5i2DfvU~fv&3J8d9s^ zze3Rc9gKA*^5o;O4P}<4_D($u=Luxna6Cyr(?FA|6bNf9xJuI~no`kBpa55b>nN&2 zsj%`%H!g##)=`TTod`~0kWzBYd82&k(3%!XsraU~T3^k|%Cc&{It_u$Io^0(6 z)lKTCEiJd!>-db1a`oO~e_x&5-8L;S`Eu9o7Jo-mV;jyb=S_?6%E~UP9*ERTZ?M+F zL6KMhyz+Y?&p}mslr%vVW7SiB0y>pL6%swkHAbH?C!wrC`S?RQB1Zgd<2s6qL4UPf zuv>u^O0maU>#MH`Sz0Wa?T5AXR$HyFSSlHC`6pFd>~($qsu}I>@=0^6n})4}ZOx4h z4&Tf{{yl@GsD5sz%U4w09}Z2fv$+R14K3I;!&i>ew!zMHM#C0h68}Akae6@2Ot3b< zS`N39+(+6p^>mg!lFnTZrWpMl!RT-JcN-@8v?*85yk*C=9gDjsZN2f(0^&o;C6M)C zE>!zOl@pcey-K-ulCyU5#A0KejgRswdp5>84}3=}?eee8P`KYAM*k?QfgO}XFIeA_ zU>)jX#)5W9Q&frkGucka!5aLsn)16HLFqtOb+Ea}-(a_SzhSmiSGvP`SMVL3-EVS7 ztdSmn#iVL;eo<+@(Pt|xZ5RqwO>K01KhzkmG`p=uxyF{;%yqW%`pWX6GK=X2TeZ)g zlVa|T(5Bzw%64y2g}XF6C8yLEw!7P5M}i&1OBA2_&4s+Au#QR*g}FeHCy0B%PcdGS zV^bp!q0A9~fu^VTF73LT7Te80tHIOA13#zVK zVdGr)Z6X7=QDVZnA*qg21c$$XzW-m^w!nnT`@G>AcbmDR^0En)eUTFUK5Y=T?O=3a zf^7>S5U$!b_O22&U+VIH zZ=~7-U#f!mt)|4@G!!y7;dfc4Ppq9grQ1=}RBmmrswoL~S9p5+rUYWX)PwM)1~HkA z|CW&AO98hhU+At2dEq$0ZyGxSzo|p`P2I5>k>WRr zo{(_R7Rdi~H|f!PN(M^IwdSL9@4tU4|5|i|&|gJk4?<2m;3viDs`yE9x|RyMVpavD z39pz-L`S@2GD8wwDJ$!L;vDr`{1aQ6I<$o@K4HndSy@Hl!J4|^Mq6DOtJMdgKvJ}IyHz`h|pblIuBpVRd5n8eVrPMq!py0Jjm`$-)PSzA+MdX9h z4r|85NO@Du+@grx(cmxEluUDvEOFHLm)DQ9IreOc^p<_%EMGi*VoOKIb9#fRZq5Xk z_sSLjA8lU(7->=E-}QBOI+=7j>GXZy_mQMK>CWA`Cz&%d$=vr0Gk`K2LqLHM7L)~C zQRI*T5!7Y9Ks?uDfE5KVc31IOMe$gVbue#^^1KEYk*FA9B<0bsb*ZQx(w~76-nbQeBY@k!a+9byY0sG~I<7*Q| ziM`s|#2zPUapp0qJBlA)k^cY6iu}aU>1cN$-Va%^dptLbO>}u9?Ypk49y_b703C>@ zAuBMBzvkoW2EY6cbZBC~X%=e}=Xw17xBTzw`tS?_g9U$m73Kd&{B^g^0ly7jhNhF9 zy300fzm@aX+G}pO>wt#0gIrb^A6f%{$nl5*&mZ&g`cFPy72Ln@ZR8tkg~?kU9yNC; z93-TODm!-U>MEIFFr5wtGZW!#HjEG9-c?(NXs28FnQOTY*_XkGn2b7P?7-{w&A*|m zyRXHU%LP-pE$d%r8H>ll!Nh3)x(nQ(CC7>VLP8c5RKFd#;|Vx#XBoW8;oEA@Y2SqQ zqKKQxaOzapCxGs` z+9h4b#;DR~DSP5X^?^I;Jr{Lv)I1BDEY;nnc^Km-L{@iCfJJawTbX+xMZdqTThgLB zA|F*be&Ph%_Krw48wn8|g-&pb^dX%2Ou>{Szgf|qp=(B(zp9!A$uksDA>n>JIl$bg2xd~1T4Cf3NGJ`4i_@1q$8U3I)~yt z$as+o7W3(RZ?N872{Lh<-GROmeh%~%5zs)1L=jRB0UbIy&+H}y=)r(ozc?AY6kVc` z3@oVc;P@o`1^aktXDKyF_{0O9TEd6eE6uF2At02pM{+*La)eZh5$|ncH)@{1IP1Z| zbdm$MMLNHqD7Lf6R^8=V$Anb5zQOXXnufLe^Cz( zZK5t-515~%uEPC>Nvg-4i2CBGH?Y&o>j9qwA9f$`iA$KGz_Xd~1RV9V2h_6!I8h+O zYv*Wwpt(~r0HQgAb%e^+&S4K|?nL$@0i(Zto&E-_x?s2ZIeQpOhM-v!r&+nL>@YYC zT{q+}y)^&L#XDkmzY_wN%9l|7KN`yGMfpV8VKXE?a3Xi(jk%Zaj@_|%2bHIJsu^Lo zqI_I}stf#0nujHnr|{Ei$kFz`orNy<0!H)MAEJkfYkjvq0>RHN3|8%BTEyuolwsP#l)debt{-rhF zq56OaKc9p>{eNk`&E6(K;t--7x1{EJ=3_TOzb6{60gU*vyyE`Y_quW+izSqExpHBP zC7iq766x}JyTev%xZCUNiomjtej006v1em)ls|#9Y#k zpvqC3#N*T^qL9d@g#$R4mkz@>D$~=I*@3>kf!U9r`-AJR|G~MzLr-6H(bI>5ypBw5 zlje{0It-vJuY;Q(D2$2Hvn4Y8bzae}^2>5nypG+q^Ozs!;|yF%(0n4B(aMp9i8ZqO ziQ~tgke;ZV30F`mUOP|otNMG?Pntgulcg5_5l1-Sny33fZae73-%>Fxpc;9^4Lr>2*EVD zGU=Qr*%xf9L~@xe-K9c{uBF)5y(N>QEiCn$MbU2+{}RWV)L-063jAYK3g3v6aEg?x zzYf0NqoEbIgkcfLus&rsNOq#4O*XBQCjoyOQL%KC0$rY2GLO z7Vi+R(v0VF8-u%R<3{PXFC$V^V?(_g|5Ck{h;7ralzOFxdJS^TLR!&X*WeyAYNz_E zWBaOo>>q&&+UaJ0#r|6Q3g(SfS#{NTcHmxyq$?K@zz6Y|Fzg*XW;xzkX}!>L?qG5K z2KIM{bHlDnE^!U#4##%vp!#}hA7vj$eXXhnFY7~~he$I+3`!|iMU+nyxxw(Af;lXP zJ_i($vMphWeD%~R!~UjIr<(S&r<(Q~-v565cIIC>&Pp3}38t(m$omnr0YT$PlY7M6zYPs{y7EyKm8|fmc+Na>_`3Urx89s}<(61!t#Yudld!B(R zc#M0ogo#o%*HM7Jn!>RmYaG;+Qd!=J*d1?)mM8oUV1=K~XB}mKB#;`O9ZqEvMw2r? zkt!VyPPzIckyvtgdN`Sj`)%owWZyPF+wP6|J!WIr?M?XIW>fgI)#J500=_`DlFN@e zIub6-KYKDh?D7Pi&Y;(y8SP3<*h4-3-nc#PK;M!WpFbk@MvIktrH5Aa5XxIp0HD=? zd$h8&K=w@b#-*jbrG3*0T%+BaMf%||i+cJO2Syf(j_M4?M+;r`1?dsAVS#Qm4V(1C z$fLp#>qE0Shi|={0dg4h$Pbk5<2ZhE;WuGTZ#?!ulB%pE_To8FOcI@?AzQjZF_Sjv zTwQ&;UN4J|9+}7lflZkQQ=NGXk4Xlqhd?)9alAgHl#lbQwpiLbZQ8RE%8m9 zJhLd`jczo@UYE-}TZ~geu?VlG)C+G74P{*J%wVX0`t$%?kqW@la@9veJX$l-hZ}vPz?|c?E6H@yvD>R9f-c+sF#Lyiy@MG0U^+Vji z?f3W1B$a2Nl(5?qr9iNco_)E6P?x1M+ZPHK=FC>J#mR`Oa!&eXmQExOV2sIFzh_x7=t{hOrwkIu~Z+0G6E=MQ7X4r#6e&V#@=iO(Q#BD^)gQury7fOG=V*+n;;X}CrqaH8BA zqF1LedV_NAo)X>^XW{70Jl>=_X+$aePcQEa<@V{9$5!0v2JXfs?WDaeo9DQqokyBm zUZLY}8ShJ*(~h{+nsvoSi@rW!ia6_>PenWYYpa@<=lgQ7kdQZ5R!*&X%O8GvsLNTu< zsW5Z-y*oEuv#UEXx*?VsHb{<%V0o>tcQ)JWmfGeruJw+5)E=5VZ|%g%gG2fG3r5mg zL!O=Iue<)7Ar=jJJL3+wJ>*XL+W+a?_rGquu;-c$lSik*@wh*}aXPbYD$|qt)=^Jk zZEoP4_1V&qzu6A!dEC)CR><$WXg<}&s{OFU@x4ezTAU9`P7J+rqMn)3LP^ZBvMcK5MSbJXr?wRhU1 zE|Z5v_uTQCfz0L$Cq@s9h0+mUVs1FKxsvEfoj&BqPGozwk4C$;U$uVf;Ha;?ec09+ z-+YDH=|0)n;Y}Cpp%BrFl;EF9Z-%4@Xs%G!i&g27)bqN+^iF>Lhq1?iDur+4(G`Kw z^d!$J#T1cepHd{#TqVgunLz1DvHAq};z{LvkRxSmE%>KsAil%ygnuF=R4n*$@y2Z( zTlUzeZI?NwZ1cN1w(WP!I4*O}{Gj9Vj>k7#yWt`H!{hPCA7|~?UQ7E#KYNgE*RI39 zd=q+zmI2#}XH7c_*ycJc#6H8;@^T0!m&*n4?ktCGsl(zZcaXokwGN|l>o^SOdgXVM zfNkXOV&g2s3V3%DFSo4@OQYNzFSor8i}CshXHsPa&SSVY8LubE)gdl2P7mzrD91<#u1-GG5EGAvYcBWoy?16^cT z0PoIn80aFy;wX2JzYDrFlv~GPpoUC>2_74YsRUJi7TVQG|`cXYD$a16^cTuzH{7JsbwQ5DfFc4_oba zb}RHB2e<#xwt#yY8ePq5NR_y76^1jhK=6<%^^p4M=^Zn71Ag9JzO?60wkg)#H$Ey~{Ry89SKN$F4=#~;`p%Q~iauz0D-Vy<3^ zdN7f3`O~e~0cKH8n}WG|AVs+gmljgxFbXD}64xMti1WMD?BP@>?sMd0sfmiayQknGrITp_pxZ3kPC?&7#J|$EoZA6?ps2lOY%p<@ zAB!xx8^pl?QnXLQq0`K7y886JCls;wwUuL_CQ> zSaeN@JCrAm;|W(d7_fvb`t%j;L2I^GAMYC+vqgKn>lY8s$8ifvIOvadSPS`Dt7&XB zJ~`m)iP|pMckCj&iSu6pt!@Gh+cBc#7F;!JX>n3Ec}lnuX{Z!#bW+>lNqQb;-blu6 z)b8otx_&M(*Oi^$x&zf}HEHnn9B5#KOen)ckMk=^{Y9cead~)AQ4{3~HH8Tl_(X%Vl+Y-xeu#=*;PWGvR6P?+N5g zI&&ck54PFtPlBx}erR38SbLRThN+ifG1dry0KsXor?JM!uN>>;Aw#9Iu(~TD$#H_T3M`IyJN?-70>V+CMVx8?BVo|*zH5Ltpq7`1zfc&yt6|W;* z`xC7D=V7g=d$d%kA?7K@xWSi|4mg~FfYTA^b_Rn^S0I3DK+a(8dd+)KPlsBM8mg@% zxmo4C3x;BPTR7zKhX#8$8lyh9%jwIci|fo-OrZB@US`{I|AEkZus`B@58RK)FD>*Q z0SmEaww9M8y+^BQ6K3&qFfU1ZshNh-XmZIyt|2) zBfUq!(kM5_%aPtAU@^efaTw`60yc)+SWinoMH^V(>*YSFd6dIQ?~&^RSKi4kMmf@Z z1T2WVvEIXBr1uC|2xg8x+&tAJ9T#-M?;H8=Z|1*y@cTCY`&AelNh6oXni|566jB9q zqN9uaHVi&Eng(?4O=Q$owOeH$3RkFdD=n9FviRen#y-ZAgCb-IiFUD>ygpyrb4+sj z9X$@eZ*AfYlg&D7w`2~QD?Ln8PWKJ8c!HL;a;N*Pk3~9NW9E(-L&%XN9J_$?e(C!V z!9nZ=g$67=#(Q~^f>ZXondUj9BlWcL*YB*M8 z#`e}s#!)m|zGCv)+Y)h%nHh8DH_|UKE?vNiBBN>CNI$g!AEAa2e+lj<<);ahBjtxj z9@o#n_LW7HtmB6Ub8BjBY$2Cx^JM%H4{jXP4fw~aFERay4pFROYb&j{Zq1c62f>>Y zuu)KU#}L{a#jJyE2CdPalPusA_yxF(iwH{+sjVq8dX7^`Sz_Ur0W%|2mh7ofV|N`; zm{hfrd+3H3KOMm>zKRwKPt<`-Jl^H?WY#!ZozwZY4qLm~V~=)we2%37Lkr@2-D_+{ zL$kv-I6QJ-(N~Dt-s%W&k^hX%;j^0CnAQ?XxpmEMYbS;8W_{kQzoTWe*=zEoy(X=` zscns^Etc(>SYr$PD&+G80zMyjrxj~pZtx!;i$pEfe?|S!gE7``LB0murwwIOXrXPgoTKHQ z=B2vHF@W=TIlNwn-RB!ySdiZ6wp!iv>8qY5e5Kk?aR&RXsE^VN(Tt}#XGDGAVytrt zPt*M%SRyepvW%f5Bu$Mixvb9C4t-mTt$m@}Ah&o@r>jU>kB{xFK3HBW8I;BqI*}|i z!h$I1Lo=P9ae|#tLjM@I>9ok-NaC5v)&L_drd$Yv@gHt1(;`SR zR`USr71W_jy+n7)%nN%GNiCi|rJiK5uWO;DS*zE#Hd{M#5RBC~wHu`oovx4k4j4=1 z``Qj^odb@P>y50kbW)nemCj<(Jff2kG`qyfX|l3fiVoZ-f{W1Thg}(9V9f`bu%9$Q zI)^5m_TEsbXTj$4#1?HncYHzGl(Pp09g*1~8uR#1_z#Se!dKhDS0Uii$XA4ez(rBy zmG;K~1v-hjsHx?=C9kQlLkGYOiu6}v?$v18)%J8%C;m*ZKkIU3`-6c2 zdJY64u^1dvF)qZCDad_9UZ#?jtYdN@-#swUogd(Q-KDt}YvXp_c1G?Yt&N>TZMlcE z9@5$)=uLM%sI->X!2}H2%a*|jq`@qD#5$Ny=oT7Q!A()KM=XNTu_Mpa7eTtm<66=+ zfQuiNXqpd#GifGMwo_Vj=ybV=GA7;SUj!sK!li2~E<$$xJVC=A%TH0D$^iA#dpglL}vH)Gs z!i0JKTj_loJC_$U5_Io}tj~cO#3Pig*`iV<(g#lmzj)hPclX8nhVz9rGh4Ujn$67} zrl@VGTQZL7cJ7?GwO`T=>kU&S(OwqxSr40=h0ix36+v^fOKZHUNAguP93MeT;wZ4J zYuw)74JjUuE=;s&EqzS0cJQCS5RN8(QazoqB9Dls8SBJ4)Q2OXGBY`=t~0uE>*1(H>Wm&ly9W;3PoL`Px9{2Wc50vSub_RT z*$4i_m$b%7_!uC+b&%k6JHu(j#I$M*_=X-O3pFb z?Bn+g6^ldfd-rf(ANj`6j^+mJaW+A^lEy`RO6vsOGEe3m;#H@db+`@R=%O~PQ)HT| zFm2I+bD)sKU<0j5OH5hLn%1}i%}v)WmYR*tI=#t|oxilz6~d}+ZEgQ&y&reYkKN_S zxo}VWUDc0ybAb-6c8u_Fpub)|UJ>9ySz?-jgV*k&N)u~ z^>0tT3z}2kcPH}SnLwYQH!&Ub$e-g|05h!z^^v60$*XPx{Pdm1xvs%$nteDoRRX8wFqgqkblO2a__Ky0 zm@s8!0|Y4wn80b`0b;26sRChCbjIgufEYEX0uaRW(P#OOfA5EZgh3N@#MFoe^|ZJS2oeIu(erHvwka0Go5IzFv$w5F1tkF(E+ zCl!I7U0u#~Hd}7krvtAsij}}QiIbr8o0M^rBZbs{$%ai8 zpkAFu%d$^nMHf#aBt(2e5EX=w@RPYPY-9(gr%2EyhS-TtQ_cpFLyMCA$pW)sc|~Wr zrbSMaB7L+sjhWo-I+MpVw)D<7-Fxr7OYeHuyWV)Wbn?#7L^wPVy0iMVp`qbZr-p~H ziAUe;uxY=DF)M10D}9swVQN=YW9!2-k?2@HWI5#+B*#t$Pr9dro)H-Di8~`eHe5%Y zVqwU}CRXciF^*!wVG!fJeZvgvHZl#UAtdD1ZnD~tIh9)_L_m!9S>zdn}n@xs(-Qe!g5XRNvou3_P zG8$UU%_B1#g8|5pk=ipj$Mjart}y%-4?`}CqYL7`JzNisUQ*UP(lhwAmUxmoiw27l z(a_xi$ma%u8^DA1nSvkX>1Bu~%s9i!+VX`${z>23=*0dL!SaUOM7rWAMH238C;M{y zhW`Eyri447KYYY^^##4#MiYjkhozunZ9rH3C&`H*bUL$tANvvVg+yWRk>!SbY8jDg z4-=1YlYv-h#aT2m@Q8(kk_S*)hh{uIb>Ywsy*Xllat7VZ&Q&#Jdn z8ahrE2Xd!&@+f2x!$tAPr?KiPu!8)Jv{r|Oc8cwMC>?qegF;@$S`dLXn#2p#SOcvV zMFTguCU93-`6aun-`LhPEwa=|6=q&G5n(mpQ-_7U=zrYnRmLfBqO28%gMKWSEw7|su9&s*!!HtQCK znzXuQvRMDVJGBPsZ~j_xxgn1oTZ;WnCYNbI-{xv-kjPfoXq($KnjG+uNX7_*$@sZy z9p|u4*gAir%njM6uF_{!(gQV*j?7Yx&RUA(7cu=Qd?VW)*~P>y3pDSQTYD)chob+; z8cwz-ij^dK#!*7C*<+msgi2CW4_OfG@{?{kqTl^^(%*x41~C#;TNvM|Hp&7>Ya)H8 zq*pA0U85u7D0WE*AWRe!5xo%p6g~;zU*;be!LYm+ZEWuV>&WRM8Qt5pro65>n$xlH z%*;hwH*BB9zl#>vZJ%K~q`tzfPc(Ox*mFclpddw2ioF^wfqL1yqQk-`?meb{lPskt(Zzr#i7I*q(O(N~ z0BmL(?F{r0la>N%DT0z8AaE4FT^wzG$2(d^iYz?blo(o{jvt?zx-GMQFwr#3x_a^l zn09w}`u@yV+V*qy)+znpbtXn}$&(gRRKuP}Y#_x}=QMXId?P1*P@{jF(iS+9W&(O7d<69Q0~Xmu%oy&VP1~1K8jdT(%Xnn zDCU&z!b;;wbFGXsLKeOS;Wmy^*Dtc0% z#quQVd^9J>-beC>;AuRm9Lb?}JoECCG90r~FRZ(m0FFWfuh>a-ARVHCX$0dSWI%@pE>5PS=;!y*8uYqgA<<o*#s87T zNJI^jl@a;~X}n}b?jxHYWmMsc`?7F)O!^}G(a@I7NT&en?|jeZ)Qo4`(G#5Auwlj) zYh8R~WYBo@sG+d+#O(AXi@h!9p3{`}SDe19FFtY7)cSThge%GG_0KW(QB`|ir3tEe zi?B-uhUh)!ff6buRt?hN>FzL+a5OtYc+%<-rqNoiEv@KN!VE3XQ!4lOeaAnWn=C90 zg^+xtIGLPvkGDtd`KXlWeBJ&-SDLl4yy56MP2CGib2HSVgZp%;V8w!aKVz+sS~Mm& z;lQ5cI{N`-e#=5$m04<@h=*w=^40P*I9?>Xr@gqas4(<^dZfdX_Fo3Xg|ERIZQyK@ z%4F^0YaIo$LpVWd@pTc$nL_Nzo7~Z+=}E(E|0mvf-}x$XgdJh+$R-dX!k_EX>^}0l*oy>jdty?FzR`B^MABWlw>@OtfuB*>oas7=U z%E!Qp?1Sv+O!Xe4^u9B@@gB1H$?qW!;l5Y;o#GI2!@}J-J4$h@&3N9&UWZo^&%yqM znug>>8QlkX+vH`VTVg7j^_o)(Kgep6D(~ggCMrOUX#^{ifkD+1WI!)TM4Xc$)r(k& z!hFS{KH+>N=Z$bo6FVjObP0p>gBXG&o@03C@tna>I6wz&gA;LCvXryHmnW-J-9i7% z>A8DFd?kBs86cfz_bvk<0+U97H6LFYhgtpmRiMdL5Q?Gc$G8~yxNNTdLLQfcG#b)Y z_I?@`xr}K=8H^&z%(E}cWoUdYyv&wbO|It+yv$bi3Aqfl)v}_VSzcxf`@CExj4}>h zW?sYOdajhqe7&KbH7n{t6c6y(Uatr7n_8#9r_OInav7x_wamh+meKKgw$*+k<3rYI zYU^Rb2TT;!96|nr9%x)X>`JkX1C;in6b;@4h9RlSkKxgtUwB#~|MH1X?7;slxcKO! zi;v3nups*}TS5&h&MZT(2(w44lWd8CkgzLy9eYahqCGn2sK?HU&N)_KG*ZqJ_S}B^ z(Cv2&-GTpa|HM1)B>Tag?-;)GPHIOBd>4Ul1#der&*~XLY%w1C7|=@=We>`bJfX(1@^Yv4-F-BiJ?Qc1F!#4 zove)yf`4tvR(;rB33@c0`)U5>U+#e|Al)E7xUciwQroqT+H zLED2^)wd}a%Y3OO@t5U30HO<&FG8%48q78l;XE47&?q zxFJ1?ApC|(GR*j4Ko>WV(Lp0aFt|42?@GpO>EK9kM)}HydUGznYp4quEAim`AJp80 z{3=H9|7p(ur|bL=IRp8iugeEozOe5KVV6Y`Vn_9Ewp9JyqrlLHoV6L;d12RVSLi68 z7gp)0rYn(oL){e8ChxPfF@(BEL?tzfL>Vc(;*vtd?PI?a;dktm9puXHqb&EY-9F2{ zwzku>#@OyoPW0Y>g1v2resA@^oKD?#i%X@(LwJ<}o5Q}&&vy?GCc6io%!cFLnMkxiJTzD9XTQXF zI7GxADJNnL4|<2 zNY1HjAIJgFqzQ3hiAeZ59bsjIEpp{;HGRF{{1=KFI@}}v!OFni=wjiumnP?qj>M;W zc@DYwtoP(l_twQ-G5^}pV!zZJirshXwznK9dkS;8!s19c5^z2R?-tRpt9F=e#?5na zP*EItM+`UE1Ce5wn=}&~5$Qpa<;V_+oEH*@6lj1I+9MK z{Hv$gIH6m+zW;SsTrpJKF&5Qnx9Mir)qmAXi1$TX;o1kJ32iUhrFEL@Pa?NVOt{gJ zp+_6h;*uVg(67u zdPv&wBY_TED07u15wK=99iN;yz6lW>am$s}+Q6hMKb}fW6##@zM$3tI<+!NIMC{nzI<68_HGjS|B?t4&k)Aj+#Q_J~4Ch-2Oo z(4{2+lSPXo5h0sJiyxuB7rw=wsDAYyzQlG_al)AO&K%NJ|D*bA-C;Uk&oqmu{~+o& ztXjWNf4xQsTQfe3lJT>+NYD{3f)kSG}$aB?)ZeE7D3l?9I9}ii3CYMD3(1oN8}mbhVF@T zT8+-OtSe`81xHD-Mk5Im)UlI`*XuP`aRn=?tk~Z zf2io~0A`XVUwdBqFX;~OXpfqGSoV{tn=W}Z1`E;2QaAJ|VTIPh%4Wb~L5?)Bk4@1L z5grvq$;T-gRZLUAm((x9Bd&_YD_^*Y@qXa%SerJ$>|S(S5pU&5!h-X>H9G`*N+u zPeQlkJoI~M0@;sR>T_4*Q-bb7+Kt12tU;FkkFd8^Pkf}m`kN|SQ@L;NeHBJ_`eg0j zaYtnb-lcPGe7eZ`4c05HnCLLfuNobfjV%} zq@P&`pG58V(v~_t-~gP0+uD-w#s=k1hUKuA@Sa6&) z94FY|IZk@qnT=Hgw}!D|_4%=T_uW^izTo2hy}5cR^_SOK(wt%)>~dhTJdcVkQu_Y) z+2uc?cGqYwWW%^4MJc1@dk_m;^lR?A>n?_rAa|iIE8@j3J?oA}-SkOL_xk<4(?~!-&zU4eUR%R? zw>uZHB7glCV?J**>h;C0rR1-f*`gQEOcu{kOPGQdC{L1j0t@8o)m)4-leYtViaMiN zN;?g4Mgk@S8lAp~Em20~QiQGfK(_LezW=!Up@+WM_lr@KrM1W>bz^_FJbzdj<^o6| zX4J9PGyfJ~XR5e#j<=_jm(UKaC{%|*wA0GS+Jarx12^7qgZ%1in6diY`uh9OyER6s zBqikb$fzOm-Y^>+V-hbYC92Qss?Uk`l=9SG3jL!StZ5g7T`gx`+FL2#B>5XQeKE5Z zsIUm;#veC{YMJ|n>L1u0^}4C=PW0WrqVE<+VHUAT9+bqD-BJ}CDb>po9<-t>J7?O{ zfp<8|dZZY=%I>-0#_DVM`_<>zSF6vn){Urzy-c*~K>uM3tG6lhBBgHtAHPh^F)tCF z8Bs6fv|OIrEu#MzUAh0_4hibN@(poYa@-s;n#p^_m{|{u`Y*J$R=@U9Hp;uqrc=$z0i2$FQ&+5_z@dHQUjFN11b<~^JVo#(s+#8rHtWS

(aEaW;lLNJ1|m8XK^n@pj}R%q3Da65f!<6B@=pX_L?4@F6))E?45R z4093n+*q%t2{lkXf*+vA@C;~0TNBxj95>eM`4rWYlS;W~FfZsyS zVP664b`JX!qZ3S2?oEKbo5TLR8ire;csbCoQ*vr9k)FnUT)w6mBAo}C7Nn;iLtP!x zBC|q2HsF?;Tjlzb(g;r8e;rn+Kb=5(Sgl8J4-ftR!U-Ce&g#pWOKOkE^%8{WMR_`3 z+jO95>M^SK3Td3@STsodhIEeimC_{p5cc;5+>E94_uQZG-rl1#YJ66hl4ef5{?@D#pXK<(V5nyZ3+8LeZBN~1Q_YGgi zVNOv_!)jNfpX*RxgC9V4ukxI`0E+>Muk)6&=&(d1ldTyq!3*{<%n8vDzY$i_s~ zLYU+vOrh2E*y=DYotwE2AzDnZ*W9^;o-Qp)Y z30w|Kk8AGLj-VG2KF7^`Zt9_pQGbM$T6l8#=^V&SY@Q7frB#Idn%Jl{G5_;yVEsDjXGS|+M>OyrA3VOyE#9g7w~d%wt<>`9n)1|fj}lrDtDFiZO!%C zV4ZI$RvNuUx$D`Q>I>RnynwF&dd+@SjUks}BnXz(*|qbeNzEznpppZmap%HkT@$)P!%xOi zni!qvTBB#H*nrtScPQj`hr{p2$BpmOWZ3Nrhh6lmcmgkK^9jtEA>O8^j_vhP2HW&$P|2vxW06X^+0cY_>=v z+HBGphDxH;_bJVO?M45K`u<&y2r|?so@UKxsv6f(Ey8 z^co$A`GJ8veJn1Q1s^HYm(BI{<+6QwFP2IymtMk`>OZYPO6mVq{kg%xT&LUJN%fyD z;H-Tyohjs<4!g@`cQ{4;w@AYp+&hlBX@K4(Pcqr+!g)tSlMH+#@=k(piU`ERC%u2q z+`k>zJ12epw%cwKbzKiR`fV=94e&b&Et_T(1Iv-GUiiyU1>UDBt{OYGI-Rnh(^U<05-XmVJ47di)Ho^R$go5)yW`l{2RH9H#_5E9JOQ37NY8?YNlxgn zSLf?xlbogmwt9*wFATsm+3E9G2h-is7hEZZad&Tsk6Sq{{z>v{2BF7^I*=@e*P&I? zUmzTxVzztxby_{IBhw{KJJWI<6QYhkvWGP9k}i?!ILn-Di6mQ^=3Coc>46aY*CtP( z&E66-#q9p9uS1@bkKk^>soDeRO{3hiH3%hHTt3|(_DBZRx;3Y2@8@&l)nt&Np{7?8 zbx$=)Ig)mu^?Pw2;>Oyyu%{GyGszt#H4s82WWghEN6NvWf;%^ea~$0+hckzJfJstF z1wBqGSoC?~!S~h@upMf##!-C|o>X6}JceMI0kT-0W{E`Eztkta5mU0?AHCR|OscEn@0ceu^Cx3mBC zwph^B+*Pz&+e)U6Eb#kyEv|Vz>aw90+AD}X2hPpNVRXm=K<*`qr&{X^^ILCy<~~Pu z#AHW$8%M8t+pRqrc2lRJQvko~Ykv>=(b}!SE}Z6a3nm~fcBBzt5qMRN;3=*UB$J9l zz-n)(ZO~j-I|WP$Phw7*R}PrzuA?LWpWL9))-IGLHMeRrC_%n;(zC=mO-BiYZS=pp z(2_HKpTm!Qwt>Lk(z$zl|0B~^Uy>&IcY+fP&u6g(=WRcMw(kLE6hA|4i+M|uR>(4n z+@yGaiW0WdB9As2lYKREKi9pID-h7$Gk7n@NN$-hklUtyPrX9hWDOzOuWZ`_@prbF zXFvD&24sR+)_3jHYu}-CSb3u9dcVK$|Ele)F5Tx}+4dKf-uw#Pu8;Q=R!2Gwo&n8G zWKY7JrMOI`-{eB2$ViGRCLghzXip2ttI*)4EhSxP%g)2umAFiejJy&hw6e}cccwaI zTom35fcprS<-8|ONzfsKvnhLJdA(c7hf!sp^TbN3RQZCa%!60r2eR@hbZO*8S`ZsE zCGaVab%sn1!yAsDd#TLt-;n7ceebo^n!*Um^DpqjtF_%Y4;tI9?7Q@;m2GP`Emc?c zoOn^H{T1vH5^h7MOyRWVG;_&K5=d|Zsn>kRC^n3d7&sumck8-dUGF-U+O=;|`s~T+ z>C@15q}s*OW2{9h?C?~Vm`TctE@m;;O1L7yH=vOR_Z^rzbmYw{eUQ>Dv*| zEcHssh}~~B>SVfVexbbuD~*jy$#!{_Rd)|`LxG4W;XC1mT?7ui${1W~wg+OZYez>i zA65G0(wR)=4yjk045#9{QKgTULpOZ0wtznRxV>5M0(tuEypO~w)SloC1O|XdD7x5= zCuI>O3kq2#phd`0CF=ga_q@f81G<5Yk{-7`_#D<&UrR5(TD|+z13vZl^VWl^PtPy3#GP>Hk(a;fJMQhS0N@%*a2+7Oyzf+isAI3GcIeedUpT^ zT0I=gS8&^ooug^Ku`lam(P&Ixrj5NexOALWa(_1K=UaQJb`AFR*J|$orXHt2g1=YpEz9`8Fo57W^T` z?QzUoiVmhEl0rtToVOG^-HGv|I0e|u$PvKh1P%`4%y8WZ#1i!x>|IWW4SXJJix3*A znEr4hO)dwI(p;u|4rSorhCh>NVM8PnJq3*#X(D2|DJyUgcqM?-Y8tJY*5Pj0rv~&9 z{L>GBjk_Ow<@sH)1X6Z;IBd740+ySXO?0VtDfs+m%yWveB3$i|KZK(h{%d-!wrB~N zM`wC`z%|BkT}ClQ0xg^I%ZT@6!&Gma_R{ASGTyR!?z7s@rKqMyI)fQVx;1%&Nw?P0 zol6e=MrM(s->ckBdj9L8iZQohDAwIdc^wSL+zERjd8YvAfj*JYJ7KZk+oEgN`=SNF=_P6HPNG3PePPTs}C}Zu~UMbEkQwA+VjzNOsjyLH9hm$t}aJB_c z3A6AysYN0kGpRX8p%xr!bbeTkaak32zcRW^Bt4_(GI4B|qRSw@K&B8#5d}%;ATLc8 z%v?bS7`yobD94x~rq3XsF5}dC#9g%aOceTi`?Z0&_`ai&!40YKbU?di&)T(@e)OX! z9i8)=r#F^&dBWEnA2~3AbesjLx1?WK7#c=@YgN#pS$aZ>vmEcQM)O8a2f9n~WrEX9 zub_kQ!br8(V@P~n1A)^G|^R7H?hS-x-d=lmUP zK<5tx{5qTi^ym1}{T8!7ZnOG)R`@8*M1Rr=HMeMCM&i25tFX5W&SPbbzNK;M zj`EfHtwUXumaGe*sKf^gwGHs+zZLx_Pl-Vb?-M^!q0zAy&I~h2&&X-i4^Cik}u9ttA zm*?Z8+sQpy{O%s)6ZtL1MzJ}H-Kb)7tlQEMEI^quaF@^f#brU-XJ2-rY4ALqxxWW@ z=!J1=wa)W$9F&N%A**AMCP7f60#XD>iL)jYqS(yYgBAe~98VgQ^>D+akGLHlx`-o! zIRK?&6eq1Ha#2kcZPGb1a2ew^K{=Hlc~Jk*>aZ9~x#*C4EOM+rGuwyUXql)@XN(2g zS`KJK;!eOcJ7x}q;*NB$&o`9pa-@f2iQz&T*GGNh;KAy%{K`dKyGVUyn%(%}mp+cs zUU3Ei63I+=YweIeK6>UYylfmle^oDwh*i*vqGO6QFN?q0for&yMybx)lcx~SaAGdCmU2L2MSJ&8IS%Zj)l2Wm7Ie}(o-73oqGMO$SP1m+sCQZK#)GzX%Hv zv_bJ=V(&#K0m-CGXFK#Eeu)^4SQX7|wEFC^W6ZhKbqZBha1$9-3_377zr*ZRX!}H^ z`gXJhI>0+i_m+vWDs3%w+M=?H1kL!}XefVn`Z9a|7^fuo z{%PczpxCX98UZN#Rn>EOvb~+hEsGQxwCd3@s?%U{*dREY6XVBWf7dryTN5iHx*DUu znC6_NrE};bGCHT6%2Pf+VtnAe@BO>?z306T?Dh=q8z0}(?{f9;86V#_=y@m}3dQNO zydP^IGec@F7x^{_wIAxLMbp!(u>)^$BA6^`;&-uIqQB7oOk@co?a!|90tWu#(Z*P@ zDvSpr(Inqo$;G1eZF`c=Xzqx zZ<)XNn#wL3kzJK*F8St;Z*ZW~066qp=A@-tobEH=o>=%WXTk`Q8s=e6ThR*MjuK7PZ;ulUwLYFjG3m>O8TMru9tJm&QR@Oln-S-{g# zew$RIM_9#7&E#>Kufm<2Z^F=R1(jRy6ldcp*Pk1eV&8>tO2$c9QRSB%(q(}b9z_K0 z)Ct+;^eyW@TKdd);51378yrZhWnC(u};<-3x>Sc z{WzAKy@TW<-9h|sk^?;$P$(;V+f@A3usD*_O8OoOi<5Kv$#G-Lj%U+Rmb}!Ho;_G9 zE_y5Wd|+&0<3zM%ugqN7w|_dxwBzTljU~M^R{Oq%9edsOsSS~-qcq+`SLExaU4T`M z4U>hVij{ioL*y7Bt85)3C7M3N_$>n&W?p#b*tzSH$=RbL?|t{C&F{)et^TpYlT$~= zgS)rw`e5~gpaqTRC(&-J8g;&^RW(Xmw5MbR)M(c5QKc-A;?xwKpAshvXszVBHP*`o zw&Q1C_`+|h_erh0uh@1IsR_K@2RVP&$6!^vjUkW9`mACg)??mAWP$DawXLjwbcXH#Ox)9z`jegBTF2dw9B{hcSm2c6RZxo?T~TNE5u(O_9X zHuXYYLDf?i>gWjlh*U+;24_XNR)KUO3rpWz!v9k1lTV&`{)a#0^uf4mzKpiD*x$?a zS=F}esz*~)pBeR_4oCr_uM>0Va=hPx)m?sH#!Tf_^|XS>B#8}~o%Umt*q8)pJaH^o zjKr60I7>dV=zU8$Swb4)`(hIXUpJ0r@j2l{8%E7hrHxfMuA-0Z(O2oC&KdH%!EOPb z6`nQn?UU6-zy!_URe>`BSr`_Uw10o~hrW37EpzDfGtWF#{o;RYz6V{GdG~$5ORx6* zYP{>yp-@E}!P2v-WWnVbzHtlV0Uy;aenqg6!bU+@?U* zHpHQG7{%?$+J<^v8+k`5HE9>}8)%VBdEu(PVO@0BmFH=7dPJ-eezC+YRt^QG3` z9X$BEGtYn3(pBiPT=DeNSMV=iRr{hrUo4tEXYGrOy2>Of`^tT3TsbKIK;TU~LRv#; zlq?Qpi9t44+<}=uLIy(kvUd&XbZcI7;@v|!{hHT;zRz8rK0p8YGtV>Q<(YHyU%=ZE zw@aiU6Uf`vr(h_zuOcK5B_BCjt4LoLD-`LU>bVnfssM`-ZMI-BV)_1kld;(3zW%a! zmPcl1M=ERA8slq^jgK9jiN>anj*TB%8$Wn(abfS?g~fwH?z7*6W+rHXXP1QPOcE#7 z#8D-Z{e&UWL{7Jeg)w3&04G`@pU7_>42Op{=jN9_cTxYqoYZPgjCJKF($-J0rk%Oi zhtPg^?SM20nvhLqy+RW?$NbvP|h2X{k9XDI^~+M@FPWnILHJ- zlU+&RCrnTxobLT=D}qYww)URDo=d#DUZYU({2i8wbf>?KHSaufWG4t#wKcbFpEloo zu|ms>|Hcw`>*1D>*G~y_Y=-uBc6~{uqs(mT9VNmXqTXy|0AWcP#Bmjw?PLwaLK&Fq zmNdtgXZp*7rRm2m*}U|4cGEy;p!-_Zkx8Z_)%nkTPHOFlRq_MtE#D-$5r@qDB4UZV zkdI$(f0ZRbJwvC^)(YBsI5JJJBhj{>u86YAXB_G#F5Jw>Q>>_Y^}v(3ni098g{(ao z*_=(`GW!uvcg#+QSVndS2R-AFXet>QrW=I3y&JkK#}haE!eNi!*XCT~j^zBfP}81t zud{jmUZ>Y&Z*_*d!jVCw(GH0@??%VI2)Z}K&dSS%$~}!s79Fp{E0|R}+5r=%;QTS! z2R?NVd*Gc*?7;&Es*9rTdDsiJsM`kZSfVtEa~KL1T5@!5p5yw7;jP z|3ZIxzF6Ec;D^BY?)>QJJWExdnbd$AMe=#uP^Nj>v#C$+xKl?WN z=u+1{`Shwfobu|e0@NG?GE1nMI&FENneZ+d$a2oVAuE-pm4CC!Fmw)%Gj%Mm;46Ef z$Omt|rqlvo@0!l$;+40(>za{PTdS_s(lU4zYpWjXOuAgj&STXx)ju7#rJc^S?Ku1j z#3TQJezdDR@;~VZIa36(P>_}}i7oQC@4vFt>TJ^)oyOAZ-@o(-+kB<3-|z4DU0MCu zBh*`1MA>K1b_>57gzLF-sJcorRb5a{08>oK@@(2=T#3fNcJ5!2JzKj600SZd{!qK+72q$P1^&`9_&?X{IkOD@j|yC?Uk3lE0+(vb z;B|c9e`vr*t5eErTN>di{@OMLUQ5zmyI$U+`9nj0YjwCmDG!?eS=&^H#~R?jY=9@0 z!Grbksb%oFIy|GmIX+6i5)!8y?B2`p(#GoV<&^h;*Do93UCZDL_3}N-;A;Ct1-`s} zL06@HvQ5cD^j|V(JO*CQc!-k{WVAx<=%)O4>aJ$3P=8Xv>hb7=J zy39^<-PTdP)YO^J*%KjG^EKS;p|^Sh?KT@!P^oqXKkmnTBjI_T()U$%8Fj|VLP}i` z#1T!>Geq)4E54D_QnA(0i9XUj#32q!8pw}~lA%VAW9Sha8&$T}Y+h@Lb|%=Ds}J5g z`Z^HcZQuFiC!hL7VpC+(<-1Rw6uWI`Xnx?l1~|7uYshL2DOg8n#3BtNrjCc2UiM)~ zX(huW-Fpre18S7>S0wl#|2^dxBQGRne+waNIQK+C0VPKyrAXuIDC8|^A}bw{39{H+ zc;N&$-+W3o=B!^Y8+Yc?>CFROL%&Q#qQMW#)|@wGbZn<=;o)+L{7ht%0)Ou%xdgva zjN8Di;xP!qzC;UKw)BNIa=|z?!IVRhMRQOA;4A-_TgMUY3YA%EE# zQSS=)i)Vqq^vZDbr?DQAzr22}ei@wPuV}Zn3{LbC<=HYg(M76+(Kt+ z>-{1*E8qsDJnt8+6C5s`QQ?w>%UMxAro!0|8{mls`0uqOe?|FJ1N@U(l79l8QQ#a; zrC*T01Sk1N_+mCJ)Z*+*7_W%tb;?{?rI*TED2Osy0<7BS%8qX#{V<vDaW-Lv|W2nfRRiO!dq=GldX8Jtmy+fS$USfmwInw}#ufGvaJiyCiZYb~&>Y+I) z;5If;pOcOCwAIT~yTp5<-P$rZ@rHn(k>ND=+BlwvWjwphMKxx%H`oYogG-5c@%gUuX|RdYD+$ zD8iQVP0_wyNLLenqx4C1O9jrrBl{G*qqP0x2~NqvXDhM~fAgD<%)-96em#E7vg_8a ztzP}JpRw!u^qcVy`q`h+qkrNwIl^i3N6pQgCY!*_!3Ow?0$ziKkHs3`FUj!V0iKbF z=Axc6%gU47;Be?|qJDUbSSKGlQNAX_XMn}GCE^WHUc0Owns)-;CYPT=`TvkeJ_xu$ zhR@+_$2a)c3AlygPc+C?gEIkSQ*mhO7L8T&Q?+f%^K;c!NnX_X3^vf5E1JdOgcUPw zX~x^pYHb!1tj*?X#cuM<^U1;b)N;gwt`_1o9xtQPmEvXiIFK#%YaD(K@Har-lw_U_ zNw9yS-{d1OXl<-l=GhI);2s5z&cBb>bBx#XqUKgn4~JifdN^F$%XZf;;k+M0d8%K) zZLFy-kFlpv;K;7`bIosf`Q)H*H$FHBOL2#Bb?@oD1SzQ*Fq>y^>aAJRhC60c=)^!aBaPOa#?v*c5PS&_sI27 z{8gIcc|OPUk1WseTnT^iEby0>!3lp+&zWWLe^lVm6B_F$SuM)fmcfZ`9IkCW3%sok zPXd2hBSd)%%X9h*{7DW7xS?MDIjPLoeF2X(z|#%z#4zC5=WpNzzU!(zD`gRbXn+MErLGn+(ywC;`t@>4g_GY{psf1_*e%7q1e2g37hnTr1Id|?Td+ql={pp`oZyi5>eUdrnw``gBGVRnk;{oo3 z^p73-&uzQ5Z)MvB?wB(hrK=&Mv#NDgj^tFOk*w808Yw#=y1#~G4f$Bya%3mj#p4`D z5tAwV2WSME<=<=h>eFV89+nouiHLM%l2Dud%$mwsCH4_O3%Mj?#0#16V#K+?Tc|0QZwW9%!wL^wujetJ`^yTHT zMkK@rl*0aFd8sXZk(k?vSjrG&sSJV?Y3p{idc%%+bl6|yZkAUM+Nu*qs~?q1*L6<)Jnls1%N?VUwcR@$RJTeH?X zxU0fqiYE=M#QXLfa(mr_7_eDoe#)4uU0G#1R;{IocSbk(v1@dLE+)oCSS+N%uL)mX z1L|TemG-x`PxUCiJ&toBQfz6G?!mg*S6cHY#l@#0E4iasIx%->j9yQ?q~kH-ST|MP zXoNS;k=N6@DavErY%GttAlIYLg(T5Kfx`|VctiO6i03bn=imW82Uo&hWUmZ=X&Id6 z8m|X)jhB~wR8;?^qJGUYRR1dYi)Vqqv)#pxqxdGIAjrgV|BPi^9;=e zxm}tIqP#&V52pDCu5SoD&j`5e=OX-ZjFj{lO_kFpiSnP}bDzT@GaKQAkAQ0xIPejB zTLHIdV9|%(BHLP_|9RCrQDi<;IaO6t6#b7boFpq9EhI+nI>q@dXt2UwN7ixWLN+?L z-DnxN)I&DtXigt%p$NSTFHF=!_SUbbD81{4?qnZR!uI}9*8Ldh0^bGnn`|5%(EZOI zH=<_gei+M~xb;NbBr7t7Qj}O74czLjM2;-Y=jN5rkw-7=FClbfp(8%lh5PKR#~$99 z4}XAgKrF5l#M;{gOK3f!VU;snc1m-dnW9C=@vLNarN}|L>ruqm1o`wXi^!0eI4)M7 z<;Xe`$|H`X$?!q_bYF31P4)5M!O_yL@n~#fPpPzPEFv+sWSAX`k2=3QF*7|`^TuLp zkB*HUT^o9a37kI~b%!>n=wceq~CHcl9b+lD~h-@QLH*g~9uIP>% z0UaXgE}3TsdDhfHenAv5g-_GPw>88HbO{n&m?VyJB{c1t7X0lr4%oG5a9|PNDo_Fj z@eLa|k&_pWX%oYDu}whtSsVam`%vG>@q5*Mz(4-qahnrL2*0x7A%XwubV^ z$rECmCTAmyec8z_Cmjtk<6uxJG%{@qXYKAvIA=T0Ki=DQYb0SZdPjri$S=%MOJ~Yw zbw{e}O<7OCnJ)W1>4?whA9Uk(b^Aogm5K!Z4|i_@7-v=W58vg)a5&!C@% zJ51m48Y{XtGSM2VHCSU_jP-)FtbC4=sY^G~Pv9Guy3g#q8RN&#pyOKknYmy?*Sd9G z{`vE3QT<&T7HpkTRO>7C7fha9;4k&n7J>a3bz_Wbj ziuqegm(==Zl@*s(=dL(qNoD7p%W`rTcqYx6lF?Lui;om~H9|gtI;6GaTU;%+efwyMqMZrai80YGiBE^+F{}FoZg_H{{!mkzb*H&_ z+ABVvjyvLI@=2I?hoz=voHAEQoi!=z9Jyxwc}JeReEo0FoxW~b&YYYNZMx{926@ua zhne5A!vB!BfxdasHOQmnAi6iyT<&SE^rU^EhTn7}x%m;;*hRCVE@dJ80t9(*tv9W& zYn)M8ShQl|*g^RS+r+}Cbd2hB#!^d5Fe`0oIR(sX5o^JtMV39wiZ=1&OEtj z@nT$fQCTKWnJ{(I;+m3Ko~G8tl||F$tZnn3(px((f4Y(PToCmI@P9l`DzFxO)cmsj zVSvYmDWKl`;+BS*FI}VQvX3cQIwkKiXHx#M#bNng-${AnonZA~XQ1?)+GTCs7vS6; z;REj;0Pn_OCDYnyAAS+3(xRC8zg6V1ige4=F6~5FB^I&a&qB;qaM4v!?j8wGB(%i3 z+-8C7A+-zK-!;=5e0-9Ljb@k%hiuu_MYo_GSnVzQ8r{@;T@Kh|EihIIHmWsiTd(j4DV9(=5m-D$)_}mz7 zEFq62#?r8LVoO7p*_yfgB{8zJ#9kVKT_AScojn!eREjNNd__7&0lXiBmX?~;j<4lZ zOif#{(Bmy`ndqB6y*LlDRFj*(23vJXYZeqVK$_OI6fJ9-A+u-Bt}HKFQndJn2|1Gr zs!L|g$zF6)!J;aN*gBG@^||>Nm=lEs_#Naexg0e#9ugvgc_%d#hy@9YYm-~OKAwKe{=9<{rtx39l?Lt|6*(Wgiz z2={v6ru$W3vw%4RJcd=Www8VyrhW+gZEmR5m|5_0nYsJ=>+e1Kn%eE}_V4n$IICD* zh}tyZ6bW(0V9G0(N&=4Az(J?*Ph-7}?vbKZLSycl z!FBY}Z8LK{D>fDtugh6Falzc>{;GA8JZX)epLTLlVf}KC{8M?$%DK7O6%!^mt>18J zTIy*vKbbOj_KFtEqYpEWW?LRP%qOY|vvSGoC63(#Q{MXZR{W{m-}uJSrXT$X!o$24 zR{#&4$!2)1uzCp%d|r7gVnXz>EDPnHjyMzXH8q_D`J%QNF-^ZGx}9bHxOv&L=eA79 zEzK`pH$@Iln}RJBbB_LDPQ{{}1q<9faZWRSmE?11GeI}qmP+;PKzkM9P@l@|Pcb_m zXk1Clbcr&o0C4xGl(*_npLN+6&J3OeQt!R@)}wDdbn^R+PLK?pggla%X2MN6VQJ=F zDCMnp9DNHV{7ghX?nC_9Xl1BgT^XVBQr{@W4pT5(;a^zk-ptu{=`iglp}`MPhZ~Er zv>DtRxu2x`jK*1d*2!l!Dn~0dzb^med?n%BsCGZv)b!}lrXP-|;`v-Ny2=%TTN;StGhI{qg!UFnvtEX1B1rNQnEq0KC`H>CWu4;E^j+_2??Mf6a+ z_nkejY5sSPHtjz%Z)5%);5o_mEs$;67eZEqauAXJVRZM$D`j=Yf@#%fOj*C#u%v8uQ`Llux#M%v z<%=6OZQ1|^9KA3p^(61Op|f4yoF1GweX@fewAltyz0jOP{@w8p>806uLATPFmW_5}XkI=au?S@g#@da+Yapq!UYE0G zZr;54vsX{@OwXFSXj$%p4KtTaSvq@;XYtHcOA4nfUNyg{#Un4snLa0HdQRqy)a;r0 zIWurh*PIz;6Q|6WI&FH!^vT}BSyTUE&KKgxSy%MgXyvWb|Ki0T;GIO++r&Ebg%Y_~!)2FfAJOBXHhHl5bce45&Q z$X{OWKlHclXP>>D`4>I{I{JZ+`oabuY126FnYi~k#I149b538KJ~0D3Wztt|x~xO( zelovm!Gfy%C#mOw%{Mq%WjyfZ@;E&gxN`7MT0(fISiE$l82w6~E^^p4i+Y+?BBBfZ zqpsL(4C!0)lGBrPYG!KbhVs;LsVXTwDZiB(YiepAPychFQprlY6Xnr#%VA&SMP9q2P4v zo`e*f+7{W9aOu!lMJW@~b!t}1lGBIYbEYqKV!BG3nCd-U{^i$ajQ3<`d&Zyf+ds5V z%+1cuok(k;WcY2+v;{Pc=X!8y8V`EVyXMIzcJW#D7VHu&^QM-^jDw9$N`sEsb}QzpQ1`?E632qMIn(CO zokr(7nx}kun#VJ3`rNs%+oz$sK%FCgiMv=e`mc~5+DU7Netf?qb*Wg`^9sK7C3W2@ zBtm~*waHTT+2f?)PJP;aP9);(_G z@8t)rJ4@tG-fGH5j)CTKL6Vs+%Y~2~cH>BgBL=B#vS!+qZ?Up8@2-f1h} zvTiA|S52^PoHev6-?}y2E3MlRlU6lV4-D=K_H64O^7y*tPi4nITc@XGS7@lS zFXXA~ZyyK_4g>>3ogKxV%HCd2GbIRlnma?C!5#2y85j<>BSD});@+M%UvYVH`3kQ$F>*^>PskJS3GuqEcX~GU_n^$4mLU`!$@@E&4g@^|2nl-H2ZsBHf<2v~;<1_46d3OH)D(L*AZqu} z(BR6YOLy+vSsWnl7Pk-dEgjl5*!d1Cz_TbJrp1MxojpU{kt*@j4)hOs8UlTto`r@1 z3lmqJ=ReJ!ap~jITf4!1rl@70YiMU6*y({sZ%=z?e+c{??(YCciQz4E^`6GT&VCcQ z-b5&j5rmTB2tJ#fFtra1_5e>?XYatyLaHb74D^NuJb@j7p58!PZ>M2Tz*Ad!swXhC z(qp+8Y7h1d4uy(CJ-x*P!EH+$YwIb4qIdrpm(GP~@;7*D8yi|Z^>x+$h8BNp89YTE zUxlZ(vn@Cr2=0Q)d6)eUvmBS+)aFMa)0bUOFbwY@MrG20mOe71?v!m0~MWQtr95}DDeJE7O zD24}NABH$L4s8#1A}(~fv#SdMOiG}gbg!qK>!-J;f7@^mvTg_RzP@278g$9j9cTjf z9YjaK(-rK*12sB8V$l_ZM1#!jq@g>zd)m91nvkb2unX1i33a1T9YzBB2nk*gb1)Db z>W6jd?in<4z&aeVvIGv*)}eY&b3r8c?(zg6;RF5K=!sguJJ{VnFyslrFnZc{k!N41vv&tfh==NoGb;qS z?Y+o@687&xMFe|x7`9Wf!J+m*KatZ0rRgO?I{Vr>J37b}PldHsoEw`4LKkw?&oa0J zR0M`Nr=T_Fo_??x+GDAuViUC^35lVZSr82ejokw~AwWSUmWm8|gPpydfvB<*F~*RR z4I~+}OgDIgo#zkt1Up&&AV9W~Q4#P9ph8`X5w#+ojsZ|jnFR(1!F|MK{tdJbGZvOe z6lFL>tR=NDl?&u}=?TUZ(8xuNzqYQSuC=bQp=Dh9yjqfZ*LckX8C?)3%7ie5I$2A) zdU`=Zq@bpXJyH9<0TtgFTohWIh>C zSO`(*fkatLW-7y$nstz+e4g7@M;nINQV^?5y@v)n+pS=m>^*_5A#0ssW^G>~L@grm z6{Ruw8_|jA=@0a}b}kk>@rX;>5bRCXLY$pQ=x^aC5jF64<-rLlQva^2`^q3tTf z=E~I{Ri8ds9}?t12P@amKq0EUw{r;MQ0RdagofK-j)sQG!&6k`nhgqKTQh(*1l}yT z#;(SY?ONIqOhDc2^0apc`oWrQ5V&ApfNWuqyvbm?q8QH(5?xP!=T1*&|BjyEKtJ)> z6t{ACsCytdx{#rsZ7^@J1(Z=IxuD>fZJP!hL2R_S53~(IrHK^*P%#L*VAva%Jtu-KG8T9jEDK`73U@L>wt?0r z!#CCtnkEHywm05n5BEnbI8dSO86#VW1+{aos&_$*2X+#%U|0tlt%3f~O6oC`EcP^X zq6cPGC60KQrJyS~JrIB%q(t*Jj2el`5LtdtM2nDMq-?{kx~-gTL4d2Xw~K4WxA@p; z6PC`!7imjk8OJRf^>-7uAS`0kM%yN&Gk~_3tB)iJ6>6GN^cv7(Ab&H+fPqG*j*Zk1 zS+!WJA3{XaxLG^b;jtVgOE?4zSrkBvicU-C1w$Td{JMwx0{unkZgg-juNw}s%%B_W zB*TN|AUH4>?4b@$ABcp4M5Fh04k6(Xx*0v4y&WO$98fyS04UmE(a=FNh8;vi+w%bs zYtvYo(Yp1(cJJuv+-X`&${Z3KmhWHpiwbuX!Vbbjj_N%wDB;sZ2zhwRbrYY+sYsY%z(Ai{nU#=Yf9Q-Z2}mH)(I@3 z_K;c(ve<)21sg@8U>Za!wrNGn7IWW*ViMt2wMS;oL1qMCOk7OdcuhhF51MTI6v&3N zL}6x#>t$XeNk(e6c&`-Vf@ zzlv=&Q5Wbuq4Gv|lZ-j!M3#xM2~B)%;!uEKoOZ&h{^$E-ahzZlwNjJQP)YqTJC3v_ z1D#43PwMjxLn5dqb`12Ox8LPjTB;b={J5q%(yfK!Gy0mkmg@S-x{dy3VBg?3L$;R2 z+SVIl%adTabzs57KvIXz+3O!ruS~oOqYV{ySb7e#8=@>nDDjQDsoKn|N zQ|R%ZhLKoHi>I;KQ@63HzRnN7x`yidO*M55>pfLS*U(6V!i{yUK-${KNiC{6Kho8D zKuq-pV6LpHtFLQ4z0gxz*V;fhYk{=V(^T2qT35ZPzOvcVw5hqN5o62Bh8m!4sB5Tg zMlSx1evCVTsJgM~^ya$t8(IsIs1=@tp4R5d8vn-1=2HrZ!bTLi*~3waK_zf_{F^Cp z%ZAGOdJi!qg2S_+vAzbetNft85+hAR4hqf;EcDb=Zme8SC2;XlG+Tlw2Z&Sa{SE%+ z%KAc2OOwC4jvQcJU9-O$1R^Hbjl#nhn9#{+@t?X09*E~=fjZdWXVO7)CH|^OJWPoj zP(s4f+Sm*pSW>pswfGA?mCbc6R0*}sjT?a+RRJDR88?B2hzc=HrIBevlTk|E&{KJ2zC!GB@I?Srcl z^Rxq^4ZCYSSTDRwgb=q=^x^5jdfk4}j?f@*5e#rx2UhG*x?X%eqB)WSrD#Ul5dMQW zk*X7zi-B`M4CB2W@03FTI4Ncm{07*Ea_a#F1Hjk87`7orFJcBkZ!st?$NwtiSR<-1 z+q^0cr;E|xD?(U2K9jDIQ*LI;Ldb0ZRCwaBHzB1*B#zjS;pfuG`Zf$Cl^lMk+P{$GJu-giWKJm-3tYXRgt1il2oDJm!NXgmA{kmtLrOAqKI zUJOA>sD?J-tp{&ZdsJUT$b;Uf&ZzD>u#lN#f$}tI$W2l*j8LMjhhrDNE6Hj?9#r=p z)HO-j28)#>cnDIs61gwMi5m1RMqF2Ri6TFg4Pllj_> zQjOFSkEjLzh@iIsqb%#Rb*I;y!?z59PpddA^*TKaDVpAGd<9#Pr4 zz^$F&RgigQVvx>}ogoWj4Jk{+@Fwa~6p z**yfE@Qjef5OO6w97Ku`XeEo+izn&rHt0wr($_~yP=s|1|NSrVFIp2#uq8+M- z%av@Z*=?v7Q}?bNcO~`s5=wT+)aGJfa%;(8H~}2Ri6ltwCTN5a$6)JIfqtj!VTbu$uk@**CXr z(X=G1oxo4jns&Jpm?=ESxLmFTfZJ{NNYCB&$OG!A4WnKI=^WvqP@=q#%WqmV(=HKZ zuHG364edLS%J75qtBYwO?znM@H)L5%n6c4@o7DcAHgqT3s&>{=w|ry+sGTNxG`*}4 z!c9$43+v*insO;Iw!+{XR>UOwjdV~xREuPJh$6QZ z;%yeu6HB+@kD+=P>4+}kAMtn?Ze!KRrw^Fvz03MV%SCldA(Vz}QX5jby$hGiz092e zQ${pWT@r>UrNli~y897>B#CS#Niy-3!cCc|=Ss3n5>5Q@a0^15h?a~fChoQ)o+*c$ zV?SduEe1)skxIhl>dtmxrSv3=Bn^f;R4Qs|$W|L3QSXexI`DPQWj2X5agTDDlb zZ>XcN_}0&r8zaHQ5#j~WZt8)!LwOTt+@84y^cpE9E|27`TiY&gkH?Y3d^WigJ&DpA zK2ooGC+H#`2V*$v*0SL*QBS-jnILX@EWb_5PQ0TsMm2#rVETcs^@x}BSb7Qf`M}r1 zJfgmrv46$_#mWs~rS_RpkWL#79off7)E6NR3?LQp+AUcCdOV0y8QC@MzAJwNkgs9n z;nEVdk#6a!O*c~O>T*=Rsm#$H50z`I8i?A98njBaXmcCz-->@~hg;a1%!}zCwE%Oh z?9H>>=mMo=om>vNG*NAl6q>e#tOL~|#T#9tv06+wGLXfMAHi;bA89=0wFp?K%{wvf zyH=Joo}`G{K;pYQf-+n+7AFLpWW!wt@~wjTpwN3s*a0^*sdMQd=Ewv8i6%(i4SL(?-MG`ZT@S_*x;$PE?al z7M)v2%qCGZWYQIeX!tEy*sj5W{7>yk%oo*k1dLPt&QY1X{WGjuNQiyAjsV79axHe#bZ70PbE>Rzd zLP!dYEueaB0}T{Ht+yM4deGE|ruZI61?h&-Sh5<%m-;oNd6c_}?b2#$AhwpM7ZcCz z_&CRt1fw^ko1}x3kC7Vc5g3b1nrQ0Ll+4tZ+rx}<#PolTB^}0^Q-6=7V<(;@Bh(Y5 z-fVwFo?~mbl6gn`2x8Bsv122xpUWMp4XX8RjNi0wl!GZzCqj*%X}`DOjap>VBI8dw zMO>i%EA=->Z+0Tg%+FB$7!Jg?d!*MSYeYZACQ6MSko1r2ff)|C^*1)Jq8y-+S~JEm zb!Z)E{6_7B2PavP#U^*nsP?0YDWW;P5Oc#&W~?gJ5w!%S4h;v0PPfP8_7L3`#K;7V zVmn#3-5NCQW_;OcR+B6fNrWpERM)Nzb8#NO^dyreC(|#Ycef9`%l27JYegZZ{#**9 z{Xi4u+6I%3%AUv$QCyND({hkb_cCTTwL72S#-UblbRXQ5)Qo%HS!s>6aL03Q>0M5d z9=f9mm$Q@?(Mz&v>|6*l6YglFgxl%{l-A5*P^}Zzlcm_i^dpeZD7N zccz^n>p9lAWGsmzNi)*)ZpI+Q-D8bHsLw^Z8>@XrVq6WS+H~c?%r%%%myzN49*5~c zo4G!hYLhxq-@6!?TUpYmH%b&xIb9BsOt|Af(+iB3QMXS>bdszU;c3RGgo`ZI1%T8x zxqVyWMK@Xrl9YbLCyrBV9i7V~sW&qjrq68T&q!yK2Q)gMc8FjP;!|Fxeux?_1bn|mdV5n$g%+w1YDTNI?^rzHX4{FJdr={;kS4@sk`D+GURHEouIodM1^YgLe59%3F z+eZC|3s7HXtVy;Y+Fn!bk<^(sDsgKV-~PEhJy#+~6N30sUZ#%~?f+G?oWyHM>}bi= z0iz!Vhv^N_d|k9Z-4EKSe%!IC+jhkF6O2TXe7jOYwx3Gtjxk(mp_qo3ZmUjQrh0Ts z<<@rW+*KLZx6#=sPM72H{mJ8%Jen%D#fk03MPtx!Xf9pR8XrBXFf(|jO?F4~#@?FJ zkS#T(G#X4TGu1y?29g4r3n0xWoiSQR+G=J%s5VRpSr4j<<4L^1dI79hC**=^!Q@RA zcRO&<{0d2E2ltwyB_w%@?-Lq1NX(BD<+HJp(OeR9n(D%}LvCC%Px0cYqc_ z`AqZsCZ~8w94p6I{H}z>jvxO2KTkHcOhl!qH8RR+5S5YnF!xuRM7<1C)1*_>{!&}e zkD4(y!mX^sCEJ3~ zR{TQWh&2PPh+%LvBOd*NcRG9sH?2x&;I~r{pT>tIy?${T=ivu7%C8amQQjNjOTYY4 zo)nK#P&qc?o!sl;S7q~SKq|_Y;?sDP>WnCDg?}{Hc&Z4q$&V;AoT)|`49%6mO}`Bj zuG2Yxnh|Y9zAl}_Iij=@|4o3+2&LaCHz5_hk?$rvn-I_ZZb_JlDx#L=RvW;RW`3>* zR-(ZC-f4J6W9TO2O)=Jku2!aka-z~vOyWu_!f7=OrKem^VP8WT@q}ubXo+H>_Mh@L zbP)eHTYR)qfXZKwFJU$kGMWxri_wTUlq=z;l{kj?#5MX&)5w+Kj;Zme1QOLX$c5;o za!2btmR{og=sHLw1FlRFE~*{kM?G_)1^n})MhKJfq4Xp@B;VDRg9fLOZsMvN*YMEH zWKjK`irO@MH~2=Dg37gpc^2im;WJT4azZ(}vn0_vraXyemmZQ?k|kFYqFf;@BT6VI zs%v_q97q#Lk{ZEN3Ujs4OrF8N9b+yHf=cYTBg)lsF^CsNUvXgWWFAarM z%Z3}r$7^iwiLa?~f8SZkeVc8tiL}Cj()YndeYWVVyt_usU3Jz1>lwS|tOY4(bVB1Y zvd$OcNh7ZoZn0?w$z4O&i_-PNm%^#9YsO@OgudI5p5l?MH+bu?mz_W1?_>Xy<)80pf!9xoI6p5b!8P;+prwx2d>2Wv(>oU zkGNmUcB4+5469HN*&w^q1UYU7HLZ~5&5+mAU}3i6{@pXNU;A6)7vksQHqj;>nIzg} zvP{A5{WO^_Gi0V5hYQ2T%L#I#oFpfUtH7Oq$!rmpQ{+^cBd5vf;+H7fLvn_ASk9EQ zaFog%IahjQuAC?HWWJm)7s!P;4{MQJEDPikStyHSv0REfC?3P!?_bFh@u>8P!?IMC z$#PjCm&xUF1$O_hlB;of?;5#QyeQYnN?9ekWVNi3epxGiBOVvO7T*@zYlxk+x8TjXi-bh%ZYAj#FOH;@;uQkx65AHC;R1q9F*tFpbW_&oYb{L?vxkEUGhTt9{FDRKKXw6 z0eO-9pm;@IEPg02k(bI3$;;%2#a?;2yh8j{yo&R<&O_aACwY_~kslTP@?-Mj@)PnZ z`AK=T{FMB({EWOtepX&9KPRsfH$vWy%FpAZjqBwX+&1&oAO)YpYk^OZF#%=j{L6tp1ebTU)~AH9}+v{55!KnTizw_ zmOqsD$RCN{$$RCG<$dxe@_zYK`GEYHd{F*e{8>IEe<2?h7sy}AN93>Mqw+Dx|1R+! z@jmfh`MCVGd_w+4J}G}IpOU|mPs`tnFNyESXXGE`v+|GfIr%5~ynI2vDE}$# zcoGd?G%}_JdEZm4TN6p2#v$<-X%2W9`$#sERs1~WkxOZR)?%^m>#cHYY zsuJZ>rK(Jos|vMDEmtdW&+#g?TAhUR;@7Hms!~;{YE`5Bs#dL68&sV-S)HQl)kd6c zF&U@4Ou-ojIXK^7I!=t3DQ2k#)u@`(sj6AEs8+Q}ZB|>SSH zD}F4#CcZ8vs9y11@jcb2`o&MhhtdAh{pV}MI&ro*7w2l7gA)c{Mvw1ealg1sTrNJM z2E>)(qiRs(sq;m$3aXGAQp0M8+KF?fcc}~2d(?Z?`*2gk2h>ICgX&^+iMmvMNL{8r ztS(nqs4LY+)JN6F)W_8))K%(}>T2~V^=b7Pb&dM0x>kKoU8g>e)2hFqZctxTH>xkG zo79(a|KTm_E9$H2R`oUU1@(1tgZhU0ruvq;O??};0DVV&SA9?2p}w!~R6kI=)m`dt z^+VhX@*{Px`mwrC{Y2fbeu@*Df2JN(KUWW_U#N%0CE`aoVd6vL8ud$Ysd@zGKR>D- zQ;(}(t0&ZN)RXGB>M3!L`ki_jXRbXc{vi&EL+bbH8TAMCtokEP#mmA;_6Njn^(R>P zxguA5T6{))3YPm5u;X79H;d1UtJU-3T5-L&MZKV26rU5Ls;T{YAa3{;Kw= zSJZy>s(MZRO&w6Lt2fl&)j{pzM=iD$)g;(6`pB%Q2NbgIVrh&n@O>Tx7 zG(BC<&@=TcJzLMwbG1k3>Ula(=j-`;fnKN=>BYK0FVTg%NEhp++N(>nPnYU4U9Kzi zGQC`{&@1&Sy;`57*XXr+ovzeXx?0z0zpmBm^#)z1Pu8dCdc9FM=tkY7Pu0!3MYrlr zdb8f5Pt&LCt@;doranubtVR(3?YcvE>Mp%ack3Q~p5Cr|b)W9n1A0)OuY)?I zhxD-Cp?B&F^e%m&evf{yexH87{(!zne^6hnFVUCk59!PFhxO(93Vo&ii2kVlnEtr_ zguY6DQeUkFf08_4WD-`Ud?)eWU)8zDa*s->h%ZU(sLHx9YFy zuj_BmTZS^pEtt`p5b{{S$q^{;7UI z|4cuqf36?Wzt9isU+PEnuk@q(G5xsywSGeXMn9>4tDn-p(@*Q)>u2;I^t1Yp`Z@h4 z{k(obzo`GL_vn}OUi}ySvi_^yr(em&MK`lt@$QYz^vM>~##JCGgRj_jm4=}v}|>ENzsXS_4PndnS%COg^A6lbcF<4kj= zJ2RY_&MarPGsl_hc${2ko|EU~JM*0d&O&FAv)CzcmNpKN|`Mo98HS{d;S9ew|l}%q|(^plb zR1R#zX29(k)$Kh&Z1V2v?Ytnpx?^A{(2ipzhLUUA10c#^@mj22KfHqjfuUr-3H4jj z{Y-kgKa$+$ZmFxX)KytLRhGJHOI@|4uG&&pU6JCq)UA)9Zhahj9JJy~ULQlH&znKK z^Oi01mU>GwHbhezYJ3*EuhQAj76>NS4PoDRXG)zZ1H}Q~Yfap0OL=u=N}Z+TQj4zCGNR0v++dP6#3U^%H>t`jp=CC8+47V| zL*%%|?&1Dzf#7goZ(x}7@Rrn+SduMst1WYDEOTotb89Tt8jH1Nc~T>GL)$8@v6R(V zEHxI3-(vAI7B3_+x!F+O97B1z#aV8#lv^z2{^S;pozXIqd*z&g*H>a$Q(-fzu;i}r zC%4ArV7w9C=1^gCsPHFmGWEF0%Hk%L#iUI^>@ps=DFMGqiC^Fwa~scP_I-tYRvCW! zEx-H~DVvN4ByEcF%Wui{TYCJK9>3*Vtv7iKHjwVfhP0iE*eWjtz~fS^5m_IFMVsAGL-mN*a})+n-Z{`2*er`i?Gs4OC@sw)oEp} zlDU9)<^rCU3ze=RvWih<(^uK_RW^OqvXp>Tl=f(0(%U0cCU-79{uh96aytSU=Zl|@kH>Z_{+maJ+^R`s%!PD|Fd7_zp-p@$_YP2Ltm zp0C7Mk_ux}A9ncKJF{FDA(?8xkCPwq9k*2}~>y&&6QFSX)UYOAf(=2B|;Q&yVXZ<6*$%H=JI z7!*r?nN3}`BBMVrIDoCo1B2b2DFdb);|3BakJV1MeRA!kYlLbn|BZ5$_>FSmxgu#G zsysE8${JgXHMSQ0wif-21;(Z-Imo3jg)U!~9E_Bv#9wZ)lv^z2waFoloe>(z)^g4O z*2A)?!e&%anmiQ2=q;%*`T9yM<_e3s!qT^5Su)PIpsL2Mc^21UV{C@m*bFD&7wa#i zf%O+pHXC@d*}&5^8@5LLs1a*yhNJxQTeAI@F2AMAZ|SNnN#1FU%}&FBolyp)?Ti?k zUB=k#iUt~ShRJ})miTKe5w%t6A>q#*u0LeBhH;VzxJX_&P>|KqS5m@i=_~PhQvyT9?Klm}us1Y3 z7-IIagUBL>C5xPfEaM`wI3AJ3@eEn)G-Po^CW~BII5PpwQD@f>M<36xd>9G8XW-0? zo`DX73I_`G1=#6Q*5*Wo@A- zWk~N*hV)#O9sL7FB-uffk;C$goQ7w{MU-(oqKxAi%GhZrI0jC3} z))_z3S@wC&=o?R?$zIc&#XI)`e7=(MbYnGfK3_XkKF;L z?j_^N9SHOr%zH(Nd0$q-9SvVah2fO9l>47PZ>jBonDKzuXJ!`g$}@m`;y z6Hn9c@}W1*^V*E<2UuleAne{7+@vE?Y z6)}FxtlzR2zvb3%d5qr*>$f7tuhRNe#`slPzp5C&YU@`W<5z3_YNLK7W&~Mkcx0=miUYwl$4peDp}5Yh>jzVG%#{><%RfA5mWAnEMrj5a)GBEK9t(Ii&8tRD6!$D zA5-Fo%>b=^BZ}^ zvpkvGd~b?*gzR%L)w~ael6s1Vg4>la;A8@)5U3}x zkw621MgmO)P9@MxpoKsyflUN96WBuFGyr?df(BnUR=rK&U;nlE*CwC7HmSGD69T*&T1x>5DqcqRxt_b9vNB9I_aQMb=3? zGR~?f-l{0xswmzn#%rgZku0gwP3-lRl}7M*DH>*`aV{)Q&V@UzI>L{b`DzX@Y`}1q^7TEUb>QusX`ZYG$FGACF{FLcUosv*kq8`Up|csdJlxX3sf_ z%RWP?k8;l)xuQ-gQVLC}W@D_3+FuTUWJ27J2R2(wL6t-(sE$fxbyOm2q7qpXmB^YXwKY*{YYeq6 zGm;t!O)CG+5Xq$`ssc693~Qnp`lA{8-3;lMhX~1K(YWQzX!DZF|5HaqdVh0UbIUlFCZg2)-S4d+N={UjZRQ{$&jE`&mwT8 z@-HKBOo;n&1Rkc0HLe+kXt=@&=dx%7jFsHDq$HHA#P5&FgP)mhe>6daRQ}y08Z*kd zNSz{mwAB7+_0|$=)66d^?20fT=Jyl?WJZ2cp;+cu6?R49$Na=X@lTIs6Bl54Os>(g z)J6rUmSx-g{6e_5y0S4Y`dbYA4Lep))h7FgF!XItZKbJP8{{onPL?b)&`0O@LQ3#r zIwXislVo`COi6pHnIJ*{uWCgyM2<$%s6%>y|MWm7fgWH6JwPfw(D$JSdO!3)|A!vv0nr0}AbOw| zL=W_X=z*RPJFxc!1%dP|t;(;s`-07&;6w9SI+j38Hpvn8aZUt58kZDdszWli(VqOa#wH$X5Js z#(y*Z8}OgP_tevgR$i=XUB`J#tZ5}0q||+l2L&&wHOrQo})DH_++e7 zbw6^=k+ryE6m_u=(l6xW_@^s0{~J%r9Q`mQS6f1bsu~v5~*5S^>irZqWsa=WH zv$b&7V?}H|R>Gc*HLvGkUF#04VZ9hDRX>hZsMpCGv8wc&SUQ7`xjTu4137*geGXREFgYiy6*lIDz4MhM5das`2C&huLQa!^uqBhtxBmYC5^) zRqW1S|34|%R++}`i^*SHtbPXgA%gN-9KVp^B!;s&=F1HCF#NoN)ss2w{wG1XgWU%h zh8e!b{y9Vs*1zIzE8JR0?nz8x3&RZzdkBh4IR1ASPLPKXKb!Gf%077v=d;gUoGMcu zM4Scea|xGj64qc!IZ6E-*j`t#v~niHBDD(cdF;+$n8|P@LoY$p2*s~pxPX1GX7@&h zSf`87Vute>7BS3Ym_kq-V0Qt#UuE|>?EX8$XBqyB;Ho=T-GlgP(`ugQqOi3aMS4es-i*i)TouvD(_JD#ROD1ziAro`6-)4Y;Yhm2{akISBb_CC-G=zRD>K z%NcHExQL+m6ua9Qp3FWUV|Oycc?@?jY+`sSLGc-OuVt9ca3aI?3^N!S%qip+N7!cu zL&Y$c;RJ?0hUo;wXBqx8JQMDV+3gSKfc}{r=XQp(8BXHR_kjLl?9A zp9~K$d@4-$u)fNn0}K~1%;(TI**%l-+|BMxhWD_~B^>8<_LhOBg3T(7cxv^SU^zhXZJbmKFsi0hW{eCV)F{RRWB2L5|Z$2^aiqHq#u6r6_oy2 zbt$Yxj=C1^LH4;t{sZpYGz~B*gXM=800>c;d+KQGrWSJ_zJuI49&fnZ?eCM za~1nv&hQk5#S9A=vW8adTTZsl_6VSD0$L~jD^JSnzmcEG1NY6MPG=C0*+L7p@dE4L z$>#wfm)*>Ls0!>nzZrWA4q}hbB3UJyuv?}Vz4oinXTJ|SJl?|oiZbk2xB#v8jcBc( zRBvE~dNEdw@4!m!uVB^nomffzjD8twlslY@orj!9ou{4WoITEKN!dxhq?)9Ylg>@* zPr5eg>q!rwk32KHSCocd66N6+WWE?L=ZkrA0sa??scKsIfXWR&s0zh6RfK&N$sD^J zzSF{QBjkRBU?XQ3hPgktz#) z%+l~HNOcJKo>uemED}=)pAG_Nl9(Poj5PZZ@;1`tBQzB>Ob;If9h8Pb4k2V3hiJro z3vZctbA&?J1F8t6bKw7^%Htd!H9jU^gye-^P=(}12@FDp^_@I0-{EFO*R1!W1 zahL6%;QxI1WrV$futW0C;iu&uJYT~5-te>XWl-^{@UtStVmO3YhdIXH@BxG#M(9EG zik}bf2M!87gwVH>j-_5LtX4d1*Lr!p~RP0z|Uyf*wDiwL;f9D4}ur}K;DP& z|7Q43q~9z535pNH|7~#8Q20Uw&tb$ogjf_~FG3G97YGM&!3}v4x;j1l6nZJs!*@ak zAHtYyI(Rb^|K;KRkl2?%=K|c4T7cV~mxu{^D@IWi=W$5fei1^sGEoa|eUqFVB%Y%- z_JHQ+kl#M!w+EE$0VQ{Wl6_*5d>VH&KZAcGi*KN|kDwlpptc_Zh9ju$*MMa|YWpo< zIs^{94s0)?#IFL&Ur^#Vsl?#v3#dPmPsn8q=c&}Mi;41i=>H31j(idSe+Iric)o;~ zdqMSIz^lK*eGvHnfjhSkK?dFw*=T#xkk4WHHgtvZkkH>$p>#0(no|)*%LIrv4)6`3 zoTBg%rxf~-<`lwJ6h7z_hYvYR!*4m>@ZTIC(v*h(;gp3BJLTcmL<(ZOhS0+Z-RG1b zg%2r8!*3wQTf#x;n;hyx4EQ3KBC0vSe*o`cq&SQe6o%VZ;Y)cR0p=qj9r+(%pJMnd z#lJWF6yonge8T<)VjX76DVJB7O3+QdA{jofS-M^Phd9L1gW-KB`5OqOy!Hv@TLW7p zN}HBFiCvy(C&LHAcZBx=-Xms-8c>poR_Oo82a^52_zAxfeh}Hu`d=g=VbmRg?G)FPw6Mouwpw}hBFNbdz6VOZe4}HQr(-Pl>wQnKFxw6gYtUI0Gf7x53y9FsegIt$dN+oT4!gRvyNqdg|W zD+6Vp5Lbf}Mn{bLpl@;j{C|b(=9TbE;pZ?KMoCa!NF72Tr6zB~0o3D5@c9+m>4-E& zu|-_T2u(uI8+a&1_&LE9Xt<(&ko-nz7F4yn;2um z@OQ({BgIqUkA-i7UHlEK3qIk;!Zf#gLLcPxO!xsr%{+E=E0YN#p_l#!>RE*Eiwk5* z;(TIWSYnUFS}E8%2eoV@maJ>UzK4HJ32liS<`m7HCHka8XUMXpxE9hx!uWzeMncBc zy+kO-^do8o#;N~+4V3;Mu)OdE&Tut}icxPAL$#Yh--Oe<%kAhyQ9Gl$z^Dwl1g$>q9q)N&if}W>}ab zY#Cn;e-b^B=b`_5!}p-2yeoVuLZ2jr7!hRSoE8!OZesM|2f~kpUq(1Atcij2dtkTr z1K;i8M+i^&XXv#&ojAQs^J)9s7ryye@d(>k;jm*U)5s55nB#q7bq6@e8lXRp*{n4n9A1~grX?zrZChC7; zt{6&UaK@&MT5j+>8`cE#)0l@vJH}rgA-io6r}N+xFJbzVv3RVT^p)D`EYsFlUx%K= z8S@Sfp${1vwk02GUC(Pkrzgr z=5uUmra0lpY}DgE3@*1%a=hra1;nTZG07e!{7`7D6@wHUceH~P@v>rZQ;&S?5B0ys zqGDvKcetUtcbWAqRm zKR`<0e_QxbiW|Nv{MqndXm;vYAC{9t7>z{iUVLn~|3b27-G9dT~Kt6a{QreTd6VTF|w zvrq;rJy91{YvRKaVq~iTVTZ|Y^oK`+E(TZw)Rf6_!RWXneZs#pKBIBFG#OmhdZXWL z%S^KCej??gu<&2W8x{)vdDJG)F1Qho^)$8U=8Dq(*pwbvBK@dirH>B_|IK~p{=GNy zX8Gj4kNr$E9&xENsYqf$-7#C|c>J!dHu4)E7XN0sJfin`A8n=k>H)$zPSnf6MH3N&DI1r zC{}JGZfNf*fcVRL zL$f!BA|wA)wD84*-<6qYUSqh(p4gJ3KL+c>_~L5EN-T$QIQKuuHP+|E+Z`*hBQd5Y z#%weRk`zaujT^NmGy>%qMsiUqV~Zm(5@RRdSRF9$W~3iUVR2Ya+0lC>^cW7K5yyxS z35vHD5%1$WrlKdE?#_|NM+ZMl9D)GXW!`V(8BpwE{FgLS^Lybve3z zFyC(5AqqncGUsgXU>da+ZciaGQEuvJXgrtVTXS1Gu!9LGdECW8u|P@ecsifj)jkiN!ottk`xc5-*mjh-bV5GJrN2vlKLIe!U5UeZLJ> z{$(C}Jq!N>;R^sq+NpR%k++fYSmv#qp|_0Q4KUk2R3y;|NBFBe+DHY5?-&vE4qjth z4L4c5uDHI(d%E&+C9X-bjF7NIZDcHpW4bYqvG14>5(IKTB^kVR;%y+P`F(=uiM>cVsCMIL z%ip2Qm~jVX5PqKEf9n(1mi)IeJ;8h+5&LM=iy1c9v;Wx#zmTGBbw9_p-F75!$c*qP zP55$K!ycN@R5}4$FCEA#rH^r&`}Pz?}Rzn2Sx>+pa*D=&g@3g9GfSx zRvbN$SDf_|8V%Ou@S!e{Nu-=B(EpB3WnumcVe2} zeIE`Iwi~}t9=HEXEgdMi)G zr#6&PjM3H;b9dxV+BbTxARf&-c#BdKFEgg3?ypF$9gZSqI(R01v?fGjy%Sfg)JAH^ zJ@Y{DnFq7@%!4vM^Pn92NoJ!>ScW|4Jcu$r52Aukf>_IEK&;~vA1e8*hiX3Sp_Wg1SkI?C)bYs<4ScdgBcJSWDxd7o%x5~Z@|g~s_)Le* ze1gLkKEdI9KEWZ#Cpd)o1cxC$!C{zBaM*!;FpBO%!7~lLPP%o+gJ1hga3cxs9D#3= zy)Om#q@Z+@Q94?6Hw9&!fb!gg8?%0eZyA@R9Jf#vi3;2i)gqSR9;Xk8<)Hi;u>yB7 zU56cHbTY+BxL@fTVhz*37B?o{FV->rm7w`NQH8rshD0;dc?Rz4n1s8uum@Yye#&Hw zYp2mJV%&-{fOkdrx8Ru#nlS&%p>uG*5AQSvC7(ln-vHKgaH9%R(AgD2tHap)?!Z-n z@=nJ6LNifr%13c`O`UuU_tl&te+Ryu zEuW?vY2>rGkETmL2OeH2U%*{5*Wl8fujy~AEZq0Y=++)Op~@ec%YKluE*P9BMZiCxN8kI~BE= zik+-!_@0FRZ92~T$iR0U;%16U#2trQfM|8cB%~OR`k#Op>+m)SX(!{m9)8(yPr-K@ zo>MXBn}hExyiLQ7^y&DX0zcZ9J`>-K2$_YNn2m2f!skGS=Hlx`xCeK|&BM1qp7S}a1y61eFeIWJ~`iy>J{@h!!h7kW{GZ#m|Feef^EcMJT=U;p zxMyw|zANFk5#?*ZcQx*oYeC8A{?Mt2)eRrILwF+HTZWPj!J<^+)~^qM4;SG(Nqi9B zY}`wAF?J?hf}5$b#TD2Gybiav-3Sa{!gn=v^{e0kokTMgw_V)^PJA1ZHv{)z{Sc+U z2R3OAH2DdX`!~3?%_Dw?yOiePPNf%7;y>d%6}$5H;NC$xzh)}-+rAAh9l^H%ch^a= zkk7Iyh6GO)1-Qd*wkX7%b-7}xwFz`LT@jyUQw(XYgnt$GB73oKz8Udb;yI0zxxI26Xay;CVs4AT~oYSBi1C zU22u6#0^uc#Z=rfb&~Lst^!u+Duh<+YPf53jhKWxr~IM__fFM{)wp|Vy(qv=;tfbu zr|S?0S}j_k)n|xRxNquAkp&BX7WOrst6iA!={~Ri~JYTd2CQ zkGDtnAkKNP&l_+X)podhb+4F?7NSqg#LZOwVm9pSfH)Zza8T6ama6kbE^ev{iU!

;uKu%NE38 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 Cmj74) literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-SemiboldItalic.ttf b/app/assets/fonts/SourceSansPro-SemiboldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2c5ad3008c312162980021fd8dd859edffb32f13 GIT binary patch literal 116424 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 N1W4~xZ@RzZ{{!A)KWP8} literal 0 HcmV?d00001 diff --git a/app/assets/images/ci/arch.jpg b/app/assets/images/ci/arch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e05674e840c6946d5a40f340790289af2dc25f7 GIT binary patch literal 25222 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/ci/loader.gif b/app/assets/images/ci/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fcb8f2da0d283628878cbc74b9dd848109a4535 GIT binary patch literal 4405 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/app/assets/images/ci/service_sample.png b/app/assets/images/ci/service_sample.png new file mode 100644 index 0000000000000000000000000000000000000000..65d29e3fd891b7b8deba8670cb7d74b03056e3d7 GIT binary patch literal 76024 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 z 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 Vw Pager.init 20, true - $(".event_filter_link").bind "click", (event) => + $(".event-filter .btn").bind "click", (event) => event.preventDefault() @toggleFilter($(event.currentTarget)) @reloadActivities() @@ -12,7 +12,7 @@ class @Activities toggleFilter: (sender) -> - sender.parent().toggleClass "active" + sender.toggleClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] if event_filters diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index c263912b7e..8e987ac4e8 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -94,16 +94,18 @@ window.unbindEvents = -> $(document).off('scroll') window.shiftWindow = -> - scrollBy 0, -50 + scrollBy 0, -100 document.addEventListener("page:fetch", unbindEvents) -# Scroll the window to avoid the topnav bar -# https://github.com/twitter/bootstrap/issues/1768 -if location.hash - setTimeout shiftWindow, 1 window.addEventListener "hashchange", shiftWindow +window.onload = -> + # Scroll the window to avoid the topnav bar + # https://github.com/twitter/bootstrap/issues/1768 + if location.hash + setTimeout shiftWindow, 100 + $ -> $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee new file mode 100644 index 0000000000..3ab3ba6675 --- /dev/null +++ b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee @@ -0,0 +1,67 @@ +class @BlobFileDropzone + constructor: (form, method) -> + form_dropzone = form.find('.dropzone') + Dropzone.autoDiscover = false + dropzone = form_dropzone.dropzone( + autoDiscover: false + autoProcessQueue: false + url: form.attr('action') + # Rails uses a hidden input field for PUT + # http://stackoverflow.com/questions/21056482/how-to-set-method-put-in-form-tag-in-rails + method: method + clickable: true + uploadMultiple: false + paramName: "file" + maxFilesize: gon.max_file_size or 10 + parallelUploads: 1 + maxFiles: 1 + addRemoveLinks: true + previewsContainer: '.dropzone-previews' + headers: + "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") + + init: -> + this.on 'addedfile', (file) -> + $('.dropzone-alerts').html('').hide() + commit_message = form.find('#commit_message')[0] + + if /^Upload/.test(commit_message.placeholder) + commit_message.placeholder = 'Upload ' + file.name + + return + + this.on 'removedfile', (file) -> + commit_message = form.find('#commit_message')[0] + + if /^Upload/.test(commit_message.placeholder) + commit_message.placeholder = 'Upload new file' + + return + + this.on 'success', (header, response) -> + window.location.href = response.filePath + return + + this.on 'maxfilesexceeded', (file) -> + @removeFile file + return + + this.on 'sending', (file, xhr, formData) -> + formData.append('commit_message', form.find('#commit_message').val()) + return + + # Override behavior of adding error underneath preview + error: (file, errorMessage) -> + stripped = $("

").html(errorMessage).text(); + $('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show() + @removeFile file + return + ) + + submitButton = form.find('#submit-all')[0] + submitButton.addEventListener 'click', (e) -> + e.preventDefault() + e.stopPropagation() + alert "Please select a file" if dropzone[0].dropzone.getQueuedFiles().length == 0 + dropzone[0].dropzone.processQueue() + return false diff --git a/app/assets/javascripts/ci/Chart.min.js b/app/assets/javascripts/ci/Chart.min.js new file mode 100644 index 0000000000..ab63588108 --- /dev/null +++ b/app/assets/javascripts/ci/Chart.min.js @@ -0,0 +1,39 @@ +var Chart=function(s){function v(a,c,b){a=A((a-c.graphMin)/(c.steps*c.stepValue),1,0);return b*c.steps*a}function x(a,c,b,e){function h(){g+=f;var k=a.animation?A(d(g),null,0):1;e.clearRect(0,0,q,u);a.scaleOverlay?(b(k),c()):(c(),b(k));if(1>=g)D(h);else if("function"==typeof a.onAnimationComplete)a.onAnimationComplete()}var f=a.animation?1/A(a.animationSteps,Number.MAX_VALUE,1):1,d=B[a.animationEasing],g=a.animation?0:1;"function"!==typeof c&&(c=function(){});D(h)}function C(a,c,b,e,h,f){var d;a= +Math.floor(Math.log(e-h)/Math.LN10);h=Math.floor(h/(1*Math.pow(10,a)))*Math.pow(10,a);e=Math.ceil(e/(1*Math.pow(10,a)))*Math.pow(10,a)-h;a=Math.pow(10,a);for(d=Math.round(e/a);dc;)a=dc?c:!isNaN(parseFloat(b))&& +isFinite(b)&&a)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');");return c? +b(c):b}var r=this,B={linear:function(a){return a},easeInQuad:function(a){return a*a},easeOutQuad:function(a){return-1*a*(a-2)},easeInOutQuad:function(a){return 1>(a/=0.5)?0.5*a*a:-0.5*(--a*(a-2)-1)},easeInCubic:function(a){return a*a*a},easeOutCubic:function(a){return 1*((a=a/1-1)*a*a+1)},easeInOutCubic:function(a){return 1>(a/=0.5)?0.5*a*a*a:0.5*((a-=2)*a*a+2)},easeInQuart:function(a){return a*a*a*a},easeOutQuart:function(a){return-1*((a=a/1-1)*a*a*a-1)},easeInOutQuart:function(a){return 1>(a/=0.5)? +0.5*a*a*a*a:-0.5*((a-=2)*a*a*a-2)},easeInQuint:function(a){return 1*(a/=1)*a*a*a*a},easeOutQuint:function(a){return 1*((a=a/1-1)*a*a*a*a+1)},easeInOutQuint:function(a){return 1>(a/=0.5)?0.5*a*a*a*a*a:0.5*((a-=2)*a*a*a*a+2)},easeInSine:function(a){return-1*Math.cos(a/1*(Math.PI/2))+1},easeOutSine:function(a){return 1*Math.sin(a/1*(Math.PI/2))},easeInOutSine:function(a){return-0.5*(Math.cos(Math.PI*a/1)-1)},easeInExpo:function(a){return 0==a?1:1*Math.pow(2,10*(a/1-1))},easeOutExpo:function(a){return 1== +a?1:1*(-Math.pow(2,-10*a/1)+1)},easeInOutExpo:function(a){return 0==a?0:1==a?1:1>(a/=0.5)?0.5*Math.pow(2,10*(a-1)):0.5*(-Math.pow(2,-10*--a)+2)},easeInCirc:function(a){return 1<=a?a:-1*(Math.sqrt(1-(a/=1)*a)-1)},easeOutCirc:function(a){return 1*Math.sqrt(1-(a=a/1-1)*a)},easeInOutCirc:function(a){return 1>(a/=0.5)?-0.5*(Math.sqrt(1-a*a)-1):0.5*(Math.sqrt(1-(a-=2)*a)+1)},easeInElastic:function(a){var c=1.70158,b=0,e=1;if(0==a)return 0;if(1==(a/=1))return 1;b||(b=0.3);ea?-0.5*e*Math.pow(2,10* +(a-=1))*Math.sin((1*a-c)*2*Math.PI/b):0.5*e*Math.pow(2,-10*(a-=1))*Math.sin((1*a-c)*2*Math.PI/b)+1},easeInBack:function(a){return 1*(a/=1)*a*(2.70158*a-1.70158)},easeOutBack:function(a){return 1*((a=a/1-1)*a*(2.70158*a+1.70158)+1)},easeInOutBack:function(a){var c=1.70158;return 1>(a/=0.5)?0.5*a*a*(((c*=1.525)+1)*a-c):0.5*((a-=2)*a*(((c*=1.525)+1)*a+c)+2)},easeInBounce:function(a){return 1-B.easeOutBounce(1-a)},easeOutBounce:function(a){return(a/=1)<1/2.75?1*7.5625*a*a:a<2/2.75?1*(7.5625*(a-=1.5/2.75)* +a+0.75):a<2.5/2.75?1*(7.5625*(a-=2.25/2.75)*a+0.9375):1*(7.5625*(a-=2.625/2.75)*a+0.984375)},easeInOutBounce:function(a){return 0.5>a?0.5*B.easeInBounce(2*a):0.5*B.easeOutBounce(2*a-1)+0.5}},q=s.canvas.width,u=s.canvas.height;window.devicePixelRatio&&(s.canvas.style.width=q+"px",s.canvas.style.height=u+"px",s.canvas.height=u*window.devicePixelRatio,s.canvas.width=q*window.devicePixelRatio,s.scale(window.devicePixelRatio,window.devicePixelRatio));this.PolarArea=function(a,c){r.PolarArea.defaults={scaleOverlay:!0, +scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleShowLine:!0,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleFontFamily:"'Arial'",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animation:!0,animationSteps:100,animationEasing:"easeOutBounce", +animateRotate:!0,animateScale:!1,onAnimationComplete:null};var b=c?y(r.PolarArea.defaults,c):r.PolarArea.defaults;return new G(a,b,s)};this.Radar=function(a,c){r.Radar.defaults={scaleOverlay:!1,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleShowLine:!0,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!1,scaleLabel:"<%=value%>",scaleFontFamily:"'Arial'",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)", +scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,angleShowLineOut:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:12,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,animation:!0,animationSteps:60,animationEasing:"easeOutQuart",onAnimationComplete:null};var b=c?y(r.Radar.defaults,c):r.Radar.defaults;return new H(a,b,s)};this.Pie=function(a, +c){r.Pie.defaults={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animation:!0,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,onAnimationComplete:null};var b=c?y(r.Pie.defaults,c):r.Pie.defaults;return new I(a,b,s)};this.Doughnut=function(a,c){r.Doughnut.defaults={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animation:!0,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1, +onAnimationComplete:null};var b=c?y(r.Doughnut.defaults,c):r.Doughnut.defaults;return new J(a,b,s)};this.Line=function(a,c){r.Line.defaults={scaleOverlay:!1,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleFontFamily:"'Arial'",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,bezierCurve:!0, +pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:2,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,animation:!0,animationSteps:60,animationEasing:"easeOutQuart",onAnimationComplete:null};var b=c?y(r.Line.defaults,c):r.Line.defaults;return new K(a,b,s)};this.Bar=function(a,c){r.Bar.defaults={scaleOverlay:!1,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleFontFamily:"'Arial'", +scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,animation:!0,animationSteps:60,animationEasing:"easeOutQuart",onAnimationComplete:null};var b=c?y(r.Bar.defaults,c):r.Bar.defaults;return new L(a,b,s)};var G=function(a,c,b){var e,h,f,d,g,k,j,l,m;g=Math.min.apply(Math,[q,u])/2;g-=Math.max.apply(Math,[0.5*c.scaleFontSize,0.5*c.scaleLineWidth]); +d=2*c.scaleFontSize;c.scaleShowLabelBackdrop&&(d+=2*c.scaleBackdropPaddingY,g-=1.5*c.scaleBackdropPaddingY);l=g;d=d?d:5;e=Number.MIN_VALUE;h=Number.MAX_VALUE;for(f=0;fe&&(e=a[f].value),a[f].valuel&&(l=h);g-=Math.max.apply(Math,[l,1.5*(c.pointLabelFontSize/2)]);g-=c.pointLabelFontSize;l=g=A(g,null,0);d=d?d:5;e=Number.MIN_VALUE; +h=Number.MAX_VALUE;for(f=0;fe&&(e=a.datasets[f].data[m]),a.datasets[f].data[m]Math.PI?"right":"left";b.textBaseline="middle";b.fillText(a.labels[d],f,-h)}b.restore()},function(d){var e=2*Math.PI/a.datasets[0].data.length;b.save();b.translate(q/2,u/2);for(var g=0;gt?e:t;q/a.labels.lengthe&&(e=a.datasets[f].data[l]),a.datasets[f].data[l]d?h:d;d+=10}r=q-d-t;m=Math.floor(r/(a.labels.length-1));n=q-t/2-r;p=g+c.scaleFontSize/2;x(c,function(){b.lineWidth=c.scaleLineWidth;b.strokeStyle=c.scaleLineColor;b.beginPath();b.moveTo(q-t/2+5,p);b.lineTo(q-t/2-r-5,p);b.stroke();0t?e:t;q/a.labels.lengthe&&(e=a.datasets[f].data[l]),a.datasets[f].data[l]< +h&&(h=a.datasets[f].data[l]);f=Math.floor(g/(0.66*d));d=Math.floor(0.5*(g/d));l=c.scaleShowLabels?c.scaleLabel:"";c.scaleOverride?(j={steps:c.scaleSteps,stepValue:c.scaleStepWidth,graphMin:c.scaleStartValue,labels:[]},z(l,j.labels,j.steps,c.scaleStartValue,c.scaleStepWidth)):j=C(g,f,d,e,h,l);k=Math.floor(g/j.steps);d=1;if(c.scaleShowLabels){b.font=c.scaleFontStyle+" "+c.scaleFontSize+"px "+c.scaleFontFamily;for(e=0;ed?h:d;d+=10}r=q-d-t;m= +Math.floor(r/a.labels.length);s=(m-2*c.scaleGridLineWidth-2*c.barValueSpacing-(c.barDatasetSpacing*a.datasets.length-1)-(c.barStrokeWidth/2*a.datasets.length-1))/a.datasets.length;n=q-t/2-r;p=g+c.scaleFontSize/2;x(c,function(){b.lineWidth=c.scaleLineWidth;b.strokeStyle=c.scaleLineColor;b.beginPath();b.moveTo(q-t/2+5,p);b.lineTo(q-t/2-r-5,p);b.stroke();0 + event.preventDefault() + + descr = $(this).closest('.runner-description').first() + descr.addClass('hide') + form = descr.next('.runner-description-form') + descrInput = form.find('input.description') + originalValue = descrInput.val() + form.removeClass('hide') + form.find('.cancel').on 'click', (event) -> + event.preventDefault() + + form.addClass('hide') + descrInput.val(originalValue) + descr.removeClass('hide') + +$(document).on 'click', '.assign-all-runner', -> + $(this).replaceWith(' Assign in progress..') + +window.unbindEvents = -> + $(document).unbind('scroll') + $(document).off('scroll') + +document.addEventListener("page:fetch", unbindEvents) diff --git a/app/assets/javascripts/ci/build.coffee b/app/assets/javascripts/ci/build.coffee new file mode 100644 index 0000000000..c30859b484 --- /dev/null +++ b/app/assets/javascripts/ci/build.coffee @@ -0,0 +1,41 @@ +class CiBuild + @interval: null + + constructor: (build_url, build_status) -> + clearInterval(CiBuild.interval) + + if build_status == "running" || build_status == "pending" + # + # Bind autoscroll button to follow build output + # + $("#autoscroll-button").bind "click", -> + state = $(this).data("state") + if "enabled" is state + $(this).data "state", "disabled" + $(this).text "enable autoscroll" + else + $(this).data "state", "enabled" + $(this).text "disable autoscroll" + + # + # Check for new build output if user still watching build page + # Only valid for runnig build when output changes during time + # + CiBuild.interval = setInterval => + if window.location.href is build_url + $.ajax + url: build_url + dataType: "json" + success: (build) => + if build.status == "running" + $('#build-trace code').html build.trace_html + $('#build-trace code').append '' + @checkAutoscroll() + else + Turbolinks.visit build_url + , 4000 + + checkAutoscroll: -> + $("html,body").scrollTop $("#build-trace").height() if "enabled" is $("#autoscroll-button").data("state") + +@CiBuild = CiBuild diff --git a/app/assets/javascripts/ci/pager.js.coffee b/app/assets/javascripts/ci/pager.js.coffee new file mode 100644 index 0000000000..226fbd654a --- /dev/null +++ b/app/assets/javascripts/ci/pager.js.coffee @@ -0,0 +1,42 @@ +@CiPager = + init: (@url, @limit = 0, preload, @disable = false) -> + if preload + @offset = 0 + @getItems() + else + @offset = @limit + @initLoadMore() + + getItems: -> + $(".loading").show() + $.ajax + type: "GET" + url: @url + data: "limit=" + @limit + "&offset=" + @offset + complete: => + $(".loading").hide() + success: (data) => + CiPager.append(data.count, data.html) + dataType: "json" + + append: (count, html) -> + if count > 1 + $(".content-list").append html + if count == @limit + @offset += count + else + @disable = true + + initLoadMore: -> + $(document).unbind('scroll') + $(document).endlessScroll + bottomPixels: 400 + fireDelay: 1000 + fireOnce: true + ceaseFire: -> + CiPager.disable + + callback: (i) => + unless $(".loading").is(':visible') + $(".loading").show() + CiPager.getItems() diff --git a/app/assets/javascripts/ci/projects.js.coffee b/app/assets/javascripts/ci/projects.js.coffee new file mode 100644 index 0000000000..7e028b4e11 --- /dev/null +++ b/app/assets/javascripts/ci/projects.js.coffee @@ -0,0 +1,6 @@ +$(document).on 'click', '.badge-codes-toggle', -> + $('.badge-codes-block').toggleClass("hide") + return false + +$(document).on 'click', '.sync-now', -> + $(this).find('i').addClass('fa-spin') diff --git a/app/assets/javascripts/commit/image-file.js.coffee b/app/assets/javascripts/commit/image-file.js.coffee index 9e5f49b1f6..9c723f51e5 100644 --- a/app/assets/javascripts/commit/image-file.js.coffee +++ b/app/assets/javascripts/commit/image-file.js.coffee @@ -119,8 +119,9 @@ class @ImageFile requestImageInfo: (img, callback) -> domImg = img.get(0) - if domImg.complete - callback.call(this, domImg.naturalWidth, domImg.naturalHeight) - else - img.on 'load', => + if domImg + if domImg.complete callback.call(this, domImg.naturalWidth, domImg.naturalHeight) + else + img.on 'load', => + callback.call(this, domImg.naturalWidth, domImg.naturalHeight) diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 81e7379927..5bf0b30217 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -51,10 +51,10 @@ class Dispatcher MergeRequests.init() when 'dashboard:show', 'root:show' new Dashboard() + when 'dashboard:activity' new Activities() when 'dashboard:projects:starred' new Activities() - new ProjectsList() when 'projects:commit:show' new Commit() new Diff() @@ -69,7 +69,6 @@ class Dispatcher when 'groups:show' new Activities() shortcut_handler = new ShortcutsNavigation() - new ProjectsList() when 'groups:group_members:index' new GroupMembers() new UsersSelect() @@ -95,8 +94,6 @@ class Dispatcher when 'users:show' new User() new Activities() - when 'admin:users:show' - new ProjectsList() switch path.first() when 'admin' diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index a0dcaa8c27..6f789e668a 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -167,6 +167,7 @@ class @DropzoneInput dataType: "json" ).success (data) -> preview.html data.body + preview.syntaxHighlight() renderReferencedUsers data.references.users diff --git a/app/assets/javascripts/issuable_context.js.coffee b/app/assets/javascripts/issuable_context.js.coffee index 176d9cabef..c4d3e619f5 100644 --- a/app/assets/javascripts/issuable_context.js.coffee +++ b/app/assets/javascripts/issuable_context.js.coffee @@ -11,12 +11,13 @@ class @IssuableContext $(this).submit() $('.issuable-details').waitForImages -> + $('.issuable-affix').on 'affix.bs.affix', -> + $(@).width($(@).outerWidth()) + .on 'affixed-top.bs.affix affixed-bottom.bs.affix', -> + $(@).width('') + $('.issuable-affix').affix offset: top: -> @top = ($('.issuable-affix').offset().top - 70) bottom: -> @bottom = $('.footer').outerHeight(true) - $('.issuable-affix').on 'affix.bs.affix', -> - $(@).width($(@).outerWidth()) - .on 'affixed-top.bs.affix affixed-bottom.bs.affix', -> - $(@).width('') diff --git a/app/assets/javascripts/merge_request_widget.js.coffee b/app/assets/javascripts/merge_request_widget.js.coffee index 5ab91261d7..995a2f2409 100644 --- a/app/assets/javascripts/merge_request_widget.js.coffee +++ b/app/assets/javascripts/merge_request_widget.js.coffee @@ -19,7 +19,7 @@ class @MergeRequestWidget when 'merged' location.reload() else - setTimeout(merge_request_widget.mergeInProgress, 3000) + setTimeout(merge_request_widget.mergeInProgress, 2000) dataType: 'json' getMergeStatus: -> diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 0021d17d85..ce638c2641 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -122,7 +122,9 @@ class @Notes # or skip if rendered if @isNewNote(note) @note_ids.push(note.id) - $('ul.main-notes-list').append(note.html) + $('ul.main-notes-list'). + append(note.html). + syntaxHighlight() @initTaskList() ### diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee index 39a433dfc9..0ea8fffce0 100644 --- a/app/assets/javascripts/project.js.coffee +++ b/app/assets/javascripts/project.js.coffee @@ -24,3 +24,19 @@ class @Project $.cookie('hide_no_password_message', 'false', { path: path }) $(@).parents('.no-password-message').remove() e.preventDefault() + + $('.update-notification').on 'click', (e) -> + e.preventDefault() + notification_level = $(@).data 'notification-level' + $('#notification_level').val(notification_level) + $('#notification-form').submit() + label = null + switch notification_level + when 0 then label = ' Disabled ' + when 1 then label = ' Participating ' + when 2 then label = ' Watching ' + when 3 then label = ' Global ' + when 4 then label = ' On Mention ' + $('#notifications-button').empty().append("" + label + "") + $(@).parents('ul').find('li.active').removeClass 'active' + $(@).parent().addClass 'active' \ No newline at end of file diff --git a/app/assets/javascripts/projects_list.js.coffee b/app/assets/javascripts/projects_list.js.coffee index c0e36d1ccc..db5faf71fa 100644 --- a/app/assets/javascripts/projects_list.js.coffee +++ b/app/assets/javascripts/projects_list.js.coffee @@ -8,7 +8,7 @@ class @ProjectsList $(".projects-list-filter").keyup -> terms = $(this).val() - uiBox = $(this).closest('.panel') + uiBox = $(this).closest('.projects-list-holder') if terms == "" || terms == undefined uiBox.find(".projects-list li").show() else diff --git a/app/assets/javascripts/syntax_highlight.coffee b/app/assets/javascripts/syntax_highlight.coffee new file mode 100644 index 0000000000..980f0232d1 --- /dev/null +++ b/app/assets/javascripts/syntax_highlight.coffee @@ -0,0 +1,20 @@ +# Syntax Highlighter +# +# Applies a syntax highlighting color scheme CSS class to any element with the +# `js-syntax-highlight` class +# +# ### Example Markup +# +#
+# +$.fn.syntaxHighlight = -> + if $(this).hasClass('js-syntax-highlight') + # Given the element itself, apply highlighting + $(this).addClass(gon.user_color_scheme) + else + # Given a parent element, recurse to any of its applicable children + $children = $(this).find('.js-syntax-highlight') + $children.syntaxHighlight() if $children.length + +$(document).on 'ready page:load', -> + $('.js-syntax-highlight').syntaxHighlight() diff --git a/app/assets/javascripts/zen_mode.js.coffee b/app/assets/javascripts/zen_mode.js.coffee index 8a0564a909..a1462cf3ca 100644 --- a/app/assets/javascripts/zen_mode.js.coffee +++ b/app/assets/javascripts/zen_mode.js.coffee @@ -38,6 +38,8 @@ class @ZenMode @active_checkbox = $(checkbox) @active_checkbox.prop('checked', true) @active_zen_area = @active_checkbox.parent().find('textarea') + # Prevent a user-resized textarea from persisting to fullscreen + @active_zen_area.removeAttr('style') @active_zen_area.focus() exitZenMode: => diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 1a5f11df7d..d9ede63794 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -12,6 +12,7 @@ */ +@import "base/fonts"; @import "base/variables"; @import "base/mixins"; @import "base/layout"; @@ -60,3 +61,9 @@ * Styles for JS behaviors. */ @import "behaviors.scss"; + +/** + * CI specific styles: + */ +@import "ci/**/*"; + diff --git a/app/assets/stylesheets/base/fonts.scss b/app/assets/stylesheets/base/fonts.scss new file mode 100644 index 0000000000..e214567eca --- /dev/null +++ b/app/assets/stylesheets/base/fonts.scss @@ -0,0 +1,25 @@ +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf'); +} diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss index 21acbfa5e5..eb8d23d645 100644 --- a/app/assets/stylesheets/base/gl_bootstrap.scss +++ b/app/assets/stylesheets/base/gl_bootstrap.scss @@ -85,14 +85,14 @@ // Labels .label { padding: 2px 4px; - font-size: 12px; + font-size: 13px; font-style: normal; font-weight: normal; display: inline-block; &.label-gray { - background-color: #eee; - color: #999; + background-color: #f8fafc; + color: $gl-gray; text-shadow: none; } @@ -156,10 +156,16 @@ * Add some extra stuff to panels * */ -.panel { - .panel-heading { - font-weight: bold; +.container-blank .panel .panel-heading { + font-size: 17px; + line-height: 38px; +} + +.panel { + box-shadow: none; + + .panel-heading { .panel-head-actions { position: relative; top: -5px; @@ -182,6 +188,10 @@ .pagination { margin: 0; } + + .btn { + min-width: 124px; + } } &.panel-small { @@ -209,6 +219,12 @@ } } +.alert-help { + background-color: $background-color; + border: 1px solid $border-color; + color: $gl-gray; +} + // Typography ================================================================= .text-primary, diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 56f4c794e1..7378d40400 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -22,6 +22,10 @@ $brand-info: $gl-info; $brand-warning: $gl-warning; $brand-danger: $gl-danger; +$border-radius-base: 3px !default; +$border-radius-large: 5px !default; +$border-radius-small: 2px !default; + //== Scaffolding // @@ -42,17 +46,18 @@ $font-size-base: $gl-font-size; // //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). -$padding-base-vertical: 6px; -$padding-base-horizontal: 14px; - +$padding-base-vertical: 9px; +$padding-base-horizontal: $gl-padding; +$component-active-color: #fff; +$component-active-bg: $brand-info; //== Forms // //## $input-color: $text-color; -$input-border: #DDD; -$input-border-focus: $brand-info; +$input-border: #e7e9ed; +$input-border-focus: #7F8FA4; $legend-color: $text-color; @@ -60,20 +65,20 @@ $legend-color: $text-color; // //## -$pagination-color: #fff; -$pagination-bg: $brand-success; +$pagination-color: $gl-gray; +$pagination-bg: $background-color; $pagination-border: transparent; $pagination-hover-color: #fff; -$pagination-hover-bg: darken($brand-success, 15%); +$pagination-hover-bg: $brand-info; $pagination-hover-border: transparent; $pagination-active-color: #fff; -$pagination-active-bg: darken($brand-success, 15%); +$pagination-active-bg: $brand-info; $pagination-active-border: transparent; -$pagination-disabled-color: #b4bcc2; -$pagination-disabled-bg: lighten($brand-success, 15%); +$pagination-disabled-color: #fff; +$pagination-disabled-bg: lighten($brand-info, 15%); $pagination-disabled-border: transparent; @@ -109,11 +114,12 @@ $alert-border-radius: 0; // //## -$panel-border-radius: 0; -$panel-default-text: $text-color; -$panel-default-border: $border-color; -$panel-default-heading-bg: $background-color; - +$panel-border-radius: 2px; +$panel-default-text: $text-color; +$panel-default-border: $border-color; +$panel-default-heading-bg: $background-color; +$panel-footer-bg: $background-color; +$panel-inner-border: $border-color; //== Wells // @@ -131,3 +137,22 @@ $code-bg: #f9f2f4; $kbd-color: #fff; $kbd-bg: #333; + +//== Buttons +// +//## +$btn-default-color: $gl-text-color; +$btn-default-bg: #fff; +$btn-default-border: #e7e9ed; + +//== Nav +// +//## +$nav-link-padding: 13px $gl-padding; + +//== Code +// +//## +$pre-bg: #f8fafc !default; +$pre-color: $gl-gray !default; +$pre-border-color: #e7e9ed; diff --git a/app/assets/stylesheets/base/layout.scss b/app/assets/stylesheets/base/layout.scss index 690d89a5c1..b91c15d891 100644 --- a/app/assets/stylesheets/base/layout.scss +++ b/app/assets/stylesheets/base/layout.scss @@ -20,3 +20,7 @@ html { .navless-container { margin-top: 30px; } + +.container-limited { + max-width: $fixed-layout-width; +} diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 7beef1845e..a2f6c3e21f 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -55,8 +55,11 @@ } @mixin md-typography { - font-size: 15px; - line-height: 1.5; + color: $md-text-color; + + a { + color: $md-link-color; + } img { max-width: 100%; @@ -157,3 +160,94 @@ white-space: nowrap; max-width: $max_width; } + +/* + * Base mixin for lists in GitLab + */ +@mixin basic-list { + margin: 5px 0px; + padding: 0px; + list-style: none; + + > li { + padding: 10px 0; + border-bottom: 1px solid #EEE; + overflow: hidden; + display: block; + margin: 0px; + + &:last-child { + border-bottom: none; + } + + &.active { + background: #f9f9f9; + a { + font-weight: bold; + } + } + + &.hide { + display: none; + } + + &.light { + a { + color: $gl-gray; + } + } + } +} + +@mixin input-big { + height: 36px; + padding: 5px 10px; + font-size: 16px; + line-height: 24px; + color: #7f8fa4; + background-color: #fff; + border-color: #e7e9ed; +} + +@mixin btn-big { + height: 36px; + padding: 5px 10px; + font-size: 16px; + line-height: 24px; +} + +@mixin nav-menu { + padding: 0; + margin: 0; + list-style: none; + margin-top: 5px; + height: 56px; + + li { + display: inline-block; + + a { + padding: 14px; + font-size: 17px; + line-height: 28px; + color: #7f8fa4; + border-bottom: 2px solid transparent; + + &:hover, &:active, &:focus { + text-decoration: none; + } + } + + &.active a { + color: #4c4e54; + border-bottom: 2px solid #1cacfc; + } + + .badge { + font-weight: normal; + background-color: #fff; + background-color: #eee; + color: #78a; + } + } +} diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index cb439a0e0b..2fc7bf1720 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -1,27 +1,32 @@ -$style_color: #474D57; $hover: #FFFAF1; -$gl-text-color: #222222; -$gl-link-color: #446e9b; +$gl-text-color: #54565b; +$gl-header-color: #4c4e54; +$gl-link-color: #333c48; +$md-text-color: #444; +$md-link-color: #3084bb; $nprogress-color: #c0392b; -$gl-font-size: 14px; +$gl-font-size: 15px; $list-font-size: 15px; -$sidebar_collapsed_width: 52px; +$sidebar_collapsed_width: 62px; $sidebar_width: 230px; $avatar_radius: 50%; $code_font_size: 13px; $code_line_height: 1.5; -$border-color: #E5E5E5; -$background-color: #f5f5f5; -$header-height: 50px; -$readable-width: 1100px; +$border-color: #E7E9ED; +$background-color: #F8FAFC; +$header-height: 58px; +$fixed-layout-width: 1200px; +$gl-gray: #7f8fa4; +$gl-padding: 16px; +$gl-avatar-size: 46px; /* * State colors: */ $gl-primary: #446e9b; -$gl-success: #019875; -$gl-info: #029ACF; +$gl-success: #44c679; +$gl-info: #00aaff; $gl-warning: #EB9532; $gl-danger: #d9534f; @@ -35,4 +40,4 @@ $deleted: #f77; * Fonts */ $monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace; -$regular_font: "Helvetica Neue", Helvetica, Arial, sans-serif; +$regular_font: 'Source Sans Pro', "Helvetica Neue", Helvetica, Arial, sans-serif; diff --git a/app/assets/stylesheets/ci/builds.scss b/app/assets/stylesheets/ci/builds.scss new file mode 100644 index 0000000000..a11a935b54 --- /dev/null +++ b/app/assets/stylesheets/ci/builds.scss @@ -0,0 +1,70 @@ +.ci-body { + pre.trace { + background: #111111; + color: #fff; + font-family: $monospace_font; + white-space: pre; + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + overflow: auto; + overflow-y: hidden; + font-size: 12px; + + .fa-refresh { + font-size: 24px; + margin-left: 20px; + } + } + + .autoscroll-container { + position: fixed; + bottom: 10px; + right: 20px; + z-index: 100; + } + + .scroll-controls { + position: fixed; + bottom: 10px; + left: 250px; + z-index: 100; + + a { + display: block; + margin-bottom: 5px; + } + } + + .page-sidebar-collapsed { + .scroll-controls { + left: 70px; + } + } + + .build-widget { + padding: 10px; + background: $background-color; + margin-bottom: 20px; + border-radius: 4px; + + .title { + margin-top: 0; + color: #666; + line-height: 1.5; + } + .attr-name { + color: #777; + } + } + + .alert-disabled { + background: $background-color; + + a { + color: #3084bb !important; + } + } +} diff --git a/app/assets/stylesheets/ci/lint.scss b/app/assets/stylesheets/ci/lint.scss new file mode 100644 index 0000000000..6d2bd33b28 --- /dev/null +++ b/app/assets/stylesheets/ci/lint.scss @@ -0,0 +1,10 @@ +.ci-body { + .incorrect-syntax{ + font-size: 19px; + color: red; + } + .correct-syntax{ + font-size: 19px; + color: #47a447; + } +} diff --git a/app/assets/stylesheets/ci/projects.scss b/app/assets/stylesheets/ci/projects.scss new file mode 100644 index 0000000000..c63a67ab72 --- /dev/null +++ b/app/assets/stylesheets/ci/projects.scss @@ -0,0 +1,93 @@ +.ci-body { + .project-title { + margin: 0; + color: #444; + font-size: 20px; + line-height: 1.5; + } + + .wide-table-holder { + margin-left: -$gl-padding; + margin-right: -$gl-padding; + } + + .builds, + .projects-table { + .light { + border-color: $border-color; + } + + th, td { + padding: 10px $gl-padding; + } + + td { + color: $gl-gray; + vertical-align: middle !important; + + a { + font-weight: normal; + text-decoration: none; + } + } + } + + .commit-info { + .attr-name { + margin-right: 5px; + } + + pre.commit-message { + background: none; + padding: 0; + margin: 0; + border: none; + margin: 20px 0; + border-radius: 0; + } + } + + .loading{ + font-size: 20px; + } + + .ci-charts { + fieldset { + margin-bottom: 16px; + } + } + + .ci-status { + padding: 2px 7px; + margin-right: 5px; + border: 1px solid #EEE; + white-space: nowrap; + @include border-radius(4px); + + &.ci-failed { + color: $gl-danger; + border-color: $gl-danger; + } + + &.ci-success { + color: $gl-success; + border-color: $gl-success; + } + + &.ci-info { + color: $gl-info; + border-color: $gl-info; + } + + &.ci-disabled { + color: $gl-gray; + border-color: $gl-gray; + } + + &.ci-pending, + &.ci-running { + color: $gl-warning; + border-color: $gl-warning; + } + } +} diff --git a/app/assets/stylesheets/ci/runners.scss b/app/assets/stylesheets/ci/runners.scss new file mode 100644 index 0000000000..2b15ab8312 --- /dev/null +++ b/app/assets/stylesheets/ci/runners.scss @@ -0,0 +1,36 @@ +.ci-body { + .runner-state { + padding: 6px 12px; + margin-right: 10px; + color: #FFF; + + &.runner-state-shared { + background: #32b186; + } + &.runner-state-specific { + background: #3498db; + } + } + + .runner-status-online { + color: green; + } + + .runner-status-offline { + color: gray; + } + + .runner-status-paused { + color: red; + } + + .runner { + .btn { + padding: 1px 6px; + } + + h4 { + font-weight: normal; + } + } +} diff --git a/app/assets/stylesheets/ci/xterm.scss b/app/assets/stylesheets/ci/xterm.scss new file mode 100644 index 0000000000..532dede0b2 --- /dev/null +++ b/app/assets/stylesheets/ci/xterm.scss @@ -0,0 +1,906 @@ +.ci-body { + // color codes are based on http://en.wikipedia.org/wiki/File:Xterm_256color_chart.svg + // see also: https://gist.github.com/jasonm23/2868981 + + $black: #000000; + $red: #cd0000; + $green: #00cd00; + $yellow: #cdcd00; + $blue: #0000ee; // according to wikipedia, this is the xterm standard + //$blue: #1e90ff; // this is used by all the terminals I tried (when configured with the xterm color profile) + $magenta: #cd00cd; + $cyan: #00cdcd; + $white: #e5e5e5; + $l-black: #7f7f7f; + $l-red: #ff0000; + $l-green: #00ff00; + $l-yellow: #ffff00; + $l-blue: #5c5cff; + $l-magenta: #ff00ff; + $l-cyan: #00ffff; + $l-white: #ffffff; + + .term-bold { + font-weight: bold; + } + .term-italic { + font-style: italic; + } + .term-conceal { + visibility: hidden; + } + .term-underline { + text-decoration: underline; + } + .term-cross { + text-decoration: line-through; + } + + .term-fg-black { + color: $black; + } + .term-fg-red { + color: $red; + } + .term-fg-green { + color: $green; + } + .term-fg-yellow { + color: $yellow; + } + .term-fg-blue { + color: $blue; + } + .term-fg-magenta { + color: $magenta; + } + .term-fg-cyan { + color: $cyan; + } + .term-fg-white { + color: $white; + } + .term-fg-l-black { + color: $l-black; + } + .term-fg-l-red { + color: $l-red; + } + .term-fg-l-green { + color: $l-green; + } + .term-fg-l-yellow { + color: $l-yellow; + } + .term-fg-l-blue { + color: $l-blue; + } + .term-fg-l-magenta { + color: $l-magenta; + } + .term-fg-l-cyan { + color: $l-cyan; + } + .term-fg-l-white { + color: $l-white; + } + + .term-bg-black { + background-color: $black; + } + .term-bg-red { + background-color: $red; + } + .term-bg-green { + background-color: $green; + } + .term-bg-yellow { + background-color: $yellow; + } + .term-bg-blue { + background-color: $blue; + } + .term-bg-magenta { + background-color: $magenta; + } + .term-bg-cyan { + background-color: $cyan; + } + .term-bg-white { + background-color: $white; + } + .term-bg-l-black { + background-color: $l-black; + } + .term-bg-l-red { + background-color: $l-red; + } + .term-bg-l-green { + background-color: $l-green; + } + .term-bg-l-yellow { + background-color: $l-yellow; + } + .term-bg-l-blue { + background-color: $l-blue; + } + .term-bg-l-magenta { + background-color: $l-magenta; + } + .term-bg-l-cyan { + background-color: $l-cyan; + } + .term-bg-l-white { + background-color: $l-white; + } + + + .xterm-fg-0 { + color: #000000; + } + .xterm-fg-1 { + color: #800000; + } + .xterm-fg-2 { + color: #008000; + } + .xterm-fg-3 { + color: #808000; + } + .xterm-fg-4 { + color: #000080; + } + .xterm-fg-5 { + color: #800080; + } + .xterm-fg-6 { + color: #008080; + } + .xterm-fg-7 { + color: #c0c0c0; + } + .xterm-fg-8 { + color: #808080; + } + .xterm-fg-9 { + color: #ff0000; + } + .xterm-fg-10 { + color: #00ff00; + } + .xterm-fg-11 { + color: #ffff00; + } + .xterm-fg-12 { + color: #0000ff; + } + .xterm-fg-13 { + color: #ff00ff; + } + .xterm-fg-14 { + color: #00ffff; + } + .xterm-fg-15 { + color: #ffffff; + } + .xterm-fg-16 { + color: #000000; + } + .xterm-fg-17 { + color: #00005f; + } + .xterm-fg-18 { + color: #000087; + } + .xterm-fg-19 { + color: #0000af; + } + .xterm-fg-20 { + color: #0000d7; + } + .xterm-fg-21 { + color: #0000ff; + } + .xterm-fg-22 { + color: #005f00; + } + .xterm-fg-23 { + color: #005f5f; + } + .xterm-fg-24 { + color: #005f87; + } + .xterm-fg-25 { + color: #005faf; + } + .xterm-fg-26 { + color: #005fd7; + } + .xterm-fg-27 { + color: #005fff; + } + .xterm-fg-28 { + color: #008700; + } + .xterm-fg-29 { + color: #00875f; + } + .xterm-fg-30 { + color: #008787; + } + .xterm-fg-31 { + color: #0087af; + } + .xterm-fg-32 { + color: #0087d7; + } + .xterm-fg-33 { + color: #0087ff; + } + .xterm-fg-34 { + color: #00af00; + } + .xterm-fg-35 { + color: #00af5f; + } + .xterm-fg-36 { + color: #00af87; + } + .xterm-fg-37 { + color: #00afaf; + } + .xterm-fg-38 { + color: #00afd7; + } + .xterm-fg-39 { + color: #00afff; + } + .xterm-fg-40 { + color: #00d700; + } + .xterm-fg-41 { + color: #00d75f; + } + .xterm-fg-42 { + color: #00d787; + } + .xterm-fg-43 { + color: #00d7af; + } + .xterm-fg-44 { + color: #00d7d7; + } + .xterm-fg-45 { + color: #00d7ff; + } + .xterm-fg-46 { + color: #00ff00; + } + .xterm-fg-47 { + color: #00ff5f; + } + .xterm-fg-48 { + color: #00ff87; + } + .xterm-fg-49 { + color: #00ffaf; + } + .xterm-fg-50 { + color: #00ffd7; + } + .xterm-fg-51 { + color: #00ffff; + } + .xterm-fg-52 { + color: #5f0000; + } + .xterm-fg-53 { + color: #5f005f; + } + .xterm-fg-54 { + color: #5f0087; + } + .xterm-fg-55 { + color: #5f00af; + } + .xterm-fg-56 { + color: #5f00d7; + } + .xterm-fg-57 { + color: #5f00ff; + } + .xterm-fg-58 { + color: #5f5f00; + } + .xterm-fg-59 { + color: #5f5f5f; + } + .xterm-fg-60 { + color: #5f5f87; + } + .xterm-fg-61 { + color: #5f5faf; + } + .xterm-fg-62 { + color: #5f5fd7; + } + .xterm-fg-63 { + color: #5f5fff; + } + .xterm-fg-64 { + color: #5f8700; + } + .xterm-fg-65 { + color: #5f875f; + } + .xterm-fg-66 { + color: #5f8787; + } + .xterm-fg-67 { + color: #5f87af; + } + .xterm-fg-68 { + color: #5f87d7; + } + .xterm-fg-69 { + color: #5f87ff; + } + .xterm-fg-70 { + color: #5faf00; + } + .xterm-fg-71 { + color: #5faf5f; + } + .xterm-fg-72 { + color: #5faf87; + } + .xterm-fg-73 { + color: #5fafaf; + } + .xterm-fg-74 { + color: #5fafd7; + } + .xterm-fg-75 { + color: #5fafff; + } + .xterm-fg-76 { + color: #5fd700; + } + .xterm-fg-77 { + color: #5fd75f; + } + .xterm-fg-78 { + color: #5fd787; + } + .xterm-fg-79 { + color: #5fd7af; + } + .xterm-fg-80 { + color: #5fd7d7; + } + .xterm-fg-81 { + color: #5fd7ff; + } + .xterm-fg-82 { + color: #5fff00; + } + .xterm-fg-83 { + color: #5fff5f; + } + .xterm-fg-84 { + color: #5fff87; + } + .xterm-fg-85 { + color: #5fffaf; + } + .xterm-fg-86 { + color: #5fffd7; + } + .xterm-fg-87 { + color: #5fffff; + } + .xterm-fg-88 { + color: #870000; + } + .xterm-fg-89 { + color: #87005f; + } + .xterm-fg-90 { + color: #870087; + } + .xterm-fg-91 { + color: #8700af; + } + .xterm-fg-92 { + color: #8700d7; + } + .xterm-fg-93 { + color: #8700ff; + } + .xterm-fg-94 { + color: #875f00; + } + .xterm-fg-95 { + color: #875f5f; + } + .xterm-fg-96 { + color: #875f87; + } + .xterm-fg-97 { + color: #875faf; + } + .xterm-fg-98 { + color: #875fd7; + } + .xterm-fg-99 { + color: #875fff; + } + .xterm-fg-100 { + color: #878700; + } + .xterm-fg-101 { + color: #87875f; + } + .xterm-fg-102 { + color: #878787; + } + .xterm-fg-103 { + color: #8787af; + } + .xterm-fg-104 { + color: #8787d7; + } + .xterm-fg-105 { + color: #8787ff; + } + .xterm-fg-106 { + color: #87af00; + } + .xterm-fg-107 { + color: #87af5f; + } + .xterm-fg-108 { + color: #87af87; + } + .xterm-fg-109 { + color: #87afaf; + } + .xterm-fg-110 { + color: #87afd7; + } + .xterm-fg-111 { + color: #87afff; + } + .xterm-fg-112 { + color: #87d700; + } + .xterm-fg-113 { + color: #87d75f; + } + .xterm-fg-114 { + color: #87d787; + } + .xterm-fg-115 { + color: #87d7af; + } + .xterm-fg-116 { + color: #87d7d7; + } + .xterm-fg-117 { + color: #87d7ff; + } + .xterm-fg-118 { + color: #87ff00; + } + .xterm-fg-119 { + color: #87ff5f; + } + .xterm-fg-120 { + color: #87ff87; + } + .xterm-fg-121 { + color: #87ffaf; + } + .xterm-fg-122 { + color: #87ffd7; + } + .xterm-fg-123 { + color: #87ffff; + } + .xterm-fg-124 { + color: #af0000; + } + .xterm-fg-125 { + color: #af005f; + } + .xterm-fg-126 { + color: #af0087; + } + .xterm-fg-127 { + color: #af00af; + } + .xterm-fg-128 { + color: #af00d7; + } + .xterm-fg-129 { + color: #af00ff; + } + .xterm-fg-130 { + color: #af5f00; + } + .xterm-fg-131 { + color: #af5f5f; + } + .xterm-fg-132 { + color: #af5f87; + } + .xterm-fg-133 { + color: #af5faf; + } + .xterm-fg-134 { + color: #af5fd7; + } + .xterm-fg-135 { + color: #af5fff; + } + .xterm-fg-136 { + color: #af8700; + } + .xterm-fg-137 { + color: #af875f; + } + .xterm-fg-138 { + color: #af8787; + } + .xterm-fg-139 { + color: #af87af; + } + .xterm-fg-140 { + color: #af87d7; + } + .xterm-fg-141 { + color: #af87ff; + } + .xterm-fg-142 { + color: #afaf00; + } + .xterm-fg-143 { + color: #afaf5f; + } + .xterm-fg-144 { + color: #afaf87; + } + .xterm-fg-145 { + color: #afafaf; + } + .xterm-fg-146 { + color: #afafd7; + } + .xterm-fg-147 { + color: #afafff; + } + .xterm-fg-148 { + color: #afd700; + } + .xterm-fg-149 { + color: #afd75f; + } + .xterm-fg-150 { + color: #afd787; + } + .xterm-fg-151 { + color: #afd7af; + } + .xterm-fg-152 { + color: #afd7d7; + } + .xterm-fg-153 { + color: #afd7ff; + } + .xterm-fg-154 { + color: #afff00; + } + .xterm-fg-155 { + color: #afff5f; + } + .xterm-fg-156 { + color: #afff87; + } + .xterm-fg-157 { + color: #afffaf; + } + .xterm-fg-158 { + color: #afffd7; + } + .xterm-fg-159 { + color: #afffff; + } + .xterm-fg-160 { + color: #d70000; + } + .xterm-fg-161 { + color: #d7005f; + } + .xterm-fg-162 { + color: #d70087; + } + .xterm-fg-163 { + color: #d700af; + } + .xterm-fg-164 { + color: #d700d7; + } + .xterm-fg-165 { + color: #d700ff; + } + .xterm-fg-166 { + color: #d75f00; + } + .xterm-fg-167 { + color: #d75f5f; + } + .xterm-fg-168 { + color: #d75f87; + } + .xterm-fg-169 { + color: #d75faf; + } + .xterm-fg-170 { + color: #d75fd7; + } + .xterm-fg-171 { + color: #d75fff; + } + .xterm-fg-172 { + color: #d78700; + } + .xterm-fg-173 { + color: #d7875f; + } + .xterm-fg-174 { + color: #d78787; + } + .xterm-fg-175 { + color: #d787af; + } + .xterm-fg-176 { + color: #d787d7; + } + .xterm-fg-177 { + color: #d787ff; + } + .xterm-fg-178 { + color: #d7af00; + } + .xterm-fg-179 { + color: #d7af5f; + } + .xterm-fg-180 { + color: #d7af87; + } + .xterm-fg-181 { + color: #d7afaf; + } + .xterm-fg-182 { + color: #d7afd7; + } + .xterm-fg-183 { + color: #d7afff; + } + .xterm-fg-184 { + color: #d7d700; + } + .xterm-fg-185 { + color: #d7d75f; + } + .xterm-fg-186 { + color: #d7d787; + } + .xterm-fg-187 { + color: #d7d7af; + } + .xterm-fg-188 { + color: #d7d7d7; + } + .xterm-fg-189 { + color: #d7d7ff; + } + .xterm-fg-190 { + color: #d7ff00; + } + .xterm-fg-191 { + color: #d7ff5f; + } + .xterm-fg-192 { + color: #d7ff87; + } + .xterm-fg-193 { + color: #d7ffaf; + } + .xterm-fg-194 { + color: #d7ffd7; + } + .xterm-fg-195 { + color: #d7ffff; + } + .xterm-fg-196 { + color: #ff0000; + } + .xterm-fg-197 { + color: #ff005f; + } + .xterm-fg-198 { + color: #ff0087; + } + .xterm-fg-199 { + color: #ff00af; + } + .xterm-fg-200 { + color: #ff00d7; + } + .xterm-fg-201 { + color: #ff00ff; + } + .xterm-fg-202 { + color: #ff5f00; + } + .xterm-fg-203 { + color: #ff5f5f; + } + .xterm-fg-204 { + color: #ff5f87; + } + .xterm-fg-205 { + color: #ff5faf; + } + .xterm-fg-206 { + color: #ff5fd7; + } + .xterm-fg-207 { + color: #ff5fff; + } + .xterm-fg-208 { + color: #ff8700; + } + .xterm-fg-209 { + color: #ff875f; + } + .xterm-fg-210 { + color: #ff8787; + } + .xterm-fg-211 { + color: #ff87af; + } + .xterm-fg-212 { + color: #ff87d7; + } + .xterm-fg-213 { + color: #ff87ff; + } + .xterm-fg-214 { + color: #ffaf00; + } + .xterm-fg-215 { + color: #ffaf5f; + } + .xterm-fg-216 { + color: #ffaf87; + } + .xterm-fg-217 { + color: #ffafaf; + } + .xterm-fg-218 { + color: #ffafd7; + } + .xterm-fg-219 { + color: #ffafff; + } + .xterm-fg-220 { + color: #ffd700; + } + .xterm-fg-221 { + color: #ffd75f; + } + .xterm-fg-222 { + color: #ffd787; + } + .xterm-fg-223 { + color: #ffd7af; + } + .xterm-fg-224 { + color: #ffd7d7; + } + .xterm-fg-225 { + color: #ffd7ff; + } + .xterm-fg-226 { + color: #ffff00; + } + .xterm-fg-227 { + color: #ffff5f; + } + .xterm-fg-228 { + color: #ffff87; + } + .xterm-fg-229 { + color: #ffffaf; + } + .xterm-fg-230 { + color: #ffffd7; + } + .xterm-fg-231 { + color: #ffffff; + } + .xterm-fg-232 { + color: #080808; + } + .xterm-fg-233 { + color: #121212; + } + .xterm-fg-234 { + color: #1c1c1c; + } + .xterm-fg-235 { + color: #262626; + } + .xterm-fg-236 { + color: #303030; + } + .xterm-fg-237 { + color: #3a3a3a; + } + .xterm-fg-238 { + color: #444444; + } + .xterm-fg-239 { + color: #4e4e4e; + } + .xterm-fg-240 { + color: #585858; + } + .xterm-fg-241 { + color: #626262; + } + .xterm-fg-242 { + color: #6c6c6c; + } + .xterm-fg-243 { + color: #767676; + } + .xterm-fg-244 { + color: #808080; + } + .xterm-fg-245 { + color: #8a8a8a; + } + .xterm-fg-246 { + color: #949494; + } + .xterm-fg-247 { + color: #9e9e9e; + } + .xterm-fg-248 { + color: #a8a8a8; + } + .xterm-fg-249 { + color: #b2b2b2; + } + .xterm-fg-250 { + color: #bcbcbc; + } + .xterm-fg-251 { + color: #c6c6c6; + } + .xterm-fg-252 { + color: #d0d0d0; + } + .xterm-fg-253 { + color: #dadada; + } + .xterm-fg-254 { + color: #e4e4e4; + } + .xterm-fg-255 { + color: #eeeeee; + } +} diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 8595887c3b..221cb6a04a 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -23,8 +23,12 @@ &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; } + &.s36 { width: 36px; height: 36px; margin-right: 10px; } + &.s46 { width: 46px; height: 46px; margin-right: 15px; } + &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; } + &.s140 { width: 140px; height: 140px; margin-right: 20px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; } } @@ -38,5 +42,6 @@ &.s32 { font-size: 22px; line-height: 32px; } &.s60 { font-size: 32px; line-height: 60px; } &.s90 { font-size: 36px; line-height: 90px; } - &.s160 { font-size: 96px; line-height: 1.33; } + &.s140 { font-size: 72px; line-height: 140px; } + &.s160 { font-size: 96px; line-height: 160px; } } diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 3536a68f41..6ce34b5c3e 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -1,19 +1,62 @@ .light-well { - background: #f9f9f9; + background-color: #f8fafc; padding: 15px; } .centered-light-block { text-align: center; - color: #888; + color: $gl-gray; margin: 20px; } .nothing-here-block { text-align: center; padding: 20px; - color: #666; + color: $gl-gray; font-weight: normal; font-size: 16px; line-height: 36px; } + +.gray-content-block { + margin: -$gl-padding; + background-color: $background-color; + padding: $gl-padding; + margin-bottom: 0px; + border-top: 1px solid $border-color; + border-bottom: 1px solid $border-color; + color: $gl-gray; + + &.top-block { + border-top: none; + } + + &.middle-block { + margin-top: 0; + margin-bottom: 0; + } + + &.clear-block { + margin-bottom: $gl-padding - 1px; + padding-bottom: $gl-padding; + } + + &.second-block { + margin-top: -1px; + margin-bottom: 0; + } + + &.footer-block { + margin-top: 0; + border-bottom: none; + margin-bottom: -$gl-padding; + } + + .title { + color: $gl-text-color; + } + + .oneline { + line-height: 42px; + } +} diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss index cd6bf64c0a..46ef595ddf 100644 --- a/app/assets/stylesheets/generic/buttons.scss +++ b/app/assets/stylesheets/generic/buttons.scss @@ -10,7 +10,7 @@ } &.btn-save { - @extend .btn-primary; + @extend .btn-success; } &.btn-remove { @@ -72,3 +72,19 @@ } } } + +.btn-group-next { + .btn { + padding: 9px 0px; + font-size: 15px; + color: #7f8fa4; + border-color: #e7e9ed; + width: 140px; + + &.active { + border-color: $gl-info; + background: $gl-info; + color: #fff; + } + } +} diff --git a/app/assets/stylesheets/generic/callout.scss b/app/assets/stylesheets/generic/callout.scss new file mode 100644 index 0000000000..f1699d21c9 --- /dev/null +++ b/app/assets/stylesheets/generic/callout.scss @@ -0,0 +1,45 @@ +/* + * Callouts from Bootstrap3 docs + * + * Not quite alerts, but custom and helpful notes for folks reading the docs. + * Requires a base and modifier class. + */ + +/* Common styles for all types */ +.bs-callout { + margin: 20px 0; + padding: 20px; + border-left: 3px solid #eee; + color: #666; + background: #f9f9f9; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} + +/* Variations */ +.bs-callout-danger { + background-color: #fdf7f7; + border-color: #eed3d7; + color: #b94a48; +} +.bs-callout-warning { + background-color: #faf8f0; + border-color: #faebcc; + color: #8a6d3b; +} +.bs-callout-info { + background-color: #f4f8fa; + border-color: #bce8f1; + color: #34789a; +} +.bs-callout-success { + background-color: #dff0d8; + border-color: #5cA64d; + color: #3c763d; +} + diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index d36530169a..b659717b4e 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -1,5 +1,5 @@ /** COLORS **/ -.cgray { color: gray } +.cgray { color: $gl-gray; } .clgray { color: #BBB } .cred { color: #D12F19 } .cgreen { color: #4a2 } @@ -7,6 +7,7 @@ /** COMMON CLASSES **/ .prepend-top-10 { margin-top:10px } +.prepend-top-default { margin-top: $gl-padding; } .prepend-top-20 { margin-top:20px } .prepend-left-10 { margin-left:10px } .prepend-left-20 { margin-left:20px } @@ -20,10 +21,10 @@ .underlined-link { text-decoration: underline; } .hint { font-style: italic; color: #999; } -.light { color: #888 } +.light { color: $gl-gray; } .slead { - color: #666; + color: $gl-gray; font-size: 15px; margin-bottom: 12px; font-weight: normal; @@ -74,8 +75,6 @@ pre { color: $gl-link-color; } -.help li { color:$style_color; } - .back-link { font-size: 14px; } @@ -132,10 +131,6 @@ p.time { text-shadow: none; } -.highlight_word { - background: #fafe3d; -} - .thin_area{ height: 150px; } @@ -307,7 +302,7 @@ table { } .btn-sign-in { - margin-top: 7px; + margin-top: 8px; text-shadow: none; } @@ -359,17 +354,39 @@ table { } .description { - font-size: 16px; + font-size: $gl-font-size; color: #666; margin-top: 8px; } } .profiler-results { - top: 50px !important; + top: 73px !important; .profiler-button, .profiler-controls { border-color: #EEE !important; } } + +.center-top-menu { + @include nav-menu; + text-align: center; + margin-top: 5px; + margin-bottom: $gl-padding; + height: 56px; + margin-top: -$gl-padding; + padding-top: $gl-padding; + + &.no-bottom { + margin-bottom: 0; + } +} + +.dropzone .dz-preview .dz-progress { + border-color: $border-color !important; +} + +.dropzone .dz-preview .dz-progress .dz-upload { + background: $gl-success !important; +} diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss index f845342c67..9dd7774788 100644 --- a/app/assets/stylesheets/generic/files.scss +++ b/app/assets/stylesheets/generic/files.scss @@ -3,7 +3,11 @@ * */ .file-holder { - border: 1px solid $border-color; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border: none; + border-top: 1px solid #E7E9EE; + border-bottom: 1px solid #E7E9EE; margin-bottom: 1em; table { @@ -49,7 +53,7 @@ } &.wiki { - padding: 25px; + padding: $gl-padding; .highlight { margin-bottom: 9px; @@ -90,7 +94,7 @@ border-right: none; } background: #fff; - padding: 8px; + padding: 10px $gl-padding; } .lines { pre { @@ -100,6 +104,33 @@ border: none; } } + img.avatar { + border: 0 none; + float: none; + margin: 0; + padding: 0; + } + td.blame-commit { + background: #f9f9f9; + min-width: 350px; + + .commit-author-link { + color: #888; + } + } + td.blame-numbers { + pre { + color: #AAA; + white-space: pre; + } + background: #f1f1f1; + border-left: 1px solid #DDD; + } + td.lines { + code { + font-family: $monospace_font; + } + } } &.logs { diff --git a/app/assets/stylesheets/generic/filters.scss b/app/assets/stylesheets/generic/filters.scss index bd93a79722..8e6922c923 100644 --- a/app/assets/stylesheets/generic/filters.scss +++ b/app/assets/stylesheets/generic/filters.scss @@ -2,31 +2,6 @@ margin-right: 15px; } -.issues-state-filters { - li.active a { - border-color: #DDD !important; - - &, &:hover, &:active, &.active { - background: #f5f5f5 !important; - border-bottom: 1px solid #f5f5f5 !important; - } - } -} - -.issues-details-filters { - font-size: 13px; - background: #f5f5f5; - margin: -10px 0; - padding: 10px 15px; - margin-top: -15px; - border-left: 1px solid #DDD; - border-right: 1px solid #DDD; - - .btn { - font-size: 13px; - } -} - @media (min-width: 800px) { .issues-filters, .issues_bulk_update { diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss index 31e2ad8669..b758a526fb 100644 --- a/app/assets/stylesheets/generic/header.scss +++ b/app/assets/stylesheets/generic/header.scss @@ -20,33 +20,32 @@ header { } &.navbar-gitlab { + padding: 0 20px; z-index: 100; margin-bottom: 0; min-height: $header-height; + background-color: #fff; border: none; - width: 100%; + border-bottom: 1px solid #EEE; - .container { - background: #FFF; + .container-fluid { width: 100% !important; - padding: 0; filter: none; + padding: 0; .nav > li > a { - color: #888; - font-size: 14px; + color: #7f8fa4; + font-size: 18px; padding: 0; - background-color: #f5f5f5; margin: ($header-height - 28) / 2 0; margin-left: 10px; - border-radius: 40px; height: 28px; width: 28px; line-height: 28px; text-align: center; &:hover, &:focus, &:active { - background-color: #EEE; + background-color: #FFF; } } @@ -56,6 +55,7 @@ header { border-radius: 0; position: absolute; right: 2px; + top: 15px; &:hover { background-color: #EEE; @@ -64,66 +64,22 @@ header { } } - .header-logo { - border-bottom: 1px solid transparent; - float: left; - height: $header-height; - width: $sidebar_width; - overflow: hidden; - transition-duration: .3s; - - a { - float: left; - height: $header-height; - width: 100%; - padding: ($header-height - 36 ) / 2 8px; - overflow: hidden; - - img { - width: 36px; - height: 36px; - float: left; - } - - .gitlab-text-container { - width: 230px; - - h3 { - width: 158px; - float: left; - margin: 0; - margin-left: 14px; - font-size: 18px; - line-height: $header-height - 14; - font-weight: normal; - } - } - } - - &:hover { - background-color: #EEE; - } - } - .header-content { - border-bottom: 1px solid #EEE; - padding-right: 35px; height: $header-height; .title { margin: 0; - padding: 0 15px 0 35px; overflow: hidden; - font-size: 18px; + font-size: 19px; line-height: $header-height; - font-weight: bold; - color: #444; + font-weight: normal; + color: #4c4e54; text-overflow: ellipsis; vertical-align: top; white-space: nowrap; a { - color: #444; + color: #4c4e54; &:hover { text-decoration: underline; } @@ -138,7 +94,7 @@ header { .search { margin-right: 10px; margin-left: 10px; - margin-top: ($header-height - 28) / 2; + margin-top: ($header-height - 36) / 2; form { margin: 0; @@ -149,13 +105,8 @@ header { width: 220px; background-image: image-url("icon-search.png"); background-repeat: no-repeat; - background-position: 10px; - height: inherit; - padding: 4px 6px; - padding-left: 25px; - font-size: 13px; - background-color: #f5f5f5; - border-color: #f5f5f5; + background-position: 195px; + @include input-big; &:focus { @include box-shadow(none); @@ -168,15 +119,7 @@ header { } @mixin collapsed-header { - .header-logo { - width: $sidebar_collapsed_width; - } - - .header-content { - .title { - margin-left: 30px; - } - } + margin-left: $sidebar_collapsed_width; } @media (max-width: $screen-md-max) { @@ -191,16 +134,14 @@ header { } .header-expanded { + margin-left: $sidebar_width; } } @media (max-width: $screen-xs-max) { - header .container { + header .container-fluid { font-size: 18px; - .title { - } - .navbar-nav { margin: 0px; float: none !important; diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 869e586839..b1fb87a683 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -5,10 +5,13 @@ */ .issue-box { + @include border-radius(3px); + display: inline-block; - padding: 4px 13px; + padding: 10px $gl-padding; font-weight: normal; - margin-right: 5px; + margin-right: 10px; + font-size: $gl-font-size; &.issue-box-closed { background-color: $gl-danger; @@ -21,7 +24,7 @@ } &.issue-box-open { - background-color: $gl-success; + background-color: #019875; color: #FFF; } diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index c502d953c7..3bfed8de77 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -49,8 +49,6 @@ } } - .author { color: #999; } - .list-item-name { float: left; position: relative; @@ -71,15 +69,6 @@ font-size: $list-font-size; line-height: 18px; } - - .row_title { - color: $gray-dark; - - &:hover { - color: $text-color; - text-decoration: underline; - } - } } } @@ -93,28 +82,12 @@ ol, ul { /** light list with border-bottom between li **/ ul.bordered-list { - margin: 5px 0px; - padding: 0px; - li { - padding: 5px 0; - border-bottom: 1px solid #EEE; - overflow: hidden; - display: block; - margin: 0px; - &:last-child { border:none } - &.active { - background: #f9f9f9; - a { font-weight: bold; } - } - - &.light { - a { color: #777; } - } - } + @include basic-list; &.top-list { li:first-child { padding-top: 0; + h4, h5 { margin-top: 0; } @@ -125,3 +98,28 @@ ul.bordered-list { li.task-list-item { list-style-type: none; } + +ul.content-list { + @include basic-list; + + margin: 0; + padding: 0; + + > li { + padding: $gl-padding; + border-color: #f1f2f4; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + color: $gl-gray; + + .avatar { + margin-right: 15px; + } + + .controls { + padding-top: 10px; + float: right; + } + } +} + diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index a4fc82e90b..ed0333d233 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -65,8 +65,11 @@ position: relative; } -.md-header ul { - float: left; +.md-header { + ul { + float: left; + margin-bottom: 1px; + } } .referenced-users { @@ -80,7 +83,7 @@ .md-preview-holder { background: #FFF; border: 1px solid #ddd; - min-height: 100px; + min-height: 169px; padding: 5px; box-shadow: none; } @@ -105,7 +108,7 @@ .markdown-area { background: #FFF; border: 1px solid #ddd; - min-height: 100px; + min-height: 140px; padding: 5px; box-shadow: none; width: 100%; diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index bb7b9356c7..36ae126f86 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -80,6 +80,23 @@ %ul.notes .note-role, .note-actions { display: none; } + + .center-top-menu { + height: 45px; + + li a { + font-size: 14px; + padding: 19px 10px; + } + } + + .projects-search-form { + margin: 0 -5px !important; + + .btn { + display: none; + } + } } @media (max-width: $screen-sm-max) { diff --git a/app/assets/stylesheets/generic/pagination.scss b/app/assets/stylesheets/generic/pagination.scss new file mode 100644 index 0000000000..a937677ebd --- /dev/null +++ b/app/assets/stylesheets/generic/pagination.scss @@ -0,0 +1,32 @@ +.gl-pagination { + border-top: 1px solid $border-color; + background-color: $background-color; + margin: -$gl-padding; + margin-top: 0; + + .pagination { + padding: 0; + margin: 0; + display: block; + + li.next, + li.prev { + > a { + color: $link-color; + + &:hover { + color: #fff; + } + } + } + + li > a, + li > span { + border: none; + margin: 0; + @include border-radius(0 !important); + padding: 13px 19px; + border-right: 1px solid $border-color; + } + } +} diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss index d8e0dc028d..f0860de1c4 100644 --- a/app/assets/stylesheets/generic/selects.scss +++ b/app/assets/stylesheets/generic/selects.scss @@ -3,9 +3,9 @@ .select2-choice { background: #FFF; border-color: #DDD; - height: 34px; - padding: 6px 14px; - font-size: 14px; + height: 42px; + padding: 8px $gl-padding; + font-size: $gl-font-size; line-height: 1.42857143; @include border-radius(4px); @@ -13,7 +13,7 @@ .select2-arrow { background: #FFF; border-left: none; - padding-top: 3px; + padding-top: 5px; } } } diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index b96664d30d..3d055f0e66 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -18,14 +18,28 @@ } .content-wrapper { + min-height: 100vh; width: 100%; padding: 20px; - background: #FFF; + background: #f1f4f8; + + .container-fluid { + background: #FFF; + padding: $gl-padding; + border: 1px solid #e7e9ed; + min-height: 90vh; + + &.container-blank { + background: none; + padding: 0; + border: none; + } + } } .nav-sidebar { - margin-top: 29 + $header-height; - margin-bottom: 50px; + margin-top: 14 + $header-height; + margin-bottom: 100px; transition-duration: .3s; list-style: none; overflow: hidden; @@ -43,13 +57,14 @@ } a { - padding: 8px 15px; - font-size: 13px; - line-height: 18px; + padding: 7px 15px; + font-size: $gl-font-size; + line-height: 24px; color: $gray; display: block; text-decoration: none; - padding-left: 16px; + padding-left: 22px; + font-weight: normal; &:hover { text-decoration: none; @@ -60,9 +75,9 @@ } i { - width: 20px; + width: 16px; color: $gray-light; - margin-right: 23px; + margin-right: 13px; } .count { @@ -108,41 +123,59 @@ } @mixin folded-sidebar { - padding-left: 50px; + padding-left: 60px; transition-duration: .3s; .sidebar-wrapper { width: $sidebar_collapsed_width; + .header-logo { + width: $sidebar_collapsed_width; + + a { + padding-left: 12px; + + .gitlab-text-container { + display: none; + } + } + } + .nav-sidebar { width: $sidebar_collapsed_width; li a { - padding-left: 16px; + span { + display: none; + } } } .collapse-nav a { - left: 0px; width: $sidebar_collapsed_width; } .sidebar-user { + padding-left: 12px; width: $sidebar_collapsed_width; + + .username { + display: none; + } } } } .collapse-nav a { + width: $sidebar_width; position: fixed; - top: $header-height; - left: 198px; + bottom: 0; + left: 0; font-size: 13px; background: transparent; - width: 32px; - height: 28px; + height: 40px; text-align: center; - line-height: 28px; + line-height: 40px; transition-duration: .3s; } @@ -176,15 +209,60 @@ } .sidebar-user { + padding: 9px 22px; position: fixed; - bottom: 0; + bottom: 40px; width: $sidebar_width; - padding: 10px; overflow: hidden; transition-duration: .3s; .username { - margin-top: 5px; + margin-left: 10px; width: $sidebar_width - 2 * 10px; + font-size: 16px; + line-height: 34px; + } +} + +.sidebar-wrapper { + .header-logo { + border-bottom: 1px solid transparent; + float: left; + height: $header-height; + width: $sidebar_width; + overflow: hidden; + transition-duration: .3s; + + a { + float: left; + height: $header-height; + width: 100%; + padding: 10px 22px; + overflow: hidden; + + img { + width: 36px; + height: 36px; + float: left; + } + + .gitlab-text-container { + width: 230px; + + h3 { + width: 158px; + float: left; + margin: 0; + margin-left: 14px; + font-size: 19px; + line-height: 41px; + font-weight: normal; + } + } + } + + &:hover { + background-color: #EEE; + } } } diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 97831eb7c2..74bbaabad3 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -1,119 +1,50 @@ .timeline { - list-style: none; - padding: 20px 0 20px; - position: relative; + @include basic-list; - &:before { - top: 0; - bottom: 0; - position: absolute; - content: " "; - width: 3px; - background-color: #eeeeee; - margin-left: 29px; - } + margin: 0; + padding: 0; .timeline-entry { - position: relative; - margin-top: 5px; - margin-left: 30px; - margin-bottom: 10px; - clear: both; + padding: $gl-padding; + border-color: #f1f2f4; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + color: $gl-gray; + border-bottom: 1px solid #f1f2f4; + border-right: 1px solid #f1f2f4; - - &:target { - .timeline-entry-inner .timeline-content { - -webkit-animation:target-note 2s linear; - background: $hover; - } + &:last-child { + border-bottom: none; } - .timeline-entry-inner { - position: relative; - margin-left: -20px; + .avatar { + margin-right: 15px; + } - &:before, &:after { - content: " "; - display: table; - } - - .timeline-icon { - margin-top: 2px; - background: #fff; - color: #737881; - float: left; - @include border-radius($avatar_radius); - @include box-shadow(0 0 0 3px #EEE); - overflow: hidden; - - .avatar { - margin: 0; - padding: 0; - } - } - - .timeline-content { - position: relative; - background: $background-color; - padding: 10px 15px; - margin-left: 60px; - - img { - max-width: 100%; - } - - &:after { - content: ''; - display: block; - position: absolute; - width: 0; - height: 0; - border-style: solid; - border-width: 9px 9px 9px 0; - border-color: transparent $background-color transparent transparent; - left: 0; - top: 10px; - margin-left: -9px; - } - } + .controls { + padding-top: 10px; + float: right; } } - .system-note .timeline-entry-inner { - .timeline-icon { - background: none; - margin-left: 12px; - margin-top: 0; - @include box-shadow(none); - - span { - margin: 0 2px; - font-size: 16px; - color: #eeeeee; - } + .note-text { + p:last-child { + margin-bottom: 0; } + } - .timeline-content { - background: none; - margin-left: 45px; - padding: 0px 15px; - - &:after { border: 0; } - - .note-header { - span { font-size: 12px; } - - .avatar { - margin-right: 5px; - } - } - - .note-text { - font-size: 12px; - margin-left: 20px; - } + .system-note { + .note-text { + color: $gl-gray !important; } } + + .diff-file { + border: 1px solid $border-color; + border-bottom: none; + margin-left: 0; + margin-right: 0; + } } @media (max-width: $screen-xs-max) { @@ -132,3 +63,8 @@ } } } + +.discussion .timeline-entry { + margin: 0; + border-right: none; +} diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 34b4ee3e17..80d2788721 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -9,6 +9,11 @@ margin-bottom: 5px; } +h1, h2, h3, h4, h5, h6 { + color: $gl-header-color; + font-weight: 500; +} + /** CODE **/ pre { font-family: $monospace_font; @@ -84,6 +89,10 @@ a > code { } } +.md-area { + @include md-typography; +} + .md { @include md-typography; } @@ -96,6 +105,9 @@ textarea.js-gfm-input { font-family: $monospace_font; } +.md-preview { +} + .strikethrough { text-decoration: line-through; } diff --git a/app/assets/stylesheets/generic/zen.scss b/app/assets/stylesheets/generic/zen.scss index 7e86a0fe4b..32e2c020e0 100644 --- a/app/assets/stylesheets/generic/zen.scss +++ b/app/assets/stylesheets/generic/zen.scss @@ -4,7 +4,7 @@ } .zen-enter-link { - color: #888; + color: $gl-gray; position: absolute; top: 0px; right: 4px; @@ -13,7 +13,7 @@ .zen-leave-link { display: none; - color: #888; + color: $gl-text-color; position: absolute; top: 10px; right: 10px; diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss index c8cb18ec35..8323a8598e 100644 --- a/app/assets/stylesheets/highlight/dark.scss +++ b/app/assets/stylesheets/highlight/dark.scss @@ -21,6 +21,12 @@ pre.code.highlight.dark, background-color: #557 !important; } + // Search result highlight + span.highlight_word { + background: #ffe792; + color: #000000; + } + .hll { background-color: #373b41 } .c { color: #969896 } /* Comment */ .err { color: #cc6666 } /* Error */ diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss index 001e8b3102..e838167433 100644 --- a/app/assets/stylesheets/highlight/monokai.scss +++ b/app/assets/stylesheets/highlight/monokai.scss @@ -21,6 +21,12 @@ pre.code.monokai, background-color: #49483e !important; } + // Search result highlight + span.highlight_word { + background: #ffe792; + color: #000000; + } + .hll { background-color: #49483e } .c { color: #75715e } /* Comment */ .err { color: #960050; background-color: #1e0010 } /* Error */ diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss index f5b827e7c0..bd41480aef 100644 --- a/app/assets/stylesheets/highlight/solarized_dark.scss +++ b/app/assets/stylesheets/highlight/solarized_dark.scss @@ -21,6 +21,11 @@ pre.code.highlight.solarized-dark, background-color: #174652 !important; } + // Search result highlight + span.highlight_word { + background: #094554; + } + /* Solarized Dark For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss index 6b44c00c30..4cc6286387 100644 --- a/app/assets/stylesheets/highlight/solarized_light.scss +++ b/app/assets/stylesheets/highlight/solarized_light.scss @@ -21,6 +21,11 @@ pre.code.highlight.solarized-light, background-color: #ddd8c5 !important; } + // Search result highlight + span.highlight_word { + background: #eee8d5; + } + /* Solarized Light For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index a52ffc971d..5de589109b 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -5,15 +5,19 @@ pre.code.highlight.white, background-color: #fff; color: #333; - pre.highlight, .line-numbers, .line-numbers a { + background-color: $background-color !important; + color: $gl-gray !important; + } + + pre.highlight { background-color: #fff !important; color: #333 !important; } pre.code { - border-left: 1px solid #bbb; + border-left: 1px solid $border-color; } // highlight line via anchor @@ -21,6 +25,11 @@ pre.code.highlight.white, background-color: #f8eec7 !important; } + // Search result highlight + span.highlight_word { + background: #fafe3d; + } + .hll { background-color: #f8f8f8 } .c { color: #999988; font-style: italic; } .err { color: #a61717; background-color: #e3d2d2; } diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index e7125c0399..051ca3792c 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -26,14 +26,6 @@ margin-top: 10px; } -.commit-stat-summary { - color: #666; - font-size: 14px; - font-weight: normal; - padding: 3px 0; - margin-bottom: 10px; -} - .commit-info-row { margin-bottom: 10px; .avatar { @@ -47,11 +39,6 @@ } .commit-box { - margin: 10px 0; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding: 20px 0; - .commit-title { margin: 0; } @@ -61,10 +48,6 @@ } } -.file-stats a { - color: $style_color; -} - .file-stats { .new-file { a { diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss index 359f4073e8..de2ae93df3 100644 --- a/app/assets/stylesheets/pages/commits.scss +++ b/app/assets/stylesheets/pages/commits.scss @@ -52,7 +52,7 @@ li.commit { } .commit-row-message { - color: #444; + color: $gl-link-color; &:hover { text-decoration: underline; @@ -88,12 +88,12 @@ li.commit { } .commit-row-info { - color: #777; + color: $gl-gray; line-height: 24px; font-size: 13px; a { - color: #777; + color: $gl-gray; } .committed_ago { diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss index 9a3b543ad1..25a86cd0f9 100644 --- a/app/assets/stylesheets/pages/dashboard.scss +++ b/app/assets/stylesheets/pages/dashboard.scss @@ -2,7 +2,7 @@ .side { .panel { .panel-heading { - background: #EEE; + background: $background-color; border-top-left-radius: 0; } border-top-left-radius: 0; @@ -23,41 +23,6 @@ } } -.project-row, .group-row { - padding: 0 !important; - font-size: 14px; - line-height: 24px; - - a { - display: block; - padding: 8px 15px; - } - - .project-name, .group-name { - font-weight: 500; - } - - .arrow { - float: right; - margin: 0; - font-size: 20px; - } - - .last-activity { - float: right; - font-size: 12px; - color: #AAA; - display: block; - .date { - color: #777; - } - } -} - -.project-description { - overflow: hidden; -} - .project-access-icon { margin-left: 10px; float: left; @@ -73,12 +38,11 @@ float: left; .avatar { - margin-top: -8px; - margin-left: -15px; - @include border-radius(0px); + @include border-radius(50%); } + .identicon { - line-height: 40px; + line-height: 46px; } } diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 1557c243db..5e7e59a6af 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -1,12 +1,14 @@ .diff-file { - border: 1px solid $border-color; - margin-bottom: 1em; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border: none; + border-bottom: 1px solid #E7E9EE; .diff-header { position: relative; background: $background-color; border-bottom: 1px solid $border-color; - padding: 10px 15px; + padding: 10px 16px; color: #555; z-index: 10; @@ -45,7 +47,7 @@ overflow-y: hidden; background: #FFF; color: #333; - font-size: $code_font_size; + .old { span.idiff { background-color: #f8cbcb; @@ -82,7 +84,7 @@ border: none; margin: 0px; padding: 0px; - td { + .line_holder td { line-height: $code_line_height; font-size: $code_font_size; } @@ -367,3 +369,7 @@ white-space: pre-wrap; } +.inline-parallel-buttons { + float: right; + margin-top: -5px; +} diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index 759ba6b1c2..1d565477dd 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -9,6 +9,10 @@ width: 100%; } + .ace_gutter-cell { + background-color: $background-color; + } + .cancel-btn { color: #B94A48; &:hover { @@ -32,14 +36,12 @@ .file-title { @extend .monospace; - font-size: 14px; - padding: 5px; } .editor-ref { background: $background-color; padding: 11px 15px; - border-right: 1px solid #CCC; + border-right: 1px solid $border-color; display: inline-block; margin: -5px -5px; margin-right: 10px; @@ -50,5 +52,15 @@ display: inline-block; width: 200px; } + + .form-control { + margin-top: -3px; + } + } + + .form-actions { + margin: -$gl-padding; + margin-top: 0; + padding: $gl-padding } } diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index d4af7506d5..ca2ee45542 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -1,70 +1,58 @@ -/** - * Events labels - * - */ -.event_label { - &.pushed { - padding: 0 2px; - } - - &.opened { - padding: 0 2px; - } - - &.closed { - padding: 0 2px; - } - - &.merged { - padding: 0 2px; - } - - &.left, - &.joined { - padding: 0 2px; - float: none; - } -} - /** * Dashboard events feed * */ .event-item { - &:first-child { - padding-top: 0; - } + font-size: $gl-font-size; + padding: $gl-padding; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border-bottom: 1px solid #f1f2f4; + color: #7f8fa4; &.event-inline { .avatar { position: relative; top: -2px; } + + .event-title { + line-height: 44px; + } + + .event-item-timestamp { + line-height: 44px; + } + } + + a { + color: #4c4e54; + } + + .avatar { + margin-right: 15px; } - padding: 12px 0px; - border-bottom: 1px solid #eee; .event-title { - max-width: 70%; @include str-truncated(calc(100% - 174px)); - font-weight: 500; - font-size: 14px; + font-weight: 600; + .author_name { color: #333; } } + .event-body { - font-size: 13px; - margin-left: 35px; + margin-left: 63px; margin-right: 80px; - color: #777; .event-note { margin-top: 5px; word-wrap: break-word; .md { - font-size: 13px; + color: #7f8fa4; + font-size: $gl-font-size; iframe.twitter-share-button { vertical-align: bottom; @@ -94,7 +82,7 @@ .event-note-icon { color: #777; float: left; - font-size: 16px; + font-size: $gl-font-size; line-height: 16px; margin-right: 5px; } @@ -116,7 +104,7 @@ &:last-child { border:none } .event_commits { - margin-top: 5px; + margin-top: 9px; li { &.commit { @@ -125,10 +113,12 @@ padding-left: 0; border: none; .commit-row-title { - font-size: 12px; + font-size: $gl-font-size; } } + &.commits-stat { + margin-top: 3px; display: block; padding: 3px; padding-left: 0; @@ -142,7 +132,6 @@ .event-item-timestamp { float: right; - color: #999; line-height: 22px; } } @@ -186,12 +175,3 @@ } } } - -.event_filter { - li a { - font-size: 13px; - padding: 5px 10px; - background: $background-color; - margin-left: 4px; - } -} diff --git a/app/assets/stylesheets/pages/explore.scss b/app/assets/stylesheets/pages/explore.scss index 9b92128624..da06fe9954 100644 --- a/app/assets/stylesheets/pages/explore.scss +++ b/app/assets/stylesheets/pages/explore.scss @@ -6,3 +6,11 @@ font-size: 30px; } } + +.explore-trending-block { + .lead { + line-height: 32px; + font-size: 18px; + margin-top: 10px; + } +} diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 3f617e72b0..b5c61f7f91 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -25,8 +25,6 @@ } .issuable-context-title { - font-size: 14px; - line-height: 1.4; margin-bottom: 5px; .avatar { @@ -34,20 +32,50 @@ } label { - color: #666; + color: $gl-gray; font-weight: normal; margin-right: 4px; } } -.issuable-affix .context { - font-size: 13px; +.project-issuable-filter { + .controls { + float: right; + margin-top: 7px; + } - .btn { font-size: 13px; } + .center-top-menu { + text-align: left; + } } .issuable-details { + .page-title { + margin-top: -15px; + padding: 10px 0; + margin-bottom: 0; + color: $gl-gray; + font-size: 16px; + + .author { + color: $gl-gray; + } + + .issue-id { + font-size: 19px; + color: $gl-text-color; + } + } + + .issue-title { + margin: 0; + } + .description { - max-width: $readable-width; + margin-top: 6px; + + p:last-child { + margin-bottom: 0; + } } } diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index 3572f33e91..4bf58cb4a5 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -1,6 +1,6 @@ .issues-list { .issue { - padding: 10px 15px; + padding: 10px $gl-padding; position: relative; .issue-title { @@ -10,8 +10,7 @@ } .issue-info { - color: #999; - font-size: 13px; + color: $gl-gray; } .issue-check { @@ -47,10 +46,6 @@ } } -.participants { - margin-bottom: 20px; -} - .issue-search-form { margin: 0; height: 24px; @@ -137,11 +132,6 @@ form.edit-issue { } } -h2.issue-title { - margin-top: 0; - font-weight: bold; -} - .issue-form .select2-container { width: 250px !important; } diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 10fce5b3da..d8c8e5ad0a 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -3,10 +3,10 @@ * */ .mr-state-widget { - background: #FAFAFA; + background: #f8fafc; margin-bottom: 20px; - color: #666; - border: 1px solid #e5e5e5; + color: $gl-gray; + border: 1px solid #eef0f2; @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05)); @include border-radius(3px); @@ -29,6 +29,14 @@ padding: 5px; line-height: 20px; + &.right { + float: right; + padding-top: 12px; + a { + color: $gl-gray; + } + } + .remove_source_checkbox { margin: 0; } @@ -36,7 +44,7 @@ } .ci_widget { - border-bottom: 1px solid #EEE; + border-bottom: 1px solid #eef0f2; i { margin-right: 4px; @@ -89,20 +97,14 @@ } } -@media(min-width: $screen-sm-max) { - .merge-request .merge-request-tabs{ - li { - a { - padding: 15px 40px; - font-size: 14px; - } - } - } -} - .merge-request .merge-request-tabs{ - margin-top: 30px; - margin-bottom: 20px; + @include nav-menu; + margin: -$gl-padding; + padding: $gl-padding; + text-align: center; + border-top: 1px solid #e7e9ed; + margin-top: 18px; + margin-bottom: 3px; } .mr_source_commit, @@ -136,8 +138,7 @@ } .merge-request-info { - color: #999; - font-size: 13px; + color: $gl-gray; } } diff --git a/app/assets/stylesheets/pages/milestone.scss b/app/assets/stylesheets/pages/milestone.scss index 15e3948e40..e80dc9e84a 100644 --- a/app/assets/stylesheets/pages/milestone.scss +++ b/app/assets/stylesheets/pages/milestone.scss @@ -6,4 +6,8 @@ li.milestone { h4 { font-weight: bold; } + + .progress { + height: 6px; + } } diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 203f9374ce..fdc2c3332d 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -72,9 +72,13 @@ .common-note-form { margin: 0; - background: #F9F9F9; - padding: 5px; - border: 1px solid #DDD; + background: #f8fafc; + padding: $gl-padding; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border-right: 1px solid #f1f2f4; + border-top: 1px solid #f1f2f4; + margin-bottom: -$gl-padding; } .note-form-actions { @@ -105,7 +109,7 @@ .note-edit-form { display: none; - font-size: 13px; + font-size: 15px; .form-actions { padding-left: 20px; @@ -142,9 +146,9 @@ } .discussion-reply-holder { - background: #f9f9f9; + background: $background-color; padding: 10px 15px; - border-top: 1px solid #DDD; + border-top: 1px solid $border-color; } } @@ -166,6 +170,6 @@ background: #FFF; padding: 5px; margin-top: -11px; - border: 1px solid #DDD; + border: 1px solid $border-color; font-size: 13px; } diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 85c828ec1a..2a77f065ae 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -14,6 +14,19 @@ ul.notes { margin: 0px; padding: 0px; + .system-note { + font-size: 14px; + padding-top: 10px; + padding-bottom: 10px; + background: #f8fafc; + + .timeline-icon { + .avatar { + visibility: hidden; + } + } + } + .discussion-header, .note-header { @extend .cgray; @@ -34,10 +47,8 @@ ul.notes { content: "\00b7"; } - font-size: 13px; - a { - @extend .cgray; + color: $gl-gray; &:hover { text-decoration: underline; @@ -45,8 +56,9 @@ ul.notes { } } .author { - color: #333; - font-weight: bold; + color: #4c4e54; + margin-right: 3px; + &:hover { color: $gl-link-color; } @@ -59,7 +71,7 @@ ul.notes { margin-top: 1px; border: 1px solid #bbb; background-color: transparent; - color: #999; + color: $gl-gray; } } @@ -133,8 +145,6 @@ ul.notes { } .diff-file .notes_holder { - font-size: 13px; - line-height: 18px; font-family: $regular_font; td { @@ -176,8 +186,7 @@ ul.notes { a { margin-left: 5px; - - color: #999; + color: $gl-gray; i.fa { font-size: 16px; @@ -226,8 +235,6 @@ ul.notes { filter: alpha(opacity=0); &:hover { - width: 38px; - font-size: 20px; background: $gl-info; color: #FFF; @include show-add-diff-note; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 29d3dbc25e..a986fafff0 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -16,6 +16,10 @@ .project-home-panel { text-align: center; + background: #f7f8fa; + margin: -$gl-padding; + padding: $gl-padding; + padding-top: 40px; .project-identicon-holder { margin-bottom: 15px; @@ -30,21 +34,30 @@ } } + .project-home-dropdown { + margin: 11px 3px 0; + } + .project-home-desc { h1 { margin: 0; margin-bottom: 10px; - font-size: 26px; + font-size: 23px; + font-weight: normal; } p { - display: inline; + color: #7f8fa4; } } .git-clone-holder { max-width: 600px; margin: 20px auto; + + .form-control { + background: #FFF; + } } .visibility-level-label { @@ -55,17 +68,18 @@ } .project-repo-buttons { - margin-top: 25px; + margin-top: $gl-padding; margin-bottom: 25px; .btn { @extend .btn-info; + text-transform: uppercase; + font-size: 15px; + line-height: 20px; + padding: 8px 14px; + border-radius: 3px; margin-left: 10px; - font-weight: bold; - font-size: 14px; - line-height: 16px; - padding: 8px 12px; .count { padding-left: 7px; @@ -155,78 +169,6 @@ ul.nav.nav-projects-tabs { margin: 0px; } -.my-projects, -.public-projects { - li { - .project-info { - margin-bottom: 10px; - overflow: hidden; - } - - .access-icon { - color: #AAA; - margin-left: 10px; - i { - color: #AAA; - } - } - } -} - -.public-clone { - background: #EEE; - color: #777; - padding: 6px 10px; - margin: 1px; - font-weight: normal; -} - -.public-projects .repo-info { - color: #777; - - a { - color: #777; - } -} - -.project-side { - .project-fork-icon { - float: left; - font-size: 26px; - margin-right: 10px; - line-height: 1.5; - } - - .panel { - @include border-radius(3px); - - .panel-heading, .panel-footer { - font-weight: normal; - background-color: transparent; - color: #666; - border-color: #EEE; - } - - .actions { - margin-top: 10px; - } - - .nav-pills a { - padding: 10px; - font-weight: bold; - color: $gl-link-color; - } - - .nav { - margin-bottom: 15px; - } - } - - .ci-status-image { - max-height: 22px; - } -} - .transfer-project .select2-container { min-width: 200px; } @@ -249,10 +191,10 @@ ul.nav.nav-projects-tabs { .breadcrumb.repo-breadcrumb { padding: 0; - line-height: 34px; - background: white; + line-height: 42px; + background: transparent; border: none; - font-size: 16px; + margin: 0; > li + li:before { padding: 0 3px; @@ -261,26 +203,18 @@ ul.nav.nav-projects-tabs { } .fork-namespaces { - .thumbnail { + .fork-thumbnail { + text-align: center; + margin-bottom: $gl-padding; - &.fork-exists-thumbnail { - border-color: #EEE; - - .caption { - color: #999; - } + .caption { + padding: $gl-padding 0; + min-height: 30px; } - &.fork-thumbnail { - border-color: #AAA; - - &:hover { - background-color: $hover; - } - } - - a { - text-decoration: none; + img { + @include border-radius(50%); + max-width: 100px; } } } @@ -298,10 +232,23 @@ table.table.protected-branches-list tr.no-border { .project-stats { text-align: center; + margin-top: 0; + margin-bottom: 0; + padding-top: 5px; + padding-bottom: 0; - ul.nav-pills { display:inline-block; } - li { display:inline; } - a { float:left; } + ul.nav-pills { + display:inline-block; + } + + li { + display:inline; + } + + a { + float:left; + font-size: 17px; + } li.missing a { color: #bbb; @@ -316,3 +263,73 @@ table.table.protected-branches-list tr.no-border { pre.light-well { border-color: #f1f1f1; } + +.projects-search-form { + margin: -$gl-padding; + background-color: #f8fafc; + padding: $gl-padding; + margin-bottom: 0px; + border-top: 1px solid #e7e9ed; + border-bottom: 1px solid #e7e9ed; +} + +/* + * Projects list rendered on dashboard and user page + */ +.projects-list { + @include basic-list; + + .project-row { + padding: $gl-padding; + border-color: #f1f2f4; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + + &.no-description { + .project { + line-height: 44px; + } + } + + .project-full-name { + @include str-truncated; + font-weight: 600; + color: #4c4e54; + } + + .pull-right.light { + line-height: 45px; + color: #7f8fa4; + } + + .project-description { + color: #7f8fa4; + + p { + @include str-truncated; + margin-bottom: 0; + color: #7f8fa4; + } + } + } + + .bottom { + padding-top: $gl-padding; + padding-bottom: 0; + } +} + +.panel .projects-list li { + padding: 10px 15px; + margin: 0; +} + +.project-show-activity { + .activity-filter-block { + margin-top: -1px; + } +} + +.inline-form { + display: inline-block; +} diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss index bdaa17ac33..3aaa96da60 100644 --- a/app/assets/stylesheets/pages/search.scss +++ b/app/assets/stylesheets/pages/search.scss @@ -1,7 +1,19 @@ .search-results { .search-result-row { - border-bottom: 1px solid #EEE; - padding-bottom: 10px; - margin-bottom: 10px; + border-bottom: 1px solid #DDD; + padding-bottom: 15px; + margin-bottom: 15px; } } + +.search-holder { + max-width: 600px; + margin: 0 auto; + margin-bottom: 20px; + + input { + border-color: #BBB; + font-weight: bold; + } +} + diff --git a/app/assets/stylesheets/pages/snippets.scss b/app/assets/stylesheets/pages/snippets.scss index d79591d991..a3d7aba054 100644 --- a/app/assets/stylesheets/pages/snippets.scss +++ b/app/assets/stylesheets/pages/snippets.scss @@ -6,3 +6,27 @@ .snippet-form-holder .file-holder .file-title { padding: 2px; } + + +.snippet-row { + .snippet-title { + font-size: 15px; + font-weight: bold; + line-height: 20px; + margin-bottom: 2px; + + .monospace { + font-weight: normal; + } + } + + .snippet-info { + color: #888; + font-size: 13px; + line-height: 24px; + + a { + color: #888; + } + } +} diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 5f1a3db4fb..271cc547e2 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -63,51 +63,21 @@ padding-right: 8px; .commit-author-name { - color: gray; + color: $gl-gray; } } .tree_commit { - color: gray; + color: $gl-gray; .tree-commit-link { - color: gray; + color: $gl-gray; &:hover { text-decoration: underline; } } } - - .blame { - img.avatar { - border: 0 none; - float: none; - margin: 0; - padding: 0; - } - td.blame-commit { - background: #f9f9f9; - min-width: 350px; - - .commit-author-link { - color: #888; - } - } - td.blame-numbers { - pre { - color: #AAA; - white-space: pre; - } - background: #f1f1f1; - border-left: 1px solid #DDD; - } - td.lines { - code { - font-family: $monospace_font; - } - } - } } .tree-ref-holder { @@ -117,7 +87,6 @@ .readme-holder { margin: 0 auto; - max-width: $readable-width; .readme-file-title { font-size: 14px; @@ -133,20 +102,30 @@ list-style: none; margin: 0; padding: 0; - margin-bottom: 10px; + margin-bottom: 5px; .commit { - padding: 10px 15px; + padding: $gl-padding 0; .commit-row-title { - font-size: 13px; - .commit-row-message { font-weight: normal; - color: #555; } } } } #modal-remove-blob > .modal-dialog { width: 850px; } + +.blob-upload-dropzone-previews { + text-align: center; + border: 2px; + border-style: dashed; + border-color: $border-color; + min-height: 200px; +} + +.upload-link { + font-weight: normal; + color: $md-link-color; +} diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss index 3589cb88d0..8d9a0aae56 100644 --- a/app/assets/stylesheets/themes/gitlab-theme.scss +++ b/app/assets/stylesheets/themes/gitlab-theme.scss @@ -7,27 +7,27 @@ * $color-dark - */ @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { - header { - &.navbar-gitlab { - .header-logo { - background-color: $color-darker; - border-color: $color-darker; + .page-with-sidebar { + .header-logo { + background-color: $color; + border-color: $color; - a { + a { + color: $color-light; + + h3 { color: $color-light; } + } - &:hover { - background-color: $color-dark; - a { - color: #FFF; - } + &:hover { + background-color: $color-darker; + a { + color: #FFF; } } } - } - .page-with-sidebar { .collapse-nav a { color: #FFF; background: $color; @@ -87,7 +87,7 @@ } $theme-blue: #2980B9; -$theme-charcoal: #474D57; +$theme-charcoal: #333c47; $theme-graphite: #888888; $theme-gray: #373737; $theme-green: #019875; @@ -99,7 +99,7 @@ body { } &.ui_charcoal { - @include gitlab-theme(#979DA7, $theme-charcoal, #373D47, #24272D); + @include gitlab-theme(#c5d0de, $theme-charcoal, #2b333d, #24272D); } &.ui_graphite { diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index c7c643db40..5f70582cbb 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -29,6 +29,15 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController end end + import_sources = params[:application_setting][:import_sources] + if import_sources.nil? + params[:application_setting][:import_sources] = [] + else + import_sources.map! do |source| + source.to_str + end + end + params.require(:application_setting).permit( :default_projects_limit, :default_branch_protection, @@ -37,6 +46,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :gravatar_enabled, :twitter_sharing_enabled, :sign_in_text, + :help_page_text, :home_page_url, :after_sign_out_path, :max_attachment_size, @@ -46,7 +56,9 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController :restricted_signup_domains_raw, :version_check_enabled, :user_oauth_applications, + :ci_enabled, restricted_visibility_levels: [], + import_sources: [] ) end end diff --git a/app/controllers/admin/hooks_controller.rb b/app/controllers/admin/hooks_controller.rb index 690096bdbc..d670386f8c 100644 --- a/app/controllers/admin/hooks_controller.rb +++ b/app/controllers/admin/hooks_controller.rb @@ -39,6 +39,6 @@ class Admin::HooksController < Admin::ApplicationController end def hook_params - params.require(:hook).permit(:url) + params.require(:hook).permit(:url, :enable_ssl_verification) end end diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb new file mode 100644 index 0000000000..3b070e65d0 --- /dev/null +++ b/app/controllers/admin/labels_controller.rb @@ -0,0 +1,58 @@ +class Admin::LabelsController < Admin::ApplicationController + before_action :set_label, only: [:show, :edit, :update, :destroy] + + def index + @labels = Label.templates.page(params[:page]).per(PER_PAGE) + end + + def show + end + + def new + @label = Label.new + end + + def edit + end + + def create + @label = Label.new(label_params) + @label.template = true + + if @label.save + redirect_to admin_labels_url, notice: "Label was created" + else + render :new + end + end + + def update + if @label.update(label_params) + redirect_to admin_labels_path, notice: 'label was successfully updated.' + else + render :edit + end + end + + def destroy + @label.destroy + @labels = Label.templates + + respond_to do |format| + format.html do + redirect_to(admin_labels_path, notice: 'Label was removed') + end + format.js + end + end + + private + + def set_label + @label = Label.find(params[:id]) + end + + def label_params + params[:label].permit(:title, :color) + end +end diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index da5f5bb83f..ae1de06b98 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -9,6 +9,7 @@ class Admin::ProjectsController < Admin::ApplicationController @projects = @projects.where("visibility_level IN (?)", params[:visibility_levels]) if params[:visibility_levels].present? @projects = @projects.with_push if params[:with_push].present? @projects = @projects.abandoned if params[:abandoned].present? + @projects = @projects.non_archived unless params[:with_archived].present? @projects = @projects.search(params[:name]) if params[:name].present? @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(PER_PAGE) diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 6092c79c25..a19b1abee2 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -56,7 +56,7 @@ class Admin::UsersController < Admin::ApplicationController end def confirm - if user.confirm! + if user.confirm redirect_to :back, notice: "Successfully confirmed" else redirect_to :back, alert: "Error occurred. User was not confirmed" diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3ce8dbc940..9b6472a7b1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,5 @@ require 'gon' +require 'fogbugz' class ApplicationController < ActionController::Base include Gitlab::CurrentSettings @@ -20,7 +21,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :abilities, :can?, :current_application_settings - helper_method :github_import_enabled?, :gitlab_import_enabled?, :bitbucket_import_enabled? + helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled? rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) @@ -55,7 +56,9 @@ class ApplicationController < ActionController::Base def authenticate_user!(*args) # If user is not signed-in and tries to access root_path - redirect him to landing page - if current_application_settings.home_page_url.present? + # Don't redirect to the default URL to prevent endless redirections + if current_application_settings.home_page_url.present? && + current_application_settings.home_page_url.chomp('/') != Gitlab.config.gitlab['url'].chomp('/') if current_user.nil? && root_path == request.path redirect_to current_application_settings.home_page_url and return end @@ -131,9 +134,6 @@ class ApplicationController < ActionController::Base def repository @repository ||= project.repository - rescue Grit::NoSuchPathError => e - log_exception(e) - nil end def authorize_project!(action) @@ -190,11 +190,12 @@ class ApplicationController < ActionController::Base end def add_gon_variables + gon.api_version = API::API.version + gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s gon.default_issues_tracker = Project.new.default_issue_tracker.to_param - gon.api_version = API::API.version - gon.relative_url_root = Gitlab.config.gitlab.relative_url_root - gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s - gon.max_file_size = current_application_settings.max_attachment_size; + gon.max_file_size = current_application_settings.max_attachment_size + gon.relative_url_root = Gitlab.config.gitlab.relative_url_root + gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class if current_user gon.current_user_id = current_user.id @@ -298,15 +299,47 @@ class ApplicationController < ActionController::Base @issuable_finder.execute end + def import_sources_enabled? + !current_application_settings.import_sources.empty? + end + def github_import_enabled? + current_application_settings.import_sources.include?('github') + end + + def github_import_configured? Gitlab::OAuth::Provider.enabled?(:github) end def gitlab_import_enabled? + request.host != 'gitlab.com' && current_application_settings.import_sources.include?('gitlab') + end + + def gitlab_import_configured? Gitlab::OAuth::Provider.enabled?(:gitlab) end def bitbucket_import_enabled? + current_application_settings.import_sources.include?('bitbucket') + end + + def bitbucket_import_configured? Gitlab::OAuth::Provider.enabled?(:bitbucket) && Gitlab::BitbucketImport.public_key.present? end + + def gitorious_import_enabled? + current_application_settings.import_sources.include?('gitorious') + end + + def google_code_import_enabled? + current_application_settings.import_sources.include?('google_code') + end + + def fogbugz_import_enabled? + current_application_settings.import_sources.include?('fogbugz') + end + + def git_import_enabled? + current_application_settings.import_sources.include?('git') + end end diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb index 904d26a39f..202e9da9ee 100644 --- a/app/controllers/autocomplete_controller.rb +++ b/app/controllers/autocomplete_controller.rb @@ -32,6 +32,7 @@ class AutocompleteController < ApplicationController @users ||= User.none @users = @users.search(params[:search]) if params[:search].present? @users = @users.active + @users = @users.reorder(:name) @users = @users.page(params[:page]).per(PER_PAGE) unless params[:search].present? diff --git a/app/controllers/ci/admin/application_controller.rb b/app/controllers/ci/admin/application_controller.rb new file mode 100644 index 0000000000..4ec2dc9c2c --- /dev/null +++ b/app/controllers/ci/admin/application_controller.rb @@ -0,0 +1,10 @@ +module Ci + module Admin + class ApplicationController < Ci::ApplicationController + before_action :authenticate_user! + before_action :authenticate_admin! + + layout "ci/admin" + end + end +end diff --git a/app/controllers/ci/admin/application_settings_controller.rb b/app/controllers/ci/admin/application_settings_controller.rb new file mode 100644 index 0000000000..71e253fac6 --- /dev/null +++ b/app/controllers/ci/admin/application_settings_controller.rb @@ -0,0 +1,31 @@ +module Ci + class Admin::ApplicationSettingsController < Ci::Admin::ApplicationController + before_action :set_application_setting + + def show + end + + def update + if @application_setting.update_attributes(application_setting_params) + redirect_to ci_admin_application_settings_path, + notice: 'Application settings saved successfully' + else + render :show + end + end + + private + + def set_application_setting + @application_setting = Ci::ApplicationSetting.current + @application_setting ||= Ci::ApplicationSetting.create_from_defaults + end + + def application_setting_params + params.require(:application_setting).permit( + :all_broken_builds, + :add_pusher, + ) + end + end +end diff --git a/app/controllers/ci/admin/builds_controller.rb b/app/controllers/ci/admin/builds_controller.rb new file mode 100644 index 0000000000..38abfdeafb --- /dev/null +++ b/app/controllers/ci/admin/builds_controller.rb @@ -0,0 +1,18 @@ +module Ci + class Admin::BuildsController < Ci::Admin::ApplicationController + def index + @scope = params[:scope] + @builds = Ci::Build.order('created_at DESC').page(params[:page]).per(30) + + @builds = + case @scope + when "pending" + @builds.pending + when "running" + @builds.running + else + @builds + end + end + end +end diff --git a/app/controllers/ci/admin/events_controller.rb b/app/controllers/ci/admin/events_controller.rb new file mode 100644 index 0000000000..5939efff98 --- /dev/null +++ b/app/controllers/ci/admin/events_controller.rb @@ -0,0 +1,9 @@ +module Ci + class Admin::EventsController < Ci::Admin::ApplicationController + EVENTS_PER_PAGE = 50 + + def index + @events = Ci::Event.admin.order('created_at DESC').page(params[:page]).per(EVENTS_PER_PAGE) + end + end +end diff --git a/app/controllers/ci/admin/projects_controller.rb b/app/controllers/ci/admin/projects_controller.rb new file mode 100644 index 0000000000..5bbd0ce739 --- /dev/null +++ b/app/controllers/ci/admin/projects_controller.rb @@ -0,0 +1,19 @@ +module Ci + class Admin::ProjectsController < Ci::Admin::ApplicationController + def index + @projects = Ci::Project.ordered_by_last_commit_date.page(params[:page]).per(30) + end + + def destroy + project.destroy + + redirect_to ci_projects_url + end + + protected + + def project + @project ||= Ci::Project.find(params[:id]) + end + end +end diff --git a/app/controllers/ci/admin/runner_projects_controller.rb b/app/controllers/ci/admin/runner_projects_controller.rb new file mode 100644 index 0000000000..e7de6eb12c --- /dev/null +++ b/app/controllers/ci/admin/runner_projects_controller.rb @@ -0,0 +1,34 @@ +module Ci + class Admin::RunnerProjectsController < Ci::Admin::ApplicationController + layout 'ci/project' + + def index + @runner_projects = project.runner_projects.all + @runner_project = project.runner_projects.new + end + + def create + @runner = Ci::Runner.find(params[:runner_project][:runner_id]) + + if @runner.assign_to(project, current_user) + redirect_to ci_admin_runner_path(@runner) + else + redirect_to ci_admin_runner_path(@runner), alert: 'Failed adding runner to project' + end + end + + def destroy + rp = Ci::RunnerProject.find(params[:id]) + runner = rp.runner + rp.destroy + + redirect_to ci_admin_runner_path(runner) + end + + private + + def project + @project ||= Ci::Project.find(params[:project_id]) + end + end +end diff --git a/app/controllers/ci/admin/runners_controller.rb b/app/controllers/ci/admin/runners_controller.rb new file mode 100644 index 0000000000..dc3508b49d --- /dev/null +++ b/app/controllers/ci/admin/runners_controller.rb @@ -0,0 +1,69 @@ +module Ci + class Admin::RunnersController < Ci::Admin::ApplicationController + before_action :runner, except: :index + + def index + @runners = Ci::Runner.order('id DESC') + @runners = @runners.search(params[:search]) if params[:search].present? + @runners = @runners.page(params[:page]).per(30) + @active_runners_cnt = Ci::Runner.where("contacted_at > ?", 1.minutes.ago).count + end + + def show + @builds = @runner.builds.order('id DESC').first(30) + @projects = Ci::Project.all + @projects = @projects.search(params[:search]) if params[:search].present? + @projects = @projects.where("ci_projects.id NOT IN (?)", @runner.projects.pluck(:id)) if @runner.projects.any? + @projects = @projects.page(params[:page]).per(30) + end + + def update + @runner.update_attributes(runner_params) + + respond_to do |format| + format.js + format.html { redirect_to ci_admin_runner_path(@runner) } + end + end + + def destroy + @runner.destroy + + redirect_to ci_admin_runners_path + end + + def resume + if @runner.update_attributes(active: true) + redirect_to ci_admin_runners_path, notice: 'Runner was successfully updated.' + else + redirect_to ci_admin_runners_path, alert: 'Runner was not updated.' + end + end + + def pause + if @runner.update_attributes(active: false) + redirect_to ci_admin_runners_path, notice: 'Runner was successfully updated.' + else + redirect_to ci_admin_runners_path, alert: 'Runner was not updated.' + end + end + + def assign_all + Ci::Project.unassigned(@runner).all.each do |project| + @runner.assign_to(project, current_user) + end + + redirect_to ci_admin_runner_path(@runner), notice: "Runner was assigned to all projects" + end + + private + + def runner + @runner ||= Ci::Runner.find(params[:id]) + end + + def runner_params + params.require(:runner).permit(:token, :description, :tag_list, :contacted_at, :active) + end + end +end diff --git a/app/controllers/ci/application_controller.rb b/app/controllers/ci/application_controller.rb new file mode 100644 index 0000000000..d8227e632e --- /dev/null +++ b/app/controllers/ci/application_controller.rb @@ -0,0 +1,83 @@ +module Ci + class ApplicationController < ::ApplicationController + before_action :check_enable_flag! + + def self.railtie_helpers_paths + "app/helpers/ci" + end + + helper_method :gl_project + + private + + def check_enable_flag! + unless current_application_settings.ci_enabled + redirect_to(disabled_ci_projects_path) + return + end + end + + def authenticate_public_page! + unless project.public + authenticate_user! + + return access_denied! unless can?(current_user, :read_project, gl_project) + end + end + + def authenticate_token! + unless project.valid_token?(params[:token]) + return head(403) + end + end + + def authorize_access_project! + unless can?(current_user, :read_project, gl_project) + return page_404 + end + end + + def authorize_manage_builds! + unless can?(current_user, :manage_builds, gl_project) + return page_404 + end + end + + def authenticate_admin! + return render_404 unless current_user.is_admin? + end + + def authorize_manage_project! + unless can?(current_user, :admin_project, gl_project) + return page_404 + end + end + + def page_404 + render file: "#{Rails.root}/public/404.html", status: 404, layout: false + end + + def default_headers + headers['X-Frame-Options'] = 'DENY' + headers['X-XSS-Protection'] = '1; mode=block' + end + + # JSON for infinite scroll via Pager object + def pager_json(partial, count) + html = render_to_string( + partial, + layout: false, + formats: [:html] + ) + + render json: { + html: html, + count: count + } + end + + def gl_project + ::Project.find(@project.gitlab_id) + end + end +end diff --git a/app/controllers/ci/builds_controller.rb b/app/controllers/ci/builds_controller.rb new file mode 100644 index 0000000000..80ee866679 --- /dev/null +++ b/app/controllers/ci/builds_controller.rb @@ -0,0 +1,78 @@ +module Ci + class BuildsController < Ci::ApplicationController + before_action :authenticate_user!, except: [:status, :show] + before_action :authenticate_public_page!, only: :show + before_action :project + before_action :authorize_access_project!, except: [:status, :show] + before_action :authorize_manage_project!, except: [:status, :show, :retry, :cancel] + before_action :authorize_manage_builds!, only: [:retry, :cancel] + before_action :build, except: [:show] + layout 'ci/build' + + def show + if params[:id] =~ /\A\d+\Z/ + @build = build + else + # try to find commit by sha + commit = commit_by_sha + + if commit + # Redirect to commit page + redirect_to ci_project_ref_commit_path(@project, @build.commit.ref, @build.commit.sha) + return + end + end + + raise ActiveRecord::RecordNotFound unless @build + + @builds = @project.commits.find_by_sha(@build.sha).builds.order('id DESC') + @builds = @builds.where("id not in (?)", @build.id).page(params[:page]).per(20) + @commit = @build.commit + + respond_to do |format| + format.html + format.json do + render json: @build.to_json(methods: :trace_html) + end + end + end + + def retry + if @build.commands.blank? + return page_404 + end + + build = Ci::Build.retry(@build) + + if params[:return_to] + redirect_to URI.parse(params[:return_to]).path + else + redirect_to ci_project_build_path(project, build) + end + end + + def status + render json: @build.to_json(only: [:status, :id, :sha, :coverage], methods: :sha) + end + + def cancel + @build.cancel + + redirect_to ci_project_build_path(@project, @build) + end + + protected + + def project + @project = Ci::Project.find(params[:project_id]) + end + + def build + @build ||= project.builds.unscoped.find_by(id: params[:id]) + end + + def commit_by_sha + @project.commits.find_by(sha: params[:id]) + end + end +end diff --git a/app/controllers/ci/charts_controller.rb b/app/controllers/ci/charts_controller.rb new file mode 100644 index 0000000000..aa875e7098 --- /dev/null +++ b/app/controllers/ci/charts_controller.rb @@ -0,0 +1,24 @@ +module Ci + class ChartsController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_access_project! + before_action :authorize_manage_project! + + layout 'ci/project' + + def show + @charts = {} + @charts[:week] = Ci::Charts::WeekChart.new(@project) + @charts[:month] = Ci::Charts::MonthChart.new(@project) + @charts[:year] = Ci::Charts::YearChart.new(@project) + @charts[:build_times] = Ci::Charts::BuildTime.new(@project) + end + + protected + + def project + @project = Ci::Project.find(params[:project_id]) + end + end +end diff --git a/app/controllers/ci/commits_controller.rb b/app/controllers/ci/commits_controller.rb new file mode 100644 index 0000000000..7a0a500fbe --- /dev/null +++ b/app/controllers/ci/commits_controller.rb @@ -0,0 +1,38 @@ +module Ci + class CommitsController < Ci::ApplicationController + before_action :authenticate_user!, except: [:status, :show] + before_action :authenticate_public_page!, only: :show + before_action :project + before_action :authorize_access_project!, except: [:status, :show, :cancel] + before_action :authorize_manage_builds!, only: [:cancel] + before_action :commit, only: :show + layout 'ci/commit' + + def show + @builds = @commit.builds + end + + def status + commit = Ci::Project.find(params[:project_id]).commits.find_by_sha_and_ref!(params[:id], params[:ref_id]) + render json: commit.to_json(only: [:id, :sha], methods: [:status, :coverage]) + rescue ActiveRecord::RecordNotFound + render json: { status: "not_found" } + end + + def cancel + commit.builds.running_or_pending.each(&:cancel) + + redirect_to ci_project_ref_commits_path(project, commit.ref, commit.sha) + end + + private + + def project + @project ||= Ci::Project.find(params[:project_id]) + end + + def commit + @commit ||= Ci::Project.find(params[:project_id]).commits.find_by_sha_and_ref!(params[:id], params[:ref_id]) + end + end +end diff --git a/app/controllers/ci/events_controller.rb b/app/controllers/ci/events_controller.rb new file mode 100644 index 0000000000..89b784a1e8 --- /dev/null +++ b/app/controllers/ci/events_controller.rb @@ -0,0 +1,21 @@ +module Ci + class EventsController < Ci::ApplicationController + EVENTS_PER_PAGE = 50 + + before_action :authenticate_user! + before_action :project + before_action :authorize_manage_project! + + layout 'ci/project' + + def index + @events = project.events.order("created_at DESC").page(params[:page]).per(EVENTS_PER_PAGE) + end + + private + + def project + @project ||= Ci::Project.find(params[:project_id]) + end + end +end diff --git a/app/controllers/ci/lints_controller.rb b/app/controllers/ci/lints_controller.rb new file mode 100644 index 0000000000..a81e4e319f --- /dev/null +++ b/app/controllers/ci/lints_controller.rb @@ -0,0 +1,26 @@ +module Ci + class LintsController < Ci::ApplicationController + before_action :authenticate_user! + + def show + end + + def create + if params[:content].blank? + @status = false + @error = "Please provide content of .gitlab-ci.yml" + else + @config_processor = Ci::GitlabCiYamlProcessor.new params[:content] + @stages = @config_processor.stages + @builds = @config_processor.builds + @status = true + end + rescue Ci::GitlabCiYamlProcessor::ValidationError => e + @error = e.message + @status = false + rescue Exception => e + @error = "Undefined error" + @status = false + end + end +end diff --git a/app/controllers/ci/projects_controller.rb b/app/controllers/ci/projects_controller.rb new file mode 100644 index 0000000000..40b61edb0a --- /dev/null +++ b/app/controllers/ci/projects_controller.rb @@ -0,0 +1,125 @@ +module Ci + class ProjectsController < Ci::ApplicationController + PROJECTS_BATCH = 100 + + before_action :authenticate_user!, except: [:build, :badge, :index, :show] + before_action :authenticate_public_page!, only: :show + before_action :project, only: [:build, :integration, :show, :badge, :edit, :update, :destroy, :toggle_shared_runners, :dumped_yaml] + before_action :authorize_access_project!, except: [:build, :badge, :index, :show, :new, :create, :disabled] + before_action :authorize_manage_project!, only: [:edit, :integration, :update, :destroy, :toggle_shared_runners, :dumped_yaml] + before_action :authenticate_token!, only: [:build] + before_action :no_cache, only: [:badge] + skip_before_action :check_enable_flag!, only: [:disabled] + protect_from_forgery except: :build + + layout 'ci/project', except: [:index, :disabled] + + def disabled + end + + def index + @limit, @offset = (params[:limit] || PROJECTS_BATCH).to_i, (params[:offset] || 0).to_i + @page = @offset == 0 ? 1 : (@offset / @limit + 1) + + if current_user + @projects = ProjectListBuilder.new.execute(current_user, params[:search]) + + @projects = @projects.page(@page).per(@limit) + + @total_count = @projects.size + end + + respond_to do |format| + format.json do + pager_json("ci/projects/index", @total_count) + end + format.html + end + end + + def show + @ref = params[:ref] + + @commits = @project.commits.reverse_order + @commits = @commits.where(ref: @ref) if @ref + @commits = @commits.page(params[:page]).per(20) + end + + def integration + end + + def create + project_data = OpenStruct.new(JSON.parse(params["project"])) + + unless can?(current_user, :admin_project, ::Project.find(project_data.id)) + return redirect_to ci_root_path, alert: 'You have to have at least master role to enable CI for this project' + end + + @project = Ci::CreateProjectService.new.execute(current_user, project_data) + + if @project.persisted? + redirect_to ci_project_path(@project, show_guide: true), notice: 'Project was successfully created.' + else + redirect_to :back, alert: 'Cannot save project' + end + end + + def edit + end + + def update + if project.update_attributes(project_params) + Ci::EventService.new.change_project_settings(current_user, project) + + redirect_to :back, notice: 'Project was successfully updated.' + else + render action: "edit" + end + end + + def destroy + project.gl_project.gitlab_ci_service.update_attributes(active: false) + project.destroy + + Ci::EventService.new.remove_project(current_user, project) + + redirect_to ci_projects_url + end + + # Project status badge + # Image with build status for sha or ref + def badge + image = Ci::ImageForBuildService.new.execute(@project, params) + + send_file image.path, filename: image.name, disposition: 'inline', type:"image/svg+xml" + end + + def toggle_shared_runners + project.toggle!(:shared_runners_enabled) + redirect_to :back + end + + def dumped_yaml + send_data @project.generated_yaml_config, filename: '.gitlab-ci.yml' + end + + protected + + def project + @project ||= Ci::Project.find(params[:id]) + end + + def no_cache + response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" + response.headers["Pragma"] = "no-cache" + response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" + end + + def project_params + params.require(:project).permit(:path, :timeout, :timeout_in_minutes, :default_ref, :always_build, + :polling_interval, :public, :ssh_url_to_repo, :allow_git_fetch, :email_recipients, + :email_add_pusher, :email_only_broken_builds, :coverage_regex, :shared_runners_enabled, :token, + { variables_attributes: [:id, :key, :value, :_destroy] }) + end + end +end diff --git a/app/controllers/ci/runner_projects_controller.rb b/app/controllers/ci/runner_projects_controller.rb new file mode 100644 index 0000000000..a8bdd5bb36 --- /dev/null +++ b/app/controllers/ci/runner_projects_controller.rb @@ -0,0 +1,34 @@ +module Ci + class RunnerProjectsController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_manage_project! + + layout 'ci/project' + + def create + @runner = Ci::Runner.find(params[:runner_project][:runner_id]) + + return head(403) unless current_user.ci_authorized_runners.include?(@runner) + + if @runner.assign_to(project, current_user) + redirect_to ci_project_runners_path(project) + else + redirect_to ci_project_runners_path(project), alert: 'Failed adding runner to project' + end + end + + def destroy + runner_project = project.runner_projects.find(params[:id]) + runner_project.destroy + + redirect_to ci_project_runners_path(project) + end + + private + + def project + @project ||= Ci::Project.find(params[:project_id]) + end + end +end diff --git a/app/controllers/ci/runners_controller.rb b/app/controllers/ci/runners_controller.rb new file mode 100644 index 0000000000..a672370302 --- /dev/null +++ b/app/controllers/ci/runners_controller.rb @@ -0,0 +1,73 @@ +module Ci + class RunnersController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :set_runner, only: [:edit, :update, :destroy, :pause, :resume, :show] + before_action :authorize_access_project! + before_action :authorize_manage_project! + + layout 'ci/project' + + def index + @runners = @project.runners.order('id DESC') + @specific_runners = + Ci::Runner.specific.includes(:runner_projects). + where(Ci::RunnerProject.table_name => { project_id: current_user.authorized_projects } ). + where.not(id: @runners).order("#{Ci::Runner.table_name}.id DESC").page(params[:page]).per(20) + @shared_runners = Ci::Runner.shared.active + @shared_runners_count = @shared_runners.count(:all) + end + + def edit + end + + def update + if @runner.update_attributes(runner_params) + redirect_to edit_ci_project_runner_path(@project, @runner), notice: 'Runner was successfully updated.' + else + redirect_to edit_ci_project_runner_path(@project, @runner), alert: 'Runner was not updated.' + end + end + + def destroy + if @runner.only_for?(@project) + @runner.destroy + end + + redirect_to ci_project_runners_path(@project) + end + + def resume + if @runner.update_attributes(active: true) + redirect_to ci_project_runners_path(@project, @runner), notice: 'Runner was successfully updated.' + else + redirect_to ci_project_runners_path(@project, @runner), alert: 'Runner was not updated.' + end + end + + def pause + if @runner.update_attributes(active: false) + redirect_to ci_project_runners_path(@project, @runner), notice: 'Runner was successfully updated.' + else + redirect_to ci_project_runners_path(@project, @runner), alert: 'Runner was not updated.' + end + end + + def show + end + + protected + + def project + @project = Ci::Project.find(params[:project_id]) + end + + def set_runner + @runner ||= @project.runners.find(params[:id]) + end + + def runner_params + params.require(:runner).permit(:description, :tag_list, :contacted_at, :active) + end + end +end diff --git a/app/controllers/ci/services_controller.rb b/app/controllers/ci/services_controller.rb new file mode 100644 index 0000000000..52c96a34ce --- /dev/null +++ b/app/controllers/ci/services_controller.rb @@ -0,0 +1,59 @@ +module Ci + class ServicesController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_access_project! + before_action :authorize_manage_project! + before_action :service, only: [:edit, :update, :test] + + respond_to :html + + layout 'ci/project' + + def index + @project.build_missing_services + @services = @project.services.reload + end + + def edit + end + + def update + if @service.update_attributes(service_params) + redirect_to edit_ci_project_service_path(@project, @service.to_param) + else + render 'edit' + end + end + + def test + last_build = @project.builds.last + + if @service.execute(last_build) + message = { notice: 'We successfully tested the service' } + else + message = { alert: 'We tried to test the service but error occurred' } + end + + redirect_to :back, message + end + + private + + def project + @project = Ci::Project.find(params[:project_id]) + end + + def service + @service ||= @project.services.find { |service| service.to_param == params[:id] } + end + + def service_params + params.require(:service).permit( + :type, :active, :webhook, :notify_only_broken_builds, + :email_recipients, :email_only_broken_builds, :email_add_pusher, + :hipchat_token, :hipchat_room, :hipchat_server + ) + end + end +end diff --git a/app/controllers/ci/triggers_controller.rb b/app/controllers/ci/triggers_controller.rb new file mode 100644 index 0000000000..a39cc5d3a5 --- /dev/null +++ b/app/controllers/ci/triggers_controller.rb @@ -0,0 +1,43 @@ +module Ci + class TriggersController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_access_project! + before_action :authorize_manage_project! + + layout 'ci/project' + + def index + @triggers = @project.triggers + @trigger = Ci::Trigger.new + end + + def create + @trigger = @project.triggers.new + @trigger.save + + if @trigger.valid? + redirect_to ci_project_triggers_path(@project) + else + @triggers = @project.triggers.select(&:persisted?) + render :index + end + end + + def destroy + trigger.destroy + + redirect_to ci_project_triggers_path(@project) + end + + private + + def trigger + @trigger ||= @project.triggers.find(params[:id]) + end + + def project + @project = Ci::Project.find(params[:project_id]) + end + end +end diff --git a/app/controllers/ci/variables_controller.rb b/app/controllers/ci/variables_controller.rb new file mode 100644 index 0000000000..9c6c775fde --- /dev/null +++ b/app/controllers/ci/variables_controller.rb @@ -0,0 +1,33 @@ +module Ci + class VariablesController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_access_project! + before_action :authorize_manage_project! + + layout 'ci/project' + + def show + end + + def update + if project.update_attributes(project_params) + Ci::EventService.new.change_project_settings(current_user, project) + + redirect_to ci_project_variables_path(project), notice: 'Variables were successfully updated.' + else + render action: 'show' + end + end + + private + + def project + @project ||= Ci::Project.find(params[:project_id]) + end + + def project_params + params.require(:project).permit({ variables_attributes: [:id, :key, :value, :_destroy] }) + end + end +end diff --git a/app/controllers/ci/web_hooks_controller.rb b/app/controllers/ci/web_hooks_controller.rb new file mode 100644 index 0000000000..24074a6d9a --- /dev/null +++ b/app/controllers/ci/web_hooks_controller.rb @@ -0,0 +1,53 @@ +module Ci + class WebHooksController < Ci::ApplicationController + before_action :authenticate_user! + before_action :project + before_action :authorize_access_project! + before_action :authorize_manage_project! + + layout 'ci/project' + + def index + @web_hooks = @project.web_hooks + @web_hook = Ci::WebHook.new + end + + def create + @web_hook = @project.web_hooks.new(web_hook_params) + @web_hook.save + + if @web_hook.valid? + redirect_to ci_project_web_hooks_path(@project) + else + @web_hooks = @project.web_hooks.select(&:persisted?) + render :index + end + end + + def test + Ci::TestHookService.new.execute(hook, current_user) + + redirect_to :back + end + + def destroy + hook.destroy + + redirect_to ci_project_web_hooks_path(@project) + end + + private + + def hook + @web_hook ||= @project.web_hooks.find(params[:id]) + end + + def project + @project = Ci::Project.find(params[:project_id]) + end + + def web_hook_params + params.require(:web_hook).permit(:url) + end + end +end diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb index da96171e88..467d0f81ac 100644 --- a/app/controllers/dashboard/projects_controller.rb +++ b/app/controllers/dashboard/projects_controller.rb @@ -1,6 +1,21 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController before_action :event_filter + def index + @projects = current_user.authorized_projects.sorted_by_activity.non_archived + @projects = @projects.includes(:namespace) + @last_push = current_user.recent_push + + respond_to do |format| + format.html + format.atom do + event_filter + load_events + render layout: false + end + end + end + def starred @projects = current_user.starred_projects @projects = @projects.includes(:namespace, :forked_from_project, :tags) diff --git a/app/controllers/dashboard/snippets_controller.rb b/app/controllers/dashboard/snippets_controller.rb new file mode 100644 index 0000000000..f4354c6d8c --- /dev/null +++ b/app/controllers/dashboard/snippets_controller.rb @@ -0,0 +1,10 @@ +class Dashboard::SnippetsController < Dashboard::ApplicationController + def index + @snippets = SnippetsFinder.new.execute(current_user, + filter: :by_user, + user: current_user, + scope: params[:scope] + ) + @snippets = @snippets.page(params[:page]).per(PER_PAGE) + end +end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index d2f0c43929..4ebb3d7276 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,28 +1,8 @@ class DashboardController < Dashboard::ApplicationController - before_action :load_projects - before_action :event_filter, only: :show + before_action :event_filter, only: :activity respond_to :html - def show - @projects = @projects.includes(:namespace) - @last_push = current_user.recent_push - - respond_to do |format| - format.html - - format.json do - load_events - pager_json("events/_events", @events.count) - end - - format.atom do - load_events - render layout: false - end - end - end - def merge_requests @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE) @@ -40,14 +20,30 @@ class DashboardController < Dashboard::ApplicationController end end - protected + def activity + @last_push = current_user.recent_push - def load_projects - @projects = current_user.authorized_projects.sorted_by_activity.non_archived + respond_to do |format| + format.html + + format.json do + load_events + pager_json("events/_events", @events.count) + end + end end + protected + def load_events - @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) + project_ids = + if params[:filter] == "starred" + current_user.starred_projects + else + current_user.authorized_projects + end.pluck(:id) + + @events = Event.in_projects(project_ids) @events = @event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end diff --git a/app/controllers/explore/application_controller.rb b/app/controllers/explore/application_controller.rb index 4b275033d2..461fc059a3 100644 --- a/app/controllers/explore/application_controller.rb +++ b/app/controllers/explore/application_controller.rb @@ -1,3 +1,5 @@ class Explore::ApplicationController < ApplicationController + skip_before_action :authenticate_user!, :reject_blocked + layout 'explore' end diff --git a/app/controllers/explore/groups_controller.rb b/app/controllers/explore/groups_controller.rb index 55cda0cff1..9575a87ee4 100644 --- a/app/controllers/explore/groups_controller.rb +++ b/app/controllers/explore/groups_controller.rb @@ -1,7 +1,4 @@ class Explore::GroupsController < Explore::ApplicationController - skip_before_action :authenticate_user!, - :reject_blocked, :set_current_user_for_observers - def index @groups = GroupsFinder.new.execute(current_user) @groups = @groups.search(params[:search]) if params[:search].present? diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb index e9bcb44f6b..a5aeaed66c 100644 --- a/app/controllers/explore/projects_controller.rb +++ b/app/controllers/explore/projects_controller.rb @@ -1,12 +1,10 @@ class Explore::ProjectsController < Explore::ApplicationController - skip_before_action :authenticate_user!, - :reject_blocked - def index @projects = ProjectsFinder.new.execute(current_user) @tags = @projects.tags_on(:tags) @projects = @projects.tagged_with(params[:tag]) if params[:tag].present? @projects = @projects.where(visibility_level: params[:visibility_level]) if params[:visibility_level].present? + @projects = @projects.non_archived @projects = @projects.search(params[:search]) if params[:search].present? @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.includes(:namespace).page(params[:page]).per(PER_PAGE) @@ -14,6 +12,7 @@ class Explore::ProjectsController < Explore::ApplicationController def trending @trending_projects = TrendingProjectsFinder.new.execute(current_user) + @trending_projects = @trending_projects.non_archived @trending_projects = @trending_projects.page(params[:page]).per(PER_PAGE) end diff --git a/app/controllers/explore/snippets_controller.rb b/app/controllers/explore/snippets_controller.rb new file mode 100644 index 0000000000..b70ac51d06 --- /dev/null +++ b/app/controllers/explore/snippets_controller.rb @@ -0,0 +1,6 @@ +class Explore::SnippetsController < Explore::ApplicationController + def index + @snippets = SnippetsFinder.new.execute(current_user, filter: :all) + @snippets = @snippets.page(params[:page]).per(PER_PAGE) + end +end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 279c6ef0f4..524218290c 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -4,7 +4,7 @@ class GroupsController < Groups::ApplicationController before_action :group, except: [:new, :create] # Authorize - before_action :authorize_read_group!, except: [:new, :create] + before_action :authorize_read_group!, except: [:show, :new, :create] before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects] before_action :authorize_create_group!, only: [:new, :create] @@ -14,6 +14,10 @@ class GroupsController < Groups::ApplicationController layout :determine_layout + def index + redirect_to(current_user ? dashboard_groups_path : explore_groups_path) + end + def new @group = Group.new end diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index 71831c5380..5505061547 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -1,7 +1,14 @@ class HelpController < ApplicationController + skip_before_action :authenticate_user!, :reject_blocked + layout 'help' def index + @help_index = File.read(Rails.root.join('doc', 'README.md')) + + # Prefix Markdown links with `help/` unless they already have been + # See http://rubular.com/r/nwwhzH6Z8X + @help_index.gsub!(/(\]\()(?!help\/)([^\)\(]+)(\))/, '\1help/\2\3') end def show diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb index 4e6c0b6663..f84f85a7df 100644 --- a/app/controllers/import/bitbucket_controller.rb +++ b/app/controllers/import/bitbucket_controller.rb @@ -13,10 +13,9 @@ class Import::BitbucketController < Import::BaseController access_token = client.get_token(request_token, params[:oauth_verifier], callback_import_bitbucket_url) - current_user.bitbucket_access_token = access_token.token - current_user.bitbucket_access_token_secret = access_token.secret + session[:bitbucket_access_token] = access_token.token + session[:bitbucket_access_token_secret] = access_token.secret - current_user.save redirect_to status_import_bitbucket_url end @@ -46,19 +45,20 @@ class Import::BitbucketController < Import::BaseController namespace = get_or_create_namespace || (render and return) - unless Gitlab::BitbucketImport::KeyAdder.new(repo, current_user).execute + unless Gitlab::BitbucketImport::KeyAdder.new(repo, current_user, access_params).execute @access_denied = true render return end - @project = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, current_user).execute + @project = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client - @client ||= Gitlab::BitbucketImport::Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) + @client ||= Gitlab::BitbucketImport::Client.new(session[:bitbucket_access_token], + session[:bitbucket_access_token_secret]) end def verify_bitbucket_import_enabled @@ -66,7 +66,7 @@ class Import::BitbucketController < Import::BaseController end def bitbucket_auth - if current_user.bitbucket_access_token.blank? + if session[:bitbucket_access_token].blank? go_to_bitbucket_for_permissions end end @@ -81,4 +81,13 @@ class Import::BitbucketController < Import::BaseController def bitbucket_unauthorized go_to_bitbucket_for_permissions end + + private + + def access_params + { + bitbucket_access_token: session[:bitbucket_access_token], + bitbucket_access_token_secret: session[:bitbucket_access_token_secret] + } + end end diff --git a/app/controllers/import/fogbugz_controller.rb b/app/controllers/import/fogbugz_controller.rb new file mode 100644 index 0000000000..849646cd66 --- /dev/null +++ b/app/controllers/import/fogbugz_controller.rb @@ -0,0 +1,104 @@ +class Import::FogbugzController < Import::BaseController + before_action :verify_fogbugz_import_enabled + before_action :user_map, only: [:new_user_map, :create_user_map] + + rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized + + def new + + end + + def callback + begin + res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys) + rescue + # If the URI is invalid various errors can occur + return redirect_to new_import_fogbugz_path, alert: 'Could not connect to FogBugz, check your URL' + end + session[:fogbugz_token] = res.get_token + session[:fogbugz_uri] = params[:uri] + + redirect_to new_user_map_import_fogbugz_path + end + + def new_user_map + + end + + def create_user_map + user_map = params[:users] + + unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? } + flash.now[:alert] = 'All users must have a name.' + + render 'new_user_map' and return + end + + session[:fogbugz_user_map] = user_map + + flash[:notice] = 'The user map has been saved. Continue by selecting the projects you want to import.' + + redirect_to status_import_fogbugz_path + end + + def status + unless client.valid? + return redirect_to new_import_fogbugz_path + end + + @repos = client.repos + + @already_added_projects = current_user.created_projects.where(import_type: 'fogbugz') + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.reject! { |repo| already_added_projects_names.include? repo.name } + end + + def jobs + jobs = current_user.created_projects.where(import_type: 'fogbugz').to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id] + repo = client.repo(@repo_id) + fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] } + @target_namespace = current_user.namespace + @project_name = repo.name + + namespace = @target_namespace + + umap = session[:fogbugz_user_map] || client.user_map + + @project = Gitlab::FogbugzImport::ProjectCreator.new(repo, fb_session, namespace, current_user, umap).execute + end + + private + + def client + @client ||= Gitlab::FogbugzImport::Client.new(token: session[:fogbugz_token], uri: session[:fogbugz_uri]) + end + + def user_map + @user_map ||= begin + user_map = client.user_map + + stored_user_map = session[:fogbugz_user_map] + user_map.update(stored_user_map) if stored_user_map + + user_map + end + end + + def fogbugz_unauthorized(exception) + redirect_to new_import_fogbugz_path, alert: exception.message + end + + def import_params + params.permit(:uri, :email, :password) + end + + def verify_fogbugz_import_enabled + not_found! unless fogbugz_import_enabled? + end +end diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index b9f99c1b88..f21fbd9ecc 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -5,9 +5,7 @@ class Import::GithubController < Import::BaseController rescue_from Octokit::Unauthorized, with: :github_unauthorized def callback - token = client.get_token(params[:code]) - current_user.github_access_token = token - current_user.save + session[:github_access_token] = client.get_token(params[:code]) redirect_to status_import_github_url end @@ -39,13 +37,13 @@ class Import::GithubController < Import::BaseController namespace = get_or_create_namespace || (render and return) - @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute + @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client - @client ||= Gitlab::GithubImport::Client.new(current_user.github_access_token) + @client ||= Gitlab::GithubImport::Client.new(session[:github_access_token]) end def verify_github_import_enabled @@ -53,7 +51,7 @@ class Import::GithubController < Import::BaseController end def github_auth - if current_user.github_access_token.blank? + if session[:github_access_token].blank? go_to_github_for_permissions end end @@ -65,4 +63,10 @@ class Import::GithubController < Import::BaseController def github_unauthorized go_to_github_for_permissions end + + private + + def access_params + { github_access_token: session[:github_access_token] } + end end diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb index 1b8962d892..27af19f5f6 100644 --- a/app/controllers/import/gitlab_controller.rb +++ b/app/controllers/import/gitlab_controller.rb @@ -5,9 +5,7 @@ class Import::GitlabController < Import::BaseController rescue_from OAuth2::Error, with: :gitlab_unauthorized def callback - token = client.get_token(params[:code], callback_import_gitlab_url) - current_user.gitlab_access_token = token - current_user.save + session[:gitlab_access_token] = client.get_token(params[:code], callback_import_gitlab_url) redirect_to status_import_gitlab_url end @@ -36,13 +34,13 @@ class Import::GitlabController < Import::BaseController namespace = get_or_create_namespace || (render and return) - @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute + @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user, access_params).execute end private def client - @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) + @client ||= Gitlab::GitlabImport::Client.new(session[:gitlab_access_token]) end def verify_gitlab_import_enabled @@ -50,7 +48,7 @@ class Import::GitlabController < Import::BaseController end def gitlab_auth - if current_user.gitlab_access_token.blank? + if session[:gitlab_access_token].blank? go_to_gitlab_for_permissions end end @@ -62,4 +60,10 @@ class Import::GitlabController < Import::BaseController def gitlab_unauthorized go_to_gitlab_for_permissions end + + private + + def access_params + { gitlab_access_token: session[:gitlab_access_token] } + end end diff --git a/app/controllers/import/gitorious_controller.rb b/app/controllers/import/gitorious_controller.rb index c121d2de7c..f24cdb3709 100644 --- a/app/controllers/import/gitorious_controller.rb +++ b/app/controllers/import/gitorious_controller.rb @@ -1,4 +1,5 @@ class Import::GitoriousController < Import::BaseController + before_action :verify_gitorious_import_enabled def new redirect_to client.authorize_url(callback_import_gitorious_url) @@ -40,4 +41,8 @@ class Import::GitoriousController < Import::BaseController @client ||= Gitlab::GitoriousImport::Client.new(session[:gitorious_repos]) end + def verify_gitorious_import_enabled + not_found! unless gitorious_import_enabled? + end + end diff --git a/app/controllers/import/google_code_controller.rb b/app/controllers/import/google_code_controller.rb index 4aa6d28c9a..82fadeb7e8 100644 --- a/app/controllers/import/google_code_controller.rb +++ b/app/controllers/import/google_code_controller.rb @@ -1,4 +1,5 @@ class Import::GoogleCodeController < Import::BaseController + before_action :verify_google_code_import_enabled before_action :user_map, only: [:new_user_map, :create_user_map] def new @@ -104,6 +105,10 @@ class Import::GoogleCodeController < Import::BaseController @client ||= Gitlab::GoogleCodeImport::Client.new(session[:google_code_dump]) end + def verify_google_code_import_enabled + not_found! unless google_code_import_enabled? + end + def user_map @user_map ||= begin user_map = client.user_map diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index eb3c823353..8ef10a17f5 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -24,7 +24,7 @@ class InvitesController < ApplicationController path = if current_user - dashboard_path + dashboard_projects_path else new_user_session_path end @@ -73,7 +73,7 @@ class InvitesController < ApplicationController path = group_path(group) else label = "who knows what" - path = dashboard_path + path = dashboard_projects_path end [label, path] diff --git a/app/controllers/namespaces_controller.rb b/app/controllers/namespaces_controller.rb index 83eec1bf4a..282012c60a 100644 --- a/app/controllers/namespaces_controller.rb +++ b/app/controllers/namespaces_controller.rb @@ -14,7 +14,7 @@ class NamespacesController < ApplicationController if user redirect_to user_path(user) - elsif group && can?(current_user, :read_group, group) + elsif group redirect_to group_path(group) elsif current_user.nil? authenticate_user! diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb index fc31118124..dc22101cd5 100644 --- a/app/controllers/oauth/applications_controller.rb +++ b/app/controllers/oauth/applications_controller.rb @@ -1,7 +1,7 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController include Gitlab::CurrentSettings include PageLayoutHelper - + before_action :verify_user_oauth_applications_enabled before_action :authenticate_user! diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb index f9af0871cf..e6b99be37f 100644 --- a/app/controllers/profiles/two_factor_auths_controller.rb +++ b/app/controllers/profiles/two_factor_auths_controller.rb @@ -9,7 +9,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController end def create - if current_user.valid_otp?(params[:pin_code]) + if current_user.validate_and_consume_otp!(params[:pin_code]) current_user.two_factor_enabled = true @codes = current_user.generate_otp_backup_codes! current_user.save! diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index b762518d37..8776721d24 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -13,30 +13,29 @@ class Projects::BlobController < Projects::ApplicationController before_action :commit, except: [:new, :create] before_action :blob, except: [:new, :create] before_action :from_merge_request, only: [:edit, :update] - before_action :after_edit_path, only: [:edit, :update] before_action :require_branch_head, only: [:edit, :update] + before_action :editor_variables, except: [:show, :preview, :diff] + before_action :after_edit_path, only: [:edit, :update] def new commit unless @repository.empty? end def create - file_path = File.join(@path, File.basename(params[:file_name])) - result = Files::CreateService.new( - @project, - current_user, - params.merge(new_branch: sanitized_new_branch_name), - @ref, - file_path - ).execute + result = Files::CreateService.new(@project, current_user, @commit_params).execute if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - ref = sanitized_new_branch_name.presence || @ref - redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(ref, file_path)) + respond_to do |format| + format.html { redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) } + format.json { render json: { message: "success", filePath: namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) } } + end else flash[:alert] = result[:message] - render :new + respond_to do |format| + format.html { render :new } + format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } } + end end end @@ -48,26 +47,20 @@ class Projects::BlobController < Projects::ApplicationController end def update - result = Files::UpdateService. - new( - @project, - current_user, - params.merge(new_branch: sanitized_new_branch_name), - @ref, - @path - ).execute + result = Files::UpdateService.new(@project, current_user, @commit_params).execute if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - - if from_merge_request - from_merge_request.reload_code + respond_to do |format| + format.html { redirect_to after_edit_path } + format.json { render json: { message: "success", filePath: after_edit_path } } end - - redirect_to after_edit_path else flash[:alert] = result[:message] - render :edit + respond_to do |format| + format.html { render :edit } + format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } } + end end end @@ -80,12 +73,11 @@ class Projects::BlobController < Projects::ApplicationController end def destroy - result = Files::DeleteService.new(@project, current_user, params, @ref, @path).execute + result = Files::DeleteService.new(@project, current_user, @commit_params).execute if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to namespace_project_tree_path(@project.namespace, @project, - @ref) + redirect_to namespace_project_tree_path(@project.namespace, @project, @target_branch) else flash[:alert] = result[:message] render :show @@ -135,7 +127,6 @@ class Projects::BlobController < Projects::ApplicationController @id = params[:id] @ref, @path = extract_ref(@id) - rescue InvalidPathError not_found! end @@ -145,8 +136,8 @@ class Projects::BlobController < Projects::ApplicationController if from_merge_request diffs_namespace_project_merge_request_path(from_merge_request.target_project.namespace, from_merge_request.target_project, from_merge_request) + "#file-path-#{hexdigest(@path)}" - elsif sanitized_new_branch_name.present? - namespace_project_blob_path(@project.namespace, @project, File.join(sanitized_new_branch_name, @path)) + elsif @target_branch.present? + namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @path)) else namespace_project_blob_path(@project.namespace, @project, @id) end @@ -160,4 +151,33 @@ class Projects::BlobController < Projects::ApplicationController def sanitized_new_branch_name @new_branch ||= sanitize(strip_tags(params[:new_branch])) end + + def editor_variables + @current_branch = @ref + @target_branch = (sanitized_new_branch_name || @ref) + + @file_path = + if action_name.to_s == 'create' + if params[:file].present? + params[:file_name] = params[:file].original_filename + end + File.join(@path, File.basename(params[:file_name])) + else + @path + end + + if params[:file].present? + params[:content] = Base64.encode64(params[:file].read) + params[:encoding] = 'base64' + end + + @commit_params = { + file_path: @file_path, + current_branch: @current_branch, + target_branch: @target_branch, + commit_message: params[:commit_message], + file_content: params[:content], + file_content_encoding: params[:encoding] + } + end end diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb index c5f085c236..d15004f93a 100644 --- a/app/controllers/projects/compare_controller.rb +++ b/app/controllers/projects/compare_controller.rb @@ -13,18 +13,15 @@ class Projects::CompareController < Projects::ApplicationController base_ref = Addressable::URI.unescape(params[:from]) @ref = head_ref = Addressable::URI.unescape(params[:to]) - compare_result = CompareService.new.execute( - current_user, - @project, - head_ref, - @project, - base_ref - ) + compare_result = CompareService.new. + execute(@project, head_ref, @project, base_ref) - @commits = compare_result.commits - @diffs = compare_result.diffs - @commit = @commits.last - @line_notes = [] + if compare_result + @commits = compare_result.commits + @diffs = compare_result.diffs + @commit = @commits.last + @line_notes = [] + end end def create diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb index 9e72597ea8..8a785076bb 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -13,10 +13,14 @@ class Projects::ForksController < Projects::ApplicationController @forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute if @forked_project.saved? && @forked_project.forked? - redirect_to( - namespace_project_path(@forked_project.namespace, @forked_project), - notice: 'Project was successfully forked.' - ) + if @forked_project.import_in_progress? + redirect_to namespace_project_import_path(@forked_project.namespace, @forked_project) + else + redirect_to( + namespace_project_path(@forked_project.namespace, @forked_project), + notice: 'Project was successfully forked.' + ) + end else render :error end diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb index 76062446c9..4e5b4125f5 100644 --- a/app/controllers/projects/hooks_controller.rb +++ b/app/controllers/projects/hooks_controller.rb @@ -53,6 +53,7 @@ class Projects::HooksController < Projects::ApplicationController end def hook_params - params.require(:hook).permit(:url, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events) + params.require(:hook).permit(:url, :push_events, :issues_events, + :merge_requests_events, :tag_push_events, :note_events, :enable_ssl_verification) end end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index d126519831..c1231994f2 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -1,14 +1,13 @@ -require 'gitlab/satellite/satellite' - class Projects::MergeRequestsController < Projects::ApplicationController before_action :module_enabled before_action :merge_request, only: [ - :edit, :update, :show, :diffs, :commits, :automerge, :automerge_check, + :edit, :update, :show, :diffs, :commits, :merge, :merge_check, :ci_status, :toggle_subscription ] before_action :closes_issues, only: [:edit, :update, :show, :diffs, :commits] before_action :validates_merge_request, only: [:show, :diffs, :commits] before_action :define_show_vars, only: [:show, :diffs, :commits] + before_action :ensure_ref_fetched, only: [:show, :commits, :diffs] # Allow read any merge_request before_action :authorize_read_merge_request! @@ -137,7 +136,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController end end - def automerge_check + def merge_check if @merge_request.unchecked? @merge_request.check_if_can_be_merged end @@ -147,11 +146,11 @@ class Projects::MergeRequestsController < Projects::ApplicationController render partial: "projects/merge_requests/widget/show.html.haml", layout: false end - def automerge + def merge return access_denied! unless @merge_request.can_be_merged_by?(current_user) - if @merge_request.automergeable? - AutoMergeWorker.perform_async(@merge_request.id, current_user.id, params) + if @merge_request.mergeable? + MergeWorker.perform_async(@merge_request.id, current_user.id, params) @status = true else @status = false @@ -279,4 +278,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController :state_event, :description, :task_num, label_ids: [] ) end + + # Make sure merge requests created before 8.0 + # have head file in refs/merge-requests/ + def ensure_ref_fetched + @merge_request.ensure_ref_fetched + end end diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb index 9efe9704d1..86f4a02a6e 100644 --- a/app/controllers/projects/milestones_controller.rb +++ b/app/controllers/projects/milestones_controller.rb @@ -66,12 +66,7 @@ class Projects::MilestonesController < Projects::ApplicationController def destroy return access_denied! unless can?(current_user, :admin_milestone, @project) - update_params = { milestone: nil } - @milestone.issues.each do |issue| - Issues::UpdateService.new(@project, current_user, update_params).execute(issue) - end - - @milestone.destroy + Milestones::DestroyService.new(project, current_user).execute(milestone) respond_to do |format| format.html { redirect_to namespace_project_milestones_path } diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb index b82b6f45d5..cf73bc01c8 100644 --- a/app/controllers/projects/project_members_controller.rb +++ b/app/controllers/projects/project_members_controller.rb @@ -78,7 +78,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController @project.project_members.find_by(user_id: current_user).destroy respond_to do |format| - format.html { redirect_to dashboard_path } + format.html { redirect_to dashboard_projects_path } format.js { render nothing: true } end end diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 647c145407..5f6fbce795 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -17,8 +17,7 @@ class Projects::RawController < Projects::ApplicationController send_data( @blob.data, type: type, - disposition: 'inline', - filename: @blob.name + disposition: 'inline' ) else not_found! @@ -30,6 +29,8 @@ class Projects::RawController < Projects::ApplicationController def get_blob_type if @blob.text? 'text/plain; charset=utf-8' + elsif @blob.image? + @blob.content_type else 'application/octet-stream' end diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 0110553247..3a22ed832a 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -2,13 +2,13 @@ class Projects::ServicesController < Projects::ApplicationController ALLOWED_PARAMS = [:title, :token, :type, :active, :api_key, :api_version, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server, :teamcity_url, :build_type, + :build_key, :server, :teamcity_url, :drone_url, :build_type, :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :colorize_messages, :channels, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url, :notify, :color, - :server_host, :server_port, :default_irc_uri] + :server_host, :server_port, :default_irc_uri, :enable_ssl_verification] # Authorize before_action :authorize_admin_project! before_action :service, only: [:edit, :update, :test] diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb index 6430663742..b07a2a8db2 100644 --- a/app/controllers/projects/snippets_controller.rb +++ b/app/controllers/projects/snippets_controller.rb @@ -30,9 +30,14 @@ class Projects::SnippetsController < Projects::ApplicationController def create @snippet = CreateSnippetService.new(@project, current_user, snippet_params).execute - respond_with(@snippet, - location: namespace_project_snippet_path(@project.namespace, - @project, @snippet)) + + if @snippet.valid? + respond_with(@snippet, + location: namespace_project_snippet_path(@project.namespace, + @project, @snippet)) + else + render :new + end end def edit diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 50512cb6dc..51c26a6a46 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -5,7 +5,6 @@ class Projects::WikisController < Projects::ApplicationController before_action :authorize_create_wiki!, only: [:edit, :create, :history] before_action :authorize_admin_wiki!, only: :destroy before_action :load_project_wiki - include WikiHelper def pages @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index dafc11d070..213c2a7173 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -10,6 +10,10 @@ class ProjectsController < ApplicationController layout :determine_layout + def index + redirect_to(current_user ? root_path : explore_root_path) + end + def new @project = Project.new end @@ -82,6 +86,10 @@ class ProjectsController < ApplicationController if @project.empty_repo? render 'projects/empty' else + if current_user + @membership = @project.project_member_by_id(current_user.id) + end + render :show end else @@ -105,7 +113,7 @@ class ProjectsController < ApplicationController if request.referer.include?('/admin') redirect_to admin_namespaces_projects_path else - redirect_to dashboard_path + redirect_to dashboard_projects_path end rescue Projects::DestroyService::DestroyError => ex redirect_to edit_project_path(@project), alert: ex.message diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index fdfe00dc13..54171ff67c 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -6,10 +6,10 @@ # # For users who haven't customized the setting, we simply delegate to # `DashboardController#show`, which is the default. -class RootController < DashboardController - before_action :redirect_to_custom_dashboard, only: [:show] +class RootController < Dashboard::ProjectsController + before_action :redirect_to_custom_dashboard, only: [:index] - def show + def index super end @@ -20,6 +20,7 @@ class RootController < DashboardController case current_user.dashboard when 'stars' + flash.keep redirect_to starred_dashboard_projects_path else return diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 4e2ea6c571..eb0408a95e 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -23,7 +23,7 @@ class SearchController < ApplicationController @search_results = if @project - unless %w(blobs notes issues merge_requests wiki_blobs). + unless %w(blobs notes issues merge_requests milestones wiki_blobs). include?(@scope) @scope = 'blobs' end @@ -36,7 +36,7 @@ class SearchController < ApplicationController Search::SnippetService.new(current_user, params).execute else - unless %w(projects issues merge_requests).include?(@scope) + unless %w(projects issues merge_requests milestones).include?(@scope) @scope = 'projects' end Search::GlobalService.new(current_user, params).execute diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 8389f07a3b..1b60d3e27d 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,6 +8,8 @@ class SessionsController < Devise::SessionsController def new if Gitlab.config.ldap.enabled @ldap_servers = Gitlab::LDAP::Config.servers + else + @ldap_servers = [] end super @@ -97,7 +99,7 @@ class SessionsController < Devise::SessionsController end def valid_otp_attempt?(user) - user.valid_otp?(user_params[:otp_attempt]) || + user.validate_and_consume_otp!(user_params[:otp_attempt]) || user.invalidate_otp_backup_code!(user_params[:otp_attempt]) end diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index 8e7e45c781..9f9f9a92f1 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -24,13 +24,9 @@ class SnippetsController < ApplicationController scope: params[:scope] }). page(params[:page]).per(PER_PAGE) - if @user == current_user - render 'current_user_index' - else - render 'user_index' - end + render 'index' else - @snippets = SnippetsFinder.new.execute(current_user, filter: :all).page(params[:page]).per(PER_PAGE) + redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path) end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 2bb5c338cf..1484356a7f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -51,10 +51,6 @@ class UsersController < ApplicationController def set_user @user = User.find_by_username!(params[:username]) - - unless current_user || @user.public_profile? - return authenticate_user! - end end def authorized_projects_ids diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb index a79bd47d98..9ea342cb26 100644 --- a/app/finders/trending_projects_finder.rb +++ b/app/finders/trending_projects_finder.rb @@ -7,8 +7,7 @@ class TrendingProjectsFinder # Determine trending projects based on comments count # for period of time - ex. month projects.joins(:notes).where('notes.created_at > ?', start_date). - select("projects.*, count(notes.id) as ncount"). - group("projects.id").reorder("ncount DESC") + group("projects.id").reorder("count(notes.id) DESC") end private diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a803b66c50..39ab83ccf1 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -13,7 +13,9 @@ module ApplicationHelper # current_controller?(:commits) # => false # current_controller?(:commits, :tree) # => true def current_controller?(*args) - args.any? { |v| v.to_s.downcase == controller.controller_name } + args.any? do |v| + v.to_s.downcase == controller.controller_name || v.to_s.downcase == controller.controller_path + end end # Check if a particular action is the current one @@ -82,7 +84,7 @@ module ApplicationHelper end def default_avatar - image_path('no_avatar.png') + 'no_avatar.png' end def last_commit(project) @@ -201,7 +203,7 @@ module ApplicationHelper class: "#{html_class} js-timeago", datetime: time.getutc.iso8601, title: time.in_time_zone.stamp('Aug 21, 2011 9:23pm'), - data: { toggle: 'tooltip', placement: placement } + data: { toggle: 'tooltip', placement: placement, container: 'body' } element += javascript_tag "$('.js-timeago').timeago()" unless skip_js diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 61d1438394..7d6b58ee21 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -39,4 +39,21 @@ module ApplicationSettingsHelper end end end + + # Return a group of checkboxes that use Bootstrap's button plugin for a + # toggle button effect. + def import_sources_checkboxes(help_block_id) + Gitlab::ImportSources.options.map do |name, source| + checked = current_application_settings.import_sources.include?(source) + css_class = 'btn' + css_class += ' active' if checked + checkbox_name = 'application_setting[import_sources][]' + + label_tag(checkbox_name, class: css_class) do + check_box_tag(checkbox_name, source, checked, + autocomplete: 'off', + 'aria-describedby' => help_block_id) + name + end + end + end end diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb index 0e7a37b4cc..ce7e9b1db8 100644 --- a/app/helpers/auth_helper.rb +++ b/app/helpers/auth_helper.rb @@ -1,6 +1,6 @@ module AuthHelper PROVIDERS_WITH_ICONS = %w(twitter github gitlab bitbucket google_oauth2).freeze - FORM_BASED_PROVIDERS = [/\Aldap/, 'kerberos'].freeze + FORM_BASED_PROVIDERS = [/\Aldap/, 'kerberos', 'crowd'].freeze def ldap_enabled? Gitlab.config.ldap.enabled @@ -26,6 +26,10 @@ module AuthHelper auth_providers.select { |provider| form_based_provider?(provider) } end + def crowd_enabled? + auth_providers.include? :crowd + end + def button_based_providers auth_providers.reject { |provider| form_based_provider?(provider) } end @@ -36,7 +40,7 @@ module AuthHelper if provider_has_icon?(provider) file_name = "#{provider.to_s.split('_').first}_#{size}.png" - image_tag(image_path("auth_buttons/#{file_name}"), alt: label, title: "Sign in with #{label}") + image_tag("auth_buttons/#{file_name}", alt: label, title: "Sign in with #{label}") else label end diff --git a/app/helpers/ci/application_helper.rb b/app/helpers/ci/application_helper.rb new file mode 100644 index 0000000000..9fe6282bb8 --- /dev/null +++ b/app/helpers/ci/application_helper.rb @@ -0,0 +1,54 @@ +module Ci + module ApplicationHelper + def loader_html + image_tag 'ci/loader.gif', alt: 'Loading' + end + + def date_from_to(from, to) + "#{from.to_s(:short)} - #{to.to_s(:short)}" + end + + def duration_in_words(finished_at, started_at) + if finished_at && started_at + interval_in_seconds = finished_at.to_i - started_at.to_i + elsif started_at + interval_in_seconds = Time.now.to_i - started_at.to_i + end + + time_interval_in_words(interval_in_seconds) + end + + def time_interval_in_words(interval_in_seconds) + minutes = interval_in_seconds / 60 + seconds = interval_in_seconds - minutes * 60 + + if minutes >= 1 + "#{pluralize(minutes, "minute")} #{pluralize(seconds, "second")}" + else + "#{pluralize(seconds, "second")}" + end + end + + def ci_icon_for_status(status) + icon_name = + case status + when 'success' + 'check-square' + when 'failed' + 'close' + when 'running', 'pending' + 'clock-o' + else + 'circle' + end + + icon(icon_name) + end + + def ci_status_with_icon(status) + content_tag :span, class: "ci-status ci-#{status}" do + ci_icon_for_status(status) + ' '.html_safe + status + end + end + end +end diff --git a/app/helpers/ci/builds_helper.rb b/app/helpers/ci/builds_helper.rb new file mode 100644 index 0000000000..5d6e785d95 --- /dev/null +++ b/app/helpers/ci/builds_helper.rb @@ -0,0 +1,19 @@ +module Ci + module BuildsHelper + def build_ref_link build + gitlab_ref_link build.project, build.ref + end + + def build_compare_link build + gitlab_compare_link build.project, build.commit.short_before_sha, build.short_sha + end + + def build_commit_link build + gitlab_commit_link build.project, build.short_sha + end + + def build_url(build) + ci_project_build_url(build.project, build) + end + end +end diff --git a/app/helpers/ci/commits_helper.rb b/app/helpers/ci/commits_helper.rb new file mode 100644 index 0000000000..9069aed5b4 --- /dev/null +++ b/app/helpers/ci/commits_helper.rb @@ -0,0 +1,24 @@ +module Ci + module CommitsHelper + def ci_commit_path(commit) + ci_project_ref_commits_path(commit.project, commit.ref, commit.sha) + end + + def commit_link(commit) + link_to(commit.short_sha, ci_commit_path(commit)) + end + + def truncate_first_line(message, length = 50) + truncate(message.each_line.first.chomp, length: length) if message + end + + def ci_commit_title(commit) + content_tag :span do + link_to( + simple_sanitize(commit.project.name), ci_project_path(commit.project) + ) + ' @ ' + + gitlab_commit_link(@project, @commit.sha) + end + end + end +end diff --git a/app/helpers/ci/gitlab_helper.rb b/app/helpers/ci/gitlab_helper.rb new file mode 100644 index 0000000000..2b89a0ce93 --- /dev/null +++ b/app/helpers/ci/gitlab_helper.rb @@ -0,0 +1,36 @@ +module Ci + module GitlabHelper + def no_turbolink + { :"data-no-turbolink" => "data-no-turbolink" } + end + + def gitlab_ref_link project, ref + gitlab_url = project.gitlab_url.dup + gitlab_url << "/commits/#{ref}" + link_to ref, gitlab_url, no_turbolink + end + + def gitlab_compare_link project, before, after + gitlab_url = project.gitlab_url.dup + gitlab_url << "/compare/#{before}...#{after}" + + link_to "#{before}...#{after}", gitlab_url, no_turbolink + end + + def gitlab_commit_link project, sha + gitlab_url = project.gitlab_url.dup + gitlab_url << "/commit/#{sha}" + link_to Ci::Commit.truncate_sha(sha), gitlab_url, no_turbolink + end + + def yaml_web_editor_link(project) + commits = project.commits + + if commits.any? && commits.last.push_data[:ci_yaml_file] + "#{@project.gitlab_url}/edit/master/.gitlab-ci.yml" + else + "#{@project.gitlab_url}/new/master" + end + end + end +end diff --git a/app/helpers/ci/icons_helper.rb b/app/helpers/ci/icons_helper.rb new file mode 100644 index 0000000000..be40f79e88 --- /dev/null +++ b/app/helpers/ci/icons_helper.rb @@ -0,0 +1,11 @@ +module Ci + module IconsHelper + def boolean_to_icon(value) + if value.to_s == "true" + content_tag :i, nil, class: 'fa fa-circle cgreen' + else + content_tag :i, nil, class: 'fa fa-power-off clgray' + end + end + end +end diff --git a/app/helpers/ci/projects_helper.rb b/app/helpers/ci/projects_helper.rb new file mode 100644 index 0000000000..fd991a4165 --- /dev/null +++ b/app/helpers/ci/projects_helper.rb @@ -0,0 +1,36 @@ +module Ci + module ProjectsHelper + def ref_tab_class ref = nil + 'active' if ref == @ref + end + + def success_ratio(success_builds, failed_builds) + failed_builds = failed_builds.count(:all) + success_builds = success_builds.count(:all) + + return 100 if failed_builds.zero? + + ratio = (success_builds.to_f / (success_builds + failed_builds)) * 100 + ratio.to_i + end + + def markdown_badge_code(project, ref) + url = status_ci_project_url(project, ref: ref, format: 'png') + "[![build status](#{url})](#{ci_project_url(project, ref: ref)})" + end + + def html_badge_code(project, ref) + url = status_ci_project_url(project, ref: ref, format: 'png') + "
" + end + + def project_uses_specific_runner?(project) + project.runners.any? + end + + def no_runners_for_project?(project) + project.runners.blank? && + Ci::Runner.shared.blank? + end + end +end diff --git a/app/helpers/ci/routes_helper.rb b/app/helpers/ci/routes_helper.rb new file mode 100644 index 0000000000..42cd54b064 --- /dev/null +++ b/app/helpers/ci/routes_helper.rb @@ -0,0 +1,29 @@ +module Ci + module RoutesHelper + class Base + include Gitlab::Application.routes.url_helpers + + def default_url_options + { + host: Settings.gitlab['host'], + protocol: Settings.gitlab['https'] ? "https" : "http", + port: Settings.gitlab['port'] + } + end + end + + def url_helpers + @url_helpers ||= Base.new + end + + def self.method_missing(method, *args, &block) + @url_helpers ||= Base.new + + if @url_helpers.respond_to?(method) + @url_helpers.send(method, *args, &block) + else + super method, *args, &block + end + end + end +end diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb new file mode 100644 index 0000000000..03c9914641 --- /dev/null +++ b/app/helpers/ci/runners_helper.rb @@ -0,0 +1,22 @@ +module Ci + module RunnersHelper + def runner_status_icon(runner) + unless runner.contacted_at + return content_tag :i, nil, + class: "fa fa-warning-sign", + title: "New runner. Has not connected yet" + end + + status = + if runner.active? + runner.contacted_at > 3.hour.ago ? :online : :offline + else + :paused + end + + content_tag :i, nil, + class: "fa fa-circle runner-status-#{status}", + title: "Runner is #{status}, last contact was #{time_ago_in_words(runner.contacted_at)} ago" + end + end +end diff --git a/app/helpers/ci/triggers_helper.rb b/app/helpers/ci/triggers_helper.rb new file mode 100644 index 0000000000..0d2438928c --- /dev/null +++ b/app/helpers/ci/triggers_helper.rb @@ -0,0 +1,7 @@ +module Ci + module TriggersHelper + def ci_build_trigger_url(project_id, ref_name) + "#{Settings.gitlab_ci.url}/ci/api/v1/projects/#{project_id}/refs/#{ref_name}/trigger" + end + end +end diff --git a/app/helpers/ci/user_helper.rb b/app/helpers/ci/user_helper.rb new file mode 100644 index 0000000000..c332d6ed9c --- /dev/null +++ b/app/helpers/ci/user_helper.rb @@ -0,0 +1,15 @@ +module Ci + module UserHelper + def user_avatar_url(user = nil, size = nil, default = 'identicon') + size = 40 if size.nil? || size <= 0 + + if user.blank? || user.avatar_url.blank? + 'ci/no_avatar.png' + elsif /^(http(s?):\/\/(www|secure)\.gravatar\.com\/avatar\/(\w*))/ =~ user.avatar_url + Regexp.last_match[0] + "?s=#{size}&d=#{default}" + else + user.avatar_url + end + end + end +end diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index 1bd3ec5e0e..6ffa1a7121 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -137,7 +137,7 @@ module DiffHelper # Always use HTML to handle case where JSON diff rendered this button params_copy.delete(:format) - link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] != 'parallel' ? 'btn btn-sm active' : 'btn btn-sm') do + link_to url_for(params_copy), id: "inline-diff-btn", class: (params[:view] != 'parallel' ? 'btn btn-sm active' : 'btn btn-sm') do 'Inline' end end @@ -148,7 +148,7 @@ module DiffHelper # Always use HTML to handle case where JSON diff rendered this button params_copy.delete(:format) - link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] == 'parallel' ? 'btn active btn-sm' : 'btn btn-sm') do + link_to url_for(params_copy), id: "parallel-diff-btn", class: (params[:view] == 'parallel' ? 'btn active btn-sm' : 'btn btn-sm') do 'Side-by-side' end end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 8428281f8f..6f69c2a9f3 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -27,16 +27,13 @@ module EventsHelper key = key.to_s active = 'active' if @event_filter.active?(key) link_opts = { - class: 'event_filter_link', + class: "event-filter-link btn btn-default #{active}", id: "#{key}_event_filter", title: "Filter by #{tooltip.downcase}", - data: { toggle: 'tooltip', placement: 'top' } } - content_tag :li, class: "filter_icon #{active}" do - link_to request.path, link_opts do - icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) - end + link_to request.path, link_opts do + content_tag(:span, ' ' + tooltip) end end @@ -49,6 +46,14 @@ module EventsHelper } end + def event_preposition(event) + if event.push? || event.commented? || event.target + "at" + elsif event.milestone? + "in" + end + end + def event_feed_title(event) words = [] words << event.author_name @@ -65,8 +70,11 @@ module EventsHelper words << "##{truncate event.note_target_iid}" end words << "at" + elsif event.milestone? + words << "##{event.target_iid}" if event.target_iid + words << "in" elsif event.target - words << "##{event.target_iid}:" + words << "##{event.target_iid}:" words << event.target.title if event.target.respond_to?(:title) words << "at" end diff --git a/app/helpers/explore_helper.rb b/app/helpers/explore_helper.rb index 7616fe6bad..0d291f9a87 100644 --- a/app/helpers/explore_helper.rb +++ b/app/helpers/explore_helper.rb @@ -10,7 +10,7 @@ module ExploreHelper options = exist_opts.merge(options) - path = request.path + path = explore_projects_path path << "?#{options.to_param}" path end diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index eb3f72a307..78bf25f55e 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -1,9 +1,6 @@ require 'nokogiri' module GitlabMarkdownHelper - include Gitlab::Markdown - include PreferencesHelper - # Use this in places where you would normally use link_to(gfm(...), ...). # # It solves a problem occurring with nested links (i.e. @@ -22,7 +19,7 @@ module GitlabMarkdownHelper escape_once(body) end - gfm_body = gfm(escaped_body, {}, html_options) + gfm_body = Gitlab::Markdown.gfm(escaped_body, project: @project, current_user: current_user) fragment = Nokogiri::XML::DocumentFragment.parse(gfm_body) if fragment.children.size == 1 && fragment.children[0].name == 'a' @@ -39,32 +36,38 @@ module GitlabMarkdownHelper end end + # Add any custom CSS classes to the GFM-generated reference links + if html_options[:class] + fragment.css('a.gfm').add_class(html_options[:class]) + end + fragment.to_html.html_safe end - MARKDOWN_OPTIONS = { - no_intra_emphasis: true, - tables: true, - fenced_code_blocks: true, - strikethrough: true, - lax_spacing: true, - space_after_headers: true, - superscript: true, - footnotes: true - }.freeze + def markdown(text, context = {}) + context.reverse_merge!( + current_user: current_user, + path: @path, + project: @project, + project_wiki: @project_wiki, + ref: @ref + ) - def markdown(text, options={}) - unless @markdown && options == @options - @options = options + Gitlab::Markdown.render(text, context) + end - # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch - rend = Redcarpet::Render::GitlabHTML.new(self, user_color_scheme_class, options) + # TODO (rspeicher): Remove all usages of this helper and just call `markdown` + # with a custom pipeline depending on the content being rendered + def gfm(text, options = {}) + options.reverse_merge!( + current_user: current_user, + path: @path, + project: @project, + project_wiki: @project_wiki, + ref: @ref + ) - # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use - @markdown = Redcarpet::Markdown.new(rend, MARKDOWN_OPTIONS) - end - - @markdown.render(text).html_safe + Gitlab::Markdown.gfm(text, options) end def asciidoc(text) diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index d0fae255a0..e0816f4e71 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -17,6 +17,14 @@ module GitlabRoutingHelper namespace_project_path(project.namespace, project, *args) end + def project_files_path(project, *args) + namespace_project_tree_path(project.namespace, project, @ref || project.repository.root_ref) + end + + def project_commits_path(project, *args) + namespace_project_commits_path(project.namespace, project, @ref || project.repository.root_ref) + end + def activity_project_path(project, *args) activity_namespace_project_path(project.namespace, project, *args) end diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb index e1dda20de8..1e372d5631 100644 --- a/app/helpers/graph_helper.rb +++ b/app/helpers/graph_helper.rb @@ -1,7 +1,10 @@ module GraphHelper def get_refs(repo, commit) refs = "" - refs << commit.ref_names(repo).join(' ') + # Commit::ref_names already strips the refs/XXX from important refs (e.g. refs/heads/XXX) + # so anything leftover is internally used by GitLab + commit_refs = commit.ref_names(repo).reject{ |name| name.starts_with?('refs/') } + refs << commit_refs.join(' ') # append note count refs << "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0 diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index b067cb54a4..1d36969cd6 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -27,7 +27,16 @@ module GroupsHelper if group && group.avatar.present? group.avatar.url else - image_path('no_group_avatar.png') + 'no_group_avatar.png' + end + end + + def group_title(group, name = nil, url = nil) + full_title = link_to(simple_sanitize(group.name), group_path(group)) + full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name + + content_tag :span do + full_title end end end diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index 30b17a736a..1cf5b96481 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -20,7 +20,7 @@ module IconsHelper end def boolean_to_icon(value) - if value.to_s == "true" + if value icon('circle', class: 'cgreen') else icon('power-off', class: 'clgray') diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 2f8e64c375..cf11f8e532 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -12,4 +12,49 @@ module NotificationsHelper icon('circle-o', class: 'ns-default') end end + + def notification_list_item(notification_level, user_membership) + case notification_level + when Notification::N_DISABLED + content_tag(:li, class: active_level_for(user_membership, Notification::N_DISABLED)) do + link_to '#', class: 'update-notification', data: { notification_level: Notification::N_DISABLED } do + icon('microphone-slash fw', text: 'Disabled') + end + end + when Notification::N_PARTICIPATING + content_tag(:li, class: active_level_for(user_membership, Notification::N_PARTICIPATING)) do + link_to '#', class: 'update-notification', data: { notification_level: Notification::N_PARTICIPATING } do + icon('volume-up fw', text: 'Participate') + end + end + when Notification::N_WATCH + content_tag(:li, class: active_level_for(user_membership, Notification::N_WATCH)) do + link_to '#', class: 'update-notification', data: { notification_level: Notification::N_WATCH } do + icon('eye fw', text: 'Watch') + end + end + when Notification::N_MENTION + content_tag(:li, class: active_level_for(user_membership, Notification::N_MENTION)) do + link_to '#', class: 'update-notification', data: { notification_level: Notification::N_MENTION } do + icon('at fw', text: 'On mention') + end + end + when Notification::N_GLOBAL + content_tag(:li, class: active_level_for(user_membership, Notification::N_GLOBAL)) do + link_to '#', class: 'update-notification', data: { notification_level: Notification::N_GLOBAL } do + icon('globe fw', text: 'Global') + end + end + else + # do nothing + end + end + + def notification_label(user_membership) + Notification.new(user_membership).to_s + end + + def active_level_for(user_membership, level) + 'active' if user_membership.notification_level == level + end end diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index 01b6a63552..df37be51ce 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -23,4 +23,34 @@ module PageLayoutHelper @sidebar end end + + def fluid_layout(enabled = false) + if @fluid_layout.nil? + @fluid_layout = enabled + else + @fluid_layout + end + end + + def blank_container(enabled = false) + if @blank_container.nil? + @blank_container = enabled + else + @blank_container + end + end + + def container_class + css_class = "container-fluid" + + unless fluid_layout + css_class += " container-limited" + end + + if blank_container + css_class += " container-blank" + end + + css_class + end end diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index ea774e28ec..7f1b6a6992 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -1,25 +1,5 @@ # Helper methods for per-User preferences module PreferencesHelper - COLOR_SCHEMES = { - 1 => 'white', - 2 => 'dark', - 3 => 'solarized-light', - 4 => 'solarized-dark', - 5 => 'monokai', - } - COLOR_SCHEMES.default = 'white' - - # Helper method to access the COLOR_SCHEMES - # - # The keys are the `color_scheme_ids` - # The values are the `name` of the scheme. - # - # The preview images are `name-scheme-preview.png` - # The stylesheets should use the css class `.name` - def color_schemes - COLOR_SCHEMES.freeze - end - # Maps `dashboard` values to more user-friendly option text DASHBOARD_CHOICES = { projects: 'Your Projects (default)', @@ -50,12 +30,11 @@ module PreferencesHelper end def user_application_theme - theme = Gitlab::Themes.by_id(current_user.try(:theme_id)) - theme.css_class + Gitlab::Themes.for_user(current_user).css_class end - def user_color_scheme_class - COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user) + def user_color_scheme + Gitlab::ColorSchemes.for_user(current_user).css_class end def prefer_readme? diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index ab9b068de0..7b4747ce3d 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -43,24 +43,22 @@ module ProjectsHelper end end - def project_title(project) - if project.group - content_tag :span do - link_to( - simple_sanitize(project.group.name), group_path(project.group) - ) + ' / ' + - link_to(simple_sanitize(project.name), - project_path(project)) - end - else - owner = project.namespace.owner - content_tag :span do - link_to( - simple_sanitize(owner.name), user_path(owner) - ) + ' / ' + - link_to(simple_sanitize(project.name), - project_path(project)) + def project_title(project, name = nil, url = nil) + namespace_link = + if project.group + link_to(simple_sanitize(project.group.name), group_path(project.group)) + else + owner = project.namespace.owner + link_to(simple_sanitize(owner.name), user_path(owner)) end + + project_link = link_to(simple_sanitize(project.name), project_path(project)) + + full_title = namespace_link + ' / ' + project_link + full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name + + content_tag :span do + full_title end end @@ -158,8 +156,8 @@ module ProjectsHelper end end - def repository_size(project = nil) - "#{(project || @project).repository_size} MB" + def repository_size(project = @project) + "#{project.repository_size} MB" rescue # In order to prevent 500 error # when application cannot allocate memory @@ -315,6 +313,10 @@ module ProjectsHelper end end + def current_ref + @ref || @repository.try(:root_ref) + end + private def filename_path(project, filename) diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index 77727337f0..0e7d8065ac 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -67,6 +67,14 @@ module TabHelper path.any? do |single_path| current_path?(single_path) end + elsif page = options.delete(:page) + unless page.respond_to?(:each) + page = [page] + end + + page.any? do |single_page| + current_page?(single_page) + end else c = options.delete(:controller) a = options.delete(:action) diff --git a/app/helpers/version_check_helper.rb b/app/helpers/version_check_helper.rb index f64d730b44..a674564c4e 100644 --- a/app/helpers/version_check_helper.rb +++ b/app/helpers/version_check_helper.rb @@ -1,6 +1,6 @@ module VersionCheckHelper def version_status_badge - if Rails.env.production? + if Rails.env.production? && current_application_settings.version_check_enabled image_tag VersionCheck.new.url end end diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb deleted file mode 100644 index f8a96516e6..0000000000 --- a/app/helpers/wiki_helper.rb +++ /dev/null @@ -1,24 +0,0 @@ -module WikiHelper - # Rails v4.1.9+ escapes all model IDs, converting slashes into %2F. The - # only way around this is to implement our own path generators. - def namespace_project_wiki_path(namespace, project, wiki_page, *args) - slug = - case wiki_page - when Symbol - wiki_page - when String - wiki_page - else - wiki_page.slug - end - namespace_project_path(namespace, project) + "/wikis/#{slug}" - end - - def edit_namespace_project_wiki_path(namespace, project, wiki_page, *args) - namespace_project_wiki_path(namespace, project, wiki_page) + '/edit' - end - - def history_namespace_project_wiki_path(namespace, project, wiki_page, *args) - namespace_project_wiki_path(namespace, project, wiki_page) + '/history' - end -end diff --git a/app/mailers/base_mailer.rb b/app/mailers/base_mailer.rb new file mode 100644 index 0000000000..aedb088918 --- /dev/null +++ b/app/mailers/base_mailer.rb @@ -0,0 +1,32 @@ +class BaseMailer < ActionMailer::Base + add_template_helper ApplicationHelper + add_template_helper GitlabMarkdownHelper + + attr_accessor :current_user + helper_method :current_user, :can? + + default from: Proc.new { default_sender_address.format } + default reply_to: Proc.new { default_reply_to_address.format } + + def self.delay + delay_for(2.seconds) + end + + def can? + Ability.abilities.allowed?(current_user, action, subject) + end + + private + + def default_sender_address + address = Mail::Address.new(Gitlab.config.gitlab.email_from) + address.display_name = Gitlab.config.gitlab.email_display_name + address + end + + def default_reply_to_address + address = Mail::Address.new(Gitlab.config.gitlab.email_reply_to) + address.display_name = Gitlab.config.gitlab.email_display_name + address + end +end diff --git a/app/mailers/ci/emails/builds.rb b/app/mailers/ci/emails/builds.rb new file mode 100644 index 0000000000..6fb4fba85e --- /dev/null +++ b/app/mailers/ci/emails/builds.rb @@ -0,0 +1,17 @@ +module Ci + module Emails + module Builds + def build_fail_email(build_id, to) + @build = Ci::Build.find(build_id) + @project = @build.project + mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha)) + end + + def build_success_email(build_id, to) + @build = Ci::Build.find(build_id) + @project = @build.project + mail(to: to, subject: subject("Build success for #{@project.name}", @build.short_sha)) + end + end + end +end diff --git a/app/mailers/ci/notify.rb b/app/mailers/ci/notify.rb new file mode 100644 index 0000000000..4462da0d7d --- /dev/null +++ b/app/mailers/ci/notify.rb @@ -0,0 +1,47 @@ +module Ci + class Notify < ActionMailer::Base + include Ci::Emails::Builds + + add_template_helper Ci::ApplicationHelper + add_template_helper Ci::GitlabHelper + + default_url_options[:host] = Gitlab.config.gitlab.host + default_url_options[:protocol] = Gitlab.config.gitlab.protocol + default_url_options[:port] = Gitlab.config.gitlab.port unless Gitlab.config.gitlab_on_standard_port? + default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root + + default from: Gitlab.config.gitlab.email_from + + # Just send email with 3 seconds delay + def self.delay + delay_for(2.seconds) + end + + private + + # Formats arguments into a String suitable for use as an email subject + # + # extra - Extra Strings to be inserted into the subject + # + # Examples + # + # >> subject('Lorem ipsum') + # => "GitLab-CI | Lorem ipsum" + # + # # Automatically inserts Project name when @project is set + # >> @project = Project.last + # => # + # >> subject('Lorem ipsum') + # => "GitLab-CI | Ruby on Rails | Lorem ipsum " + # + # # Accepts multiple arguments + # >> subject('Lorem ipsum', 'Dolor sit amet') + # => "GitLab-CI | Lorem ipsum | Dolor sit amet" + def subject(*extra) + subject = "GitLab-CI" + subject << (@project ? " | #{@project.name}" : "") + subject << " | " + extra.join(' | ') if extra.present? + subject + end + end +end diff --git a/app/mailers/email_rejection_mailer.rb b/app/mailers/email_rejection_mailer.rb new file mode 100644 index 0000000000..883f1c73ad --- /dev/null +++ b/app/mailers/email_rejection_mailer.rb @@ -0,0 +1,21 @@ +class EmailRejectionMailer < BaseMailer + def rejection(reason, original_raw, can_retry = false) + @reason = reason + @original_message = Mail::Message.new(original_raw) + + return unless @original_message.from + + headers = { + to: @original_message.from, + subject: "[Rejected] #{@original_message.subject}" + } + + headers['Message-ID'] = SecureRandom.hex + headers['In-Reply-To'] = @original_message.message_id + headers['References'] = @original_message.message_id + + headers['Reply-To'] = @original_message.to.first if can_retry + + mail(headers) + end +end diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb index 687bac3aa3..2c035fbb70 100644 --- a/app/mailers/emails/issues.rb +++ b/app/mailers/emails/issues.rb @@ -8,6 +8,8 @@ module Emails from: sender(@issue.author_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})")) + + SentNotification.record(@issue, recipient_id, reply_key) end def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id) @@ -19,6 +21,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})")) + + SentNotification.record(@issue, recipient_id, reply_key) end def closed_issue_email(recipient_id, issue_id, updated_by_user_id) @@ -30,6 +34,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})")) + + SentNotification.record(@issue, recipient_id, reply_key) end def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) @@ -42,6 +48,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})")) + + SentNotification.record(@issue, recipient_id, reply_key) end end end diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb index 512a8f7ea6..7923fb770d 100644 --- a/app/mailers/emails/merge_requests.rb +++ b/app/mailers/emails/merge_requests.rb @@ -10,6 +10,8 @@ module Emails from: sender(@merge_request.author_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record(@merge_request, recipient_id, reply_key) end def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id) @@ -23,6 +25,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record(@merge_request, recipient_id, reply_key) end def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) @@ -36,6 +40,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record(@merge_request, recipient_id, reply_key) end def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) @@ -48,6 +54,8 @@ module Emails from: sender(updated_by_user_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record(@merge_request, recipient_id, reply_key) end def merge_request_status_email(recipient_id, merge_request_id, status, updated_by_user_id) @@ -58,52 +66,12 @@ module Emails @target_url = namespace_project_merge_request_url(@project.namespace, @project, @merge_request) - set_reference("merge_request_#{merge_request_id}") mail_answer_thread(@merge_request, from: sender(updated_by_user_id), to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid}) #{@mr_status}")) + subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record(@merge_request, recipient_id, reply_key) end end - - # Over rides default behaviour to show source/target - # Formats arguments into a String suitable for use as an email subject - # - # extra - Extra Strings to be inserted into the subject - # - # Examples - # - # >> subject('Lorem ipsum') - # => "GitLab Merge Request | Lorem ipsum" - # - # # Automatically inserts Project name: - # Forked MR - # => source project => - # => target project => - # => source branch => source - # => target branch => target - # >> subject('Lorem ipsum') - # => "GitLab Merge Request | Ruby on Rails:source >> My Ror:target | Lorem ipsum " - # - # Non Forked MR - # => source project => - # => target project => - # => source branch => source - # => target branch => target - # >> subject('Lorem ipsum') - # => "GitLab Merge Request | Ruby on Rails | source >> target | Lorem ipsum " - # # Accepts multiple arguments - # >> subject('Lorem ipsum', 'Dolor sit amet') - # => "GitLab Merge Request | Lorem ipsum | Dolor sit amet" - def subject(*extra) - subject = "Merge Request | " - if @merge_request.for_fork? - subject << "#{@merge_request.source_project.name_with_namespace}:#{merge_request.source_branch} >> #{@merge_request.target_project.name_with_namespace}:#{merge_request.target_branch}" - else - subject << "#{@merge_request.source_project.name_with_namespace} | #{merge_request.source_branch} >> #{merge_request.target_branch}" - end - subject << " | " + extra.join(' | ') if extra.present? - subject - end - end diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb index ff251209e0..87ba94a583 100644 --- a/app/mailers/emails/notes.rb +++ b/app/mailers/emails/notes.rb @@ -11,6 +11,8 @@ module Emails from: sender(@note.author_id), to: recipient(recipient_id), subject: subject("#{@commit.title} (#{@commit.short_id})")) + + SentNotification.record_note(@note, recipient_id, reply_key) end def note_issue_email(recipient_id, note_id) @@ -24,6 +26,8 @@ module Emails from: sender(@note.author_id), to: recipient(recipient_id), subject: subject("#{@issue.title} (##{@issue.iid})")) + + SentNotification.record_note(@note, recipient_id, reply_key) end def note_merge_request_email(recipient_id, note_id) @@ -38,6 +42,8 @@ module Emails from: sender(@note.author_id), to: recipient(recipient_id), subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) + + SentNotification.record_note(@note, recipient_id, reply_key) end end end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 79fb48b00d..db2f9654e1 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -1,4 +1,4 @@ -class Notify < ActionMailer::Base +class Notify < BaseMailer include ActionDispatch::Routing::PolymorphicRoutes include Emails::Issues @@ -8,22 +8,9 @@ class Notify < ActionMailer::Base include Emails::Profile include Emails::Groups - add_template_helper ApplicationHelper - add_template_helper GitlabMarkdownHelper add_template_helper MergeRequestsHelper add_template_helper EmailsHelper - attr_accessor :current_user - helper_method :current_user, :can? - - default from: Proc.new { default_sender_address.format } - default reply_to: Gitlab.config.gitlab.email_reply_to - - # Just send email with 2 seconds delay - def self.delay - delay_for(2.seconds) - end - def test_email(recipient_email, subject, body) mail(to: recipient_email, subject: subject, @@ -48,13 +35,6 @@ class Notify < ActionMailer::Base private - # The default email address to send emails from - def default_sender_address - address = Mail::Address.new(Gitlab.config.gitlab.email_from) - address.display_name = Gitlab.config.gitlab.email_display_name - address - end - def can_send_from_user_email?(sender) sender_domain = sender.email.split("@").last self.class.allowed_email_domains.include?(sender_domain) @@ -85,14 +65,6 @@ class Notify < ActionMailer::Base @current_user.notification_email end - # Set the References header field - # - # local_part - The local part of the referenced message ID - # - def set_reference(local_part) - headers["References"] = "<#{local_part}@#{Gitlab.config.gitlab.host}>" - end - # Formats arguments into a String suitable for use as an email subject # # extra - Extra Strings to be inserted into the subject @@ -126,14 +98,37 @@ class Notify < ActionMailer::Base "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>" end + def mail_thread(model, headers = {}) + if @project + headers['X-GitLab-Project'] = @project.name + headers['X-GitLab-Project-Id'] = @project.id + headers['X-GitLab-Project-Path'] = @project.path_with_namespace + end + + headers["X-GitLab-#{model.class.name}-ID"] = model.id + + if reply_key + headers['X-GitLab-Reply-Key'] = reply_key + + address = Mail::Address.new(Gitlab::IncomingEmail.reply_address(reply_key)) + address.display_name = @project.name_with_namespace + + headers['Reply-To'] = address + + @reply_by_email = true + end + + mail(headers) + end + # Send an email that starts a new conversation thread, # with headers suitable for grouping by thread in email clients. # # See: mail_answer_thread - def mail_new_thread(model, headers = {}, &block) + def mail_new_thread(model, headers = {}) headers['Message-ID'] = message_id(model) - headers['X-GitLab-Project'] = "#{@project.name} | " if @project - mail(headers, &block) + + mail_thread(model, headers) end # Send an email that responds to an existing conversation thread, @@ -144,19 +139,17 @@ class Notify < ActionMailer::Base # * have a subject that begin by 'Re: ' # * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID' # - def mail_answer_thread(model, headers = {}, &block) + def mail_answer_thread(model, headers = {}) + headers['Message-ID'] = SecureRandom.hex headers['In-Reply-To'] = message_id(model) headers['References'] = message_id(model) - headers['X-GitLab-Project'] = "#{@project.name} | " if @project - if headers[:subject] - headers[:subject].prepend('Re: ') - end + headers[:subject].prepend('Re: ') if headers[:subject] - mail(headers, &block) + mail_thread(model, headers) end - def can? - Ability.abilities.allowed?(user, action, subject) + def reply_key + @reply_key ||= SentNotification.reply_key end end diff --git a/app/models/ability.rb b/app/models/ability.rb index f8e5afa9b0..a020b24a55 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -149,6 +149,7 @@ class Ability :admin_merge_request, :create_merge_request, :create_wiki, + :manage_builds, :push_code ] end diff --git a/app/models/abuse_report.rb b/app/models/abuse_report.rb index c8c39db11b..07c87a7fe8 100644 --- a/app/models/abuse_report.rb +++ b/app/models/abuse_report.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: abuse_reports +# +# id :integer not null, primary key +# reporter_id :integer +# user_id :integer +# message :text +# created_at :datetime +# updated_at :datetime +# + class AbuseReport < ActiveRecord::Base belongs_to :reporter, class_name: "User" belongs_to :user diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 6d1ad82a26..784f5c96a0 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -22,10 +22,12 @@ # user_oauth_applications :boolean default(TRUE) # after_sign_out_path :string(255) # session_expire_delay :integer default(10080), not null +# import_sources :text # class ApplicationSetting < ActiveRecord::Base serialize :restricted_visibility_levels + serialize :import_sources serialize :restricted_signup_domains, Array attr_accessor :restricted_signup_domains_raw @@ -52,6 +54,16 @@ class ApplicationSetting < ActiveRecord::Base end end + validates_each :import_sources do |record, attr, value| + unless value.nil? + value.each do |source| + unless Gitlab::ImportSources.options.has_value?(source) + record.errors.add(attr, "'#{source}' is not a import source") + end + end + end + end + def self.current ApplicationSetting.last end @@ -70,7 +82,9 @@ class ApplicationSetting < ActiveRecord::Base session_expire_delay: Settings.gitlab['session_expire_delay'], default_project_visibility: Settings.gitlab.default_projects_features['visibility_level'], default_snippet_visibility: Settings.gitlab.default_projects_features['visibility_level'], - restricted_signup_domains: Settings.gitlab['restricted_signup_domains'] + restricted_signup_domains: Settings.gitlab['restricted_signup_domains'], + import_sources: ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'], + ci_enabled: Settings.gitlab_ci['enabled'] ) end diff --git a/app/models/ci/application_setting.rb b/app/models/ci/application_setting.rb new file mode 100644 index 0000000000..0cf496f7d8 --- /dev/null +++ b/app/models/ci/application_setting.rb @@ -0,0 +1,27 @@ +# == Schema Information +# +# Table name: application_settings +# +# id :integer not null, primary key +# all_broken_builds :boolean +# add_pusher :boolean +# created_at :datetime +# updated_at :datetime +# + +module Ci + class ApplicationSetting < ActiveRecord::Base + extend Ci::Model + + def self.current + Ci::ApplicationSetting.last + end + + def self.create_from_defaults + create( + all_broken_builds: Settings.gitlab_ci['all_broken_builds'], + add_pusher: Settings.gitlab_ci['add_pusher'], + ) + end + end +end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb new file mode 100644 index 0000000000..8096d4fa5a --- /dev/null +++ b/app/models/ci/build.rb @@ -0,0 +1,285 @@ +# == Schema Information +# +# Table name: builds +# +# id :integer not null, primary key +# project_id :integer +# status :string(255) +# finished_at :datetime +# trace :text +# created_at :datetime +# updated_at :datetime +# started_at :datetime +# runner_id :integer +# commit_id :integer +# coverage :float +# commands :text +# job_id :integer +# name :string(255) +# options :text +# allow_failure :boolean default(FALSE), not null +# stage :string(255) +# deploy :boolean default(FALSE) +# trigger_request_id :integer +# + +module Ci + class Build < ActiveRecord::Base + extend Ci::Model + + LAZY_ATTRIBUTES = ['trace'] + + belongs_to :commit, class_name: 'Ci::Commit' + belongs_to :project, class_name: 'Ci::Project' + belongs_to :runner, class_name: 'Ci::Runner' + belongs_to :trigger_request, class_name: 'Ci::TriggerRequest' + + serialize :options + + validates :commit, presence: true + validates :status, presence: true + validates :coverage, numericality: true, allow_blank: true + + scope :running, ->() { where(status: "running") } + scope :pending, ->() { where(status: "pending") } + scope :success, ->() { where(status: "success") } + scope :failed, ->() { where(status: "failed") } + scope :unstarted, ->() { where(runner_id: nil) } + scope :running_or_pending, ->() { where(status:[:running, :pending]) } + + acts_as_taggable + + # To prevent db load megabytes of data from trace + default_scope -> { select(Ci::Build.columns_without_lazy) } + + class << self + def columns_without_lazy + (column_names - LAZY_ATTRIBUTES).map do |column_name| + "#{table_name}.#{column_name}" + end + end + + def last_month + where('created_at > ?', Date.today - 1.month) + end + + def first_pending + pending.unstarted.order('created_at ASC').first + end + + def create_from(build) + new_build = build.dup + new_build.status = :pending + new_build.runner_id = nil + new_build.save + end + + def retry(build) + new_build = Ci::Build.new(status: :pending) + new_build.options = build.options + new_build.commands = build.commands + new_build.tag_list = build.tag_list + new_build.commit_id = build.commit_id + new_build.project_id = build.project_id + new_build.name = build.name + new_build.allow_failure = build.allow_failure + new_build.stage = build.stage + new_build.trigger_request = build.trigger_request + new_build.save + new_build + end + end + + state_machine :status, initial: :pending do + event :run do + transition pending: :running + end + + event :drop do + transition running: :failed + end + + event :success do + transition running: :success + end + + event :cancel do + transition [:pending, :running] => :canceled + end + + after_transition pending: :running do |build, transition| + build.update_attributes started_at: Time.now + end + + after_transition any => [:success, :failed, :canceled] do |build, transition| + build.update_attributes finished_at: Time.now + project = build.project + + if project.web_hooks? + Ci::WebHookService.new.build_end(build) + end + + if build.commit.success? + build.commit.create_next_builds(build.trigger_request) + end + + project.execute_services(build) + + if project.coverage_enabled? + build.update_coverage + end + end + + state :pending, value: 'pending' + state :running, value: 'running' + state :failed, value: 'failed' + state :success, value: 'success' + state :canceled, value: 'canceled' + end + + delegate :sha, :short_sha, :before_sha, :ref, + to: :commit, prefix: false + + def trace_html + html = Ci::Ansi2html::convert(trace) if trace.present? + html ||= '' + end + + def trace + if project && read_attribute(:trace).present? + read_attribute(:trace).gsub(project.token, 'xxxxxx') + end + end + + def started? + !pending? && !canceled? && started_at + end + + def active? + running? || pending? + end + + def complete? + canceled? || success? || failed? + end + + def ignored? + failed? && allow_failure? + end + + def timeout + project.timeout + end + + def variables + yaml_variables + project_variables + trigger_variables + end + + def duration + if started_at && finished_at + finished_at - started_at + elsif started_at + Time.now - started_at + end + end + + def project + commit.project + end + + def project_id + commit.project_id + end + + def project_name + project.name + end + + def repo_url + project.repo_url_with_auth + end + + def allow_git_fetch + project.allow_git_fetch + end + + def update_coverage + coverage = extract_coverage(trace, project.coverage_regex) + + if coverage.is_a? Numeric + update_attributes(coverage: coverage) + end + end + + def extract_coverage(text, regex) + begin + matches = text.gsub(Regexp.new(regex)).to_a.last + coverage = matches.gsub(/\d+(\.\d+)?/).first + + if coverage.present? + coverage.to_f + end + rescue => ex + # if bad regex or something goes wrong we dont want to interrupt transition + # so we just silentrly ignore error for now + end + end + + def trace + if File.exist?(path_to_trace) + File.read(path_to_trace) + else + # backward compatibility + read_attribute :trace + end + end + + def trace=(trace) + unless Dir.exists? dir_to_trace + FileUtils.mkdir_p dir_to_trace + end + + File.write(path_to_trace, trace) + end + + def dir_to_trace + File.join( + Settings.gitlab_ci.builds_path, + created_at.utc.strftime("%Y_%m"), + project.id.to_s + ) + end + + def path_to_trace + "#{dir_to_trace}/#{id}.log" + end + + private + + def yaml_variables + if commit.config_processor + commit.config_processor.variables.map do |key, value| + { key: key, value: value, public: true } + end + else + [] + end + end + + def project_variables + project.variables.map do |variable| + { key: variable.key, value: variable.value, public: false } + end + end + + def trigger_variables + if trigger_request && trigger_request.variables + trigger_request.variables.map do |key, value| + { key: key, value: value, public: false } + end + else + [] + end + end + end +end diff --git a/app/models/ci/commit.rb b/app/models/ci/commit.rb new file mode 100644 index 0000000000..f102d0a767 --- /dev/null +++ b/app/models/ci/commit.rb @@ -0,0 +1,267 @@ +# == Schema Information +# +# Table name: commits +# +# id :integer not null, primary key +# project_id :integer +# ref :string(255) +# sha :string(255) +# before_sha :string(255) +# push_data :text +# created_at :datetime +# updated_at :datetime +# tag :boolean default(FALSE) +# yaml_errors :text +# committed_at :datetime +# + +module Ci + class Commit < ActiveRecord::Base + extend Ci::Model + + belongs_to :project, class_name: 'Ci::Project' + has_many :builds, dependent: :destroy, class_name: 'Ci::Build' + has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest' + + serialize :push_data + + validates_presence_of :ref, :sha, :before_sha, :push_data + validate :valid_commit_sha + + def self.truncate_sha(sha) + sha[0...8] + end + + def to_param + sha + end + + def last_build + builds.order(:id).last + end + + def retry + builds_without_retry.each do |build| + Ci::Build.retry(build) + end + end + + def valid_commit_sha + if self.sha == Ci::Git::BLANK_SHA + self.errors.add(:sha, " cant be 00000000 (branch removal)") + end + end + + def new_branch? + before_sha == Ci::Git::BLANK_SHA + end + + def compare? + !new_branch? + end + + def git_author_name + commit_data[:author][:name] if commit_data && commit_data[:author] + end + + def git_author_email + commit_data[:author][:email] if commit_data && commit_data[:author] + end + + def git_commit_message + commit_data[:message] if commit_data && commit_data[:message] + end + + def short_before_sha + Ci::Commit.truncate_sha(before_sha) + end + + def short_sha + Ci::Commit.truncate_sha(sha) + end + + def commit_data + push_data[:commits].find do |commit| + commit[:id] == sha + end + rescue + nil + end + + def project_recipients + recipients = project.email_recipients.split(' ') + + if project.email_add_pusher? && push_data[:user_email].present? + recipients << push_data[:user_email] + end + + recipients.uniq + end + + def stage + return unless config_processor + stages = builds_without_retry.select(&:active?).map(&:stage) + config_processor.stages.find { |stage| stages.include? stage } + end + + def create_builds_for_stage(stage, trigger_request) + return if skip_ci? && trigger_request.blank? + return unless config_processor + + builds_attrs = config_processor.builds_for_stage_and_ref(stage, ref, tag) + builds_attrs.map do |build_attrs| + builds.create!({ + project: project, + name: build_attrs[:name], + commands: build_attrs[:script], + tag_list: build_attrs[:tags], + options: build_attrs[:options], + allow_failure: build_attrs[:allow_failure], + stage: build_attrs[:stage], + trigger_request: trigger_request, + }) + end + end + + def create_next_builds(trigger_request) + return if skip_ci? && trigger_request.blank? + return unless config_processor + + stages = builds.where(trigger_request: trigger_request).group_by(&:stage) + + config_processor.stages.any? do |stage| + !stages.include?(stage) && create_builds_for_stage(stage, trigger_request).present? + end + end + + def create_builds(trigger_request = nil) + return if skip_ci? && trigger_request.blank? + return unless config_processor + + config_processor.stages.any? do |stage| + create_builds_for_stage(stage, trigger_request).present? + end + end + + def builds_without_retry + @builds_without_retry ||= + begin + grouped_builds = builds.group_by(&:name) + grouped_builds.map do |name, builds| + builds.sort_by(&:id).last + end + end + end + + def builds_without_retry_sorted + return builds_without_retry unless config_processor + + stages = config_processor.stages + builds_without_retry.sort_by do |build| + [stages.index(build.stage) || -1, build.name || ""] + end + end + + def retried_builds + @retried_builds ||= (builds.order(id: :desc) - builds_without_retry) + end + + def status + if skip_ci? + return 'skipped' + elsif yaml_errors.present? + return 'failed' + elsif builds.none? + return 'skipped' + elsif success? + 'success' + elsif pending? + 'pending' + elsif running? + 'running' + elsif canceled? + 'canceled' + else + 'failed' + end + end + + def pending? + builds_without_retry.all? do |build| + build.pending? + end + end + + def running? + builds_without_retry.any? do |build| + build.running? || build.pending? + end + end + + def success? + builds_without_retry.all? do |build| + build.success? || build.ignored? + end + end + + def failed? + status == 'failed' + end + + def canceled? + builds_without_retry.all? do |build| + build.canceled? + end + end + + def duration + @duration ||= builds_without_retry.select(&:duration).sum(&:duration).to_i + end + + def finished_at + @finished_at ||= builds.order('finished_at DESC').first.try(:finished_at) + end + + def coverage + if project.coverage_enabled? + coverage_array = builds_without_retry.map(&:coverage).compact + if coverage_array.size >= 1 + '%.2f' % (coverage_array.reduce(:+) / coverage_array.size) + end + end + end + + def matrix? + builds_without_retry.size > 1 + end + + def config_processor + @config_processor ||= Ci::GitlabCiYamlProcessor.new(push_data[:ci_yaml_file]) + rescue Ci::GitlabCiYamlProcessor::ValidationError => e + save_yaml_error(e.message) + nil + rescue Exception => e + logger.error e.message + "\n" + e.backtrace.join("\n") + save_yaml_error("Undefined yaml error") + nil + end + + def skip_ci? + return false if builds.any? + commits = push_data[:commits] + commits.present? && commits.last[:message] =~ /(\[ci skip\])/ + end + + def update_committed! + update!(committed_at: DateTime.now) + end + + private + + def save_yaml_error(error) + return if self.yaml_errors? + self.yaml_errors = error + save + end + end +end diff --git a/app/models/ci/event.rb b/app/models/ci/event.rb new file mode 100644 index 0000000000..cac3a7a49c --- /dev/null +++ b/app/models/ci/event.rb @@ -0,0 +1,27 @@ +# == Schema Information +# +# Table name: events +# +# id :integer not null, primary key +# project_id :integer +# user_id :integer +# is_admin :integer +# description :text +# created_at :datetime +# updated_at :datetime +# + +module Ci + class Event < ActiveRecord::Base + extend Ci::Model + + belongs_to :project, class_name: 'Ci::Project' + + validates :description, + presence: true, + length: { in: 5..200 } + + scope :admin, ->(){ where(is_admin: true) } + scope :project_wide, ->(){ where(is_admin: false) } + end +end diff --git a/app/models/ci/project.rb b/app/models/ci/project.rb new file mode 100644 index 0000000000..37fbcc287b --- /dev/null +++ b/app/models/ci/project.rb @@ -0,0 +1,210 @@ +# == Schema Information +# +# Table name: projects +# +# id :integer not null, primary key +# name :string(255) not null +# timeout :integer default(3600), not null +# created_at :datetime +# updated_at :datetime +# token :string(255) +# default_ref :string(255) +# path :string(255) +# always_build :boolean default(FALSE), not null +# polling_interval :integer +# public :boolean default(FALSE), not null +# ssh_url_to_repo :string(255) +# gitlab_id :integer +# allow_git_fetch :boolean default(TRUE), not null +# email_recipients :string(255) default(""), not null +# email_add_pusher :boolean default(TRUE), not null +# email_only_broken_builds :boolean default(TRUE), not null +# skip_refs :string(255) +# coverage_regex :string(255) +# shared_runners_enabled :boolean default(FALSE) +# generated_yaml_config :text +# + +module Ci + class Project < ActiveRecord::Base + extend Ci::Model + + include Ci::ProjectStatus + + belongs_to :gl_project, class_name: '::Project', foreign_key: :gitlab_id + + has_many :commits, ->() { order('CASE WHEN ci_commits.committed_at IS NULL THEN 0 ELSE 1 END', :committed_at, :id) }, dependent: :destroy, class_name: 'Ci::Commit' + has_many :builds, through: :commits, dependent: :destroy, class_name: 'Ci::Build' + has_many :runner_projects, dependent: :destroy, class_name: 'Ci::RunnerProject' + has_many :runners, through: :runner_projects, class_name: 'Ci::Runner' + has_many :web_hooks, dependent: :destroy, class_name: 'Ci::WebHook' + has_many :events, dependent: :destroy, class_name: 'Ci::Event' + has_many :variables, dependent: :destroy, class_name: 'Ci::Variable' + has_many :triggers, dependent: :destroy, class_name: 'Ci::Trigger' + + # Project services + has_many :services, dependent: :destroy, class_name: 'Ci::Service' + has_one :hip_chat_service, dependent: :destroy, class_name: 'Ci::HipChatService' + has_one :slack_service, dependent: :destroy, class_name: 'Ci::SlackService' + has_one :mail_service, dependent: :destroy, class_name: 'Ci::MailService' + + accepts_nested_attributes_for :variables, allow_destroy: true + + # + # Validations + # + validates_presence_of :name, :timeout, :token, :default_ref, + :path, :ssh_url_to_repo, :gitlab_id + + validates_uniqueness_of :gitlab_id + + validates :polling_interval, + presence: true, + if: ->(project) { project.always_build.present? } + + scope :public_only, ->() { where(public: true) } + + before_validation :set_default_values + + class << self + include Ci::CurrentSettings + + def base_build_script + <<-eos + git submodule update --init + ls -la + eos + end + + def parse(project) + params = { + name: project.name_with_namespace, + gitlab_id: project.id, + path: project.path_with_namespace, + default_ref: project.default_branch || 'master', + ssh_url_to_repo: project.ssh_url_to_repo, + email_add_pusher: current_application_settings.add_pusher, + email_only_broken_builds: current_application_settings.all_broken_builds, + } + + project = Ci::Project.new(params) + project.build_missing_services + project + end + + def already_added?(project) + where(gitlab_id: project.id).any? + end + + def unassigned(runner) + joins("LEFT JOIN #{Ci::RunnerProject.table_name} ON #{Ci::RunnerProject.table_name}.project_id = #{Ci::Project.table_name}.id " \ + "AND #{Ci::RunnerProject.table_name}.runner_id = #{runner.id}"). + where('#{Ci::RunnerProject.table_name}.project_id' => nil) + end + + def ordered_by_last_commit_date + last_commit_subquery = "(SELECT project_id, MAX(committed_at) committed_at FROM #{Ci::Commit.table_name} GROUP BY project_id)" + joins("LEFT JOIN #{last_commit_subquery} AS last_commit ON #{Ci::Project.table_name}.id = last_commit.project_id"). + order("CASE WHEN last_commit.committed_at IS NULL THEN 1 ELSE 0 END, last_commit.committed_at DESC") + end + + def search(query) + where("LOWER(#{Ci::Project.table_name}.name) LIKE :query", + query: "%#{query.try(:downcase)}%") + end + end + + def any_runners? + if runners.active.any? + return true + end + + shared_runners_enabled && Ci::Runner.shared.active.any? + end + + def set_default_values + self.token = SecureRandom.hex(15) if self.token.blank? + end + + def tracked_refs + @tracked_refs ||= default_ref.split(",").map{|ref| ref.strip} + end + + def valid_token? token + self.token && self.token == token + end + + def no_running_builds? + # Get running builds not later than 3 days ago to ignore hangs + builds.running.where("updated_at > ?", 3.days.ago).empty? + end + + def email_notification? + email_add_pusher || email_recipients.present? + end + + def web_hooks? + web_hooks.any? + end + + def services? + services.any? + end + + def timeout_in_minutes + timeout / 60 + end + + def timeout_in_minutes=(value) + self.timeout = value.to_i * 60 + end + + def coverage_enabled? + coverage_regex.present? + end + + # Build a clone-able repo url + # using http and basic auth + def repo_url_with_auth + auth = "gitlab-ci-token:#{token}@" + url = gitlab_url + ".git" + url.sub(/^https?:\/\//) do |prefix| + prefix + auth + end + end + + def available_services_names + %w(slack mail hip_chat) + end + + def build_missing_services + available_services_names.each do |service_name| + service = services.find { |service| service.to_param == service_name } + + # If service is available but missing in db + # we should create an instance. Ex `create_gitlab_ci_service` + service = self.send :"create_#{service_name}_service" if service.nil? + end + end + + def execute_services(data) + services.each do |service| + + # Call service hook only if it is active + begin + service.execute(data) if service.active && service.can_execute?(data) + rescue => e + logger.error(e) + end + end + end + + def gitlab_url + File.join(Gitlab.config.gitlab.url, path) + end + + def setup_finished? + commits.any? + end + end +end diff --git a/app/models/ci/project_status.rb b/app/models/ci/project_status.rb new file mode 100644 index 0000000000..6d5cafe81a --- /dev/null +++ b/app/models/ci/project_status.rb @@ -0,0 +1,47 @@ +module Ci + module ProjectStatus + def status + last_commit.status if last_commit + end + + def broken? + last_commit.failed? if last_commit + end + + def success? + last_commit.success? if last_commit + end + + def broken_or_success? + broken? || success? + end + + def last_commit + @last_commit ||= commits.last if commits.any? + end + + def last_commit_date + last_commit.try(:created_at) + end + + def human_status + status + end + + # only check for toggling build status within same ref. + def last_commit_changed_status? + ref = last_commit.ref + last_commits = commits.where(ref: ref).last(2) + + if last_commits.size < 2 + false + else + last_commits[0].status != last_commits[1].status + end + end + + def last_commit_for_ref(ref) + commits.where(ref: ref).last + end + end +end diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb new file mode 100644 index 0000000000..1e9f78a374 --- /dev/null +++ b/app/models/ci/runner.rb @@ -0,0 +1,80 @@ +# == Schema Information +# +# Table name: runners +# +# id :integer not null, primary key +# token :string(255) +# created_at :datetime +# updated_at :datetime +# description :string(255) +# contacted_at :datetime +# active :boolean default(TRUE), not null +# is_shared :boolean default(FALSE) +# name :string(255) +# version :string(255) +# revision :string(255) +# platform :string(255) +# architecture :string(255) +# + +module Ci + class Runner < ActiveRecord::Base + extend Ci::Model + + has_many :builds, class_name: 'Ci::Build' + has_many :runner_projects, dependent: :destroy, class_name: 'Ci::RunnerProject' + has_many :projects, through: :runner_projects, class_name: 'Ci::Project' + + has_one :last_build, ->() { order('id DESC') }, class_name: 'Ci::Build' + + before_validation :set_default_values + + scope :specific, ->() { where(is_shared: false) } + scope :shared, ->() { where(is_shared: true) } + scope :active, ->() { where(active: true) } + scope :paused, ->() { where(active: false) } + + acts_as_taggable + + def self.search(query) + where('LOWER(ci_runners.token) LIKE :query OR LOWER(ci_runners.description) like :query', + query: "%#{query.try(:downcase)}%") + end + + def set_default_values + self.token = SecureRandom.hex(15) if self.token.blank? + end + + def assign_to(project, current_user = nil) + self.is_shared = false if shared? + self.save + project.runner_projects.create!(runner_id: self.id) + end + + def display_name + return token unless !description.blank? + + description + end + + def shared? + is_shared + end + + def belongs_to_one_project? + runner_projects.count == 1 + end + + def specific? + !shared? + end + + def only_for?(project) + projects == [project] + end + + def short_sha + token[0...10] + end + end +end diff --git a/app/models/ci/runner_project.rb b/app/models/ci/runner_project.rb new file mode 100644 index 0000000000..44453ee4b4 --- /dev/null +++ b/app/models/ci/runner_project.rb @@ -0,0 +1,21 @@ +# == Schema Information +# +# Table name: runner_projects +# +# id :integer not null, primary key +# runner_id :integer not null +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# + +module Ci + class RunnerProject < ActiveRecord::Base + extend Ci::Model + + belongs_to :runner, class_name: 'Ci::Runner' + belongs_to :project, class_name: 'Ci::Project' + + validates_uniqueness_of :runner_id, scope: :project_id + end +end diff --git a/app/models/ci/service.rb b/app/models/ci/service.rb new file mode 100644 index 0000000000..ed5e3f940b --- /dev/null +++ b/app/models/ci/service.rb @@ -0,0 +1,105 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +# To add new service you should build a class inherited from Service +# and implement a set of methods +module Ci + class Service < ActiveRecord::Base + extend Ci::Model + + serialize :properties, JSON + + default_value_for :active, false + + after_initialize :initialize_properties + + belongs_to :project, class_name: 'Ci::Project' + + validates :project_id, presence: true + + def activated? + active + end + + def category + :common + end + + def initialize_properties + self.properties = {} if properties.nil? + end + + def title + # implement inside child + end + + def description + # implement inside child + end + + def help + # implement inside child + end + + def to_param + # implement inside child + end + + def fields + # implement inside child + [] + end + + def can_test? + project.builds.any? + end + + def can_execute?(build) + true + end + + def execute(build) + # implement inside child + end + + # Provide convenient accessor methods + # for each serialized property. + def self.prop_accessor(*args) + args.each do |arg| + class_eval %{ + def #{arg} + (properties || {})['#{arg}'] + end + + def #{arg}=(value) + self.properties ||= {} + self.properties['#{arg}'] = value + end + } + end + end + + def self.boolean_accessor(*args) + self.prop_accessor(*args) + + args.each do |arg| + class_eval %{ + def #{arg}? + ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(#{arg}) + end + } + end + end + end +end diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb new file mode 100644 index 0000000000..fe224b7dc7 --- /dev/null +++ b/app/models/ci/trigger.rb @@ -0,0 +1,39 @@ +# == Schema Information +# +# Table name: triggers +# +# id :integer not null, primary key +# token :string(255) +# project_id :integer not null +# deleted_at :datetime +# created_at :datetime +# updated_at :datetime +# + +module Ci + class Trigger < ActiveRecord::Base + extend Ci::Model + + acts_as_paranoid + + belongs_to :project, class_name: 'Ci::Project' + has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest' + + validates_presence_of :token + validates_uniqueness_of :token + + before_validation :set_default_values + + def set_default_values + self.token = SecureRandom.hex(15) if self.token.blank? + end + + def last_trigger_request + trigger_requests.last + end + + def short_token + token[0...10] + end + end +end diff --git a/app/models/ci/trigger_request.rb b/app/models/ci/trigger_request.rb new file mode 100644 index 0000000000..29cd955339 --- /dev/null +++ b/app/models/ci/trigger_request.rb @@ -0,0 +1,23 @@ +# == Schema Information +# +# Table name: trigger_requests +# +# id :integer not null, primary key +# trigger_id :integer not null +# variables :text +# created_at :datetime +# updated_at :datetime +# commit_id :integer +# + +module Ci + class TriggerRequest < ActiveRecord::Base + extend Ci::Model + + belongs_to :trigger, class_name: 'Ci::Trigger' + belongs_to :commit, class_name: 'Ci::Commit' + has_many :builds, class_name: 'Ci::Build' + + serialize :variables + end +end diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb new file mode 100644 index 0000000000..7a542802fa --- /dev/null +++ b/app/models/ci/variable.rb @@ -0,0 +1,25 @@ +# == Schema Information +# +# Table name: variables +# +# id :integer not null, primary key +# project_id :integer not null +# key :string(255) +# value :text +# encrypted_value :text +# encrypted_value_salt :string(255) +# encrypted_value_iv :string(255) +# + +module Ci + class Variable < ActiveRecord::Base + extend Ci::Model + + belongs_to :project, class_name: 'Ci::Project' + + validates_presence_of :key + validates_uniqueness_of :key, scope: :project_id + + attr_encrypted :value, mode: :per_attribute_iv_and_salt, key: Gitlab::Application.secrets.db_key_base + end +end diff --git a/app/models/ci/web_hook.rb b/app/models/ci/web_hook.rb new file mode 100644 index 0000000000..8f03b0625d --- /dev/null +++ b/app/models/ci/web_hook.rb @@ -0,0 +1,44 @@ +# == Schema Information +# +# Table name: web_hooks +# +# id :integer not null, primary key +# url :string(255) not null +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# + +module Ci + class WebHook < ActiveRecord::Base + extend Ci::Model + + include HTTParty + + belongs_to :project, class_name: 'Ci::Project' + + # HTTParty timeout + default_timeout 10 + + validates :url, presence: true, + format: { with: URI::regexp(%w(http https)), message: "should be a valid url" } + + def execute(data) + parsed_url = URI.parse(url) + if parsed_url.userinfo.blank? + Ci::WebHook.post(url, body: data.to_json, headers: { "Content-Type" => "application/json" }, verify: false) + else + post_url = url.gsub("#{parsed_url.userinfo}@", "") + auth = { + username: URI.decode(parsed_url.user), + password: URI.decode(parsed_url.password), + } + Ci::WebHook.post(post_url, + body: data.to_json, + headers: { "Content-Type" => "application/json" }, + verify: false, + basic_auth: auth) + end + end + end +end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 40642dc63b..4db4ffb2e7 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -140,6 +140,12 @@ module Issuable { object_kind: self.class.name.underscore, user: user.hook_attrs, + repository: { + name: project.name, + url: project.url_to_repo, + description: project.description, + homepage: project.web_url + }, object_attributes: hook_attrs } end diff --git a/app/models/event.rb b/app/models/event.rb index 78f16c6304..47600c57e3 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -27,6 +27,7 @@ class Event < ActiveRecord::Base MERGED = 7 JOINED = 8 # User joined project LEFT = 9 # User left project + DESTROYED = 10 delegate :name, :email, to: :author, prefix: true, allow_nil: true delegate :title, to: :issue, prefix: true, allow_nil: true @@ -48,6 +49,7 @@ class Event < ActiveRecord::Base scope :code_push, -> { where(action: PUSHED) } scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } scope :with_associations, -> { includes(project: :namespace) } + scope :for_milestone_id, ->(milestone_id) { where(target_type: "Milestone", target_id: milestone_id) } class << self def reset_event_cache_for(target) @@ -71,7 +73,7 @@ class Event < ActiveRecord::Base elsif created_project? true else - (issue? || merge_request? || note? || milestone?) && target + ((issue? || merge_request? || note?) && target) || milestone? end end @@ -115,6 +117,10 @@ class Event < ActiveRecord::Base action == LEFT end + def destroyed? + action == DESTROYED + end + def commented? action == COMMENTED end @@ -124,7 +130,7 @@ class Event < ActiveRecord::Base end def created_project? - created? && !target + created? && !target && target_type.nil? end def created_target? @@ -180,6 +186,8 @@ class Event < ActiveRecord::Base 'joined' elsif left? 'left' + elsif destroyed? + 'destroyed' elsif commented? "commented on" elsif created_project? diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index 46fb85336e..a078accbdb 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -25,6 +25,7 @@ class WebHook < ActiveRecord::Base default_value_for :note_events, false default_value_for :merge_requests_events, false default_value_for :tag_push_events, false + default_value_for :enable_ssl_verification, true # HTTParty timeout default_timeout Gitlab.config.gitlab.webhook_timeout @@ -41,7 +42,7 @@ class WebHook < ActiveRecord::Base "Content-Type" => "application/json", "X-Gitlab-Event" => hook_name.singularize.titleize }, - verify: false) + verify: enable_ssl_verification) else post_url = url.gsub("#{parsed_url.userinfo}@", "") auth = { @@ -54,7 +55,7 @@ class WebHook < ActiveRecord::Base "Content-Type" => "application/json", "X-Gitlab-Event" => hook_name.singularize.titleize }, - verify: false, + verify: enable_ssl_verification, basic_auth: auth) end rescue SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e diff --git a/app/models/issue.rb b/app/models/issue.rb index 2456b7d0dc..fc7e9abe29 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -2,19 +2,20 @@ # # Table name: issues # -# id :integer not null, primary key -# title :string(255) -# assignee_id :integer -# author_id :integer -# project_id :integer -# created_at :datetime -# updated_at :datetime -# position :integer default(0) -# branch_name :string(255) -# description :text -# milestone_id :integer -# state :string(255) -# iid :integer +# id :integer not null, primary key +# title :string(255) +# assignee_id :integer +# author_id :integer +# project_id :integer +# created_at :datetime +# updated_at :datetime +# position :integer default(0) +# branch_name :string(255) +# description :text +# milestone_id :integer +# state :string(255) +# iid :integer +# updated_by_id :integer # require 'carrierwave/orm/activerecord' diff --git a/app/models/label.rb b/app/models/label.rb index 230631b518..4a22bd5340 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -24,7 +24,7 @@ class Label < ActiveRecord::Base validates :color, format: { with: /\A#[0-9A-Fa-f]{6}\Z/ }, allow_blank: false - validates :project, presence: true + validates :project, presence: true, unless: Proc.new { |service| service.template? } # Don't allow '?', '&', and ',' for label titles validates :title, @@ -34,6 +34,8 @@ class Label < ActiveRecord::Base default_scope { order(title: :asc) } + scope :templates, -> { where(template: true) } + alias_attribute :name, :title def self.reference_prefix @@ -78,4 +80,8 @@ class Label < ActiveRecord::Base def open_issues_count issues.opened.count end + + def template? + template + end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 324d1795ab..eb468c6cd5 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -19,6 +19,7 @@ # description :text # position :integer default(0) # locked_at :datetime +# updated_by_id :integer # require Rails.root.join("app/models/commit") @@ -41,8 +42,6 @@ class MergeRequest < ActiveRecord::Base delegate :commits, :diffs, :last_commit, :last_commit_short_sha, to: :merge_request_diff, prefix: nil - attr_accessor :should_remove_source_branch - # When this attribute is true some MR validation is ignored # It allows us to close or modify broken merge requests attr_accessor :allow_broken @@ -57,7 +56,7 @@ class MergeRequest < ActiveRecord::Base transition [:reopened, :opened] => :closed end - event :merge do + event :mark_as_merged do transition [:reopened, :opened, :locked] => :merged end @@ -205,7 +204,10 @@ class MergeRequest < ActiveRecord::Base end def check_if_can_be_merged - if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? + can_be_merged = + project.repository.can_be_merged?(source_sha, target_branch) + + if can_be_merged mark_as_mergeable else mark_as_unmergeable @@ -220,18 +222,6 @@ class MergeRequest < ActiveRecord::Base self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last end - def automerge!(current_user, commit_message = nil) - return unless automergeable? - - MergeRequests::AutoMergeService. - new(target_project, current_user). - execute(self, commit_message) - end - - def remove_source_branch? - self.should_remove_source_branch && !self.source_project.root_ref?(self.source_branch) && !self.for_fork? - end - def open? opened? || reopened? end @@ -240,11 +230,11 @@ class MergeRequest < ActiveRecord::Base title =~ /\A\[?WIP\]?:? /i end - def automergeable? + def mergeable? open? && !work_in_progress? && can_be_merged? end - def automerge_status + def gitlab_merge_status if work_in_progress? "work_in_progress" else @@ -271,14 +261,14 @@ class MergeRequest < ActiveRecord::Base # # see "git diff" def to_diff(current_user) - Gitlab::Satellite::MergeAction.new(current_user, self).diff_in_satellite + target_project.repository.diff_text(target_branch, source_sha) end # Returns the commit as a series of email patches. # # see "git format-patch" def to_patch(current_user) - Gitlab::Satellite::MergeAction.new(current_user, self).format_patch + target_project.repository.format_patch(target_branch, source_sha) end def hook_attrs @@ -429,4 +419,42 @@ class MergeRequest < ActiveRecord::Base "Open" end end + + def target_sha + @target_sha ||= target_project. + repository.commit(target_branch).sha + end + + def source_sha + commits.first.sha + end + + def fetch_ref + target_project.repository.fetch_ref( + source_project.repository.path_to_repo, + "refs/heads/#{source_branch}", + ref_path + ) + end + + def ref_path + "refs/merge-requests/#{iid}/head" + end + + def ref_is_fetched? + File.exists?(File.join(project.repository.path_to_repo, ref_path)) + end + + def ensure_ref_fetched + fetch_ref unless ref_is_fetched? + end + + def in_locked_state + begin + lock_mr + yield + ensure + unlock_mr if locked? + end + end end diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index df1c2b7875..e317c8eac4 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -16,9 +16,8 @@ require Rails.root.join("app/models/commit") class MergeRequestDiff < ActiveRecord::Base include Sortable - # Prevent store of diff - # if commits amount more then 200 - COMMITS_SAFE_SIZE = 200 + # Prevent store of diff if commits amount more then 500 + COMMITS_SAFE_SIZE = 500 attr_reader :commits, :diffs @@ -124,12 +123,12 @@ class MergeRequestDiff < ActiveRecord::Base if new_diffs.any? if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES self.state = :overflow_diff_files_limit - new_diffs = [] + new_diffs = new_diffs.first[Commit::DIFF_HARD_LIMIT_LINES] end if new_diffs.sum { |diff| diff.diff.lines.count } > Commit::DIFF_HARD_LIMIT_LINES self.state = :overflow_diff_lines_limit - new_diffs = [] + new_diffs = new_diffs.first[Commit::DIFF_HARD_LIMIT_LINES] end end @@ -160,12 +159,21 @@ class MergeRequestDiff < ActiveRecord::Base private def compare_result - @compare_result ||= CompareService.new.execute( - merge_request.author, - merge_request.source_project, - merge_request.source_branch, - merge_request.target_project, - merge_request.target_branch, - ) + @compare_result ||= + begin + # Update ref for merge request + merge_request.fetch_ref + + # Get latest sha of branch from source project + source_sha = merge_request.source_project.commit(source_branch).sha + + Gitlab::CompareResult.new( + Gitlab::Git::Compare.new( + merge_request.target_project.repository.raw_repository, + merge_request.target_branch, + source_sha, + ) + ) + end end end diff --git a/app/models/milestone.rb b/app/models/milestone.rb index d28f3c8d3f..d979a35084 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -47,6 +47,13 @@ class Milestone < ActiveRecord::Base state :active end + class << self + def search(query) + query = "%#{query}%" + where("title like ? or description like ?", query, query) + end + end + def expired? if due_date due_date.past? diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 30ffacadde..161a16ca61 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -118,12 +118,11 @@ class Namespace < ActiveRecord::Base gitlab_shell.add_namespace(path_was) if gitlab_shell.mv_namespace(path_was, path) - # If repositories moved successfully we need to remove old satellites - # and send update instructions to users. + # If repositories moved successfully we need to + # send update instructions to users. # However we cannot allow rollback since we moved namespace dir # So we basically we mute exceptions in next actions begin - gitlab_shell.rm_satellites(path_was) send_update_instructions rescue # Returning false does not rollback after_* transaction but gives diff --git a/app/models/note.rb b/app/models/note.rb index 913a8c0033..89d81ab1de 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -15,6 +15,7 @@ # noteable_id :integer # system :boolean default(FALSE), not null # st_diff :text +# updated_by_id :integer # require 'carrierwave/orm/activerecord' @@ -90,7 +91,7 @@ class Note < ActiveRecord::Base end def search(query) - where("note like :query", query: "%#{query}%") + where("LOWER(note) like :query", query: "%#{query.downcase}%") end end diff --git a/app/models/notification.rb b/app/models/notification.rb index 1395274173..171b8df45c 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -12,7 +12,7 @@ class Notification class << self def notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH, N_MENTION] + [N_DISABLED, N_MENTION, N_PARTICIPATING, N_WATCH] end def options_with_labels @@ -26,7 +26,7 @@ class Notification end def project_notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH, N_GLOBAL, N_MENTION] + [N_DISABLED, N_MENTION, N_PARTICIPATING, N_WATCH, N_GLOBAL] end end @@ -57,4 +57,21 @@ class Notification def level target.notification_level end + + def to_s + case level + when N_DISABLED + 'Disabled' + when N_PARTICIPATING + 'Participating' + when N_WATCH + 'Watching' + when N_MENTION + 'On mention' + when N_GLOBAL + 'Global' + else + # do nothing + end + end end diff --git a/app/models/project.rb b/app/models/project.rb index 3dc1729e81..1a5c1c978c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -43,6 +43,8 @@ class Project < ActiveRecord::Base extend Gitlab::ConfigHelper extend Enumerize + UNKNOWN_IMPORT_URL = 'http://unknown.git' + default_value_for :archived, false default_value_for :visibility_level, gitlab_config_features.visibility_level default_value_for :issues_enabled, gitlab_config_features.issues @@ -73,6 +75,7 @@ class Project < ActiveRecord::Base has_many :services has_one :gitlab_ci_service, dependent: :destroy has_one :campfire_service, dependent: :destroy + has_one :drone_ci_service, dependent: :destroy has_one :emails_on_push_service, dependent: :destroy has_one :irker_service, dependent: :destroy has_one :pivotaltracker_service, dependent: :destroy @@ -116,6 +119,7 @@ class Project < ActiveRecord::Base has_many :starrers, through: :users_star_projects, source: :user has_one :import_data, dependent: :destroy, class_name: "ProjectImportData" + has_one :gitlab_ci_project, dependent: :destroy, class_name: "Ci::Project", foreign_key: :gitlab_id delegate :name, to: :owner, allow_nil: true, prefix: true delegate :members, to: :team, prefix: true @@ -141,7 +145,7 @@ class Project < ActiveRecord::Base validates_uniqueness_of :path, scope: :namespace_id validates :import_url, format: { with: /\A#{URI.regexp(%w(ssh git http https))}\z/, message: 'should be a valid url' }, - if: :import? + if: :external_import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create validate :avatar_type, @@ -215,7 +219,7 @@ class Project < ActiveRecord::Base end def search(query) - joins(:namespace).where('projects.archived = ?', false). + joins(:namespace). where('LOWER(projects.name) LIKE :query OR LOWER(projects.path) LIKE :query OR LOWER(namespaces.name) LIKE :query OR @@ -272,7 +276,13 @@ class Project < ActiveRecord::Base end def add_import_job - RepositoryImportWorker.perform_in(2.seconds, id) + if forked? + unless RepositoryForkWorker.perform_async(id, forked_from_project.path_with_namespace, self.namespace.path) + import_fail + end + else + RepositoryImportWorker.perform_in(2.seconds, id) + end end def clear_import_data @@ -280,6 +290,10 @@ class Project < ActiveRecord::Base end def import? + external_import? || forked? + end + + def external_import? import_url.present? end @@ -316,7 +330,7 @@ class Project < ActiveRecord::Base end def web_url - Rails.application.routes.url_helpers.namespace_project_url(self.namespace, self) + Gitlab::Application.routes.url_helpers.namespace_project_url(self.namespace, self) end def web_url_without_protocol @@ -400,12 +414,21 @@ class Project < ActiveRecord::Base end end + def create_labels + Label.templates.each do |label| + label = label.dup + label.template = nil + label.project_id = self.id + label.save + end + end + def find_service(list, name) list.find { |service| service.to_param == name } end def gitlab_ci? - gitlab_ci_service && gitlab_ci_service.active + gitlab_ci_service && gitlab_ci_service.active && gitlab_ci_project.present? end def ci_services @@ -433,7 +456,7 @@ class Project < ActiveRecord::Base if avatar.present? [gitlab_config.url, avatar.url].join elsif avatar_in_git - Rails.application.routes.url_helpers.namespace_project_avatar_url(namespace, self) + Gitlab::Application.routes.url_helpers.namespace_project_avatar_url(namespace, self) end end @@ -520,14 +543,6 @@ class Project < ActiveRecord::Base !repository.exists? || repository.empty? end - def ensure_satellite_exists - self.satellite.create unless self.satellite.exists? - end - - def satellite - @satellite ||= Gitlab::Satellite::Satellite.new(self) - end - def repo repository.raw end @@ -597,14 +612,11 @@ class Project < ActiveRecord::Base new_path_with_namespace = File.join(namespace_dir, path) if gitlab_shell.mv_repository(old_path_with_namespace, new_path_with_namespace) - # If repository moved successfully we need to remove old satellite - # and send update instructions to users. + # If repository moved successfully we need to send update instructions to users. # However we cannot allow rollback since we moved repository # So we basically we mute exceptions in next actions begin gitlab_shell.mv_repository("#{old_path_with_namespace}.wiki", "#{new_path_with_namespace}.wiki") - gitlab_shell.rm_satellites(old_path_with_namespace) - ensure_satellite_exists send_move_instructions reset_events_cache rescue @@ -624,6 +636,7 @@ class Project < ActiveRecord::Base name: name, ssh_url: ssh_url_to_repo, http_url: http_url_to_repo, + web_url: web_url, namespace: namespace.name, visibility_level: visibility_level } @@ -700,15 +713,8 @@ class Project < ActiveRecord::Base end def create_repository - if forked? - if gitlab_shell.fork_repository(forked_from_project.path_with_namespace, self.namespace.path) - ensure_satellite_exists - true - else - errors.add(:base, 'Failed to fork repository via gitlab-shell') - false - end - else + # Forked import is handled asynchronously + unless forked? if gitlab_shell.add_repository(path_with_namespace) true else diff --git a/app/models/project_services/buildkite_service.rb b/app/models/project_services/buildkite_service.rb index a714bc8224..40058b53df 100644 --- a/app/models/project_services/buildkite_service.rb +++ b/app/models/project_services/buildkite_service.rb @@ -23,7 +23,7 @@ require "addressable/uri" class BuildkiteService < CiService ENDPOINT = "https://buildkite.com" - prop_accessor :project_url, :token + prop_accessor :project_url, :token, :enable_ssl_verification validates :project_url, presence: true, if: :activated? validates :token, presence: true, if: :activated? @@ -37,6 +37,7 @@ class BuildkiteService < CiService def compose_service_hook hook = service_hook || build_service_hook hook.url = webhook_url + hook.enable_ssl_verification = enable_ssl_verification hook.save end @@ -68,14 +69,6 @@ class BuildkiteService < CiService "#{project_url}/builds?commit=#{sha}" end - def builds_path - "#{project_url}/builds?branch=#{project.default_branch}" - end - - def status_img_path - "#{buildkite_endpoint('badge')}/#{status_token}.svg" - end - def title 'Buildkite' end @@ -96,7 +89,11 @@ class BuildkiteService < CiService { type: 'text', name: 'project_url', - placeholder: "#{ENDPOINT}/example/project" } + placeholder: "#{ENDPOINT}/example/project" }, + + { type: 'checkbox', + name: 'enable_ssl_verification', + title: "Enable SSL verification" } ] end diff --git a/app/models/project_services/ci/hip_chat_message.rb b/app/models/project_services/ci/hip_chat_message.rb new file mode 100644 index 0000000000..58825fe066 --- /dev/null +++ b/app/models/project_services/ci/hip_chat_message.rb @@ -0,0 +1,78 @@ +module Ci + class HipChatMessage + attr_reader :build + + def initialize(build) + @build = build + end + + def to_s + lines = Array.new + lines.push("#{project.name} - ") + + if commit.matrix? + lines.push("Commit ##{commit.id}
") + else + first_build = commit.builds_without_retry.first + lines.push("Build '#{first_build.name}' ##{first_build.id}
") + end + + lines.push("#{commit.short_sha} #{commit.git_author_name} - #{commit.git_commit_message}
") + lines.push("#{humanized_status(commit_status)} in #{commit.duration} second(s).") + lines.join('') + end + + def status_color(build_or_commit=nil) + build_or_commit ||= commit_status + case build_or_commit + when :success + 'green' + when :failed, :canceled + 'red' + else # :pending, :running or unknown + 'yellow' + end + end + + def notify? + [:failed, :canceled].include?(commit_status) + end + + + private + + def commit + build.commit + end + + def project + commit.project + end + + def build_status + build.status.to_sym + end + + def commit_status + commit.status.to_sym + end + + def humanized_status(build_or_commit=nil) + build_or_commit ||= commit_status + case build_or_commit + when :pending + "Pending" + when :running + "Running" + when :failed + "Failed" + when :success + "Successful" + when :canceled + "Canceled" + else + "Unknown" + end + end + end +end diff --git a/app/models/project_services/ci/hip_chat_service.rb b/app/models/project_services/ci/hip_chat_service.rb new file mode 100644 index 0000000000..0e6e97394b --- /dev/null +++ b/app/models/project_services/ci/hip_chat_service.rb @@ -0,0 +1,93 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +module Ci + class HipChatService < Ci::Service + prop_accessor :hipchat_token, :hipchat_room, :hipchat_server + boolean_accessor :notify_only_broken_builds + validates :hipchat_token, presence: true, if: :activated? + validates :hipchat_room, presence: true, if: :activated? + default_value_for :notify_only_broken_builds, true + + def title + "HipChat" + end + + def description + "Private group chat, video chat, instant messaging for teams" + end + + def help + end + + def to_param + 'hip_chat' + end + + def fields + [ + { type: 'text', name: 'hipchat_token', label: 'Token', placeholder: '' }, + { type: 'text', name: 'hipchat_room', label: 'Room', placeholder: '' }, + { type: 'text', name: 'hipchat_server', label: 'Server', placeholder: 'https://hipchat.example.com', help: 'Leave blank for default' }, + { type: 'checkbox', name: 'notify_only_broken_builds', label: 'Notify only broken builds' } + ] + end + + def can_execute?(build) + return if build.allow_failure? + + commit = build.commit + return unless commit + return unless commit.builds_without_retry.include? build + + case commit.status.to_sym + when :failed + true + when :success + true unless notify_only_broken_builds? + else + false + end + end + + def execute(build) + msg = Ci::HipChatMessage.new(build) + opts = default_options.merge( + token: hipchat_token, + room: hipchat_room, + server: server_url, + color: msg.status_color, + notify: msg.notify? + ) + Ci::HipChatNotifierWorker.perform_async(msg.to_s, opts) + end + + private + + def default_options + { + service_name: 'GitLab CI', + message_format: 'html' + } + end + + def server_url + if hipchat_server.blank? + 'https://api.hipchat.com' + else + hipchat_server + end + end + end +end diff --git a/app/models/project_services/ci/mail_service.rb b/app/models/project_services/ci/mail_service.rb new file mode 100644 index 0000000000..1bd2f33612 --- /dev/null +++ b/app/models/project_services/ci/mail_service.rb @@ -0,0 +1,84 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +module Ci + class MailService < Ci::Service + delegate :email_recipients, :email_recipients=, + :email_add_pusher, :email_add_pusher=, + :email_only_broken_builds, :email_only_broken_builds=, to: :project, prefix: false + + before_save :update_project + + default_value_for :active, true + + def title + 'Mail' + end + + def description + 'Email notification' + end + + def to_param + 'mail' + end + + def fields + [ + { type: 'text', name: 'email_recipients', label: 'Recipients', help: 'Whitespace-separated list of recipient addresses' }, + { type: 'checkbox', name: 'email_add_pusher', label: 'Add pusher to recipients list' }, + { type: 'checkbox', name: 'email_only_broken_builds', label: 'Notify only broken builds' } + ] + end + + def can_execute?(build) + return if build.allow_failure? + + # it doesn't make sense to send emails for retried builds + commit = build.commit + return unless commit + return unless commit.builds_without_retry.include?(build) + + case build.status.to_sym + when :failed + true + when :success + true unless email_only_broken_builds + else + false + end + end + + def execute(build) + build.commit.project_recipients.each do |recipient| + case build.status.to_sym + when :success + mailer.build_success_email(build.id, recipient) + when :failed + mailer.build_fail_email(build.id, recipient) + end + end + end + + private + + def update_project + project.save! + end + + def mailer + Ci::Notify.delay + end + end +end diff --git a/app/models/project_services/ci/slack_message.rb b/app/models/project_services/ci/slack_message.rb new file mode 100644 index 0000000000..491ace5011 --- /dev/null +++ b/app/models/project_services/ci/slack_message.rb @@ -0,0 +1,97 @@ +require 'slack-notifier' + +module Ci + class SlackMessage + def initialize(commit) + @commit = commit + end + + def pretext + '' + end + + def color + attachment_color + end + + def fallback + format(attachment_message) + end + + def attachments + fields = [] + + if commit.matrix? + commit.builds_without_retry.each do |build| + next if build.allow_failure? + next unless build.failed? + fields << { + title: build.name, + value: "Build <#{Ci::RoutesHelper.ci_project_build_url(project, build)}|\##{build.id}> failed in #{build.duration.to_i} second(s)." + } + end + end + + [{ + text: attachment_message, + color: attachment_color, + fields: fields + }] + end + + private + + attr_reader :commit + + def attachment_message + out = "<#{Ci::RoutesHelper.ci_project_url(project)}|#{project_name}>: " + if commit.matrix? + out << "Commit <#{Ci::RoutesHelper.ci_project_ref_commits_url(project, commit.ref, commit.sha)}|\##{commit.id}> " + else + build = commit.builds_without_retry.first + out << "Build <#{Ci::RoutesHelper.ci_project_build_path(project, build)}|\##{build.id}> " + end + out << "(<#{commit_sha_link}|#{commit.short_sha}>) " + out << "of <#{commit_ref_link}|#{commit.ref}> " + out << "by #{commit.git_author_name} " if commit.git_author_name + out << "#{commit_status} in " + out << "#{commit.duration} second(s)" + end + + def format(string) + Slack::Notifier::LinkFormatter.format(string) + end + + def project + commit.project + end + + def project_name + project.name + end + + def commit_sha_link + "#{project.gitlab_url}/commit/#{commit.sha}" + end + + def commit_ref_link + "#{project.gitlab_url}/commits/#{commit.ref}" + end + + def attachment_color + if commit.success? + 'good' + else + 'danger' + end + end + + def commit_status + if commit.success? + 'succeeded' + else + 'failed' + end + end + end +end diff --git a/app/models/project_services/ci/slack_service.rb b/app/models/project_services/ci/slack_service.rb new file mode 100644 index 0000000000..76db573dc1 --- /dev/null +++ b/app/models/project_services/ci/slack_service.rb @@ -0,0 +1,81 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + +module Ci + class SlackService < Ci::Service + prop_accessor :webhook + boolean_accessor :notify_only_broken_builds + validates :webhook, presence: true, if: :activated? + + default_value_for :notify_only_broken_builds, true + + def title + 'Slack' + end + + def description + 'A team communication tool for the 21st century' + end + + def to_param + 'slack' + end + + def help + 'Visit https://www.slack.com/services/new/incoming-webhook. Then copy link and save project!' unless webhook.present? + end + + def fields + [ + { type: 'text', name: 'webhook', label: 'Webhook URL', placeholder: '' }, + { type: 'checkbox', name: 'notify_only_broken_builds', label: 'Notify only broken builds' } + ] + end + + def can_execute?(build) + return if build.allow_failure? + + commit = build.commit + return unless commit + return unless commit.builds_without_retry.include?(build) + + case commit.status.to_sym + when :failed + true + when :success + true unless notify_only_broken_builds? + else + false + end + end + + def execute(build) + message = Ci::SlackMessage.new(build.commit) + options = default_options.merge( + color: message.color, + fallback: message.fallback, + attachments: message.attachments + ) + Ci::SlackNotifierWorker.perform_async(webhook, message.pretext, options) + end + + private + + def default_options + { + username: 'GitLab CI' + } + end + end +end diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb index 803402c83e..88186113c6 100644 --- a/app/models/project_services/ci_service.rb +++ b/app/models/project_services/ci_service.rb @@ -25,12 +25,24 @@ class CiService < Service def category :ci end - + + def valid_token?(token) + self.respond_to?(:token) && self.token.present? && self.token == token + end + def supported_events %w(push) end - # Return complete url to build page + def merge_request_page(iid, sha, ref) + commit_page(sha, ref) + end + + def commit_page(sha, ref) + build_page(sha, ref) + end + + # Return complete url to merge_request page # # Ex. # http://jenkins.example.com:8888/job/test1/scm/bySHA1/12d65c @@ -45,10 +57,27 @@ class CiService < Service # # # Ex. - # @service.commit_status('13be4ac') + # @service.merge_request_status(9, '13be4ac', 'dev') # # => 'success' # - # @service.commit_status('2abe4ac') + # @service.merge_request_status(10, '2abe4ac', 'dev) + # # => 'running' + # + # + def merge_request_status(iid, sha, ref) + commit_status(sha, ref) + end + + # Return string with build status or :error symbol + # + # Allowed states: 'success', 'failed', 'running', 'pending', 'skipped' + # + # + # Ex. + # @service.commit_status('13be4ac', 'master') + # # => 'success' + # + # @service.commit_status('2abe4ac', 'dev') # # => 'running' # # diff --git a/app/models/project_services/drone_ci_service.rb b/app/models/project_services/drone_ci_service.rb new file mode 100644 index 0000000000..c73c4b058a --- /dev/null +++ b/app/models/project_services/drone_ci_service.rb @@ -0,0 +1,176 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# template :boolean default(FALSE) +# push_events :boolean default(TRUE) +# issues_events :boolean default(TRUE) +# merge_requests_events :boolean default(TRUE) +# tag_push_events :boolean default(TRUE) +# note_events :boolean default(TRUE), not null +# + +class DroneCiService < CiService + + prop_accessor :drone_url, :token, :enable_ssl_verification + validates :drone_url, + presence: true, + format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, if: :activated? + validates :token, + presence: true, + if: :activated? + + after_save :compose_service_hook, if: :activated? + + def compose_service_hook + hook = service_hook || build_service_hook + hook.url = [drone_url, "/api/hook", "?owner=#{project.namespace.path}", "&name=#{project.path}", "&access_token=#{token}"].join + hook.enable_ssl_verification = enable_ssl_verification + hook.save + end + + def execute(data) + case data[:object_kind] + when 'push' + service_hook.execute(data) if push_valid?(data) + when 'merge_request' + service_hook.execute(data) if merge_request_valid?(data) + when 'tag_push' + service_hook.execute(data) if tag_push_valid?(data) + end + end + + def allow_target_ci? + true + end + + def supported_events + %w(push merge_request tag_push) + end + + def merge_request_status_path(iid, sha = nil, ref = nil) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/pulls/#{iid}", + "?access_token=#{token}"] + + URI.join(*url).to_s + end + + def commit_status_path(sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/commits/#{sha}", + "?branch=#{URI::encode(ref.to_s)}&access_token=#{token}"] + + URI.join(*url).to_s + end + + def merge_request_status(iid, sha, ref) + response = HTTParty.get(merge_request_status_path(iid), verify: enable_ssl_verification) + + if response.code == 200 and response['status'] + case response['status'] + when 'killed' + :canceled + when 'failure', 'error' + # Because drone return error if some test env failed + :failed + else + response["status"] + end + else + :error + end + rescue Errno::ECONNREFUSED + :error + end + + def commit_status(sha, ref) + response = HTTParty.get(commit_status_path(sha, ref), verify: enable_ssl_verification) + + if response.code == 200 and response['status'] + case response['status'] + when 'killed' + :canceled + when 'failure', 'error' + # Because drone return error if some test env failed + :failed + else + response["status"] + end + else + :error + end + rescue Errno::ECONNREFUSED + :error + end + + def merge_request_page(iid, sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/redirect/pulls/#{iid}"] + + URI.join(*url).to_s + end + + def commit_page(sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/redirect/commits/#{sha}", + "?branch=#{URI::encode(ref.to_s)}"] + + URI.join(*url).to_s + end + + def commit_coverage(sha, ref) + nil + end + + def build_page(sha, ref) + commit_page(sha, ref) + end + + def title + 'Drone CI' + end + + def description + 'Drone is a Continuous Integration platform built on Docker, written in Go' + end + + def to_param + 'drone_ci' + end + + def fields + [ + { type: 'text', name: 'token', placeholder: 'Drone CI project specific token' }, + { type: 'text', name: 'drone_url', placeholder: 'http://drone.example.com' }, + { type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" } + ] + end + + private + + def tag_push_valid?(data) + data[:total_commits_count] > 0 && !Gitlab::Git.blank_ref?(data[:after]) + end + + def push_valid?(data) + opened_merge_requests = project.merge_requests.opened.where(source_project_id: project.id, + source_branch: Gitlab::Git.ref_name(data[:ref])) + + opened_merge_requests.empty? && data[:total_commits_count] > 0 && + !Gitlab::Git.blank_ref?(data[:after]) + end + + def merge_request_valid?(data) + ['opened', 'reopened'].include?(data[:object_attributes][:state]) && + data[:object_attributes][:merge_status] == 'unchecked' + end +end diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index 5aaa4e85cb..40dd1b44d0 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -19,21 +19,10 @@ # class GitlabCiService < CiService - API_PREFIX = "api/v1" - - prop_accessor :project_url, :token - validates :project_url, - presence: true, - format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, if: :activated? - validates :token, - presence: true, - format: { with: /\A([A-Za-z0-9]+)\z/ }, if: :activated? - after_save :compose_service_hook, if: :activated? def compose_service_hook hook = service_hook || build_service_hook - hook.url = [project_url, "/build", "?token=#{token}"].join("") hook.save end @@ -54,67 +43,57 @@ class GitlabCiService < CiService end end - service_hook.execute(data) - end - - def commit_status_path(sha, ref) - URI::encode(project_url + "/refs/#{ref}/commits/#{sha}/status.json?token=#{token}") - end - - def get_ci_build(sha, ref) - @ci_builds ||= {} - @ci_builds[sha] ||= HTTParty.get(commit_status_path(sha, ref), verify: false) - end - - def commit_status(sha, ref) - response = get_ci_build(sha, ref) - - if response.code == 200 and response["status"] - response["status"] - else - :error + ci_project = Ci::Project.find_by(gitlab_id: project.id) + if ci_project + Ci::CreateCommitService.new.execute(ci_project, data) end end - def fork_registration(new_project, private_token) - params = { + def token + if project.gitlab_ci_project.present? + project.gitlab_ci_project.token + end + end + + def get_ci_commit(sha, ref) + Ci::Project.find(project.gitlab_ci_project).commits.find_by_sha_and_ref!(sha, ref) + end + + def commit_status(sha, ref) + get_ci_commit(sha, ref).status + rescue ActiveRecord::RecordNotFound + :error + end + + def fork_registration(new_project, current_user) + params = OpenStruct.new({ id: new_project.id, name_with_namespace: new_project.name_with_namespace, path_with_namespace: new_project.path_with_namespace, web_url: new_project.web_url, default_branch: new_project.default_branch, ssh_url_to_repo: new_project.ssh_url_to_repo - } + }) - HTTParty.post( - fork_registration_path, - body: { - project_id: project.id, - project_token: token, - private_token: private_token, - data: params }, - verify: false + ci_project = Ci::Project.find_by!(gitlab_id: project.id) + + Ci::CreateProjectService.new.execute( + current_user, + params, + ci_project ) end def commit_coverage(sha, ref) - response = get_ci_build(sha, ref) - - if response.code == 200 and response["coverage"] - response["coverage"] - end + get_ci_commit(sha, ref).coverage + rescue ActiveRecord::RecordNotFound + :error end def build_page(sha, ref) - URI::encode(project_url + "/refs/#{ref}/commits/#{sha}") - end - - def builds_path - project_url + "?ref=" + project.default_branch - end - - def status_img_path - project_url + "/status.png?ref=" + project.default_branch + if project.gitlab_ci_project.present? + Ci::RoutesHelper.ci_project_ref_commits_path(project.gitlab_ci_project, ref, sha) + end end def title @@ -130,10 +109,7 @@ class GitlabCiService < CiService end def fields - [ - { type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' }, - { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' } - ] + [] end private @@ -142,10 +118,6 @@ class GitlabCiService < CiService repository.blob_at(sha, '.gitlab-ci.yml') end - def fork_registration_path - project_url.sub(/projects\/\d*/, "#{API_PREFIX}/forks") - end - def repository project.repository end diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 0ebc0a3ba1..9558292fea 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -19,7 +19,7 @@ # class GitlabIssueTrackerService < IssueTrackerService - include Rails.application.routes.url_helpers + include Gitlab::Application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index bfa8fc7b86..35e30b1cb0 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -19,7 +19,7 @@ # class JiraService < IssueTrackerService - include Rails.application.routes.url_helpers + include Gitlab::Application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb index 36d9874edd..7cd5e89250 100644 --- a/app/models/project_services/slack_service.rb +++ b/app/models/project_services/slack_service.rb @@ -34,6 +34,12 @@ class SlackService < Service 'slack' end + def help + 'This service sends notifications to your Slack channel.
+ To setup this Service you need to create a new "Incoming webhook" in your Slack integration panel, + and enter the Webhook URL below.' + end + def fields [ { type: 'text', name: 'webhook', diff --git a/app/models/repository.rb b/app/models/repository.rb index 24c32d9005..79b48ebfed 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1,4 +1,9 @@ +require 'securerandom' + class Repository + class PreReceiveError < StandardError; end + class CommitError < StandardError; end + include Gitlab::ShellAdapter attr_accessor :raw_repository, :path_with_namespace, :project @@ -368,6 +373,89 @@ class Repository @root_ref ||= raw_repository.root_ref end + def commit_file(user, path, content, message, branch) + commit_with_hooks(user, branch) do |ref| + path[0] = '' if path[0] == '/' + + committer = user_to_comitter(user) + options = {} + options[:committer] = committer + options[:author] = committer + options[:commit] = { + message: message, + branch: ref, + } + + options[:file] = { + content: content, + path: path + } + + Gitlab::Git::Blob.commit(raw_repository, options) + end + end + + def remove_file(user, path, message, branch) + commit_with_hooks(user, branch) do |ref| + path[0] = '' if path[0] == '/' + + committer = user_to_comitter(user) + options = {} + options[:committer] = committer + options[:author] = committer + options[:commit] = { + message: message, + branch: ref + } + + options[:file] = { + path: path + } + + Gitlab::Git::Blob.remove(raw_repository, options) + end + end + + def user_to_comitter(user) + { + email: user.email, + name: user.name, + time: Time.now + } + end + + def can_be_merged?(source_sha, target_branch) + our_commit = rugged.branches[target_branch].target + their_commit = rugged.lookup(source_sha) + + if our_commit && their_commit + !rugged.merge_commits(our_commit, their_commit).conflicts? + else + false + end + end + + def merge(user, source_sha, target_branch, options = {}) + our_commit = rugged.branches[target_branch].target + their_commit = rugged.lookup(source_sha) + + raise "Invalid merge target" if our_commit.nil? + raise "Invalid merge source" if their_commit.nil? + + merge_index = rugged.merge_commits(our_commit, their_commit) + return false if merge_index.conflicts? + + commit_with_hooks(user, target_branch) do |ref| + actual_options = options.merge( + parents: [our_commit, their_commit], + tree: merge_index.write_tree(rugged), + update_ref: ref + ) + + Rugged::Commit.create(rugged, actual_options) + end + end + def merged_to_root_ref?(branch_name) branch_commit = commit(branch_name) root_ref_commit = commit(root_ref) @@ -412,6 +500,64 @@ class Repository ) end + def fetch_ref(source_path, source_ref, target_ref) + args = %W(git fetch #{source_path} #{source_ref}:#{target_ref}) + Gitlab::Popen.popen(args, path_to_repo) + end + + def commit_with_hooks(current_user, branch) + oldrev = Gitlab::Git::BLANK_SHA + ref = Gitlab::Git::BRANCH_REF_PREFIX + branch + gl_id = Gitlab::ShellEnv.gl_id(current_user) + was_empty = empty? + + # Create temporary ref + random_string = SecureRandom.hex + tmp_ref = "refs/tmp/#{random_string}/head" + + unless was_empty + oldrev = find_branch(branch).target + rugged.references.create(tmp_ref, oldrev) + end + + # Make commit in tmp ref + newrev = yield(tmp_ref) + + unless newrev + raise CommitError.new('Failed to create commit') + end + + # Run GitLab pre-receive hook + pre_receive_hook = Gitlab::Git::Hook.new('pre-receive', path_to_repo) + status = pre_receive_hook.trigger(gl_id, oldrev, newrev, ref) + + if status + if was_empty + # Create branch + rugged.references.create(ref, newrev) + else + # Update head + current_head = find_branch(branch).target + + # Make sure target branch was not changed during pre-receive hook + if current_head == oldrev + rugged.references.update(ref, newrev) + else + raise CommitError.new('Commit was rejected because branch received new push') + end + end + + # Run GitLab post receive hook + post_receive_hook = Gitlab::Git::Hook.new('post-receive', path_to_repo) + status = post_receive_hook.trigger(gl_id, oldrev, newrev, ref) + else + # Remove tmp ref and return error to user + rugged.references.delete(tmp_ref) + + raise PreReceiveError.new('Commit was rejected by pre-receive hook') + end + end + private def cache diff --git a/app/models/sent_notification.rb b/app/models/sent_notification.rb new file mode 100644 index 0000000000..3eed5c16e4 --- /dev/null +++ b/app/models/sent_notification.rb @@ -0,0 +1,79 @@ +# == Schema Information +# +# Table name: sent_notifications +# +# id :integer not null, primary key +# project_id :integer +# noteable_id :integer +# noteable_type :string(255) +# recipient_id :integer +# commit_id :string(255) +# line_code :string(255) +# reply_key :string(255) not null +# + +class SentNotification < ActiveRecord::Base + belongs_to :project + belongs_to :noteable, polymorphic: true + belongs_to :recipient, class_name: "User" + + validate :project, :recipient, :reply_key, presence: true + validate :reply_key, uniqueness: true + + validates :noteable_id, presence: true, unless: :for_commit? + validates :commit_id, presence: true, if: :for_commit? + validates :line_code, format: { with: /\A[a-z0-9]+_\d+_\d+\Z/ }, allow_blank: true + + class << self + def reply_key + return nil unless Gitlab::IncomingEmail.enabled? + + SecureRandom.hex(16) + end + + def for(reply_key) + find_by(reply_key: reply_key) + end + + def record(noteable, recipient_id, reply_key, params = {}) + return unless reply_key + + noteable_id = nil + commit_id = nil + if noteable.is_a?(Commit) + commit_id = noteable.id + else + noteable_id = noteable.id + end + + params.reverse_merge!( + project: noteable.project, + noteable_type: noteable.class.name, + noteable_id: noteable_id, + commit_id: commit_id, + recipient_id: recipient_id, + reply_key: reply_key + ) + + create(params) + end + + def record_note(note, recipient_id, reply_key, params = {}) + params[:line_code] = note.line_code + + record(note.noteable, recipient_id, reply_key, params) + end + end + + def for_commit? + noteable_type == "Commit" + end + + def noteable + if for_commit? + project.commit(commit_id) rescue nil + else + super + end + end +end diff --git a/app/models/service.rb b/app/models/service.rb index dcef2866c3..60fcc9d285 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -135,6 +135,7 @@ class Service < ActiveRecord::Base buildkite campfire custom_issue_tracker + drone_ci emails_on_push external_wiki flowdock diff --git a/app/models/user.rb b/app/models/user.rb index 57145cc6b6..25371f9138 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,62 +2,58 @@ # # Table name: users # -# id :integer not null, primary key -# email :string(255) default(""), not null -# encrypted_password :string(255) default(""), not null -# reset_password_token :string(255) -# reset_password_sent_at :datetime -# remember_created_at :datetime -# sign_in_count :integer default(0) -# current_sign_in_at :datetime -# last_sign_in_at :datetime -# current_sign_in_ip :string(255) -# last_sign_in_ip :string(255) -# created_at :datetime -# updated_at :datetime -# name :string(255) -# admin :boolean default(FALSE), not null -# projects_limit :integer default(10) -# skype :string(255) default(""), not null -# linkedin :string(255) default(""), not null -# twitter :string(255) default(""), not null -# authentication_token :string(255) -# theme_id :integer default(1), not null -# bio :string(255) -# failed_attempts :integer default(0) -# locked_at :datetime -# username :string(255) -# can_create_group :boolean default(TRUE), not null -# can_create_team :boolean default(TRUE), not null -# state :string(255) -# color_scheme_id :integer default(1), not null -# notification_level :integer default(1), not null -# password_expires_at :datetime -# created_by_id :integer -# last_credential_check_at :datetime -# avatar :string(255) -# confirmation_token :string(255) -# confirmed_at :datetime -# confirmation_sent_at :datetime -# unconfirmed_email :string(255) -# hide_no_ssh_key :boolean default(FALSE) -# website_url :string(255) default(""), not null -# github_access_token :string(255) -# gitlab_access_token :string(255) -# notification_email :string(255) -# hide_no_password :boolean default(FALSE) -# password_automatically_set :boolean default(FALSE) -# bitbucket_access_token :string(255) -# bitbucket_access_token_secret :string(255) -# location :string(255) -# encrypted_otp_secret :string(255) -# encrypted_otp_secret_iv :string(255) -# encrypted_otp_secret_salt :string(255) -# otp_required_for_login :boolean default(FALSE), not null -# otp_backup_codes :text -# public_email :string(255) default(""), not null -# dashboard :integer default(0) -# project_view :integer default(0) +# id :integer not null, primary key +# email :string(255) default(""), not null +# encrypted_password :string(255) default(""), not null +# reset_password_token :string(255) +# reset_password_sent_at :datetime +# remember_created_at :datetime +# sign_in_count :integer default(0) +# current_sign_in_at :datetime +# last_sign_in_at :datetime +# current_sign_in_ip :string(255) +# last_sign_in_ip :string(255) +# created_at :datetime +# updated_at :datetime +# name :string(255) +# admin :boolean default(FALSE), not null +# projects_limit :integer default(10) +# skype :string(255) default(""), not null +# linkedin :string(255) default(""), not null +# twitter :string(255) default(""), not null +# authentication_token :string(255) +# theme_id :integer default(1), not null +# bio :string(255) +# failed_attempts :integer default(0) +# locked_at :datetime +# username :string(255) +# can_create_group :boolean default(TRUE), not null +# can_create_team :boolean default(TRUE), not null +# state :string(255) +# color_scheme_id :integer default(1), not null +# notification_level :integer default(1), not null +# password_expires_at :datetime +# created_by_id :integer +# last_credential_check_at :datetime +# avatar :string(255) +# confirmation_token :string(255) +# confirmed_at :datetime +# confirmation_sent_at :datetime +# unconfirmed_email :string(255) +# hide_no_ssh_key :boolean default(FALSE) +# website_url :string(255) default(""), not null +# notification_email :string(255) +# hide_no_password :boolean default(FALSE) +# password_automatically_set :boolean default(FALSE) +# location :string(255) +# encrypted_otp_secret :string(255) +# encrypted_otp_secret_iv :string(255) +# encrypted_otp_secret_salt :string(255) +# otp_required_for_login :boolean default(FALSE), not null +# otp_backup_codes :text +# public_email :string(255) default(""), not null +# dashboard :integer default(0) +# project_view :integer default(0) # require 'carrierwave/orm/activerecord' @@ -104,7 +100,7 @@ class User < ActiveRecord::Base # Profile has_many :keys, dependent: :destroy has_many :emails, dependent: :destroy - has_many :identities, dependent: :destroy + has_many :identities, dependent: :destroy, autosave: true # Groups has_many :members, dependent: :destroy @@ -471,8 +467,19 @@ class User < ActiveRecord::Base events = recent_events.code_push.where("created_at > ?", Time.now - 2.hours) events = events.where(project_id: project_id) if project_id - # Take only latest one - events = events.recent.limit(1).first + # Use the latest event that has not been pushed or merged recently + events.recent.find do |event| + project = Project.find_by_id(event.project_id) + next unless project + repo = project.repository + + if repo.branch_names.include?(event.branch_name) + merge_requests = MergeRequest.where("created_at >= ?", event.created_at). + where(source_project_id: project.id, + source_branch: event.branch_name) + merge_requests.empty? + end + end end def projects_sorted_by_activity @@ -626,10 +633,6 @@ class User < ActiveRecord::Base email.start_with?('temp-email-for-oauth') end - def public_profile? - authorized_projects.public_only.any? - end - def avatar_url(size = nil) if avatar.present? [gitlab_config.url, avatar.url].join @@ -750,4 +753,13 @@ class User < ActiveRecord::Base def can_be_removed? !solo_owned_groups.present? end + + def ci_authorized_projects + @ci_authorized_projects ||= Ci::Project.where(gitlab_id: authorized_projects) + end + + def ci_authorized_runners + Ci::Runner.specific.includes(:runner_projects). + where(ci_runner_projects: { project_id: ci_authorized_projects } ) + end end diff --git a/app/services/base_service.rb b/app/services/base_service.rb index 6d9ed34591..f00ec7408b 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -31,6 +31,10 @@ class BaseService SystemHooksService.new end + def repository + project.repository + end + # Add an error to the specified model for restricted visibility levels def deny_visibility_level(model, denied_visibility_level = nil) denied_visibility_level ||= model.visibility_level diff --git a/app/services/ci/create_commit_service.rb b/app/services/ci/create_commit_service.rb new file mode 100644 index 0000000000..0a1abf89a9 --- /dev/null +++ b/app/services/ci/create_commit_service.rb @@ -0,0 +1,50 @@ +module Ci + class CreateCommitService + def execute(project, params) + before_sha = params[:before] + sha = params[:checkout_sha] || params[:after] + origin_ref = params[:ref] + + unless origin_ref && sha.present? + return false + end + + ref = origin_ref.gsub(/\Arefs\/(tags|heads)\//, '') + + # Skip branch removal + if sha == Ci::Git::BLANK_SHA + return false + end + + commit = project.commits.find_by_sha_and_ref(sha, ref) + + # Create commit if not exists yet + unless commit + data = { + ref: ref, + sha: sha, + tag: origin_ref.start_with?('refs/tags/'), + before_sha: before_sha, + push_data: { + before: before_sha, + after: sha, + ref: ref, + user_name: params[:user_name], + user_email: params[:user_email], + repository: params[:repository], + commits: params[:commits], + total_commits_count: params[:total_commits_count], + ci_yaml_file: params[:ci_yaml_file] + } + } + + commit = project.commits.create(data) + end + + commit.update_committed! + commit.create_builds unless commit.builds.any? + + commit + end + end +end diff --git a/app/services/ci/create_project_service.rb b/app/services/ci/create_project_service.rb new file mode 100644 index 0000000000..f42babd238 --- /dev/null +++ b/app/services/ci/create_project_service.rb @@ -0,0 +1,30 @@ +module Ci + class CreateProjectService + include Gitlab::Application.routes.url_helpers + + def execute(current_user, params, forked_project = nil) + @project = Ci::Project.parse(params) + + Ci::Project.transaction do + @project.save! + + gl_project = ::Project.find(@project.gitlab_id) + gl_project.build_missing_services + gl_project.gitlab_ci_service.update_attributes(active: true) + end + + if forked_project + # Copy settings + settings = forked_project.attributes.select do |attr_name, value| + ["public", "shared_runners_enabled", "allow_git_fetch"].include? attr_name + end + + @project.update(settings) + end + + Ci::EventService.new.create_project(current_user, @project) + + @project + end + end +end diff --git a/app/services/ci/create_trigger_request_service.rb b/app/services/ci/create_trigger_request_service.rb new file mode 100644 index 0000000000..9bad09f2f5 --- /dev/null +++ b/app/services/ci/create_trigger_request_service.rb @@ -0,0 +1,17 @@ +module Ci + class CreateTriggerRequestService + def execute(project, trigger, ref, variables = nil) + commit = project.commits.where(ref: ref).last + return unless commit + + trigger_request = trigger.trigger_requests.create!( + commit: commit, + variables: variables + ) + + if commit.create_builds(trigger_request) + trigger_request + end + end + end +end diff --git a/app/services/ci/event_service.rb b/app/services/ci/event_service.rb new file mode 100644 index 0000000000..3f4e02dd26 --- /dev/null +++ b/app/services/ci/event_service.rb @@ -0,0 +1,31 @@ +module Ci + class EventService + def remove_project(user, project) + create( + description: "Project \"#{project.name}\" has been removed by #{user.username}", + user_id: user.id, + is_admin: true + ) + end + + def create_project(user, project) + create( + description: "Project \"#{project.name}\" has been created by #{user.username}", + user_id: user.id, + is_admin: true + ) + end + + def change_project_settings(user, project) + create( + project_id: project.id, + user_id: user.id, + description: "User \"#{user.username}\" updated projects settings" + ) + end + + def create(*args) + Ci::Event.create!(*args) + end + end +end diff --git a/app/services/ci/image_for_build_service.rb b/app/services/ci/image_for_build_service.rb new file mode 100644 index 0000000000..b95835ba09 --- /dev/null +++ b/app/services/ci/image_for_build_service.rb @@ -0,0 +1,31 @@ +module Ci + class ImageForBuildService + def execute(project, params) + image_name = + if params[:sha] + commit = project.commits.find_by(sha: params[:sha]) + image_for_commit(commit) + elsif params[:ref] + commit = project.last_commit_for_ref(params[:ref]) + image_for_commit(commit) + else + 'build-unknown.svg' + end + + image_path = Rails.root.join('public/ci', image_name) + + OpenStruct.new( + path: image_path, + name: image_name + ) + end + + private + + def image_for_commit(commit) + return 'build-unknown.svg' unless commit + + 'build-' + commit.status + ".svg" + end + end +end diff --git a/app/services/ci/register_build_service.rb b/app/services/ci/register_build_service.rb new file mode 100644 index 0000000000..33f1c1e918 --- /dev/null +++ b/app/services/ci/register_build_service.rb @@ -0,0 +1,40 @@ +module Ci + # This class responsible for assigning + # proper pending build to runner on runner API request + class RegisterBuildService + def execute(current_runner) + builds = Ci::Build.pending.unstarted + + builds = + if current_runner.shared? + # don't run projects which have not enables shared runners + builds.includes(:project).where(ci_projects: { shared_runners_enabled: true }) + else + # do run projects which are only assigned to this runner + builds.where(project_id: current_runner.projects) + end + + builds = builds.order('created_at ASC') + + build = builds.find do |build| + (build.tag_list - current_runner.tag_list).empty? + end + + + if build + # In case when 2 runners try to assign the same build, second runner will be declined + # with StateMachine::InvalidTransition in run! method. + build.with_lock do + build.runner_id = current_runner.id + build.save! + build.run! + end + end + + build + + rescue StateMachine::InvalidTransition + nil + end + end +end diff --git a/app/services/ci/test_hook_service.rb b/app/services/ci/test_hook_service.rb new file mode 100644 index 0000000000..3a17596aae --- /dev/null +++ b/app/services/ci/test_hook_service.rb @@ -0,0 +1,7 @@ +module Ci + class TestHookService + def execute(hook, current_user) + Ci::WebHookService.new.build_end(hook.project.commits.last.last_build) + end + end +end diff --git a/app/services/ci/web_hook_service.rb b/app/services/ci/web_hook_service.rb new file mode 100644 index 0000000000..87984b20fa --- /dev/null +++ b/app/services/ci/web_hook_service.rb @@ -0,0 +1,36 @@ +module Ci + class WebHookService + def build_end(build) + execute_hooks(build.project, build_data(build)) + end + + def execute_hooks(project, data) + project.web_hooks.each do |web_hook| + async_execute_hook(web_hook, data) + end + end + + def async_execute_hook(hook, data) + Sidekiq::Client.enqueue(Ci::WebHookWorker, hook.id, data) + end + + def build_data(build) + project = build.project + data = {} + data.merge!({ + build_id: build.id, + build_name: build.name, + build_status: build.status, + build_started_at: build.started_at, + build_finished_at: build.finished_at, + project_id: project.id, + project_name: project.name, + gitlab_url: project.gitlab_url, + ref: build.ref, + sha: build.sha, + before_sha: build.before_sha, + push_data: build.commit.push_data + }) + end + end +end diff --git a/app/services/compare_service.rb b/app/services/compare_service.rb index 6aa9df4b19..bfe6a3dc4b 100644 --- a/app/services/compare_service.rb +++ b/app/services/compare_service.rb @@ -1,27 +1,31 @@ +require 'securerandom' + # Compare 2 branches for one repo or between repositories # and return Gitlab::CompareResult object that responds to commits and diffs class CompareService - def execute(current_user, source_project, source_branch, target_project, target_branch) - # Try to compare branches to get commits list and diffs - # - # Note: Use satellite only when need to compare between two repos - # because satellites are slower than operations on bare repo - if target_project == source_project - Gitlab::CompareResult.new( - Gitlab::Git::Compare.new( - target_project.repository.raw_repository, - target_branch, - source_branch, - ) + def execute(source_project, source_branch, target_project, target_branch) + source_commit = source_project.commit(source_branch) + return unless source_commit + + source_sha = source_commit.sha + + # If compare with other project we need to fetch ref first + unless target_project == source_project + random_string = SecureRandom.hex + + target_project.repository.fetch_ref( + source_project.repository.path_to_repo, + "refs/heads/#{source_branch}", + "refs/tmp/#{random_string}/head" ) - else - Gitlab::Satellite::CompareAction.new( - current_user, - target_project, - target_branch, - source_project, - source_branch - ).result end + + Gitlab::CompareResult.new( + Gitlab::Git::Compare.new( + target_project.repository.raw_repository, + target_branch, + source_sha, + ) + ) end end diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb index 103d6b0a08..07fc77001a 100644 --- a/app/services/event_create_service.rb +++ b/app/services/event_create_service.rb @@ -46,6 +46,10 @@ class EventCreateService create_record_event(milestone, current_user, Event::REOPENED) end + def destroy_milestone(milestone, current_user) + create_record_event(milestone, current_user, Event::DESTROYED) + end + def leave_note(note, current_user) create_record_event(note, current_user, Event::COMMENTED) end diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb index bd24510095..7aecee217d 100644 --- a/app/services/files/base_service.rb +++ b/app/services/files/base_service.rb @@ -1,17 +1,75 @@ module Files class BaseService < ::BaseService - attr_reader :ref, :path + class ValidationError < StandardError; end - def initialize(project, user, params, ref, path = nil) - @project, @current_user, @params = project, user, params.dup - @ref = ref - @path = path + def execute + @current_branch = params[:current_branch] + @target_branch = params[:target_branch] + @commit_message = params[:commit_message] + @file_path = params[:file_path] + @file_content = if params[:file_content_encoding] == 'base64' + Base64.decode64(params[:file_content]) + else + params[:file_content] + end + + # Validate parameters + validate + + # Create new branch if it different from current_branch + if @target_branch != @current_branch + create_target_branch + end + + if sha = commit + success + else + error("Something went wrong. Your changes were not committed") + end + rescue Repository::CommitError, Repository::PreReceiveError, ValidationError => ex + error(ex.message) end private - def repository - project.repository + def current_branch + @current_branch ||= params[:current_branch] + end + + def target_branch + @target_branch ||= params[:target_branch] + end + + def raise_error(message) + raise ValidationError.new(message) + end + + def validate + allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(@target_branch) + + unless allowed + raise_error("You are not allowed to push into this branch") + end + + unless project.empty_repo? + unless repository.branch_names.include?(@current_branch) + raise_error("You can only create files if you are on top of a branch") + end + + if @current_branch != @target_branch + if repository.branch_names.include?(@target_branch) + raise_error("Branch with such name already exists. You need to switch to this branch in order to make changes") + end + end + end + end + + def create_target_branch + result = CreateBranchService.new(project, current_user).execute(@target_branch, @current_branch) + + unless result[:status] == :success + raise_error("Something went wrong when we tried to create #{@target_branch} for you") + end end end end diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index 23833aa78e..ffbb599327 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -1,52 +1,32 @@ require_relative "base_service" module Files - class CreateService < BaseService - def execute - allowed = Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(ref) + class CreateService < Files::BaseService + def commit + repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch) + end - unless allowed - return error("You are not allowed to create file in this branch") - end + def validate + super - file_name = File.basename(path) - file_path = path + file_name = File.basename(@file_path) unless file_name =~ Gitlab::Regex.file_name_regex - return error( + raise_error( 'Your changes could not be committed, because the file name ' + Gitlab::Regex.file_name_regex_message ) end - if project.empty_repo? - # everything is ok because repo does not have a commits yet - else - unless repository.branch_names.include?(ref) - return error("You can only create files if you are on top of a branch") - end + unless project.empty_repo? + @file_path.slice!(0) if @file_path.start_with?('/') - blob = repository.blob_at_branch(ref, file_path) + blob = repository.blob_at_branch(@current_branch, @file_path) if blob - return error("Your changes could not be committed, because file with such name exists") + raise_error("Your changes could not be committed because a file with the same name already exists") end end - - - new_file_action = Gitlab::Satellite::NewFileAction.new(current_user, project, ref, file_path) - created_successfully = new_file_action.commit!( - params[:content], - params[:commit_message], - params[:encoding], - params[:new_branch] - ) - - if created_successfully - success - else - error("Your changes could not be committed, because the file has been changed") - end end end end diff --git a/app/services/files/delete_service.rb b/app/services/files/delete_service.rb index 1497a0f883..27c881c343 100644 --- a/app/services/files/delete_service.rb +++ b/app/services/files/delete_service.rb @@ -1,36 +1,9 @@ require_relative "base_service" module Files - class DeleteService < BaseService - def execute - allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(ref) - - unless allowed - return error("You are not allowed to push into this branch") - end - - unless repository.branch_names.include?(ref) - return error("You can only create files if you are on top of a branch") - end - - blob = repository.blob_at_branch(ref, path) - - unless blob - return error("You can only edit text files") - end - - delete_file_action = Gitlab::Satellite::DeleteFileAction.new(current_user, project, ref, path) - - deleted_successfully = delete_file_action.commit!( - nil, - params[:commit_message] - ) - - if deleted_successfully - success - else - error("Your changes could not be committed, because the file has been changed") - end + class DeleteService < Files::BaseService + def commit + repository.remove_file(current_user, @file_path, @commit_message, @target_branch) end end end diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index 0724d3ae63..a20903c6f0 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -1,39 +1,9 @@ require_relative "base_service" module Files - class UpdateService < BaseService - def execute - allowed = ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(ref) - - unless allowed - return error("You are not allowed to push into this branch") - end - - unless repository.branch_names.include?(ref) - return error("You can only create files if you are on top of a branch") - end - - blob = repository.blob_at_branch(ref, path) - - unless blob - return error("You can only edit text files") - end - - edit_file_action = Gitlab::Satellite::EditFileAction.new(current_user, project, ref, path) - edit_file_action.commit!( - params[:content], - params[:commit_message], - params[:encoding], - params[:new_branch] - ) - - success - rescue Gitlab::Satellite::CheckoutFailed => ex - error("Your changes could not be committed because ref '#{ref}' could not be checked out", 400) - rescue Gitlab::Satellite::CommitFailed => ex - error("Your changes could not be committed. Maybe there was nothing to commit?", 409) - rescue Gitlab::Satellite::PushFailed => ex - error("Your changes could not be committed. Maybe the file was changed by another process?", 409) + class UpdateService < Files::BaseService + def commit + repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch) end end end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 5a2c97b08a..0a73244774 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -10,16 +10,14 @@ class GitPushService # # Next, this method: # 1. Creates the push event - # 2. Ensures that the project satellite exists - # 3. Updates merge requests - # 4. Recognizes cross-references from commit messages - # 5. Executes the project's web hooks - # 6. Executes the project's services + # 2. Updates merge requests + # 3. Recognizes cross-references from commit messages + # 4. Executes the project's web hooks + # 5. Executes the project's services # def execute(project, user, oldrev, newrev, ref) @project, @user = project, user - project.ensure_satellite_exists project.repository.expire_cache if push_remove_branch?(ref, newrev) @@ -80,24 +78,29 @@ class GitPushService # For push with 1k commits it prevents 900+ requests in database author = nil + # Keep track of the issues that will be actually closed because they are on a default branch. + # Hence, when creating cross-reference notes, the not-closed issues (on non-default branches) + # will also have cross-reference. + actually_closed_issues = [] + if issues_to_close.present? && is_default_branch author ||= commit_user(commit) - + actually_closed_issues = issues_to_close issues_to_close.each do |issue| Issues::CloseService.new(project, author, {}).execute(issue, commit) end end if project.default_issues_tracker? - create_cross_reference_notes(commit, issues_to_close) + create_cross_reference_notes(commit, actually_closed_issues) end end end def create_cross_reference_notes(commit, issues_to_close) - # Create cross-reference notes for any other references. Omit any issues that were referenced in an - # issue-closing phrase, or have already been mentioned from this commit (probably from this commit - # being pushed to a different branch). + # Create cross-reference notes for any other references than those given in issues_to_close. + # Omit any issues that were referenced in an issue-closing phrase, or have already been + # mentioned from this commit (probably from this commit being pushed to a different branch). refs = commit.references(project, user) - issues_to_close refs.reject! { |r| commit.has_mentioned?(r) } @@ -133,7 +136,8 @@ class GitPushService end def is_default_branch?(ref) - Gitlab::Git.branch_ref?(ref) && Gitlab::Git.ref_name(ref) == project.default_branch + Gitlab::Git.branch_ref?(ref) && + (Gitlab::Git.ref_name(ref) == project.default_branch || project.default_branch.nil?) end def commit_user(commit) diff --git a/app/services/merge_requests/auto_merge_service.rb b/app/services/merge_requests/auto_merge_service.rb deleted file mode 100644 index cdedf48b0c..0000000000 --- a/app/services/merge_requests/auto_merge_service.rb +++ /dev/null @@ -1,30 +0,0 @@ -module MergeRequests - # AutoMergeService class - # - # Do git merge in satellite and in case of success - # mark merge request as merged and execute all hooks and notifications - # Called when you do merge via GitLab UI - class AutoMergeService < BaseMergeService - def execute(merge_request, commit_message) - merge_request.lock_mr - - if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message) - merge_request.merge - - create_merge_event(merge_request, current_user) - create_note(merge_request) - notification_service.merge_mr(merge_request, current_user) - execute_hooks(merge_request, 'merge') - - true - else - merge_request.unlock_mr - false - end - rescue - merge_request.unlock_mr if merge_request.locked? - merge_request.mark_as_unmergeable - false - end - end -end diff --git a/app/services/merge_requests/base_merge_service.rb b/app/services/merge_requests/base_merge_service.rb deleted file mode 100644 index 9579573adf..0000000000 --- a/app/services/merge_requests/base_merge_service.rb +++ /dev/null @@ -1,10 +0,0 @@ -module MergeRequests - class BaseMergeService < MergeRequests::BaseService - - private - - def create_merge_event(merge_request, current_user) - EventCreateService.new.merge_mr(merge_request, current_user) - end - end -end diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb index 956480938c..a9b29f9654 100644 --- a/app/services/merge_requests/build_service.rb +++ b/app/services/merge_requests/build_service.rb @@ -12,12 +12,16 @@ module MergeRequests merge_request.target_project ||= (project.forked_from_project || project) merge_request.target_branch ||= merge_request.target_project.default_branch - unless merge_request.target_branch && merge_request.source_branch - return build_failed(merge_request, nil) + if merge_request.target_branch.blank? || merge_request.source_branch.blank? + message = + if params[:source_branch] || params[:target_branch] + "You must select source and target branch" + end + + return build_failed(merge_request, message) end compare_result = CompareService.new.execute( - current_user, merge_request.source_project, merge_request.source_branch, merge_request.target_project, @@ -40,7 +44,6 @@ module MergeRequests merge_request.compare_diffs = diffs elsif diffs == false - # satellite timeout return false merge_request.can_be_created = false merge_request.compare_failed = true end @@ -59,9 +62,6 @@ module MergeRequests end merge_request - - rescue Gitlab::Satellite::BranchesWithoutParent - return build_failed(merge_request, "Selected branches have no common commit so they cannot be merged.") end def build_failed(merge_request, message) diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index 327ead4ff3..98a67c0bc9 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -1,22 +1,47 @@ module MergeRequests # MergeService class # - # Mark existing merge request as merged - # and execute all hooks and notifications - # Called when you do merge via command line and push code - # to target branch - class MergeService < BaseMergeService + # Do git merge and in case of success + # mark merge request as merged and execute all hooks and notifications + # Executed when you do merge via GitLab UI + # + class MergeService < MergeRequests::BaseService + attr_reader :merge_request, :commit_message + def execute(merge_request, commit_message) - merge_request.merge + @commit_message = commit_message + @merge_request = merge_request - create_merge_event(merge_request, current_user) - create_note(merge_request) - notification_service.merge_mr(merge_request, current_user) - execute_hooks(merge_request, 'merge') + unless @merge_request.mergeable? + return error('Merge request is not mergeable') + end - true - rescue - false + merge_request.in_locked_state do + if commit + after_merge + success + else + error('Can not merge changes') + end + end + end + + private + + def commit + committer = repository.user_to_comitter(current_user) + + options = { + message: commit_message, + author: committer, + committer: committer + } + + repository.merge(current_user, merge_request.source_sha, merge_request.target_branch, options) + end + + def after_merge + MergeRequests::PostMergeService.new(project, current_user).execute(merge_request) end end end diff --git a/app/services/merge_requests/post_merge_service.rb b/app/services/merge_requests/post_merge_service.rb new file mode 100644 index 0000000000..aceb8cb902 --- /dev/null +++ b/app/services/merge_requests/post_merge_service.rb @@ -0,0 +1,22 @@ +module MergeRequests + # PostMergeService class + # + # Mark existing merge request as merged + # and execute all hooks and notifications + # + class PostMergeService < MergeRequests::BaseService + def execute(merge_request) + merge_request.mark_as_merged + create_merge_event(merge_request, current_user) + create_note(merge_request) + notification_service.merge_mr(merge_request, current_user) + execute_hooks(merge_request, 'merge') + end + + private + + def create_merge_event(merge_request, current_user) + EventCreateService.new.merge_mr(merge_request, current_user) + end + end +end diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index d0648da049..e903e48e3c 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -33,9 +33,9 @@ module MergeRequests merge_requests.uniq.select(&:source_project).each do |merge_request| - MergeRequests::MergeService. + MergeRequests::PostMergeService. new(merge_request.target_project, @current_user). - execute(merge_request, nil) + execute(merge_request) end end diff --git a/app/services/milestones/destroy_service.rb b/app/services/milestones/destroy_service.rb new file mode 100644 index 0000000000..2414966505 --- /dev/null +++ b/app/services/milestones/destroy_service.rb @@ -0,0 +1,27 @@ +module Milestones + class DestroyService < Milestones::BaseService + def execute(milestone) + + Milestone.transaction do + update_params = { milestone: nil } + + milestone.issues.each do |issue| + Issues::UpdateService.new(project, current_user, update_params).execute(issue) + end + + milestone.merge_requests.each do |merge_request| + MergeRequests::UpdateService.new(project, current_user, update_params).execute(merge_request) + end + + event_service.destroy_milestone(milestone, current_user) + + Event.for_milestone_id(milestone.id).each do |event| + event.target_id = nil + event.save + end + + milestone.destroy + end + end + end +end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 3735a13636..e294b23bc2 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -107,12 +107,17 @@ class NotificationService recipients = [] + mentioned_users = note.mentioned_users + mentioned_users.select! do |user| + user.can?(:read_project, note.project) + end + # Add all users participating in the thread (author, assignee, comment authors) participants = if target.respond_to?(:participants) target.participants(note.author) else - note.mentioned_users + mentioned_users end recipients = recipients.concat(participants) @@ -120,8 +125,8 @@ class NotificationService recipients = add_project_watchers(recipients, note.project) # Reject users with Mention notification level, except those mentioned in _this_ note. - recipients = reject_mention_users(recipients - note.mentioned_users, note.project) - recipients = recipients + note.mentioned_users + recipients = reject_mention_users(recipients - mentioned_users, note.project) + recipients = recipients + mentioned_users recipients = reject_muted_users(recipients, note.project) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index b35aed005d..e54a13ed6c 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -55,9 +55,7 @@ module Projects @project.save if @project.persisted? && !@project.import? - unless @project.create_repository - raise 'Failed to create repository' - end + raise 'Failed to create repository' unless @project.create_repository end end @@ -87,6 +85,8 @@ module Projects @project.build_missing_services + @project.create_labels + event_service.create_project(@project, current_user) system_hook_service.execute_hooks_for(@project, :create) diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 403f419ec5..28872c8925 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -27,7 +27,6 @@ module Projects end end - project.satellite.destroy log_info("Project \"#{project.name}\" was removed") system_hook_service.execute_hooks_for(project, :destroy) true diff --git a/app/services/projects/download_service.rb b/app/services/projects/download_service.rb new file mode 100644 index 0000000000..99f22293d0 --- /dev/null +++ b/app/services/projects/download_service.rb @@ -0,0 +1,43 @@ +module Projects + class DownloadService < BaseService + + WHITELIST = [ + /^[^.]+\.fogbugz.com$/ + ] + + def initialize(project, url) + @project, @url = project, url + end + + def execute + return nil unless valid_url?(@url) + + uploader = FileUploader.new(@project) + uploader.download!(@url) + uploader.store! + + filename = uploader.image? ? uploader.file.basename : uploader.file.filename + + { + 'alt' => filename, + 'url' => uploader.secure_url, + 'is_image' => uploader.image? + } + end + + private + + def valid_url?(url) + url && http?(url) && valid_domain?(url) + end + + def http?(url) + url =~ /\A#{URI::regexp(['http', 'https'])}\z/ + end + + def valid_domain?(url) + host = URI.parse(url).host + WHITELIST.any? { |entry| entry === host } + end + end +end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 50f208b11d..2e995d6fd5 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -18,7 +18,7 @@ module Projects if new_project.persisted? if @project.gitlab_ci? - ForkRegistrationWorker.perform_async(@project.id, new_project.id, @current_user.private_token) + @project.gitlab_ci_service.fork_registration(new_project, @current_user) end end diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index f43c0ef70e..550ed6897d 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -33,9 +33,6 @@ module Projects raise TransferError.new("Project with same path in target namespace already exists") end - # Remove old satellite - project.satellite.destroy - # Apply new namespace id project.namespace = new_namespace project.save! @@ -51,9 +48,6 @@ module Projects # Move wiki repo also if present gitlab_shell.mv_repository("#{old_path}.wiki", "#{new_path}.wiki") - # Create a new satellite (reload project from DB) - Project.find(project.id).ensure_satellite_exists - # clear project cached events project.reset_events_cache diff --git a/app/services/projects/upload_service.rb b/app/services/projects/upload_service.rb index 992a7a7a1d..279550d6f4 100644 --- a/app/services/projects/upload_service.rb +++ b/app/services/projects/upload_service.rb @@ -13,9 +13,9 @@ module Projects filename = uploader.image? ? uploader.file.basename : uploader.file.filename { - 'alt' => filename, - 'url' => uploader.secure_url, - 'is_image' => uploader.image? + alt: filename, + url: uploader.secure_url, + is_image: uploader.image? } end diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index b67d2116fa..d1bcc73190 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -27,6 +27,20 @@ - restricted_level_checkboxes('restricted-visibility-help').each do |level| = level %span.help-block#restricted-visibility-help Selected levels cannot be used by non-admin users for projects or snippets + .form-group + = f.label :import_sources, class: 'control-label col-sm-2' + .col-sm-10 + - data_attrs = { toggle: 'buttons' } + .btn-group{ data: data_attrs } + - import_sources_checkboxes('import-sources-help').each do |source| + = source + %span.help-block#import-sources-help + Enabled sources for code import during project creation. OmniAuth must be configured for GitHub + = link_to "(?)", help_page_path("integration", "github") + , Bitbucket + = link_to "(?)", help_page_path("integration", "bitbucket") + and GitLab.com + = link_to "(?)", help_page_path("integration", "gitlab") .form-group .col-sm-offset-2.col-sm-10 .checkbox @@ -104,6 +118,20 @@ .col-sm-10 = f.text_area :sign_in_text, class: 'form-control', rows: 4 .help-block Markdown enabled + .form-group + = f.label :help_page_text, class: 'control-label col-sm-2' + .col-sm-10 + = f.text_area :help_page_text, class: 'form-control', rows: 4 + .help-block Markdown enabled + + %fieldset + %legend Continuous Integration + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = f.label :ci_enabled do + = f.check_box :ci_enabled + When unchecked CI is disabled until rake ci:migrate is run (8.0 only) .form-actions = f.submit 'Save', class: 'btn btn-primary' diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 3732ff847b..8657d2c71f 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -55,6 +55,10 @@ OmniAuth %span.light.pull-right = boolean_to_icon Gitlab.config.omniauth.enabled + %p + Reply by email + %span.light.pull-right + = boolean_to_icon Gitlab::IncomingEmail.enabled? .col-md-4 %h4 Components diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml index e74e1e85f4..b120f4dea6 100644 --- a/app/views/admin/hooks/index.html.haml +++ b/app/views/admin/hooks/index.html.haml @@ -18,6 +18,13 @@ = f.label :url, "URL:", class: 'control-label' .col-sm-10 = f.text_field :url, class: "form-control" + .form-group + = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox' + .col-sm-10 + .checkbox + = f.label :enable_ssl_verification do + = f.check_box :enable_ssl_verification + %strong Enable SSL verification .form-actions = f.submit "Add System Hook", class: "btn btn-create" %hr @@ -32,6 +39,7 @@ .list-item-name = link_to admin_hook_path(hook) do %strong= hook.url + %p SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"} .pull-right = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn btn-sm" diff --git a/app/views/admin/labels/_form.html.haml b/app/views/admin/labels/_form.html.haml new file mode 100644 index 0000000000..ad58a3837f --- /dev/null +++ b/app/views/admin/labels/_form.html.haml @@ -0,0 +1,35 @@ += form_for [:admin, @label], html: { class: 'form-horizontal label-form js-requires-input' } do |f| + -if @label.errors.any? + .row + .col-sm-offset-2.col-sm-10 + .alert.alert-danger + - @label.errors.full_messages.each do |msg| + %span= msg + %br + + .form-group + = f.label :title, class: 'control-label' + .col-sm-10 + = f.text_field :title, class: "form-control", required: true + .form-group + = f.label :color, "Background Color", class: 'control-label' + .col-sm-10 + .input-group + .input-group-addon.label-color-preview   + = f.color_field :color, class: "form-control" + .help-block + Choose any color. + %br + Or you can choose one of suggested colors below + + .suggest-colors + - suggested_colors.each do |color| + = link_to '#', style: "background-color: #{color}", data: { color: color } do +   + + .form-actions + = f.submit 'Save', class: 'btn btn-save js-save-button' + = link_to "Cancel", admin_labels_path, class: 'btn btn-cancel' + +:coffeescript + new Labels diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml new file mode 100644 index 0000000000..596e06243d --- /dev/null +++ b/app/views/admin/labels/_label.html.haml @@ -0,0 +1,5 @@ +%li{id: dom_id(label)} + = render_colored_label(label) + .pull-right + = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm' + = link_to 'Remove', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} diff --git a/app/views/admin/labels/destroy.js.haml b/app/views/admin/labels/destroy.js.haml new file mode 100644 index 0000000000..9d51762890 --- /dev/null +++ b/app/views/admin/labels/destroy.js.haml @@ -0,0 +1,2 @@ +- if @labels.size == 0 + $('.labels').load(document.URL + ' .light-well').hide().fadeIn(1000) diff --git a/app/views/admin/labels/edit.html.haml b/app/views/admin/labels/edit.html.haml new file mode 100644 index 0000000000..45c62a7625 --- /dev/null +++ b/app/views/admin/labels/edit.html.haml @@ -0,0 +1,9 @@ +- page_title "Edit", @label.name, "Labels" +%h3 + Edit label + %span.light #{@label.name} +.back-link + = link_to admin_labels_path do + ← To labels list +%hr += render 'form' diff --git a/app/views/admin/labels/index.html.haml b/app/views/admin/labels/index.html.haml new file mode 100644 index 0000000000..8b11c28c56 --- /dev/null +++ b/app/views/admin/labels/index.html.haml @@ -0,0 +1,16 @@ +- page_title "Labels" += link_to new_admin_label_path, class: "pull-right btn btn-new" do + New label +%h3.page-title + Labels +%hr + +.labels + - if @labels.present? + %ul.bordered-list.manage-labels-list + = render @labels + = paginate @labels, theme: 'gitlab' + - else + .light-well + .nothing-here-block There are no any labels yet + \ No newline at end of file diff --git a/app/views/admin/labels/new.html.haml b/app/views/admin/labels/new.html.haml new file mode 100644 index 0000000000..8d298ad20f --- /dev/null +++ b/app/views/admin/labels/new.html.haml @@ -0,0 +1,7 @@ +- page_title "New Label" +%h3 New label +.back-link + = link_to admin_labels_path do + ← To labels list +%hr += render 'form' diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index f43d46356f..d9b481404f 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -23,6 +23,10 @@ = label_tag :abandoned do = check_box_tag :abandoned, 1, params[:abandoned] %span No activity over 6 month + .checkbox + = label_tag :with_archived do + = check_box_tag :with_archived, 1, params[:with_archived] + %span Show archived projects %fieldset %strong Visibility level: @@ -73,6 +77,8 @@ = visibility_level_icon(project.visibility_level) = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] .pull-right + - if project.archived + %span.label.label-warning archived %span.label.label-gray = repository_size(project) = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 5e40d95d1c..e3698ac1c4 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -97,5 +97,5 @@ - if user.access_locked? = link_to 'Unlock', unlock_admin_user_path(user), method: :put, class: "btn btn-xs btn-success", data: { confirm: 'Are you sure?' } - if user.can_be_removed? - = link_to 'Destroy', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! All tickets linked to this user will also be removed! Maybe block the user instead? Are you sure?" }, method: :delete, class: "btn btn-xs btn-remove" + = link_to 'Destroy', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! All issues, merge requests and groups linked to this user will also be removed! Maybe block the user instead? Are you sure?" }, method: :delete, class: "btn btn-xs btn-remove" = paginate @users, theme: "gitlab" diff --git a/app/views/ci/admin/application_settings/_form.html.haml b/app/views/ci/admin/application_settings/_form.html.haml new file mode 100644 index 0000000000..634c9daa47 --- /dev/null +++ b/app/views/ci/admin/application_settings/_form.html.haml @@ -0,0 +1,24 @@ += form_for @application_setting, url: ci_admin_application_settings_path, html: { class: 'form-horizontal fieldset-form' } do |f| + - if @application_setting.errors.any? + #error_explanation + .alert.alert-danger + - @application_setting.errors.full_messages.each do |msg| + %p= msg + + %fieldset + %legend Default Project Settings + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = f.label :all_broken_builds do + = f.check_box :all_broken_builds + Send emails only on broken builds + .form-group + .col-sm-offset-2.col-sm-10 + .checkbox + = f.label :add_pusher do + = f.check_box :add_pusher + Add pusher to recipients list + + .form-actions + = f.submit 'Save', class: 'btn btn-primary' diff --git a/app/views/ci/admin/application_settings/show.html.haml b/app/views/ci/admin/application_settings/show.html.haml new file mode 100644 index 0000000000..7ef0aa89ed --- /dev/null +++ b/app/views/ci/admin/application_settings/show.html.haml @@ -0,0 +1,3 @@ +%h3.page-title Settings +%hr += render 'form' diff --git a/app/views/ci/admin/builds/_build.html.haml b/app/views/ci/admin/builds/_build.html.haml new file mode 100644 index 0000000000..778d51d03b --- /dev/null +++ b/app/views/ci/admin/builds/_build.html.haml @@ -0,0 +1,32 @@ +- if build.commit && build.project + %tr.build + %td.build-link + = link_to ci_project_build_url(build.project, build) do + %strong #{build.id} + + %td.status + = ci_status_with_icon(build.status) + + %td.commit-link + = commit_link(build.commit) + + %td.runner + - if build.runner + = link_to build.runner.id, ci_admin_runner_path(build.runner) + + %td.build-project + = truncate build.project.name, length: 30 + + %td.build-message + %span= truncate(build.commit.git_commit_message, length: 30) + + %td.build-branch + %span= truncate(build.ref, length: 25) + + %td.duration + - if build.duration + #{duration_in_words(build.finished_at, build.started_at)} + + %td.timestamp + - if build.finished_at + %span #{time_ago_in_words build.finished_at} ago diff --git a/app/views/ci/admin/builds/index.html.haml b/app/views/ci/admin/builds/index.html.haml new file mode 100644 index 0000000000..d23119162c --- /dev/null +++ b/app/views/ci/admin/builds/index.html.haml @@ -0,0 +1,28 @@ +%ul.nav.nav-tabs.append-bottom-20 + %li{class: ("active" if @scope.nil?)} + = link_to 'All builds', ci_admin_builds_path + + %li{class: ("active" if @scope == "pending")} + = link_to "Pending", ci_admin_builds_path(scope: :pending) + + %li{class: ("active" if @scope == "running")} + = link_to "Running", ci_admin_builds_path(scope: :running) + + +%table.builds + %thead + %tr + %th Build + %th Status + %th Commit + %th Runner + %th Project + %th Message + %th Branch + %th Duration + %th Finished at + + - @builds.each do |build| + = render "ci/admin/builds/build", build: build + += paginate @builds diff --git a/app/views/ci/admin/events/index.html.haml b/app/views/ci/admin/events/index.html.haml new file mode 100644 index 0000000000..f9ab099430 --- /dev/null +++ b/app/views/ci/admin/events/index.html.haml @@ -0,0 +1,17 @@ +%table.table + %thead + %tr + %th User ID + %th Description + %th When + - @events.each do |event| + %tr + %td + = event.user_id + %td + = event.description + %td.light + = time_ago_in_words event.updated_at + ago + += paginate @events \ No newline at end of file diff --git a/app/views/ci/admin/projects/_project.html.haml b/app/views/ci/admin/projects/_project.html.haml new file mode 100644 index 0000000000..c461206c72 --- /dev/null +++ b/app/views/ci/admin/projects/_project.html.haml @@ -0,0 +1,29 @@ +- last_commit = project.last_commit +%tr + %td + = project.id + %td + = link_to [:ci, project] do + %strong= project.name + %td + - if last_commit + = ci_status_with_icon(last_commit.status) + - if project.last_commit_date + · + = time_ago_in_words project.last_commit_date + ago + - else + No builds yet + %td + - if project.public + %i.fa.fa-globe + Public + - else + %i.fa.fa-lock + Private + %td + = project.commits.count + %td + = link_to [:ci, :admin, project], method: :delete, class: 'btn btn-danger btn-sm' do + %i.fa.fa-remove + Remove diff --git a/app/views/ci/admin/projects/index.html.haml b/app/views/ci/admin/projects/index.html.haml new file mode 100644 index 0000000000..dc7b041473 --- /dev/null +++ b/app/views/ci/admin/projects/index.html.haml @@ -0,0 +1,15 @@ +%table.table + %thead + %tr + %th ID + %th Name + %th Last build + %th Access + %th Builds + %th + + - @projects.each do |project| + = render "ci/admin/projects/project", project: project + += paginate @projects + diff --git a/app/views/ci/admin/runner_projects/index.html.haml b/app/views/ci/admin/runner_projects/index.html.haml new file mode 100644 index 0000000000..f049b4f4c4 --- /dev/null +++ b/app/views/ci/admin/runner_projects/index.html.haml @@ -0,0 +1,57 @@ +%p.lead + To register new runner visit #{link_to 'this page ', ci_runners_path} + +.row + .col-md-8 + %h5 Activated: + %table.table + %tr + %th Runner ID + %th Runner Description + %th Last build + %th Builds Stats + %th Registered + %th + + - @runner_projects.each do |runner_project| + - runner = runner_project.runner + - builds = runner.builds.where(project_id: @project.id) + %tr + %td + %span.badge.badge-info= runner.id + %td + = runner.display_name + %td + - last_build = builds.last + - if last_build + = link_to last_build.short_sha, [last_build.project, last_build] + - else + unknown + %td + %span.badge.badge-success + #{builds.success.count} + %span / + %span.badge.badge-important + #{builds.failed.count} + %td + #{time_ago_in_words(runner_project.created_at)} ago + %td + = link_to 'Disable', [:ci, @project, runner_project], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm right' + .col-md-4 + %h5 Available + %table.table + %tr + %th ID + %th Token + %th + + - (Ci::Runner.all - @project.runners).each do |runner| + %tr + %td + = runner.id + %td + = runner.token + %td + = form_for [:ci, @project, @runner_project] do |f| + = f.hidden_field :runner_id, value: runner.id + = f.submit 'Add', class: 'btn btn-sm' diff --git a/app/views/ci/admin/runners/_runner.html.haml b/app/views/ci/admin/runners/_runner.html.haml new file mode 100644 index 0000000000..701782d26b --- /dev/null +++ b/app/views/ci/admin/runners/_runner.html.haml @@ -0,0 +1,48 @@ +%tr{id: dom_id(runner)} + %td + - if runner.shared? + %span.label.label-success shared + - else + %span.label.label-info specific + - unless runner.active? + %span.label.label-danger paused + + %td + = link_to ci_admin_runner_path(runner) do + = runner.short_sha + %td + .runner-description + = runner.description + %span (#{link_to 'edit', '#', class: 'edit-runner-link'}) + .runner-description-form.hide + = form_for [:ci, :admin, runner], remote: true, html: { class: 'form-inline' } do |f| + .form-group + = f.text_field :description, class: 'form-control' + = f.submit 'Save', class: 'btn' + %span (#{link_to 'cancel', '#', class: 'cancel'}) + %td + - if runner.shared? + \- + - else + = runner.projects.count(:all) + %td + #{runner.builds.count(:all)} + %td + - runner.tag_list.each do |tag| + %span.label.label-primary + = tag + %td + - if runner.contacted_at + #{time_ago_in_words(runner.contacted_at)} ago + - else + Never + %td + .pull-right + = link_to 'Edit', ci_admin_runner_path(runner), class: 'btn btn-sm' +   + - if runner.active? + = link_to 'Pause', [:pause, :ci, :admin, runner], data: { confirm: "Are you sure?" }, method: :get, class: 'btn btn-danger btn-sm' + - else + = link_to 'Resume', [:resume, :ci, :admin, runner], method: :get, class: 'btn btn-success btn-sm' + = link_to 'Remove', [:ci, :admin, runner], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' + diff --git a/app/views/ci/admin/runners/index.html.haml b/app/views/ci/admin/runners/index.html.haml new file mode 100644 index 0000000000..b9d6703ff4 --- /dev/null +++ b/app/views/ci/admin/runners/index.html.haml @@ -0,0 +1,52 @@ +%p.lead + %span To register new runner you should enter the following registration token. With this token the runner will request a unique runner token and use that for future communication. + %code #{GitlabCi::REGISTRATION_TOKEN} + +.bs-callout + %p + A 'runner' is a process which runs a build. + You can setup as many runners as you need. + %br + Runners can be placed on separate users, servers, and even on your local machine. + %br + + %div + %span Each runner can be in one of the following states: + %ul + %li + %span.label.label-success shared + \- run builds from all unassigned projects + %li + %span.label.label-info specific + \- run builds from assigned projects + %li + %span.label.label-danger paused + \- runner will not receive any new build + +.append-bottom-20.clearfix + .pull-left + = form_tag ci_admin_runners_path, id: 'runners-search', class: 'form-inline', method: :get do + .form-group + = search_field_tag :search, params[:search], class: 'form-control', placeholder: 'Runner description or token' + = submit_tag 'Search', class: 'btn' + + .pull-right.light + Runners with last contact less than a minute ago: #{@active_runners_cnt} + +%br + +%table.table + %thead + %tr + %th Type + %th Runner token + %th Description + %th Projects + %th Builds + %th Tags + %th Last contact + %th + + - @runners.each do |runner| + = render "ci/admin/runners/runner", runner: runner += paginate @runners diff --git a/app/views/ci/admin/runners/show.html.haml b/app/views/ci/admin/runners/show.html.haml new file mode 100644 index 0000000000..09905e0eb4 --- /dev/null +++ b/app/views/ci/admin/runners/show.html.haml @@ -0,0 +1,118 @@ += content_for :title do + %h3.project-title + Runner ##{@runner.id} + .pull-right + - if @runner.shared? + %span.runner-state.runner-state-shared + Shared + - else + %span.runner-state.runner-state-specific + Specific + + + +- if @runner.shared? + .bs-callout.bs-callout-success + %h4 This runner will process build from ALL UNASSIGNED projects + %p + If you want runners to build only specific projects, enable them in the table below. + Keep in mind that this is a one way transition. +- else + .bs-callout.bs-callout-info + %h4 This runner will process build only from ASSIGNED projects + %p You can't make this a shared runner. +%hr += form_for @runner, url: ci_admin_runner_path(@runner), html: { class: 'form-horizontal' } do |f| + .form-group + = label_tag :token, class: 'control-label' do + Token + .col-sm-10 + = f.text_field :token, class: 'form-control', readonly: true + .form-group + = label_tag :description, class: 'control-label' do + Description + .col-sm-10 + = f.text_field :description, class: 'form-control' + .form-group + = label_tag :tag_list, class: 'control-label' do + Tags + .col-sm-10 + = f.text_field :tag_list, class: 'form-control' + .help-block You can setup builds to only use runners with specific tags + .form-actions + = f.submit 'Save', class: 'btn btn-save' + +.row + .col-md-6 + %h4 Restrict projects for this runner + - if @runner.projects.any? + %table.table + %thead + %tr + %th Assigned projects + %th + - @runner.runner_projects.each do |runner_project| + - project = runner_project.project + %tr.alert-info + %td + %strong + = project.name + %td + .pull-right + = link_to 'Disable', [:ci, :admin, project, runner_project], method: :delete, class: 'btn btn-danger btn-xs' + + %table.table + %thead + %tr + %th Project + %th + .pull-right + = link_to 'Assign to all', assign_all_ci_admin_runner_path(@runner), + class: 'btn btn-sm assign-all-runner', + title: 'Assign runner to all projects', + method: :put + + %tr + %td + = form_tag ci_admin_runner_path(@runner), id: 'runner-projects-search', class: 'form-inline', method: :get do + .form-group + = search_field_tag :search, params[:search], class: 'form-control' + = submit_tag 'Search', class: 'btn' + + %td + - @projects.each do |project| + %tr + %td + = project.name + %td + .pull-right + = form_for [:ci, :admin, project, project.runner_projects.new] do |f| + = f.hidden_field :runner_id, value: @runner.id + = f.submit 'Enable', class: 'btn btn-xs' + = paginate @projects + + .col-md-6 + %h4 Recent builds served by this runner + %table.builds.runner-builds + %thead + %tr + %th Status + %th Project + %th Commit + %th Finished at + + - @builds.each do |build| + %tr.build + %td.status + = ci_status_with_icon(build.status) + + %td.status + = build.project.name + + %td.build-link + = link_to ci_project_build_path(build.project, build) do + %strong #{build.short_sha} + + %td.timestamp + - if build.finished_at + %span #{time_ago_in_words build.finished_at} ago diff --git a/app/views/ci/admin/runners/update.js.haml b/app/views/ci/admin/runners/update.js.haml new file mode 100644 index 0000000000..2b7d3067e2 --- /dev/null +++ b/app/views/ci/admin/runners/update.js.haml @@ -0,0 +1,2 @@ +:plain + $("#runner_#{@runner.id}").replaceWith("#{escape_javascript(render(@runner))}") diff --git a/app/views/ci/builds/_build.html.haml b/app/views/ci/builds/_build.html.haml new file mode 100644 index 0000000000..515b862e99 --- /dev/null +++ b/app/views/ci/builds/_build.html.haml @@ -0,0 +1,45 @@ +%tr.build + %td.status + = ci_status_with_icon(build.status) + + %td.build-link + = link_to ci_project_build_path(build.project, build) do + %strong Build ##{build.id} + + %td + = build.stage + + %td + = build.name + .pull-right + - if build.tags.any? + - build.tag_list.each do |tag| + %span.label.label-primary + = tag + - if build.trigger_request + %span.label.label-info triggered + - if build.allow_failure + %span.label.label-danger allowed to fail + + %td.duration + - if build.duration + #{duration_in_words(build.finished_at, build.started_at)} + + %td.timestamp + - if build.finished_at + %span #{time_ago_in_words build.finished_at} ago + + - if build.project.coverage_enabled? + %td.coverage + - if build.coverage + #{build.coverage}% + + %td + - if defined?(controls) && current_user && can?(current_user, :manage_builds, gl_project) + .pull-right + - if build.active? + = link_to cancel_ci_project_build_path(build.project, build, return_to: request.original_url), title: 'Cancel build' do + %i.fa.fa-remove.cred + - elsif build.commands.present? + = link_to retry_ci_project_build_path(build.project, build, return_to: request.original_url), method: :post, title: 'Retry build' do + %i.fa.fa-repeat diff --git a/app/views/ci/builds/show.html.haml b/app/views/ci/builds/show.html.haml new file mode 100644 index 0000000000..839dbf5c55 --- /dev/null +++ b/app/views/ci/builds/show.html.haml @@ -0,0 +1,170 @@ +#up-build-trace +- if @commit.matrix? + %ul.center-top-menu + - @commit.builds_without_retry_sorted.each do |build| + %li{class: ('active' if build == @build) } + = link_to ci_project_build_url(@project, build) do + = ci_icon_for_status(build.status) + %span + - if build.name + = build.name + - else + = build.id + + + - unless @commit.builds_without_retry.include?(@build) + %li.active + %a + Build ##{@build.id} + · + %i.fa.fa-warning-sign + This build was retried. + +.gray-content-block + .build-head + %h4 + - if @build.commit.tag? + Build for tag + %code #{@build.ref} + - else + Build for commit + %strong.monospace= commit_link(@build.commit) + from + + = link_to ci_project_path(@build.project, ref: @build.ref) do + %strong.monospace= "#{@build.ref}" + + - if @build.duration + .pull-right + %span + %i.fa.fa-time + #{duration_in_words(@build.finished_at, @build.started_at)} + + .clearfix + = ci_status_with_icon(@build.status) + .pull-right + = @build.updated_at.stamp('19:00 Aug 27') + +.row.prepend-top-default + .col-md-9 + .clearfix + - if @build.active? + .autoscroll-container + %button.btn.btn-success.btn-sm#autoscroll-button{:type => "button", :data => {:state => 'disabled'}} enable autoscroll + .clearfix + .scroll-controls + = link_to '#up-build-trace', class: 'btn' do + %i.fa.fa-angle-up + = link_to '#down-build-trace', class: 'btn' do + %i.fa.fa-angle-down + + %pre.trace#build-trace + %code.bash + = preserve do + = raw @build.trace_html + %div#down-build-trace + + .col-md-3 + - if @build.coverage + .build-widget + %h4.title + Test coverage + %h1 #{@build.coverage}% + + + .build-widget + %h4.title + Build + - if current_user && can?(current_user, :manage_builds, gl_project) + .pull-right + - if @build.active? + = link_to "Cancel", cancel_ci_project_build_path(@project, @build), class: 'btn btn-sm btn-danger' + - elsif @build.commands.present? + = link_to "Retry", retry_ci_project_build_path(@project, @build), class: 'btn btn-sm btn-primary', method: :post + + - if @build.duration + %p + %span.attr-name Duration: + #{duration_in_words(@build.finished_at, @build.started_at)} + %p + %span.attr-name Created: + #{time_ago_in_words(@build.created_at)} ago + - if @build.finished_at + %p + %span.attr-name Finished: + #{time_ago_in_words(@build.finished_at)} ago + %p + %span.attr-name Runner: + - if @build.runner && current_user && current_user.admin + \#{link_to "##{@build.runner.id}", ci_admin_runner_path(@build.runner.id)} + - elsif @build.runner + \##{@build.runner.id} + + - if @build.trigger_request + .build-widget + %h4.title + Trigger + + %p + %span.attr-name Token: + #{@build.trigger_request.trigger.short_token} + + - if @build.trigger_request.variables + %p + %span.attr-name Variables: + + %code + - @build.trigger_request.variables.each do |key, value| + #{key}=#{value} + + .build-widget + %h4.title + Commit + .pull-right + %small #{build_commit_link @build} + + - if @build.commit.compare? + %p + %span.attr-name Compare: + #{build_compare_link @build} + %p + %span.attr-name Branch: + #{build_ref_link @build} + %p + %span.attr-name Author: + #{@build.commit.git_author_name} + %p + %span.attr-name Message: + #{@build.commit.git_commit_message} + + - if @build.tags.any? + .build-widget + %h4.title + Tags + - @build.tag_list.each do |tag| + %span.label.label-primary + = tag + + - if @builds.present? + .build-widget + %h4.title #{pluralize(@builds.count, "other build")} for #{@build.short_sha}: + %table.builds + - @builds.each_with_index do |build, i| + %tr.build + %td + = ci_icon_for_status(build.status) + %td + = link_to ci_project_build_url(@project, build) do + - if build.name + = build.name + - else + %span ##{build.id} + + %td.status= build.status + + + = paginate @builds + + +:javascript + new CiBuild("#{ci_project_build_url(@project, @build)}", "#{@build.status}") diff --git a/app/views/ci/charts/_build_times.haml b/app/views/ci/charts/_build_times.haml new file mode 100644 index 0000000000..c3c2f57241 --- /dev/null +++ b/app/views/ci/charts/_build_times.haml @@ -0,0 +1,21 @@ +%fieldset + %legend + Commit duration in minutes for last 30 commits + + %canvas#build_timesChart.padded{width: 800, height: 300} + +:javascript + var data = { + labels : #{@charts[:build_times].labels.to_json}, + datasets : [ + { + fillColor : "#4A3", + strokeColor : "rgba(151,187,205,1)", + pointColor : "rgba(151,187,205,1)", + pointStrokeColor : "#fff", + data : #{@charts[:build_times].build_times.to_json} + } + ] + } + var ctx = $("#build_timesChart").get(0).getContext("2d"); + new Chart(ctx).Line(data,{"scaleOverlay": true}); diff --git a/app/views/ci/charts/_builds.haml b/app/views/ci/charts/_builds.haml new file mode 100644 index 0000000000..1b0039fb83 --- /dev/null +++ b/app/views/ci/charts/_builds.haml @@ -0,0 +1,41 @@ +%fieldset + %legend + Builds chart for last week + (#{date_from_to(Date.today - 7.days, Date.today)}) + + %canvas#weekChart.padded{width: 800, height: 200} + +%fieldset + %legend + Builds chart for last month + (#{date_from_to(Date.today - 30.days, Date.today)}) + + %canvas#monthChart.padded{width: 800, height: 300} + +%fieldset + %legend Builds chart for last year + %canvas#yearChart.padded{width: 800, height: 400} + +- [:week, :month, :year].each do |scope| + :javascript + var data = { + labels : #{@charts[scope].labels.to_json}, + datasets : [ + { + fillColor : "rgba(220,220,220,0.5)", + strokeColor : "rgba(220,220,220,1)", + pointColor : "rgba(220,220,220,1)", + pointStrokeColor : "#EEE", + data : #{@charts[scope].total.to_json} + }, + { + fillColor : "#4A3", + strokeColor : "rgba(151,187,205,1)", + pointColor : "rgba(151,187,205,1)", + pointStrokeColor : "#fff", + data : #{@charts[scope].success.to_json} + } + ] + } + var ctx = $("##{scope}Chart").get(0).getContext("2d"); + new Chart(ctx).Line(data,{"scaleOverlay": true}); diff --git a/app/views/ci/charts/_overall.haml b/app/views/ci/charts/_overall.haml new file mode 100644 index 0000000000..f522f35a62 --- /dev/null +++ b/app/views/ci/charts/_overall.haml @@ -0,0 +1,21 @@ +%fieldset + %legend Overall + %p + Total: + %strong= pluralize @project.builds.count(:all), 'build' + %p + Successful: + %strong= pluralize @project.builds.success.count(:all), 'build' + %p + Failed: + %strong= pluralize @project.builds.failed.count(:all), 'build' + + %p + Success ratio: + %strong + #{success_ratio(@project.builds.success, @project.builds.failed)}% + + %p + Commits covered: + %strong + = @project.commits.count(:all) diff --git a/app/views/ci/charts/show.html.haml b/app/views/ci/charts/show.html.haml new file mode 100644 index 0000000000..0497f03772 --- /dev/null +++ b/app/views/ci/charts/show.html.haml @@ -0,0 +1,4 @@ +#charts.ci-charts + = render 'builds' + = render 'build_times' += render 'overall' diff --git a/app/views/ci/commits/_commit.html.haml b/app/views/ci/commits/_commit.html.haml new file mode 100644 index 0000000000..1eacfca944 --- /dev/null +++ b/app/views/ci/commits/_commit.html.haml @@ -0,0 +1,32 @@ +%tr.build + %td.status + = ci_status_with_icon(commit.status) + - if commit.running? + · + = commit.stage + + + %td.build-link + = link_to ci_project_ref_commits_path(commit.project, commit.ref, commit.sha) do + %strong #{commit.short_sha} + + %td.build-message + %span= truncate_first_line(commit.git_commit_message) + + %td.build-branch + - unless @ref + %span + = link_to truncate(commit.ref, length: 25), ci_project_path(@project, ref: commit.ref) + + %td.duration + - if commit.duration > 0 + #{time_interval_in_words commit.duration} + + %td.timestamp + - if commit.finished_at + %span #{time_ago_in_words commit.finished_at} ago + + - if commit.project.coverage_enabled? + %td.coverage + - if commit.coverage + #{commit.coverage}% diff --git a/app/views/ci/commits/show.html.haml b/app/views/ci/commits/show.html.haml new file mode 100644 index 0000000000..8f38aa8467 --- /dev/null +++ b/app/views/ci/commits/show.html.haml @@ -0,0 +1,87 @@ +.commit-info + .append-bottom-20 + = ci_status_with_icon(@commit.status) + + .gray-content-block.middle-block + %pre.commit-message + #{@commit.git_commit_message} + + .gray-content-block.second-block + .row + .col-sm-6 + - if @commit.compare? + %p + %span.attr-name Compare: + #{gitlab_compare_link(@project, @commit.short_before_sha, @commit.short_sha)} + - else + %p + %span.attr-name Commit: + #{gitlab_commit_link(@project, @commit.sha)} + + %p + %span.attr-name Branch: + #{gitlab_ref_link(@project, @commit.ref)} + .col-sm-6 + %p + %span.attr-name Author: + #{@commit.git_author_name} (#{@commit.git_author_email}) + - if @commit.created_at + %p + %span.attr-name Created at: + #{@commit.created_at.to_s(:short)} + +- if current_user && can?(current_user, :manage_builds, gl_project) + .pull-right + - if @commit.builds.running_or_pending.any? + = link_to "Cancel", cancel_ci_project_ref_commits_path(@project, @commit.ref, @commit.sha), class: 'btn btn-sm btn-danger' + + +- if @commit.yaml_errors.present? + .bs-callout.bs-callout-danger + %h4 Found errors in your .gitlab-ci.yml: + %ul + - @commit.yaml_errors.split(",").each do |error| + %li= error + +- unless @commit.push_data[:ci_yaml_file] + .bs-callout.bs-callout-warning + \.gitlab-ci.yml not found in this commit + +%h3 + Builds + - if @commit.duration > 0 + %small.pull-right + %i.fa.fa-time + #{time_interval_in_words @commit.duration} + +%table.table.builds + %thead + %tr + %th Status + %th Build ID + %th Stage + %th Name + %th Duration + %th Finished at + - if @project.coverage_enabled? + %th Coverage + %th + = render @commit.builds_without_retry_sorted, controls: true + +- if @commit.retried_builds.any? + %h3 + Retried builds + + %table.table.builds + %thead + %tr + %th Status + %th Build ID + %th Stage + %th Name + %th Duration + %th Finished at + - if @project.coverage_enabled? + %th Coverage + %th + = render @commit.retried_builds diff --git a/app/views/ci/errors/show.haml b/app/views/ci/errors/show.haml new file mode 100644 index 0000000000..2788112c83 --- /dev/null +++ b/app/views/ci/errors/show.haml @@ -0,0 +1,2 @@ +%h3.error Error += @error diff --git a/app/views/ci/events/index.html.haml b/app/views/ci/events/index.html.haml new file mode 100644 index 0000000000..779f49b3d3 --- /dev/null +++ b/app/views/ci/events/index.html.haml @@ -0,0 +1,19 @@ +%h3.page-title Events + +%table.table + %thead + %tr + %th User ID + %th Description + %th When + - @events.each do |event| + %tr + %td + = event.user_id + %td + = event.description + %td.light + = time_ago_in_words event.updated_at + ago + += paginate @events \ No newline at end of file diff --git a/app/views/ci/lints/_create.html.haml b/app/views/ci/lints/_create.html.haml new file mode 100644 index 0000000000..e2179e60f3 --- /dev/null +++ b/app/views/ci/lints/_create.html.haml @@ -0,0 +1,39 @@ +- if @status + %p + %b Status: + syntax is correct + %i.fa.fa-ok.correct-syntax + + %table.table.table-bordered + %thead + %tr + %th Parameter + %th Value + %tbody + - @stages.each do |stage| + - @builds.select { |build| build[:stage] == stage }.each do |build| + %tr + %td #{stage.capitalize} Job - #{build[:name]} + %td + %pre + = simple_format build[:script] + + %br + %b Tag list: + = build[:tags] + %br + %b Refs only: + = build[:only] && build[:only].join(", ") + %br + %b Refs except: + = build[:except] && build[:except].join(", ") + +-else + %p + %b Status: + syntax is incorrect + %i.fa.fa-remove.incorrect-syntax + %b Error: + = @error + + diff --git a/app/views/ci/lints/create.js.haml b/app/views/ci/lints/create.js.haml new file mode 100644 index 0000000000..a96c0b11b6 --- /dev/null +++ b/app/views/ci/lints/create.js.haml @@ -0,0 +1,2 @@ +:plain + $(".results").html("#{escape_javascript(render "create")}") \ No newline at end of file diff --git a/app/views/ci/lints/show.html.haml b/app/views/ci/lints/show.html.haml new file mode 100644 index 0000000000..a9b954771c --- /dev/null +++ b/app/views/ci/lints/show.html.haml @@ -0,0 +1,25 @@ +%h2 Check your .gitlab-ci.yml +%hr + += form_tag ci_lint_path, method: :post, remote: true do + .control-group + = label_tag :content, "Content of .gitlab-ci.yml", class: 'control-label' + .controls + = text_area_tag :content, nil, class: 'form-control span1', rows: 7, require: true + + .control-group.clearfix + .controls.pull-left.prepend-top-10 + = submit_tag "Validate", class: 'btn btn-success submit-yml' + + +%p.text-center.loading + %i.fa.fa-refresh.fa-spin + +.results.prepend-top-20 + +:coffeescript + $(".loading").hide() + $('form').bind 'ajax:beforeSend', -> + $(".loading").show() + $('form').bind 'ajax:complete', -> + $(".loading").hide() diff --git a/app/views/ci/notify/build_fail_email.html.haml b/app/views/ci/notify/build_fail_email.html.haml new file mode 100644 index 0000000000..d818e8b675 --- /dev/null +++ b/app/views/ci/notify/build_fail_email.html.haml @@ -0,0 +1,19 @@ +- content_for :header do + %h1{style: "background: #c40834; color: #FFF; font: normal 20px Helvetica, Arial, sans-serif; margin: 0; padding: 5px 10px; line-height: 32px; font-size: 16px;"} + GitLab CI (build failed) +%h3 + Project: + = link_to ci_project_url(@project) do + = @project.name + +%p + Commit link: #{gitlab_commit_link(@project, @build.commit.short_sha)} +%p + Author: #{@build.commit.git_author_name} +%p + Branch: #{@build.commit.ref} +%p + Message: #{@build.commit.git_commit_message} + +%p + Url: #{link_to @build.short_sha, ci_project_build_url(@project, @build)} diff --git a/app/views/ci/notify/build_fail_email.text.erb b/app/views/ci/notify/build_fail_email.text.erb new file mode 100644 index 0000000000..1add215a1c --- /dev/null +++ b/app/views/ci/notify/build_fail_email.text.erb @@ -0,0 +1,9 @@ +Build failed for <%= @project.name %> + +Status: <%= @build.status %> +Commit: <%= @build.commit.short_sha %> +Author: <%= @build.commit.git_author_name %> +Branch: <%= @build.commit.ref %> +Message: <%= @build.commit.git_commit_message %> + +Url: <%= ci_project_build_url(@build.project, @build) %> diff --git a/app/views/ci/notify/build_success_email.html.haml b/app/views/ci/notify/build_success_email.html.haml new file mode 100644 index 0000000000..a20dcaee24 --- /dev/null +++ b/app/views/ci/notify/build_success_email.html.haml @@ -0,0 +1,20 @@ +- content_for :header do + %h1{style: "background: #38CF5B; color: #FFF; font: normal 20px Helvetica, Arial, sans-serif; margin: 0; padding: 5px 10px; line-height: 32px; font-size: 16px;"} + GitLab CI (build successful) + +%h3 + Project: + = link_to ci_project_url(@project) do + = @project.name + +%p + Commit link: #{gitlab_commit_link(@project, @build.commit.short_sha)} +%p + Author: #{@build.commit.git_author_name} +%p + Branch: #{@build.commit.ref} +%p + Message: #{@build.commit.git_commit_message} + +%p + Url: #{link_to @build.short_sha, ci_project_build_url(@project, @build)} diff --git a/app/views/ci/notify/build_success_email.text.erb b/app/views/ci/notify/build_success_email.text.erb new file mode 100644 index 0000000000..7ebd17e727 --- /dev/null +++ b/app/views/ci/notify/build_success_email.text.erb @@ -0,0 +1,9 @@ +Build successful for <%= @project.name %> + +Status: <%= @build.status %> +Commit: <%= @build.commit.short_sha %> +Author: <%= @build.commit.git_author_name %> +Branch: <%= @build.commit.ref %> +Message: <%= @build.commit.git_commit_message %> + +Url: <%= ci_project_build_url(@build.project, @build) %> diff --git a/app/views/ci/projects/_form.html.haml b/app/views/ci/projects/_form.html.haml new file mode 100644 index 0000000000..e782fd8a0f --- /dev/null +++ b/app/views/ci/projects/_form.html.haml @@ -0,0 +1,100 @@ +.bs-callout.help-callout + %p + If you want to test your .gitlab-ci.yml, you can use special tool - #{link_to "Lint", ci_lint_path} + %p + Edit your + #{link_to ".gitlab-ci.yml using web-editor", yaml_web_editor_link(@project)} + += nested_form_for [:ci, @project], html: { class: 'form-horizontal' } do |f| + - if @project.errors.any? + #error_explanation + %p.lead= "#{pluralize(@project.errors.count, "error")} prohibited this project from being saved:" + .alert.alert-error + %ul + - @project.errors.full_messages.each do |msg| + %li= msg + + %fieldset + %legend Build settings + .form-group + = label_tag nil, class: 'control-label' do + Get code + .col-sm-10 + %p Get recent application code using the following command: + .radio + = label_tag do + = f.radio_button :allow_git_fetch, 'false' + %strong git clone + .light Slower but makes sure you have a clean dir before every build + .radio + = label_tag do + = f.radio_button :allow_git_fetch, 'true' + %strong git fetch + .light Faster + .form-group + = f.label :timeout_in_minutes, 'Timeout', class: 'control-label' + .col-sm-10 + = f.number_field :timeout_in_minutes, class: 'form-control', min: '0' + .light per build in minutes + + + %fieldset + %legend Build Schedule + .form-group + = f.label :always_build, 'Schedule build', class: 'control-label' + .col-sm-10 + .checkbox + = f.label :always_build do + = f.check_box :always_build + %span.light Repeat last build after X hours if no builds + .form-group + = f.label :polling_interval, "Build interval", class: 'control-label' + .col-sm-10 + = f.number_field :polling_interval, placeholder: '5', min: '0', class: 'form-control' + .light In hours + + %fieldset + %legend Project settings + .form-group + = f.label :default_ref, "Make tabs for the following branches", class: 'control-label' + .col-sm-10 + = f.text_field :default_ref, class: 'form-control', placeholder: 'master, stable' + .light You will be able to filter builds by the following branches + .form-group + = f.label :public, 'Public mode', class: 'control-label' + .col-sm-10 + .checkbox + = f.label :public do + = f.check_box :public + %span.light Anyone can see project and builds + .form-group + = f.label :coverage_regex, "Test coverage parsing", class: 'control-label' + .col-sm-10 + .input-group + %span.input-group-addon / + = f.text_field :coverage_regex, class: 'form-control', placeholder: '\(\d+.\d+\%\) covered' + %span.input-group-addon / + .light We will use this regular expression to find test coverage output in build trace. Leave blank if you want to disable this feature + .bs-callout.bs-callout-info + %p Below are examples of regex for existing tools: + %ul + %li + Simplecov (Ruby) - + %code \(\d+.\d+\%\) covered + %li + pytest-cov (Python) - + %code \d+\%$ + + + + %fieldset + %legend Advanced settings + .form-group + = f.label :token, "CI token", class: 'control-label' + .col-sm-10 + = f.text_field :token, class: 'form-control', placeholder: 'xEeFCaDAB89' + + .form-actions + = f.submit 'Save changes', class: 'btn btn-save' + - unless @project.new_record? + = link_to 'Remove Project', ci_project_path(@project), method: :delete, data: { confirm: 'Project will be removed. Are you sure?' }, class: 'btn btn-danger pull-right' diff --git a/app/views/ci/projects/_info.html.haml b/app/views/ci/projects/_info.html.haml new file mode 100644 index 0000000000..1888e1bde9 --- /dev/null +++ b/app/views/ci/projects/_info.html.haml @@ -0,0 +1,2 @@ +- if no_runners_for_project?(@project) + = render 'no_runners' diff --git a/app/views/ci/projects/_no_runners.html.haml b/app/views/ci/projects/_no_runners.html.haml new file mode 100644 index 0000000000..c0a296fb17 --- /dev/null +++ b/app/views/ci/projects/_no_runners.html.haml @@ -0,0 +1,8 @@ +.alert.alert-danger + %p + There are NO runners to build this project. + %br + You can add Specific runner for this project on Runners page + + - if current_user.is_admin + or add Shared runner for whole application in admin are. diff --git a/app/views/ci/projects/_project.html.haml b/app/views/ci/projects/_project.html.haml new file mode 100644 index 0000000000..844b6677b3 --- /dev/null +++ b/app/views/ci/projects/_project.html.haml @@ -0,0 +1,37 @@ +- if project.gitlab_ci_project + - ci_project = project.gitlab_ci_project + - last_commit = ci_project.last_commit + %tr + %td + = link_to [:ci, ci_project] do + = ci_project.name + %td + - if last_commit + = ci_status_with_icon(last_commit.status) + = commit_link(last_commit) + · + - if ci_project.last_commit_date + = time_ago_in_words ci_project.last_commit_date + ago + - else + No builds yet + %td + - if ci_project.public + %i.fa.fa-globe + Public + - else + %i.fa.fa-lock + Private + %td + = ci_project.commits.count +- else + %tr.light + %td + = project.name_with_namespace + %td + %small Not added to CI + %td + %td + = form_tag ci_projects_path do + = hidden_field_tag :project, project.to_json(methods: [:name_with_namespace, :path_with_namespace, :ssh_url_to_repo]) + = submit_tag 'Add project to CI', class: 'btn btn-default btn-sm' diff --git a/app/views/ci/projects/_public.html.haml b/app/views/ci/projects/_public.html.haml new file mode 100644 index 0000000000..bcbd60b83f --- /dev/null +++ b/app/views/ci/projects/_public.html.haml @@ -0,0 +1,16 @@ += content_for :title do + %h3.project-title + Public projects + +- if @projects.present? + .projects + %table.table + %tr + %th Name + %th Last commit + %th Access + %th Commits + = render @projects + = paginate @projects +- else + %h4 No public projects yet diff --git a/app/views/ci/projects/_search.html.haml b/app/views/ci/projects/_search.html.haml new file mode 100644 index 0000000000..4ab43a403f --- /dev/null +++ b/app/views/ci/projects/_search.html.haml @@ -0,0 +1,11 @@ +.search + = form_tag "#", method: :get, class: 'ci-search-form' do |f| + .input-group + = search_field_tag "search", params[:search], placeholder: "Search", class: "search-input form-control" + .input-group-addon + %i.fa.fa-search + +:coffeescript + $('.ci-search-form').submit -> + CiPager.init "#{ci_projects_path}" + "?search=" + query, #{Ci::ProjectsController::PROJECTS_BATCH}, false + false diff --git a/app/views/ci/projects/disabled.html.haml b/app/views/ci/projects/disabled.html.haml new file mode 100644 index 0000000000..83b0d8329e --- /dev/null +++ b/app/views/ci/projects/disabled.html.haml @@ -0,0 +1 @@ +Continuous Integration has been disabled for time of the migration. diff --git a/app/views/ci/projects/edit.html.haml b/app/views/ci/projects/edit.html.haml new file mode 100644 index 0000000000..876ae5182d --- /dev/null +++ b/app/views/ci/projects/edit.html.haml @@ -0,0 +1,21 @@ +- if @project.generated_yaml_config + %p.alert.alert-danger + CI Jobs are deprecated now, you can #{link_to "download", dumped_yaml_ci_project_path(@project)} + or + %a.preview-yml{:href => "#yaml-content", "data-toggle" => "modal"} preview + yaml file which is based on your old jobs. + Put this file to the root of your project and name it .gitlab-ci.yml + += render 'form' + +- if @project.generated_yaml_config + #yaml-content.modal.fade{"aria-hidden" => "true", "aria-labelledby" => ".gitlab-ci.yml", :role => "dialog", :tabindex => "-1"} + .modal-dialog + .modal-content + .modal-header + %button.close{"aria-hidden" => "true", "data-dismiss" => "modal", :type => "button"} × + %h4.modal-title Content of .gitlab-ci.yml + .modal-body + = text_area_tag :yaml, @project.generated_yaml_config, size: "70x25", class: "form-control" + .modal-footer + %button.btn.btn-default{"data-dismiss" => "modal", :type => "button"} Close diff --git a/app/views/ci/projects/index.html.haml b/app/views/ci/projects/index.html.haml new file mode 100644 index 0000000000..2b618d61f7 --- /dev/null +++ b/app/views/ci/projects/index.html.haml @@ -0,0 +1,30 @@ +- if current_user + - if @offset > 0 + = render @projects + - else + .gray-content-block.top-block + = render "search" + .projects + .gray-content-block.clearfix.light.second-block + .pull-left.fetch-status + - if params[:search].present? + by keyword: "#{params[:search]}", + #{@total_count} projects + + .wide-table-holder + %table.table.projects-table.content-list + %thead + %tr + %th Project Name + %th Last commit + %th Access + %th Commits + + = render @projects + %p.text-center.hide.loading + %i.fa.fa-refresh.fa-spin + :coffeescript + CiPager.init "#{ci_projects_path}", #{Ci::ProjectsController::PROJECTS_BATCH}, false + +- else + = render 'public' diff --git a/app/views/ci/projects/show.html.haml b/app/views/ci/projects/show.html.haml new file mode 100644 index 0000000000..6443378af9 --- /dev/null +++ b/app/views/ci/projects/show.html.haml @@ -0,0 +1,60 @@ += render 'ci/shared/guide' unless @project.setup_finished? + +- if current_user && can?(current_user, :manage_project, gl_project) && !@project.any_runners? + .alert.alert-danger + Builds for this project wont be served unless you configure runners on + = link_to "Runners page", ci_project_runners_path(@project) + +%ul.nav.nav-tabs.append-bottom-20 + %li{class: ref_tab_class} + = link_to 'All commits', ci_project_path(@project) + - @project.tracked_refs.each do |ref| + %li{class: ref_tab_class(ref)} + = link_to ref, ci_project_path(@project, ref: ref) + + - if @ref && !@project.tracked_refs.include?(@ref) + %li{class: 'active'} + = link_to @ref, ci_project_path(@project, ref: @ref) + + %li.pull-right + = link_to 'View on GitLab', @project.gitlab_url, no_turbolink.merge( class: 'btn btn-sm' ) + +- if @ref + %p + Paste build status image for #{@ref} with next link + = link_to '#', class: 'badge-codes-toggle btn btn-default btn-xs' do + Status Badge + .badge-codes-block.bs-callout.bs-callout-info.hide + %p + Status badge for + %span.label.label-info #{@ref} + branch + %div + %label Markdown: + = text_field_tag 'badge_md', markdown_badge_code(@project, @ref), readonly: true, class: 'form-control' + %label Html: + = text_field_tag 'badge_html', html_badge_code(@project, @ref), readonly: true, class: 'form-control' + + + + +%table.table.builds + %thead + %tr + %th Status + %th Commit + %th Message + %th Branch + %th Total duration + %th Finished at + - if @project.coverage_enabled? + %th Coverage + + = render @commits + += paginate @commits + +- if @commits.empty? + .bs-callout + %h4 No commits yet + diff --git a/app/views/ci/runners/_runner.html.haml b/app/views/ci/runners/_runner.html.haml new file mode 100644 index 0000000000..ef8622e280 --- /dev/null +++ b/app/views/ci/runners/_runner.html.haml @@ -0,0 +1,35 @@ +%li.runner{id: dom_id(runner)} + %h4 + = runner_status_icon(runner) + %span.monospace + - if @runners.include?(runner) + = link_to runner.short_sha, ci_project_runner_path(@project, runner) + %small + =link_to edit_ci_project_runner_path(@project, runner) do + %i.fa.fa-edit.btn + - else + = runner.short_sha + + .pull-right + - if @runners.include?(runner) + - if runner.belongs_to_one_project? + = link_to 'Remove runner', [:ci, @project, runner], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' + - else + - runner_project = @project.runner_projects.find_by(runner_id: runner) + = link_to 'Disable for this project', [:ci, @project, runner_project], data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' + - elsif runner.specific? + = form_for [:ci, @project, @project.runner_projects.new] do |f| + = f.hidden_field :runner_id, value: runner.id + = f.submit 'Enable for this project', class: 'btn btn-sm' + .pull-right + %small.light + \##{runner.id} + - if runner.description.present? + %p.runner-description + = runner.description + - if runner.tag_list.present? + %p + - runner.tag_list.each do |tag| + %span.label.label-primary + = tag + diff --git a/app/views/ci/runners/_shared_runners.html.haml b/app/views/ci/runners/_shared_runners.html.haml new file mode 100644 index 0000000000..944b3fd930 --- /dev/null +++ b/app/views/ci/runners/_shared_runners.html.haml @@ -0,0 +1,23 @@ +%h3 Shared runners + +.bs-callout.bs-callout-warning + GitLab Runners do not offer secure isolation between projects that they do builds for. You are TRUSTING all GitLab users who can push code to project A, B or C to run shell scripts on the machine hosting runner X. + %hr + - if @project.shared_runners_enabled + = link_to toggle_shared_runners_ci_project_path(@project), class: 'btn btn-warning', method: :post do + Disable shared runners + - else + = link_to toggle_shared_runners_ci_project_path(@project), class: 'btn btn-success', method: :post do + Enable shared runners +   for this project + +- if @shared_runners_count.zero? + This application has no shared runners yet. + Please use specific runners or ask administrator to create one +- else + %h4.underlined-title Available shared runners - #{@shared_runners_count} + %ul.bordered-list.available-shared-runners + = render @shared_runners.first(10) + - if @shared_runners_count > 10 + .light + and #{@shared_runners_count - 10} more... diff --git a/app/views/ci/runners/_specific_runners.html.haml b/app/views/ci/runners/_specific_runners.html.haml new file mode 100644 index 0000000000..0604e7a46c --- /dev/null +++ b/app/views/ci/runners/_specific_runners.html.haml @@ -0,0 +1,29 @@ +%h3 Specific runners + +.bs-callout.help-callout + %h4 How to setup a new project specific runner + + %ol + %li + Install GitLab Runner software. + Checkout the #{link_to 'GitLab Runner section', 'https://about.gitlab.com/gitlab-ci/#gitlab-runner', target: '_blank'} to install it + %li + Specify following URL during runner setup: + %code #{ci_root_url(only_path: false)} + %li + Use the following registration token during setup: + %code #{@project.token} + %li + Start runner! + + +- if @runners.any? + %h4.underlined-title Runners activated for this project + %ul.bordered-list.activated-specific-runners + = render @runners + +- if @specific_runners.any? + %h4.underlined-title Available specific runners + %ul.bordered-list.available-specific-runners + = render @specific_runners + = paginate @specific_runners diff --git a/app/views/ci/runners/edit.html.haml b/app/views/ci/runners/edit.html.haml new file mode 100644 index 0000000000..81c8e58ae2 --- /dev/null +++ b/app/views/ci/runners/edit.html.haml @@ -0,0 +1,27 @@ +%h4 Runner ##{@runner.id} +%hr += form_for [:ci, @project, @runner], html: { class: 'form-horizontal' } do |f| + .form-group + = label :active, "Active", class: 'control-label' + .col-sm-10 + .checkbox + = f.check_box :active + %span.light Paused runners don't accept new builds + .form-group + = label_tag :token, class: 'control-label' do + Token + .col-sm-10 + = f.text_field :token, class: 'form-control', readonly: true + .form-group + = label_tag :description, class: 'control-label' do + Description + .col-sm-10 + = f.text_field :description, class: 'form-control' + .form-group + = label_tag :tag_list, class: 'control-label' do + Tags + .col-sm-10 + = f.text_field :tag_list, class: 'form-control' + .help-block You can setup jobs to only use runners with specific tags + .form-actions + = f.submit 'Save', class: 'btn btn-save' diff --git a/app/views/ci/runners/index.html.haml b/app/views/ci/runners/index.html.haml new file mode 100644 index 0000000000..529fb9c296 --- /dev/null +++ b/app/views/ci/runners/index.html.haml @@ -0,0 +1,25 @@ +.light + %p + A 'runner' is a process which runs a build. + You can setup as many runners as you need. + %br + Runners can be placed on separate users, servers, and even on your local machine. + + %p Each runner can be in one of the following states: + %div + %ul + %li + %span.label.label-success active + \- runner is active and can process any new build + %li + %span.label.label-danger paused + \- runner is paused and will not receive any new build + +%hr + +%p.lead To start serving your builds you can either add specific runners to your project or use shared runners +.row + .col-sm-6 + = render 'specific_runners' + .col-sm-6 + = render 'shared_runners' diff --git a/app/views/ci/runners/show.html.haml b/app/views/ci/runners/show.html.haml new file mode 100644 index 0000000000..ffec495f85 --- /dev/null +++ b/app/views/ci/runners/show.html.haml @@ -0,0 +1,64 @@ += content_for :title do + %h3.project-title + Runner ##{@runner.id} + .pull-right + - if @runner.shared? + %span.runner-state.runner-state-shared + Shared + - else + %span.runner-state.runner-state-specific + Specific + +%table.table + %thead + %tr + %th Property Name + %th Value + %tr + %td + Tags + %td + - @runner.tag_list.each do |tag| + %span.label.label-primary + = tag + %tr + %td + Name + %td + = @runner.name + %tr + %td + Version + %td + = @runner.version + %tr + %td + Revision + %td + = @runner.revision + %tr + %td + Platform + %td + = @runner.platform + %tr + %td + Architecture + %td + = @runner.architecture + %tr + %td + Description + %td + = @runner.description + %tr + %td + Last contact + %td + - if @runner.contacted_at + #{time_ago_in_words(@runner.contacted_at)} ago + - else + Never + + + diff --git a/app/views/ci/services/_form.html.haml b/app/views/ci/services/_form.html.haml new file mode 100644 index 0000000000..9110aaa052 --- /dev/null +++ b/app/views/ci/services/_form.html.haml @@ -0,0 +1,57 @@ +%h3.page-title + = @service.title + = boolean_to_icon @service.activated? + +%p= @service.description + +.back-link + = link_to ci_project_services_path(@project) do + ← to services + +%hr + += form_for(@service, as: :service, url: ci_project_service_path(@project, @service.to_param), method: :put, html: { class: 'form-horizontal' }) do |f| + - if @service.errors.any? + .alert.alert-danger + %ul + - @service.errors.full_messages.each do |msg| + %li= msg + + - if @service.help.present? + .bs-callout + = @service.help + + .form-group + = f.label :active, "Active", class: "control-label" + .col-sm-10 + = f.check_box :active + + - @service.fields.each do |field| + - name = field[:name] + - label = field[:label] || name + - value = @service.send(name) + - type = field[:type] + - placeholder = field[:placeholder] + - choices = field[:choices] + - default_choice = field[:default_choice] + - help = field[:help] + + .form-group + = f.label label, class: "control-label" + .col-sm-10 + - if type == 'text' + = f.text_field name, class: "form-control", placeholder: placeholder + - elsif type == 'textarea' + = f.text_area name, rows: 5, class: "form-control", placeholder: placeholder + - elsif type == 'checkbox' + = f.check_box name + - elsif type == 'select' + = f.select name, options_for_select(choices, value ? value : default_choice), {}, { class: "form-control" } + - if help + .light #{help} + + .form-actions + = f.submit 'Save', class: 'btn btn-save' +   + - if @service.valid? && @service.activated? && @service.can_test? + = link_to 'Test settings', test_ci_project_service_path(@project, @service.to_param), class: 'btn' diff --git a/app/views/ci/services/edit.html.haml b/app/views/ci/services/edit.html.haml new file mode 100644 index 0000000000..bcc5832792 --- /dev/null +++ b/app/views/ci/services/edit.html.haml @@ -0,0 +1 @@ += render 'form' diff --git a/app/views/ci/services/index.html.haml b/app/views/ci/services/index.html.haml new file mode 100644 index 0000000000..37e5723b54 --- /dev/null +++ b/app/views/ci/services/index.html.haml @@ -0,0 +1,22 @@ +%h3.page-title Project services +%p.light Project services allow you to integrate GitLab CI with other applications + +%table.table + %thead + %tr + %th + %th Service + %th Desription + %th Last edit + - @services.sort_by(&:title).each do |service| + %tr + %td + = boolean_to_icon service.activated? + %td + = link_to edit_ci_project_service_path(@project, service.to_param) do + %strong= service.title + %td + = service.description + %td.light + = time_ago_in_words service.updated_at + ago diff --git a/app/views/ci/shared/_guide.html.haml b/app/views/ci/shared/_guide.html.haml new file mode 100644 index 0000000000..8a42f29b77 --- /dev/null +++ b/app/views/ci/shared/_guide.html.haml @@ -0,0 +1,15 @@ +.bs-callout.help-callout + %h4 How to setup CI for this project + + %ol + %li + Add at least one runner to the project. + Go to #{link_to 'Runners page', ci_project_runners_path(@project), target: :blank} for instructions. + %li + Put the .gitlab-ci.yml in the root of your repository. Examples can be found in #{link_to "Configuring project (.gitlab-ci.yml)", "http://doc.gitlab.com/ci/yaml/README.html", target: :blank}. + You can also test your .gitlab-ci.yml in the #{link_to "Lint", ci_lint_path} + %li + Visit #{link_to 'GitLab project settings', @project.gitlab_url + "/services/gitlab_ci/edit", target: :blank} + and press the "Test settings" button. + %li + Return to this page and refresh it, it should show a new build. diff --git a/app/views/ci/shared/_no_runners.html.haml b/app/views/ci/shared/_no_runners.html.haml new file mode 100644 index 0000000000..f56c37d9b3 --- /dev/null +++ b/app/views/ci/shared/_no_runners.html.haml @@ -0,0 +1,7 @@ +.alert.alert-danger + %p + Now you need Runners to process your builds. + %span + Checkout the #{link_to 'GitLab Runner section', 'https://about.gitlab.com/gitlab-ci/#gitlab-runner', target: '_blank'} to install it + + diff --git a/app/views/ci/triggers/_trigger.html.haml b/app/views/ci/triggers/_trigger.html.haml new file mode 100644 index 0000000000..addfbfcb0d --- /dev/null +++ b/app/views/ci/triggers/_trigger.html.haml @@ -0,0 +1,14 @@ +%tr + %td + .clearfix + %span.monospace= trigger.token + + %td + - if trigger.last_trigger_request + #{time_ago_in_words(trigger.last_trigger_request.created_at)} ago + - else + Never + + %td + .pull-right + = link_to 'Revoke', ci_project_trigger_path(@project, trigger), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-danger btn-sm btn-grouped" diff --git a/app/views/ci/triggers/index.html.haml b/app/views/ci/triggers/index.html.haml new file mode 100644 index 0000000000..44374a1a4d --- /dev/null +++ b/app/views/ci/triggers/index.html.haml @@ -0,0 +1,67 @@ +%h3.page-title + Triggers + +%p.light + Triggers can be used to force a rebuild of a specific branch or tag with an API call. + +%hr.clearfix + +-if @triggers.any? + %table.table + %thead + %th Token + %th Last used + %th + = render @triggers +- else + %h4 No triggers + += form_for [:ci, @project, @trigger], html: { class: 'form-horizontal' } do |f| + .clearfix + = f.submit "Add Trigger", class: 'btn btn-success pull-right' + +%hr.clearfix + +-if @triggers.any? + %h3 + Use CURL + + %p.light + Copy the token above and set your branch or tag name. This is the reference that will be rebuild. + + + %pre + :plain + curl -X POST \ + -F token=TOKEN \ + #{ci_build_trigger_url(@project.id, 'REF_NAME')} + %h3 + Use .gitlab-ci.yml + + %p.light + Copy the snippet to + %i .gitlab-ci.yml + of dependent project. + At the end of your build it will trigger this project to rebuilt. + + %pre + :plain + trigger: + type: deploy + script: + - "curl -X POST -F token=TOKEN #{ci_build_trigger_url(@project.id, 'REF_NAME')}" + %h3 + Pass build variables + + %p.light + Add + %strong variables[VARIABLE]=VALUE + to API request. + The value of variable could then be used to distinguish triggered build from normal one. + + %pre + :plain + curl -X POST \ + -F token=TOKEN \ + -F "variables[RUN_NIGHTLY_BUILD]=true" \ + #{ci_build_trigger_url(@project.id, 'REF_NAME')} diff --git a/app/views/ci/user_sessions/new.html.haml b/app/views/ci/user_sessions/new.html.haml new file mode 100644 index 0000000000..308b217ea7 --- /dev/null +++ b/app/views/ci/user_sessions/new.html.haml @@ -0,0 +1,8 @@ +.login-block + %h2 Login using GitLab account + %p.light + Make sure you have account on GitLab server + = link_to GitlabCi.config.gitlab_server.url, GitlabCi.config.gitlab_server.url, no_turbolink + %hr + = link_to "Login with GitLab", auth_ci_user_sessions_path(state: params[:state]), no_turbolink.merge( class: 'btn btn-login btn-success' ) + diff --git a/app/views/ci/variables/show.html.haml b/app/views/ci/variables/show.html.haml new file mode 100644 index 0000000000..ebf68341e0 --- /dev/null +++ b/app/views/ci/variables/show.html.haml @@ -0,0 +1,39 @@ +%h3.page-title + Secret Variables + +%p.light + These variables will be set to environment by the runner and will be hidden in the build log. + %br + So you can use them for passwords, secret keys or whatever you want. + +%hr + + += nested_form_for @project, url: url_for(controller: 'ci/variables', action: 'update'), html: { class: 'form-horizontal' } do |f| + - if @project.errors.any? + #error_explanation + %p.lead= "#{pluralize(@project.errors.count, "error")} prohibited this project from being saved:" + .alert.alert-error + %ul + - @project.errors.full_messages.each do |msg| + %li= msg + + = f.fields_for :variables do |variable_form| + .form-group + = variable_form.label :key, 'Key', class: 'control-label' + .col-sm-10 + = variable_form.text_field :key, class: 'form-control', placeholder: "PROJECT_VARIABLE" + + .form-group + = variable_form.label :value, 'Value', class: 'control-label' + .col-sm-10 + = variable_form.text_area :value, class: 'form-control', rows: 2, placeholder: "" + + = variable_form.link_to_remove "Remove this variable", class: 'btn btn-danger pull-right prepend-top-10' + %hr + %p + .clearfix + = f.link_to_add "Add a variable", :variables, class: 'btn btn-success pull-right' + + .form-actions + = f.submit 'Save changes', class: 'btn btn-save', return_to: request.original_url diff --git a/app/views/ci/web_hooks/index.html.haml b/app/views/ci/web_hooks/index.html.haml new file mode 100644 index 0000000000..78e8203b25 --- /dev/null +++ b/app/views/ci/web_hooks/index.html.haml @@ -0,0 +1,92 @@ +%h3.page-title + Web hooks + +%p.light + Web Hooks can be used for binding events when build completed. + +%hr.clearfix + += form_for [:ci, @project, @web_hook], html: { class: 'form-horizontal' } do |f| + -if @web_hook.errors.any? + .alert.alert-danger + - @web_hook.errors.full_messages.each do |msg| + %p= msg + .form-group + = f.label :url, "URL", class: 'control-label' + .col-sm-10 + = f.text_field :url, class: "form-control", placeholder: 'http://example.com/trigger-ci.json' + .form-actions + = f.submit "Add Web Hook", class: "btn btn-create" + +-if @web_hooks.any? + %h4 Activated web hooks (#{@web_hooks.count}) + %table.table + - @web_hooks.each do |hook| + %tr + %td + .clearfix + %span.monospace= hook.url + %td + .pull-right + - if @project.commits.any? + = link_to 'Test Hook', test_ci_project_web_hook_path(@project, hook), class: "btn btn-sm btn-grouped" + = link_to 'Remove', ci_project_web_hook_path(@project, hook), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove btn-sm btn-grouped" + +%h4 Web Hook data example + +:erb +
+    
+      {
+        "build_id": 2,
+        "build_name":"rspec_linux"
+        "build_status": "failed",
+        "build_started_at": "2014-05-05T18:01:02.563Z",
+        "build_finished_at": "2014-05-05T18:01:07.611Z",
+        "project_id": 1,
+        "project_name": "Brightbox \/ Brightbox Cli",
+        "gitlab_url": "http:\/\/localhost:3000\/brightbox\/brightbox-cli",
+        "ref": "master",
+        "sha": "a26cf5de9ed9827746d4970872376b10d9325f40",
+        "before_sha": "34f57f6ba3ed0c21c5e361bbb041c3591411176c",
+        "push_data": {
+          "before": "34f57f6ba3ed0c21c5e361bbb041c3591411176c",
+          "after": "a26cf5de9ed9827746d4970872376b10d9325f40",
+          "ref": "refs\/heads\/master",
+          "user_id": 1,
+          "user_name": "Administrator",
+          "project_id": 5,
+          "repository": {
+            "name": "Brightbox Cli",
+            "url": "dzaporozhets@localhost:brightbox\/brightbox-cli.git",
+            "description": "Voluptatibus quae error consectetur voluptas dolores vel excepturi possimus.",
+            "homepage": "http:\/\/localhost:3000\/brightbox\/brightbox-cli"
+          },
+          "commits": [
+            {
+              "id": "a26cf5de9ed9827746d4970872376b10d9325f40",
+              "message": "Release v1.2.2",
+              "timestamp": "2014-04-22T16:46:42+03:00",
+              "url": "http:\/\/localhost:3000\/brightbox\/brightbox-cli\/commit\/a26cf5de9ed9827746d4970872376b10d9325f40",
+              "author": {
+                "name": "Paul Thornthwaite",
+                "email": "tokengeek@gmail.com"
+              }
+            },
+            {
+              "id": "34f57f6ba3ed0c21c5e361bbb041c3591411176c",
+              "message": "Fix server user data update\n\nIncorrect condition was being used so Base64 encoding option was having\nopposite effect from desired.",
+              "timestamp": "2014-04-11T18:17:26+03:00",
+              "url": "http:\/\/localhost:3000\/brightbox\/brightbox-cli\/commit\/34f57f6ba3ed0c21c5e361bbb041c3591411176c",
+              "author": {
+                "name": "Paul Thornthwaite",
+                "email": "tokengeek@gmail.com"
+              }
+            }
+          ],
+          "total_commits_count": 2,
+          "ci_yaml_file":"rspec_linux:\r\n  script: ls\r\n"
+        }
+      }
+    
+  
diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml index 213b5d65b3..19d919f9b6 100644 --- a/app/views/dashboard/_activities.html.haml +++ b/app/views/dashboard/_activities.html.haml @@ -1,13 +1,13 @@ .hidden-xs = render "events/event_last_push", event: @last_push +.gray-content-block - if current_user %ul.nav.nav-pills.event_filter.pull-right %li.pull-right - = link_to dashboard_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do + = link_to dashboard_projects_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do %i.fa.fa-rss - = render 'shared/event_filter' - %hr + .content_list = spinner diff --git a/app/views/dashboard/_activity_head.html.haml b/app/views/dashboard/_activity_head.html.haml new file mode 100644 index 0000000000..9f4be025bf --- /dev/null +++ b/app/views/dashboard/_activity_head.html.haml @@ -0,0 +1,7 @@ +%ul.center-top-menu + %li{ class: ("active" unless params[:filter]) } + = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do + Your Projects + %li{ class: ("active" if params[:filter] == 'starred') } + = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do + Starred Projects diff --git a/app/views/dashboard/_groups_head.html.haml b/app/views/dashboard/_groups_head.html.haml new file mode 100644 index 0000000000..64bd356f54 --- /dev/null +++ b/app/views/dashboard/_groups_head.html.haml @@ -0,0 +1,7 @@ +%ul.center-top-menu + = nav_link(page: dashboard_groups_path) do + = link_to dashboard_groups_path, title: 'Your groups', data: {placement: 'right'} do + Your Groups + = nav_link(page: explore_groups_path) do + = link_to explore_groups_path, title: 'Explore groups', data: {placement: 'bottom'} do + Explore Groups diff --git a/app/views/dashboard/_projects_head.html.haml b/app/views/dashboard/_projects_head.html.haml new file mode 100644 index 0000000000..ed480b8caf --- /dev/null +++ b/app/views/dashboard/_projects_head.html.haml @@ -0,0 +1,10 @@ +%ul.center-top-menu + = nav_link(path: ['projects#index', 'root#index']) do + = link_to dashboard_projects_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do + Your Projects + = nav_link(page: starred_dashboard_projects_path) do + = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do + Starred Projects + = nav_link(page: [explore_root_path, trending_explore_projects_path, starred_explore_projects_path, explore_projects_path], html_options: { class: 'hidden-xs' }) do + = link_to explore_root_path, title: 'Explore', data: {placement: 'right'} do + Explore Projects diff --git a/app/views/dashboard/_snippets_head.html.haml b/app/views/dashboard/_snippets_head.html.haml new file mode 100644 index 0000000000..0ae62d6f1b --- /dev/null +++ b/app/views/dashboard/_snippets_head.html.haml @@ -0,0 +1,7 @@ +%ul.center-top-menu + = nav_link(page: dashboard_snippets_path, html_options: {class: 'home'}) do + = link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do + Your Snippets + = nav_link(page: explore_snippets_path) do + = link_to explore_snippets_path, title: 'Explore snippets', data: {placement: 'right'} do + Explore Snippets diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml new file mode 100644 index 0000000000..aa57df14c2 --- /dev/null +++ b/app/views/dashboard/activity.html.haml @@ -0,0 +1,11 @@ += content_for :meta_tags do + - if current_user + = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") + +- page_title "Activity" +- header_title "Activity", activity_dashboard_path + += render 'dashboard/activity_head' + +%section.activities + = render 'activities' diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml index 0a354373b9..c249f5cace 100644 --- a/app/views/dashboard/groups/index.html.haml +++ b/app/views/dashboard/groups/index.html.haml @@ -1,40 +1,19 @@ - page_title "Groups" -%h3.page-title - Group Membership +- header_title "Groups", dashboard_groups_path += render 'dashboard/groups_head' + +.gray-content-block - if current_user.can_create_group? %span.pull-right.hidden-xs = link_to new_group_path, class: "btn btn-new" do %i.fa.fa-plus New Group -%p.light + .title Welcome to the groups! Group members have access to all group projects. -%hr -.panel.panel-default - .panel-heading - %strong Groups - (#{@group_members.count}) - %ul.well-list - - @group_members.each do |group_member| - - group = group_member.group - %li - .pull-right.hidden-xs - - if can?(current_user, :admin_group, group) - = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do - %i.fa.fa-cogs - Settings - = link_to leave_group_group_members_path(group), data: { confirm: leave_group_message(group.name) }, method: :delete, class: "btn-sm btn btn-grouped", title: 'Leave this group' do - %i.fa.fa-sign-out - Leave - - = image_tag group_icon(group), class: "avatar s40 avatar-tile hidden-xs" - = link_to group, class: 'group-name' do - %strong= group.name - - as - %strong #{group_member.human_access} - - %div.light - #{pluralize(group.projects.count, "project")}, #{pluralize(group.users.count, "user")} +%ul.content-list + - @group_members.each do |group_member| + - group = group_member.group + = render 'shared/groups/group', group: group, group_member: group_member = paginate @group_members diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 94318d1bcf..cd602e897b 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -1,21 +1,17 @@ - page_title "Issues" +- header_title "Issues", issues_dashboard_path(assignee_id: current_user.id) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_dashboard_url(format: :atom, private_token: current_user.private_token), title: "#{current_user.name} issues") -%h3.page-title - Issues - -%p.light - List all issues from all projects you have access to. -%hr .append-bottom-20 .pull-right - if current_user - .hidden-xs.pull-left - = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: 'btn' do + .hidden-xs.pull-left.prepend-top-20 + = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: '' do %i.fa.fa-rss = render 'shared/issuable/filter', type: :issues + = render 'shared/issues' diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml index 90611d562b..d1f332fa0d 100644 --- a/app/views/dashboard/merge_requests.html.haml +++ b/app/views/dashboard/merge_requests.html.haml @@ -1,11 +1,6 @@ - page_title "Merge Requests" -%h3.page-title - Merge Requests +- header_title "Merge Requests", merge_requests_dashboard_path(assignee_id: current_user.id) - -%p.light - List all merge requests from all projects you have access to. -%hr .append-bottom-20 = render 'shared/issuable/filter', type: :merge_requests = render 'shared/merge_requests' diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml index d6f3e029a3..55080d6b3f 100644 --- a/app/views/dashboard/milestones/_milestone.html.haml +++ b/app/views/dashboard/milestones/_milestone.html.haml @@ -1,20 +1,22 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } - %h4 - = link_to_gfm truncate(milestone.title, length: 100), dashboard_milestone_path(milestone.safe_title, title: milestone.title) + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), dashboard_milestone_path(milestone.safe_title, title: milestone.title) + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' -   + · = link_to merge_requests_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete - .col-sm-6 = milestone_progress_bar(milestone) - %div - - milestone.milestones.each do |milestone| - = link_to milestone_path(milestone) do - %span.label.label-gray - = milestone.project.name_with_namespace + .row + .col-sm-6 + - milestone.milestones.each do |milestone| + = link_to milestone_path(milestone) do + %span.label.label-gray + = milestone.project.name_with_namespace diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml index 9a9a5e139a..21b25c3986 100644 --- a/app/views/dashboard/milestones/index.html.haml +++ b/app/views/dashboard/milestones/index.html.haml @@ -1,21 +1,19 @@ - page_title "Milestones" -%h3.page-title - Milestones - %span.pull-right #{@dashboard_milestones.count} milestones +- header_title "Milestones", dashboard_milestones_path -%p.light - List all milestones from all projects you have access to. - -%hr = render 'shared/milestones_filter' + +.gray-content-block + .oneline + List all milestones from all projects you have access to. + .milestones - .panel.panel-default - %ul.well-list - - if @dashboard_milestones.blank? - %li - .nothing-here-block No milestones to show - - else - - @dashboard_milestones.each do |milestone| - = render 'milestone', milestone: milestone + %ul.content-list + - if @dashboard_milestones.blank? + %li + .nothing-here-block No milestones to show + - else + - @dashboard_milestones.each do |milestone| + = render 'milestone', milestone: milestone = paginate @dashboard_milestones, theme: "gitlab" diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/projects/_projects.html.haml similarity index 71% rename from app/views/dashboard/_projects.html.haml rename to app/views/dashboard/projects/_projects.html.haml index d676576067..ef9b9ce756 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/projects/_projects.html.haml @@ -1,5 +1,5 @@ -.panel.panel-default - .panel-heading.clearfix +.projects-list-holder + .projects-search-form .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' - if current_user.can_create_project? @@ -7,4 +7,4 @@ = link_to new_project_path, class: 'btn btn-success' do New project - = render 'shared/projects_list', projects: @projects, projects_limit: 20 + = render 'shared/projects/list', projects: @projects diff --git a/app/views/dashboard/_zero_authorized_projects.html.haml b/app/views/dashboard/projects/_zero_authorized_projects.html.haml similarity index 100% rename from app/views/dashboard/_zero_authorized_projects.html.haml rename to app/views/dashboard/projects/_zero_authorized_projects.html.haml diff --git a/app/views/dashboard/show.atom.builder b/app/views/dashboard/projects/index.atom.builder similarity index 52% rename from app/views/dashboard/show.atom.builder rename to app/views/dashboard/projects/index.atom.builder index e9a612231d..d2c5148684 100644 --- a/app/views/dashboard/show.atom.builder +++ b/app/views/dashboard/projects/index.atom.builder @@ -1,9 +1,9 @@ xml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Activity" - xml.link href: dashboard_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" - xml.link href: dashboard_url, rel: "alternate", type: "text/html" - xml.id dashboard_url + xml.link href: dashboard_projects_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" + xml.link href: dashboard_projects_url, rel: "alternate", type: "text/html" + xml.id dashboard_projects_url xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? @events.each do |event| diff --git a/app/views/dashboard/projects/index.html.haml b/app/views/dashboard/projects/index.html.haml new file mode 100644 index 0000000000..7a16b811f6 --- /dev/null +++ b/app/views/dashboard/projects/index.html.haml @@ -0,0 +1,16 @@ += content_for :meta_tags do + - if current_user + = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") + +- page_title "Projects" +- header_title "Projects", root_path + += render 'dashboard/projects_head' + +- if @last_push + = render "events/event_last_push", event: @last_push + +- if @projects.any? + = render 'projects' +- else + = render "zero_authorized_projects" diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml index 8aaa0a7f07..339362701d 100644 --- a/app/views/dashboard/projects/starred.html.haml +++ b/app/views/dashboard/projects/starred.html.haml @@ -1,23 +1,10 @@ - page_title "Starred Projects" +- header_title "Projects", projects_path + += render 'dashboard/projects_head' + - if @projects.any? - = render 'shared/show_aside' - - .dashboard.row - %section.activities.col-md-8 - = render 'dashboard/activities' - %aside.col-md-4 - .panel.panel-default - .panel-heading.clearfix - .input-group - = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' - - if current_user.can_create_project? - %span.input-group-btn - = link_to new_project_path, class: 'btn btn-success' do - New project - - = render 'shared/projects_list', projects: @projects, - projects_limit: 20, stars: true, avatar: false - + = render 'projects' - else %h3 You don't have starred projects yet %p.slead Visit project page and press on star icon and it will appear on this page. diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml deleted file mode 100644 index 5001c2101e..0000000000 --- a/app/views/dashboard/show.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -= content_for :meta_tags do - - if current_user - = auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity") - -- if @projects.any? - = render 'shared/show_aside' - - .dashboard.row - %section.activities.col-md-8 - = render 'activities' - %aside.col-md-4 - = render 'sidebar' - -- else - = render "zero_authorized_projects" diff --git a/app/views/dashboard/snippets/index.html.haml b/app/views/dashboard/snippets/index.html.haml new file mode 100644 index 0000000000..d3908062f4 --- /dev/null +++ b/app/views/dashboard/snippets/index.html.haml @@ -0,0 +1,38 @@ +- page_title "Snippets" +- header_title "Snippets", dashboard_snippets_path + += render 'dashboard/snippets_head' + +.gray-content-block + .pull-right + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do + Add new snippet + + .oneline + Share code pastes with others out of git repository + +%ul.nav.nav-tabs.prepend-top-20 + = nav_tab :scope, nil do + = link_to dashboard_snippets_path do + All + %span.badge + = current_user.snippets.count + = nav_tab :scope, 'are_private' do + = link_to dashboard_snippets_path(scope: 'are_private') do + Private + %span.badge + = current_user.snippets.are_private.count + = nav_tab :scope, 'are_internal' do + = link_to dashboard_snippets_path(scope: 'are_internal') do + Internal + %span.badge + = current_user.snippets.are_internal.count + = nav_tab :scope, 'are_public' do + = link_to dashboard_snippets_path(scope: 'are_public') do + Public + %span.badge + = current_user.snippets.are_public.count + +.my-snippets + = render 'snippets/snippets' + diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml new file mode 100644 index 0000000000..4974bb7f7f --- /dev/null +++ b/app/views/devise/sessions/_new_crowd.html.haml @@ -0,0 +1,9 @@ += form_tag(user_omniauth_authorize_path("crowd"), id: 'new_crowd_user' ) do + = text_field_tag :username, nil, {class: "form-control top", placeholder: "Username", autofocus: "autofocus"} + = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} + - if devise_mapping.rememberable? + .remember-me.checkbox + %label{for: "remember_me"} + = check_box_tag :remember_me, '1', false, id: 'remember_me' + %span Remember me + = button_tag "Sign in", class: "btn-save btn" \ No newline at end of file diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index bb5e479697..41ad2c231d 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -8,15 +8,21 @@ .login-body - if form_based_providers.any? %ul.nav.nav-tabs + - if crowd_enabled? + %li.active + = link_to "Crowd", "#tab-crowd", 'data-toggle' => 'tab' - @ldap_servers.each_with_index do |server, i| - %li{class: (:active if i.zero?)} + %li{class: (:active if i.zero? && !crowd_enabled?)} = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' - if signin_enabled? %li = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' .tab-content + - if crowd_enabled? + %div.tab-pane.active{id: "tab-crowd"} + = render 'devise/sessions/new_crowd' - @ldap_servers.each_with_index do |server, i| - %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} + %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero? && !crowd_enabled?)} = render 'devise/sessions/new_ldap', server: server - if signin_enabled? %div#tab-signin.tab-pane diff --git a/app/views/email_rejection_mailer/rejection.html.haml b/app/views/email_rejection_mailer/rejection.html.haml new file mode 100644 index 0000000000..7f7d841fe2 --- /dev/null +++ b/app/views/email_rejection_mailer/rejection.html.haml @@ -0,0 +1,4 @@ +%p + Unfortunately, your email message to GitLab could not be processed. + += markdown @reason diff --git a/app/views/email_rejection_mailer/rejection.text.haml b/app/views/email_rejection_mailer/rejection.text.haml new file mode 100644 index 0000000000..6693e6f90e --- /dev/null +++ b/app/views/email_rejection_mailer/rejection.text.haml @@ -0,0 +1,4 @@ +Unfortunately, your email message to GitLab could not be processed. + + += @reason diff --git a/app/views/events/_commit.html.haml b/app/views/events/_commit.html.haml index 742b74a67c..ad63841ccf 100644 --- a/app/views/events/_commit.html.haml +++ b/app/views/events/_commit.html.haml @@ -1,5 +1,5 @@ %li.commit .commit-row-title = link_to truncate_sha(commit[:id]), namespace_project_commit_path(project.namespace, project, commit[:id]), class: "commit_short_id", alt: '' -   + · = gfm event_commit_title(commit[:message]), project: project diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 0faab4458e..9aacc79d68 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -3,8 +3,8 @@ .event-item-timestamp #{time_ago_with_tooltip(event.created_at)} - = cache [event, "v1"] do - = image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:'' + = cache [event, "v2.1"] do + = image_tag avatar_icon(event.author_email, 46), class: "avatar s46", alt:'' - if event.created_project? = render "events/event/created_project", event: event - elsif event.push? diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 501412642d..ffc37ad617 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -1,14 +1,14 @@ - if show_last_push_widget?(event) - .event-last-push - .event-last-push-text - %span You pushed to - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - %span at - %strong= link_to_project event.project - #{time_ago_with_tooltip(event.created_at)} + .gray-content-block.clear-block + .event-last-push + .event-last-push-text + %span You pushed to + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do + %strong= event.ref_name + %span at + %strong= link_to_project event.project + #{time_ago_with_tooltip(event.created_at)} - .pull-right - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-create btn-sm" do - Create Merge Request - %hr + .pull-right + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do + Create Merge Request diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml index a39e62e9da..4ecf1c33d2 100644 --- a/app/views/events/event/_common.html.haml +++ b/app/views/events/event/_common.html.haml @@ -5,13 +5,14 @@ - if event.target %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] - at + + = event_preposition(event) - if event.project = link_to_project event.project - else = event.project_name - + - if event.target.respond_to?(:title) .event-body .event-note diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index 07bec1697f..830fec0b4a 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -4,7 +4,7 @@ = event.action_name = event_note_title_html(event) at - + - if event.project = link_to_project event.project - else @@ -13,7 +13,6 @@ .event-body .event-note .md - %i.fa.fa-comment-o.event-note-icon = event_note(event.target.note, project: event.project) - note = event.target - if note.attachment.url diff --git a/app/views/explore/_head.html.haml b/app/views/explore/_head.html.haml new file mode 100644 index 0000000000..d8a5756078 --- /dev/null +++ b/app/views/explore/_head.html.haml @@ -0,0 +1,6 @@ +.explore-title + %h3 + Explore GitLab + %p.lead + Discover projects, groups and snippets. Share your projects with others + %br diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index f3f0b77853..83d4d321c8 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,12 +1,19 @@ -- page_title "Groups" -.clearfix +- page_title "Groups" +- header_title "Groups", dashboard_groups_path + +- if current_user + = render 'dashboard/groups_head' +- else + = render 'explore/head' + +.gray-content-block.clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| = hidden_field_tag :sort, @sort .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input", id: "groups_search" .form-group - = button_tag 'Search', class: "btn btn-primary wide" + = button_tag 'Search', class: "btn btn-default" .pull-right .dropdown.inline @@ -28,22 +35,9 @@ = link_to explore_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated -%hr - -%ul.bordered-list +%ul.content-list - @groups.each do |group| - %li - .clearfix - %h4 - = link_to group_path(id: group.path) do - %i.fa.fa-users - = group.name - .clearfix - %p - = truncate group.description, length: 150 - .clearfix - %p.light - #{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')} + = render 'shared/groups/group', group: group - unless @groups.present? .nothing-here-block No public groups diff --git a/app/views/explore/projects/_dropdown.html.haml b/app/views/explore/projects/_dropdown.html.haml new file mode 100644 index 0000000000..b23a3c1e5c --- /dev/null +++ b/app/views/explore/projects/_dropdown.html.haml @@ -0,0 +1,27 @@ +.dropdown.inline + %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} + %span.light sort: + - if @sort.present? + = sort_options_hash[@sort] + - elsif current_page?(trending_explore_projects_path) || current_page?(explore_root_path) + Trending projects + - elsif current_page?(starred_explore_projects_path) + Most stars + - else + = sort_title_recently_created + %b.caret + %ul.dropdown-menu + %li + = link_to trending_explore_projects_path do + Trending projects + = link_to starred_explore_projects_path do + Most stars + = link_to explore_projects_filter_path(sort: sort_value_recently_created) do + = sort_title_recently_created + = link_to explore_projects_filter_path(sort: sort_value_oldest_created) do + = sort_title_oldest_created + = link_to explore_projects_filter_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to explore_projects_filter_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated + diff --git a/app/views/explore/projects/_filter.html.haml b/app/views/explore/projects/_filter.html.haml index 82622a58ed..5a3d689d1e 100644 --- a/app/views/explore/projects/_filter.html.haml +++ b/app/views/explore/projects/_filter.html.haml @@ -3,7 +3,7 @@ .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input", id: "projects_search" .form-group - = button_tag 'Search', class: "btn btn-primary wide" + = button_tag 'Search', class: "btn btn-success" .pull-right.hidden-sm.hidden-xs - if current_user @@ -46,22 +46,4 @@ = link_to explore_projects_filter_path(tag: tag.name) do %i.fa.fa-tag = tag.name - - .dropdown.inline - %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} - %span.light sort: - - if @sort.present? - = sort_options_hash[@sort] - - else - = sort_title_recently_created - %b.caret - %ul.dropdown-menu - %li - = link_to explore_projects_filter_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to explore_projects_filter_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to explore_projects_filter_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to explore_projects_filter_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated + = render 'explore/projects/dropdown' diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml deleted file mode 100644 index 1e8a89e366..0000000000 --- a/app/views/explore/projects/_project.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -%li - %h4.project-title - .project-access-icon - = visibility_level_icon(project.visibility_level) - = link_to project.name_with_namespace, [project.namespace.becomes(Namespace), project] - %span.pull-right - %i.fa.fa-star - = project.star_count - - .project-info - - if project.description.present? - .project-description.str-truncated - = markdown(project.description, pipeline: :description) - - .repo-info - - unless project.empty_repo? - = link_to pluralize(round_commit_count(project), 'commit'), namespace_project_commits_path(project.namespace, project, project.default_branch) - · - = link_to pluralize(project.repository.branch_names.count, 'branch'), namespace_project_branches_path(project.namespace, project) - · - = link_to pluralize(project.repository.tag_names.count, 'tag'), namespace_project_tags_path(project.namespace, project) - - else - %i.fa.fa-exclamation-triangle - Empty repository diff --git a/app/views/explore/projects/_projects.html.haml b/app/views/explore/projects/_projects.html.haml new file mode 100644 index 0000000000..669079e952 --- /dev/null +++ b/app/views/explore/projects/_projects.html.haml @@ -0,0 +1,6 @@ +- if projects.any? + .public-projects + = render 'shared/projects/list', projects: projects +- else + .nothing-here-block + No such projects diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index ba2276f51c..67e38ca312 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -1,12 +1,12 @@ -- page_title "Projects" -.clearfix +- page_title "Projects" +- header_title "Projects", root_path + +- if current_user + = render 'dashboard/projects_head' +- else + = render 'explore/head' + +.gray-content-block.clearfix = render 'filter' - -%hr -.public-projects - %ul.bordered-list.top-list - = render @projects - - unless @projects.present? - .nothing-here-block No public projects - - = paginate @projects, theme: "gitlab" += render 'projects', projects: @projects += paginate @projects, theme: "gitlab" diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml index b5d146b1f2..596cb0a96c 100644 --- a/app/views/explore/projects/starred.html.haml +++ b/app/views/explore/projects/starred.html.haml @@ -1,11 +1,17 @@ -- page_title "Starred Projects" -.explore-trending-block - %p.lead - %i.fa.fa-star - See most starred projects - %hr - .public-projects - %ul.bordered-list - = render @starred_projects +- page_title "Projects" +- header_title "Projects", root_path +- if current_user + = render 'dashboard/projects_head' +- else + = render 'explore/head' + +.explore-trending-block + .gray-content-block + .pull-right + = render 'explore/projects/dropdown' + .oneline + %i.fa.fa-star + See most starred projects + = render 'projects', projects: @starred_projects = paginate @starred_projects, theme: 'gitlab' diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml index 5e24df76a6..5ea6d81c5b 100644 --- a/app/views/explore/projects/trending.html.haml +++ b/app/views/explore/projects/trending.html.haml @@ -1,15 +1,16 @@ -- page_title "Trending Projects" -.explore-title - %h3 - Explore GitLab - %p.lead - Discover projects and groups. Share your projects with others -%hr +- page_title "Projects" +- header_title "Projects", root_path + +- if current_user + = render 'dashboard/projects_head' +- else + = render 'explore/head' + .explore-trending-block - %p.lead - %i.fa.fa-comments-o - See most discussed projects for last month - %hr - .public-projects - %ul.bordered-list - = render @trending_projects + .gray-content-block + .pull-right + = render 'explore/projects/dropdown' + .oneline + %i.fa.fa-comments-o + See most discussed projects for last month + = render 'projects', projects: @trending_projects diff --git a/app/views/explore/snippets/index.html.haml b/app/views/explore/snippets/index.html.haml new file mode 100644 index 0000000000..7e4fa7d487 --- /dev/null +++ b/app/views/explore/snippets/index.html.haml @@ -0,0 +1,18 @@ +- page_title "Snippets" +- header_title "Snippets", snippets_path + +- if current_user + = render 'dashboard/snippets_head' +- else + = render 'explore/head' + +.gray-content-block + - if current_user + .pull-right + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do + Add new snippet + + .oneline + Public snippets created by you and other users are listed here + += render 'snippets/snippets' diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 4f8aec1c67..9ac56b1e5f 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -1,4 +1,4 @@ -.panel.panel-default +.panel.panel-default.projects-list-holder .panel-heading.clearfix .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' @@ -7,4 +7,4 @@ = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-success' do New project - = render 'shared/projects_list', projects: @projects, projects_limit: 20 + = render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index 2ff4b7e23e..ae8fc9f85f 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -1,3 +1,6 @@ +- header_title group_title(@group, "Settings", edit_group_path(@group)) +- @blank_container = true + .panel.panel-default .panel-heading %strong= @group.name diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index dba395cc8f..3a6d07ebdd 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -1,15 +1,13 @@ - page_title "Members" +- header_title group_title(@group, "Members", group_group_members_path(@group)) - show_roles = should_user_see_group_roles?(current_user, @group) -%h3.page-title - Group members - if show_roles %p.light Members of group have access to all group projects. Read more about permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" -%hr .clearfix.js-toggle-container = form_tag group_group_members_path(@group), method: :get, class: 'form-inline member-search-form' do diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml index f0d9078255..08d97e418a 100644 --- a/app/views/groups/issues.html.haml +++ b/app/views/groups/issues.html.haml @@ -1,25 +1,24 @@ - page_title "Issues" +- header_title group_title(@group, "Issues", issues_group_path(@group)) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} issues") -%h3.page-title - Issues -%p.light - Only issues from - %strong #{@group.name} - group are listed here. - - if current_user - To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. -%hr -.append-bottom-20 += render 'shared/issuable/filter', type: :issues +.gray-content-block.second-block .pull-right - if current_user .hidden-xs.pull-left - = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token), class: 'btn' do + = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token) do %i.fa.fa-rss + %div + Only issues from + %strong #{@group.name} + group are listed here. + - if current_user + To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. - = render 'shared/issuable/filter', type: :issues -= render 'shared/issues' +.prepend-top-default + = render 'shared/issues' diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index ca85a15870..425ad8331b 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -1,14 +1,13 @@ - page_title "Merge Requests" -%h3.page-title - Merge Requests +- header_title group_title(@group, "Merge Requests", merge_requests_group_path(@group)) -%p.light - Only merge requests from - %strong #{@group.name} - group are listed here. - - if current_user - To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. -%hr -.append-bottom-20 - = render 'shared/issuable/filter', type: :merge_requests -= render 'shared/merge_requests' += render 'shared/issuable/filter', type: :merge_requests +.gray-content-block.second-block + %div + Only merge requests from + %strong #{@group.name} + group are listed here. + - if current_user + To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. +.prepend-top-default + = render 'shared/merge_requests' diff --git a/app/views/groups/milestones/_header_title.html.haml b/app/views/groups/milestones/_header_title.html.haml new file mode 100644 index 0000000000..d7fabf5358 --- /dev/null +++ b/app/views/groups/milestones/_header_title.html.haml @@ -0,0 +1 @@ +- header_title group_title(@group, "Milestones", group_milestones_path(@group)) diff --git a/app/views/groups/milestones/_milestone.html.haml b/app/views/groups/milestones/_milestone.html.haml index ba30e6e07c..41dffdd2fb 100644 --- a/app/views/groups/milestones/_milestone.html.haml +++ b/app/views/groups/milestones/_milestone.html.haml @@ -1,25 +1,29 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } - .pull-right - - if can?(current_user, :admin_group, @group) - - if milestone.closed? - = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" - - else - = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-sm btn-close" - %h4 - = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' -   + · = link_to merge_requests_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete .col-sm-6 = milestone_progress_bar(milestone) - %div - - milestone.milestones.each do |milestone| - = link_to milestone_path(milestone) do - %span.label.label-gray - = milestone.project.name + .row + .col-sm-6 + %div + - milestone.milestones.each do |milestone| + = link_to milestone_path(milestone) do + %span.label.label-gray + = milestone.project.name + .col-sm-6 + - if can?(current_user, :admin_group, @group) + - if milestone.closed? + = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-xs btn-grouped btn-reopen" + - else + = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-xs btn-close" diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml index 385222fa5b..2bbcad5fdf 100644 --- a/app/views/groups/milestones/index.html.haml +++ b/app/views/groups/milestones/index.html.haml @@ -1,23 +1,17 @@ - page_title "Milestones" -%h3.page-title - Milestones - %span.pull-right #{@group_milestones.count} milestones +- header_title group_title(@group, "Milestones", group_milestones_path(@group)) -%p.light += render 'shared/milestones_filter' +.gray-content-block Only milestones from %strong #{@group.name} group are listed here. - -%hr - -= render 'shared/milestones_filter' .milestones - .panel.panel-default - %ul.well-list - - if @group_milestones.blank? - %li - .nothing-here-block No milestones to show - - else - - @group_milestones.each do |milestone| - = render 'milestone', milestone: milestone + %ul.content-list + - if @group_milestones.blank? + %li + .nothing-here-block No milestones to show + - else + - @group_milestones.each do |milestone| + = render 'milestone', milestone: milestone = paginate @group_milestones, theme: "gitlab" diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml index 8f2decb851..0c213f4218 100644 --- a/app/views/groups/milestones/show.html.haml +++ b/app/views/groups/milestones/show.html.haml @@ -1,4 +1,6 @@ - page_title @group_milestone.title, "Milestones" += render "header_title" + %h4.page-title .issue-box{ class: "issue-box-#{@group_milestone.closed? ? 'closed' : 'open'}" } - if @group_milestone.closed? diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index 6b7efa83de..f1d507a50c 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -1,4 +1,6 @@ - page_title "Projects" +- header_title group_title(@group, "Projects", projects_group_path(@group)) + .panel.panel-default .panel-heading %strong= @group.name @@ -12,11 +14,14 @@ - @projects.each do |project| %li .list-item-name - = visibility_level_icon(project.visibility_level) + %span{ class: visibility_level_color(project.visibility_level) } + = visibility_level_icon(project.visibility_level) %strong= link_to project.name_with_namespace, project + .pull-right + - if project.archived + %span.label.label-warning archived %span.label.label-gray = repository_size(project) - .pull-right = link_to 'Members', namespace_project_project_members_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" = link_to 'Edit', edit_namespace_project_path(project.namespace, project), id: "edit_#{dom_id(project)}", class: "btn btn-sm" = link_to 'Remove', project, data: { confirm: remove_project_message(project)}, method: :delete, class: "btn btn-sm btn-remove" diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index d31dae7d64..a9ba9d2ba1 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,3 +1,6 @@ +- unless can?(current_user, :read_group, @group) + - @disable_search_panel = true + = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} activity") @@ -16,22 +19,25 @@ = render 'shared/show_aside' - .row - %section.activities.col-md-8 - .hidden-xs - - if current_user - = render "events/event_last_push", event: @last_push - + - if can?(current_user, :read_group, @group) + .row + %section.activities.col-md-7 + .hidden-xs - if current_user + = render "events/event_last_push", event: @last_push + %ul.nav.nav-pills.event_filter.pull-right %li = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do %i.fa.fa-rss - = render 'shared/event_filter' - %hr + = render 'shared/event_filter' + %hr - .content_list - = spinner - %aside.side.col-md-4 - = render "projects", projects: @projects + .content_list + = spinner + %aside.side.col-md-5 + = render "projects", projects: @projects + - else + %p + This group does not have public projects diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml index bf4b7234b2..57bc91ea5a 100644 --- a/app/views/help/index.html.haml +++ b/app/views/help/index.html.haml @@ -1,14 +1,15 @@ %div %h1 GitLab - %span= Gitlab::VERSION - %small= Gitlab::REVISION - - if current_application_settings.version_check_enabled + Community Edition + - if user_signed_in? + %span= Gitlab::VERSION + %small= Gitlab::REVISION = version_status_badge %p.slead GitLab is open source software to collaborate on code. %br - Manage git repositories with fine grained access controls that keep your code secure. + Manage git repositories with fine-grained access controls that keep your code secure. %br Perform code reviews and enhance collaboration with merge requests. %br @@ -17,6 +18,9 @@ Used by more than 100,000 organizations, GitLab is the most popular solution to manage git repositories on-premises. %br Read more about GitLab at #{link_to promo_host, promo_url, target: '_blank'}. + - if current_application_settings.help_page_text.present? + %hr + = markdown(current_application_settings.help_page_text) %hr @@ -24,29 +28,14 @@ .col-md-8 .documentation-index = preserve do - - readme_text = File.read(Rails.root.join("doc", "README.md")) - - text = readme_text.dup - - readme_text.scan(/\]\(([^(]+)\)/) { |match| text.gsub!(match.first, "help/#{match.first}") } - = markdown text - + = markdown(@help_index) .col-md-4 .panel.panel-default .panel-heading Quick help %ul.well-list - %li - See our website for - = link_to 'getting help', promo_url + '/getting-help/' - %li - Use the - = link_to 'search bar', '#', onclick: 'Shortcuts.focusSearch(event)' - on the top of this page - %li - Use - = link_to 'shortcuts', '#', onclick: 'Shortcuts.showHelp(event)' - %li - Get a support - = link_to 'subscription', 'https://about.gitlab.com/pricing/' - %li - = link_to 'Compare', 'https://about.gitlab.com/features/#compare' - GitLab editions + %li= link_to 'See our website for getting help', promo_url + '/getting-help/' + %li= link_to 'Use the search bar on the top of this page', '#', onclick: 'Shortcuts.focusSearch(event)' + %li= link_to 'Use shortcuts', '#', onclick: 'Shortcuts.showHelp(event)' + %li= link_to 'Get a support subscription', 'https://about.gitlab.com/pricing/' + %li= link_to 'Compare GitLab editions', 'https://about.gitlab.com/features/#compare' diff --git a/app/views/help/show.html.haml b/app/views/help/show.html.haml index 8551496b98..0398afb4c1 100644 --- a/app/views/help/show.html.haml +++ b/app/views/help/show.html.haml @@ -1,3 +1,3 @@ - page_title @file.humanize, *@category.split("/").reverse.map(&:humanize) .documentation.wiki - = markdown @markdown.gsub('$your_email', current_user.email) + = markdown @markdown.gsub('$your_email', current_user.try(:email) || "email@example.com") diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml new file mode 100644 index 0000000000..e1bb88ca4e --- /dev/null +++ b/app/views/import/fogbugz/new.html.haml @@ -0,0 +1,25 @@ +- page_title "FogBugz Import" +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz +%hr + += form_tag callback_import_fogbugz_path, class: 'form-horizontal' do + %p + To get started you enter your FogBugz URL and login information below. + In the next steps, you'll be able to map users and select the projects + you want to import. + .form-group + = label_tag :uri, 'FogBugz URL', class: 'control-label' + .col-sm-4 + = text_field_tag :uri, nil, placeholder: 'https://mycompany.fogbugz.com', class: 'form-control' + .form-group + = label_tag :email, 'FogBugz Email', class: 'control-label' + .col-sm-4 + = text_field_tag :email, nil, class: 'form-control' + .form-group + = label_tag :password, 'FogBugz Password', class: 'control-label' + .col-sm-4 + = password_field_tag :password, nil, class: 'form-control' + .form-actions + = submit_tag 'Continue to the next step', class: 'btn btn-create' diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml new file mode 100644 index 0000000000..25cebfb366 --- /dev/null +++ b/app/views/import/fogbugz/new_user_map.html.haml @@ -0,0 +1,49 @@ +- page_title 'User map', 'FogBugz import' +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz +%hr + += form_tag create_user_map_import_fogbugz_path, class: 'form-horizontal' do + %p + Customize how FogBugz email addresses and usernames are imported into GitLab. + In the next step, you'll be able to select the projects you want to import. + %p + The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames wil be imported into GitLab. You can change this by populating the table below. + %ul + %li + %strong Default: Map a FogBugz account ID to a full name + %p + An empty GitLab User field will add the FogBugz user's full name + (e.g. "By John Smith") in the description of all issues and comments. + It will also associate and/or assign these issues and comments with + the project creator. + %li + %strong Map a FogBugz account ID to a GitLab user + %p + Selecting a GitLab user will add a link to the GitLab user in the descriptions + of issues and comments (e.g. "By @johnsmith"). It will also + associate and/or assign these issues and comments with the selected user. + + %table.table + %thead + %tr + %th ID + %th Name + %th Email + %th GitLab User + %tbody + - @user_map.each do |id, user| + %tr + %td= id + %td= text_field_tag "users[#{id}][name]", user[:name], class: 'form-control' + %td= text_field_tag "users[#{id}][email]", user[:email], class: 'form-control' + %td + = users_select_tag("users[#{id}][gitlab_user]", class: 'custom-form-control', + scope: :all, email_user: true, selected: user[:gitlab_user]) + + .form-actions + = submit_tag 'Continue to the next step', class: 'btn btn-create' + +:coffeescript + new UsersSelect() diff --git a/app/views/import/fogbugz/status.html.haml b/app/views/import/fogbugz/status.html.haml new file mode 100644 index 0000000000..f179ece402 --- /dev/null +++ b/app/views/import/fogbugz/status.html.haml @@ -0,0 +1,51 @@ +- page_title "FogBugz import" +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz + +- if @repos.any? + %p.light + Select projects you want to import. + %p.light + Optionally, you can + = link_to 'customize', new_user_map_import_fogbugz_path + how FogBugz email addresses and usernames are imported into GitLab. + %hr + %p + = button_tag 'Import all projects', class: 'btn btn-success js-import-all' + +%table.table.import-jobs + %thead + %tr + %th From FogBugz + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td + = project.import_source + %td + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] + %td.job-status + - if project.import_status == 'finished' + %span + %i.fa.fa-check + done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td + = repo.name + %td.import-target + = "#{current_user.username}/#{repo.name}" + %td.import-actions.job-status + = button_tag "Import", class: "btn js-add-to-import" + +:coffeescript + new ImporterStatus("#{jobs_import_fogbugz_path}", "#{import_fogbugz_path}") diff --git a/app/views/kaminari/gitlab/_paginator.html.haml b/app/views/kaminari/gitlab/_paginator.html.haml index 4f7996e499..b8d419b589 100644 --- a/app/views/kaminari/gitlab/_paginator.html.haml +++ b/app/views/kaminari/gitlab/_paginator.html.haml @@ -7,7 +7,7 @@ -# paginator: the paginator that renders the pagination tags inside = paginator.render do %div.gl-pagination - %ul.pagination + %ul.pagination.clearfix = prev_page_tag unless current_page.first? - each_page do |page| - if page.left_outer? || page.right_outer? || page.inside_window? diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 397649dacf..c3b137e3dd 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -3,6 +3,7 @@ %meta{charset: "utf-8"} %meta{'http-equiv' => 'X-UA-Compatible', content: 'IE=edge'} %meta{content: "GitLab Community Edition", name: "description"} + %meta{name: 'referrer', content: 'origin'} %title= page_title diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 96e15783a3..2468687b56 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,20 +1,29 @@ .page-with-sidebar{ class: nav_sidebar_class } = render "layouts/broadcast" .sidebar-wrapper.nicescroll + .header-logo + = link_to root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do + = brand_header_logo + .gitlab-text-container + %h3 GitLab + - if defined?(sidebar) && sidebar = render "layouts/nav/#{sidebar}" - elsif current_user = render 'layouts/nav/dashboard' + - else + = render 'layouts/nav/explore' + .collapse-nav = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s32' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s36' .username = current_user.username .content-wrapper - .container-fluid + = render "layouts/flash" + %div{ class: container_class } .content - = render "layouts/flash" .clearfix = yield diff --git a/app/views/layouts/ci/_info.html.haml b/app/views/layouts/ci/_info.html.haml new file mode 100644 index 0000000000..24c68a6dbf --- /dev/null +++ b/app/views/layouts/ci/_info.html.haml @@ -0,0 +1,2 @@ +- if current_user && current_user.is_admin? && Ci::Runner.count.zero? + = render 'ci/shared/no_runners' diff --git a/app/views/layouts/ci/_nav_admin.html.haml b/app/views/layouts/ci/_nav_admin.html.haml new file mode 100644 index 0000000000..af2545a22d --- /dev/null +++ b/app/views/layouts/ci/_nav_admin.html.haml @@ -0,0 +1,33 @@ +%ul.nav.nav-sidebar + = nav_link do + = link_to admin_root_path, title: 'Back to admin', data: {placement: 'right'}, class: 'back-link' do + = icon('caret-square-o-left fw') + %span + Back to admin + + %li.separate-item + = nav_link path: 'projects#index' do + = link_to ci_admin_projects_path do + = icon('list-alt fw') + Projects + = nav_link path: 'events#index' do + = link_to ci_admin_events_path do + = icon('book fw') + Events + = nav_link path: ['runners#index', 'runners#show'] do + = link_to ci_admin_runners_path do + = icon('cog fw') + Runners + %small.pull-right + = Ci::Runner.count(:all) + = nav_link path: 'builds#index' do + = link_to ci_admin_builds_path do + = icon('link fw') + Builds + %small.pull-right + = Ci::Build.count(:all) + = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do + = link_to ci_admin_application_settings_path do + = icon('cogs fw') + %span + Settings diff --git a/app/views/layouts/ci/_nav_project.html.haml b/app/views/layouts/ci/_nav_project.html.haml new file mode 100644 index 0000000000..cb1dece073 --- /dev/null +++ b/app/views/layouts/ci/_nav_project.html.haml @@ -0,0 +1,54 @@ +%ul.nav.nav-sidebar + = nav_link do + = link_to ci_root_path, title: 'Back to CI projects', data: {placement: 'right'}, class: 'back-link' do + = icon('caret-square-o-left fw') + %span= 'Back to CI projects' + %li.separate-item + = nav_link path: ['projects#show', 'commits#show', 'builds#show'] do + = link_to ci_project_path(@project) do + = icon('list-alt fw') + %span + Commits + %span.count= @project.commits.count + - if can?(current_user, :admin_project, gl_project) + = nav_link path: 'charts#show' do + = link_to ci_project_charts_path(@project) do + = icon('bar-chart fw') + %span + Charts + = nav_link path: ['runners#index', 'runners#show', 'runners#edit'] do + = link_to ci_project_runners_path(@project) do + = icon('cog fw') + %span + Runners + = nav_link path: 'variables#show' do + = link_to ci_project_variables_path(@project) do + = icon('code fw') + %span + Variables + = nav_link path: 'web_hooks#index' do + = link_to ci_project_web_hooks_path(@project) do + = icon('link fw') + %span + Web Hooks + = nav_link path: 'triggers#index' do + = link_to ci_project_triggers_path(@project) do + = icon('retweet fw') + %span + Triggers + = nav_link path: ['services#index', 'services#edit'] do + = link_to ci_project_services_path(@project) do + = icon('share fw') + %span + Services + = nav_link path: 'events#index' do + = link_to ci_project_events_path(@project) do + = icon('book fw') + %span + Events + %li.separate-item + = nav_link path: 'projects#edit' do + = link_to edit_ci_project_path(@project) do + = icon('cogs fw') + %span + Settings diff --git a/app/views/layouts/ci/_page.html.haml b/app/views/layouts/ci/_page.html.haml new file mode 100644 index 0000000000..c598f63c4c --- /dev/null +++ b/app/views/layouts/ci/_page.html.haml @@ -0,0 +1,26 @@ +.page-with-sidebar{ class: nav_sidebar_class } + = render "layouts/broadcast" + .sidebar-wrapper.nicescroll + .header-logo + = link_to ci_root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do + = brand_header_logo + .gitlab-text-container + %h3 GitLab CI + - if defined?(sidebar) && sidebar + = render "layouts/ci/#{sidebar}" + - elsif current_user + = render 'layouts/nav/dashboard' + .collapse-nav + = render partial: 'layouts/collapse_button' + - if current_user + = link_to current_user, class: 'sidebar-user' do + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s36' + .username + = current_user.username + .content-wrapper + = render "layouts/flash" + = render 'layouts/ci/info' + %div{ class: container_class } + .content + .clearfix + = yield diff --git a/app/views/layouts/ci/admin.html.haml b/app/views/layouts/ci/admin.html.haml new file mode 100644 index 0000000000..c8cb185d28 --- /dev/null +++ b/app/views/layouts/ci/admin.html.haml @@ -0,0 +1,11 @@ +!!! 5 +%html{ lang: "en"} + = render 'layouts/head' + %body{class: "ci-body #{user_application_theme}", 'data-page' => body_data_page} + - header_title = "Admin area" + - if current_user + = render "layouts/header/default", title: header_title + - else + = render "layouts/header/public", title: header_title + + = render 'layouts/ci/page', sidebar: 'nav_admin' diff --git a/app/views/layouts/ci/application.html.haml b/app/views/layouts/ci/application.html.haml new file mode 100644 index 0000000000..38023468d0 --- /dev/null +++ b/app/views/layouts/ci/application.html.haml @@ -0,0 +1,11 @@ +!!! 5 +%html{ lang: "en"} + = render 'layouts/head' + %body{class: "ci-body #{user_application_theme}", 'data-page' => body_data_page} + - header_title = "Continuous Integration" + - if current_user + = render "layouts/header/default", title: header_title + - else + = render "layouts/header/public", title: header_title + + = render 'layouts/ci/page' diff --git a/app/views/layouts/ci/build.html.haml b/app/views/layouts/ci/build.html.haml new file mode 100644 index 0000000000..a1356f0dc2 --- /dev/null +++ b/app/views/layouts/ci/build.html.haml @@ -0,0 +1,11 @@ +!!! 5 +%html{ lang: "en"} + = render 'layouts/head' + %body{class: "ci-body #{user_application_theme}", 'data-page' => body_data_page} + - header_title ci_commit_title(@commit) + - if current_user + = render "layouts/header/default", title: header_title + - else + = render "layouts/header/public", title: header_title + + = render 'layouts/ci/page', sidebar: 'nav_project' diff --git a/app/views/layouts/ci/commit.html.haml b/app/views/layouts/ci/commit.html.haml new file mode 100644 index 0000000000..a1356f0dc2 --- /dev/null +++ b/app/views/layouts/ci/commit.html.haml @@ -0,0 +1,11 @@ +!!! 5 +%html{ lang: "en"} + = render 'layouts/head' + %body{class: "ci-body #{user_application_theme}", 'data-page' => body_data_page} + - header_title ci_commit_title(@commit) + - if current_user + = render "layouts/header/default", title: header_title + - else + = render "layouts/header/public", title: header_title + + = render 'layouts/ci/page', sidebar: 'nav_project' diff --git a/app/views/layouts/ci/notify.html.haml b/app/views/layouts/ci/notify.html.haml new file mode 100644 index 0000000000..270b206df5 --- /dev/null +++ b/app/views/layouts/ci/notify.html.haml @@ -0,0 +1,19 @@ +%html{lang: "en"} + %head + %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"} + %title + GitLab CI + + %body + = yield :header + + %table{align: "left", border: "0", cellpadding: "0", cellspacing: "0", style: "padding: 10px 0;", width: "100%"} + %tr + %td{align: "left", style: "margin: 0; padding: 10px;"} + = yield + %br + %tr + %td{align: "left", style: "margin: 0; padding: 10px;"} + %p{style: "font-size:small;color:#777"} + - if @project + You're receiving this notification because you are the one who triggered a build on the #{@project.name} project. diff --git a/app/views/layouts/ci/project.html.haml b/app/views/layouts/ci/project.html.haml new file mode 100644 index 0000000000..15478c3f5b --- /dev/null +++ b/app/views/layouts/ci/project.html.haml @@ -0,0 +1,11 @@ +!!! 5 +%html{ lang: "en"} + = render 'layouts/head' + %body{class: "ci-body #{user_application_theme}", 'data-page' => body_data_page} + - header_title @project.name, ci_project_path(@project) + - if current_user + = render "layouts/header/default", title: header_title + - else + = render "layouts/header/public", title: header_title + + = render 'layouts/ci/page', sidebar: 'nav_project' diff --git a/app/views/layouts/dashboard.html.haml b/app/views/layouts/dashboard.html.haml index c72eca10bf..cb96bcc2cf 100644 --- a/app/views/layouts/dashboard.html.haml +++ b/app/views/layouts/dashboard.html.haml @@ -1,5 +1,5 @@ - page_title "Dashboard" -- header_title "Dashboard", root_path +- header_title "Dashboard", root_path unless header_title - sidebar "dashboard" = render template: "layouts/application" diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 1987bf1592..95e077c339 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -31,5 +31,5 @@ .container .footer-links = link_to "Explore", explore_root_path - = link_to "Documentation", "http://doc.gitlab.com/" + = link_to "Help", help_path = link_to "About GitLab", "https://about.gitlab.com/" diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index 56bb92a536..df65792be7 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -1,5 +1,5 @@ - page_title "Explore" -- header_title "Explore GitLab", explore_root_path -- sidebar "explore" +- unless current_user + - header_title "Explore GitLab", explore_root_path = render template: "layouts/application" diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index db7dbf9bfe..31888c5580 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -1,5 +1,5 @@ - page_title @group.name -- header_title @group.name, group_path(@group) -- sidebar "group" unless sidebar +- header_title group_title(@group) unless header_title +- sidebar "group" unless sidebar = render template: "layouts/application" diff --git a/app/views/layouts/group_settings.html.haml b/app/views/layouts/group_settings.html.haml index e303a56162..a1a1fc2f85 100644 --- a/app/views/layouts/group_settings.html.haml +++ b/app/views/layouts/group_settings.html.haml @@ -1,4 +1,5 @@ - page_title "Settings" +- header_title group_title(@group, "Settings", edit_group_path(@group)) - sidebar "group_settings" = render template: "layouts/group" diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index b3cd7b0e37..c31b1cbe9a 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -1,10 +1,5 @@ %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } - .container - .header-logo - = link_to root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do - = brand_header_logo - .gitlab-text-container - %h3 GitLab + %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content %button.navbar-toggle{type: 'button'} %span.sr-only Toggle navigation @@ -12,31 +7,20 @@ .navbar-collapse.collapse %ul.nav.navbar-nav.pull-right - %li.hidden-sm.hidden-xs - = render 'layouts/search' + - unless @disable_search_panel + %li.hidden-sm.hidden-xs + = render 'layouts/search' %li.visible-sm.visible-xs = link_to search_path, title: 'Search', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('search') - %li.hidden-xs - = link_to help_path, title: 'Help', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('question-circle fw') - %li - = link_to explore_root_path, title: 'Explore', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('globe fw') - %li - = link_to user_snippets_path(current_user), title: 'Your snippets', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('clipboard fw') - if current_user.is_admin? %li = link_to admin_root_path, title: 'Admin area', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('wrench fw') - if current_user.can_create_project? - %li.hidden-xs + %li = link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('plus fw') - %li - = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('cog fw') %li = link_to destroy_user_session_path, class: 'logout', method: :delete, title: 'Sign out', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('sign-out') diff --git a/app/views/layouts/header/_public.html.haml b/app/views/layouts/header/_public.html.haml index 15c2e292be..a6a26518a0 100644 --- a/app/views/layouts/header/_public.html.haml +++ b/app/views/layouts/header/_public.html.haml @@ -1,14 +1,9 @@ %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } - .container - .header-logo - = link_to explore_root_path, class: "home" do - = brand_header_logo - .gitlab-text-container - %h3 GitLab + %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content - unless current_controller?('sessions') .pull-right - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success btn-sm' + = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success' %h1.title= title diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 2065be3828..2079feeeab 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -4,7 +4,7 @@ = icon('dashboard fw') %span Overview - = nav_link(controller: :projects) do + = nav_link(controller: [:admin, :projects]) do = link_to admin_namespaces_projects_path, title: 'Projects', data: {placement: 'right'} do = icon('cube fw') %span @@ -24,6 +24,11 @@ = icon('key fw') %span Deploy Keys + = nav_link do + = link_to ci_admin_projects_path, title: 'Continuous Integration', data: {placement: 'right'} do + = icon('building fw') + %span + Continuous Integration = nav_link(controller: :logs) do = link_to admin_logs_path, title: 'Logs', data: {placement: 'right'} do = icon('file-text fw') @@ -57,6 +62,12 @@ %span Service Templates + = nav_link(controller: :labels) do + = link_to admin_labels_path, title: 'Labels', data: {placement: 'right'} do + = icon('tags fw') + %span + Labels + = nav_link(controller: :abuse_reports) do = link_to admin_abuse_reports_path, title: "Abuse reports" do = icon('exclamation-circle fw') diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 687c1fc3dd..b94165aac3 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,14 +1,14 @@ %ul.nav.nav-sidebar - = nav_link(path: ['dashboard#show', 'root#show'], html_options: {class: 'home'}) do - = link_to dashboard_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do + = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: {class: 'home'}) do + = link_to root_path, title: 'Projects', data: {placement: 'right'} do + = icon('home fw') + %span + Projects + = nav_link(path: 'dashboard#activity') do + = link_to activity_dashboard_path, class: 'shortcuts-activity', title: 'Activity', data: {placement: 'right'} do = icon('dashboard fw') %span - Your Projects - = nav_link(path: 'projects#starred') do - = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do - = icon('star fw') - %span - Starred Projects + Activity = nav_link(controller: :groups) do = link_to dashboard_groups_path, title: 'Groups', data: {placement: 'right'} do = icon('group fw') @@ -25,14 +25,31 @@ %span Issues %span.count= current_user.assigned_issues.opened.count - = nav_link(path: 'dashboard#merge_requests') do - = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests', data: {placement: 'right'} do - = icon('tasks fw') + = nav_link(path: 'dashboard#merge_requests') do + = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests', data: {placement: 'right'} do + = icon('tasks fw') + %span + Merge Requests + %span.count= current_user.assigned_merge_requests.opened.count + = nav_link(path: ['ci/projects#index', 'ci/projects#disabled']) do + = link_to ci_projects_path, title: 'Continuous Integration', data: {placement: 'right'} do + = icon('building fw') %span - Merge Requests - %span.count= current_user.assigned_merge_requests.opened.count + Continuous Integration + = nav_link(controller: :snippets) do + = link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do + = icon('clipboard fw') + %span + Snippets = nav_link(controller: :help) do = link_to help_path, title: 'Help', data: {placement: 'right'} do = icon('question-circle fw') %span Help + + %li.separate-item + = nav_link(controller: :profile) do + = link_to profile_path, title: 'Profile settings', data: {placement: 'bottom'} do + = icon('user fw') + %span + Profile Settings diff --git a/app/views/layouts/nav/_explore.html.haml b/app/views/layouts/nav/_explore.html.haml index 66870e84ce..21e565972a 100644 --- a/app/views/layouts/nav/_explore.html.haml +++ b/app/views/layouts/nav/_explore.html.haml @@ -1,18 +1,21 @@ %ul.nav.nav-sidebar - = nav_link(path: 'projects#trending') do - = link_to explore_root_path, title: 'Trending Projects', data: {placement: 'right'} do - = icon('comments fw') - %span Trending Projects - = nav_link(path: 'projects#starred') do - = link_to starred_explore_projects_path, title: 'Most-starred Projects', data: {placement: 'right'} do - = icon('star fw') - %span Most-starred Projects - = nav_link(path: 'projects#index') do - = link_to explore_projects_path, title: 'All Projects', data: {placement: 'right'} do - = icon('bookmark fw') - %span All Projects + = nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do + = link_to explore_root_path, title: 'Projects', data: {placement: 'right'} do + = icon('home fw') + %span + Projects = nav_link(controller: :groups) do - = link_to explore_groups_path, title: 'All Groups', data: {placement: 'right'} do + = link_to explore_groups_path, title: 'Groups', data: {placement: 'right'} do = icon('group fw') - %span All Groups - + %span + Groups + = nav_link(controller: :snippets) do + = link_to explore_snippets_path, title: 'Snippets', data: {placement: 'right'} do + = icon('clipboard fw') + %span + Snippets + = nav_link(controller: :help) do + = link_to help_path, title: 'Help', data: {placement: 'right'} do + = icon('question-circle fw') + %span + Help diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 695ce68a20..eb35af22b9 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -3,7 +3,7 @@ = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item @@ -12,34 +12,35 @@ = icon('dashboard fw') %span Group - - if current_user - = nav_link(controller: [:group, :milestones]) do - = link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do - = icon('clock-o fw') + - if can?(current_user, :read_group, @group) + - if current_user + = nav_link(controller: [:group, :milestones]) do + = link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do + = icon('clock-o fw') + %span + Milestones + = nav_link(path: 'groups#issues') do + = link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do + = icon('exclamation-circle fw') %span - Milestones - = nav_link(path: 'groups#issues') do - = link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do - = icon('exclamation-circle fw') - %span - Issues - - if current_user - %span.count= Issue.opened.of_group(@group).count - = nav_link(path: 'groups#merge_requests') do - = link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do - = icon('tasks fw') - %span - Merge Requests - - if current_user - %span.count= MergeRequest.opened.of_group(@group).count - = nav_link(controller: [:group_members]) do - = link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do - = icon('users fw') - %span - Members - - if can?(current_user, :admin_group, @group) - = nav_link(html_options: { class: "separate-item" }) do - = link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do - = icon ('cogs fw') + Issues + - if current_user + %span.count= Issue.opened.of_group(@group).count + = nav_link(path: 'groups#merge_requests') do + = link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do + = icon('tasks fw') %span - Settings + Merge Requests + - if current_user + %span.count= MergeRequest.opened.of_group(@group).count + = nav_link(controller: [:group_members]) do + = link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do + = icon('users fw') + %span + Members + - if can?(current_user, :admin_group, @group) + = nav_link(html_options: { class: "separate-item" }) do + = link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do + = icon ('cogs fw') + %span + Settings diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 33fd5fcef6..5a47b8e6db 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -3,7 +3,7 @@ = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item @@ -11,7 +11,7 @@ = link_to profile_path, title: 'Profile', data: {placement: 'right'} do = icon('user fw') %span - Profile + Profile Settings = nav_link(controller: [:accounts, :two_factor_auths]) do = link_to profile_account_path, title: 'Account', data: {placement: 'right'} do = icon('gear fw') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index d17d1c5fbd..a218ec7486 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -4,13 +4,13 @@ = link_to group_path(@project.group), title: 'Back to group', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Group + Back to group - else = nav_link do = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item @@ -26,28 +26,28 @@ Activity - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to namespace_project_tree_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do + = link_to project_files_path(@project), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do = icon('files-o fw') %span Files - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do + = link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do = icon('history fw') %span Commits - if project_nav_tab? :network = nav_link(controller: %w(network)) do - = link_to namespace_project_network_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do + = link_to namespace_project_network_path(@project.namespace, @project, current_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do = icon('code-fork fw') %span Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do - = link_to namespace_project_graph_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do + = link_to namespace_project_graph_path(@project.namespace, @project, current_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do = icon('area-chart fw') %span Graphs @@ -76,6 +76,13 @@ Merge Requests %span.count.merge_counter= @project.merge_requests.opened.count + - if @project.gitlab_ci? + = nav_link(controller: [:ci, :project]) do + = link_to ci_project_path(@project.gitlab_ci_project), title: 'Continuous Integration', data: {placement: 'right'} do + = icon('building fw') + %span + Continuous Integration + - if project_nav_tab? :settings = nav_link(controller: [:project_members, :teams]) do = link_to namespace_project_project_members_path(@project.namespace, @project), title: 'Members', class: 'team-tab tab', data: {placement: 'right'} do @@ -100,7 +107,7 @@ - if project_nav_tab? :snippets = nav_link(controller: :snippets) do = link_to namespace_project_snippets_path(@project.namespace, @project), title: 'Snippets', class: 'shortcuts-snippets', data: {placement: 'right'} do - = icon('file-text-o fw') + = icon('clipboard fw') %span Snippets diff --git a/app/views/layouts/nav/_snippets.html.haml b/app/views/layouts/nav/_snippets.html.haml deleted file mode 100644 index 458b76a2c9..0000000000 --- a/app/views/layouts/nav/_snippets.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -%ul.nav.nav-sidebar - - if current_user - = nav_link(path: user_snippets_path(current_user), html_options: {class: 'home'}) do - = link_to user_snippets_path(current_user), title: 'Your snippets', data: {placement: 'right'} do - = icon('dashboard fw') - %span - Your Snippets - = nav_link(path: snippets_path) do - = link_to snippets_path, title: 'Discover snippets', data: {placement: 'right'} do - = icon('globe fw') - %span - Discover Snippets diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml index c8662a15ad..ec209c38ee 100644 --- a/app/views/layouts/notify.html.haml +++ b/app/views/layouts/notify.html.haml @@ -36,7 +36,11 @@ — %br - if @target_url - #{link_to "View it on GitLab", @target_url} + - if @reply_by_email + Reply to this email directly or + #{link_to "view it on GitLab", @target_url}. + - else + #{link_to "View it on GitLab", @target_url} = email_action @target_url - if @project && !@disable_footer You're receiving this notification because you are a member of the #{link_to_unless @target_url, @project.name_with_namespace, namespace_project_url(@project.namespace, @project)} project team. diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 3193206fe1..dfa6cc5702 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,5 +1,5 @@ -- page_title "Settings" -- header_title "Settings", profile_path +- page_title "Profile Settings" +- header_title "Profile Settings", profile_path unless header_title - sidebar "profile" = render template: "layouts/application" diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index 44afa33dfe..78dafcd8bf 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -1,6 +1,6 @@ - page_title @project.name_with_namespace -- header_title project_title(@project) -- sidebar "project" unless sidebar +- header_title project_title(@project) unless header_title +- sidebar "project" unless sidebar - content_for :scripts_body_top do - if current_user diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml index 4340166833..59ce38f67b 100644 --- a/app/views/layouts/project_settings.html.haml +++ b/app/views/layouts/project_settings.html.haml @@ -1,4 +1,5 @@ - page_title "Settings" +- header_title project_title(@project, "Settings", edit_project_path(@project)) - sidebar "project_settings" = render template: "layouts/project" diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml index 9b0f40073a..02ca3ee7a2 100644 --- a/app/views/layouts/snippets.html.haml +++ b/app/views/layouts/snippets.html.haml @@ -1,5 +1,3 @@ -- page_title 'Snippets' -- header_title 'Snippets', snippets_path -- sidebar "snippets" +- header_title "Snippets", snippets_path = render template: "layouts/application" diff --git a/app/views/notify/new_user_email.html.haml b/app/views/notify/new_user_email.html.haml index 4feacdaacf..6b9b42dcf3 100644 --- a/app/views/notify/new_user_email.html.haml +++ b/app/views/notify/new_user_email.html.haml @@ -13,4 +13,4 @@ %p = link_to "Click here to set your password", edit_password_url(@user, reset_password_token: @token) %p - = reset_token_expire_message + = raw reset_token_expire_message diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 767fe2e0e9..cd7b1b0fe0 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -1,9 +1,7 @@ - page_title "Account" -%h3.page-title - = page_title -%p.light - Change your username and basic account settings. -%hr +- header_title page_title, profile_account_path +- @blank_container = true + - if current_user.ldap_user? .alert.alert-info Some options are unavailable for LDAP accounts @@ -69,7 +67,7 @@ - button_based_providers.each do |provider| .btn-group = link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: "btn btn-lg #{'active' if auth_active?(provider)}", "data-no-turbolink" => "true" - + - if auth_active?(provider) = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do = icon('close') diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index 3a3e6e1b1c..2342936a5d 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -1,13 +1,12 @@ - page_title "Applications" -%h3.page-title - = page_title -%p.light +- header_title page_title, applications_profile_path + +.gray-content-block.top-block - if user_oauth_applications? - Manage applications that can use GitLab as an OAuth provider, + Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account. - else Manage applications that you've authorized to use your account. -%hr - if user_oauth_applications? .oauth-applications diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml index 698d603742..8fdba45b19 100644 --- a/app/views/profiles/audit_log.html.haml +++ b/app/views/profiles/audit_log.html.haml @@ -1,5 +1,8 @@ - page_title "Audit Log" -%h3.page-title Audit Log -%p.light History of authentications +- header_title page_title, audit_log_profile_path -= render 'event_table', events: @events \ No newline at end of file +.gray-content-block.top-block + History of authentications + +.prepend-top-default += render 'event_table', events: @events diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index 66812872c4..1d140347a5 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -1,12 +1,10 @@ - page_title "Emails" -%h3.page-title - = page_title -%p.light +- header_title page_title, profile_emails_path + +.gray-content-block.top-block Control emails linked to your account -%hr - -%ul +%ul.prepend-top-default %li Your %b Primary Email diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 06655f7ba3..14adba1c79 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,11 +1,12 @@ - page_title "SSH Keys" -%h3.page-title - = page_title +- header_title page_title, profile_keys_path + +.gray-content-block.top-block .pull-right = link_to "Add SSH Key", new_profile_key_path, class: "btn btn-new" -%p.light - Before you can add an SSH key you need to - = link_to "generate it.", help_page_path("ssh", "README") -%hr + .oneline + Before you can add an SSH key you need to + = link_to "generate it.", help_page_path("ssh", "README") +.prepend-top-default = render 'key_table' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 9480a19f5b..8eebd96b67 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -1,10 +1,10 @@ - page_title "Notifications" -%h3.page-title - = page_title -%p.light - These are your global notification settings. -%hr +- header_title page_title, profile_notifications_path +.gray-content-block.top-block + These are your global notification settings. + +.prepend-top-default = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| -if @user.errors.any? %div.alert.alert-danger @@ -33,7 +33,7 @@ = f.label :notification_level, value: Notification::N_MENTION do = f.radio_button :notification_level, Notification::N_MENTION .level-title - Mention + On Mention %p You will receive notifications only for comments in which you were @mentioned .radio @@ -48,7 +48,7 @@ = f.radio_button :notification_level, Notification::N_WATCH .level-title Watch - %p You will receive all notifications from projects in which you participate + %p You will receive notifications for any activity .form-actions = f.submit 'Save changes', class: "btn btn-create" diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 399ae98adf..fab7c45c9b 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -1,13 +1,13 @@ - page_title "Password" -%h3.page-title - = page_title -%p.light +- header_title page_title, edit_profile_password_path + +.gray-content-block.top-block - if @user.password_automatically_set? Set your password. - else Change your password or recover your current one. -%hr -.update-password + +.update-password.prepend-top-default = form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f| %div %p.slead diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml index 9c6204963e..d165f758c8 100644 --- a/app/views/profiles/passwords/new.html.haml +++ b/app/views/profiles/passwords/new.html.haml @@ -12,7 +12,7 @@ %ul - @user.errors.full_messages.each do |msg| %li= msg - + - unless @user.password_automatically_set? .form-group = f.label :current_password, class: 'control-label' diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index 1134317ee0..60289bfe7c 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -1,11 +1,11 @@ - page_title 'Preferences' -%h3.page-title - = page_title -%p.light +- header_title page_title, profile_preferences_path +- @blank_container = true + +.alert.alert-help These settings allow you to customize the appearance and behavior of the site. They are saved with your account and will persist to any device you use to access the site. -%hr = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form form-horizontal'} do |f| .panel.panel-default.application-theme @@ -22,11 +22,11 @@ .panel-heading Syntax highlighting theme .panel-body - - color_schemes.each do |color_scheme_id, color_scheme| + - Gitlab::ColorSchemes.each do |scheme| = label_tag do - .preview= image_tag "#{color_scheme}-scheme-preview.png" - = f.radio_button :color_scheme_id, color_scheme_id - = color_scheme.tr('-_', ' ').titleize + .preview= image_tag "#{scheme.css_class}-scheme-preview.png" + = f.radio_button :color_scheme_id, scheme.id + = scheme.name .panel.panel-default .panel-heading diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index 9fdeddfcc7..47412e2ef0 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,14 +1,9 @@ -- page_title "Profile" -%h3.page-title - = page_title -%p.light +.gray-content-block.top-block This information will appear on your profile. - if current_user.ldap_user? Some options are unavailable for LDAP accounts -%hr - - +.prepend-top-default = form_for @user, url: profile_path, method: :put, html: { multipart: true, class: "edit_user form-horizontal" }, authenticity_token: true do |f| -if @user.errors.any? %div.alert.alert-danger @@ -100,11 +95,6 @@ %hr = link_to 'Remove avatar', profile_avatar_path, data: { confirm: "Avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" - - if @user.public_profile? - .alert.alert-info - %h4 Public profile - %p Your profile is publicly visible because you joined public project(s) - .row .col-md-7 diff --git a/app/views/projects/_activity.html.haml b/app/views/projects/_activity.html.haml index ee02b7f6a6..1261f6254d 100644 --- a/app/views/projects/_activity.html.haml +++ b/app/views/projects/_activity.html.haml @@ -1,5 +1,5 @@ = render 'projects/last_push' -.hidden-xs +.gray-content-block.activity-filter-block - if current_user %ul.nav.nav-pills.event_filter.pull-right %li @@ -7,7 +7,6 @@ %i.fa.fa-rss = render 'shared/event_filter' - %hr .content_list{:"data-href" => activity_project_path(@project)} = spinner diff --git a/app/views/projects/_bitbucket_import_modal.html.haml b/app/views/projects/_bitbucket_import_modal.html.haml index 745163e79a..2987f6b5b2 100644 --- a/app/views/projects/_bitbucket_import_modal.html.haml +++ b/app/views/projects/_bitbucket_import_modal.html.haml @@ -5,9 +5,9 @@ %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from Bitbucket .modal-body - To enable importing projects from Bitbucket, + To enable importing projects from Bitbucket, - if current_user.admin? - you need to + as administrator you need to configure - else - your GitLab administrator needs to - == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/bitbucket.md'}. + ask your GitLab administrator to configure + == #{link_to 'OAuth integration', help_page_path("integration", "bitbucket")}. diff --git a/app/views/projects/_github_import_modal.html.haml b/app/views/projects/_github_import_modal.html.haml index de58b27df2..46ad155935 100644 --- a/app/views/projects/_github_import_modal.html.haml +++ b/app/views/projects/_github_import_modal.html.haml @@ -5,9 +5,9 @@ %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from GitHub .modal-body - To enable importing projects from GitHub, + To enable importing projects from GitHub, - if current_user.admin? - you need to + as administrator you need to configure - else - your GitLab administrator needs to - == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/github.md'}. \ No newline at end of file + ask your Gitlab administrator to configure + == #{link_to 'OAuth integration', help_page_path("integration", "github")}. diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml index ae6c25f937..377cf0187b 100644 --- a/app/views/projects/_gitlab_import_modal.html.haml +++ b/app/views/projects/_gitlab_import_modal.html.haml @@ -5,9 +5,9 @@ %a.close{href: "#", "data-dismiss" => "modal"} × %h3 Import projects from GitLab.com .modal-body - To enable importing projects from GitLab.com, + To enable importing projects from GitLab.com, - if current_user.admin? - you need to + as administrator you need to configure - else - your GitLab administrator needs to - == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/gitlab.md'}. \ No newline at end of file + ask your GitLab administrator to configure + == #{link_to 'OAuth integration', help_page_path("integration", "gitlab")}. diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index bec40ec27a..6e53f55b0a 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -2,11 +2,18 @@ .project-home-panel.clearfix{:class => ("empty-project" if empty_repo)} .project-identicon-holder = project_icon(@project, alt: '', class: 'project-avatar avatar s90') - .project-home-desc.lead + .project-home-desc %h1= @project.name - if @project.description.present? = markdown(@project.description, pipeline: :description) + - if forked_from_project = @project.forked_from_project + %p + Forked from + = link_to project_path(forked_from_project) do + = forked_from_project.namespace.try(:name) + + .project-repo-buttons = render 'projects/buttons/star' @@ -14,17 +21,13 @@ - unless empty_repo = render 'projects/buttons/fork' - - if forked_from_project = @project.forked_from_project - = link_to project_path(forked_from_project), class: 'btn' do - = icon("code-fork fw") - Forked from - = forked_from_project.namespace.try(:name) - - if can? current_user, :download_code, @project = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: @ref, format: 'zip'), class: 'btn', rel: 'nofollow' do = icon('download fw') Download + = render 'projects/buttons/notifications' + = render 'projects/buttons/dropdown' = render "shared/clone_panel" diff --git a/app/views/projects/_last_push.html.haml b/app/views/projects/_last_push.html.haml index 30622d8a91..f0a3e416db 100644 --- a/app/views/projects/_last_push.html.haml +++ b/app/views/projects/_last_push.html.haml @@ -1,14 +1,15 @@ - if event = last_push_event - if show_last_push_widget?(event) - .hidden-xs.center - .slead - %span You pushed to - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - branch - #{time_ago_with_tooltip(event.created_at)} - %div - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do - Create Merge Request - %hr + .gray-content-block.top-block.clear-block.hidden-xs + .event-last-push + .event-last-push-text + %span You pushed to + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do + %strong= event.ref_name + branch + #{time_ago_with_tooltip(event.created_at)} + + .pull-right + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do + Create Merge Request diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index b7bca6dae0..507757f6a2 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -1,6 +1,6 @@ .md-area .md-header.clearfix - %ul.nav.nav-tabs + %ul.center-top-menu %li.active = link_to '#md-write-holder', class: 'js-md-write-button', tabindex: '-1' do Write @@ -14,7 +14,7 @@ You are about to add %strong %span.js-referenced-users-count 0 - people + people to the discussion. Proceed with caution. %div diff --git a/app/views/projects/activity.html.haml b/app/views/projects/activity.html.haml index 65674913bb..555ed76426 100644 --- a/app/views/projects/activity.html.haml +++ b/app/views/projects/activity.html.haml @@ -1 +1,4 @@ +- page_title "Activity" +- header_title project_title(@project, "Activity", activity_project_path(@project)) + = render 'projects/activity' diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index a3ff7ce2f1..6518c4173e 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -1,4 +1,6 @@ - page_title "Blame", @blob.path, @ref +- header_title project_title(@project, "Files", project_files_path(@project)) + %h3.page-title Blame view #tree-holder.tree-holder @@ -27,7 +29,7 @@ .light = commit_author_link(commit, avatar: false) authored - #{time_ago_with_tooltip(commit.committed_date)} + #{time_ago_with_tooltip(commit.committed_date, skip_js: true)} %td.lines.blame-numbers %pre - line_count = blame_group[:lines].count diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 13f8271b97..373b3a0c5b 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -17,6 +17,6 @@ tree_join(@commit.sha, @path)), class: 'btn btn-sm' - if allowed_tree_edit? - = button_tag class: 'remove-blob btn btn-sm btn-remove', - 'data-toggle' => 'modal', 'data-target' => '#modal-remove-blob' do - Remove + .btn-group{ role: "group" } + %button.btn.btn-default{ 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } Replace + %button.btn.btn-remove{ 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal' } Remove diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 65c3ab10e0..b4c7d8b9b7 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -15,7 +15,7 @@ - else = link_to title, '#' -%ul.blob-commit-info.well.hidden-xs +%ul.blob-commit-info.hidden-xs - blob_commit = @repository.last_commit_for_path(@commit.id, blob.path) = render blob_commit, project: @project diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 96f188e4aa..9c3e1703c8 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -12,8 +12,8 @@ \/ = text_field_tag 'file_name', params[:file_name], placeholder: "File name", required: true, class: 'form-control new-file-name' - .pull-right - = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' + .pull-right + = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'form-control' .file-content.code %pre.js-edit-mode-pane#editor diff --git a/app/views/projects/blob/_header_title.html.haml b/app/views/projects/blob/_header_title.html.haml new file mode 100644 index 0000000000..78c5ef20a5 --- /dev/null +++ b/app/views/projects/blob/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Files", project_files_path(@project)) diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml new file mode 100644 index 0000000000..1a1df12770 --- /dev/null +++ b/app/views/projects/blob/_upload.html.haml @@ -0,0 +1,28 @@ +#modal-upload-blob.modal + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3.page-title #{title} + %p.light + From branch + %strong= @ref + .modal-body + = form_tag form_path, method: method, class: 'blob-file-upload-form-js form-horizontal' do + .dropzone + .dropzone-previews.blob-upload-dropzone-previews + %p.dz-message.light + Attach a file by drag & drop or + = link_to 'click to upload', '#', class: "markdown-selector" + %br + .dropzone-alerts{class: "alert alert-danger data", style: "display:none"} + = render 'shared/commit_message_container', params: params, + placeholder: placeholder + .form-group + .col-sm-offset-2.col-sm-10 + = button_tag button_title, class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all' + = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" + +:coffeescript + disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-upload-file' + new BlobFileDropzone($('.blob-file-upload-form-js'), '#{method}') diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index a12cd660fc..a811adc509 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -1,6 +1,8 @@ - page_title "Edit", @blob.path, @ref += render "header_title" + .file-editor - %ul.nav.nav-tabs.js-edit-mode + %ul.center-top-menu.no-bottom.js-edit-mode %li.active = link_to '#editor' do %i.fa.fa-edit diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index dac984f8c3..1950586b11 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,16 +1,26 @@ -- page_title "New File", @ref -%h3.page-title New file +- page_title "New File", @path.presence, @ref += render "header_title" + +.gray-content-block.top-block + Create a new file or + = link_to 'upload', '#modal-upload-blob', + { class: 'upload-link', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'} + an existing one + += render 'projects/blob/upload', title: 'Upload', placeholder: 'Upload new file', button_title: 'Upload file', form_path: namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post + .file-editor = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file js-requires-input') do = render 'projects/blob/editor', ref: @ref = render 'shared/commit_message_container', params: params, placeholder: 'Add new file' - .form-group.branch - = label_tag 'branch', class: 'control-label' do - Branch - .col-sm-10 - = text_field_tag 'new_branch', @ref, class: "form-control" + - unless @project.empty_repo? + .form-group.branch + = label_tag 'branch', class: 'control-label' do + Branch + .col-sm-10 + = text_field_tag 'new_branch', @ref, class: "form-control" = hidden_field_tag 'content', '', id: 'file-content' = render 'projects/commit_button', ref: @ref, diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml index bd2fc43633..fa4be4a1bc 100644 --- a/app/views/projects/blob/show.html.haml +++ b/app/views/projects/blob/show.html.haml @@ -1,4 +1,5 @@ - page_title @blob.path, @ref += render "header_title" = render 'projects/last_push' @@ -10,3 +11,8 @@ - if allowed_tree_edit? = render 'projects/blob/remove' + + - title = "Replace #{@blob.name}" + = render 'projects/blob/upload', title: title, placeholder: title, + button_title: 'Replace file', form_path: namespace_project_update_blob_path(@project.namespace, @project, @id), + method: :put diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index a693c4b282..cc0ec9483d 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -1,20 +1,20 @@ - commit = @repository.commit(branch.target) %li(class="js-branch-#{branch.name}") - %h4 + %div = link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do %strong.str-truncated= branch.name +   - if branch.name == @repository.root_ref - %span.label.label-info default + %span.label.label-primary default - elsif @repository.merged_to_root_ref? branch.name - %span.label.label-primary.has_tooltip(title="Merged into #{@repository.root_ref}") - %i.fa.fa-check + %span.label.label-info.has_tooltip(title="Merged into #{@repository.root_ref}") merged - if @project.protected_branch? branch.name %span.label.label-success %i.fa.fa-lock protected - .pull-right + .controls.hidden-xs - if create_mr_button?(@repository.root_ref, branch.name) = link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-grouped btn-xs' do = icon('plus') @@ -30,8 +30,7 @@ = icon("trash-o") - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project + = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this branch diff --git a/app/views/projects/branches/_commit.html.haml b/app/views/projects/branches/_commit.html.haml new file mode 100644 index 0000000000..68326e65d8 --- /dev/null +++ b/app/views/projects/branches/_commit.html.haml @@ -0,0 +1,7 @@ +.branch-commit.light + = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" + · + %span.str-truncated + = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" + · + #{time_ago_with_tooltip(commit.committed_date)} diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index 80acc93790..03ade02a0c 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -1,7 +1,7 @@ - page_title "Branches" += render "projects/commits/header_title" = render "projects/commits/head" -%h3.page-title - Branches +.gray-content-block .pull-right - if can? current_user, :push_code, @project = link_to new_namespace_project_branch_path(@project.namespace, @project), class: 'btn btn-create' do @@ -24,9 +24,10 @@ = sort_title_recently_updated = link_to namespace_project_branches_path(sort: 'last_updated') do = sort_title_oldest_updated -%hr + .oneline + Protected branches can be managed in project settings - unless @branches.empty? - %ul.bordered-list.top-list.all-branches + %ul.content-list.all-branches - @branches.each do |branch| = render "projects/branches/branch", branch: branch = paginate @branches, theme: 'gitlab' diff --git a/app/views/projects/branches/new.html.haml b/app/views/projects/branches/new.html.haml index 29e82b9388..f5577042ca 100644 --- a/app/views/projects/branches/new.html.haml +++ b/app/views/projects/branches/new.html.haml @@ -1,4 +1,6 @@ - page_title "New Branch" += render "projects/commits/header_title" + - if @error .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × diff --git a/app/views/projects/buttons/_dropdown.html.haml b/app/views/projects/buttons/_dropdown.html.haml index cade930c8c..bc7625e898 100644 --- a/app/views/projects/buttons/_dropdown.html.haml +++ b/app/views/projects/buttons/_dropdown.html.haml @@ -2,7 +2,7 @@ %span.dropdown %a.dropdown-toggle.btn.btn-new{href: '#', "data-toggle" => "dropdown"} = icon('plus') - %ul.dropdown-menu + %ul.dropdown-menu.dropdown-menu-right.project-home-dropdown - if can?(current_user, :create_issue, @project) %li = link_to url_for_new_issue do diff --git a/app/views/projects/buttons/_notifications.html.haml b/app/views/projects/buttons/_notifications.html.haml new file mode 100644 index 0000000000..57f764178d --- /dev/null +++ b/app/views/projects/buttons/_notifications.html.haml @@ -0,0 +1,14 @@ +- return unless @membership + += form_tag profile_notifications_path, method: :put, remote: true, class: 'inline-form', id: 'notification-form' do + = hidden_field_tag :notification_type, 'project' + = hidden_field_tag :notification_id, @membership.id + = hidden_field_tag :notification_level + %span.dropdown + %a.dropdown-toggle.btn.btn-new#notifications-button{href: '#', "data-toggle" => "dropdown"} + = icon('bell') + = notification_label(@membership) + = icon('angle-down') + %ul.dropdown-menu.dropdown-menu-right.project-home-dropdown + - Notification.project_notification_levels.each do |level| + = notification_list_item(level, @membership) diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 3f645b8139..2ac79e87b4 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -41,7 +41,7 @@ .commit-info-row.branches %i.fa.fa-spinner.fa-spin -.commit-box +.commit-box.gray-content-block.middle-block %h3.commit-title = gfm escape_once(@commit.title) - if @commit.description.present? diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml index 60b112e67d..f8681024d1 100644 --- a/app/views/projects/commit/show.html.haml +++ b/app/views/projects/commit/show.html.haml @@ -1,4 +1,5 @@ - page_title "#{@commit.title} (#{@commit.short_id})", "Commits" += render "projects/commits/header_title" = render "commit_box" = render "projects/diffs/diffs", diffs: @diffs, project: @project = render "projects/notes/notes_with_form", view: params[:view] diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml index e3d8cd0fdd..a849bf8469 100644 --- a/app/views/projects/commits/_head.html.haml +++ b/app/views/projects/commits/_head.html.haml @@ -1,22 +1,18 @@ -%ul.nav.nav-tabs +%ul.center-top-menu = nav_link(controller: [:commit, :commits]) do - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do - = icon("history") + = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do Commits %span.badge= number_with_delimiter(@repository.commit_count) = nav_link(controller: :compare) do - = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref) do - = icon("exchange") + = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do Compare = nav_link(html_options: {class: branches_tab_class}) do = link_to namespace_project_branches_path(@project.namespace, @project) do - = icon("code-fork") Branches %span.badge.js-totalbranch-count= @repository.branches.size = nav_link(controller: :tags) do = link_to namespace_project_tags_path(@project.namespace, @project) do - = icon("tags") Tags %span.badge.js-totaltags-count= @repository.tags.length diff --git a/app/views/projects/commits/_header_title.html.haml b/app/views/projects/commits/_header_title.html.haml new file mode 100644 index 0000000000..e4385893dd --- /dev/null +++ b/app/views/projects/commits/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Commits", project_commits_path(@project)) diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 55054a3197..2dd99cc821 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -1,26 +1,28 @@ - page_title "Commits", @ref += render "header_title" = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "#{@project.name}:#{@ref} commits") = render "head" -.tree-ref-holder - = render 'shared/ref_switcher', destination: 'commits' +.gray-content-block + .tree-ref-holder + = render 'shared/ref_switcher', destination: 'commits' -.commits-feed-holder.hidden-xs.hidden-sm - - if create_mr_button?(@repository.root_ref, @ref) - = link_to create_mr_path(@repository.root_ref, @ref), class: 'btn btn-success' do - = icon('plus') - Create Merge Request + .commits-feed-holder.hidden-xs.hidden-sm + - if create_mr_button?(@repository.root_ref, @ref) + = link_to create_mr_path(@repository.root_ref, @ref), class: 'btn btn-success' do + = icon('plus') + Create Merge Request - - if current_user && current_user.private_token - = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'prepend-left-10 btn' do - = icon("rss") + - if current_user && current_user.private_token + = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'prepend-left-10 btn' do + = icon("rss") -%ul.breadcrumb.repo-breadcrumb - = commits_breadcrumbs + %ul.breadcrumb.repo-breadcrumb + = commits_breadcrumbs %div{id: dom_id(@project)} #commits-list= render "commits", project: @project diff --git a/app/views/projects/compare/_form.html.haml b/app/views/projects/compare/_form.html.haml index 3019893d12..efc25eda26 100644 --- a/app/views/projects/compare/_form.html.haml +++ b/app/views/projects/compare/_form.html.haml @@ -1,5 +1,5 @@ = form_tag namespace_project_compare_index_path(@project.namespace, @project), method: :post, class: 'form-inline js-requires-input' do - .clearfix.append-bottom-20 + .clearfix - if params[:to] && params[:from] = link_to 'switch', {from: params[:to], to: params[:from]}, {class: 'commits-compare-switch has_tooltip', title: 'Switch base of comparison'} .form-group diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml index d1e579a2ed..02be5a2d07 100644 --- a/app/views/projects/compare/index.html.haml +++ b/app/views/projects/compare/index.html.haml @@ -1,9 +1,8 @@ - page_title "Compare" += render "projects/commits/header_title" = render "projects/commits/head" -%h3.page-title - Compare View -%p.slead +.gray-content-block Compare branches, tags or commit ranges. %br Fill input field with commit id like @@ -14,4 +13,5 @@ %br Changes are shown from the version in the first field to the version in the second field. -= render "form" +.prepend-top-20 + = render "form" diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml index 3670dd5c13..39755efd2f 100644 --- a/app/views/projects/compare/show.html.haml +++ b/app/views/projects/compare/show.html.haml @@ -1,16 +1,17 @@ - page_title "#{params[:from]}...#{params[:to]}" += render "projects/commits/header_title" = render "projects/commits/head" -%h3.page-title - Compare View -= render "form" +.gray-content-block + = render "form" - if @commits.present? - = render "projects/commits/commit_list" - = render "projects/diffs/diffs", diffs: @diffs, project: @project + .prepend-top-20 + = render "projects/commits/commit_list" + = render "projects/diffs/diffs", diffs: @diffs, project: @project - else - .light-well + .light-well.prepend-top-20 .center %h4 There isn't anything to compare. diff --git a/app/views/projects/deploy_keys/index.html.haml b/app/views/projects/deploy_keys/index.html.haml index 2e9c5dc08c..8e24c778b7 100644 --- a/app/views/projects/deploy_keys/index.html.haml +++ b/app/views/projects/deploy_keys/index.html.haml @@ -1,4 +1,5 @@ - page_title "Deploy Keys" + %h3.page-title Deploy keys allow read-only access to the repository diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml index 52c1e03040..2f24dc7c90 100644 --- a/app/views/projects/diffs/_diffs.html.haml +++ b/app/views/projects/diffs/_diffs.html.haml @@ -1,5 +1,8 @@ -.prepend-top-20.append-bottom-20 - .pull-right +- if params[:view] == 'parallel' + - fluid_layout true + +.gray-content-block.second-block + .inline-parallel-buttons .btn-group = inline_diff_btn = parallel_diff_btn diff --git a/app/views/projects/diffs/_stats.html.haml b/app/views/projects/diffs/_stats.html.haml index 1625930615..c4d7f26430 100644 --- a/app/views/projects/diffs/_stats.html.haml +++ b/app/views/projects/diffs/_stats.html.haml @@ -10,7 +10,7 @@ and %strong.cred #{@commit.stats.deletions} deletions .file-stats.js-toggle-content.hide - %ul.bordered-list + %ul - diffs.each_with_index do |diff, i| %li - if diff.deleted_file diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index e8e65d87f4..90dce73999 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -1,10 +1,11 @@ +- @blank_container = true + .project-edit-container .project-edit-errors .project-edit-content - %div - %h3.page-title + .panel.panel-default + .panel-heading Project settings - %hr .panel-body = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal fieldset-form" }, authenticity_token: true do |f| diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 798f1c47da..185ebf2393 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -4,7 +4,7 @@ = render "home_panel" -.center.light-well +.gray-content-block.center %h3.page-title The repository for this project is empty %p diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index b7a2ed68e2..cd5f3a5d39 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -10,21 +10,22 @@ - group.each do |namespace| .col-md-2.col-sm-3 - if fork = namespace.find_fork_of(@project) - .thumbnail.fork-exists-thumbnail + .fork-thumbnail = link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do - = image_tag namespace_icon(namespace, 200) + = image_tag namespace_icon(namespace, 100) .caption - %h4=namespace.human_name - %p - = namespace.path + %strong + = namespace.human_name + %div.text-primary + Already forked + - else - .thumbnail.fork-thumbnail + .fork-thumbnail = link_to namespace_project_fork_path(@project.namespace, @project, namespace_key: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do - = image_tag namespace_icon(namespace, 200) + = image_tag namespace_icon(namespace, 100) .caption - %h4=namespace.human_name - %p - = namespace.path + %strong + = namespace.human_name %p.light Fork is a copy of a project repository. diff --git a/app/views/projects/graphs/_header_title.html.haml b/app/views/projects/graphs/_header_title.html.haml new file mode 100644 index 0000000000..1e2f61cd22 --- /dev/null +++ b/app/views/projects/graphs/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Graphs", namespace_project_graph_path(@project.namespace, @project, current_ref)) diff --git a/app/views/projects/graphs/commits.html.haml b/app/views/projects/graphs/commits.html.haml index 141acbdcf7..112be875b6 100644 --- a/app/views/projects/graphs/commits.html.haml +++ b/app/views/projects/graphs/commits.html.haml @@ -1,4 +1,5 @@ -- page_title "Commit statistics" +- page_title "Commits", "Graphs" += render "header_title" .tree-ref-holder = render 'shared/ref_switcher', destination: 'graphs_commits' = render 'head' @@ -31,58 +32,55 @@ %div %p.slead Commits per day of month - %canvas#month-chart{width: 800, height: 400} + %canvas#month-chart .row .col-md-6 %div %p.slead Commits per day hour (UTC) - %canvas#hour-chart{width: 800, height: 400} + %canvas#hour-chart .col-md-6 %div %p.slead Commits per weekday - %canvas#weekday-chart{width: 800, height: 400} + %canvas#weekday-chart :coffeescript - data = { - labels : #{@commits_per_time.keys.to_json}, - datasets : [{ - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", - data : #{@commits_per_time.values.to_json} - }] + responsiveChart = (selector, data) -> + options = { "scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2, maintainAspectRatio: false } + + # get selector by context + ctx = selector.get(0).getContext("2d") + # pointing parent container to make chart.js inherit its width + container = $(selector).parent() + + generateChart = -> + selector.attr('width', $(container).width()) + new Chart(ctx).Bar(data, options) + + # enabling auto-resizing + $(window).resize( generateChart ) + + generateChart() + + chartData = (keys, values) -> + data = { + labels : keys, + datasets : [{ + fillColor : "rgba(220,220,220,0.5)", + strokeColor : "rgba(220,220,220,1)", + barStrokeWidth: 1, + barValueSpacing: 1, + barDatasetSpacing: 1, + data : values + }] } - ctx = $("#hour-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) + hourData = chartData(#{@commits_per_time.keys.to_json}, #{@commits_per_time.values.to_json}) + responsiveChart($('#hour-chart'), hourData) - data = { - labels : #{@commits_per_week_days.keys.to_json}, - datasets : [{ - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", - data : #{@commits_per_week_days.values.to_json} - }] - } + dayData = chartData(#{@commits_per_week_days.keys.to_json}, #{@commits_per_week_days.values.to_json}) + responsiveChart($('#weekday-chart'), dayData) - ctx = $("#weekday-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) - - data = { - labels : #{@commits_per_month.keys.to_json}, - datasets : [{ - fillColor : "rgba(220,220,220,0.5)", - strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", - data : #{@commits_per_month.values.to_json} - }] - } - - ctx = $("#month-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data, {"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) + monthData = chartData(#{@commits_per_month.keys.to_json}, #{@commits_per_month.values.to_json}) + responsiveChart($('#month-chart'), monthData) diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml index ecdd0eaf52..bd342911e4 100644 --- a/app/views/projects/graphs/show.html.haml +++ b/app/views/projects/graphs/show.html.haml @@ -1,4 +1,5 @@ -- page_title "Contributor statistics" +- page_title "Contributors", "Graphs" += render "header_title" .tree-ref-holder = render 'shared/ref_switcher', destination: 'graphs' = render 'head' diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml index eadbf61fdd..85dbfd6786 100644 --- a/app/views/projects/hooks/index.html.haml +++ b/app/views/projects/hooks/index.html.haml @@ -55,6 +55,13 @@ %strong Merge Request events %p.light This url will be triggered when a merge request is created + .form-group + = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox' + .col-sm-10 + .checkbox + = f.label :enable_ssl_verification do + = f.check_box :enable_ssl_verification + %strong Enable SSL verification .form-actions = f.submit "Add Web Hook", class: "btn btn-create" @@ -74,3 +81,4 @@ - %w(push_events tag_push_events issues_events note_events merge_requests_events).each do |trigger| - if hook.send(trigger) %span.label.label-gray= trigger.titleize + SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"} diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 39fe0fc1c4..06886d215a 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -3,8 +3,12 @@ .center %h2 %i.fa.fa-spinner.fa-spin - Import in progress. - %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} + - if @project.forked? + Forking in progress. + - else + Import in progress. + - unless @project.forked? + %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} %p Please wait while we import the repository for you. Refresh at will. :javascript new ProjectImport(); diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index f61ae95720..d4a98eca47 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -7,21 +7,24 @@ = render 'shared/show_aside' +.gray-content-block.second-block + .row + .col-md-9 + .votes-holder.pull-right + #votes= render 'votes/votes_block', votable: @issue + .participants + %span= pluralize(@participants.count, 'participant') + - @participants.each do |participant| + = link_to_member(@project, participant, name: false, size: 24) + .col-md-3 + %span.slead.has_tooltip{title: 'Cross-project reference'} + = cross_project_reference(@project, @issue) + .row %section.col-md-9 - .votes-holder.pull-right - #votes= render 'votes/votes_block', votable: @issue - .participants - %span= pluralize(@participants.count, 'participant') - - @participants.each do |participant| - = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render 'projects/notes/notes_with_form' %aside.col-md-3 .issuable-affix - .clearfix - %span.slead.has_tooltip{title: 'Cross-project reference'} - = cross_project_reference(@project, @issue) - %hr .context = render 'shared/issuable/context', issuable: @issue diff --git a/app/views/projects/issues/_header_title.html.haml b/app/views/projects/issues/_header_title.html.haml new file mode 100644 index 0000000000..99f03549c4 --- /dev/null +++ b/app/views/projects/issues/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Issues", namespace_project_issues_path(@project.namespace, @project)) diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index b6910c8f79..55ce912829 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -41,4 +41,4 @@ = issue.task_status .pull-right.issue-updated-at - %small updated #{time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago')} + %span updated #{time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago')} diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 5d243adb5f..a3399c57aa 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,9 +1,8 @@ -.panel.panel-default - %ul.well-list.issues-list - = render @issues - - if @issues.blank? - %li - .nothing-here-block No issues to show +%ul.content-list.issues-list + = render @issues + - if @issues.blank? + %li + .nothing-here-block No issues to show - if @issues.present? .pull-right diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index d06225f548..d6260ab290 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -1,10 +1,12 @@ - page_title "Issues" += render "header_title" + = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_issues_url(@project.namespace, @project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") -.append-bottom-10 - .pull-right +.project-issuable-filter + .controls .pull-left - if current_user .hidden-xs.pull-left diff --git a/app/views/projects/issues/new.html.haml b/app/views/projects/issues/new.html.haml index da6edd5c2d..153447baa1 100644 --- a/app/views/projects/issues/new.html.haml +++ b/app/views/projects/issues/new.html.haml @@ -1,2 +1,4 @@ - page_title "New Issue" += render "header_title" + = render "form" diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index e7b14e7582..5cb814c9ea 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,15 +1,18 @@ - page_title "#{@issue.title} (##{@issue.iid})", "Issues" += render "header_title" + .issue .issue-details.issuable-details - %h4.page-title + .page-title .issue-box{ class: issue_box_class(@issue) } - if @issue.closed? Closed - else Open - Issue ##{@issue.iid} - %small.creator - · created by #{link_to_member(@project, @issue.author)} + %span.issue-id Issue ##{@issue.iid} + %span.creator + · created by #{link_to_member(@project, @issue.author, size: 24)} + · = time_ago_with_tooltip(@issue.created_at, placement: 'bottom', html_class: 'issue_created_ago') - if @issue.updated_at != @issue.created_at %span @@ -32,18 +35,17 @@ = icon('pencil-square-o') Edit - %hr - %h2.issue-title - = gfm escape_once(@issue.title) - %div - - if @issue.description.present? - .description{class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : ''} - .wiki - = preserve do - = markdown(@issue.description) - %textarea.hidden.js-task-list-field - = @issue.description + .gray-content-block.middle-block + %h2.issue-title + = gfm escape_once(@issue.title) + %div + - if @issue.description.present? + .description{class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : ''} + .wiki + = preserve do + = markdown(@issue.description) + %textarea.hidden.js-task-list-field + = @issue.description - %hr .issue-discussion = render 'projects/issues/discussion' diff --git a/app/views/projects/labels/_header_title.html.haml b/app/views/projects/labels/_header_title.html.haml new file mode 100644 index 0000000000..abe28da483 --- /dev/null +++ b/app/views/projects/labels/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Labels", namespace_project_labels_path(@project.namespace, @project)) diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml index 645402667f..bc4ab0ca27 100644 --- a/app/views/projects/labels/edit.html.haml +++ b/app/views/projects/labels/edit.html.haml @@ -1,4 +1,6 @@ - page_title "Edit", @label.name, "Labels" += render "header_title" + %h3 Edit label %span.light #{@label.name} diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index d44fe48621..97175f8232 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -1,14 +1,16 @@ - page_title "Labels" -- if can? current_user, :admin_label, @project - = link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do - New label -%h3.page-title - Labels -%hr += render "header_title" + +.gray-content-block.top-block + - if can? current_user, :admin_label, @project + = link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do + New label + .oneline + Labels can be applied to issues and merge requests. .labels - if @labels.present? - %ul.bordered-list.manage-labels-list + %ul.content-list.manage-labels-list = render @labels = paginate @labels, theme: 'gitlab' - else diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml index b3ef17025c..342ad4f3f9 100644 --- a/app/views/projects/labels/new.html.haml +++ b/app/views/projects/labels/new.html.haml @@ -1,4 +1,6 @@ - page_title "New Label" += render "header_title" + %h3 New label .back-link = link_to namespace_project_labels_path(@project.namespace, @project) do diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index f855dfec32..38e66c3828 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -7,18 +7,21 @@ = render 'shared/show_aside' +.gray-content-block.second-block + .row + .col-md-9 + .votes-holder.pull-right + #votes= render 'votes/votes_block', votable: @merge_request + = render "projects/merge_requests/show/participants" + .col-md-3 + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + .row %section.col-md-9 - .votes-holder.pull-right - #votes= render 'votes/votes_block', votable: @merge_request - = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" %aside.col-md-3 .issuable-affix - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @merge_request) - %hr .context = render 'shared/issuable/context', issuable: @merge_request diff --git a/app/views/projects/merge_requests/_header_title.html.haml b/app/views/projects/merge_requests/_header_title.html.haml new file mode 100644 index 0000000000..669a9b06bd --- /dev/null +++ b/app/views/projects/merge_requests/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Merge Requests", namespace_project_merge_requests_path(@project.namespace, @project)) diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 0bcd543fee..25e4e8ba80 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -14,11 +14,6 @@ %span %i.fa.fa-ban CLOSED - - else - %span.hidden-xs.hidden-sm - %span.label-branch< - %i.fa.fa-code-fork - %span= merge_request.target_branch - note_count = merge_request.mr_and_commit_notes.user.count - if merge_request.assignee   @@ -48,4 +43,4 @@ = merge_request.task_status .pull-right.hidden-xs - %small updated #{time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago')} + %span updated #{time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago')} diff --git a/app/views/projects/merge_requests/_merge_requests.html.haml b/app/views/projects/merge_requests/_merge_requests.html.haml index b8a0ca9a42..d86707b3d9 100644 --- a/app/views/projects/merge_requests/_merge_requests.html.haml +++ b/app/views/projects/merge_requests/_merge_requests.html.haml @@ -1,9 +1,8 @@ -.panel.panel-default - %ul.well-list.mr-list - = render @merge_requests - - if @merge_requests.blank? - %li - .nothing-here-block No merge requests to show +%ul.content-list.mr-list + = render @merge_requests + - if @merge_requests.blank? + %li + .nothing-here-block No merge requests to show - if @merge_requests.present? .pull-right diff --git a/app/views/projects/merge_requests/_new_compare.html.haml b/app/views/projects/merge_requests/_new_compare.html.haml index ff9c0cdb28..452006162d 100644 --- a/app/views/projects/merge_requests/_new_compare.html.haml +++ b/app/views/projects/merge_requests/_new_compare.html.haml @@ -35,9 +35,9 @@ - if @merge_request.compare_failed .alert.alert-danger %h4 Compare failed - %p We can't compare selected branches. It may be because of huge diff or satellite timeout. Please try again or select different branches. + %p We can't compare selected branches. It may be because of huge diff. Please try again or select different branches. - else - .light-well + .light-well.append-bottom-10 .center %h4 There isn't anything to merge. diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 633a54f362..46aeecd873 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -18,22 +18,20 @@ = f.hidden_field :target_branch .mr-compare.merge-request - %ul.nav.nav-tabs.merge-request-tabs + %ul.merge-request-tabs %li.commits-tab = link_to url_for(params), data: {target: '#commits', action: 'commits', toggle: 'tab'} do - = icon('history') Commits %span.badge= @commits.size - %li.diffs-tab + %li.diffs-tab.active = link_to url_for(params), data: {target: '#diffs', action: 'diffs', toggle: 'tab'} do - = icon('list-alt') Changes %span.badge= @diffs.size .tab-content #commits.commits.tab-pane = render "projects/commits/commits", project: @project - #diffs.diffs.tab-pane + #diffs.diffs.tab-pane.active - if @diffs.present? = render "projects/diffs/diffs", diffs: @diffs, project: @project - elsif @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 007f6c6a78..0b0f52c653 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -1,11 +1,14 @@ - page_title "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" += render "header_title" + +- if params[:view] == 'parallel' + - fluid_layout true + .merge-request{'data-url' => merge_request_path(@merge_request)} .merge-request-details.issuable-details = render "projects/merge_requests/show/mr_title" - %hr = render "projects/merge_requests/show/mr_box" - %hr - .append-bottom-20.mr-source-target + .append-bottom-20.mr-source-target.prepend-top-default - if @merge_request.open? .pull-right - if @merge_request.source_branch_exists? @@ -36,20 +39,17 @@ = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" - if @commits.present? - %ul.nav.nav-tabs.merge-request-tabs + %ul.merge-request-tabs %li.notes-tab = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#notes', action: 'notes', toggle: 'tab'} do - = icon('comments') Discussion %span.badge= @merge_request.mr_and_commit_notes.user.count %li.commits-tab = link_to commits_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#commits', action: 'commits', toggle: 'tab'} do - = icon('history') Commits %span.badge= @commits.size %li.diffs-tab = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#diffs', action: 'diffs', toggle: 'tab'} do - = icon('list-alt') Changes %span.badge= @merge_request.diffs.size diff --git a/app/views/projects/merge_requests/edit.html.haml b/app/views/projects/merge_requests/edit.html.haml index 7e5cb07f24..303ca0a880 100644 --- a/app/views/projects/merge_requests/edit.html.haml +++ b/app/views/projects/merge_requests/edit.html.haml @@ -1,4 +1,6 @@ - page_title "Edit", "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" += render "header_title" + %h3.page-title = "Edit merge request ##{@merge_request.iid}" %hr diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 72fbe2e27a..086298e5af 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,7 +1,9 @@ - page_title "Merge Requests" += render "header_title" + = render 'projects/last_push' -.append-bottom-10 - .pull-right +.project-issuable-filter + .controls = render 'shared/issuable/search_form', path: namespace_project_merge_requests_path(@project.namespace, @project) - if can? current_user, :create_merge_request, @project diff --git a/app/views/projects/merge_requests/invalid.html.haml b/app/views/projects/merge_requests/invalid.html.haml index 15bd4e2faf..fc03ee73a3 100644 --- a/app/views/projects/merge_requests/invalid.html.haml +++ b/app/views/projects/merge_requests/invalid.html.haml @@ -1,4 +1,6 @@ - page_title "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests" += render "header_title" + .merge-request = render "projects/merge_requests/show/mr_title" = render "projects/merge_requests/show/mr_box" diff --git a/app/views/projects/merge_requests/automerge.js.haml b/app/views/projects/merge_requests/merge.js.haml similarity index 100% rename from app/views/projects/merge_requests/automerge.js.haml rename to app/views/projects/merge_requests/merge.js.haml diff --git a/app/views/projects/merge_requests/new.html.haml b/app/views/projects/merge_requests/new.html.haml index b038a640f6..9fdde80c6d 100644 --- a/app/views/projects/merge_requests/new.html.haml +++ b/app/views/projects/merge_requests/new.html.haml @@ -1,4 +1,6 @@ - page_title "New Merge Request" += render "header_title" + - if @merge_request.can_be_created = render 'new_submit' - else diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml index 3b7f283daf..a71b181a6a 100644 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ b/app/views/projects/merge_requests/show/_commits.html.haml @@ -1 +1 @@ -= render "projects/commits/commits", project: @merge_request.source_project += render "projects/commits/commits", project: @merge_request.project diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml index 786b5f3906..626970f39b 100644 --- a/app/views/projects/merge_requests/show/_diffs.html.haml +++ b/app/views/projects/merge_requests/show/_diffs.html.haml @@ -1,5 +1,5 @@ - if @merge_request_diff.collected? - = render "projects/diffs/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project + = render "projects/diffs/diffs", diffs: @merge_request.diffs, project: @merge_request.project - elsif @merge_request_diff.empty? .nothing-here-block Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch} - else diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml index e3cd434687..b4f62a7589 100644 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ b/app/views/projects/merge_requests/show/_mr_box.html.haml @@ -1,11 +1,12 @@ -%h2.issue-title - = gfm escape_once(@merge_request.title) +.gray-content-block.middle-block + %h2.issue-title + = gfm escape_once(@merge_request.title) -%div - - if @merge_request.description.present? - .description{class: can?(current_user, :update_merge_request, @merge_request) ? 'js-task-list-container' : ''} - .wiki - = preserve do - = markdown(@merge_request.description) - %textarea.hidden.js-task-list-field - = @merge_request.description + %div + - if @merge_request.description.present? + .description{class: can?(current_user, :update_merge_request, @merge_request) ? 'js-task-list-container' : ''} + .wiki + = preserve do + = markdown(@merge_request.description) + %textarea.hidden.js-task-list-field + = @merge_request.description diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index 9a1eb36fc8..2bf9cd597a 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -1,10 +1,11 @@ -%h4.page-title +.page-title .issue-box{ class: issue_box_class(@merge_request) } = @merge_request.state_human_name - Merge Request ##{@merge_request.iid} - %small.creator + %span.issue-id Merge Request ##{@merge_request.iid} + %span.creator + · + created by #{link_to_member(@project, @merge_request.author, size: 24)} · - created by #{link_to_member(@project, @merge_request.author)} = time_ago_with_tooltip(@merge_request.created_at) - if @merge_request.updated_at != @merge_request.created_at %span diff --git a/app/views/projects/merge_requests/widget/_heading.html.haml b/app/views/projects/merge_requests/widget/_heading.html.haml index 4d4e2f68f6..10640f746f 100644 --- a/app/views/projects/merge_requests/widget/_heading.html.haml +++ b/app/views/projects/merge_requests/widget/_heading.html.haml @@ -10,7 +10,8 @@ %span CI build #{status} for #{@merge_request.last_commit_short_sha}. %span.ci-coverage - = link_to "View build details", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" + - if ci_build_details_path(@merge_request) + = link_to "View build details", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" .ci_widget = icon("spinner spin") diff --git a/app/views/projects/merge_requests/widget/_open.html.haml b/app/views/projects/merge_requests/widget/_open.html.haml index 8c61e81937..0aad9bb3e8 100644 --- a/app/views/projects/merge_requests/widget/_open.html.haml +++ b/app/views/projects/merge_requests/widget/_open.html.haml @@ -3,8 +3,6 @@ .mr-widget-body - if @project.archived? = render 'projects/merge_requests/widget/open/archived' - - elsif !@project.satellite.exists? - = render 'projects/merge_requests/widget/open/no_satellite' - elsif @merge_request.commits.blank? = render 'projects/merge_requests/widget/open/nothing' - elsif @merge_request.branch_missing? diff --git a/app/views/projects/merge_requests/widget/_show.html.haml b/app/views/projects/merge_requests/widget/_show.html.haml index 263cab7a9e..a489d4f9b2 100644 --- a/app/views/projects/merge_requests/widget/_show.html.haml +++ b/app/views/projects/merge_requests/widget/_show.html.haml @@ -11,10 +11,10 @@ var merge_request_widget; merge_request_widget = new MergeRequestWidget({ - url_to_automerge_check: "#{automerge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", + url_to_automerge_check: "#{merge_check_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", check_enable: #{@merge_request.unchecked? ? "true" : "false"}, url_to_ci_check: "#{ci_status_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}", ci_enable: #{@project.ci_service ? "true" : "false"}, - current_status: "#{@merge_request.automerge_status}", + current_status: "#{@merge_request.gitlab_merge_status}", }); diff --git a/app/views/projects/merge_requests/widget/open/_accept.html.haml b/app/views/projects/merge_requests/widget/open/_accept.html.haml index df20205de1..613525437a 100644 --- a/app/views/projects/merge_requests/widget/open/_accept.html.haml +++ b/app/views/projects/merge_requests/widget/open/_accept.html.haml @@ -1,4 +1,4 @@ -= form_for [:automerge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post, html: { class: 'accept-mr-form js-requires-input' } do |f| += form_for [:merge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post, html: { class: 'accept-mr-form js-requires-input' } do |f| = hidden_field_tag :authenticity_token, form_authenticity_token .accept-merge-holder.clearfix.js-toggle-container .accept-action @@ -9,7 +9,7 @@ = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do = check_box_tag :should_remove_source_branch Remove source branch - .accept-control + .accept-control.right = link_to "#", class: "modify-merge-commit-link js-toggle-button" do = icon('edit') Modify commit message diff --git a/app/views/projects/merge_requests/widget/open/_no_satellite.html.haml b/app/views/projects/merge_requests/widget/open/_no_satellite.html.haml deleted file mode 100644 index 3718cfd833..0000000000 --- a/app/views/projects/merge_requests/widget/open/_no_satellite.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%p - %span - %strong This repository does not have a satellite. Please ask an administrator to fix this issue! diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index b93462e5bd..74e9668052 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -21,7 +21,7 @@ .form-group.milestone-description = f.label :description, "Description", class: "control-label" .col-sm-10 - = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do + = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .hint .pull-left Milestones are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'}. diff --git a/app/views/projects/milestones/_header_title.html.haml b/app/views/projects/milestones/_header_title.html.haml new file mode 100644 index 0000000000..5f4b6982a6 --- /dev/null +++ b/app/views/projects/milestones/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Milestones", namespace_project_milestones_path(@project.namespace, @project)) diff --git a/app/views/projects/milestones/_milestone.html.haml b/app/views/projects/milestones/_milestone.html.haml index 2ce5358fa7..5e93d55b1f 100644 --- a/app/views/projects/milestones/_milestone.html.haml +++ b/app/views/projects/milestones/_milestone.html.haml @@ -1,28 +1,34 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone) } - .pull-right - - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? - = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-sm edit-milestone-link btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-sm btn-close" - = link_to namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-sm btn-remove" do - %i.fa.fa-trash-o - Remove + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - %h4 - = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - - if milestone.expired? and not milestone.closed? - %span.cred (Expired) - %small - = milestone.expires_at + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to namespace_project_issues_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.issues.count, 'Issue' -   + · = link_to namespace_project_merge_requests_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.merge_requests.count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete .col-sm-6 = milestone_progress_bar(milestone) + + .row + .col-sm-6 + - if milestone.expired? and not milestone.closed? + %span.cred (Expired) + - if milestone.expires_at + %span + = milestone.expires_at + .col-sm-6 + - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? + = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-xs edit-milestone-link btn-grouped" do + %i.fa.fa-pencil-square-o + Edit + = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-xs btn-close" + = link_to namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-xs btn-remove" do + %i.fa.fa-trash-o + Remove diff --git a/app/views/projects/milestones/edit.html.haml b/app/views/projects/milestones/edit.html.haml index c09815a212..e9dc0b7746 100644 --- a/app/views/projects/milestones/edit.html.haml +++ b/app/views/projects/milestones/edit.html.haml @@ -1,2 +1,3 @@ - page_title "Edit", @milestone.title, "Milestones" += render "header_title" = render "form" diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 995eecd783..a207385bd4 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,18 +1,22 @@ - page_title "Milestones" -.pull-right - - if can? current_user, :admin_milestone, @project - = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do - %i.fa.fa-plus - New Milestone += render "header_title" = render 'shared/milestones_filter' -.milestones - .panel.panel-default - %ul.well-list - = render @milestones +.gray-content-block + .pull-right + - if can? current_user, :admin_milestone, @project + = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do + %i.fa.fa-plus + New Milestone + .oneline + Milestone allows you to group issues and set due date for it - - if @milestones.blank? - %li - .nothing-here-block No milestones to show +.milestones + %ul.content-list + = render @milestones + + - if @milestones.blank? + %li + .nothing-here-block No milestones to show = paginate @milestones, theme: "gitlab" diff --git a/app/views/projects/milestones/new.html.haml b/app/views/projects/milestones/new.html.haml index 47149dfea4..9ba9acb6f7 100644 --- a/app/views/projects/milestones/new.html.haml +++ b/app/views/projects/milestones/new.html.haml @@ -1,2 +1,3 @@ - page_title "New Milestone" += render "header_title" = render "form" diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml index 7b1681df33..4eeb0621e5 100644 --- a/app/views/projects/milestones/show.html.haml +++ b/app/views/projects/milestones/show.html.haml @@ -1,4 +1,6 @@ - page_title @milestone.title, "Milestones" += render "header_title" + %h4.page-title .issue-box{ class: issue_box_class(@milestone) } - if @milestone.closed? diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml index 52b5b8b877..16005161df 100644 --- a/app/views/projects/network/show.html.haml +++ b/app/views/projects/network/show.html.haml @@ -1,4 +1,5 @@ - page_title "Network", @ref += header_title project_title(@project, "Network", namespace_project_network_path(@project.namespace, @project, current_ref)) = render "head" .project-network .controls diff --git a/app/views/projects/network/show.json.erb b/app/views/projects/network/show.json.erb index dc82adcb2c..122e84b41b 100644 --- a/app/views/projects/network/show.json.erb +++ b/app/views/projects/network/show.json.erb @@ -9,7 +9,7 @@ author: { name: c.author_name, email: c.author_email, - icon: avatar_icon(c.author_email, 20) + icon: image_path(avatar_icon(c.author_email, 20)) }, time: c.time, space: c.spaces.first, diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index d25fe68242..bccea21e7a 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -22,70 +22,80 @@ .col-sm-10 = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'select2', tabindex: 2} - %hr + - if import_sources_enabled? + %hr - .project-import.js-toggle-container - .form-group - %label.control-label Import project from - .col-sm-10 - - if github_import_enabled? - = link_to status_import_github_path, class: 'btn' do - %i.fa.fa-github - GitHub - - else - = link_to '#', class: 'how_to_import_link light btn' do - %i.fa.fa-github - GitHub - = render 'github_import_modal' - - - - if bitbucket_import_enabled? - = link_to status_import_bitbucket_path, class: 'btn', "data-no-turbolink" => "true" do - %i.fa.fa-bitbucket - Bitbucket - - else - = link_to '#', class: 'how_to_import_link light btn' do - %i.fa.fa-bitbucket - Bitbucket - = render 'bitbucket_import_modal' - - - unless request.host == 'gitlab.com' - - if gitlab_import_enabled? - = link_to status_import_gitlab_path, class: 'btn' do - %i.fa.fa-heart - GitLab.com - - else - = link_to '#', class: 'how_to_import_link light btn' do - %i.fa.fa-heart - GitLab.com - = render 'gitlab_import_modal' - - = link_to new_import_gitorious_path, class: 'btn' do - %i.icon-gitorious.icon-gitorious-small - Gitorious.org - - = link_to new_import_google_code_path, class: 'btn' do - %i.fa.fa-google - Google Code - - = link_to "#", class: 'btn js-toggle-button' do - %i.fa.fa-git - %span Any repo by URL - - .js-toggle-content.hide - .form-group.import-url-data - = f.label :import_url, class: 'control-label' do - %span Git repository URL + .project-import.js-toggle-container + .form-group + %label.control-label Import project from .col-sm-10 - = f.text_field :import_url, class: 'form-control', placeholder: 'https://username:password@gitlab.company.com/group/project.git' - .well.prepend-top-20 - %ul - %li - The repository must be accessible over HTTP(S). If it is not publicly accessible, you can add authentication information to the URL: https://username:password@gitlab.company.com/group/project.git. - %li - The import will time out after 4 minutes. For big repositories, use a clone/push combination. - %li - To migrate an SVN repository, check out #{link_to "this document", "http://doc.gitlab.com/ce/workflow/importing/migrating_from_svn.html"}. + - if github_import_enabled? + - if github_import_configured? + = link_to status_import_github_path, class: 'btn import_github' do + %i.fa.fa-github + GitHub + - else + = link_to '#', class: 'how_to_import_link light btn import_github' do + %i.fa.fa-github + GitHub + = render 'github_import_modal' + + - if bitbucket_import_enabled? + - if bitbucket_import_configured? + = link_to status_import_bitbucket_path, class: 'btn import_bitbucket', "data-no-turbolink" => "true" do + %i.fa.fa-bitbucket + Bitbucket + - else + = link_to status_import_bitbucket_path, class: 'how_to_import_link light btn import_bitbucket', "data-no-turbolink" => "true" do + %i.fa.fa-bitbucket + Bitbucket + = render 'bitbucket_import_modal' + + - if gitlab_import_enabled? + - if gitlab_import_configured? + = link_to status_import_gitlab_path, class: 'btn import_gitlab' do + %i.fa.fa-heart + GitLab.com + - else + = link_to status_import_gitlab_path, class: 'how_to_import_link light btn import_gitlab' do + %i.fa.fa-heart + GitLab.com + = render 'gitlab_import_modal' + + - if gitorious_import_enabled? + = link_to new_import_gitorious_path, class: 'btn import_gitorious' do + %i.icon-gitorious.icon-gitorious-small + Gitorious.org + + - if google_code_import_enabled? + = link_to new_import_google_code_path, class: 'btn import_google_code' do + %i.fa.fa-google + Google Code + + - if fogbugz_import_enabled? + = link_to new_import_fogbugz_path, class: 'btn import_fogbugz' do + %i.fa.fa-bug + Fogbugz + + - if git_import_enabled? + = link_to "#", class: 'btn js-toggle-button import_git' do + %i.fa.fa-git + %span Any repo by URL + + .js-toggle-content.hide + .form-group.import-url-data + = f.label :import_url, class: 'control-label' do + %span Git repository URL + .col-sm-10 + = f.text_field :import_url, class: 'form-control', placeholder: 'https://username:password@gitlab.company.com/group/project.git' + .well.prepend-top-20 + %ul + %li + The repository must be accessible over HTTP(S). If it is not publicly accessible, you can add authentication information to the URL: https://username:password@gitlab.company.com/group/project.git. + %li + The import will time out after 4 minutes. For big repositories, use a clone/push combination. + %li + To migrate an SVN repository, check out #{link_to "this document", "http://doc.gitlab.com/ce/workflow/importing/migrating_from_svn.html"}. %hr.prepend-botton-10 diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index 8f7d2e84c7..a0e26f9827 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -1,7 +1,7 @@ .note-edit-form = form_for note, url: namespace_project_note_path(@project.namespace, @project, note), method: :put, remote: true, authenticity_token: true do |f| = note_target_fields(note) - = render layout: 'projects/md_preview', locals: { preview_class: 'note-text' } do + = render layout: 'projects/md_preview', locals: { preview_class: 'md-preview' } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text js-task-list-field' = render 'projects/notes/hints' diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 3be8f44b28..d99445da59 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -7,7 +7,7 @@ = f.hidden_field :noteable_id = f.hidden_field :noteable_type - = render layout: 'projects/md_preview', locals: { preview_class: "note-text", referenced_users: true } do + = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :note, classes: 'note_text js-note-text' = render 'projects/notes/hints' .error-alert diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index de75d44fc4..9bfbde02ca 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -1,11 +1,8 @@ %li.timeline-entry{ id: dom_id(note), class: [dom_class(note), "note-row-#{note.id}", ('system-note' if note.system)], data: { discussion: note.discussion_id } } .timeline-entry-inner .timeline-icon - - if note.system - %span= icon('circle') - - else - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: 'avatar s40', alt: '' + = link_to user_path(note.author) do + = image_tag avatar_icon(note.author_email), class: 'avatar s40', alt: '' .timeline-content .note-header - if note_editable?(note) @@ -22,10 +19,6 @@ %span.note-role.label = member.human_access - - if note.system - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: 'avatar s16', alt: '' - = link_to_member(note.project, note.author, avatar: false) %span.author-username diff --git a/app/views/projects/project_members/_header_title.html.haml b/app/views/projects/project_members/_header_title.html.haml new file mode 100644 index 0000000000..a31f0a37fa --- /dev/null +++ b/app/views/projects/project_members/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Members", namespace_project_project_members_path(@project.namespace, @project)) diff --git a/app/views/projects/project_members/import.html.haml b/app/views/projects/project_members/import.html.haml index 6914543f6d..189906498c 100644 --- a/app/views/projects/project_members/import.html.haml +++ b/app/views/projects/project_members/import.html.haml @@ -1,4 +1,6 @@ - page_title "Import members" += render "header_title" + %h3.page-title Import members from another project %p.light diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml index 162583e4b1..9a0a824b81 100644 --- a/app/views/projects/project_members/index.html.haml +++ b/app/views/projects/project_members/index.html.haml @@ -1,30 +1,29 @@ - page_title "Members" -%h3.page-title - Users with access to this project += render "header_title" -%p.light +.gray-content-block.top-block + .clearfix.js-toggle-container + = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do + .form-group + = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' } + = button_tag 'Search', class: 'btn' + + - if can?(current_user, :admin_project_member, @project) + %span.pull-right + = button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do + Add members + %i.fa.fa-chevron-down + = link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do + Import members + + .js-toggle-content.hide.new-group-member-holder + = render "new_project_member" + +%p.prepend-top-default.light + Users with access to this project are listed below. Read more about project permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" -%hr - -.clearfix.js-toggle-container - = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do - .form-group - = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' } - = button_tag 'Search', class: 'btn' - - - if can?(current_user, :admin_project_member, @project) - %span.pull-right - = button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do - Add members - %i.fa.fa-chevron-down - = link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do - Import members - - .js-toggle-content.hide.new-group-member-holder - = render "new_project_member" - = render "team", members: @project_members - if @group diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index ebbd3e477f..6a5fc68980 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -11,10 +11,10 @@ = render "home_panel" -.project-stats +.project-stats.gray-content-block %ul.nav.nav-pills %li - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do + = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do = pluralize(number_with_delimiter(@project.commit_count), 'commit') %li = link_to namespace_project_branches_path(@project.namespace, @project) do @@ -23,6 +23,10 @@ = link_to namespace_project_tags_path(@project.namespace, @project) do = pluralize(number_with_delimiter(@repository.tag_names.count), 'tag') + %li + = link_to project_files_path(@project) do + = repository_size + - if !prefer_readme? && @repository.readme %li = link_to 'Readme', readme_path(@project) @@ -59,21 +63,22 @@ = icon("exclamation-triangle fw") Archived project! Repository is read-only -%hr %section - if prefer_readme? - = render 'projects/readme' + .project-show-readme + = render 'projects/readme' - else - = render 'projects/activity' + .project-show-activity + = render 'projects/activity' - if current_user - access = user_max_access_in_project(current_user, @project) - if access - %hr - %p.light - You have #{access} access to this project. - - if @project.project_member_by_id(current_user) - = link_to leave_namespace_project_project_members_path(@project.namespace, @project), - data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project', class: 'cred' do - Leave this project + .prepend-top-20 + .gray-content-block.footer-block.center + You have #{access} access to this project. + - if @project.project_member_by_id(current_user) + = link_to leave_namespace_project_project_members_path(@project.namespace, @project), + data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project', class: 'cred' do + Leave this project diff --git a/app/views/projects/snippets/_header_title.html.haml b/app/views/projects/snippets/_header_title.html.haml new file mode 100644 index 0000000000..04f0bbe985 --- /dev/null +++ b/app/views/projects/snippets/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, "Snippets", namespace_project_snippets_path(@project.namespace, @project)) diff --git a/app/views/projects/snippets/_snippet.html.haml b/app/views/projects/snippets/_snippet.html.haml deleted file mode 100644 index b2c35edc44..0000000000 --- a/app/views/projects/snippets/_snippet.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -%li - %h4.snippet-title - = link_to reliable_snippet_path(snippet) do - = truncate(snippet.title, length: 60) - %span.cgray.monospace.tiny.pull-right - = snippet.file_name - - .snippet-info - = "##{snippet.id}" - %span - by - = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16" - = snippet.author_name - %span.light - #{time_ago_with_tooltip(snippet.created_at)} diff --git a/app/views/projects/snippets/edit.html.haml b/app/views/projects/snippets/edit.html.haml index 945f0084df..e69f2d9970 100644 --- a/app/views/projects/snippets/edit.html.haml +++ b/app/views/projects/snippets/edit.html.haml @@ -1,4 +1,6 @@ - page_title "Edit", @snippet.title, "Snippets" += render "header_title" + %h3.page-title Edit snippet %hr diff --git a/app/views/projects/snippets/index.html.haml b/app/views/projects/snippets/index.html.haml index 30081673ff..3fed2c9949 100644 --- a/app/views/projects/snippets/index.html.haml +++ b/app/views/projects/snippets/index.html.haml @@ -1,4 +1,6 @@ - page_title "Snippets" += render "header_title" + %h3.page-title Snippets - if can? current_user, :create_project_snippet, @project @@ -8,9 +10,8 @@ %p.light Share code pastes with others out of git repository -%hr %ul.bordered-list - = render partial: "projects/snippets/snippet", collection: @snippets + = render partial: "shared/snippets/snippet", collection: @snippets - if @snippets.empty? %li .nothing-here-block Nothing here. diff --git a/app/views/projects/snippets/new.html.haml b/app/views/projects/snippets/new.html.haml index e38d95c45e..67cd69fd21 100644 --- a/app/views/projects/snippets/new.html.haml +++ b/app/views/projects/snippets/new.html.haml @@ -1,4 +1,6 @@ - page_title "New Snippets" += render "header_title" + %h3.page-title New snippet %hr diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml index 8cbb813c75..be7d4d486f 100644 --- a/app/views/projects/snippets/show.html.haml +++ b/app/views/projects/snippets/show.html.haml @@ -1,4 +1,6 @@ - page_title @snippet.title, "Snippets" += render "header_title" + %h3.page-title = @snippet.title diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 28ad272322..2ca295fc5f 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -1,13 +1,14 @@ - commit = @repository.commit(tag.target) %li - %h4 + %div = link_to namespace_project_commits_path(@project.namespace, @project, tag.name), class: "" do - %i.fa.fa-tag - = tag.name + %strong + %i.fa.fa-tag + = tag.name - if tag.message.present?   = strip_gpg_signature(tag.message) - .pull-right + .controls - if can? current_user, :download_code, @project = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'btn-grouped btn-group-xs' - if can?(current_user, :admin_project, @project) @@ -15,8 +16,7 @@ %i.fa.fa-trash-o - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project + = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this tag diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index d4652a47cb..85d76eae3b 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -1,21 +1,19 @@ - page_title "Tags" += render "projects/commits/header_title" = render "projects/commits/head" -%h3.page-title - Git Tags +.gray-content-block - if can? current_user, :push_code, @project .pull-right = link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do %i.fa.fa-add-sign New tag - -%p.light - Tags give the ability to mark specific points in history as being important -%hr + .oneline + Tags give the ability to mark specific points in history as being important .tags - unless @tags.empty? - %ul.bordered-list + %ul.content-list - @tags.each do |tag| = render 'tag', tag: @repository.find_tag(tag) diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml index 172fafdeef..9f5c1be125 100644 --- a/app/views/projects/tags/new.html.haml +++ b/app/views/projects/tags/new.html.haml @@ -1,4 +1,6 @@ - page_title "New Tag" += render "projects/commits/header_title" + - if @error .alert.alert-danger %button{ type: "button", class: "close", "data-dismiss" => "alert"} × diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml index 5048154cb2..367a87927d 100644 --- a/app/views/projects/tree/_tree.html.haml +++ b/app/views/projects/tree/_tree.html.haml @@ -14,7 +14,7 @@ %small %i.fa.fa-plus -%div#tree-content-holder.tree-content-holder +%div#tree-content-holder.tree-content-holder.prepend-top-20 %table#tree-slider{class: "table_#{@hex_path} tree-table" } %thead %tr diff --git a/app/views/projects/tree/show.html.haml b/app/views/projects/tree/show.html.haml index c9e59428e7..dec4677f83 100644 --- a/app/views/projects/tree/show.html.haml +++ b/app/views/projects/tree/show.html.haml @@ -1,4 +1,5 @@ - page_title @path.presence || "Files", @ref +- header_title project_title(@project, "Files", project_files_path(@project)) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "#{@project.name}:#{@ref} commits") diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml index 904600499a..05d754adbe 100644 --- a/app/views/projects/wikis/_form.html.haml +++ b/app/views/projects/wikis/_form.html.haml @@ -21,7 +21,7 @@ .form-group.wiki-content = f.label :content, class: 'control-label' .col-sm-10 - = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do + = render layout: 'projects/md_preview', locals: { preview_class: "md-preview" } do = render 'projects/zen', f: f, attr: :content, classes: 'description form-control' .col-sm-12.hint .pull-left Wiki content is parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"), target: '_blank'} diff --git a/app/views/projects/wikis/_header_title.html.haml b/app/views/projects/wikis/_header_title.html.haml new file mode 100644 index 0000000000..408adc36ca --- /dev/null +++ b/app/views/projects/wikis/_header_title.html.haml @@ -0,0 +1 @@ +- header_title project_title(@project, 'Wiki', get_project_wiki_path(@project)) diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 788bb8cf1e..14f2582225 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,8 +1,15 @@ %span.pull-right + - if can?(current_user, :create_wiki, @project) + = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new btn-grouped", "data-toggle" => "modal" do + %i.fa.fa-plus + New Page + - if (@page && @page.persisted?) - = link_to history_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do Page History - if can?(current_user, :create_wiki, @project) - = link_to edit_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit + += render 'projects/wikis/new' diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index 804a1b52db..fffb4eb31a 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -1,19 +1,10 @@ -%ul.nav.nav-tabs +%ul.center-top-menu = nav_link(html_options: {class: params[:id] == 'home' ? 'active' : '' }) do = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) = nav_link(path: 'wikis#pages') do - = link_to 'Pages', pages_namespace_project_wikis_path(@project.namespace, @project) + = link_to 'Pages', namespace_project_wiki_pages_path(@project.namespace, @project) = nav_link(path: 'wikis#git_access') do - = link_to git_access_namespace_project_wikis_path(@project.namespace, @project) do - %i.fa.fa-download + = link_to namespace_project_wikis_git_access_path(@project.namespace, @project) do Git Access - - - if can?(current_user, :create_wiki, @project) - .pull-right - = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do - %i.fa.fa-plus - New Page - -= render 'projects/wikis/new' diff --git a/app/views/projects/wikis/edit.html.haml b/app/views/projects/wikis/edit.html.haml index 3f1dce1050..0b709c3695 100644 --- a/app/views/projects/wikis/edit.html.haml +++ b/app/views/projects/wikis/edit.html.haml @@ -1,4 +1,6 @@ - page_title "Edit", @page.title, "Wiki" += render "header_title" + = render 'nav' .pull-right = render 'main_links' diff --git a/app/views/projects/wikis/empty.html.haml b/app/views/projects/wikis/empty.html.haml index ead9941240..c7e490c3cd 100644 --- a/app/views/projects/wikis/empty.html.haml +++ b/app/views/projects/wikis/empty.html.haml @@ -1,4 +1,6 @@ - page_title "Wiki" += render "header_title" + %h3.page-title Empty page %hr .error_message diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index fd266baf66..6417ef4a38 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -1,15 +1,18 @@ - page_title "Git Access", "Wiki" += render "header_title" + = render 'nav' -.row - .col-sm-6 - %h3.page-title - Git access for - %strong= @project_wiki.path_with_namespace +.gray-content-block + .row + .col-sm-6 + %h3.page-title + Git access for + %strong= @project_wiki.path_with_namespace - .col-sm-6 - = render "shared/clone_panel", project: @project_wiki + .col-sm-6 + = render "shared/clone_panel", project: @project_wiki -.git-empty +.git-empty.prepend-top-default %fieldset %legend Install Gollum: %pre.dark diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 673ec2d20e..bfbef823b3 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,8 +1,11 @@ -- page_title "History", @page.title, "Wiki" +- page_title "History", @page.title.capitalize, "Wiki" += render "header_title" + = render 'nav' -%h3.page-title - %span.light History for - = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) +.gray-content-block + %h3.page-title + %span.light History for + = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) %table.table %thead diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 890ff1aed7..03e6a522b2 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -1,8 +1,11 @@ - page_title "All Pages", "Wiki" += render "header_title" + = render 'nav' -%h3.page-title - All Pages -%ul.bordered-list +.gray-content-block + %h3.page-title + All Pages +%ul.content-list - @wiki_pages.each do |wiki_page| %li %h4 diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 5c4dd7f91a..55fbf5a8b6 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -1,25 +1,28 @@ -- page_title @page.title, "Wiki" -= render 'nav' -%h3.page-title - = @page.title - = render 'main_links' +- page_title @page.title.capitalize, "Wiki" += render "header_title" -.wiki-last-edit-by - Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} += render 'nav' + +.gray-content-block + = render 'main_links' + %h3.page-title + = @page.title.capitalize + + .wiki-last-edit-by + Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} - if @page.historical? .warning_message This is an old version of this page. - You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", history_namespace_project_wiki_path(@project.namespace, @project, @page)}. + You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. -%hr -.wiki-holder +.wiki-holder.prepend-top-default .wiki = preserve do = render_wiki_content(@page) -%hr -.wiki-last-edit-by - Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} +.gray-content-block.footer-block + .wiki-last-edit-by + Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml index 154332cb9a..d637abfa76 100644 --- a/app/views/search/_category.html.haml +++ b/app/views/search/_category.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-pills.search-filter +%ul.nav.nav-tabs.search-filter - if @project %li{class: ("active" if @scope == 'blobs')} = link_to search_filter_path(scope: 'blobs') do @@ -21,6 +21,13 @@ Merge requests %span.badge = @search_results.merge_requests_count + %li{class: ("active" if @scope == 'milestones')} + = link_to search_filter_path(scope: 'milestones') do + = icon('clock-o fw') + %span + Milestones + %span.badge + = @search_results.milestones_count %li{class: ("active" if @scope == 'notes')} = link_to search_filter_path(scope: 'notes') do = icon('comments fw') @@ -74,4 +81,11 @@ Merge requests %span.badge = @search_results.merge_requests_count + %li{class: ("active" if @scope == 'milestones')} + = link_to search_filter_path(scope: 'milestones') do + = icon('clock-o fw') + %span + Milestones + %span.badge + = @search_results.milestones_count diff --git a/app/views/search/_filter.html.haml b/app/views/search/_filter.html.haml index e2d0cab9e7..ec478a5963 100644 --- a/app/views/search/_filter.html.haml +++ b/app/views/search/_filter.html.haml @@ -1,6 +1,5 @@ .dropdown.inline - %button.dropdown-toggle.btn.btn{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-tags + %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} %span.light Group: - if @group.present? %strong= @group.name @@ -17,8 +16,7 @@ = group.name .dropdown.inline.prepend-left-10.project-filter - %button.dropdown-toggle.btn.btn{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-tags + %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} %span.light Project: - if @project.present? %strong= @project.name_with_namespace diff --git a/app/views/search/_form.html.haml b/app/views/search/_form.html.haml index 5ee70be1ad..3938c545ca 100644 --- a/app/views/search/_form.html.haml +++ b/app/views/search/_form.html.haml @@ -1,12 +1,14 @@ -= form_tag search_path, method: :get, class: 'form-inline' do |f| += form_tag search_path, method: :get do |f| = hidden_field_tag :project_id, params[:project_id] = hidden_field_tag :group_id, params[:group_id] = hidden_field_tag :snippets, params[:snippets] = hidden_field_tag :scope, params[:scope] + .search-holder.clearfix - .form-group + .input-group = search_field_tag :search, params[:search], placeholder: "Search for projects, issues etc", class: "form-control search-text-input", id: "dashboard_search", autofocus: true - = button_tag 'Search', class: "btn btn-primary" + %span.input-group-btn + = button_tag 'Search', class: "btn btn-primary" - unless params[:snippets].eql? 'true' - .pull-right - = render 'filter' + %br + = render 'filter' diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 741c780ad9..2a38c98dcf 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -1,7 +1,7 @@ - if @search_results.empty? = render partial: "search/results/empty" - else - .light + %p.light Search results for %code = @search_term @@ -11,10 +11,13 @@ - elsif @group in group #{link_to @group.name, @group} - %br .results.prepend-top-10 .search-results - = render partial: "search/results/#{@scope.singularize}", collection: @objects + - if @scope == 'projects' + .term + = render 'shared/projects/list', projects: @objects + - else + = render partial: "search/results/#{@scope.singularize}", collection: @objects = paginate @objects, theme: 'gitlab' :javascript diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml index 58f58eff54..0fe8a3b490 100644 --- a/app/views/search/results/_blob.html.haml +++ b/app/views/search/results/_blob.html.haml @@ -7,4 +7,4 @@ %strong = blob.filename .file-content.code.term - = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, user_color_scheme_class: 'white' + = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline diff --git a/app/views/search/results/_milestone.html.haml b/app/views/search/results/_milestone.html.haml new file mode 100644 index 0000000000..e0b18733d7 --- /dev/null +++ b/app/views/search/results/_milestone.html.haml @@ -0,0 +1,9 @@ +.search-result-row + %h4 + = link_to [milestone.project.namespace.becomes(Namespace), milestone.project, milestone] do + %span.term.str-truncated= milestone.title + + - if milestone.description.present? + .description.term + = preserve do + = search_md_sanitize(markdown(milestone.description)) \ No newline at end of file diff --git a/app/views/search/results/_project.html.haml b/app/views/search/results/_project.html.haml deleted file mode 100644 index 195cf06c8e..0000000000 --- a/app/views/search/results/_project.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.search-result-row - %h4 - = link_to [project.namespace.becomes(Namespace), project] do - %span.term= project.name_with_namespace - - if project.description.present? - %span.light.term= project.description diff --git a/app/views/search/results/_snippet_blob.html.haml b/app/views/search/results/_snippet_blob.html.haml index 9509985391..9a4f9fb948 100644 --- a/app/views/search/results/_snippet_blob.html.haml +++ b/app/views/search/results/_snippet_blob.html.haml @@ -23,7 +23,7 @@ .nothing-here-block Empty file - else .file-content.code - %div.highlighted-data{class: user_color_scheme_class} + %div.highlighted-data{ class: user_color_scheme } .line-numbers - snippet_blob[:snippet_chunks].each do |snippet| - unless snippet[:data].empty? diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml index c03438eb95..f5859481d4 100644 --- a/app/views/search/results/_wiki_blob.html.haml +++ b/app/views/search/results/_wiki_blob.html.haml @@ -7,4 +7,4 @@ %strong = wiki_blob.filename .file-content.code.term - = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline, user_color_scheme_class: 'white' + = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml index 60f9e9ac9d..f4f3dcfc29 100644 --- a/app/views/search/show.html.haml +++ b/app/views/search/show.html.haml @@ -1,7 +1,5 @@ - page_title @search_term = render 'search/form' -%hr - if @search_term = render 'search/category' - %hr = render 'search/results' diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 07672359db..2cd422e772 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -4,7 +4,7 @@ .input-group-btn %button{ | type: 'button', | - class: "btn btn-sm #{ 'active' if default_clone_protocol == 'ssh' }#{ ' has_tooltip' if current_user && current_user.require_ssh_key? }", | + class: "btn #{ 'active' if default_clone_protocol == 'ssh' }#{ ' has_tooltip' if current_user && current_user.require_ssh_key? }", | :"data-clone" => project.ssh_url_to_repo, | :"data-title" => "Add an SSH key to your profile
to pull or push via SSH", :"data-html" => "true", @@ -13,13 +13,13 @@ .input-group-btn %button{ | type: 'button', | - class: "btn btn-sm #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.require_password? }", | + class: "btn #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.require_password? }", | :"data-clone" => project.http_url_to_repo, | :"data-title" => "Set a password on your account
to pull or push via #{gitlab_config.protocol.upcase}", :"data-html" => "true", :"data-container" => "body"} = gitlab_config.protocol.upcase - = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control input-sm", readonly: true + = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true - if project.kind_of?(Project) .input-group-addon .visibility-level-label.has_tooltip{'data-title' => "#{visibility_level_label(project.visibility_level)} project" } diff --git a/app/views/shared/_event_filter.html.haml b/app/views/shared/_event_filter.html.haml index 334db60690..8495774acc 100644 --- a/app/views/shared/_event_filter.html.haml +++ b/app/views/shared/_event_filter.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-pills.event_filter +.btn-group.btn-group-next.event-filter = event_filter_link EventFilter.push, 'Push events' = event_filter_link EventFilter.merged, 'Merge events' = event_filter_link EventFilter.comments, 'Comments' diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml index d6a2e177da..57c3aff3e1 100644 --- a/app/views/shared/_file_highlight.html.haml +++ b/app/views/shared/_file_highlight.html.haml @@ -1,4 +1,4 @@ -.file-content.code{class: user_color_scheme_class} +.file-content.code.js-syntax-highlight{ class: user_color_scheme } .line-numbers - if blob.data.present? - blob.data.lines.each_index do |index| diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index f685ae7726..cbdecda4ff 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -1,14 +1,11 @@ -.milestones-filters.append-bottom-10 - %ul.nav.nav-tabs +.milestones-filters + %ul.center-top-menu %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do - %i.fa.fa-exclamation-circle Open %li{class: ("active" if params[:state] == 'closed')} = link_to milestones_filter_path(state: 'closed') do - %i.fa.fa-check-circle Closed %li{class: ("active" if params[:state] == 'all')} = link_to milestones_filter_path(state: 'all') do - %i.fa.fa-compass All diff --git a/app/views/shared/_project.html.haml b/app/views/shared/_project.html.haml deleted file mode 100644 index 6bd61455d2..0000000000 --- a/app/views/shared/_project.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -= cache [project.namespace, project, controller.controller_name, controller.action_name] do - = link_to project_path(project), class: dom_class(project) do - - if avatar - .dash-project-avatar - = project_icon(project, alt: '', class: 'avatar project-avatar s40') - %span.str-truncated - %span.namespace-name - - if project.namespace - = project.namespace.human_name - \/ - %span.project-name.filter-title - = project.name - - if stars - %span.pull-right.light - %i.fa.fa-star - = project.star_count diff --git a/app/views/shared/_projects_list.html.haml b/app/views/shared/_projects_list.html.haml deleted file mode 100644 index 4c58092af4..0000000000 --- a/app/views/shared/_projects_list.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -- projects_limit = 20 unless local_assigns[:projects_limit] -- avatar = true unless local_assigns[:avatar] == false -- stars = false unless local_assigns[:stars] == true -%ul.well-list.projects-list - - projects.each_with_index do |project, i| - %li{class: (i >= projects_limit) ? 'project-row hide' : 'project-row'} - = render "shared/project", project: project, avatar: avatar, stars: stars - - if projects.blank? - %li - .nothing-here-block There are no projects here. - - if projects.count > projects_limit - %li.bottom - %span.light - #{projects_limit} of #{pluralize(projects.count, 'project')} displayed. - %span - = link_to '#', class: 'js-expand' do - Show all diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml new file mode 100644 index 0000000000..a54c5fa8c3 --- /dev/null +++ b/app/views/shared/groups/_group.html.haml @@ -0,0 +1,22 @@ +- group_member = local_assigns[:group_member] +%li + - if group_member + .controls.hidden-xs + - if can?(current_user, :admin_group, group) + = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do + %i.fa.fa-cogs + + = link_to leave_group_group_members_path(group), data: { confirm: leave_group_message(group.name) }, method: :delete, class: "btn-sm btn btn-grouped", title: 'Leave this group' do + %i.fa.fa-sign-out + + = image_tag group_icon(group), class: "avatar s46 hidden-xs" + = link_to group, class: 'group-name' do + %strong= group.name + + - if group_member + as + %span #{group_member.human_access} + + %div.light + #{pluralize(group.projects.count, "project")}, #{pluralize(group.users.count, "user")} + diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index bcaa48c7a1..8f16773077 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -1,33 +1,28 @@ .issues-filters .issues-state-filters - %ul.nav.nav-tabs + %ul.center-top-menu %li{class: ("active" if params[:state] == 'opened')} = link_to page_filter_path(state: 'opened') do - = icon('exclamation-circle') #{state_filters_text_for(:opened, @project)} - if defined?(type) && type == :merge_requests %li{class: ("active" if params[:state] == 'merged')} = link_to page_filter_path(state: 'merged') do - = icon('check-circle') #{state_filters_text_for(:merged, @project)} %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed') do - = icon('ban') #{state_filters_text_for(:closed, @project)} - else %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed') do - = icon('check-circle') #{state_filters_text_for(:closed, @project)} %li{class: ("active" if params[:state] == 'all')} = link_to page_filter_path(state: 'all') do - = icon('compass') #{state_filters_text_for(:all, @project)} - .issues-details-filters + .issues-details-filters.gray-content-block = form_tag page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name]), method: :get, class: 'filter-form' do - if controller.controller_name == 'issues' && can?(current_user, :admin_issue, @project) .check-all-holder diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 09327d645f..33ec726e93 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -9,7 +9,7 @@ = f.label :title, class: 'control-label' do %strong= 'Title *' .col-sm-10 - = f.text_field :title, maxlength: 255, autofocus: true, + = f.text_field :title, maxlength: 255, autofocus: true, autocomplete: 'off', class: 'form-control pad js-gfm-input', required: true - if issuable.is_a?(MergeRequest) @@ -24,7 +24,7 @@ = f.label :description, 'Description', class: 'control-label' .col-sm-10 - = render layout: 'projects/md_preview', locals: { preview_class: "wiki", referenced_users: true } do + = render layout: 'projects/md_preview', locals: { preview_class: "md-preview", referenced_users: true } do = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' .col-sm-12.hint diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml new file mode 100644 index 0000000000..330b0626d6 --- /dev/null +++ b/app/views/shared/projects/_list.html.haml @@ -0,0 +1,19 @@ +- projects_limit = 20 unless local_assigns[:projects_limit] +- avatar = true unless local_assigns[:avatar] == false +- stars = true unless local_assigns[:stars] == false + +%ul.projects-list + - projects.each_with_index do |project, i| + - css_class = (i >= projects_limit) ? 'hide' : nil + = render "shared/projects/project", project: project, + avatar: avatar, stars: stars, css_class: css_class + + - if projects.size > projects_limit + %li.bottom.center + .light + #{projects_limit} of #{pluralize(projects.count, 'project')} displayed. + = link_to '#', class: 'js-expand' do + Show all + +:coffeescript + new ProjectsList() diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml new file mode 100644 index 0000000000..5318c6011f --- /dev/null +++ b/app/views/shared/projects/_project.html.haml @@ -0,0 +1,24 @@ +- avatar = true unless local_assigns[:avatar] == false +- stars = true unless local_assigns[:stars] == false +- css_class = '' unless local_assigns[:css_class] +- css_class += " no-description" unless project.description.present? +%li.project-row{ class: css_class } + = cache [project.namespace, project, controller.controller_name, controller.action_name, 'v2.1'] do + = link_to project_path(project), class: dom_class(project) do + - if avatar + .dash-project-avatar + = project_icon(project, alt: '', class: 'avatar project-avatar s46') + %span.project-full-name + %span.namespace-name + - if project.namespace + = project.namespace.human_name + \/ + %span.project-name.filter-title + = project.name + - if stars + %span.pull-right.light + %i.fa.fa-star + = project.star_count + - if project.description.present? + .project-description + = markdown(project.description, pipeline: :description) diff --git a/app/views/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml similarity index 53% rename from app/views/snippets/_snippet.html.haml rename to app/views/shared/snippets/_snippet.html.haml index 5bb2866434..69a713ad9a 100644 --- a/app/views/snippets/_snippet.html.haml +++ b/app/views/shared/snippets/_snippet.html.haml @@ -1,12 +1,12 @@ -%li - %h4.snippet-title +%li.snippet-row + .snippet-title = link_to reliable_snippet_path(snippet) do = truncate(snippet.title, length: 60) - if snippet.private? %span.label.label-gray %i.fa.fa-lock private - %span.cgray.monospace.tiny.pull-right + %span.monospace.pull-right = snippet.file_name %small.pull-right.cgray @@ -14,10 +14,8 @@ = link_to snippet.project.name_with_namespace, namespace_project_path(snippet.project.namespace, snippet.project) .snippet-info - = "##{snippet.id}" - %span - by - = link_to user_snippets_path(snippet.author) do - = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: '' - = snippet.author_name - %span.light #{time_ago_with_tooltip(snippet.created_at)} + = link_to user_snippets_path(snippet.author) do + = image_tag avatar_icon(snippet.author_email), class: "avatar s24", alt: '' + = snippet.author_name + authored #{time_ago_with_tooltip(snippet.created_at)} + diff --git a/app/views/snippets/_snippets.html.haml b/app/views/snippets/_snippets.html.haml index 40df42b6cf..d9aa4dd1d2 100644 --- a/app/views/snippets/_snippets.html.haml +++ b/app/views/snippets/_snippets.html.haml @@ -1,5 +1,5 @@ %ul.bordered-list - = render partial: 'snippet', collection: @snippets + = render partial: 'shared/snippets/snippet', collection: @snippets - if @snippets.empty? %li .nothing-here-block Nothing here. diff --git a/app/views/snippets/current_user_index.html.haml b/app/views/snippets/current_user_index.html.haml deleted file mode 100644 index 0718f74382..0000000000 --- a/app/views/snippets/current_user_index.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -- page_title "Your Snippets" -%h3.page-title - Your Snippets - .pull-right - = link_to new_snippet_path, class: "btn btn-new btn-grouped", title: "New Snippet" do - Add new snippet - -%p.light - Share code pastes with others out of git repository - -%ul.nav.nav-tabs - = nav_tab :scope, nil do - = link_to user_snippets_path(@user) do - All - %span.badge - = @user.snippets.count - = nav_tab :scope, 'are_private' do - = link_to user_snippets_path(@user, scope: 'are_private') do - Private - %span.badge - = @user.snippets.are_private.count - = nav_tab :scope, 'are_internal' do - = link_to user_snippets_path(@user, scope: 'are_internal') do - Internal - %span.badge - = @user.snippets.are_internal.count - = nav_tab :scope, 'are_public' do - = link_to user_snippets_path(@user, scope: 'are_public') do - Public - %span.badge - = @user.snippets.are_public.count - -.my-snippets - = render 'snippets' - diff --git a/app/views/snippets/index.html.haml b/app/views/snippets/index.html.haml index e9bb6a908d..7e4918a608 100644 --- a/app/views/snippets/index.html.haml +++ b/app/views/snippets/index.html.haml @@ -1,17 +1,13 @@ -- page_title "Public Snippets" -%h3.page-title - Public snippets +- page_title "By #{@user.name}", "Snippets" - .pull-right - - if current_user - = link_to new_snippet_path, class: "btn btn-new btn-grouped", title: "New Snippet" do - Add new snippet - = link_to user_snippets_path(current_user), class: "btn btn-grouped" do - Your snippets +%ol.breadcrumb + %li + = link_to snippets_path do + Snippets + %li + = @user.name + .pull-right.hidden-xs + = link_to user_path(@user) do + #{@user.name} profile page -%p.light - Public snippets created by you and other users are listed here - -%hr = render 'snippets' - diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml index 089e812291..97374e073d 100644 --- a/app/views/snippets/show.html.haml +++ b/app/views/snippets/show.html.haml @@ -1,5 +1,5 @@ - page_title @snippet.title, "Snippets" -%h3.page-title +%h4.page-title = @snippet.title - if @snippet.private? @@ -8,26 +8,23 @@ private .pull-right - = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do + = link_to new_snippet_path, class: "btn btn-new btn-sm", title: "New Snippet" do Add new snippet -%hr -.append-bottom-20 +.append-bottom-10.prepend-top-10 .pull-right - = "##{@snippet.id}" %span.light - by + created by = link_to user_snippets_path(@snippet.author) do - = image_tag avatar_icon(@snippet.author_email), class: "avatar avatar-inline s16", alt: '' = @snippet.author_name .back-link - if @snippet.author == current_user - = link_to user_snippets_path(current_user) do + = link_to dashboard_snippets_path do ← your snippets - else - = link_to snippets_path do - ← discover snippets + = link_to explore_snippets_path do + ← explore snippets .file-holder .file-title diff --git a/app/views/snippets/user_index.html.haml b/app/views/snippets/user_index.html.haml deleted file mode 100644 index 23700eb39d..0000000000 --- a/app/views/snippets/user_index.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -- page_title "Snippets", @user.name -%h3.page-title - = image_tag avatar_icon(@user.email), class: "avatar s24" - = @user.name - %span - \/ - Snippets - - if current_user - = link_to new_snippet_path, class: "btn btn-sm add_new pull-right", title: "New Snippet" do - Add new snippet - -%hr - -= render 'snippets' diff --git a/app/views/users/_projects.html.haml b/app/views/users/_projects.html.haml index 297fa53739..a126a858ea 100644 --- a/app/views/users/_projects.html.haml +++ b/app/views/users/_projects.html.haml @@ -1,13 +1,13 @@ - if local_assigns.has_key?(:contributed_projects) && contributed_projects.present? .panel.panel-default.contributed-projects .panel-heading Projects contributed to - = render 'shared/projects_list', + = render 'shared/projects/list', projects: contributed_projects.sort_by(&:star_count).reverse, projects_limit: 5, stars: true, avatar: false - if local_assigns.has_key?(:projects) && projects.present? .panel.panel-default .panel-heading Personal projects - = render 'shared/projects_list', + = render 'shared/projects/list', projects: projects.sort_by(&:star_count).reverse, projects_limit: 10, stars: true, avatar: false diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 64b7f25ad3..37d5dba033 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -7,7 +7,7 @@ = render 'shared/show_aside' .row - %section.col-md-8 + %section.col-md-7 .header-with-avatar = link_to avatar_icon(@user.email, 400), target: '_blank' do = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: '' @@ -16,8 +16,8 @@ - if @user == current_user .pull-right.hidden-xs = link_to profile_path, class: 'btn btn-sm' do - %i.fa.fa-pencil-square-o - Edit Profile settings + = icon('user') + Profile settings - elsif current_user .pull-right %span.dropdown @@ -59,7 +59,7 @@ .content_list = spinner - %aside.col-md-4 + %aside.col-md-5 = render 'profile', user: @user = render 'projects', projects: @projects, contributed_projects: @contributed_projects diff --git a/app/workers/auto_merge_worker.rb b/app/workers/auto_merge_worker.rb deleted file mode 100644 index a6dd73eee5..0000000000 --- a/app/workers/auto_merge_worker.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AutoMergeWorker - include Sidekiq::Worker - - sidekiq_options queue: :default - - def perform(merge_request_id, current_user_id, params) - params = params.with_indifferent_access - current_user = User.find(current_user_id) - merge_request = MergeRequest.find(merge_request_id) - merge_request.should_remove_source_branch = params[:should_remove_source_branch] - merge_request.automerge!(current_user, params[:commit_message]) - end -end diff --git a/app/workers/ci/hip_chat_notifier_worker.rb b/app/workers/ci/hip_chat_notifier_worker.rb new file mode 100644 index 0000000000..ebb43570e2 --- /dev/null +++ b/app/workers/ci/hip_chat_notifier_worker.rb @@ -0,0 +1,19 @@ +module Ci + class HipChatNotifierWorker + include Sidekiq::Worker + + def perform(message, options={}) + room = options.delete('room') + token = options.delete('token') + server = options.delete('server') + name = options.delete('service_name') + client_opts = { + api_version: 'v2', + server_url: server + } + + client = HipChat::Client.new(token, client_opts) + client[room].send(name, message, options.symbolize_keys) + end + end +end diff --git a/app/workers/ci/slack_notifier_worker.rb b/app/workers/ci/slack_notifier_worker.rb new file mode 100644 index 0000000000..3bbb9b4bec --- /dev/null +++ b/app/workers/ci/slack_notifier_worker.rb @@ -0,0 +1,10 @@ +module Ci + class SlackNotifierWorker + include Sidekiq::Worker + + def perform(webhook_url, message, options={}) + notifier = Slack::Notifier.new(webhook_url) + notifier.ping(message, options) + end + end +end diff --git a/app/workers/ci/web_hook_worker.rb b/app/workers/ci/web_hook_worker.rb new file mode 100644 index 0000000000..0bb8384557 --- /dev/null +++ b/app/workers/ci/web_hook_worker.rb @@ -0,0 +1,9 @@ +module Ci + class WebHookWorker + include Sidekiq::Worker + + def perform(hook_id, data) + Ci::WebHook.find(hook_id).execute data + end + end +end diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb new file mode 100644 index 0000000000..5a921a73fe --- /dev/null +++ b/app/workers/email_receiver_worker.rb @@ -0,0 +1,51 @@ +class EmailReceiverWorker + include Sidekiq::Worker + + sidekiq_options queue: :incoming_email + + def perform(raw) + return unless Gitlab::IncomingEmail.enabled? + + begin + Gitlab::Email::Receiver.new(raw).execute + rescue => e + handle_failure(raw, e) + end + end + + private + + def handle_failure(raw, e) + Rails.logger.warn("Email can not be processed: #{e}\n\n#{raw}") + + return unless raw.present? + + can_retry = false + reason = nil + + case e + when Gitlab::Email::Receiver::SentNotificationNotFoundError + reason = "We couldn't figure out what the email is in reply to. Please create your comment through the web interface." + when Gitlab::Email::Receiver::EmptyEmailError + can_retry = true + reason = "It appears that the email is blank. Make sure your reply is at the top of the email, we can't process inline replies." + when Gitlab::Email::Receiver::AutoGeneratedEmailError + reason = "The email was marked as 'auto generated', which we can't accept. Please create your comment through the web interface." + when Gitlab::Email::Receiver::UserNotFoundError + reason = "We couldn't figure out what user corresponds to the email. Please create your comment through the web interface." + when Gitlab::Email::Receiver::UserBlockedError + reason = "Your account has been blocked. If you believe this is in error, contact a staff member." + when Gitlab::Email::Receiver::UserNotAuthorizedError + reason = "You are not allowed to respond to the thread you are replying to. If you believe this is in error, contact a staff member." + when Gitlab::Email::Receiver::NoteableNotFoundError + reason = "The thread you are replying to no longer exists, perhaps it was deleted? If you believe this is in error, contact a staff member." + when Gitlab::Email::Receiver::InvalidNoteError + can_retry = true + reason = e.message + else + return + end + + EmailRejectionMailer.delay.rejection(reason, raw, can_retry) + end +end diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb index 1d21addece..916a99bb27 100644 --- a/app/workers/emails_on_push_worker.rb +++ b/app/workers/emails_on_push_worker.rb @@ -4,7 +4,7 @@ class EmailsOnPushWorker def perform(project_id, recipients, push_data, options = {}) options.symbolize_keys! options.reverse_merge!( - send_from_committer_email: false, + send_from_committer_email: false, disable_diffs: false ) send_from_committer_email = options[:send_from_committer_email] @@ -16,9 +16,9 @@ class EmailsOnPushWorker ref = push_data["ref"] author_id = push_data["user_id"] - action = + action = if Gitlab::Git.blank_ref?(before_sha) - :create + :create elsif Gitlab::Git.blank_ref?(after_sha) :delete else @@ -42,17 +42,22 @@ class EmailsOnPushWorker end recipients.split(" ").each do |recipient| - Notify.repository_push_email( - project_id, - recipient, - author_id: author_id, - ref: ref, - action: action, - compare: compare, - reverse_compare: reverse_compare, - send_from_committer_email: send_from_committer_email, - disable_diffs: disable_diffs - ).deliver + begin + Notify.repository_push_email( + project_id, + recipient, + author_id: author_id, + ref: ref, + action: action, + compare: compare, + reverse_compare: reverse_compare, + send_from_committer_email: send_from_committer_email, + disable_diffs: disable_diffs + ).deliver + # These are input errors and won't be corrected even if Sidekiq retries + rescue Net::SMTPFatalError, Net::SMTPSyntaxError => e + logger.info("Failed to send e-mail for project '#{project.name_with_namespace}' to #{recipient}: #{e}") + end end ensure compare = nil diff --git a/app/workers/fork_registration_worker.rb b/app/workers/fork_registration_worker.rb deleted file mode 100644 index fffa8b3a65..0000000000 --- a/app/workers/fork_registration_worker.rb +++ /dev/null @@ -1,12 +0,0 @@ -class ForkRegistrationWorker - include Sidekiq::Worker - - sidekiq_options queue: :default - - def perform(from_project_id, to_project_id, private_token) - from_project = Project.find(from_project_id) - to_project = Project.find(to_project_id) - - from_project.gitlab_ci_service.fork_registration(to_project, private_token) - end -end diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb new file mode 100644 index 0000000000..5d1a8555b7 --- /dev/null +++ b/app/workers/merge_worker.rb @@ -0,0 +1,23 @@ +class MergeWorker + include Sidekiq::Worker + + sidekiq_options queue: :default + + def perform(merge_request_id, current_user_id, params) + params = params.with_indifferent_access + current_user = User.find(current_user_id) + merge_request = MergeRequest.find(merge_request_id) + + result = MergeRequests::MergeService.new(merge_request.target_project, current_user). + execute(merge_request, params[:commit_message]) + + if result[:status] == :success && params[:should_remove_source_branch].present? + DeleteBranchService.new(merge_request.source_project, current_user). + execute(merge_request.source_branch) + + merge_request.source_project.repository.expire_branch_names + end + + result + end +end diff --git a/app/workers/repository_fork_worker.rb b/app/workers/repository_fork_worker.rb new file mode 100644 index 0000000000..acd1c43f06 --- /dev/null +++ b/app/workers/repository_fork_worker.rb @@ -0,0 +1,34 @@ +class RepositoryForkWorker + include Sidekiq::Worker + include Gitlab::ShellAdapter + + sidekiq_options queue: :gitlab_shell + + def perform(project_id, source_path, target_path) + project = Project.find_by_id(project_id) + + unless project.present? + logger.error("Project #{project_id} no longer exists!") + return + end + + result = gitlab_shell.fork_repository(source_path, target_path) + + unless result + logger.error("Unable to fork project #{project_id} for repository #{source_path} -> #{target_path}") + project.import_fail + project.save + return + end + + if project.valid_repo? + ProjectCacheWorker.perform_async(project.id) + project.import_finish + else + project.import_fail + logger.error("Project #{id} had an invalid repository after fork") + end + + project.save + end +end diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index 94832872d1..ea2808045e 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -7,28 +7,37 @@ class RepositoryImportWorker def perform(project_id) project = Project.find(project_id) - import_result = gitlab_shell.send(:import_repository, + unless project.import_url == Project::UNKNOWN_IMPORT_URL + import_result = gitlab_shell.send(:import_repository, project.path_with_namespace, project.import_url) - return project.import_fail unless import_result + return project.import_fail unless import_result + else + unless project.create_repository + return project.import_fail + end + end - data_import_result = if project.import_type == 'github' - Gitlab::GithubImport::Importer.new(project).execute - elsif project.import_type == 'gitlab' - Gitlab::GitlabImport::Importer.new(project).execute - elsif project.import_type == 'bitbucket' - Gitlab::BitbucketImport::Importer.new(project).execute - elsif project.import_type == 'google_code' - Gitlab::GoogleCodeImport::Importer.new(project).execute - else - true - end + data_import_result = case project.import_type + when 'github' + Gitlab::GithubImport::Importer.new(project).execute + when 'gitlab' + Gitlab::GitlabImport::Importer.new(project).execute + when 'bitbucket' + Gitlab::BitbucketImport::Importer.new(project).execute + when 'google_code' + Gitlab::GoogleCodeImport::Importer.new(project).execute + when 'fogbugz' + Gitlab::FogbugzImport::Importer.new(project).execute + else + true + end return project.import_fail unless data_import_result + Gitlab::BitbucketImport::KeyDeleter.new(project).execute if project.import_type == 'bitbucket' + project.import_finish project.save - project.satellite.create unless project.satellite.exists? ProjectCacheWorker.perform_async(project.id) - Gitlab::BitbucketImport::KeyDeleter.new(project).execute if project.import_type == 'bitbucket' end end diff --git a/bin/background_jobs b/bin/background_jobs index a041a4b043..d4578f6a22 100755 --- a/bin/background_jobs +++ b/bin/background_jobs @@ -37,7 +37,7 @@ start_no_deamonize() start_sidekiq() { - bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q common -q default -e $RAILS_ENV -P $sidekiq_pidfile $@ >> $sidekiq_logfile 2>&1 + bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q default -e $RAILS_ENV -P $sidekiq_pidfile $@ >> $sidekiq_logfile 2>&1 } load_ok() diff --git a/bin/ci/upgrade.rb b/bin/ci/upgrade.rb new file mode 100644 index 0000000000..aab4f60ec6 --- /dev/null +++ b/bin/ci/upgrade.rb @@ -0,0 +1,3 @@ +require_relative "../lib/ci/upgrader" + +Ci::Upgrader.new.execute diff --git a/bin/daemon_with_pidfile b/bin/daemon_with_pidfile new file mode 100755 index 0000000000..f138c27a0e --- /dev/null +++ b/bin/daemon_with_pidfile @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +# daemon_with_pidfile +# +# Daemonize, write a pidfile, and exec the remainder of the command line. + +def main(pidfile, cmd) + if middle_pid = Process.fork + # outer process + # Do not exit the outer process before the middle process finishes + Process.waitpid(middle_pid) + exit $?.exitstatus + end + + if final_pid = Process.fork + # middle process + open(pidfile, 'w') { |f| f.puts final_pid } + exit + end + + # Standard daemon things: become session leader, ignore SIGHUP, close stdin. + Signal.trap("HUP", "IGNORE") + Process.setsid + IO.new(0).close + + exec(*cmd) +end + +if ARGV.count < 2 + abort "Usage: #$0 pidfile command [args...]" +end + +pidfile = ARGV.shift +main(pidfile, ARGV) diff --git a/bin/mail_room b/bin/mail_room new file mode 100755 index 0000000000..74a84f5b2b --- /dev/null +++ b/bin/mail_room @@ -0,0 +1,50 @@ +#!/bin/sh + +cd $(dirname $0)/.. +app_root=$(pwd) + +mail_room_pidfile="$app_root/tmp/pids/mail_room.pid" +mail_room_logfile="$app_root/log/mail_room.log" +mail_room_config="$app_root/config/mail_room.yml" + +get_mail_room_pid() +{ + local pid=$(cat $mail_room_pidfile) + if [ -z "$pid" ] ; then + echo "Could not find a PID in $mail_room_pidfile" + exit 1 + fi + mail_room_pid=$pid +} + +start() +{ + bin/daemon_with_pidfile $mail_room_pidfile bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1 +} + +stop() +{ + get_mail_room_pid + kill -TERM $mail_room_pid +} + +restart() +{ + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + *) + echo "Usage: $0 {start|stop|restart}" + ;; +esac diff --git a/builds/.gitkeep b/builds/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/environments/development.rb b/config/environments/development.rb index 03af7f0786..d7d6aed160 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -24,6 +24,11 @@ Gitlab::Application.configure do # Expands the lines which load the assets # config.assets.debug = true + + # Adds additional error checking when serving assets at runtime. + # Checks for improperly declared sprockets dependencies. + # Raises helpful error messages. + config.assets.raise_runtime_errors = true # For having correct urls in mails config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 56770335dd..15930fc907 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -4,7 +4,7 @@ # ########################### NOTE ##################################### # This file should not receive new settings. All configuration options # -# that do not require application restart are being moved to # +# that do not require an application restart are being moved to # # ApplicationSetting model! # # If you change this file in a Merge Request, please also create # # a MR on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests # @@ -94,6 +94,13 @@ production: &base # The default is 'tmp/repositories' relative to the root of the Rails app. # repository_downloads_path: tmp/repositories + ## Reply by email + # Allow users to comment on issues and merge requests by replying to notification emails. + # For documentation on how to set this up, see http://doc.gitlab.com/ce/incoming_email/README.html + incoming_email: + enabled: false + address: "incoming+%{key}@gitlab.example.com" + ## Gravatar ## For Libravatar see: http://doc.gitlab.com/ce/customization/libravatar.html gravatar: @@ -103,7 +110,23 @@ production: &base # ssl_url: "https://..." # default: https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon # - # 2. Auth settings + # 2. GitLab CI settings + # ========================== + + gitlab_ci: + # Default project notifications settings: + # + # Send emails only on broken builds (default: true) + # all_broken_builds: true + # + # Add pusher to recipients list (default: false) + # add_pusher: true + + # The location where build traces are stored (default: builds/). Relative paths are relative to Rails.root + # builds_path: builds/ + + # + # 3. Auth settings # ========================== ## LDAP settings @@ -136,7 +159,7 @@ production: &base method: 'plain' # "tls" or "ssl" or "plain" bind_dn: '_the_full_dn_of_the_user_you_will_bind_with' password: '_the_password_of_the_bind_user' - + # This setting specifies if LDAP server is Active Directory LDAP server. # For non AD servers it skips the AD specific queries. # If your LDAP server is not AD, set this to false. @@ -173,6 +196,26 @@ production: &base # user_filter: '' + # LDAP attributes that GitLab will use to create an account for the LDAP user. + # The specified attribute can either be the attribute name as a string (e.g. 'mail'), + # or an array of attribute names to try in order (e.g. ['mail', 'email']). + # Note that the user's LDAP login will always be the attribute specified as `uid` above. + attributes: + # The username will be used in paths for the user's own projects + # (like `gitlab.example.com/username/project`) and when mentioning + # them in issues, merge request and comments (like `@username`). + # If the attribute specified for `username` contains an email address, + # the GitLab username will be the part of the email address before the '@'. + username: ['uid', 'userid', 'sAMAccountName'] + email: ['mail', 'email', 'userPrincipalName'] + + # If no full name could be found at the attribute specified for `name`, + # the full name is determined using the attributes specified for + # `first_name` and `last_name`. + name: 'cn' + first_name: 'givenName' + last_name: 'sn' + # GitLab EE only: add more LDAP servers # Choose an ID made of a-z and 0-9 . This ID will be stored in the database # so that GitLab can remember which LDAP server a user belongs to. @@ -239,12 +282,17 @@ production: &base # issuer: 'https://gitlab.example.com', # name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' # } } + # - { name: 'crowd', + # args: { + # crowd_server_url: 'CROWD SERVER URL', + # application_name: 'YOUR_APP_NAME', + # application_password: 'YOUR_APP_PASSWORD' } } # - # 3. Advanced settings + # 4. Advanced settings # ========================== # GitLab Satellites @@ -258,6 +306,7 @@ production: &base path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/) # archive_permissions: 0640 # Permissions for the resulting backup.tar file (default: 0600) # keep_time: 604800 # default: 0 (forever) (in seconds) + # pg_schema: public # default: nil, it means that all schemas will be backed up # upload: # # Fog storage connection settings, see http://fog.io/storage/ . # connection: @@ -303,7 +352,7 @@ production: &base timeout: 10 # - # 4. Extra customization + # 5. Extra customization # ========================== extra: diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 3a2b7d341d..48601b6733 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -18,7 +18,19 @@ class Settings < Settingslogic host.start_with?('www.') ? host[4..-1] : host end - private + def build_gitlab_ci_url + if gitlab_on_standard_port? + custom_port = nil + else + custom_port = ":#{gitlab.port}" + end + [ gitlab.protocol, + "://", + gitlab.host, + custom_port, + gitlab.relative_url_root + ].join('') + end def build_gitlab_shell_ssh_path_prefix if gitlab_shell.ssh_port != 22 @@ -97,6 +109,7 @@ if Settings.ldap['enabled'] || Rails.env.test? server['block_auto_created_users'] = false if server['block_auto_created_users'].nil? server['allow_username_or_email_login'] = false if server['allow_username_or_email_login'].nil? server['active_directory'] = true if server['active_directory'].nil? + server['attributes'] = {} if server['attributes'].nil? server['provider_name'] ||= "ldap#{key}".downcase server['provider_class'] = OmniAuth::Utils.camelize(server['provider_name']) end @@ -158,6 +171,24 @@ Settings.gitlab.default_projects_features['snippets'] = false if Settings. Settings.gitlab.default_projects_features['visibility_level'] = Settings.send(:verify_constant, Gitlab::VisibilityLevel, Settings.gitlab.default_projects_features['visibility_level'], Gitlab::VisibilityLevel::PRIVATE) Settings.gitlab['repository_downloads_path'] = File.absolute_path(Settings.gitlab['repository_downloads_path'] || 'tmp/repositories', Rails.root) Settings.gitlab['restricted_signup_domains'] ||= [] +Settings.gitlab['import_sources'] ||= ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'] + + +# +# CI +# +Settings['gitlab_ci'] ||= Settingslogic.new({}) +Settings.gitlab_ci['enabled'] = true if Settings.gitlab_ci['enabled'].nil? +Settings.gitlab_ci['all_broken_builds'] = true if Settings.gitlab_ci['all_broken_builds'].nil? +Settings.gitlab_ci['add_pusher'] = false if Settings.gitlab_ci['add_pusher'].nil? +Settings.gitlab_ci['url'] ||= Settings.send(:build_gitlab_ci_url) +Settings.gitlab_ci['builds_path'] = File.expand_path(Settings.gitlab_ci['builds_path'] || "builds/", Rails.root) + +# +# Reply by email +# +Settings['incoming_email'] ||= Settingslogic.new({}) +Settings.incoming_email['enabled'] = false if Settings.incoming_email['enabled'].nil? # # Gravatar @@ -189,6 +220,7 @@ Settings.gitlab_shell['ssh_path_prefix'] ||= Settings.send(:build_gitlab_shell_s # Settings['backup'] ||= Settingslogic.new({}) Settings.backup['keep_time'] ||= 0 +Settings.backup['pg_schema'] = nil Settings.backup['path'] = File.expand_path(Settings.backup['path'] || "tmp/backups/", Rails.root) Settings.backup['archive_permissions'] ||= 0600 Settings.backup['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil }) diff --git a/config/initializers/3_grit_ext.rb b/config/initializers/3_grit_ext.rb deleted file mode 100644 index 6540ac839c..0000000000 --- a/config/initializers/3_grit_ext.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'grit' - -Grit::Git.git_binary = Gitlab.config.git.bin_path -Grit::Git.git_timeout = Gitlab.config.git.timeout -Grit::Git.git_max_size = Gitlab.config.git.max_size diff --git a/config/initializers/4_ci_app.rb b/config/initializers/4_ci_app.rb new file mode 100644 index 0000000000..cac8edb32b --- /dev/null +++ b/config/initializers/4_ci_app.rb @@ -0,0 +1,10 @@ +module GitlabCi + VERSION = Gitlab::VERSION + REVISION = Gitlab::REVISION + + REGISTRATION_TOKEN = SecureRandom.hex(10) + + def self.config + Settings + end +end diff --git a/config/initializers/connection_fix.rb b/config/initializers/connection_fix.rb new file mode 100644 index 0000000000..d831a1838e --- /dev/null +++ b/config/initializers/connection_fix.rb @@ -0,0 +1,32 @@ +# from http://gist.github.com/238999 +# +# If your workers are inactive for a long period of time, they'll lose +# their MySQL connection. +# +# This hack ensures we re-connect whenever a connection is +# lost. Because, really. why not? +# +# Stick this in RAILS_ROOT/config/initializers/connection_fix.rb (or somewhere similar) +# +# From: +# http://coderrr.wordpress.com/2009/01/08/activerecord-threading-issues-and-resolutions/ + +if defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) + module ActiveRecord::ConnectionAdapters + class Mysql2Adapter + alias_method :execute_without_retry, :execute + + def execute(*args) + execute_without_retry(*args) + rescue ActiveRecord::StatementInvalid => e + if e.message =~ /server has gone away/i + warn "Server timed out, retrying" + reconnect! + retry + else + raise e + end + end + end + end +end diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..43adac8b2c --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Gitlab::Application.config.action_dispatch.cookies_serializer = :hybrid diff --git a/config/initializers/8_default_url_options.rb b/config/initializers/default_url_options.rb similarity index 80% rename from config/initializers/8_default_url_options.rb rename to config/initializers/default_url_options.rb index 8fd27b1d88..f9f88f95db 100644 --- a/config/initializers/8_default_url_options.rb +++ b/config/initializers/default_url_options.rb @@ -8,4 +8,4 @@ unless Gitlab.config.gitlab_on_standard_port? default_url_options[:port] = Gitlab.config.gitlab.port end -Rails.application.routes.default_url_options = default_url_options +Gitlab::Application.routes.default_url_options = default_url_options diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 091548348b..2ce24592f8 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -238,7 +238,7 @@ Devise.setup do |config| provider_arguments.concat provider['args'] when Hash # A Hash from the configuration will be passed as is. - provider_arguments << provider['args'] + provider_arguments << provider['args'].symbolize_keys end config.omniauth provider['name'].to_sym, *provider_arguments diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 6139ddbe6c..66ac88e9f4 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -12,8 +12,7 @@ Doorkeeper.configure do end resource_owner_from_credentials do |routes| - u = User.find_by(email: params[:username]) || User.find_by(username: params[:username]) - u if u && u.valid_password?(params[:password]) + Gitlab::Auth.new.find(params[:username], params[:password]) end # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below. diff --git a/config/initializers/7_omniauth.rb b/config/initializers/omniauth.rb similarity index 100% rename from config/initializers/7_omniauth.rb rename to config/initializers/omniauth.rb diff --git a/config/initializers/rack_attack.rb.example b/config/initializers/rack_attack.rb.example index b1bbcca1d6..2155ea1456 100644 --- a/config/initializers/rack_attack.rb.example +++ b/config/initializers/rack_attack.rb.example @@ -4,13 +4,13 @@ # If you change this file in a Merge Request, please also create a Merge Request on https://gitlab.com/gitlab-org/omnibus-gitlab/merge_requests paths_to_be_protected = [ - "#{Rails.application.config.relative_url_root}/users/password", - "#{Rails.application.config.relative_url_root}/users/sign_in", - "#{Rails.application.config.relative_url_root}/api/#{API::API.version}/session.json", - "#{Rails.application.config.relative_url_root}/api/#{API::API.version}/session", - "#{Rails.application.config.relative_url_root}/users", - "#{Rails.application.config.relative_url_root}/users/confirmation", - "#{Rails.application.config.relative_url_root}/unsubscribes/" + "#{Gitlab::Application.config.relative_url_root}/users/password", + "#{Gitlab::Application.config.relative_url_root}/users/sign_in", + "#{Gitlab::Application.config.relative_url_root}/api/#{API::API.version}/session.json", + "#{Gitlab::Application.config.relative_url_root}/api/#{API::API.version}/session", + "#{Gitlab::Application.config.relative_url_root}/users", + "#{Gitlab::Application.config.relative_url_root}/users/confirmation", + "#{Gitlab::Application.config.relative_url_root}/unsubscribes/" ] diff --git a/config/initializers/6_rack_profiler.rb b/config/initializers/rack_profiler.rb similarity index 81% rename from config/initializers/6_rack_profiler.rb rename to config/initializers/rack_profiler.rb index 1d958904e8..7710eeac45 100644 --- a/config/initializers/6_rack_profiler.rb +++ b/config/initializers/rack_profiler.rb @@ -2,7 +2,7 @@ if Rails.env.development? require 'rack-mini-profiler' # initialization is skipped so trigger it - Rack::MiniProfilerRails.initialize!(Rails.application) + Rack::MiniProfilerRails.initialize!(Gitlab::Application) Rack::MiniProfiler.config.position = 'right' Rack::MiniProfiler.config.start_hidden = false diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index 62a54bc8c6..1b518c3bec 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -24,3 +24,27 @@ end Gitlab::Application.config.secret_token = find_secure_token Gitlab::Application.config.secret_key_base = find_secure_token + +# CI +def generate_new_secure_token + SecureRandom.hex(64) +end + +if Gitlab::Application.secrets.db_key_base.blank? + warn "Missing `db_key_base` for '#{Rails.env}' environment. The secrets will be generated and stored in `config/secrets.yml`" + + all_secrets = YAML.load_file('config/secrets.yml') if File.exist?('config/secrets.yml') + all_secrets ||= {} + + # generate secrets + env_secrets = all_secrets[Rails.env.to_s] || {} + env_secrets['db_key_base'] ||= generate_new_secure_token + all_secrets[Rails.env.to_s] = env_secrets + + # save secrets + File.open('config/secrets.yml', 'w', 0600) do |file| + file.write(YAML.dump(all_secrets)) + end + + Gitlab::Application.secrets.db_key_base = env_secrets['db_key_base'] +end diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 6d274cd95a..04ed9e90df 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -2,7 +2,12 @@ require 'gitlab/current_settings' include Gitlab::CurrentSettings -Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay + +# allow it to fail: it may to do so when create_from_defaults is executed before migrations are actually done +begin + Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay +rescue +end Gitlab::Application.config.session_store( :redis_store, # Using the cookie_store would enable session replay attacks. @@ -11,5 +16,5 @@ Gitlab::Application.config.session_store( secure: Gitlab.config.gitlab.https, httponly: true, expire_after: Settings.gitlab['session_expire_delay'] * 60, - path: (Rails.application.config.relative_url_root.nil?) ? '/' : Rails.application.config.relative_url_root + path: (Gitlab::Application.config.relative_url_root.nil?) ? '/' : Gitlab::Application.config.relative_url_root ) diff --git a/config/initializers/4_sidekiq.rb b/config/initializers/sidekiq.rb similarity index 100% rename from config/initializers/4_sidekiq.rb rename to config/initializers/sidekiq.rb diff --git a/config/initializers/static_files.rb b/config/initializers/static_files.rb index d9042c652b..e6d5600edb 100644 --- a/config/initializers/static_files.rb +++ b/config/initializers/static_files.rb @@ -1,4 +1,4 @@ -app = Rails.application +app = Gitlab::Application if app.config.serve_static_assets # The `ActionDispatch::Static` middleware intercepts requests for static files diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index f3db5b7476..d8bf0878a3 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -32,10 +32,11 @@ en: send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' updated: 'Your password was changed successfully. You are now signed in.' updated_not_active: 'Your password was changed successfully.' - send_paranoid_instructions: "If your e-mail exists on our database, you will receive a password recovery link on your e-mail" + send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes." + no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided." confirmations: send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' - send_paranoid_instructions: 'If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes.' + send_paranoid_instructions: 'If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes.' confirmed: 'Your account was successfully confirmed. You are now signed in.' registrations: signed_up: 'Welcome! You have signed up successfully.' @@ -57,4 +58,4 @@ en: reset_password_instructions: subject: 'Reset password instructions' unlock_instructions: - subject: 'Unlock Instructions' \ No newline at end of file + subject: 'Unlock Instructions' diff --git a/config/mail_room.yml.example b/config/mail_room.yml.example new file mode 100644 index 0000000000..82e1a42058 --- /dev/null +++ b/config/mail_room.yml.example @@ -0,0 +1,29 @@ +:mailboxes: + - + # # IMAP server host + # :host: "imap.gmail.com" + # # IMAP server port + # :port: 993 + # # Whether the IMAP server uses SSL + # :ssl: true + # # Whether the IMAP server uses StartTLS + # :start_tls: false + # # Email account username. Usually the full email address. + # :email: "replies@gitlab.example.com" + # # Email account password + # :password: "password" + # # The name of the mailbox where incoming mail will end up. Usually "inbox". + # :name: "inbox" + # # Always "sidekiq". + # :delivery_method: sidekiq + # # Always true. + # :delete_after_delivery: true + # :delivery_options: + # # The URL to the Redis server used by Sidekiq. Should match the URL in config/resque.yml. + # :redis_url: redis://localhost:6379 + # # Always "resque:gitlab". + # :namespace: resque:gitlab + # # Always "incoming_email". + # :queue: incoming_email + # # Always "EmailReceiverWorker" + # :worker: EmailReceiverWorker diff --git a/config/routes.rb b/config/routes.rb index 1166a4b3eb..512dda7b54 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,100 @@ require 'sidekiq/web' require 'api/api' Gitlab::Application.routes.draw do + namespace :ci do + # CI API + Ci::API::API.logger Rails.logger + mount Ci::API::API => '/api' + + resource :lint, only: [:show, :create] + + resources :projects do + collection do + post :add + get :disabled + end + + member do + get :status, to: 'projects#badge' + get :integration + post :toggle_shared_runners + get :dumped_yaml + end + + resources :services, only: [:index, :edit, :update] do + member do + get :test + end + end + + resource :charts, only: [:show] + + resources :refs, constraints: { ref_id: /.*/ }, only: [] do + resources :commits, only: [:show] do + member do + get :status + get :cancel + end + end + end + + resources :builds, only: [:show] do + member do + get :cancel + get :status + post :retry + end + end + + resources :web_hooks, only: [:index, :create, :destroy] do + member do + get :test + end + end + + resources :triggers, only: [:index, :create, :destroy] + + resources :runners, only: [:index, :edit, :update, :destroy, :show] do + member do + get :resume + get :pause + end + end + + resources :runner_projects, only: [:create, :destroy] + + resources :events, only: [:index] + resource :variables, only: [:show, :update] + end + + resource :user_sessions do + get :auth + get :callback + end + + namespace :admin do + resources :runners, only: [:index, :show, :update, :destroy] do + member do + put :assign_all + get :resume + get :pause + end + end + + resources :events, only: [:index] + + resources :projects do + resources :runner_projects + end + + resources :builds, only: :index + + resource :application_settings, only: [:show, :update] + end + + root to: 'projects#index' + end + use_doorkeeper do controllers applications: 'oauth/applications', authorized_applications: 'oauth/authorized_applications', @@ -30,12 +124,7 @@ Gitlab::Application.routes.draw do end # Enable Grack support - mount Grack::Bundle.new({ - git_path: Gitlab.config.git.bin_path, - project_root: Gitlab.config.gitlab_shell.repos_path, - upload_pack: Gitlab.config.gitlab_shell.upload_pack, - receive_pack: Gitlab.config.gitlab_shell.receive_pack - }), at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] + mount Grack::AuthSpawner, at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] # Help get 'help' => 'help#index' @@ -104,6 +193,15 @@ Gitlab::Application.routes.draw do get :new_user_map, path: :user_map post :create_user_map, path: :user_map end + + resource :fogbugz, only: [:create, :new], controller: :fogbugz do + get :status + post :callback + get :jobs + + get :new_user_map, path: :user_map + post :create_user_map, path: :user_map + end end # @@ -139,6 +237,7 @@ Gitlab::Application.routes.draw do end resources :groups, only: [:index] + resources :snippets, only: [:index] root to: 'projects#trending' end @@ -206,6 +305,8 @@ Gitlab::Application.routes.draw do resources :services end + resources :labels + root to: 'dashboard#index' end @@ -257,23 +358,25 @@ Gitlab::Application.routes.draw do # # Dashboard Area # - resource :dashboard, controller: 'dashboard', only: [:show] do - member do - get :issues - get :merge_requests - end + resource :dashboard, controller: 'dashboard', only: [] do + get :issues + get :merge_requests + get :activity scope module: :dashboard do resources :milestones, only: [:index, :show] resources :groups, only: [:index] + resources :snippets, only: [:index] - resources :projects, only: [] do + resources :projects, only: [:index] do collection do get :starred end end end + + root to: "dashboard/projects#index" end # @@ -297,7 +400,7 @@ Gitlab::Application.routes.draw do end end - resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] + resources :projects, constraints: { id: /[^\/]+/ }, only: [:index, :new, :create] devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations , passwords: :passwords, sessions: :sessions, confirmations: :confirmations } @@ -305,7 +408,7 @@ Gitlab::Application.routes.draw do get '/users/auth/:provider/omniauth_error' => 'omniauth_callbacks#omniauth_error', as: :omniauth_error end - root to: "root#show" + root to: "root#index" # # Project Area @@ -349,6 +452,16 @@ Gitlab::Application.routes.draw do to: 'blob#destroy', constraints: { id: /.+/, format: false } ) + put( + '/blob/*id', + to: 'blob#update', + constraints: { id: /.+/, format: false } + ) + post( + '/blob/*id', + to: 'blob#create', + constraints: { id: /.+/, format: false } + ) end scope do @@ -410,16 +523,20 @@ Gitlab::Application.routes.draw do end end - resources :wikis, only: [:show, :edit, :destroy, :create], constraints: { id: /[a-zA-Z.0-9_\-\/]+/ } do - collection do - get :pages - put ':id' => 'wikis#update' - get :git_access - end + WIKI_SLUG_ID = { id: /[a-zA-Z.0-9_\-\/]+/ } unless defined? WIKI_SLUG_ID - member do - get 'history' - end + scope do + # Order matters to give priority to these matches + get '/wikis/git_access', to: 'wikis#git_access' + get '/wikis/pages', to: 'wikis#pages', as: 'wiki_pages' + post '/wikis', to: 'wikis#create' + + get '/wikis/*id/history', to: 'wikis#history', as: 'wiki_history', constraints: WIKI_SLUG_ID + get '/wikis/*id/edit', to: 'wikis#edit', as: 'wiki_edit', constraints: WIKI_SLUG_ID + + get '/wikis/*id', to: 'wikis#show', as: 'wiki', constraints: WIKI_SLUG_ID + delete '/wikis/*id', to: 'wikis#destroy', constraints: WIKI_SLUG_ID + put '/wikis/*id', to: 'wikis#update', constraints: WIKI_SLUG_ID end resource :repository, only: [:show, :create] do @@ -463,8 +580,8 @@ Gitlab::Application.routes.draw do member do get :diffs get :commits - post :automerge - get :automerge_check + post :merge + get :merge_check get :ci_status post :toggle_subscription end diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 0000000000..8122f7cc69 --- /dev/null +++ b/config/schedule.rb @@ -0,0 +1,8 @@ +# Use this file to easily define all of your cron jobs. +# +# If you make changes to this file, please create also an issue on +# https://gitlab.com/gitlab-org/omnibus-gitlab/issues . This is necessary +# because the omnibus packages manage cron jobs using Chef instead of Whenever. +every 1.hour do + rake "ci:schedule_builds" +end diff --git a/config/secrets.yml.example b/config/secrets.yml.example new file mode 100644 index 0000000000..6b408ac603 --- /dev/null +++ b/config/secrets.yml.example @@ -0,0 +1,12 @@ +production: + # db_key_base is used to encrypt for Variables. Ensure that you don't lose it. + # If you change or lose this key you will be unable to access variables stored in database. + # Make sure the secret is at least 30 characters and all random, + # no regular words or you'll be exposed to dictionary attacks. + # db_key_base: + +development: + db_key_base: development + +test: + db_key_base: test diff --git a/config/sidekiq.yml.example b/config/sidekiq.yml.example new file mode 100644 index 0000000000..c691db67c6 --- /dev/null +++ b/config/sidekiq.yml.example @@ -0,0 +1,2 @@ +-- +:concurrency: 5 \ No newline at end of file diff --git a/db/fixtures/production/001_admin.rb b/db/fixtures/production/001_admin.rb index 1c8740f6ba..b0c0b6450f 100644 --- a/db/fixtures/production/001_admin.rb +++ b/db/fixtures/production/001_admin.rb @@ -19,7 +19,7 @@ admin = User.create( admin.projects_limit = 10000 admin.admin = true admin.save! -admin.confirm! +admin.confirm if admin.valid? puts %Q[ diff --git a/db/migrate/20150812080800_add_settings_import_sources.rb b/db/migrate/20150812080800_add_settings_import_sources.rb new file mode 100644 index 0000000000..276d2fdb2b --- /dev/null +++ b/db/migrate/20150812080800_add_settings_import_sources.rb @@ -0,0 +1,11 @@ +require 'yaml' + +class AddSettingsImportSources < ActiveRecord::Migration + def change + unless column_exists?(:application_settings, :import_sources) + add_column :application_settings, :import_sources, :text + import_sources = YAML::dump(Settings.gitlab['import_sources']) + execute("update application_settings set import_sources = '#{import_sources}'") + end + end +end diff --git a/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb b/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb new file mode 100644 index 0000000000..de2078a926 --- /dev/null +++ b/db/migrate/20150814065925_remove_oauth_tokens_from_users.rb @@ -0,0 +1,8 @@ +class RemoveOauthTokensFromUsers < ActiveRecord::Migration + def change + remove_column :users, :github_access_token, :string + remove_column :users, :gitlab_access_token, :string + remove_column :users, :bitbucket_access_token, :string + remove_column :users, :bitbucket_access_token_secret, :string + end +end diff --git a/db/migrate/20150817163600_deduplicate_user_identities.rb b/db/migrate/20150817163600_deduplicate_user_identities.rb new file mode 100644 index 0000000000..fceffc4801 --- /dev/null +++ b/db/migrate/20150817163600_deduplicate_user_identities.rb @@ -0,0 +1,14 @@ +class DeduplicateUserIdentities < ActiveRecord::Migration + def change + execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' + execute 'CREATE TABLE tt_migration_DeduplicateUserIdentities AS SELECT id,provider,user_id FROM identities;' + execute 'DELETE FROM identities WHERE id NOT IN ( SELECT MIN(id) FROM tt_migration_DeduplicateUserIdentities GROUP BY user_id, provider);' + execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' + end + + def down + # This is an irreversible migration; + # If someone is trying to rollback for other reasons, we should not throw an Exception. + # raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20150818213832_add_sent_notifications.rb b/db/migrate/20150818213832_add_sent_notifications.rb new file mode 100644 index 0000000000..43e8d6a1a8 --- /dev/null +++ b/db/migrate/20150818213832_add_sent_notifications.rb @@ -0,0 +1,13 @@ +class AddSentNotifications < ActiveRecord::Migration + def change + create_table :sent_notifications do |t| + t.references :project + t.references :noteable, polymorphic: true + t.references :recipient + t.string :commit_id + t.string :reply_key, null: false + end + + add_index :sent_notifications, :reply_key, unique: true + end +end diff --git a/db/migrate/20150824002011_add_enable_ssl_verification.rb b/db/migrate/20150824002011_add_enable_ssl_verification.rb new file mode 100644 index 0000000000..093c068fbd --- /dev/null +++ b/db/migrate/20150824002011_add_enable_ssl_verification.rb @@ -0,0 +1,5 @@ +class AddEnableSslVerification < ActiveRecord::Migration + def change + add_column :web_hooks, :enable_ssl_verification, :boolean, default: false + end +end diff --git a/db/migrate/20150826001931_add_ci_tables.rb b/db/migrate/20150826001931_add_ci_tables.rb new file mode 100644 index 0000000000..c4f51363e5 --- /dev/null +++ b/db/migrate/20150826001931_add_ci_tables.rb @@ -0,0 +1,190 @@ +class AddCiTables < ActiveRecord::Migration + def change + create_table "ci_application_settings", force: true do |t| + t.boolean "all_broken_builds" + t.boolean "add_pusher" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "ci_builds", force: true do |t| + t.integer "project_id" + t.string "status" + t.datetime "finished_at" + t.text "trace" + t.datetime "created_at" + t.datetime "updated_at" + t.datetime "started_at" + t.integer "runner_id" + t.float "coverage" + t.integer "commit_id" + t.text "commands" + t.integer "job_id" + t.string "name" + t.boolean "deploy", default: false + t.text "options" + t.boolean "allow_failure", default: false, null: false + t.string "stage" + t.integer "trigger_request_id" + end + + add_index "ci_builds", ["commit_id"], name: "index_ci_builds_on_commit_id", using: :btree + add_index "ci_builds", ["project_id", "commit_id"], name: "index_ci_builds_on_project_id_and_commit_id", using: :btree + add_index "ci_builds", ["project_id"], name: "index_ci_builds_on_project_id", using: :btree + add_index "ci_builds", ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree + + create_table "ci_commits", force: true do |t| + t.integer "project_id" + t.string "ref" + t.string "sha" + t.string "before_sha" + t.text "push_data" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "tag", default: false + t.text "yaml_errors" + t.datetime "committed_at" + end + + add_index "ci_commits", ["project_id", "committed_at"], name: "index_ci_commits_on_project_id_and_committed_at", using: :btree + add_index "ci_commits", ["project_id", "sha"], name: "index_ci_commits_on_project_id_and_sha", using: :btree + add_index "ci_commits", ["project_id"], name: "index_ci_commits_on_project_id", using: :btree + add_index "ci_commits", ["sha"], name: "index_ci_commits_on_sha", using: :btree + + create_table "ci_events", force: true do |t| + t.integer "project_id" + t.integer "user_id" + t.integer "is_admin" + t.text "description" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_events", ["created_at"], name: "index_ci_events_on_created_at", using: :btree + add_index "ci_events", ["is_admin"], name: "index_ci_events_on_is_admin", using: :btree + add_index "ci_events", ["project_id"], name: "index_ci_events_on_project_id", using: :btree + + create_table "ci_jobs", force: true do |t| + t.integer "project_id", null: false + t.text "commands" + t.boolean "active", default: true, null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.boolean "build_branches", default: true, null: false + t.boolean "build_tags", default: false, null: false + t.string "job_type", default: "parallel" + t.string "refs" + t.datetime "deleted_at" + end + + add_index "ci_jobs", ["deleted_at"], name: "index_ci_jobs_on_deleted_at", using: :btree + add_index "ci_jobs", ["project_id"], name: "index_ci_jobs_on_project_id", using: :btree + + create_table "ci_projects", force: true do |t| + t.string "name", null: false + t.integer "timeout", default: 3600, null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "token" + t.string "default_ref" + t.string "path" + t.boolean "always_build", default: false, null: false + t.integer "polling_interval" + t.boolean "public", default: false, null: false + t.string "ssh_url_to_repo" + t.integer "gitlab_id" + t.boolean "allow_git_fetch", default: true, null: false + t.string "email_recipients", default: "", null: false + t.boolean "email_add_pusher", default: true, null: false + t.boolean "email_only_broken_builds", default: true, null: false + t.string "skip_refs" + t.string "coverage_regex" + t.boolean "shared_runners_enabled", default: false + t.text "generated_yaml_config" + end + + create_table "ci_runner_projects", force: true do |t| + t.integer "runner_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_runner_projects", ["project_id"], name: "index_ci_runner_projects_on_project_id", using: :btree + add_index "ci_runner_projects", ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree + + create_table "ci_runners", force: true do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" + t.string "description" + t.datetime "contacted_at" + t.boolean "active", default: true, null: false + t.boolean "is_shared", default: false + t.string "name" + t.string "version" + t.string "revision" + t.string "platform" + t.string "architecture" + end + + create_table "ci_services", force: true do |t| + t.string "type" + t.string "title" + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "active", default: false, null: false + t.text "properties" + end + + add_index "ci_services", ["project_id"], name: "index_ci_services_on_project_id", using: :btree + + create_table "ci_sessions", force: true do |t| + t.string "session_id", null: false + t.text "data" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_sessions", ["session_id"], name: "index_ci_sessions_on_session_id", using: :btree + add_index "ci_sessions", ["updated_at"], name: "index_ci_sessions_on_updated_at", using: :btree + + create_table "ci_trigger_requests", force: true do |t| + t.integer "trigger_id", null: false + t.text "variables" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "commit_id" + end + + create_table "ci_triggers", force: true do |t| + t.string "token" + t.integer "project_id", null: false + t.datetime "deleted_at" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_triggers", ["deleted_at"], name: "index_ci_triggers_on_deleted_at", using: :btree + + create_table "ci_variables", force: true do |t| + t.integer "project_id", null: false + t.string "key" + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + end + + add_index "ci_variables", ["project_id"], name: "index_ci_variables_on_project_id", using: :btree + + create_table "ci_web_hooks", force: true do |t| + t.string "url", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + end +end diff --git a/db/migrate/20150902001023_add_template_to_label.rb b/db/migrate/20150902001023_add_template_to_label.rb new file mode 100644 index 0000000000..bd381a97b6 --- /dev/null +++ b/db/migrate/20150902001023_add_template_to_label.rb @@ -0,0 +1,5 @@ +class AddTemplateToLabel < ActiveRecord::Migration + def change + add_column :labels, :template, :boolean, default: false + end +end \ No newline at end of file diff --git a/db/migrate/20150914215247_add_ci_tags.rb b/db/migrate/20150914215247_add_ci_tags.rb new file mode 100644 index 0000000000..df3390e8a8 --- /dev/null +++ b/db/migrate/20150914215247_add_ci_tags.rb @@ -0,0 +1,23 @@ +class AddCiTags < ActiveRecord::Migration + def change + create_table "ci_taggings", force: true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", limit: 128 + t.datetime "created_at" + end + + add_index "ci_taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "ci_taggings_idx", unique: true, using: :btree + add_index "ci_taggings", ["taggable_id", "taggable_type", "context"], name: "index_ci_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree + + create_table "ci_tags", force: true do |t| + t.string "name" + t.integer "taggings_count", default: 0 + end + + add_index "ci_tags", ["name"], name: "index_ci_tags_on_name", unique: true, using: :btree + end +end diff --git a/db/migrate/20150915001905_enable_ssl_verification_by_default.rb b/db/migrate/20150915001905_enable_ssl_verification_by_default.rb new file mode 100644 index 0000000000..6e924262a1 --- /dev/null +++ b/db/migrate/20150915001905_enable_ssl_verification_by_default.rb @@ -0,0 +1,5 @@ +class EnableSslVerificationByDefault < ActiveRecord::Migration + def change + change_column :web_hooks, :enable_ssl_verification, :boolean, default: true + end +end diff --git a/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb b/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb new file mode 100644 index 0000000000..90ce6c2db3 --- /dev/null +++ b/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb @@ -0,0 +1,8 @@ +class EnableSslVerificationForWebHooks < ActiveRecord::Migration + def up + execute("UPDATE web_hooks SET enable_ssl_verification = true") + end + + def down + end +end diff --git a/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb b/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb new file mode 100644 index 0000000000..37a27f1193 --- /dev/null +++ b/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb @@ -0,0 +1,5 @@ +class AddHelpPageTextToApplicationSettings < ActiveRecord::Migration + def change + add_column :application_settings, :help_page_text, :text + end +end diff --git a/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb b/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb new file mode 100644 index 0000000000..78d9e5f61a --- /dev/null +++ b/db/migrate/20150916145038_add_index_for_committed_at_and_id.rb @@ -0,0 +1,5 @@ +class AddIndexForCommittedAtAndId < ActiveRecord::Migration + def change + add_index :ci_commits, [:project_id, :committed_at, :id] + end +end diff --git a/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb b/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb new file mode 100644 index 0000000000..6cf668a170 --- /dev/null +++ b/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb @@ -0,0 +1,5 @@ +class AddCiEnabledToApplicationSettings < ActiveRecord::Migration + def change + add_column :application_settings, :ci_enabled, :boolean, null: false, default: true + end +end diff --git a/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb b/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb new file mode 100644 index 0000000000..0aad6fe5e6 --- /dev/null +++ b/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb @@ -0,0 +1,5 @@ +class RemoveInvalidMilestonesFromMergeRequests < ActiveRecord::Migration + def up + execute("UPDATE merge_requests SET milestone_id = NULL where milestone_id NOT IN (SELECT id FROM milestones)") + end +end diff --git a/db/migrate/20150920010715_add_consumed_timestep_to_users.rb b/db/migrate/20150920010715_add_consumed_timestep_to_users.rb new file mode 100644 index 0000000000..c8438b3f6a --- /dev/null +++ b/db/migrate/20150920010715_add_consumed_timestep_to_users.rb @@ -0,0 +1,5 @@ +class AddConsumedTimestepToUsers < ActiveRecord::Migration + def change + add_column :users, :consumed_timestep, :integer + end +end diff --git a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb new file mode 100644 index 0000000000..d9af4e7175 --- /dev/null +++ b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb @@ -0,0 +1,5 @@ +class AddLineCodeToSentNotification < ActiveRecord::Migration + def change + add_column :sent_notifications, :line_code, :string + end +end diff --git a/db/migrate/limits_to_mysql.rb b/db/migrate/limits_to_mysql.rb index 2b7afae6d7..73605d4c5e 100644 --- a/db/migrate/limits_to_mysql.rb +++ b/db/migrate/limits_to_mysql.rb @@ -6,5 +6,9 @@ class LimitsToMysql < ActiveRecord::Migration change_column :merge_request_diffs, :st_diffs, :text, limit: 2147483647 change_column :snippets, :content, :text, limit: 2147483647 change_column :notes, :st_diff, :text, limit: 2147483647 + + # CI + change_column :ci_builds, :trace, :text, limit: 1073741823 + change_column :ci_commits, :push_data, :text, limit: 16777215 end end diff --git a/db/schema.rb b/db/schema.rb index 6e919f2883..01ccda7a75 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150806104937) do +ActiveRecord::Schema.define(version: 20150920161119) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -44,6 +44,9 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.boolean "user_oauth_applications", default: true t.string "after_sign_out_path" t.integer "session_expire_delay", default: 10080, null: false + t.text "import_sources" + t.text "help_page_text" + t.boolean "ci_enabled", default: true, null: false end create_table "audit_events", force: true do |t| @@ -71,6 +74,214 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.string "font" end + create_table "ci_application_settings", force: true do |t| + t.boolean "all_broken_builds" + t.boolean "add_pusher" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "ci_builds", force: true do |t| + t.integer "project_id" + t.string "status" + t.datetime "finished_at" + t.text "trace" + t.datetime "created_at" + t.datetime "updated_at" + t.datetime "started_at" + t.integer "runner_id" + t.float "coverage" + t.integer "commit_id" + t.text "commands" + t.integer "job_id" + t.string "name" + t.boolean "deploy", default: false + t.text "options" + t.boolean "allow_failure", default: false, null: false + t.string "stage" + t.integer "trigger_request_id" + end + + add_index "ci_builds", ["commit_id"], name: "index_ci_builds_on_commit_id", using: :btree + add_index "ci_builds", ["project_id", "commit_id"], name: "index_ci_builds_on_project_id_and_commit_id", using: :btree + add_index "ci_builds", ["project_id"], name: "index_ci_builds_on_project_id", using: :btree + add_index "ci_builds", ["runner_id"], name: "index_ci_builds_on_runner_id", using: :btree + + create_table "ci_commits", force: true do |t| + t.integer "project_id" + t.string "ref" + t.string "sha" + t.string "before_sha" + t.text "push_data" + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "tag", default: false + t.text "yaml_errors" + t.datetime "committed_at" + end + + add_index "ci_commits", ["project_id", "committed_at", "id"], name: "index_ci_commits_on_project_id_and_committed_at_and_id", using: :btree + add_index "ci_commits", ["project_id", "committed_at"], name: "index_ci_commits_on_project_id_and_committed_at", using: :btree + add_index "ci_commits", ["project_id", "sha"], name: "index_ci_commits_on_project_id_and_sha", using: :btree + add_index "ci_commits", ["project_id"], name: "index_ci_commits_on_project_id", using: :btree + add_index "ci_commits", ["sha"], name: "index_ci_commits_on_sha", using: :btree + + create_table "ci_events", force: true do |t| + t.integer "project_id" + t.integer "user_id" + t.integer "is_admin" + t.text "description" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_events", ["created_at"], name: "index_ci_events_on_created_at", using: :btree + add_index "ci_events", ["is_admin"], name: "index_ci_events_on_is_admin", using: :btree + add_index "ci_events", ["project_id"], name: "index_ci_events_on_project_id", using: :btree + + create_table "ci_jobs", force: true do |t| + t.integer "project_id", null: false + t.text "commands" + t.boolean "active", default: true, null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "name" + t.boolean "build_branches", default: true, null: false + t.boolean "build_tags", default: false, null: false + t.string "job_type", default: "parallel" + t.string "refs" + t.datetime "deleted_at" + end + + add_index "ci_jobs", ["deleted_at"], name: "index_ci_jobs_on_deleted_at", using: :btree + add_index "ci_jobs", ["project_id"], name: "index_ci_jobs_on_project_id", using: :btree + + create_table "ci_projects", force: true do |t| + t.string "name", null: false + t.integer "timeout", default: 3600, null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "token" + t.string "default_ref" + t.string "path" + t.boolean "always_build", default: false, null: false + t.integer "polling_interval" + t.boolean "public", default: false, null: false + t.string "ssh_url_to_repo" + t.integer "gitlab_id" + t.boolean "allow_git_fetch", default: true, null: false + t.string "email_recipients", default: "", null: false + t.boolean "email_add_pusher", default: true, null: false + t.boolean "email_only_broken_builds", default: true, null: false + t.string "skip_refs" + t.string "coverage_regex" + t.boolean "shared_runners_enabled", default: false + t.text "generated_yaml_config" + end + + create_table "ci_runner_projects", force: true do |t| + t.integer "runner_id", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_runner_projects", ["project_id"], name: "index_ci_runner_projects_on_project_id", using: :btree + add_index "ci_runner_projects", ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree + + create_table "ci_runners", force: true do |t| + t.string "token" + t.datetime "created_at" + t.datetime "updated_at" + t.string "description" + t.datetime "contacted_at" + t.boolean "active", default: true, null: false + t.boolean "is_shared", default: false + t.string "name" + t.string "version" + t.string "revision" + t.string "platform" + t.string "architecture" + end + + create_table "ci_services", force: true do |t| + t.string "type" + t.string "title" + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.boolean "active", default: false, null: false + t.text "properties" + end + + add_index "ci_services", ["project_id"], name: "index_ci_services_on_project_id", using: :btree + + create_table "ci_sessions", force: true do |t| + t.string "session_id", null: false + t.text "data" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_sessions", ["session_id"], name: "index_ci_sessions_on_session_id", using: :btree + add_index "ci_sessions", ["updated_at"], name: "index_ci_sessions_on_updated_at", using: :btree + + create_table "ci_taggings", force: true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", limit: 128 + t.datetime "created_at" + end + + add_index "ci_taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "ci_taggings_idx", unique: true, using: :btree + add_index "ci_taggings", ["taggable_id", "taggable_type", "context"], name: "index_ci_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree + + create_table "ci_tags", force: true do |t| + t.string "name" + t.integer "taggings_count", default: 0 + end + + add_index "ci_tags", ["name"], name: "index_ci_tags_on_name", unique: true, using: :btree + + create_table "ci_trigger_requests", force: true do |t| + t.integer "trigger_id", null: false + t.text "variables" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "commit_id" + end + + create_table "ci_triggers", force: true do |t| + t.string "token" + t.integer "project_id", null: false + t.datetime "deleted_at" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "ci_triggers", ["deleted_at"], name: "index_ci_triggers_on_deleted_at", using: :btree + + create_table "ci_variables", force: true do |t| + t.integer "project_id", null: false + t.string "key" + t.text "value" + t.text "encrypted_value" + t.string "encrypted_value_salt" + t.string "encrypted_value_iv" + end + + add_index "ci_variables", ["project_id"], name: "index_ci_variables_on_project_id", using: :btree + + create_table "ci_web_hooks", force: true do |t| + t.string "url", null: false + t.integer "project_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "deploy_keys_projects", force: true do |t| t.integer "deploy_key_id", null: false t.integer "project_id", null: false @@ -185,6 +396,7 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.integer "project_id" t.datetime "created_at" t.datetime "updated_at" + t.boolean "template", default: false end add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree @@ -404,6 +616,18 @@ ActiveRecord::Schema.define(version: 20150806104937) do add_index "protected_branches", ["project_id"], name: "index_protected_branches_on_project_id", using: :btree + create_table "sent_notifications", force: true do |t| + t.integer "project_id" + t.integer "noteable_id" + t.string "noteable_type" + t.integer "recipient_id" + t.string "commit_id" + t.string "reply_key", null: false + t.string "line_code" + end + + add_index "sent_notifications", ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true, using: :btree + create_table "services", force: true do |t| t.string "type" t.string "title" @@ -475,12 +699,12 @@ ActiveRecord::Schema.define(version: 20150806104937) do add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree create_table "users", force: true do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0 + t.integer "sign_in_count", default: 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" @@ -488,22 +712,22 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.datetime "created_at" t.datetime "updated_at" t.string "name" - t.boolean "admin", default: false, null: false - t.integer "projects_limit", default: 10 - t.string "skype", default: "", null: false - t.string "linkedin", default: "", null: false - t.string "twitter", default: "", null: false + t.boolean "admin", default: false, null: false + t.integer "projects_limit", default: 10 + t.string "skype", default: "", null: false + t.string "linkedin", default: "", null: false + t.string "twitter", default: "", null: false t.string "authentication_token" - t.integer "theme_id", default: 1, null: false + t.integer "theme_id", default: 1, null: false t.string "bio" - t.integer "failed_attempts", default: 0 + t.integer "failed_attempts", default: 0 t.datetime "locked_at" t.string "username" - t.boolean "can_create_group", default: true, null: false - t.boolean "can_create_team", default: true, null: false + t.boolean "can_create_group", default: true, null: false + t.boolean "can_create_team", default: true, null: false t.string "state" - t.integer "color_scheme_id", default: 1, null: false - t.integer "notification_level", default: 1, null: false + t.integer "color_scheme_id", default: 1, null: false + t.integer "notification_level", default: 1, null: false t.datetime "password_expires_at" t.integer "created_by_id" t.datetime "last_credential_check_at" @@ -512,24 +736,21 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.datetime "confirmed_at" t.datetime "confirmation_sent_at" t.string "unconfirmed_email" - t.boolean "hide_no_ssh_key", default: false - t.string "website_url", default: "", null: false - t.string "github_access_token" - t.string "gitlab_access_token" + t.boolean "hide_no_ssh_key", default: false + t.string "website_url", default: "", null: false t.string "notification_email" - t.boolean "hide_no_password", default: false - t.boolean "password_automatically_set", default: false - t.string "bitbucket_access_token" - t.string "bitbucket_access_token_secret" + t.boolean "hide_no_password", default: false + t.boolean "password_automatically_set", default: false t.string "location" t.string "encrypted_otp_secret" t.string "encrypted_otp_secret_iv" t.string "encrypted_otp_secret_salt" - t.boolean "otp_required_for_login", default: false, null: false + t.boolean "otp_required_for_login", default: false, null: false t.text "otp_backup_codes" - t.string "public_email", default: "", null: false - t.integer "dashboard", default: 0 - t.integer "project_view", default: 0 + t.string "public_email", default: "", null: false + t.integer "dashboard", default: 0 + t.integer "project_view", default: 0 + t.integer "consumed_timestep" end add_index "users", ["admin"], name: "index_users_on_admin", using: :btree @@ -558,13 +779,14 @@ ActiveRecord::Schema.define(version: 20150806104937) do t.integer "project_id" t.datetime "created_at" t.datetime "updated_at" - t.string "type", default: "ProjectHook" + t.string "type", default: "ProjectHook" t.integer "service_id" - t.boolean "push_events", default: true, null: false - t.boolean "issues_events", default: false, null: false - t.boolean "merge_requests_events", default: false, null: false - t.boolean "tag_push_events", default: false - t.boolean "note_events", default: false, null: false + t.boolean "push_events", default: true, null: false + t.boolean "issues_events", default: false, null: false + t.boolean "merge_requests_events", default: false, null: false + t.boolean "tag_push_events", default: false + t.boolean "note_events", default: false, null: false + t.boolean "enable_ssl_verification", default: true end add_index "web_hooks", ["created_at", "id"], name: "index_web_hooks_on_created_at_and_id", using: :btree diff --git a/doc/README.md b/doc/README.md index 0524fda3ed..a0ff856ebb 100644 --- a/doc/README.md +++ b/doc/README.md @@ -15,6 +15,23 @@ - [Web hooks](web_hooks/web_hooks.md) Let GitLab notify you when new code has been pushed to your project. - [Workflow](workflow/README.md) Using GitLab functionality and importing projects from GitHub and SVN. +## CI Documentation + ++ [Quick Start](ci/quick_start/README.md) ++ [Configuring project (.gitlab-ci.yml)](ci/yaml/README.md) ++ [Configuring runner](ci/runners/README.md) ++ [Configuring deployment](ci/deployment/README.md) ++ [Using Docker Images](ci/docker/using_docker_images.md) ++ [Using Docker Build](ci/docker/using_docker_build.md) ++ [Using Variables](ci/variables/README.md) + +### CI Examples + ++ [Test and deploy Ruby applications to Heroku](ci/examples/test-and-deploy-ruby-application-to-heroku.md) ++ [Test and deploy Python applications to Heroku](ci/examples/test-and-deploy-python-application-to-heroku.md) ++ [Test Clojure applications](ci/examples/test-clojure-application.md) ++ Help your favorite programming language and GitLab by sending a merge request with a guide for that language. + ## Administrator documentation - [Custom git hooks](hooks/custom_hooks.md) Custom git hooks (on the filesystem) for when web hooks aren't enough. @@ -29,6 +46,13 @@ - [System hooks](system_hooks/system_hooks.md) Notifications when users, projects and keys are changed. - [Update](update/README.md) Update guides to upgrade your installation. - [Welcome message](customization/welcome_message.md) Add a custom welcome message to the sign-in page. +- [Reply by email](incoming_email/README.md) Allow users to comment on issues and merge requests by replying to notification emails. +- [Migrate GitLab CI to CE/EE](migrate_ci_to_ce/README.md) Follow this guide to migrate your existing GitLab CI data to GitLab CE/EE. + +### Administrator documentation + ++ [User permissions](permissions/permissions.md) ++ [API](api/README.md) ## Contributor documentation diff --git a/doc/api/README.md b/doc/api/README.md index f369c3fd97..6b8528de50 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -21,6 +21,7 @@ - [Groups](groups.md) - [Namespaces](namespaces.md) - [Settings](settings.md) +- [Keys](keys.md) ## Clients diff --git a/doc/api/keys.md b/doc/api/keys.md new file mode 100644 index 0000000000..faa6f212b4 --- /dev/null +++ b/doc/api/keys.md @@ -0,0 +1,46 @@ +# Keys + +## Get SSH key with user by ID of an SSH key + +Get SSH key with user by ID of an SSH key. Note only administrators can lookup SSH key with user by ID of an SSH key. + +``` +GET /keys/:id +``` + +Parameters: + +- `id` (required) - The ID of an SSH key + +```json +{ + "id": 1, + "title": "Sample key 25", + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1256k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", + "created_at": "2015-09-03T07:24:44.627Z", + "user": { + "name": "John Smith", + "username": "john_smith", + "id": 25, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/cfa35b8cd2ec278026357769582fa563?s=40\u0026d=identicon", + "web_url": "http://localhost:3000/u/john_smith", + "created_at": "2015-09-03T07:24:01.670Z", + "is_admin": false, + "bio": null, + "skype": "", + "linkedin": "", + "twitter": "", + "website_url": "", + "email": "john@example.com", + "theme_id": 2, + "color_scheme_id": 1, + "projects_limit": 10, + "current_sign_in_at": null, + "identities": [], + "can_create_group": true, + "can_create_project": true, + "two_factor_enabled": false + } +} +``` diff --git a/doc/api/services.md b/doc/api/services.md index cbf767d1b2..7d45b2cf46 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -1,8 +1,384 @@ # Services +## Asana + +Asana - Teamwork without email + +### Create/Edit Asana service + +Set Asana service for a project. + +> This service adds commit messages as comments to Asana tasks. Once enabled, commit messages are checked for Asana task URLs (for example, `https://app.asana.com/0/123456/987654`) or task IDs starting with # (for example, `#987654`). Every task ID found will get the commit comment added to it. You can also close a task with a message containing: `fix #123456`. You can find your Api Keys here: http://developer.asana.com/documentation/#api_keys + +``` +PUT /projects/:id/services/asana +``` + +Parameters: + +- `api_key` (**required**) - User API token. User must have access to task,all comments will be attributed to this user. +- `restrict_to_branch` (optional) - Comma-separated list of branches which will beautomatically inspected. Leave blank to include all branches. + +### Delete Asana service + +Delete Asana service for a project. + +``` +DELETE /projects/:id/services/asana +``` + +### Get Asana service settings + +Get Asana service settings for a project. + +``` +GET /projects/:id/services/asana +``` + +## Assembla + +Project Management Software (Source Commits Endpoint) + +### Create/Edit Assembla service + +Set Assembla service for a project. + +``` +PUT /projects/:id/services/assembla +``` + +Parameters: + +- `token` (**required**) +- `subdomain` (optional) + +### Delete Assembla service + +Delete Assembla service for a project. + +``` +DELETE /projects/:id/services/assembla +``` + +### Get Assembla service settings + +Get Assembla service settings for a project. + +``` +GET /projects/:id/services/assembla +``` + +## Atlassian Bamboo CI + +A continuous integration and build server + +### Create/Edit Atlassian Bamboo CI service + +Set Atlassian Bamboo CI service for a project. + +> You must set up automatic revision labeling and a repository trigger in Bamboo. + +``` +PUT /projects/:id/services/bamboo +``` + +Parameters: + +- `bamboo_url` (**required**) - Bamboo root URL like https://bamboo.example.com +- `build_key` (**required**) - Bamboo build plan key like KEY +- `username` (**required**) - A user with API access, if applicable +- `password` (**required**) + +### Delete Atlassian Bamboo CI service + +Delete Atlassian Bamboo CI service for a project. + +``` +DELETE /projects/:id/services/bamboo +``` + +### Get Atlassian Bamboo CI service settings + +Get Atlassian Bamboo CI service settings for a project. + +``` +GET /projects/:id/services/bamboo +``` + +## Buildkite + +Continuous integration and deployments + +### Create/Edit Buildkite service + +Set Buildkite service for a project. + +``` +PUT /projects/:id/services/buildkite +``` + +Parameters: + +- `token` (**required**) - Buildkite project GitLab token +- `project_url` (**required**) - https://buildkite.com/example/project +- `enable_ssl_verification` (optional) - Enable SSL verification + +### Delete Buildkite service + +Delete Buildkite service for a project. + +``` +DELETE /projects/:id/services/buildkite +``` + +### Get Buildkite service settings + +Get Buildkite service settings for a project. + +``` +GET /projects/:id/services/buildkite +``` + +## Campfire + +Simple web-based real-time group chat + +### Create/Edit Campfire service + +Set Campfire service for a project. + +``` +PUT /projects/:id/services/campfire +``` + +Parameters: + +- `token` (**required**) +- `subdomain` (optional) +- `room` (optional) + +### Delete Campfire service + +Delete Campfire service for a project. + +``` +DELETE /projects/:id/services/campfire +``` + +### Get Campfire service settings + +Get Campfire service settings for a project. + +``` +GET /projects/:id/services/campfire +``` + +## Custom Issue Tracker + +Custom issue tracker + +### Create/Edit Custom Issue Tracker service + +Set Custom Issue Tracker service for a project. + +``` +PUT /projects/:id/services/custom-issue-tracker +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `issues_url` (**required**) - Issue url +- `project_url` (**required**) - Project url +- `description` (optional) - Custom issue tracker +- `title` (optional) - Custom Issue Tracker + +### Delete Custom Issue Tracker service + +Delete Custom Issue Tracker service for a project. + +``` +DELETE /projects/:id/services/custom-issue-tracker +``` + +### Get Custom Issue Tracker service settings + +Get Custom Issue Tracker service settings for a project. + +``` +GET /projects/:id/services/custom-issue-tracker +``` + +## Drone CI + +Drone is a Continuous Integration platform built on Docker, written in Go + +### Create/Edit Drone CI service + +Set Drone CI service for a project. + +``` +PUT /projects/:id/services/drone-ci +``` + +Parameters: + +- `token` (**required**) - Drone CI project specific token +- `drone_url` (**required**) - http://drone.example.com +- `enable_ssl_verification` (optional) - Enable SSL verification + +### Delete Drone CI service + +Delete Drone CI service for a project. + +``` +DELETE /projects/:id/services/drone-ci +``` + +### Get Drone CI service settings + +Get Drone CI service settings for a project. + +``` +GET /projects/:id/services/drone-ci +``` + +## Emails on push + +Email the commits and diff of each push to a list of recipients. + +### Create/Edit Emails on push service + +Set Emails on push service for a project. + +``` +PUT /projects/:id/services/emails-on-push +``` + +Parameters: + +- `recipients` (**required**) - Emails separated by whitespace +- `disable_diffs` (optional) - Disable code diffs +- `send_from_committer_email` (optional) - Send from committer + +### Delete Emails on push service + +Delete Emails on push service for a project. + +``` +DELETE /projects/:id/services/emails-on-push +``` + +### Get Emails on push service settings + +Get Emails on push service settings for a project. + +``` +GET /projects/:id/services/emails-on-push +``` + +## External Wiki + +Replaces the link to the internal wiki with a link to an external wiki. + +### Create/Edit External Wiki service + +Set External Wiki service for a project. + +``` +PUT /projects/:id/services/external-wiki +``` + +Parameters: + +- `external_wiki_url` (**required**) - The URL of the external Wiki + +### Delete External Wiki service + +Delete External Wiki service for a project. + +``` +DELETE /projects/:id/services/external-wiki +``` + +### Get External Wiki service settings + +Get External Wiki service settings for a project. + +``` +GET /projects/:id/services/external-wiki +``` + +## Flowdock + +Flowdock is a collaboration web app for technical teams. + +### Create/Edit Flowdock service + +Set Flowdock service for a project. + +``` +PUT /projects/:id/services/flowdock +``` + +Parameters: + +- `token` (**required**) - Flowdock Git source token + +### Delete Flowdock service + +Delete Flowdock service for a project. + +``` +DELETE /projects/:id/services/flowdock +``` + +### Get Flowdock service settings + +Get Flowdock service settings for a project. + +``` +GET /projects/:id/services/flowdock +``` + +## Gemnasium + +Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities. + +### Create/Edit Gemnasium service + +Set Gemnasium service for a project. + +``` +PUT /projects/:id/services/gemnasium +``` + +Parameters: + +- `api_key` (**required**) - Your personal API KEY on gemnasium.com +- `token` (**required**) - The project's slug on gemnasium.com + +### Delete Gemnasium service + +Delete Gemnasium service for a project. + +``` +DELETE /projects/:id/services/gemnasium +``` + +### Get Gemnasium service settings + +Get Gemnasium service settings for a project. + +``` +GET /projects/:id/services/gemnasium +``` + ## GitLab CI -### Edit GitLab CI service +Continuous integration server from GitLab + +### Create/Edit GitLab CI service Set GitLab CI service for a project. @@ -12,30 +388,46 @@ PUT /projects/:id/services/gitlab-ci Parameters: -- `token` (required) - CI project token -- `project_url` (required) - CI project URL +- `token` (**required**) - GitLab CI project specific token +- `project_url` (**required**) - http://ci.gitlabhq.com/projects/3 +- `enable_ssl_verification` (optional) - Enable SSL verification ### Delete GitLab CI service -Delete GitLab CI service settings for a project. +Delete GitLab CI service for a project. ``` DELETE /projects/:id/services/gitlab-ci ``` +### Get GitLab CI service settings + +Get GitLab CI service settings for a project. + +``` +GET /projects/:id/services/gitlab-ci +``` + ## HipChat -### Edit HipChat service +Private group chat and IM -Set HipChat service for project. +### Create/Edit HipChat service + +Set HipChat service for a project. ``` PUT /projects/:id/services/hipchat ``` + Parameters: -- `token` (required) - HipChat token -- `room` (required) - HipChat room name +- `token` (**required**) - Room token +- `color` (optional) +- `notify` (optional) +- `room` (optional) - Room name or ID +- `api_version` (optional) - Leave blank for default (v2) +- `server` (optional) - Leave blank for default. https://hipchat.example.com ### Delete HipChat service @@ -44,3 +436,261 @@ Delete HipChat service for a project. ``` DELETE /projects/:id/services/hipchat ``` + +### Get HipChat service settings + +Get HipChat service settings for a project. + +``` +GET /projects/:id/services/hipchat +``` + +## Irker (IRC gateway) + +Send IRC messages, on update, to a list of recipients through an Irker gateway. + +### Create/Edit Irker (IRC gateway) service + +Set Irker (IRC gateway) service for a project. + +> NOTE: Irker does NOT have built-in authentication, which makes it vulnerable to spamming IRC channels if it is hosted outside of a firewall. Please make sure you run the daemon within a secured network to prevent abuse. For more details, read: http://www.catb.org/~esr/irker/security.html. + +``` +PUT /projects/:id/services/irker +``` + +Parameters: + +- `recipients` (**required**) - Recipients/channels separated by whitespaces +- `default_irc_uri` (optional) - irc://irc.network.net:6697/ +- `server_port` (optional) - 6659 +- `server_host` (optional) - localhost +- `colorize_messages` (optional) + +### Delete Irker (IRC gateway) service + +Delete Irker (IRC gateway) service for a project. + +``` +DELETE /projects/:id/services/irker +``` + +### Get Irker (IRC gateway) service settings + +Get Irker (IRC gateway) service settings for a project. + +``` +GET /projects/:id/services/irker +``` + +## JIRA + +Jira issue tracker + +### Create/Edit JIRA service + +Set JIRA service for a project. + +> Setting `project_url`, `issues_url` and `new_issue_url` will allow a user to easily navigate to the Jira issue tracker. See the [integration doc](http://doc.gitlab.com/ce/integration/external-issue-tracker.html) for details. Support for referencing commits and automatic closing of Jira issues directly from GitLab is [available in GitLab EE.](http://doc.gitlab.com/ee/integration/jira.html) + +``` +PUT /projects/:id/services/jira +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `project_url` (**required**) - Project url +- `issues_url` (**required**) - Issue url +- `description` (optional) - Jira issue tracker + +### Delete JIRA service + +Delete JIRA service for a project. + +``` +DELETE /projects/:id/services/jira +``` + +### Get JIRA service settings + +Get JIRA service settings for a project. + +``` +GET /projects/:id/services/jira +``` + +## PivotalTracker + +Project Management Software (Source Commits Endpoint) + +### Create/Edit PivotalTracker service + +Set PivotalTracker service for a project. + +``` +PUT /projects/:id/services/pivotaltracker +``` + +Parameters: + +- `token` (**required**) + +### Delete PivotalTracker service + +Delete PivotalTracker service for a project. + +``` +DELETE /projects/:id/services/pivotaltracker +``` + +### Get PivotalTracker service settings + +Get PivotalTracker service settings for a project. + +``` +GET /projects/:id/services/pivotaltracker +``` + +## Pushover + +Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop. + +### Create/Edit Pushover service + +Set Pushover service for a project. + +``` +PUT /projects/:id/services/pushover +``` + +Parameters: + +- `api_key` (**required**) - Your application key +- `user_key` (**required**) - Your user key +- `priority` (**required**) +- `device` (optional) - Leave blank for all active devices +- `sound` (optional) + +### Delete Pushover service + +Delete Pushover service for a project. + +``` +DELETE /projects/:id/services/pushover +``` + +### Get Pushover service settings + +Get Pushover service settings for a project. + +``` +GET /projects/:id/services/pushover +``` + +## Redmine + +Redmine issue tracker + +### Create/Edit Redmine service + +Set Redmine service for a project. + +``` +PUT /projects/:id/services/redmine +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `project_url` (**required**) - Project url +- `issues_url` (**required**) - Issue url +- `description` (optional) - Redmine issue tracker + +### Delete Redmine service + +Delete Redmine service for a project. + +``` +DELETE /projects/:id/services/redmine +``` + +### Get Redmine service settings + +Get Redmine service settings for a project. + +``` +GET /projects/:id/services/redmine +``` + +## Slack + +A team communication tool for the 21st century + +### Create/Edit Slack service + +Set Slack service for a project. + +``` +PUT /projects/:id/services/slack +``` + +Parameters: + +- `webhook` (**required**) - https://hooks.slack.com/services/... +- `username` (optional) - username +- `channel` (optional) - #channel + +### Delete Slack service + +Delete Slack service for a project. + +``` +DELETE /projects/:id/services/slack +``` + +### Get Slack service settings + +Get Slack service settings for a project. + +``` +GET /projects/:id/services/slack +``` + +## JetBrains TeamCity CI + +A continuous integration and build server + +### Create/Edit JetBrains TeamCity CI service + +Set JetBrains TeamCity CI service for a project. + +> The build configuration in Teamcity must use the build format number %build.vcs.number% you will also want to configure monitoring of all branches so merge requests build, that setting is in the vsc root advanced settings. + +``` +PUT /projects/:id/services/teamcity +``` + +Parameters: + +- `teamcity_url` (**required**) - TeamCity root URL like https://teamcity.example.com +- `build_type` (**required**) - Build configuration ID +- `username` (**required**) - A user with permissions to trigger a manual build +- `password` (**required**) + +### Delete JetBrains TeamCity CI service + +Delete JetBrains TeamCity CI service for a project. + +``` +DELETE /projects/:id/services/teamcity +``` + +### Get JetBrains TeamCity CI service settings + +Get JetBrains TeamCity CI service settings for a project. + +``` +GET /projects/:id/services/teamcity +``` + diff --git a/doc/ci/README.md b/doc/ci/README.md new file mode 100644 index 0000000000..97325069ce --- /dev/null +++ b/doc/ci/README.md @@ -0,0 +1,23 @@ +## GitLab CI Documentation + +### User documentation + ++ [Quick Start](quick_start/README.md) ++ [Configuring project (.gitlab-ci.yml)](yaml/README.md) ++ [Configuring runner](runners/README.md) ++ [Configuring deployment](deployment/README.md) ++ [Using Docker Images](docker/using_docker_images.md) ++ [Using Docker Build](docker/using_docker_build.md) ++ [Using Variables](variables/README.md) + +### Examples + ++ [Test and deploy Ruby applications to Heroku](examples/test-and-deploy-ruby-application-to-heroku.md) ++ [Test and deploy Python applications to Heroku](examples/test-and-deploy-python-application-to-heroku.md) ++ [Test Clojure applications](examples/test-clojure-application.md) ++ Help your favorite programming language and GitLab by sending a merge request with a guide for that language. + +### Administrator documentation + ++ [User permissions](permissions/README.md) ++ [API](api/README.md) diff --git a/doc/ci/api/README.md b/doc/ci/api/README.md new file mode 100644 index 0000000000..33c5b172e9 --- /dev/null +++ b/doc/ci/api/README.md @@ -0,0 +1,86 @@ +# GitLab CI API + +## Resources + +- [Projects](projects.md) +- [Runners](runners.md) +- [Commits](commits.md) +- [Builds](builds.md) + + +## Authentication + +GitLab CI API uses different types of authentication depends on what API you use. +Each API document has section with information about authentication you need to use. + +GitLab CI API has 4 authentication methods: + +* GitLab user token & GitLab url +* GitLab CI project token +* GitLab CI runners registration token +* GitLab CI runner token + + +### Authentication #1: GitLab user token & GitLab url + +Authentication is done by +sending the `private-token` of a valid user and the `url` of an +authorized Gitlab instance via a query string along with the API +request: + + GET http://gitlab.example.com/ci/api/v1/projects?private_token=QVy1PB7sTxfy4pqfZM1U&url=http://demo.gitlab.com/ + +If preferred, you may instead send the `private-token` as a header in +your request: + + curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" "http://gitlab.example.com/ci/api/v1/projects?url=http://demo.gitlab.com/" + + +### Authentication #2: GitLab CI project token + +Each project in GitLab CI has it own token. +It can be used to get project commits and builds information. +You can use project token only for certain project. + +### Authentication #3: GitLab CI runners registration token + +This token is not persisted and is generated on each application start. +It can be used only for registering new runners in system. You can find it on +GitLab CI Runners web page https://gitlab-ci.example.com/admin/runners + +### Authentication #4: GitLab CI runner token + +Every GitLab CI runner has it own token that allow it to receive and update +GitLab CI builds. This token exists of internal purposes and should be used only +by runners + +## JSON + +All API requests are serialized using JSON. You don't need to specify +`.json` at the end of API URL. + +## Status codes + +The API is designed to return different status codes according to context and action. In this way if a request results in an error the caller is able to get insight into what went wrong, e.g. status code `400 Bad Request` is returned if a required attribute is missing from the request. The following list gives an overview of how the API functions generally behave. + +API request types: + +- `GET` requests access one or more resources and return the result as JSON +- `POST` requests return `201 Created` if the resource is successfully created and return the newly created resource as JSON +- `GET`, `PUT` and `DELETE` return `200 OK` if the resource is accessed, modified or deleted successfully, the (modified) result is returned as JSON +- `DELETE` requests are designed to be idempotent, meaning a request a resource still returns `200 OK` even it was deleted before or is not available. The reasoning behind it is the user is not really interested if the resource existed before or not. + +The following list shows the possible return codes for API requests. + +Return values: + +- `200 OK` - The `GET`, `PUT` or `DELETE` request was successful, the resource(s) itself is returned as JSON +- `201 Created` - The `POST` request was successful and the resource is returned as JSON +- `400 Bad Request` - A required attribute of the API request is missing, e.g. the title of an issue is not given +- `401 Unauthorized` - The user is not authenticated, a valid user token is necessary, see above +- `403 Forbidden` - The request is not allowed, e.g. the user is not allowed to delete a project +- `404 Not Found` - A resource could not be accessed, e.g. an ID for a resource could not be found +- `405 Method Not Allowed` - The request is not supported +- `409 Conflict` - A conflicting resource already exists, e.g. creating a project with a name that already exists +- `422 Unprocessable` - The entity could not be processed +- `500 Server Error` - While handling the request something went wrong on the server side diff --git a/doc/ci/api/builds.md b/doc/ci/api/builds.md new file mode 100644 index 0000000000..3b5008ccdb --- /dev/null +++ b/doc/ci/api/builds.md @@ -0,0 +1,41 @@ +# Builds API + +This API used by runners to receive and update builds. + +__Authentication is done by runner token__ + +## Builds + +### Runs oldest pending build by runner + + POST /ci/builds/register + +Parameters: + + * `token` (required) - The unique token of runner + +Returns: + +```json +{ + "id" : 79, + "commands" : "", + "path" : "", + "ref" : "", + "sha" : "", + "project_id" : 6, + "repo_url" : "git@demo.gitlab.com:gitlab/gitlab-shell.git", + "before_sha" : "" +} +``` + + +### Update details of an existing build + + PUT /ci/builds/:id + +Parameters: + + * `id` (required) - The ID of a project + * `state` (optional) - The state of a build + * `trace` (optional) - The trace of a build diff --git a/doc/ci/api/commits.md b/doc/ci/api/commits.md new file mode 100644 index 0000000000..4df7afc6c5 --- /dev/null +++ b/doc/ci/api/commits.md @@ -0,0 +1,101 @@ +# Commits API + +__Authentication is done by GitLab CI project token__ + +## Commits + +### Retrieve all commits per project + +Get list of commits per project + + GET /ci/commits + +Parameters: + + * `project_id` (required) - The ID of a project + * `project_token` (requires) - Project token + * `page` (optional) + * `per_page` (optional) - items per request (default is 20) + +Returns: + +```json +[{ + "id": 3, + "ref": "master", + "sha": "65617dfc36761baa1f46a7006f2a88916f7f56cf", + "project_id": 2, + "before_sha": "96906f2bceb04c7323f8514aa5ad8cb1313e2898", + "created_at": "2014-11-05T09:46:35.247Z", + "status": "success", + "finished_at": "2014-11-05T09:46:44.254Z", + "duration": 5.062692165374756, + "git_commit_message": "wow\n", + "git_author_name": "Administrator", + "git_author_email": "admin@example.com", + "builds": [{ + "id": 7, + "project_id": 2, + "ref": "master", + "status": "success", + "finished_at": "2014-11-05T09:46:44.254Z", + "created_at": "2014-11-05T09:46:35.259Z", + "updated_at": "2014-11-05T09:46:44.255Z", + "sha": "65617dfc36761baa1f46a7006f2a88916f7f56cf", + "started_at": "2014-11-05T09:46:39.192Z", + "before_sha": "96906f2bceb04c7323f8514aa5ad8cb1313e2898", + "runner_id": 1, + "coverage": null, + "commit_id": 3 + }] +}] +``` + +### Create commit + +Inform GitLab CI about new commit you want it to build. + +__If commit already exists in GitLab CI it will not be created__ + + + POST /ci/commits + +Parameters: + + * `project_id` (required) - The ID of a project + * `project_token` (requires) - Project token + * `data` (required) - Push data. For example see comment in `lib/api/commits.rb` + +Returns: + +```json +{ + "id": 3, + "ref": "master", + "sha": "65617dfc36761baa1f46a7006f2a88916f7f56cf", + "project_id": 2, + "before_sha": "96906f2bceb04c7323f8514aa5ad8cb1313e2898", + "created_at": "2014-11-05T09:46:35.247Z", + "status": "success", + "finished_at": "2014-11-05T09:46:44.254Z", + "duration": 5.062692165374756, + "git_commit_message": "wow\n", + "git_author_name": "Administrator", + "git_author_email": "admin@example.com", + "builds": [{ + "id": 7, + "project_id": 2, + "ref": "master", + "status": "success", + "finished_at": "2014-11-05T09:46:44.254Z", + "created_at": "2014-11-05T09:46:35.259Z", + "updated_at": "2014-11-05T09:46:44.255Z", + "sha": "65617dfc36761baa1f46a7006f2a88916f7f56cf", + "started_at": "2014-11-05T09:46:39.192Z", + "before_sha": "96906f2bceb04c7323f8514aa5ad8cb1313e2898", + "runner_id": 1, + "coverage": null, + "commit_id": 3 + }] +} +``` diff --git a/doc/ci/api/projects.md b/doc/ci/api/projects.md new file mode 100644 index 0000000000..54584db093 --- /dev/null +++ b/doc/ci/api/projects.md @@ -0,0 +1,154 @@ +# Projects API + +This API is intended to aid in the setup and configuration of +projects on Gitlab CI. + +__Authentication is done by GitLab user token & GitLab url__ + +## Projects + +### List Authorized Projects + +Lists all projects that the authenticated user has access to. + +``` +GET /ci/projects +``` + +Returns: + +```json + [ + { + "id" : 271, + "name" : "gitlabhq", + "timeout" : 1800, + "token" : "iPWx6WM4lhHNedGfBpPJNP", + "default_ref" : "master", + "gitlab_url" : "http://demo.gitlabhq.com/gitlab/gitlab-shell", + "path" : "gitlab/gitlab-shell", + "always_build" : false, + "polling_interval" : null, + "public" : false, + "ssh_url_to_repo" : "git@demo.gitlab.com:gitlab/gitlab-shell.git", + "gitlab_id" : 3 + }, + { + "id" : 272, + "name" : "gitlab-ci", + "timeout" : 1800, + "token" : "iPWx6WM4lhHNedGfBpPJNP", + "default_ref" : "master", + "gitlab_url" : "http://demo.gitlabhq.com/gitlab/gitlab-shell", + "path" : "gitlab/gitlab-shell", + "always_build" : false, + "polling_interval" : null, + "public" : false, + "ssh_url_to_repo" : "git@demo.gitlab.com:gitlab/gitlab-shell.git", + "gitlab_id" : 4 + } +] +``` + +### List Owned Projects + +Lists all projects that the authenticated user owns. + +``` +GET /ci/projects/owned +``` + +Returns: + +```json +[ + { + "id" : 272, + "name" : "gitlab-ci", + "timeout" : 1800, + "token" : "iPWx6WM4lhHNedGfBpPJNP", + "default_ref" : "master", + "gitlab_url" : "http://demo.gitlabhq.com/gitlab/gitlab-shell", + "path" : "gitlab/gitlab-shell", + "always_build" : false, + "polling_interval" : null, + "public" : false, + "ssh_url_to_repo" : "git@demo.gitlab.com:gitlab/gitlab-shell.git", + "gitlab_id" : 4 + } +] +``` + +### Single Project + +Returns information about a single project for which the user is +authorized. + + GET /ci/projects/:id + +Parameters: + + * `id` (required) - The ID of the Gitlab CI project + +### Create Project + +Creates a Gitlab CI project using Gitlab project details. + + POST /ci/projects + +Parameters: + + * `name` (required) - The name of the project + * `gitlab_id` (required) - The ID of the project on the Gitlab instance + * `path` (required) - The gitlab project path + * `ssh_url_to_repo` (required) - The gitlab SSH url to the repo + * `default_ref` (optional) - The branch to run on (default to `master`) + +### Update Project + +Updates a Gitlab CI project using Gitlab project details that the +authenticated user has access to. + + PUT /ci/projects/:id + +Parameters: + + * `name` - The name of the project + * `gitlab_id` - The ID of the project on the Gitlab instance + * `path` - The gitlab project path + * `ssh_url_to_repo` - The gitlab SSH url to the repo + * `default_ref` - The branch to run on (default to `master`) + +### Remove Project + +Removes a Gitlab CI project that the authenticated user has access to. + + DELETE /ci/projects/:id + +Parameters: + + * `id` (required) - The ID of the Gitlab CI project + +### Link Project to Runner + +Links a runner to a project so that it can make builds (only via +authorized user). + + POST /ci/projects/:id/runners/:runner_id + +Parameters: + + * `id` (required) - The ID of the Gitlab CI project + * `runner_id` (required) - The ID of the Gitlab CI runner + +### Remove Project from Runner + +Removes a runner from a project so that it can not make builds (only +via authorized user). + + DELETE /ci/projects/:id/runners/:runner_id + +Parameters: + + * `id` (required) - The ID of the Gitlab CI project + * `runner_id` (required) - The ID of the Gitlab CI runner \ No newline at end of file diff --git a/doc/ci/api/runners.md b/doc/ci/api/runners.md new file mode 100644 index 0000000000..e9f88ee066 --- /dev/null +++ b/doc/ci/api/runners.md @@ -0,0 +1,77 @@ +# Runners API + +## Runners + +### Retrieve all runners + +__Authentication is done by GitLab user token & GitLab url__ + +Used to get information about all runners registered on the Gitlab CI +instance. + + GET /ci/runners + +Returns: + +```json +[ + { + "id" : 85, + "token" : "12b68e90394084703135" + }, + { + "id" : 86, + "token" : "76bf894e969364709864" + }, +] +``` + +### Register a new runner + + +__Authentication is done with a Shared runner registration token or a project Specific runner registration token__ + +Used to make Gitlab CI aware of available runners. + + POST /ci/runners/register + +Parameters: + + * `token` (required) - The registration token. It is 2 types of token you can pass here. + +1. Shared runner registration token +2. Project specific registration token + +Returns: + +```json +{ + "id" : 85, + "token" : "12b68e90394084703135" +} +``` + +### Delete a runner + + +__Authentication is done by runner token__ + +Used to removing runners. + + DELETE /ci/runners/delete + +Parameters: + + * `token` (required) - The runner token. + +Returns: + +```json +{ + "id" : 1, + "token" : "d14963981a428f70121777e50643d1", + "created_at" : "2015-02-26T11:39:39.232Z", + "updated_at" : "2015-02-26T11:39:39.232Z", + "description" : "awesome runner" +} +``` \ No newline at end of file diff --git a/doc/ci/deployment/README.md b/doc/ci/deployment/README.md new file mode 100644 index 0000000000..ffd841ca9e --- /dev/null +++ b/doc/ci/deployment/README.md @@ -0,0 +1,98 @@ +## Using Dpl as deployment tool +Dpl (dee-pee-ell) is a deploy tool made for continuous deployment that's developed and used by Travis CI, but can also be used with GitLab CI. + +**We recommend to use Dpl, if you're deploying to any of these of these services: https://github.com/travis-ci/dpl#supported-providers**. + +### Requirements +To use Dpl you need at least Ruby 1.8.7 with ability to install gems. + +### Basic usage +The Dpl can be installed on any machine with: +``` +gem install dpl +``` + +This allows you to test all commands from your shell, rather than having to test it on a CI server. + +If you don't have Ruby installed you can do it on Debian-compatible Linux with: +``` +apt-get update +apt-get install ruby-dev +``` + +The Dpl provides support for vast number of services, including: Heroku, Cloud Foundry, AWS/S3, and more. +To use it simply define provider and any additional parameters required by the provider. + +For example if you want to use it to deploy your application to heroku, you need to specify `heroku` as provider, specify `api-key` and `app`. +There's more and all possible parameters can be found here: https://github.com/travis-ci/dpl#heroku + +``` +staging: + type: deploy + - gem install dpl + - dpl --provider=heroku --app=my-app-staging --api-key=$HEROKU_STAGING_API_KEY +``` + +In the above example we use Dpl to deploy `my-app-staging` to Heroku server with api-key stored in `HEROKU_STAGING_API_KEY` secure variable. + +To use different provider take a look at long list of [Supported Providers](https://github.com/travis-ci/dpl#supported-providers). + +### Using Dpl with Docker +When you use GitLab Runner you most likely configured it to use your server's shell commands. +This means that all commands are run in context of local user (ie. gitlab_runner or gitlab_ci_multi_runner). +It also means that most probably in your Docker container you don't have the Ruby runtime installed. +You will have to install it: +``` +staging: + type: deploy + - apt-get update -yq + - apt-get install -y ruby-dev + - gem install dpl + - dpl --provider=heroku --app=my-app-staging --api-key=$HEROKU_STAGING_API_KEY + only: + - master +``` + +The first line `apt-get update -yq` updates the list of available packages, where second `apt-get install -y ruby-dev` install `Ruby` runtime on system. +The above example is valid for all Debian-compatible systems. + +### Usage in staging and production +It's pretty common in developer workflow to have staging (development) and production environment. +If we consider above example: we would like to deploy `master` branch to `staging` and `all tags` to `production` environment. +The final `.gitlab-ci.yml` for that setup would look like this: + +``` +staging: + type: deploy + - gem install dpl + - dpl --provider=heroku --app=my-app-staging --api-key=$HEROKU_STAGING_API_KEY + only: + - master + +production: + type: deploy + - gem install dpl + - dpl --provider=heroku --app=my-app-production --api-key=$HEROKU_PRODUCTION_API_KEY + only: + - tags +``` + +We created two deploy jobs that are executed on different events: +1. `staging` is executed for all commits that were pushed to `master` branch, +2. `production` is executed for all pushed tags. + +We also use two secure variables: +1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app, +2. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app. + +### Storing API keys +In GitLab CI 7.12 a new feature was introduced: Secure Variables. +Secure Variables can added by going to `Project > Variables > Add Variable`. +**This feature requires `gitlab-runner` with version equal or greater than 0.4.0.** +The variables that are defined in the project settings are send along with the build script to the runner. +The secure variables are stored out of the repository. Never store secrets in your projects' .gitlab-ci.yml. +It is also important that secret's value is hidden in the build log. + +You access added variable by prefixing it's name with `$` (on non-Windows runners) or `%` (for Windows Batch runners): +1. `$SECRET_VARIABLE` - use it for non-Windows runners +2. `%SECRET_VARIABLE%` - use it for Windows Batch runners diff --git a/doc/ci/docker/README.md b/doc/ci/docker/README.md new file mode 100644 index 0000000000..84eaf29efd --- /dev/null +++ b/doc/ci/docker/README.md @@ -0,0 +1,4 @@ +# Docker integration + ++ [Using Docker Images](using_docker_images.md) ++ [Using Docker Build](using_docker_build.md) \ No newline at end of file diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md new file mode 100644 index 0000000000..a698fbc818 --- /dev/null +++ b/doc/ci/docker/using_docker_build.md @@ -0,0 +1,112 @@ +# Using Docker Build + +GitLab CI can allows you to use Docker Engine to build and test docker-based projects. + +**This also allows to you to use `docker-compose` and other docker-enabled tools.** + +This is one of new trends in Continuous Integration/Deployment to: + +1. create application image, +1. run test against created image, +1. push image to remote registry, +1. deploy server from pushed image + +It's also useful in case when your application already has the `Dockerfile` that can be used to create and test image: +```bash +$ docker build -t my-image dockerfiles/ +$ docker run my-docker-image /script/to/run/tests +$ docker tag my-image my-registry:5000/my-image +$ docker push my-registry:5000/my-image +``` + +However, this requires special configuration of GitLab Runner to enable `docker` support during build. +**This requires running GitLab Runner in privileged mode which can be harmful when untrusted code is run.** + +There are two methods to enable the use of `docker build` and `docker run` during build. + +## 1. Use shell executor + +The simplest approach is to install GitLab Runner in `shell` execution mode. +GitLab Runner then executes build scripts as `gitlab-runner` user. + +1. Install [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation). + +1. During GitLab Runner installation select `shell` as method of executing build scripts or use command: + + ```bash + $ sudo gitlab-runner register -n \ + --url http://gitlab.com/ci \ + --token RUNNER_TOKEN \ + --executor shell + --description "My Runner" + ``` + +2. Install Docker on server. + + For more information how to install Docker on different systems checkout the [Supported installations](https://docs.docker.com/installation/). + +3. Add `gitlab-runner` user to `docker` group: + + ```bash + $ sudo usermod -aG docker gitlab-runner + ``` + +4. Verify that `gitlab-runner` has access to Docker: + + ```bash + $ sudo -u gitlab-runner -H docker info + ``` + + You can now verify that everything works by adding `docker info` to `.gitlab-ci.yml`: + ```yaml + before_script: + - docker info + + build_image: + script: + - docker build -t my-docker-image . + - docker run my-docker-image /script/to/run/tests + ``` + +5. You can now use `docker` command and install `docker-compose` if needed. + +6. However, by adding `gitlab-runner` to `docker` group you are effectively granting `gitlab-runner` full root permissions. +For more information please checkout [On Docker security: `docker` group considered harmful](https://www.andreas-jung.com/contents/on-docker-security-docker-group-considered-harmful). + +## 2. Use docker-in-docker executor + +Second approach is to use special Docker image with all tools installed (`docker` and `docker-compose`) and run build script in context of that image in privileged mode. +In order to do that follow the steps: + +1. Install [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation). + +1. Register GitLab Runner from command line to use `docker` and `privileged` mode: + + ```bash + $ sudo gitlab-runner register -n \ + --url http://gitlab.com/ci \ + --token RUNNER_TOKEN \ + --executor docker \ + --description "My Docker Runner" \ + --docker-image "gitlab/dind:latest" \ + --docker-privileged + ``` + + The above command will register new Runner to use special [gitlab/dind](https://registry.hub.docker.com/u/gitlab/dind/) image which is provided by GitLab Inc. + The image at the start runs Docker daemon in [docker-in-docker](https://blog.docker.com/2013/09/docker-can-now-run-within-docker/) mode. + +1. You can now use `docker` from build script: + + ```yaml + before_script: + - docker info + + build_image: + script: + - docker build -t my-docker-image . + - docker run my-docker-image /script/to/run/tests + ``` + +1. However, by enabling `--docker-privileged` you are effectively disables all security mechanisms of containers and exposing your host to privilege escalation which can lead to container breakout. +For more information you could be interested in checking out [Runtime privilege](https://docs.docker.com/reference/run/#runtime-privilege-linux-capabilities-and-lxc-configuration). + diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md new file mode 100644 index 0000000000..191e3a8144 --- /dev/null +++ b/doc/ci/docker/using_docker_images.md @@ -0,0 +1,203 @@ +# Using Docker Images +GitLab CI can use [Docker Engine](https://www.docker.com/) to build projects. + +Docker is an open-source project that allows to use predefined images to run applications +in independent "containers" that are run within a single Linux instance. +[Docker Hub](https://registry.hub.docker.com/) have rich database of built images that can be used to build applications. + +Docker when used with GitLab CI runs each build in separate and isolated container using predefined image and always from scratch. +It makes it easier to have simple and reproducible build environment that can also be run on your workstation. +This allows you to test all commands from your shell, rather than having to test them on a CI server. + +### Register Docker runner +To use GitLab Runner with Docker you need to register new runner to use `docker` executor: + +```bash +gitlab-ci-multi-runner register \ + --url "https://gitlab.com/" \ + --registration-token "PROJECT_REGISTRATION_TOKEN" \ + --description "docker-ruby-2.1" \ + --executor "docker" \ + --docker-image ruby:2.1 \ + --docker-postgres latest \ + --docker-mysql latest +``` + +**The registered runner will use `ruby:2.1` image and will run two services (`postgres:latest` and `mysql:latest`) that will be accessible for time of the build.** + +### What is image? +The image is the name of any repository that is present in local Docker Engine or any repository that can be found at [Docker Hub](https://registry.hub.docker.com/). +For more information about the image and Docker Hub please read the [Docker Fundamentals](https://docs.docker.com/introduction/understanding-docker/). + +### What is service? +Service is just another image that is run for time of your build and is linked to your build. This allows you to access the service image during build time. +The service image can run any application, but most common use case is to run some database container, ie.: `mysql`. +It's easier and faster to use existing image, run it as additional container than install `mysql` every time project is built. + +#### How is service linked to the build? +There's good document that describes how Docker linking works: [Linking containers together](https://docs.docker.com/userguide/dockerlinks/). +To summarize: if you add `mysql` as service to your application, the image will be used to create container that is linked to build container. +The service container for MySQL will be accessible under hostname `mysql`. +So, **to access your database service you have to connect to host: `mysql` instead of socket or `localhost`**. + +### How to use other images as services? +You are not limited to have only database services. +You can hand modify `config.toml` to add any image as service found at [Docker Hub](https://registry.hub.docker.com/). +Look for `[runners.docker]` section: +``` +[runners.docker] + image = "ruby:2.1" + services = ["mysql:latest", "postgres:latest"] +``` + +For example you need `wordpress` instance to test some API integration with `Wordpress`. +You can for example use this image: [tutum/wordpress](https://registry.hub.docker.com/u/tutum/wordpress/). +This is image that have fully preconfigured `wordpress` and have `MySQL` server built-in: +``` +[runners.docker] + image = "ruby:2.1" + services = ["mysql:latest", "postgres:latest", "tutum/wordpress:latest"] +``` + +Next time when you run your application the `tutum/wordpress` will be started +and you will have access to it from your build container under hostname: `tutum_wordpress`. + +Alias hostname for the service is made from the image name: +1. Everything after `:` is stripped, +2. '/' is replaced to `_`. + +### Configuring services +Many services accept environment variables, which allow you to easily change database names or set account names depending on the environment. + +GitLab Runner 0.5.0 and up passes all YAML-defined variables to created service containers. + +1. To configure database name for [postgres](https://registry.hub.docker.com/u/library/postgres/) service, +you need to set POSTGRES_DB. + + ```yaml + services: + - postgres + + variables: + POSTGRES_DB: gitlab + ``` + +1. To use [mysql](https://registry.hub.docker.com/u/library/mysql/) service with empty password for time of build, +you need to set MYSQL_ALLOW_EMPTY_PASSWORD. + + ```yaml + services: + - mysql + + variables: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + ``` + +For other possible configuration variables check the +https://registry.hub.docker.com/u/library/mysql/ or https://registry.hub.docker.com/u/library/postgres/ +or README page for any other Docker image. + +**Note: All variables will passed to all service containers. It's not designed to distinguish which variable should go where.** + +### Overwrite image and services +It's possible to overwrite `docker-image` and specify services from `.gitlab-ci.yml`. +If you add to your YAML the `image` and the `services` these parameters +be used instead of the ones that were specified during runner's registration. +``` +image: ruby:2.2 +services: + - postgres:9.3 +before_install: + - bundle install + +test: + script: + - bundle exec rake spec +``` + +It's possible to define image and service per-job: +``` +before_install: + - bundle install + +test:2.1: + image: ruby:2.1 + services: + - postgres:9.3 + script: + - bundle exec rake spec + +test:2.2: + image: ruby:2.2 + services: + - postgres:9.4 + script: + - bundle exec rake spec +``` + +#### How to enable overwriting? +To enable overwriting you have to **enable it first** (it's disabled by default for security reasons). +You can do that by hand modifying runner configuration: `config.toml`. +Please go to section where is `[runners.docker]` definition for your runner. +Add `allowed_images` and `allowed_services` to specify what images are allowed to be picked from `.gitlab-ci.yml`: +``` +[runners.docker] + image = "ruby:2.1" + allowed_images = ["ruby:*", "python:*"] + allowed_services = ["mysql:*", "redis:*"] +``` +This enables you to use in your `.gitlab-ci.yml` any image that matches above wildcards. +You will be able to pick only `ruby` and `python` images. +The same rule can be applied to limit services. + +If you are courageous enough, you can make it fully open and accept everything: +``` +[runners.docker] + image = "ruby:2.1" + allowed_images = ["*", "*/*"] + allowed_services = ["*", "*/*"] +``` + +**It the feature is not enabled, or image isn't allowed the error message will be put into the build log.** + +### How Docker integration works +1. Create any service container: `mysql`, `postgresql`, `mongodb`, `redis`. +1. Create cache container to store all volumes as defined in `config.toml` and `Dockerfile` of build image (`ruby:2.1` as in above example). +1. Create build container and link any service container to build container. +1. Start build container and send build script to the container. +1. Run build script. +1. Checkout code in: `/builds/group-name/project-name/`. +1. Run any step defined in `.gitlab-ci.yml`. +1. Check exit status of build script. +1. Remove build container and all created service containers. + +### How to debug a build locally +1. Create a file with build script: +```bash +$ cat < build_script +git clone https://gitlab.com/gitlab-org/gitlab-ci-multi-runner.git /builds/gitlab-org/gitlab-ci-multi-runner +cd /builds/gitlab-org/gitlab-ci-multi-runner +make <- or any other build step +EOF +``` + +1. Create service containers: +``` +$ docker run -d -n service-mysql mysql:latest +$ docker run -d -n service-postgres postgres:latest +``` +This will create two service containers (MySQL and PostgreSQL). + +1. Create a build container and execute script in its context: +``` +$ cat build_script | docker run -n build -i -l mysql:service-mysql -l postgres:service-postgres ruby:2.1 /bin/bash +``` +This will create build container that has two service containers linked. +The build_script is piped using STDIN to bash interpreter which executes the build script in container. + +1. At the end remove all containers: +``` +docker rm -f -v build service-mysql service-postgres +``` +This will forcefully (the `-f` switch) remove build container and service containers +and all volumes (the `-v` switch) that were created with the container creation. diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md new file mode 100644 index 0000000000..e0b9fa0e25 --- /dev/null +++ b/doc/ci/examples/README.md @@ -0,0 +1,5 @@ +# Build script examples + ++ [Test and deploy Ruby Application to Heroku](test-and-deploy-ruby-application-to-heroku.md) ++ [Test and deploy Python Application to Heroku](test-and-deploy-python-application-to-heroku.md) ++ [Test Clojure applications](examples/test-clojure-application.md) diff --git a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md new file mode 100644 index 0000000000..036b03dd6b --- /dev/null +++ b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md @@ -0,0 +1,72 @@ +## Test and Deploy a python application +This example will guide you how to run tests in your Python application and deploy it automatically as Heroku application. + +You can checkout the example [source](https://gitlab.com/ayufan/python-getting-started) and check [CI status](https://ci.gitlab.com/projects/4080). + +### Configure project +This is what the `.gitlab-ci.yml` file looks like for this project: +```yaml +test: + script: + # this configures django application to use attached postgres database that is run on `postgres` host + - export DATABASE_URL=postgres://postgres:@postgres:5432/python-test-app + - apt-get update -qy + - apt-get install -y python-dev python-pip + - pip install -r requirements.txt + - python manage.py test + +staging: + type: deploy + script: + - apt-get update -qy + - apt-get install -y ruby-dev + - gem install dpl + - dpl --provider=heroku --app=gitlab-ci-python-test-staging --api-key=$HEROKU_STAGING_API_KEY + only: + - master + +production: + type: deploy + script: + - apt-get update -qy + - apt-get install -y ruby-dev + - gem install dpl + - dpl --provider=heroku --app=gitlab-ci-python-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY + only: + - tags +``` + +This project has three jobs: +1. `test` - used to test rails application, +2. `staging` - used to automatically deploy staging environment every push to `master` branch +3. `production` - used to automatically deploy production environmnet for every created tag + +### Store API keys +You'll need to create two variables in `Project > Variables`: +1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app, +2. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app. + +Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account). + +### Create Heroku application +For each of your environments, you'll need to create a new Heroku application. +You can do this through the [Dashboard](https://dashboard.heroku.com/). + +### Create runner +First install [Docker Engine](https://docs.docker.com/installation/). +To build this project you also need to have [GitLab Runner](https://about.gitlab.com/gitlab-ci/#gitlab-runner). +You can use public runners available on `gitlab.com/ci`, but you can register your own: +``` +gitlab-ci-multi-runner register \ + --non-interactive \ + --url "https://gitlab.com/ci/" \ + --registration-token "PROJECT_REGISTRATION_TOKEN" \ + --description "python-3.2" \ + --executor "docker" \ + --docker-image python:3.2 \ + --docker-postgres latest +``` + +With the command above, you create a runner that uses [python:3.2](https://registry.hub.docker.com/u/library/python/) image and uses [postgres](https://registry.hub.docker.com/u/library/postgres/) database. + +To access PostgreSQL database you need to connect to `host: postgres` as user `postgres` without password. diff --git a/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md new file mode 100644 index 0000000000..d2a872f193 --- /dev/null +++ b/doc/ci/examples/test-and-deploy-ruby-application-to-heroku.md @@ -0,0 +1,67 @@ +## Test and Deploy a ruby application +This example will guide you how to run tests in your Ruby application and deploy it automatiacally as Heroku application. + +You can checkout the example [source](https://gitlab.com/ayufan/ruby-getting-started) and check [CI status](https://ci.gitlab.com/projects/4050). + +### Configure project +This is what the `.gitlab-ci.yml` file looks like for this project: +```yaml +test: + script: + - apt-get update -qy + - apt-get install -y nodejs + - bundle install --path /cache + - bundle exec rake db:create RAILS_ENV=test + - bundle exec rake test + +staging: + type: deploy + script: + - gem install dpl + - dpl --provider=heroku --app=gitlab-ci-ruby-test-staging --api-key=$HEROKU_STAGING_API_KEY + only: + - master + +production: + type: deploy + script: + - gem install dpl + - dpl --provider=heroku --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY + only: + - tags +``` + +This project has three jobs: +1. `test` - used to test rails application, +2. `staging` - used to automatically deploy staging environment every push to `master` branch +3. `production` - used to automatically deploy production environmnet for every created tag + +### Store API keys +You'll need to create two variables in `Project > Variables`: +1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app, +2. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app. + +Find your Heroku API key in [Manage Account](https://dashboard.heroku.com/account). + +### Create Heroku application +For each of your environments, you'll need to create a new Heroku application. +You can do this through the [Dashboard](https://dashboard.heroku.com/). + +### Create runner +First install [Docker Engine](https://docs.docker.com/installation/). +To build this project you also need to have [GitLab Runner](https://about.gitlab.com/gitlab-ci/#gitlab-runner). +You can use public runners available on `gitlab.com/ci`, but you can register your own: +``` +gitlab-ci-multi-runner register \ + --non-interactive \ + --url "https://gitlab.com/ci/" \ + --registration-token "PROJECT_REGISTRATION_TOKEN" \ + --description "ruby-2.1" \ + --executor "docker" \ + --docker-image ruby:2.1 \ + --docker-postgres latest +``` + +With the command above, you create a runner that uses [ruby:2.1](https://registry.hub.docker.com/u/library/ruby/) image and uses [postgres](https://registry.hub.docker.com/u/library/postgres/) database. + +To access PostgreSQL database you need to connect to `host: postgres` as user `postgres` without password. \ No newline at end of file diff --git a/doc/ci/examples/test-clojure-application.md b/doc/ci/examples/test-clojure-application.md new file mode 100644 index 0000000000..eaee94a10f --- /dev/null +++ b/doc/ci/examples/test-clojure-application.md @@ -0,0 +1,35 @@ +## Test Clojure applications + +This example will guide you how to run tests in your Clojure application. + +You can checkout the example [source](https://gitlab.com/dzaporozhets/clojure-web-application) and check [CI status](https://ci.gitlab.com/projects/6306). + +### Configure project + +This is what the `.gitlab-ci.yml` file looks like for this project: + +```yaml +variables: + POSTGRES_DB: sample-test + DATABASE_URL: "postgresql://postgres@postgres:5432/sample-test" + +before_script: + - apt-get update -y + - apt-get install default-jre postgresql-client -y + - wget https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein + - chmod a+x lein + - export LEIN_ROOT=1 + - PATH=$PATH:. + - lein deps + - lein migratus migrate + +test: + script: + - lein test +``` + +In before script we install JRE and [Leiningen](http://leiningen.org/). +Sample project uses [migratus](https://github.com/yogthos/migratus) library to manage database migrations. +So we added database migration as last step of `before_script` section + +You can use public runners available on `gitlab.com` for testing your application with such configuration. diff --git a/doc/ci/permissions/README.md b/doc/ci/permissions/README.md new file mode 100644 index 0000000000..d77061c14c --- /dev/null +++ b/doc/ci/permissions/README.md @@ -0,0 +1,24 @@ +# Users Permissions + +GitLab CI relies on user's role on the GitLab. There are three permissions levels on GitLab CI: admin, master, developer, other. + +Admin user can perform any actions on GitLab CI in scope of instance and project. Also user with admin permission can use admin interface. + + + + +| Action | Guest, Reporter | Developer | Master | Admin | +|---------------------------------------|-----------------|-------------|----------|--------| +| See commits and builds | ✓ | ✓ | ✓ | ✓ | +| Retry or cancel build | | ✓ | ✓ | ✓ | +| Remove project | | | ✓ | ✓ | +| Create project | | | ✓ | ✓ | +| Change project configuration | | | ✓ | ✓ | +| Add specific runners | | | ✓ | ✓ | +| Add shared runners | | | | ✓ | +| See events in the system | | | | ✓ | +| Admin interface | | | | ✓ | + + + + diff --git a/doc/ci/quick_start/README.md b/doc/ci/quick_start/README.md new file mode 100644 index 0000000000..a87a1f806f --- /dev/null +++ b/doc/ci/quick_start/README.md @@ -0,0 +1,119 @@ +# Quick Start + +To start building projects with GitLab CI a few steps needs to be done. + +## 1. Install GitLab and CI + +First you need to have a working GitLab and GitLab CI instance. + +You can omit this step if you use [GitLab.com](http://GitLab.com/). + +## 2. Create repository on GitLab + +Once you login on your GitLab add a new repository where you will store your source code. +Push your application to that repository. + +## 3. Add project to CI + +The next part is to login to GitLab CI. +Point your browser to the URL you have set GitLab or use [gitlab.com/ci](http://gitlab.com/ci/). + +On the first screen you will see a list of GitLab's projects that you have access to: + +![Projects](projects.png) + +Click **Add Project to CI**. +This will create project in CI and authorize GitLab CI to fetch sources from GitLab. + +> GitLab CI creates unique token that is used to configure GitLab CI service in GitLab. +> This token allows to access GitLab's repository and configures GitLab to trigger GitLab CI webhook on **Push events** and **Tag push events**. +> You can see that token by going to Project's Settings > Services > GitLab CI. +> You will see there token, the same token is assigned in GitLab CI settings of project. + +## 4. Create project's configuration - .gitlab-ci.yml + +The next: You have to define how your project will be built. +GitLab CI uses [YAML](https://en.wikipedia.org/wiki/YAML) file to store build configuration. +You need to create `.gitlab-ci.yml` in root directory of your repository: + +```yaml +before_script: + - bundle install + +rspec: + script: + - bundle exec rspec + +rubocop: + script: + - bundle exec rubocop +``` + +This is the simplest possible build configuration that will work for most Ruby applications: +1. Define two jobs `rspec` and `rubocop` with two different commands to be executed. +1. Before every job execute commands defined by `before_script`. + +The `.gitlab-ci.yml` defines set of jobs with constrains how and when they should be run. +The jobs are defined as top-level elements with name and always have to contain the `script`. +Jobs are used to create builds, which are then picked by [runners](../runners/README.md) and executed within environment of the runner. +What is important that each job is run independently from each other. + +For more information and complete `.gitlab-ci.yml` syntax, please check the [Configuring project (.gitlab-ci.yml)](../yaml/README.md). + +## 5. Add file and push .gitlab-ci.yml to repository + +Once you created `.gitlab-ci.yml` you should add it to git repository and push it to GitLab. + +```bash +git add .gitlab-ci.yml +git commit +git push origin master +``` + +If you refresh the project's page on GitLab CI you will notice a one new commit: + +![](new_commit.png) + +However the commit has status **pending** which means that commit was not yet picked by runner. + +## 6. Configure runner + +In GitLab CI, Runners run your builds. +A runner is a machine (can be virtual, bare-metal or VPS) that picks up builds through the coordinator API of GitLab CI. + +A runner can be specific to a certain project or serve any project in GitLab CI. +A runner that serves all projects is called a shared runner. +More information about different runner types can be found in [Configuring runner](../runners/README.md). + +To check if you have runners assigned to your project go to **Runners**. You will find there information how to setup project specific runner: + +1. Install GitLab Runner software. Checkout the [GitLab Runner](https://about.gitlab.com/gitlab-ci/#gitlab-runner) section to install it. +1. Specify following URL during runner setup: https://gitlab.com/ci/ +1. Use the following registration token during setup: TOKEN + +If you do it correctly your runner should be shown under **Runners activated for this project**: + +![](runners_activated.png) + +### Shared runners + +If you use [gitlab.com/ci](http://gitlab.com/ci/) you can use **Shared runners** provided by GitLab Inc. +These are special virtual machines that are run on GitLab's infrastructure that can build any project. +To enable **Shared runners** you have to go to **Runners** and click **Enable shared runners** for this project. + +## 7. Check status of commit + +If everything went OK and you go to commit, the status of the commit should change from **pending** to either **running**, **success** or **failed**. + +![](commit_status.png) + +You can click **Build ID** to view build log for specific job. + +## 8. Congratulations! + +You managed to build your first project using GitLab CI. +You may need to tune your `.gitlab-ci.yml` file to implement build plan for your project. +A few examples how it can be done you can find on [Examples](../examples/README.md) page. + +GitLab CI also offers **the Lint** tool to verify validity of your `.gitlab-ci.yml` which can be useful to troubleshoot potential problems. +The Lint is available from project's settings or by adding `/lint` to GitLab CI url. diff --git a/doc/ci/quick_start/build_status.png b/doc/ci/quick_start/build_status.png new file mode 100644 index 0000000000000000000000000000000000000000..333259e6acd301b579ebb7b7682b1df1e635a61a GIT binary patch literal 62140 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�n!5^ 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 literal 0 HcmV?d00001 diff --git a/doc/ci/quick_start/commit_status.png b/doc/ci/quick_start/commit_status.png new file mode 100644 index 0000000000000000000000000000000000000000..725b79e6f91d1de8e8240c28f911b2753d92222a GIT binary patch literal 33492 zcmeFZWmKG9(=Lb;T!Xv2yA#|k!8N!vPH=~i1b5d)gS$iH7Tg_zy9KwylRV^o*P6d` zW@gR#`d9b9t9EU>ORlQjUzHW5kl^v)!N9)G^CSZpy@XbXEQGB}~<@y$du9>LTej z>>&B6YC+OkeOpev@4i9ZMk9*=WCJ8JI@iJQjYD z?4H;ZY&=9qSkxgFH92QNsT{fPCT=h6VOuilL_gJR+=5aJU5Mo>(I(UWa zvuY@6rKLL9nYEOpI{HClV7bVc=BPknSbqg`O#VpJA%lL9VbKo|Xekg?E~OV#;f(?r z*i9RhG$;TA<6{l;8L$J79*Vw>Z2r*u?u$X1nGKZD1rIAr#mfEjb2T0$6ig`JYZ+`w=&FGIq4Iceb>%CHbdcqmOnj&VpoQ{|Nf~`7=&aH_QJ>vUU1* zS}zl1{^toZD-#Rz-@ad11^#K}Q?_(7wb2x}1en@7y~q&a1P5*y+@*j!+#i{il zP7XGf|K|L!C;xH^F#j`w|C-RB)%xA~vRp#&0?dDxUI;!V*$)*AOax3uT=cyg_~9~= z=KI-3=2Krh!<>LRWIzx`SGS~P#8?s{FWjc23IA76P*JV*lq3B$1k@3a^sMlCY_iyisdBE-^xK;|rYRpj-0D(BrIWxT7z9 z3HkeBD;sfD)tE;h4mh`{%{R*D?pp7XI(@1Mv~R3j+q|t4v$cj$GiZ(%9Dg=!Z6855 zV@+Bg;(oKeLuJ93HN~hhBH?4)kHqzuyaLzmd)L|0&gEp6ikrqrDk>x-q~=OvrwHAn ztJGd4u6i}~0cf~3s~*B1(`?F@E}O(KSW_t>5ix|2z69d9_P zhlZAlN#L|B0;X7-uT_aJk~76(ewL)uy%!*b0iDhy+bNu$W^q2B%vw~>p=sfG5DRE-v>!b%%A1k%=f#ot0bhOD7^u{P;r?aaKtd#>!ubc9 z{h{-U6-Gmga^0{P4{}*+yfNi!f@yr&u~3Vh!f!>b=*4pTl`S^LZk+o_mW9!lRBLf4%p(B5Yl2jNsbS;N1Eu&E`aa=Ic3g0$^2ME%Q{g)6==?mo@MJx?8`hmzH$SBWp`GE^Fuc! z#txS!j6*%16_V>I1LxviiP{W$Jf`o{r!@DSJ)b!qdydGLp53~%Ei>D_%HG*rJJpQ4 zthk=oVROs1svo+Ie%kBw{672b==n(2!>eBVdbtn4*=oPu*%K{v7_7S#%bZVt=)Fca zFuJk}xQy*^-@iHbD$*G5*|=ga;IAKYSm;sATg)Y-j}v;&q`zB}uJOIR&a|iJ`RbkU zO2tQcwSnRAKl+em59*YdP{zc|Y|@P1`yrD}B+t4{uO3mGP$#{6atv5(`TLM-FhamTq_J5K$p{HBcXb*zS! zuxw-wM{-69K+5MG!*>djq16mBHLD0lWGjp#0DjR(#MFcAAG2}80e@4%%Qlo_&>c_4 z&52g2qVgrCpyY0o)oo`iQoSI;BS}ynciG^kRyqs=J`xITX*S%3`SkemmuwbdU|3y|T@WVHDC|Yau7;E|d~^zpf9}t>oL`Wu z?L?23ZK)X_t0d*-bl(a2ACz9qGZIOI7r4-f% zbAF$l^A49+H=;(IlE(=^w0z8WR9)a0Zn_^EO8u`j)-V83^Gt{jRDWn4w&2#@grh`2 z3^%1=mzLP7X|iR&OTQ>DzY{oRGs9dRRF+?)X`bq&KFAN@6nO^Dm@)CEP8lX}4Cfx)8h%FfH zewR;>`mK7}QVKRPMN;TeomOdxHs9N#WP!wdA_~tA!8ncsXop9Ey#rQCNn^{=@0@m| z&sbZ#`-#Ie4d4P3)u!;iIP0sDSj0@&wi)Cv30~A>xrLmM8+qf4V^*m2z=jC>b~(DV zW_ruVz`PD< z#I9e=I#~P5dotK&C&2v%ptx%iQ1(MVX+w^qYGx3_;;mr67Ul`h-gU8R0)SGxX7qAy zip-t7A89VioP9X4R;^JVs4SH17Vxi%frBbjN%(SK93nxe_ch9rY%%oyizQiH5x1{K zygz;@lsqtTU3e!ios-Lq)Ke!xYR$=#5;|pwj$DMX<-+eK0z}x1@`f94H;BLYQcBF}%puvro z30Vg573xSo%-nbPH#2-9DbK;an>Z63=lrzipF0+YC(b7q1G1c28%VaVNq1PWt|60b zm@z*Ls4RYqZz94{Ko#yk{zg$i;r9#P!N~H_{+Ff2r=SwZ?*^H$i$PcwErl==xJ^o8 z)6_AKxB^C#t^>NS2qc7;IfA&}mZgDNPV$O45tbUQuXVbM@FGRO=;>R(M zDwId+(a4PcoqhMD$jgp>C!aLxhZ)~A_rCZ;W6igr?Bw-BeD?4Ou>}wHMmH@-3&D|( zOGg5Ckwl&2OveXpG;D!f~3p3WHprGCF! zEbh>q4*8 zb8;_djE`t+cs{!lqNnT?-g{8}B#Xz`aafCuY8t?_=8T!6e;2uQv$Tou|x9_`aH zXdY(ou#hre5i{#DvhhAgTPj;IuIX-@6*v&~c=U3LbjUBqc)nWjoI8-miWodJZLl6e zTuesr?H#q^JB?wlLXesdyk1{vWS>6R9$6)E%G6max+TCnZwp8|h#Ml_xULPSc_^-W z#+~{R(X&?W8|>1jr!tz(JuK1l+=hWi38%PTFMN+Ad#~5=_{hx+Vy8!+DlStZ-l%^* zgOM$WTt-QpGAP4$i2SXgs2ct3?0=2xd+9&`bEPsnHfXE$rnw)%dnn7-?k8(+X5TvL z?ufZCGrR*d-rfEn#gs8LiTK)e3>%B;urDa^e9@(Oc~O5hW9%y1)V`qy7k1q40^a5` zglVX$H~=PL62_?c<;^{!8JPgfz(J=25DKpr&T9`zYJB})occ+;WD zk4~9G??*y7f@|YzSN7~4uoYzp;QC&n_onZ9uci4}^W7tj_hY+#s^g;xwId~qDnwe< zeLLdAW&4?Kmx>8}LgTkBk~>Nk?Z#6f0hig!U2huH-dtuFkJG+DYKI$XW_><{rK{k|`}LSR zdKU5g-#XvFm}U)w;Ao)=V-g$74MtKH8h9e2)xjFaMcjwF-7j~`d+6(qu+JA+Je}z% zhMqy=MR2CJWnYM|Lx)0Qx$fNZv@evFpf{rU{C;S10=vBE@ffo{FY1e}>D)1F5&-VOh%QLnoi_19t607wg_B+au zs>|c$z#T*?7n9xIz1az`@z2+U$3ChiwWU zde676)Ff1@$#s>P^?J45L|p6j?KUDs-cTlchxn)IY42U$%gPw?p7RT=E`%D;0~u!( z#d>l^=g;Sb>B%)lIdQk{gs0eDeMI+fPQ95SxY1&p z={HtCR1S}x`5CYy)`WenK#IJA7p1K?j~&UHK6emiBl>=@v2BI9l1n+|S@|cNo4Cju zv~UqHqjW2oT@%m-@9(K>_jH%c++ZKg<4-8yB1STL#!)s`3~mT)1s+}V-jp9N8tPz@(m5Sgt8k=!LytgPSqW?YQAVq@N1<@^!1@OCzj$Mw|o{n5jl$oNN1Bn!ow z*`MwNB^<7NfE z?m7t;##)xRJ0-|yU0D*fm%5~LoUAeekqR7iI;%UZDt?u5mQ zprGH%ZIhpuQ&$|1h0NU#o|tUz5oMJV4yAZ(`Ak-FD(Ig^;;J+#!I5&wZty3xlQFFFDtZ7){{T$}fCp8X_ zRc@nG1opG(xzV2|=oPXY$12UDlx}Ehl+Njwd83ehN^2TuB{oi1Tq!}V$g2$l zT)`o8i>Fb1>9?#L@t1DnKnhd%6C_Mp@(*xMXCj9rD|3sXWMAuTn+M2AQGN#+BwwHe zuuU@W-%xKtyY6d3(&axE@)LZP;uidRVcQDe}O2y=UNA2d-L)JZt*O{T$S9!X(L&2gNKwPvKE8NjZ z>)Uw{vT3Gj`4cG>YxO#*v zc)H7m;@COsE_I+u_GbLl=8F^Dj4VT@b?NvXE}Y^`gFDkcQQUoB(8laZd&qeL(Phh# z8jn?m7b-%mZPyWsNscHpH_vn^B(YbR*nN1+Cf}4dJ4QWo1Cnd08>$O;Gv9#6J1l28 z!w=VU8dC@L1-{Tq0|EHBh0%bLyU2PUD~0nr;F>(w?K6eYO=F&VMT%$e?wUk*JaSotmafMgIZc5m_iiZD75S= zskc;$Y(@)By9jD_(}w`&!40_W`}4E9b_lxd(+VEP$(eD23;$6REbwj-1i?!F=ssa} zNJ%iLPwPhR*-emaUw+mp^mNAU6~>9cAjD%I(|*Z3@&KP5NeO?|GiCd9CIBcU!Et?5RgPoeRs}j*_ zm&b#`BH3jPd+ri;G3lL~8;_7GMA4)y1y;D06Tw$P7u>CbAfeM)_&Et_FUFo+YK4;nGIqzQz)7QH{(I zChT&Z*eNol0V>y7QY`{L9;b!kn*!udKn8{hYu4L`%w!{_^*?0R4} zAyp)e1w6*wpDM=yHjhR|42+UX*zeMz6j69`5)ROn?{mXq9xrL0E-tStj;CkGl}|}N zc8>IaC)aYPP^zX~HLf@J!j&`Np&>U{kgeR$r!(M}m~j{&J4n15;#e|QuG&;wy2z9M zMdXI>&PJ!vaPa24#?sIJpV!5gkQhQyEvt=-T&4w7@XgSXULAg_wWE(_8#2G~teZFl zuU_EOx)Y1=p#UH9;uHLJ0~M^;a_vnS!=U=JRf1pF+ub=;#q_+(ezr}nDqs+;m@LW0 z($e)-uB(xwm9)NJoZH&m3Sukol>YY!@tD^1?waQ) z#+pJSnZl8&31!_A^TxqGsxxnNg0{6I>Cx~OJ;>o0QLmvJosZ-jP$Y+yV)h8!9qOc) zIoLm@`$v~XS)&2N1O^t!YcVMeqs~n#`fBGPN&7DQS(r(NIkchxtBP&(lZgtNwI?`2 zI2i%uOev9UMX~e4rki(>K%a>Fu$==?=2_ned7ac@d8&Wmf$921mx20$$IX=Gj}%5i z>U3|707e$oZ(-UjQb?OW*tX1gKfUo4m?&70!Jxg}p;*Va9C!4>dVKn9O@?uLvN|ks z)X5V!P^foAj$5cMIW6?02|+{d!yM@2y21eTuA-u)JNKXvIDPwG`q!`HuPAzUkXb8$ zO(hi~Lh{S>?OS7ZM@9YYe*$uUC7|D|ojdNMR$~BV3_s&9i3$^G7s^jWi5$ zODFWALV?v5ToDUJscv|PdU>zaeO~}Bwc*vbzTOXV?*46Z=xsCZQ{=bnfo!YP2ikE8 z{0i=@LUx(GRh0af{%l1qr6sY^dwGMiQ7X@6M*)x3=p3{iv25@;2~GmPd-?~RN6#eBS-}SGN1`9$;oT~x`wUdtSk8;y+;`!A;2(qPeJh5z-kRE(Ua!cuoEI3C z{LrKO%4Xs{9x`|C*gR>tX2|%-2j_D<3Kh?2xUW<|=p^jvppQnw^kXQt13~@A`7~N9 z)L-K=$z|1cN6f;ZL|XNZ+LF*-_4ArMb~rBa&AJ^4ErJ~=uAlm~F-$jiar9}JddqBG zmIk<+N0aAozK4mY#RT^VFEW#pRrNQxJ`=e_SMZfk?rj{WFlH)|Kbr$~6S@63h%LqZ z*GmxTh9%R&GM0Q|Hxpf0Wqm?h&Wy@ivgkv@PFma}j=nNnW|*reTMyaYuIaT*<+hOc zB44ktVbm`dg;k|V?lCVKCEV*o)D3aOPq;0H`UK(SruVG_&+}hisU>39)(F+DqB?{E z%6^>Ue>RHY#^*_@e0`ofLOOe}DWkRjR)x^Vvzx1P*QcbBRhAqyMCI4 ziJ5Z)ITE_r4S{@ztvH)#cA?%C45_ow)$4wI0pxzQZxf%gnH#Okph66~A=zYqU1cji z)Exv_In``w?B6ReDkN?2s+!Y}TsR$i#Yz8ayb!_nv8#W4WL}&q*b?ZI7OXz|@;hJ@ zT88j>dP)!P+&8ZfBWh$GwsWvf$D&8@3CpXFQ&Wq+U*dCz0MMVGe=_`5g2X3G@R?F6 zj#R=O93MW`uh(@!;T_3y>O(d$7c;IJ@&lMVf0rrcfIIC8jDY%6E<-^=Ps>3jEtvWG&0%sd@P^i&Luq{)4za?I z?|Z~|RGWI_(Gu4swG-FO-PTYVAYXS^heZ*BF@PzzLf7P5`DZ^@!B(#nDnz&02wmqnz zx9~aXG8PTTWl7$9Lf)430R`^UQ??@RcW!6l3QNf6fu~=@H*`(35C>mTCF2pUlSX$d%^t(q~cPw&fR9rP6cG z#at!u?A9{LAGYm@nWdfXWOB12-bahq`%Sy6$xn^n#_bK?Kad;O$6|^o7Nq_+ayReA zM^D@JchVRd1i3LIb}fW`XCgH#c7g+$eG!;Z1V3jACHs-m+JWrc#gwrEjU_qaVAp!9 zX-$(&?*Mlt7Nb2Y8v}>T;pa-q{a@s}!*I#N_@pb?NVuo^UE0-n9rfIO(=FN8@88)p zXS1oP=*VZe~_%?P}SJsQhy}eic}Rg*V>p< zA?lHudxI5Y&?rQcU9nmx>t{n4g=(Rlt2r;(FWH(`Gi()4;{=6I1864M8jxO*z5>SE z9bm)tnxw?w|50uApxusfsM^Ohgw^iQuEs(w-#)12==$Gw<~Nr61notI{y^PaWp3AC zOd6xaPo+?H*s96*iZ){6C>W}S5rnIY>I46x#Tc|}7c~pwD{0sNrfy&A7-ALtI>t>7 z&}KsZ#f<%n=|F3{-_I|$Uol~Mt`{sbwp2=!_)q2x47%+53(#CVIGU>VZ?Oi;JQNOr zLLHHj_iG78!}pich%!21JH>yoXOIbop*_dEN6_W#EY`lmv+y*1e`w)-9rgdl!5FQ$ z664*xAx+YH;*VnNbvcc&(sc>Dx6MEgI zx>Y*isO2kxAF@u2-Cp2G;$R7>e4a+gS&lWBf6NvpVSauqaJPY%E8kjG-}I1|*+=Yq zi%;;_=_OFJ8=BbemLUDQ25-?$ae3imSyL)BI~8g?m&aKEy&VO;3C?TpXo6Dij9Pbm1+b`lxkKqR^2ZoMw4$}2y( zg3TWQgD;}<tU{6#f1BE0{R#w+|1K~~vqdfpB z@I>+{5vy(I^fn1jJhmc|Tb_j@o~RDdBEAK=tFGvF^n09>$_bTF^`p@VSGB;kL@I%3 zR(v}S!rqbfgUa$#A&WS+ztu!6Mi4>>Rnu;UnsELUl6ZKk!Z7m7g^b?NYLpgVHAXUp z{70IIe}?c2cXob=G@2L4s%wDn+bQXdw6;=y1QxKawx9^R-A2XWQG0k)oJ{k{d!Kq1 zMjt4Zr-eh7tN)DR16-rkdEJNHbcG?tY0$ePWC=E4^e_|0wG8siSk_Fre7wE(VQ}{i zdh4XPHcfn3GklYNAiCV<&12uGZZN=d^~nge-RGGG{=UG_dO_FActNq+HJa<>jzfWJfEiy#10@!FIV1z@HHi)cd3U$rK@1Pv*vLn{E+PWFsHz|4 zXLXkxj`(q)T|TdkgwgP2to(oLu$0%T5MEMZq+WEN`3)rWSBizWbsByA7kL>op7yR; zq^79BKeHSF z(|N*l&VZL!(K)zhZs(qRH!}%cY_gmNNC61~dY|Lw>l$nGls0o{eNiH0lF$CY0%%-A zT)nwV=3a}=99|dnU!uF~mH5LG^@YD8;U>GSVQHBMGiPr~lj}d+7|#=f#?^?8Ej!!S ztoP8t2NPKICb%Dv)aQjS{lz)i&VPZHuSwQD8tV+X$gKF$SiKmxne+lYQD%U?SGoeH zAVyiMmbTfTWLATB)3Y&~n#buBKqcXYki;t@(YzS(I{bDP*vm%RI!K?_WSn6qv{xXI z6gN2enZ|0Sxm5%OY0Yqw-mUVNPSO)FlSEfCt}{k`5rRB#a2@VuHj`=%DCP@V=@Q%( za)$^(A(nEBDMgft!2c-rjCi2$jl`{(`Z=Dv=i_=;^4K6vG`c1& zIOY_ITwBIom;Tp!G9~=8Lwaf!8nqxaBjVyoYaUN^nIc=IyrK<-2r-|(b#wvHUis5; zZ$*ua^dmn9kAec;Dv`kLoP`jX)`)Z6$J*3A8qb{%3&geE@I@dgbp%jWnOSUk$!tVR zE9~Fo>Z`y8cB0whV>;@d-|nk~dANij3Q;yFBErNy8xt&CA~3iQ`<-v>IBfjTOcrVe zXE!a4#=Ggx&uUu(pIX8VY~~1@^V+3ht8e+t-4quuM{YAKX?TpdD792Wdn3$k5J~-U z+CrAi3ua+&HX3Xk~v%2m2=Sgcq32=HrjA|V9g@$;XiR6S?(6T$tE(E6cj~bT|NG>_!6Un-U=g=ZF zMOv8;#{1~pKFGfsjt_5N42P=qMlH#GS_`YmeT1wtol^4fbrP7W6Jy_ozrt-g2qv!lTdyKpAoP7Nh@HyJt8wEwy}mQ7($g4{m6X^l!!L3 z>#qj1ZFa~Cf`jgAq&kxPb~~^@;= zDxI*GX$;?2-bY3J{I0q=J=m0Kq}46>s4nm*XxbW6wQUinFe63Cor>nO()=s>LOjfC z;Cj#n?k3_X35umJ>NcPXia^udiNn@&H7Muvb7#g$e$JsefM)qRLLkp<$Y*<)XS0*^%O41L1#Rs z{*MRi(iUV#9bt}oD`a4^^W~8)b^~^mK4D)h*#TSO@fov!k0p!$5FUYoW~n>*tM^4? z9}M+S&fD~k+qm-8M^iSedP(i4913>dy%x~2WWRV|RB@@?uMXh{#mxd0C>qAC^#@$_0t!nCrOI8aYdkiwH_535 z(GX)>9NhlurUI?Cl+dbM4vZApgIM#I9(@xvlrMtAU5;^2B-|VS^B{x2;@e!_N=-}!e zU}h1u*CP%_hfz@#Y6wT0*5tCoFZlz<_`mu;EI}K|{RA6yTyZc`p5Zq?Z zu@D;E`>#QY*hl@y#d#sJp%=0?IYb_<=h1ImKxQ?x<Xn&J~2-r@K*^z?5>I_J@iZ42(y zPIj>Sd4iW$><*UDbJ|UVM+3a(s>gq2Y(nT;N0eC5Dki!}oJYq+PytWArxwn+wF3`#kGW3#^YdC$MSS;K2#K@(RiRAw`C%rx5}?YT0kM^u^07QEA#Y}z#9sg{57 z1B#DAiITwll$fqQ<%v#6BF-Sp}VxbnDLKNy#NE!c{%`L_&BlyZ&JF<10s%E~-w zJI2LAjkwq~qv|AStY(-(o&Ize+;$N|%D9ls%2r#_`?fPrp{hrT1nkyCEo!giFnA|t|>Js=$NL)m~=xQ`{A@StQ(FL&$wHyX&B?85{~brvaT*ARYjwhVvJo% zX{wqrB{pmvl%2QGcq}cmiFfU2wvPO|XQE7N_sH`ThH@I@Smi}H8k3W<_!YEbJMz|? zTm#MOiM)~1gjTj{G{kHE{5BimpBLwO} zgTffR_Z-Nl_lPT+MoCJcPQKWEw?7hoYPmW1!Vs9-bGH~U&3cvg>cy)ojRU% zJ<01`)&jS8h;}vUuTPKc+AlujR{Pr={=+xsHoE9Q#hL*wAN3#97Iu zbzGn7AFUR_|3@SHkD;IPJ8p`SJd0RoGECIx~xuqhcUu*QdIKIEMS{lw@O~>2rul{KYxSxW{TI9rVJta|WfxqNXwJ!T0LC z5`)4f_($pUK(h$QV)>3_2Qy`DEVQpQfVic}dK)RLzri8N4RkMZM8K*aWA0yAQW3m; z(rTo5=@ol>xtm4xayP4+FKzg5OzHdrK?3hj>0Y<;|2q_@+vTkV%t;RWy24C|nLQE@ zT?XhGuP(PAgy;+AiZV*)KOO=p_~lLJXKP`M2rHD@Y7U(>R10iON0gC1`#2hxNdEM1xB)CY0u^lM*O1l$Pr$EKyvD>x3Bu02KC{^ z=MQL)oPYP)1c7R3j|qkqtNJfe`~NcvBaNJ|fz-l&*{y_n+mj-j1iR1f;J*wa+R*Di zCckWL_!Dcbcir_YcAG4YdjQV%FRft=g6?)SkQC=? z3ZhbJ-MkU*D*qYbmz}McXy4Fo>&g9>X4{z13XfNYpc;@Va)h6gdACz9D$JH#Q2Nz{ ztI66KJF(GcD9OOqleOeb;@XDRzF(~j?>J-C@jx48nbJU(7~CnpOxE!I(;)p@5Ok|@2uyXbM+eiaM=@n@)r|J zE}7>s`SJ!Wykz57wc_a~qka0++&0_r<01dfC#Vo)nxT#m^3?Vg1k1d3kebnDt#Gm? z?J7K?j~y6{TQB+(4bEN>_`G4vvjZb!c-#RxjY{JU5gf(No)I7(^?7u+@pgtByMSm@ z@wE75jV%OnTI2#=_ZBE$ZkokWjrI*ayF&6ku?4laR_j3k!7+vJ1oXA(N`1mGAd2ZWddR+$~dwQN_Bx?`X1m_M~lMo##u9=k&L^7H!PKl8#2!Dog%<+6P@MHsys zrb0|h51;dGBxW9N6vK*I+}|m|bbSqk-q89F5fC7)`%=7tYZrpKL%an&2Ji;0aO0oJ z_gyrwKDp;wdwIv(ixZaP5+$_mCE@MKVw@?RNk361L)>4Sp_N~@m2KKeiN*u=e?)us zawHFWo}yu<;-5_lK7UTUrqS45KijfCy*&U%)BDekJU1gLJxi6QY{^wNYTnz|0N|Ab zyOjPOw-nG8QUp^Pi2Yf`zd1oLQpz^dsvc2l>1Rmv{fK_e!+g*$Uv)(#*rj8EUzOC& z_uVsVnX4Tmt_43k7Hupa^mH77i0p(iAi17ve#q2n-&?SJBVIc;(z}ch74PRRoE8>8 z;r2#^)RauA!xrDJDI-RrTQf?c=&?gzkH{kHguxVZAYbZ1gn(zzpVDR#|1q?N7VC(z z)WBMFjhe$Ek-lekBjp)1Bz>NcYu{?ZT68eRXGcV`pSJH1Jx+Z_{b+^?C+zgQkmuDT zBgxu$h_BZ;xE>z}A0iRSkTUlAMhsfQ64veI@wc=OTQCP&5%_&B{F_j9wbCAAHQFN$ z(gZ@DRsoV72>`cMj-W3GW+Zo+W-{8zs`$r!`GgWTYu8TMXRnKcb6gwv{$<$tpP zsNW%Gb>oIx&!nCf{Ap8?j|(7{ghL`SpD~#U4jhKK35yfo8qFW=zaw+^IHazUzNp+Uk^wJ}gQKF`hu_bEN>u0LcnKa6gGL?Ni%I>zlZ001$(ddXTI98BH` zSWs-erny!dx=8FRnE1~{j|v305Y)u-R&*Qr`;yG8euog&05o6GXz~L}J^U>nVEj%4 zb^BkNfCrK2I;>)mR2lzz%%Cb?GJGV*x?KO>^%L<2LE{iW+x8OtpF-gk0Hifixp8x2 zIgLpQ{MX?Hhllci0RuRktPo4O%%{Nih@WqyP&uL%UNa?r5F6MH+c`EX14;%g8&i!w zx;R3ip@x2&M_tCRCOJR@WM_}rGHg2Zs$#N0yAVPz_$>9#hgTvR)TMt+d9&|4-)j>D z=8GvO!TAp^@xO!OWuhOgHG>yMQ0 zGHHHil#rT2+1SHJlNry_|LsYi-KLfYvTwdp&Us5smVluqp6ip)-$WeA6!e2)v4mTp z1sXOsY^i#&PvJe$>@dwxnRsSjb#)0#-Fx!p+?9+PghworD-1-Uy(+7*Hq_h^B!-1 z^l!K;r+E~@y9J$4Yux-$!%0*fb$1UG`#a<7(P&&lM zn+Qp(xvVCk{!bqw#rsmotx;x7%PUJUCa~6q6F!{cDC4a+Raz3NYs{--Z`t``yx>xe zUUWum93QpxgGb#(LIcjdgm<>$@(}RzY=_OB6KjWt#w%EttJ|Jp&lz6B2vNE<*WqYS z9aumh?{R^NeSc8GAbbtqNH1f+xqUJqRHVdML-DTc`pj1k=&=1R$c{?t>%NAyL8y{p zZaf;0r_^yi?0XEGv)iUJvV7qsd{~V`gg{;Q_BQ(F%%|JUO}N)7y^}Kh5e?ku3{?^Q zE`|Jw+anyAcOsR5pWKV^plQ_xt0p17q0GXm0!T`Hrc$^2V@`Fi4r?$TQJtNSfLt=B zz{oY5J?nt|JsEqszQU4DD^l-L=~$!b7SroYvdLM@>^ZoCOZcq@-WfI79_A*J2iKwu z!$^rb6k5{6f%+X7PKM+3zZ^XZYN{Q{Z#M1DvEv)Xz1`%ye{WbKM2y5)bY=NYD{xb~ zul!ZV2c?0MI#e8eXsevjDzujYFb;){c$Zh%Np~?eBzFp!`^!0)*PDqBs|&twMk=H- zL!pH0<>iOKTLQ@yFt=p{ZQS`QNIfeVl)iPH*C0|*Qf_vQWPMVf5g}&CHtf^7G z3_UI-<@5X505bE7iAnY-?bHwfPgK?RQlwi>Tze)#$NUyYeusgJhgGFwv8tsRr)3p} zb5}c2rEL!ldrCXLd0hiW;w!%1Jfoo*)m+_(`iC~hVY7kPdFYDzvtpa*OuH6e89;h3 zz|TS(M|x`yy1=g}ozW-4jCxgZhdC2>uw^)A$>b{ z%BnA2`=krwp;Ia3^cE3omiG8H&w{EAVf+%DI%rakIoO)rn)4m{4`prS4p{lNllQ^7 zk15RD&k@bJrX!drVNjk-0Y=9b7m$1%!t(07xRtB5$7W}#iOt0Ke)SJBiYpi+@U42N z&EUtsJ1GfjF^?TLC>nwK8yS;)f$l|&;7CEsC{7F>4}bfX3D2EDNHSSXZRUyxm?-(n ztp~UFic2FyZay@3o92WmJwc7+guMnf zJa~^tDO_R?VO*IBJmwlJG4Ke9Q`#vlGW-{NAf@%U94{%`ny=d8yypX+_B&k1qV9@S z7h%@axLcf@n#W0$PR$`g^~j5P`VM8?ww~IXaWiYB3K;+gIgs98Z6NYb#ze336J2Ol zeDK1{LSng71f)PwQi4`P&*g-G(mO&V) zOf%e>*L%MHQJ4*zmbFn+AAzs9!5fbk#6)zp$A;upL-@a3K!q0%wfrB7KmQW+f6sd8 zCam>aRf0^|IzHCIINIgEB33Vzb&6{k&{EzPrQYN z)ykZ-cJZ!J)KB>o>JoT;u(7yty}xfa%$PhsZpZpjQ@tlSR6Q|cog#Dc=B%-VF4Ri> z)*ziVJNE5ojFpMG^_iI*Q%5j}x6GZPT*)hBT4xB@B(fG26i*k>w)?=t!uJqH6X(xnmcq6D9rx&F0V-=t4d`aJdYLw+q zBp|qS;g*S?tni+sa*sM{el@%2zIB9LCGw#KrY2e0X#{XK|9EL+g5~cHaD zskn?Wt4KhH_Q8u1+AA?vLbTXr+2MyzLVFZ_b=BC=gk}l?(s+GI@5q^ z=WI=%ayntL!IS^h+&xBD@~sU5?^qpM9ox2T+qOD((&^Y88z;7{j&0kvoyq^+_jb=( z^J(5SGi%Pred_Fb_Os79RqIzz?K)_Sj5JsBk>e^jtYOU^GtvRoXJ{}2F!Gca#AcNy zektf)vmMh3=4Tupx!E(RhDME|@E#zEt|YCSvvInMyiIFupZ3+5_62`BPL>@jwHCdf^zFF}{5KMnC)=!^HhZDw%i2Tm8aLKR1HE6kJrU(+#mFRn5h?(C6hZ3ag*g z!*T|7-@St>h^_3WpfEh^M%^k-=*)D(cO z{nATn0OlByY!T;9?L-UJG#MOpj!XM=JrN()2vOA8m+JD2`RzP znQrkT4|Dgaz{w+$@*7kO)()>^R^H0Msz-Yd8ba{GZj9$=ovoW!2&;fn#Nk!MK&JOn;PUa?0!ZNVK zFtqH`Z`F7<{XE&3&Q)w$W?o$tL%*!8$QvU`hIkQWK26QTFQ#Ig53aMhNy8OfFDEpN|jb!jInf5noSe4 zFq}$5KKU?cb-~E&5-kt)03EpaP9j&@SAb&p;PND})POo?f-P?oJVSbrP5z;f*DprI z$qQD>{8m(gCwyM=btPUh3zT`;*t$6O%kX<{{))2S^IW9jk5~S}JfWFRm^*Ka!QmKh z4l5R_tSy$YeHYpJO7fNODR5IKyIzKbSh-jsuG=GW}#b@-tOX9`#Ma#2u(GBWqTZ4p0EG@gHk0I93@rdTX=}NuPh; z{7Efn4mAap)$Q=lP9|3YU^Xh{eq|ZqNqAI%H#SRmp$zG%C7hTgx%EhTRXhtyNFCh5oPBQDn1tnCl6QyviH^7ebV?LaQe#a7`rzMAVmtPa` z*f2f-3QJ)thdltWxOanj2fwAVE>8by%Z{sq5uT zyK|=zD_au}10A$s>~3X5wRX~1iZgni1N5%Z*s`-@(p-r3& z+uJTt^GBA^Qd}y2>DBLPK;4TD!3RY^Hdj{0ReN%4A_UK?jbX&2&zL?{3$D_ZX)T=o z#5g^ae~45}9KXjpY3tAU0?K?vUOx1j@d;ObjkXfN`M}p|7~5KpND2U=i5xqmcgogy z!ab-SIx$|QjQ*kmWxI_wb_4kxr}D@AJ1sd6dSfZD?HZJp>wOUu)2S@_Wj>f#%{`!@ zOfkqZEGCUG9Sb(s$oV=p97V&aRpI@*$d*~$KK{5R&PZ;*ZGk4SbAKY+XIIJ_=B<&l-1dVuyf^0K#q)0l}S-`hv1K6#kOXa0GM@P^mbqlLKAO=cq;>+ z_){^nY%eMJ#PTExr4ur!C~IFK3ZT2}S?wpVt<~Ig&n)YKWk82~FDkKH;>VDri7m9Y z0+6>Y#iTZ=5?d+#ggo8D@B?&E{J|PG+mo~HhPCgqrO^R_%@g+ve9G%j8oemgUxKCY zM<>#!gT0kNkisW73Yn_WzwS^c?Hus%tFjsF7~=ODhd98lAwD#B_mgADM&!6zpEB6y zNeSY;m3+8{v-{hW^Tui)T9z}A1gJXa;?GT8DTR++EPls|zW3Xm#oQ5sV_t{fLG#v4 zQV4xP%;ftXg~x7WRSzoaaBc1jxS8?^|9z(x+OC_a7tbJGIW}z;&(x6IG%*=sqoawk zS3pRl8y%q%ShHwPR3l|+^4lfohF4eQ(*6e+&IZVNBg?}>6WqX|nVR4Q4=fVe5FJ{N z&(Vd7?b}-PTlp_l4GG-Af~(hcl>#D7N>=`-)^ctYba4r3sn44lvZwMT*@^8^s>`8n zjCTpj+h)%m>R;dEA@n$PJZPi@R@A246O0ZE{2Nr{hfOcsMRJn37(@-n6l68tA5nd1VEXS_e|kQYTl3KWbb8)d?VcZT6mXJ zBiVd{iCt3nL2B5lH|L%e%hl-zT zSp^;=J^2rBL?y0zp$rPUByeBpkB}VgRi@1UV$@)o4MB0=5zA=%t)Z;~C3(#m)2TC0 zOHu$R$i{TP2GumJ|4xQUvaB6758FCx5&yZ4)#v>_3k!hyVO``Wt3qwGgX6`Wii+l8 zPZg4rcFSy$)V3`{g$kQ39z(GUGm_e~)?tMRoF$*&!9Wz|Q}QG>D{2AVhBGdyv~d);yecxh=JtPTI(Q8O@Ub8MD$}KX|6A6XV{Iq-5nh6xE2d z$Ps`+V+Hi-!P9|E@qM#i-p0E&zif9J#7yuEq>McHTx4CGtY5TWTpajx>?rAo`QG#k z4CyK3$WOc?A2xIktC^qIkC)#X#c5cKsN*;zwl0ZJXh?5!%UM@WX{}_jNfP$a*aMYY ze8^g1wR@AwnLUo3*y+C-cz`6$PlLhyB&r{KHM98f#(f}4`s1AbMh-%tmRMIq&Mra= zZsK(eTl~dF{XqgJ4l<%ibjw8}oQt^Z=boHz?9EukRm$I1{lv5)`a%JWIgZNCQ0 zn(aKF=a{6sCVAYiR~3)SKp*7dKW^iy$v=_Qa zrIaoNvTUwUz1~;EA&Aa?#q#QToqb<3d#=?<+1oFycCWW&Cd`@zT^!M58&6w1vY5&58ZJ88;VJ!j_~ zmn%$J{>`AbRbTAjMjAeQ8&DUH$&t31i{NaW=ED$md0Q z)@Ty+E^>oP@6RQ)8D(9%mQr9(A?*i64@7D&1~qvvA&2~iOOpX(1pGh^geLZ2y>K1K z07Tja`mZh<1vk<3_Bs{wWDz2(M#28bi<*B2YW@5u7+ z{eGsbYZAX}+uZyXx$)OO3I10S?GZlH3I{wk_n(H(i3<1<4#=63Tb2A1T9*K*I?n&O zz`D-)GM(kywa4fQ^~sC*{Tq<&k2=f)(}4Z`-yy$VpYkr6jfUjz%uTjNc8>;w=oegH zQ;khZ!}yy9o4r(z*Z*CkpC2C=bfy&nSUS40sMZF{-)*kF@W?vkAvIuseYs7*LTq zm#WTtY|0C{kKHQdZEHDDFh3^vW0p_{AsWudcosJ?vM^M6@-=>1)SF z^%-zi*+$`JdD9_RWh`Ipo$Oj+3j?>*P%SzfrFz43Sn-e6g+4|HUo^_q@)%n8V)u4`Z;TCIx{<+X5rPp7IM|Y?ixyN-i#0QaW>V9^gTQRAq8VKozv*e$=B=E~A zD{wKkMmdQozniwTGD9xYO(?u@wjhtsZteBKZ{_fNDlB><4FrJzuJ<8 z(6S}9?9-!Fim4+;bnJ_hPs^|HXs#$GD2;70WcA9^e%*ouhE}WgTnYWMp`cFoQ{EH1 zgF_?O8VRd8&^aXEs6iFGmDN3}@0?CMA@JkxWjO zK*hth3|XN@|#3Jqyfvw1%zniQ(#trJ*;bILWPO&ji2XSF5s-@kClXm18w= z%_ppVOTTR*Jfb`8Oeb!9`fn6h(c+Fe7mm(f#zsB@zYgt#Lar1iFmK0HxEMYX2v>{Cl6R^~<9Q zXvZt7Q_9dFeXoJ%G&T7x>S9Vll*|W4IIdKHjpl%Y7{cXMM^?ksYko;)?o=#I83md@ zfamjSQobp5INZQ06!F*PldG)_I>8f1KHcYfw(BTeL59zThwGSUD~f|^@Tzw{Qsw!P z#r>ku4WAV>VZlfSX;{SxTMpB19?_w2oUmf`@&=@nJWlZqW>I^88bh^6x-*jr%LE01 zMwx!IiQCf_uqnkXfN>tozftb!VCHb|{w#TsfjM011EXx=J(DwBZN)czcQap(q;GZa z8PRfi@H`wUb{o`$3e8dCh@53owDeS;r-d}JwlHHsBfJ-G3%kOQJWmKtK$37e~{Xy+eM;VpM9e%bh) z=!~8HTf}-L1N>*@Z4#91hsy#d6rhjCRD!n#Kt9@!PGU(Hsabqk(zmd z26q<=Mxv1r8tKncTmd|JF$?eS3ZRM~sr}Mol4I1?+&8$YVvmvu@e9m^jO?JXQVZL5 zb#Cs{b4S9GS~O0PqCbOpL)6}rgM#4JwUYce9sx}?p9S2C(RHqboeeT2Z}2e8*FU8R z0S&dtGNdQ>T4W{Ux~t}-9BZLJ=4DaRgkM{-OY>+-Nw04RVDdWAy)?frE;y}mH25mw z7N#1{0qiW}Kv6H5hMmrmx#&>1yhr6RurHqvh`p%0WsKpq*#kg%0;5b(yq}1!hw}$m zdSz7NFj~kJ2V;+*kz81Y9gu{4)%gX7>rv|k{S+Q=HactbrqcH>!jqDM7O6!=aX5s# zL$32_;S!?QG?t$#a~W#{HEN(o=B|r%_Uw(5k?ik;%|SKBVEiYmzL0ZSUa1;TA(`Jh0kfQi3BZfY+fGW0gbar$F^AiI(y4%1h3TLdQ#JeR#37cnB@E8 z{oKks*YRLC_YxBF<%Jy|#YZq#vgVT^Koa2ZqmWRtI? zAUT$=7K6?@!IeA83KzFL)eFRGIaTYyaQo-4Uz9sEHTt`Y(a!o;s8M6a9nuPUsSIZx z3WpU57_DFoT)-wr&CAz45QF5GFHo7+Fy4g;AL>B6< zva%ZDXys;Tr3_3yRH}G`!j>*I>6@rB1w$s6CzO6fQACseqmok}Yg=i#oTKUV9WQ<| z(y1jD+h`jN4rxl+W1WOhfJ+CXtL->}_}MT&?+v4@HZBv-5|oFuZ~kL<8-_OZ=&bMK zcv>zA2Bx=Pxfv81b{|8|sB6w2W94G&L_EErGQhnQEn^zjgt4G_GE^(1Hza)Iw>l>4 zur5_iur+GOg#b{ZvGLr%P_+XD-7?Yevdn;{4#a^G;LAthlIR~f*}y4zIo$&gf6=xsS8 zD-WG+91hoIc0h$Uhrd6R>BOvcA3G5^?)O~{VrLXu*a~k#Ul+w$)0I&{oqj*q?-5w! z)lue_Y>Sye9lh>xeAv)oAP5`Z1UP1X9&&5f%dVm3>&$YCxG9yC2nGNO{$cm?I|P0ho{^>? zE)s_Mm{hJqaI<~xPx4N(zjt)(PSnfQ)>ts=j0tR9{XGP~u=1dP0pZZM!{-BxG9|d( zq1P2@6K0k8Rl8YsP)}~Je`NN`k`2?kZ#^BDZar1x_HT2nag@=VcO6}mhO-lzT`*m{ z=#DD8uOMc#&3J{1@IcWn52s13IEUE(F2qc-pqdc3n~r4}DKC|e`l<%ZJe$9HPC?_7 zN^%r}Y$O6rTovvlAIG9xc;Q{KUaj4Mhk6=gW3cZ>H`Fd%QCM71d3U5Bu^K-U1u=+3 z4sk4&I!_od)byo>6qPUJK{2zcjb89XYfMBlZcZKrCwInV$ZAMj>sBo0f+hSl%9twt zj@|b`hTli~oU8o;g>k3Alw_xz2z7U+#BTzm12U2H1df~q8Np96J|S!jj;W+$FusAf z*D;jQ2|9O>jN+~flR1`=Rj0g9Y{}EUE+F0JMM5bG>bGF*MRvN}_v7`nh_QhZ3$Alw z)^ojp9cILkM%r1US>;Yh)AVr<*oli*EEyY9x8k`=Y>9Ak*s4q+G0qgeb5nv(9U(tkQ0S{PPNMASR{gArYbvKK)vUQ`O z1;Xy6^xBuNqBwj`K-j!=LcHzwbU)N4$w4Knt(x{p_#CjcOkjRt=*$QEBl4*bSS)Ci zO}r~`YI!j;4=oh=1&T=_U+0mw8X0CMjCkJ;ci=1>8~c(u*>L;6Sd5Q@G2(NqcP6DKFZau_SwzH%hiOi@EC)Im$rVN`D)F@5E2*7u-DUB#a;ZRfPaDhhyjC{I_OB73u~$vH=F@xBNbmieMi*O;_H^!XXY%&Uj;7 zNvO(#=RpIlSuq1fj?eRbX|TSMJMxKa?iHrIoiFV}Xk3+2Hd=7kNg$9YYN|V9)XQbL zXN8p41W3~w>f)r}Q(9UkHS&YJD!`qknU89S99Ho7pt5(QREQi#Gbh(sKJKVKqC76z zXH+}hm*E&POyj7%(hK-)?Ge{4hVMoMtcj)T*B;yGTaw0TX;nM5g3J-F!KzkEnnbav zoJ)8NdiD58UQrD=)+B`|tV06Wmt7I!cCb>|N zMfhEMa{yd_ChzPL>)z09nB57dlrr(%PU3NxCOn@;pM!fBe=loDBzen2ff*9)V$TV~ zy&9+9-h6`hw~zjUHTT5Ql%MrfJLY9>_dIGdDX~oZ1Siz(C`t$;XwDE30bg973?!|M z-fOb%B&P3KUFuaGm#vyt@3-S?1kEnKyD`mA z!6=eZTR3(PjS>Iqn;LVv2(d!3W52R{(Z|X{Im_)i=efeyV2D^c<*iP{64G}S6?hr2VJJkmq8)o{x)f&qT~jqK zP`EAQ-T?JGjcArQ9*Ks!bdidO(T1JMqg6i%N{Cyx@gemd33W_kHcv`Uty$1)uin)d7jprJa*a!7=pdb6Knp+Yr`Za7cycxv+ap&3oc! z3F)$nHu(y7xfxd2_|6?Njn2Cq5HFyLgEgYB9TmZM1^Liy{mikVfi5tbJ;v|tS=i3G zGX<2|7oFkuhE1{auBIZC^nRhRfVGA*mc2nM4cE;^sJ?`YFe>P{&#^Tl+OIfJ*O|;< zYp(u`wTpGSQXX5ga;j2%Mwq^fy3q-Xh8x_YR(5OZEjxX zX~yokUmhpu>tc>OQEBf3uMj`AAwBa;C}5WO(Bm3|`~#o_Rc;_-+?z$nh@9gBH@=cNro;)z&sG!GNnJlf>4h!4t(=U>{dYi8%A0K!YzHUij zBgvSJOvN0M+7kcal1*~pc{L*(6}*MN&_WMXNZPeMSlk+nJ@7|g*i%0#Neubm`7hx7 z|GSm`gKsGd8ylB%K(oUi^ZA0@lm@C@N!M0z2I1Be+3`;QG4^M8^!^3{evNZMB5XGz zjDJ)Ogyd6+vhyCf|L~8#I)c6fGj&S}-CsDuApe9T5R$%wzZ}=|;}ebyrpCNt|Lnet zALFeg@H?k zO&I+_t{||_D0*_!o(TW&n7=>LXRz{$Uf=#R-@%BJL?7W7Q@d5qO@vy&E+1EAHiQEy zT^aa)^odqxtAJlWn-4gEyA}Q(lPUMmjpf!BK!3CKCAqlmRg#H$Mlc%_P&Gnwd_t#V zY~EszXoX;uN1{T|!so01v&WJJ4^Nk!9`Oo{(s4^xxV1aES-43id6?5;q z2HseQx5^rYyId?g^MTosk(&^Kbe2$0o1Dhp>n^Ymm~05&ceY;6W~`$zu&+cNm~a`4 z*g}aE)@do}SVKS+>9!9=kIXwGXtLCHa=-ux0GfdyMKG7;Fe1s1O?ejC9+=iFrKv*5 zG4}UPlEpd7Hvv2~KV;3e8e=TN{#6Ji4Jf2*VQiY5s+VQy1eL{@1w)ymXCIPDWR=;d z(F&q9#Dq>vY#myn{Dv2G*U_E=oi#BI);37;zSFg|st%2>g1)WGe8#KR3|{ZJq?^ZK zUm^m@U;tcSUG)3b64@E&yrLsOj@YMYDX{|sYv=LL)qc~fWc)4w;nP1$1qGGFwdyZ^ z*zkX70S*NRo0;PExIA<>Br;rh$OtjXSE6a{g%@pH{+nxG0wKt<015Wv zR;-n*jJ1z;b{vC^YO4ZgdLyz?N246}gdo?G%&sgm<(*0urIu#bSwmM3TC~vmxMP(q zM%mY$FAb;%u_9QIkP$sWO=4SS8qL_y9sTD$nCx`*4oIqWl3lOj^{d-y>QZD712Zj; zA<7l%osE0S`uoWvgC&mwlvI|-9=&vM*s4Z5ti7>tm@hL^{FCdR)R51)l~q@Zdf9O9 z=$(0mr_1Be7<;t8c<&0Luax+7L^jg1Mgv{Xri<`g2!-YndBjbM2r;E%{?z7DvO z8o?W0?Ux9XV@XwUm{Ga3*!966qNGr7C^M=vQc^-^sg~p~h+OZLP+-hM5RYyI1$g;$^721c z4FiaC!#g;lePg=>3K5?~JVu?02jGxIbp)uf60=L=#T*4^jm^b3&G)C26CAU4zVyb^G556V9Uz`$!UhwWWD+s2T*vEfX>UTfM zdUOF>t%Z2H9?_Gcb+!Ehed^7cH_^;_tQMLamjM26qjFWJ@d;p1jCjV2xw^8Fe;ObR zEF1rpuP3m9VLXGvG`!pytWdKr;K9zNxf&L~QAm*d^Ori+LO#gF+mQmfWJh;PPfAE? z$G6a0uN*C8|XSr3RpxQ*$&o|yViT% zk!x6L$v8ncwG1|r8b1-#Dt+1eo5yI;Rg=In<|)G$E8h=t;33#v=Fg{pTACW{q+C>S zcB_@-wG|-7{w4^~Zb9<}^o_(-$dV~8Tjp3X6Efclv|SG{Gdo?bw}6iR#_LO9VgDZQ zk=Ks=RBxkr=Bu6^OJ&X=aRcfyuARXLt>-BA|a>Z z_}acXW7yU4&W%wVr6f~xJjE7EA{zD{!KlNvKMvC;i^qi058n390fiTCkIVv2n=bGp zQ&5a4tm75YeUBM~;=dfLZ^{V_sugRGJv4`p8lPZqIZTtFi~RNJVnbuv&)!$Bt&O?Y zl!0-3kN`Lmx2XPltE}1hAiwkOh?3UQ)0z^58#w>K8f<3_5#Njgw_DZz$yCM(fEO5 z7^0j00SJkE5B*t|3elpA>m@Glq5{4VA47uNMh_+0TTJ{dGfoNZm&i#$HJO_Tkx3t8^GqxBR)`U#6Mn7Yt*`52K@l7iS;PgeK5|^a*VLxIMw``r6!V)( z@osXjRrR*VJU3t~k*o6mEF zDK+q(neS74ETyJinu5y|q+F^bh%&#4#Girlmyu7BumBt1^|=PWTf;dX?0ZrSusoy{q$5Txw0;=y&_9|7Y! zr^+0ermolocnJ-QN$;6mPI1UlCtPdT&1YIn2!{&LLsR&AVQ;A#II9HLU?DZwc$j+^ z?(9WIPsX)lF6S~Wy0OESNF0THXEQRzdE!*C4X8kS3f2>{40>kWxQtop&ten9_gZDQ z_F&{6S5^z9;eciLmIyvfykh0mC$g=OA6atj?$3!jN z7qxf&R-_+n4Z{TCC2>wN@8J=Kt=Z+#1n_H^zEwNYE{(})tIL6p>?FfFY;9QUhxL1( zKasNd)WJ9+v>80>lKqM%Uv-0;BH zCTc@A?7@h%)P#t}DCHQrQea;AN5VxJlxd)RQ(*U{q}(!PCjh33p0T7BlHdrXP$7O; zyxp-slX^^-b_%|J$P|C^P4Iw|nge4s}} z>M{E7h#8H_t)~nCSYv6 z_^!V9D?gS^DK7agf~!NMV{qje+mCQ077 zI`D&EbjX*?rjlBvhP)$y`g_l321HGOGsz%(Is~X3o+=kDYXfesJ=1R%jLLyt1IKgK zvKng>|Aw;l2&hkMQ#}>U1aqeoVJAt9Du&IM7FMW;ogDfS6)!xl* zcFTI2+S?w74+YK#Hy)|!wS__w^EvUCmL<_R4Ios5YZ2FOWg!QvANkLa_)R#K%}bi*LXM`R%E^gvWV`9a^9 zb!uW;9;j7mrNpGQv9>op?5vk%U{X*>4bFzyuN7`iJu3=s2+c-?<~2Mh3h)zYj?uom z-cWVv_#`7alM9&{xG6v&1R2v*ked|L-7lPo^+WvQn!!%&na4&C%dpt`kJ zB+To3{H9Qo)nz|X=@o$<$ua9ZvDQ{(jA(5zT>BWbW_{YjBYnt9sxL3`AnnU#oOCzcl#XDOK(xPX}LNjgSSp$Bv zY7C1(ct~~DGndG5zsY;6I%e1N=9C3CS2ebj9b7)F5oGf`)3DywjG;={C6D%cK3rd2Mz9aj1=Es>u8Ik)BiFbx|MdE!mIK-NM!q_|Ou&ZbF}^R+r<$2B zxzwdww(xgm-EzptCt7v-XlqIB+L2C*WM{cIPBgbrF^Pc(biuylXYr!WcXrJ4IMA@Q zCZvz1Y$E8xPyF5*um8(JvY$p1 z8|U(sE&MO#;QRwJ!CVW&e@N-GS2Qu%WrkJizj|cgYaGH@?EQ%J?^R2>+xG^iZ4RPiUKM|D^7} d7g*N^#8YpHlaZh`-j~mpgovzgg`obA{{bEc26zAf literal 0 HcmV?d00001 diff --git a/doc/ci/quick_start/new_commit.png b/doc/ci/quick_start/new_commit.png new file mode 100644 index 0000000000000000000000000000000000000000..3839e893c177ee81865b6791d2b81b664a4dcfc0 GIT binary patch literal 47527 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

&I#>0_{^-L0SDa6;E-#{Wt}}|6@wPdcqQ{^ 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 Z1Sz8|r}y)&xA_A6i3v#yR`Bco`G1c#sD1zd literal 0 HcmV?d00001 diff --git a/doc/ci/quick_start/runners_activated.png b/doc/ci/quick_start/runners_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..c934bd12f41dc17d10eb131b233f630b18fc1761 GIT binary patch literal 60769 zcmeFZWl&t(7C#t*ySux)I|Oaq-Q6L$ySuy7xNC6tpp6qC!5xBIfZ^Wz?)$&0`8rcI zAEv9is?XZX&*|Okx7MzXQc{pYgu{dT^yw2KKw4bo(%Vqm}2JB;3=7#KVA!Et-fzqT=iMb8kBtPcR^qtGB#h?z`@C( z6Z3Laa&zI$4nM8&O+ZReirgcR=zi-4ei{}6GmF6hBZM*g3D&qkdWKBmj+Qw+{84om4@fD7?=70ukg3R z7K&DBsR4FoZAGbp@&36_KqL%HloDa+AbCp+{sffohU5K4l~euw8zCsN*`xgpe#qb< z!?dB9lLAms{lH=*g+WI@UXHpY`wg{H{*eWzfeGh_o2VP zzxN!yzxTxi-GlF*i6DKV@UZ?BYm0{baUb%m)wEo-CKJL?} zPXeBNA0O?_U5!aR?d=>~_&f#4{^sEO`1}`{nT+Ib7FSzAGA(%}5-~?-a}rJ_4ki{d zAvh8e5&>s33qBQb$^VFdTnUm{xw<;>F*AF3crbaeGdVh2GPCmX@-nlqF|)BTesD0l zcsaNldont>kpH9PUp?aHE~d`bPOjFD4kUl+H8yc{a}^{b`^(UOU;p@N?rHshEIGLR zC#;VEng3d0W@Tbw{;%#2QGvgxd`i}y=5|`**7oKOE+008ICyvk{^tL`t^6O0|0AjW zKay-5|10@FEB}!cVE!wB{|V@yZ2e9BNS6?t0P}xSF9c`SB0llylgKB4xTu;Z*jW#< zQtC?2`+Kk30K-?0?9Dxs(9t{m$S~deGCN%kmY-kh0!*j|3`uWP$z8zn;Bk9UtKAoE zya#mUDbR1BY8CbriU?z`35zhy3cTMV z!!y9ZJ@T@5&Gxwn9p^}h_NpKE~S)&ovW|56%~5BUDWDrc09W<)6{4Z`^KL=&MjCVE`0(H!PD4*!9 z>%c#J{(HTQ_QTDE79$?*e<@l37s9_|`dDX?hiypCFM}MKF!?LWza(U`PyZ7$OOUlp zVA?GQBaQ;rKUrV_+f*aPIXe|2esv%vfNBN{?{F!nqf7t(pP-C1&@#;^HzSa%;)@=a z(A&`>zuOJT>KYDqrom@EXjSx?r#U2t{#S>+@;lyzp-BFWwNik4l4Gz-$_6d>@$=^)|_ZoSQfu=fQK9wA)RSIhs?;Zo6E+R!*{OJNy{y1K`%^u_HJ zpXc;;Ng?)5mYZUtb^sXe1L;=9m`Y#ODb@MIkG_qQAzSb8=AzW)wQUBrB``8_#_Yl@!<>&YAUk2(%d?vAUd1jAe;)QDZBS`L>Dq_Oc)vQu=)e1j*%p}(#?>TQG1vy z67-wXM4S+xHH+?V#2myJ>_>V(QdJi}&21-+-DC=Cf`bU`q5ENO>E-dBz~1VNUsiA6 z8!MrrI-!juq@-Z!fu2x+`&Ne}J|m(hRH(D+&CSQ(p*4jgUhKF-^_`B}%iR&iUQSHU zb)BTpuwz5%kV6bmMWc*n&>ntHU0wUKGP#;Lr^=U3yLd#SooIz{)E|2dhU-dS74@bc&j($eTUZr1fz^vR zhAFrDJXrqZV8B^vDQ8Lk5fXa*ma?O(VsRBqpvm`>IZLO zgE58ahUl|kd&{lfUDVEX5;SM4EARRUaAr%tu{FN+V@@o{nvrT@`$J8fB0oZ_#7{A& zZR_2edfJ+^AxZB{o3Zj7nzG^;Zitc>rG#W`fj|wvOIMOs{9w8i$E_j8Wv={5;R@6; zv%eKzY}~wU_-0kFOyDI0mQeuFPq-M}b8&*uLImldVW$RTx<3{xqec6=9T>GDzr+s1G@Fq~7 zW$w??pEaI^*@v54xKa(%vV%b*EcknWkW>Afa+7--g0ftL?A2=3HxCJ|Jgw&D-B-i-o3ZNPkJ zI6V-fp3zNhg`p>5eWN-DX1wSLm8Rr!I7!a&6^Dr`_Yex<3M0UTUGZ9^Bp}8cw8Jhe z_|~pYJJcp*-R`VK!>29^U%-8QIJC&NLXB7j{I$}W>)uyOYo&}NB>i=N82Rg}DE%7d z;k50y4_|;yH^`yb$S-ueqPaiP4$2FsF-Gx$`1J<@VO6qzHXK57gpWlD!B|8NTb+%O0zse|N6wi&DSC9q&GFZ-c~mB zuIQi1Q;k~|E3;h>{oP1or+CVD2RRkbkEXfnhvX0E#5)`65`OobrVAI}(wrsCagc$1(ztl<&ED~m)BfXa;}=eKX?>!EDzjy`d!5h==E`7%zDfO zx%pPh^Y^4luI}h9-NdxI1o5Y!dKAk2+{M&29IMR6%jJ73dyibIR`l!fd64R4lI(L! zrKXE;Azm^5$!>u8JW=Z4=-Jm3wo09;p}eNdOYrj{*1h!woLk;*yso|ju4|Sanq!dB z=NsxF%~VGMzOu$I#G8|6Q=B3ktN3l)ZUc8XPR{b*2hq^mZzAUvksKV8`#Nq&ah#M} z&OOebh%4@-WN|P5`Tb!I0;qucgQ?rL^;KMDd+a;7S8fGBPw3EA5Vr)N-aE3Hj-`Y3 zQ;98I>1Y@HEQ+2I_3xARo-TPFa(-ujsFO7xptmd=SJDW^nzOAjJXyB22?F%hFE$^a z>NhbgP>53t5=)BSGbRnj(1mWQk(msl^iR8^JUkw({X@>D^60~tqE#j5PPTua?~M}D zyl1UgZ?E4}auoD_N*`${7MdG^h<_j?yJ?{s4_rJGkdNL)HVCWE1Lj%Y6AsEak}#BY znB<&n!^yizk0>z2S1v$Wq!KWT2XkDK3d~3hHivoYpQ7Z7^vqi6U{Wp%E+%49at;JT z!ZV~gqGNV?-@(;&)LRn%^evanQ!9kX3<)>MtjANTz! z>Z1~`pR#=#5hffJooV}Dphh{#<2S+Y3k(yNow95mZ^ z0_Nf7q0d=YnYd1o!6l#++2M>4)1xjB!Wia&;@8FPt8@aT{r2d?%H8eL<+Sc!d1OgU zQzJuLkxrRJ&;oL8sim_uA}65IhWTKTA3Ob%2lPn~S%1|T3n~3TI&03DaA@p)$>^c< zPP89z$CM;3$%we4SGFK94 zVL6LCWy0y0pT&)7SfLvDDHkw12k~6{1j7Lp&FZ?CHXIi14HSGc1ZK zu~o`mt8OwQ-Nw|2o>N~`Fn)vfMTxN+bB`e(Q zpU~s;-#``zvM%GeB{Ps1H`f@j;`&ZG{&q2WgE2G2kS!T>(o=3%0wkaw&^! zHXJghk?jQ~OOf07wc5GltfDVeR0ZVXSLl0zRogLg7~6@@L`wz`^+hT`ZT8jg=8-@E z2J_=(Xk)$56H0_TZVU`546Fg-e>WPuhygBA#n2uZ*D>}`KKHjY6!h%7u@KU*;1)l}!XiAgZ7IL7FGO~OB(0&Nh` z{dawvDFi_!3Q)~aoCQ{uP(m}(c`u{sePw9SqB(3z#)>AJ(=R$S5dLX_&&5X2eINC} zdj>rO*q$jp%$AU4Oyx_w0&&$KpzV{yt%s(_uV`L1xQYj8&I}1=9^Y7{`VRP6VCVDu z!X8}YjPv`$WyOS8BdL$`w7DEV87{q;jn(ccW7a!xf?pqo49P8oY&x7@Q7*j`{y>Wv zqhX7{*jDLovDXbe)=`MkbFVTNW0HD`PG^5odL|w|)I5GYZXtGPFfyldgJW;Lg40&4 z>wFJHufG_CT|0d$bhNKal2Nw7fuHeyMgcz#OcC9l0siO=>Aa)_P``a z!gp1I-t**BI5fn8*x!%YE#=2!mR&PJf8AZ}X&rk%bZcgZmZ0bNON70rANaPRyV`P1 zOOP0$h!%I4#w`w6%qvPYvBQ4r%gOlXIae;jF^SeMf$b6N@_tgGRaz8_VLH63tV?lk zcVx%K$?!E-C;{L|%&!@L_q2s1nvZ5-y_L{%B(!lu09P%fv|}xK6>~iIh2hV9Lzt>g zKkUWETKn|lsHx4D`d=f&>AN8HtK+%q+q9-H-n=nTYIm+u-(;KNTOM1k%iO?s?2Qkj zxk=y89rmBurS%0gZ}@j+^w@H2v1d(HjWM$~HEH__hWw(0&YUy(45PbD(|tL=Y_a`? zf*eBnftg*#h2KQdUSX_x>umr}i9{X6Ql%lCn2@4!69%W83TIwP{zD;5jGhZ!&pvgK z_1ztq*36R$H#`bwqb{O5=wEB~NVsoza1Xh^<(DfePWFU-JH|cv)&tNWi!azedCT21e}bSz?g~uyYf_pk(-p(F7ouyrag^kN!g_x6SrIORY zrYXydUasdx5XcX-P5yHwW1wyNU4rFA!W#fstK{w>pM|`^0B4!LsrDyQ^N?J9)_bTs zx(BGv8NIDYnH%d${oHl{wjyrPMl|lQ&h7eKrpNux6)Lqn?)<#S(Yy0roKbkZm+}`- z2|5-ta^Bh`%q$RnBFFGEYwDGt>lbkWS~O<~>Eeo)%<-3S&-0fEW3Y`+ZD^$dN;*Zo zm$NOx9YK$@zC=U@zkmIHIt}E3o@iN(l8@E`7RG4FG1?po*9-EgXdx0lP6d#{Lp zbJ(LmA|T*92;)g1XzWUm_%C_!ue7xKYV-Z4$q@vL{z3TvIsPBc$DBOR9wFT7PiHj# zcrFz?sy(dpAkIPIo%9q)p7m95F%>3*iKb`6ZZWAIeZr#)=-ByrmWa(FX|d?hkh*v# zPn7WSBk5;L?mSpeJ?h5R(34J5Sc!Tw(!#2r?x1oA{lmAFqCG1_ zKIm|1X$Y0+vBJ!C$%s( zDwMkB1#TZp$y;;MT7A`Vn1p)gOG6Noqwz8QoFZ)mMRN?8I!}#c`%+Im;3pE=!cLha zCubE(L}m?M$k7y>k2A!NLpPWm0uJ32*w8@R;4Qc7jYno`J0mpisg|Qet#jN9zI1)} zVlaeO8t~_FS9OGCIJAkIiX{rdB0X8-Ql9vesKUHDa;{sN=V35C@H%OS9YqYKgQg#u(ukz3~0Ak%9yNh|1DP%V2+NG75yj9`i)9D zAyGA6qx9yYhGEpd2R7@+H3~gt4ZNE<_1B`MI3c#NV^?qSF-lT$dUO@GJ*$X!A3h~b z?GSi{41)O703apmvF$RM0iYUY@w`S%VoAH*2Z}}9E4FDhF+U~D)22pX5JAfytS9-F zNbTY$atSLeK37>`#>NnxLB$!}l&_n;XKh7PWcC13p=Nxngt_7_JVT><{JSt#ry~i0G+} zu%lJ;X9bMU=%0?+FaGgRdXqi>oyjo1){T{<0zp_oQzs(jh?Cqzdl|Eb(2^?@JXyvh zUTUG-G4@<4P2jqiR@9PTr@AJA#8K2c!B`4#jFd#%r*;9fV2qNFXd|oIaDmA4hWm&F z!6nVJEo%4x=F9VeZe>+9X!pxVFyHI*Pvq1#oNK0KO1cx& z6*+0IXEN^`yWPZkk!SceQ@QBm#W3u?vnOHpckY^C(#@{VlP*~bA|xqmz1`{nwbMYh z72+ddNIN-E1hNr|ulK*sl3uNV&#%nK#x%%-P7G^c5J!pE?R^CLW&5j{*5VQXNF7>z z06rJErQ*Q8@+CSX?xy32+LjGJYS~g41Mq~9roK&8zpz{NB{4NWu9epLg>0!7UQl{k z8@#6kZYj=wv9j!%eS}1iU(>pNkLM^{N?QUm*P)X-+?7RX(;z=h?4eOKaC0sMbmvu?M<5=37as16)zz9ThslBJjRFN7>5=dXivs zZy~nfLc!I&t!RF&DAZ2MR24t(RP+Xt-zr+$dFI*M_5QYS1?RZFu(TTdi0r*s8N;Da zYWytJtd^owv)h`v3Q#tuTt8aQu**rAg1q8%uyIqOqV3z{HqEQC8PvI* z{qX$YXP&fBx5b{IFKl}tNJn<`W5w#lthA&B&8@*ckTLU^#`Li zi^;)A>=FY&;z5xD{JXIjC0`w?ZB#jcg6gy~22pJqp80_8pV7LMy%^9E)nsL@D*d;{ zYueIpeULBTu!?%MX+*1RsmL)ciPy8M8a-Z66W574@{ztf!Q46Oxs?z)+9h3rCvk;{ zCKUB5tX9i5oUTeR-ltc+((oBDyYT>C`Y{efi8l+DN`1Zp6`1;oG~v_qsn;t)jt%=N z{b}xeXkdnv%xqzmJ;aHQw=V4JzK9xE0t-hdXR*2GzPL$uDPp|mgDKaK3+tm#2Weo_ z6hOyw7i(HVnCE2&5^-n{iG-;h3wfw)7JIAdtAy?X3oCz{ooXuLw`%&dzUb5ZVoZ&v zs$7sE#HkAK+bi!h1c6sD3r9b*vUnIWh}G(DPYHC0AsB0cm82PL9K06?>1!b@yU9A@vHk_?c{}RSkC(LV*?Ui7K}C@ zgJPU!z4tfct5vUxNDL6tDjjBym{Asab-R7*!R;0 zGu>>>^v;!^qLZowM~!8_If0oY{?PH~bdoNH%(=k!8dfHP$};?HP+E2ube6_^N}2Le z(r2}l*ZQVg4i)#hks|P`)z;QjhASw%>7HVS&Qt90u798(KXy(mdB?rSb)V zg!TJDGElEGaA$?etj`rGl6e^T1f+WboareuwHFXNgy&j>Juv4;19I+uwF)PZBjm*~ zX3=Dl2r9dn)xkSbn@8h+YC88ezSOkJQ2eS{O;F*dU0RoE5$Hk3N~3o(Gm`Fy!W$S% z9z1g+5VMAH0|CR!$AOz~bJxceDEp!_iIEwG6G^pDi-3*3R){>Y+6w0y+{XN>Cs13_ zVjqvAK5n%G&v%)5Nnf{gwX?N!06MdpDqtG}L%pQ_iN|f#PRqV5$)YC}oT4rOmsfTV zZkJCUe#B-1sIMP#(GsWhU9=%864{{dMVGFnMjF9~Ih;b5Ntv-CRkULJE*(_j7XB$1Qd@&_8#RdH!#T%d!!sNfGTKC$2+t`~VpwvSZXMW_f6 zTGCWNd7q{E%x*;?f3T6sGd%M2UVLjao!a5i+EGfVuNPicI1)w4yVfABxjr`sN|2xh zTu+Oa@UtSFSlN^YuvJS&CFvq(rCKfQlc|d5@D9bm85iBxRHt!y<#2l?kY0*a#yxSGRJyCA--V;c-18X_6*=_{MvDPgzcl zRc6rArRUV@F_290v-_yUR?w*x76(gloZ5AqguQt=64!owGBWAQ1IJoxQf&c`3tZ_P z%5?pOSaA_Pq1jctmS)&9mx{rjx6gj9VP;^+a18@MG-d(yYt*9Lq{1Hc;vZdA>72w< zJDcP-1-#M}s*nj0%4IP^R=yJ(>tsA(!K@}JT9a#94Eeuu(3l3oA;%PoL#SlE}Y~O4k);5@R`|gRvqStGUSv zKm}c-`W@86+5y}euf2q8HgW)b_c;tiZ4g!Q`7K~P8KWi9B9u{~Zo*)nVa!BYkDlJ@ zD-LQ1&pZMwwYp~$&SYSs^!CW>p0jebc_YZ%eS5C z{P`e`48_3rw0^qQL*oIM`43~&^JGUF2iy&C@HQPI-hbg*LH&U*M<2r3> zXGkYYYtKhG)&-*fyfN?a=M3_i`Hv&eAy@`{{vJK-#uN&ae{ zH6{53v6P=gH#d^vXmw-zRwO2PtxnPVBBC4l#7#{#pafWe5>zAVS=>gGAZX6z=+o=Upm67aB7-P!VR_U=+3rEio z%&pe+hVcP2Ke?)(B!xlAQ>hwCo)yYwqJzULGlbFDy{--r?YWu26&GP##!WO+u_7>vgW@p2xe!%YxGuvHVQnb_nt62Ur6616M95(U>DPj9&;Vk%Zzb}=ZB-rXg zDsW`2o}k@^D@-+hE(F1=V_Shl5QKIrx627tKq?(EDQ2bsqJc%mx+(|h&qYL0j9*d0 zXh>iv=)TOuE^c_90I{UkVQC92^2{t8iB3e}ry;fcuIINaLN=GcWhd!Yi~Y>2VebSF zH;Jp?deTdu2}>Nr#RtATfK5Bied!^TE(h1yky>YGkA|>M zG=pejDTeMQ*kO0fj^Z`(7yMPGd{5!!GriE>P3!%ok+;MwAulhQU&xHRW|vkwXm;^=MmUY5;5k`d0UR|P!MVK zz=st#E{BsOu}Xa&(8kbeW2yOV(mftvHwsgj- zmno#$(TW78VX$S{5XTHkQi)>^0`Ei?JF1l?9lONt6rrD~IPv;!)I^ncwF zN+{@7It5O)tT3xPY*P9~ld zXe4vEaY$}T>!vW3+84H>>B12-%>VI>Xa;zJ!3tVX)Y9q6?`tdGdBLbW3p<+Lb=-NXqD(2k9Tl#g-G*iCxV3_-)?j z>#?h|#x#U42Vp1+I@E2%=*L5NPdURVbe4tOA8C=OxdoEZ!Fz1iNP zZnlc4Ab>?mv)19#DsUkCqYWAtmh4>2%C?POMq`haIA_GhZ6Yfvy$)D_;ig!=aWrB% zFQaY_{JFMH5f%qf!?v_0!Ni54C`OR97(We|&gfUOp@GsXs?m1bU2E_!RXmqNI5h*64hKfuE zUIn;xguW+HEx5|ss=vz=lwvoS^ zwxo7r`N*;q+0voFodgt}W-DIkeDj0Kmqqj)kt^VHDLd&z`X0o~O&VjJl+pRYU7{m# zqs6cS+TIpRdRrKjfd{@VPlqAASb(wFRtrJp0TqNlgYCkda~WS7Q2Cf%c0! ziW*4hMFe{`uVWBgq1e>p1YR&RnHUKKq3yZiQDzntXTejh38#@^k<#1VE*z}ofZW-} z2%)=0VdcpVFl0&a)RMMp1qe41)Ko1W`w9AX-g|05^ot64w zv8i&kGLzn9gKT3WjS6SB;3Y`M&pkfm%YCrRh`jbKkvaLs#HcyRimaTd&Vn~oUbj7f z^iBCw+2JoJ#-qfRj5vaMB?fneITu5uO`LM;f*dx!zF*m3LL(v+wWiK4T;_Kvl5V?H znKFYv@P85-#wp+E=@&R`EKwJb|FqYfRd6X|FkVKZSTc|GfB_DtWRmD%VTdG+0u(?O zq7jC61~m*y4+c#tFkymUO@lUkQ=tcs)Xq@~o&fP8X#vkfNQ`#D$ctdV| z2&-lWLiR`KOxQS!+S-9}^{W`77ysK}MG3JN|7V^v1ag+Hv|9xFSnD*sCb)5^;|bqf zTb+HDy#IVZ8G8yPGN9ag!a@FDWDUoUYfV zN$6ejLf?brgV*ATZa-#zMMvz;BmGKmbU_)eN{dg-OYYu!G7Qn&Ab2{vm@R9?i)_Im|ErJ+o;1`CAFla_-~;_GUZqpFu=FgayUNXo9_Im1q7RiW4)6 z5v3nH!xI~2NS z3B$dA!U+%B^5m9a_RbkZm{OYuZ+}`dbc*RM#&Y;Wcd%LS+iF{8VTlENA<_W7R;;$- zkFQ76^e3Feml%CO*oNH-!igsdEqs1hc|ZVku043eoCi?snJS_@tXIPgBYnefyz#`z zc?F4MYpj~^t23X2@WH4fK2AQOx4_m$<@zhe#%Z{H!d|!j=dE6*T zo=%U}=Q)WbejA}u-^0<((ua4BIilAsDqiUA=g?~>r315daWUeY{W$R>5JH}R{AJ|r zwZTK>d$jl&e=2yw_b4Vmgq@{9Jk~SUuDPHpZW-lzUtxWDeGI>3R&Hkbr!xy-1(i)Z z&`H^e?R6U?b)^Hhe78eHYO>PBortj7yT|;>v58B}kw5ZX87w8IVexs-LqpFK^Kbu! z#KGw(k@6I33b&=KolvpM-6DmuD|vFT-u$`dZUkDC2cwxO)V`Ecv{&Iwb~ z)B7oVnJ|*^RfIxGeTeA!H{;nb(vySBE@>>y4o%1630D*If^ddDWmm~6>8;d_RFxxR zo!B=6Fn*B1&_im^LuUa%Xc zZ93E2IvKVs%$wi<~*79jMMpy+F=WE;^p+aD;^NIWGasE#q^P|nOc)z$O) zZHO`B{h1v%h1`&+sZ>d9uNawqi>{ug_-=|DLszuN(lHN+nNYfFtkG4QR(8i@#XlP2 zWAUCix@iJ()&hYX^d_aZ^J5|vnYU^d>=Ug8bt3eb4tk?Vc5*Qq$wX00URRM!Kf+hfdNZ^1zmH7|BQ!<Po)J@9C3cR74b(Kg6B93H?Ifo3B~3MuxiaI?O)8l>rbzX35a(v*OIRFu zwpVTSCxvs-MuQl2QSwq_>}_|qkDZH)cPO$q{6L&}LU6RU&WYCeKRwKS2(d|kW3?0a zbXI`k#~5*M@6Q{S&@3c=i?FYWTh z1*>qUTWUFNdoofG^P#J_Tqn_DQ;n>|bT+A|aVvN4iECThPlYii?*JmlT+rwz2Xxn&7l5SqbbA4|Z>^f2%OK)}rv}2p72%R77!#7rrC6?ZL zoW?9nbq{dd9EN@42ER;9j^{At)?NbhA@}uF=L~+f-O6#aGb>5WTYB=(MK73hR@fIi z?fHIJAb99JQPR;sd}^B~W#WYI$l|J9cAalg)Rti6qdZgNp5RMK`Lb4X2 zih0DL(`av*zE|E=inOoh;Lzc$`e))}d<0+F8K?YSGXpAo=)}ugg|bIx8_|bAh~!gM z4WY7*7TaTl#%Hh9anjVsovb?UMYj~sn_lNJ@tJqN;`4fjLlQbwpUWY~jOz6p_!f3@V`HlPIwzmH%tgP56xP_${h z0gh>H!zi378j8LAmt@Z5`*r2+Zy56WN#j}taT|BI97q@9eoy#L&n=oNg{*HI3fNDD zsG7y=&o9uC3g3rp>y=9wX;G2+D&0gQZm0c7pYYAr+J!yC^J_YQOmNwWV zu1Q-5Cbndn{n|U4I;UrGfxyudNt_8qhYN3tv2lU>0xWC7kxC2CrI>Pf^(A*c&=4Lu z8;eMsBe9-e(@sjyJg>?{&*Y-Gp$G9s+){;`Zi6I{nHNg1wv~pLcI^D>w#cy%aS2#h zqPjw&DF=V#qolZi%82&juZDR>1-ThCY;N1&FHcA2qpRHO!JG?n9YN`QSywU;q0-|< zNlAn#>Ut%h?S7?9Tl9)f!nk}!I1%s6adLIUtqgGf7!YF+Q9=ra0uiFg$SVB5t=)ag z9ll7mam7Jzw0QMqkc}0$_2Y$0?OZvn={Lx}KVGCZl6PlXW^OL7?!fZ#lRME->0&Zj zxln0A6es03)R-gl-Bv#NgdkzMmVGxa9aqx15DBiE5Evb{adbDU>(KkqiB;0Vo=mJ9 zrej;Z%~m$&mnQ!Zn}4klox)V9QXICPiKa3)I&7|`crIaL#@veSqr9DJlNvw)r1}v` zmTM~cM+__jIK=xn7agNdVcK_!b`y=InM9$S8-;OTUCyn(`=qOGX zvfb}7@5sVsUT0^Hqs6Wg3~d4&(CUlgXK6Nq)^d7|h!9_0LQn0r}wy~-sgIE_y z*D#;q3-P`Xrc7TEld_}k*RDWZgsP4mTZNm0hMSS57+1ugi>4UO%PtEY(Svza-PEu? zJ5?hCx8eQkqF7Rx2|TA6v=_6C(@w}gNB50VC$M7C7q2G@2CO*cd3D&D zUpsnQ+c6EJjVi`n;;gu@^97L?YBt(frl-}O#-mJpH^~HEL|s{J19D{Yb?5Ni$H5;m z54)OC1v|PTHqs{|55yCnz{OhVq)G}`Ks4qHciJzrIQV6`4$o)b-QUq^52@Z(06DR2 zd6tF&EW$7lpE7x1T{c}6zPDNTpKOgcSrrrOMv}NK`jf;q)mnB1JVshKDu33_Gj|=W zRybQt*;bf|uY3fKZ6!H-IhEw|RN7n>jUMeVorwAh(3{9qKv;ND7&ir{yXlNEH)mHY z1N_$9%l-f~nq-U&E7)$dTP>MhX3f5)n_qSkW zKPqx{gMsZSEs-s#nB_kjZ>)KB252+kz3ZVp5l+SyXgBY}L+!egEmOX%)_C)96PC7x z*&xLIqQ~b)P3y$uPm}2|1K`QMa2MV0@oSmthW5ZPh)!HVfzqYgO+XgcLDM{6#cB8l$RL)+j&87E1b~RsV05my=DeW4@Uk) z-y>`BGj@XC($k8WuDep&wLs%Dnzcq)z8=`dWpSWTo-AU6FaLw=q&bXO@s8z6v_K41kqB7LXK`BQLGLZOWXz|MYYHdd|dJ;&Qz0k&! zMjnGIGfNv4vjJ92W{ZfztwTvu!X@qkseL0a8R0$kv~mdT6rBs9I$r@eZ$s}L38w8D z!l(L$O@;jK+A78O){Sevq5-;gP)9_Dnt~crJ-Nw5D^y8#lDj2{PsQRqR8Oes+KpGI z^d|oLGY=;*kxJEGMag~iEhy82wr#;p?uhx^^MxYP&Ck-=9B3V(Rhar=Rip4-n)U*`mXAj z3r6&*;_G+~cVI=X-=37Cl&EM5RsRBc8bT-Erd8=_IFQnRA1y06LX5WQ0ju$|X(6gl z%-(J$kV67@p-~E{UQzBUzhnXRN|9W71;#QV($|jr%m5jUB9nNMZ%1XPyEn~8HTS5z z3A1C7f86F*ZE9lk79?4u)i!JYX8Sy2PIKvvai(QAa)R`8@*9*j-tH*l1_mlL2mCb| zGh0|pm?_xG=i)?UH)T(uOWs?(H^MF9h1dk4m(PdZX>c_VC~U-$ZI5m+gT(UveLH+x zC$F|jjm=MHG+LG}Z{<{uZ*DWpNX?A!5q8zT?3@O-?SdB!VlJWdw* zlp1tnTihaxo^FBVE=IR=dRndRo1=$=x5aKHN#6XG$maQ6e2nlpX+cbU3Z^Mm6x0*E z^l(Zx<*7L)*T#MV9()`VIHZ$rWQ;I?H6@m!qLB*{PlF-ZAx}gl_{Aj?M?Q)rq;E0m4 z7AsN#SG0}hVCD?G<(G8jw;pW#y;SJsUDj*#oHq^x4i9xhoglTP;p(s=-jQhUb1Pt8 z14*?^2vtb_p#T6*r{L&iifcM7nrm3m8nLjh2wr0;T`?o)gz(leRH(v;*L*@FetDM)`s-;Bt?H`On<+pkygQqHb|fk+ zq8g@-fPXIb1l1+{QU$53+!uEQ(s*E&6JK3TQEIkTP~p)qSkVfvWACU%Q7PS{f|h^= z<y8KQ2^QA0+4N7>R(Sp@mo%YF4BVjPC_`$977v9}+sjv*(v!SLy z*x}CpbNJTJ3DU!HGMs8__hvo+64H`WxQOp{T> zZTPBgY4i|dA~L3?yXyflFVb!a;)RUUnoc}JZy|W?S)z<*J~1vA%ZG}3=QkglLFN*+ z&_rqMT>R7}q*xqQlo)0%w}7bF>MEE5ogbapP(w0eLA4E1H7wqQzqvxe~bvY|pE6Z{axte5&-% zYLKj{hbeu7+&HzV@&BRpCz49c%{4)ou%x8sa%nviOJ&Z7{@lqYxG#>$_v(Fg;E3hV zPkN?5H?ya6&K-m+{2$vx-z#EIdni$liaGQTnVazdv7vh5(Q-m=4&s2fGgaT)9|^ye zLmpOspCVsXn$$Xw#LVB>t~mAVi`l(r$?EL;^@!E5Y3dU%zt$iXsFc6(WsM>ixTX}; zle}~#R1#fe)hcpd=1(*yE9cc!w{A+IH@wdIFc3~@6@~E zin`aqi#0sq?3+E}i8*0;@JO1)_f*Rnr1tfqBTO<72}jJ<28)`uqE6@6lAx|rZ086^jw|p!+nJ{lmHMZr8_rHtlI$GZ=I6`yAr%3)vASRM|yuef$A`UI0D?flZ=u`PkFjfyq( zmb|+Bw0qguDC#bLIo=M#`2R^tzRN9&b3Ej{Z2FJA|MPU%uKK5tqF&=v@NcPQ=-VX1 z(^~92@LvIiE@6+- zp44L2!v8CIaSQrxXb;FF{*Ny9ADKSecR|OP*$DsNVK1S+8{ELS#mD}2o3Q@Yw+#Op z;QK#u4JvR~_Eal1WXehGW}8Y#;yvw>fvxF1@csusr9yWn-o!Mo8$hq%>x4Y>{vl(S z;mh~t_ET>G#}mDn2J(5Z{$8|*(sASdVw>)DPTkx2I$Avv*M^^}>FW2q)Yfp(mG4&9 zS;)Ageo1&OQ3J_rG2V$&o^0*yQ>(VzW#4R(J4$B~>-!$^J?)jQwlrdQE`;V>a@`R2 z^2HH=^q)uK1pSttaN@*bf3c$Y+*v(CeuQ^Duv(|$2Rq%rG*0Z{%PGOsi%jHT^M5OM zm6N?1VJ7q8iw9?pZi}WK@{0;k#J4OuD=F?5{xU^9u8!VFT>Y;A;mH|^>K)ouSIFtG z{f29J5wMa=Z#pY~<}Xh`$M4|%k3LnGIA>$njTWq)Xt$c+V6@PEAo?(w;iChJzsmvF z<~s|uOYc5L%KOB}Bjj~wLCsB^_5S%4L7tdjx;nCjwIqIQC+rQ%u;X)TX~dA2#zupIGKG0bYf=_4!U55L~|n6?^_+eJa;Ql?Z=Ks%J)c9n=oG& zUu6#Z1Kwh6ZVbk+K8bYw2>O06cQpeu!c!8@Zpz!ACi@M@+l};B*iC0gXHI|EjqdxN zeRD=Scc@p|`$BJ({e%{i$ueGgnI_^%JihooY;fW9-(k87uUep*9e0+m=jx>y~4; z8YuUHGk6P~ioc7FajeH9gN9wOzzS_?rfatQZnW;hFkHwA4)=-YEt7WLSTjUKWr;mS z)>SxZ!cIn}Bm*~9gZkorhR#pjUaZ(k3GPhEFloExR#gDA%G$o#HbCTw>x^OT|5_V* zin5G`wo}N;cY>~kG7}G#7U}s`F8ZIy{hr*2R~7Pw!fJU)jhAUF5IFQkjSf}3pV7ZL zqVE=nu7Kay8036MWiNDUo_Q<;7mfM~ipEQco>SEy288q}EY3x`(MwnI%zUZ8Z((Q0 z27ChZ%YAbBzE*}@OZeeC%Cqh!#c(`BetwvBlY{YwR1NPM^r_FfesD2KpV=$x;J1nH zRPSa}OA4M{5+i?XS%s_Wpj|Ed5>Qv0;9WP9DjJvhF=Ve;&lxq*?rREyf1lA6!X}=pin63%@S4;{y!i7fMv9y}vIvn#YJuf|$E!qqq+MtN8JY!aYvf5q)-IRaku@ z^WjDcjaQ#=b%ir~P$wwb;C#-z%^nly)&;ab-*v0SitwrKze?hoxeSyF1&l&0QC{Qf!sC%EszH9iq7>CXUTq^%fMO0Aw<~8fJS(P>VLLpv7!e$ihv>RZ z!0q5e=$JG@Y*t>2oGz7tfgqKZP+%WsQC>rm6<f)eJq;Hs&AaC%cg!!x=?SMia4Bave+|T6-gD)u z94UzBpwq^kJV`U9f6W~+S-?1UUmf?x-yO`aewie?1-ysw-#c0O;I2e2R z#q%)f*K-#kX*?(Kp_^NAqBF zSR~8V=j88AOw~+w8aOhZI!c4HsV&Ye+9zUn=WUP?;*YLh9s}fX(F>A_sGU@k?H9?D z--Z0h9f$nH^ZC~S6j8x(KH}YMvAin8DZEkl3s}D0EPva6Rnx%KPs@-lwR@-6rK=bV}Q7gXx3#!a)kwAgEzur=Hn<}PcBt5W>ROi)i1LF$d= zdF_g|3pgYwo6i$L!071hb&&C0>@9-AVm<}3 z>dPxa_e&~l zlp+%^tSO?qJ$i+-Hyopc_mF8tbvLiU-*`CTsq*6_Rrfn>TjB0w{RiE#sk}PzC)iZ` z9}J|o4A4fSbGB~nBiA-}d}iyWA(=m$iX=50Hf9z4$C4=aj|vTASw*Gt&YT&gEYr6y z$w@0I9vQGqp_jKD)s$w!T17`{smM|{Bj#9T=8W|%b?Ov8zwN#Z$Pl)JjFr`-oD7(h zq-B2T)|ylE2vHPv?_8(CJAACMdcXeFQqnO_VLkxTAEET#*H&bq-;ACxZZvmt%PZbP zUU-ibyUX?wB(~7RgfQ&=W!ot6+MRRM{uTMr{SL9rUA6OSO3v3tgGM)*ySO1%K*Kmw z(2o7rkMd~mwJ`enD)B3b3d?$W{)1NuNuu}OFF1MdVfqt0o69fI5B()FrJ5!uUc4H1 z60Sk#bRkdG%_xaS$m5!z`QFBR!7+9B3wJZmW0&f-X0JV3UO{r409*&w+`b`3aU=BL z#6dux*cDy9=fqMxB2dlhs)vc_;*;o4TpSIp_DW1H$-G^nJn>cqy^+j{wJI;Qz_p#+-B{k3es=9sLmn%a| zO-_;3Q{pW<0`CXjt>FMoKYx0S=P572Oet*26`rfox%~8K%CPMcojHlui>C5+Vdc|RrFbsS$%I<|O>Kr{{)LqM* zZ6e4p>sI4$jr1HOF;cv-LA8yTDQD*a^(E_y5}Q%r5r$Ox1qE&Gc<()0#q@MY1Aw|E z=Xd=lfvPAqk7)6Maa21-Vng2Bj}H>@Xmi@X0?~e9mWXH(`xqdW=~jxHYk@xC^)+O( zqMud{26mPEyks7jM464|m9&F{2X7{rYy5+>`;pu4N@zRy>gT;Ur$sf!|M{mrw|^13 zwL^9~^tWfde7;Fy*I=ji7|>TP6}_y6f-_iWx$GC}aOQmT*e8V`mI05&TE2#9F!3il(?~WDrf1#ZN zVhb+mq|@A<&}7!X_-~!_8<}0M=X;UNFNH}kFBr_(u4 z{de3<;%{g=RePB7FGh@v`2JOg9jpx}KRfoeV`#CB5C1JnJl^#Ly+V2d*f;Cj7NP<- z`K_$q4ueDgd!Qcao-1R{&G~wdYHSx%RE{(2{+<{(MMk!QBNIa3fUR7Fg0-_T`-V2i z`_!M4Co&Er8%;M&`<8t|YbWA^kGS?)PB&Ufs!%&6E76W#BESDo+1oB7PKj+W9Tno)ymDC-tVFm~niR}L>>_Nc{&qLj^LF3;E ze&?dSZ5@4k8b8|)!zCNdKN$Xst4V};!H^lK`exIW)^5TB9$mQ*C>j9_$gVlvu?`7cS|4I3FNWlsfeLu;Qp{)9oSR}sRWc$Pp*CtFZO)L=(&r5 zpCGA`6Ljo}mDqJdj=LM>IuVi=WD^JNH((V@`pKxO0Kk&UW+7TgkI9IQYLxEaDf|tL8J;qRa}bovFMMf1Z$f^ z?tDOUb7j(A0zfZicMIa-;)h&E;pT8ZbKa&FA}>^7meC3{c?wIXxo9@ z#Ne+=y$Giu^ZI?EL*<|VEZinj(fqs?9Gff=l*4odmAT;a(oJMMjxs4l%`K{BUS;6#in#rbHGAEoO|bsfA4eF)5GXo>#i@y}?9L~k z@YAs+aeg9L3!E7N95NxYNo)zaiJ4M-4S3{A7!?LUDRyO?ioc&D{shXQC77}z^{3>o z9=EVr6^6nh=Y+IaH({g_C>7D-36i(~N&n!oo=O&E32Vm_lHZ06iWU~YviCl38J|vV zCq;rYIp>)Y*-np}R@EPsK96fw7cNtR;xC3Q8e*~fTA@Sgfc_Q-_Bx~tptznJS-blplM^paTi34{SXAwqphhj8LDky2{1o%jI#YV;p?*3g_&cTJK<6%ABiNzbWVoP z3D*WQ0z%A=jdD3tBUastE^2<-6Yyz{FzL}(Hm$9*&dG9d zmI#mNjVZ(=BllCAFV-Q6%!~hvICa^-K!Ao9yFWOuKAY2T7-&<1+^8~hliEr#p&uo3 zyQJWYZ~@h%cDa0&AAl#YcIqPK>uiQ=na*W+Rxg_lja60o6CDb`w_rd1qoFu5j1QxI z4DCznG zy_mKIhz$jPW2V;}8al~JyOH3cQ%j9qX2ljpd}$=g>|jTg(m-U|;Rr=RFxse^?giputh*u#-j#SIV zuivRo+o3KUEsU8(^i@b~egP12z2q7rK?T7ba8oC}bCHmc7O!jZaJQb&5PH=KUVB}k zk4Rp}X~KhXDTj9DFrCrTj+iQOuE?)Yr;I^lI?TzROCdVXYADhPgw@4yK$)vX7X*x=uMV8d2Dp0TpRpnuf#lXBkGEqoQn)SmR zJ&EzHDBz={;8;gQe;cFl3_!ZTj5%*#4{vcE9BEule0f>BU#DGfg z&^3IHd2Ah{+IH65>dlDomS=fjmLkN1?-8Yddhz@McdWV?2BCD6z3AAGiYp+O5LjIL zO{6?3qTl=6eu*6`9*EEjxTG)_!Q~Ti*`}je>XF04EaQ)a{}^>@I9K>Uo4Tv9Lqba& zfa3B3fB#g;em73lKr4^-d9&Ps zqWY*W*vyA@Q77q6&(}EQPERkga0m`smH19jYd)(QP< ztn@DJC`H^M)jepF1dMo$ORpIn9Q)M1>`bykieb0$<4y9HH)!YaX#8J1|61e2rmHy- zu9=W0czglfkSKQ1pG{X9)pEa)OHYesygkvfj`(-hF3*~BIvWv-Tk&<wgYXEm|NdSOyhF9r#B*Hmx-nTm8pknbw|FtPL1*w=qiZ7DaM=gt$kXK(waXj>dl9MspxZr&s_x8kFmoyV#YKBc; zxNN0whi_0cyo}fc&kblH6D_6_B&%c^T-$ZQ<|Un6Upr<<1$YW%H2M*qcq0&=#1mHWI9y4(dXOU%NgPx4enp-OApjK(= zbrX@Zk`G6?RRjCVkA!7GBSw`hZ1YwIK+~KVJjDi%sdl0}y;Ga_D*pi*GQYfEz!g!% z4P=Csyr-GTA0K1Pk5seQ22rJ>m5X&YwyjZ^<|Y3nSyjImABW0b&w-pw^q_LBxbKiK zCQZVRlzuEy<9vX$fM+cf(fA{HXr3f#%zS@Th7ju83{=R6HBr6Fljs?FbVud+6!Xh- z2hqQ9{CKR=Mo?X!!lqe4tMdfIyi7n=n!K%|vLa^e!^6!c8zc|)2ZVMvR>Zcl;re_i zN3AZw+I_MLq4`5gjOy4NPIgbNYA7|ekjMGee&o*fBcjECuDyj_3>-Kqq=8 z=9oOp(iPtyR9&)^wAK_>Myc+$z^~l|cZfoX5DX~2NxqHFegopo(nwc+*nDak@K$a|b28-(s$ z(wMa)on~SqHjc2o|Ekco6qmvnzHjO=GOqkpd1M#4(mXdvG!`>r3P!6HFDm@QoJZjg zExpQXBW)+tt%$~D={v8kZV<9_=CCP!dQGCS1Y^x10+;!srSjbgTGnYUzPOdh3=(3; zQ|LC2?5S;q`g%y-7ttVgvg6#Ip4lQe1}rO4EKB@65~C$o(Aqqj$S<0~fbEm3pLvA}Yx}}u4l-kZh^S$?kHWE?gcI3B5wY<&<(~0ce>n^P_Q(iT` z)PT?gQ;A=rYjd5>#V$9Krn=_);}T^j-&*?v&W%Os66Du(3{ovSq3lNZ>?IsA7xL_B z-L^lrEnx*1Jd(aPxU$DMQ3LVg8R=WdC0K^uNTV5|Y2(rgqmS)vYd4>@MhmV0B2UT7 zm18~HNr*0n;KaA|aYZ#vcqesqKGTHPE-fbfR#0lp#qxp_mbMN|=#5qRXtTDtVvNsV zz$1e}aP+vTW$gkR!>2=n;$TziUwGE+w3eA25*?*nDsV>TS7|QdEEL?!(*6ijRR)(E zS;v9(0f>j)aJ8k-ex@j|4SYxkS|+YwzYq+O14_n)jYv;Ah10XnuSV?+tqIMPaDyNW z{mB)tXP=Z4sSBpX{1mV3tO8@~1#y%lRG*nb5l+KbNj;ShI=VR)Oc9#tT_?2a*qLk5T4rR4L zK;A|;5QMDMPjdSD?57@f5j)ko7GY`mnT;#jtD$sL#21mLTjJ1oxfU8^SzQP~R-&R5 zR8?s+dF##kx9^W4Jx_dHyk3lgRUtp!n;9CHlA;|nBdkHf z;QWo;qd3AIE^B2!lZ+i1p&fV~G%}t1(4{(8;2VlPH}8%8s9JPnsbl{J4kH6b^VC5c z9m&xKiB}<3r&3dN&fT?Ei+~FZDsG8nh8H)q&^=jL85`VE^QFgqXi`}i)^E7 zqF0$p#&a*B(N8@Q2hUXJNBLYZcw8%r#VVnZdw=BNAAS_uF!n3(nrD*e2o2uD#>If8U2At(smKa{FQ z`Q501371og)>@^L=~^WxGP#$1c>cnjtCiov)bJ@qmq1)h9C$_@h;`M)$IiKO04)iLSIL$6(3jQn7|8IdaCgF^I$b~lgWJS`VTtW1uK^4=(XTs>w41JQ>V z)88)B0hRTCx;X|U4~ysW*<1?EDcSr;!W|B8$`71I?^ZOxsb;%7ueoI;ziEl%qrzfT zj0fX|c!4zKX6P9{8;Wnu+!J&El}E-)5x}^eqdJ_3`t4Kh!2wJ=tS2BEg7~&c0nsvZ zBcFN|Xr>QwxIbL&7vNhhXOY20N%ce(-Famu@8nAN?m_;uBbk>pQ@rB|{C(ps(%Ub# zI!$)71s}{COE`Dj=jtT+00Xcer2Sh!Lt_QDndujhPk(}msK~%TB)4WOaIv$>_MYrr zTj-Cm)gVTY1+r@L3Uj;WoW`_qcfPs$-Jhrp280xTbbKEln+R8*5VE^z`Phq#cEGdy84-n+Zdu^|1y|mIM1lgMVU%qRZ{O z5X|PB$)Un&-2M_0e3O8XQmx_?d2a1`fPD{ z^g@W=v@&IaZU@QI?N-tmggsp&RzigYB?*J!@Wd}-eJ(38Y8UHLvj|g*K!9w;VrZm1EY?3EB;1}Z==;N-1bD`n|KgwIv~S4Cmjkq6_x=_lhq$;VcCc2Rt_GE!Ut|J) zJG*V2AZ1m3PP&58+84C@tTkH~OY=2@Woqx0bh4EOo?|L%sx}50zt)OAl%q z_r{;(w#VW5x4TEj?_6=g{r72%X~~!@O)$fH?*AE?#h7c(3r*b(H;6X0ug(6j`{w2B ztH@1)+ByGcYtz zrMRYP`vW_HXYOcW?Y|o+blcvunt!Z)FrVILYJ4ByGx!JCra;_y>mZ)?s|V<>R7*MN zn)Y-CH4O;SSz@6bmixBkZsS7&k3FxdTi$KCFJC92*6SbjV6xI9z_UD8Btt&9r<(d* zTBxo0?o+$_JG^uwV2qwOwJ{o;sT9YFhXK10;4Uq;nIT>gOWWvazM!|bzxfcPKOl8J zMnp9A$>1Xp60<}8fZ8SanwJKa=KbVHI%*aD3IkV0ch5=hiOuA2QSAtdt+x(z%t+4; z90=iI@to?2h!C1m^JOsU_aiXm9FM8O5Z8tMm9zW@QJUzGKRvQn*sk|x8|uBzoYaWL zM`ZIjm7I^sVcFQBIY_K(HUHh{z(PyH62aKALM<&8a=QKbR)$TJfcHbS7p5btmx z^p4@rdi(FACnJE7N0_wWZK;}H$uoxV-^aaEb$A2cQ79d+yXqRAC;z`Lw!BU#=;3lk zQ^=euIMfWouZ(nl&r$I}N7L6}FiAde4%>v*;yWOiyb`huxPYzEj)GN-(4o9ayZ;ovO6D;s-T^XN_I}9J+ z6Q=DBe^2Q%9b(4_=1OhHYh2^Wmw^*}S5Ytddug<#1D=cPl6)5HPzU%SU+x@GGJITk zyk9SZX+=RJIM_jbUYwxZ|M3gvi$H`_*+;~}3pk(_4GM_%fP%l!%h!^M3)WwBZePQ~9e=92xjrIgfItdka6okUjd`!dMF{JJX|Rh@sq{@H(<$RjuOm5_>%6kj|xR=m(s z?419Vo#e(Nil_UB{!5YHHPoQ0@R8^ z$fj`jVD;(|{dgI}!Vv17uqAGxkpidHOWg238&Ksxi(h)cBaeuJW*H^0;ZK8OoJH$%^jS`5)GaX zDOV1?`wU0$;GB*U{yT8+&;9{aT40BGY@FZHNq${x9hvR-L9MDt`M~k=MhA>mFxT07 z5iOD5=sk^v>&xT3)R|n`L<(H~8R^&M3%vE_@y)giZZ?M{-`k{#eyBc}oqdC>nwxvm zoFy)k){W*;* zudl6*qra>%__#Tp=zxHCQn%?N9nA|*c2vu{kNQuDqV^qw+*gWd&#O6epkc%# z{Rye>rd#CY2D((m{Jbk1&1%=I`zsrqv1i1U%V4KQZwOTndw~YSx1o$sX_+Nl!h-Z2 zXaeZlkQ%x2dp>)rTKAn+MtyK0-W}3YWeAwv7y%D_w0q*V`+Ce+{gM> zcKuGX-sRbEACron_sUV2`?V1IDGijapD(+~fN#0zpqhJLK<`Ms9~nIHelEJMDfwv6 zUZ@^N5`4EdP~-$WnVDb0KI=a(c!`kUslX0u$+yA)-^#|ePwL%z@~GwYoJ|81e!4T# z{HIc@QjPZ|X#bS?j#^B1tpqo5Sh@Y83toJr7Zu(Uq#6_s$1h%G)=#Ht z^l5`_yWgLk!`|j?STOy8rr_5HS^PU=^XW5(9XOA#XH)rt-tpa#!f5IqYa7m^(1|#D ziU57?Yzx<`t5*Z?vR3f%$L)wb-If8*d`uJp@LFbbY3 zoN7rKHUs^tHbn7mGwrPNGx)v5Aa9kuVRU|%gze2n|K%yk&|N&J{$4(=;|Y7B*F&e* zWoUKVoJVC1F4x1_*VYqlj{K&h~-<;R91F}_00jzBi{*LQYkK#ul^DE zx9_FnN#_E%PgBAjB3RO|?cjVckOMKgVe}u!B7@~$Q`2)N%wRMZ2Nyg8Gud4wLNZS) z2X?_9WJrfPyq_$C7-~$QLh+;tQs|Y%`}^fD8mQ__p05Z;Vmdb;QW+6xLc7 zr`Wnn*0f|Y!-$Ri>>u|ub8KWvc6x%(tTjX$=0Y$i#z;Ky{#IXfi>${Fe6ZyDrYw!| z2#z1A|150U5#KOMdEkx9tV;WXw1TrcHAI0=&&g>{XTZHP)!LeRc8}t^w$N@Wv1SAu z!SQnX*iXwvIpoR%6P}KJJ!9xnqOAAeeDR{aApEgUIO{vOKm?xK;1$iOzT<8u%)d>a zQ~sle~D9B`Z}rm&P_w( zc{rvM6Yz*`V zYlDRBCGo%D(O)z0yHmZ`LS6pp|7v*8`FEAV zb^(XFA6it@eJ4nlf?Egdt|uy@yR!~M^j#`;^a(qJ#KNxHL=Tbb!*tU<{xa>+mRaUI zq3l%1`_<6`E&G}SpXjCElSKQsw(yvP3|Q4`kq)I(qtsh(c2f@(AzQM3SG(7+kIvt& z9sk;Ae5%BWn@XRiFCwuB(&2#m2vYS{dBl<}xASkHs#l@7oNu`Nc;V=st@t9Hk(0O4 ziVSr8XQ;h3s+09aT2AD9tisjTNf-V{qx0Uf_wYcJavZB28gRXgBz#VtJ3iKPc~W>xSKdKT$eM34|}A&{oCBmlXO4(dQQ91QE4CrzvGy=!|PjFZTnaO{P{)k>^gIJ z!(z}%hX-aJnUG-uPm3Yqy9~WN9-7doJjGZ0M;sp)%4{z3-g%x>@Nprssb zCHB?=yQj&ul+-cY)~raHm}LQIG{^Z1)snEV zVWf8~mh6J-A%5ue-J3=(WhA+^!nzxne5K2X z;UvG-#D(t`jl3q44rkK^LHNX)Jmi7_Hl<8KYT0b4D7iIM>7;o%A-B(3U{sBGOrJ`e z=Pj!r^-oU$vn?hPxLkhKWRM{no1GSz`W3DZEd{?$6kIV(T)jGR+a1g6Je$J~T6II| zhw(3Mav^mip8!bH16Tn|KE1y&03avcvFK$XR8@*N=H+|_@(tdAS1n8XmO7vhDRRod zbs6Vu%ipmd2$Ku=6k=B1KyQ*m;1eZWdSOLVzJ(_<5+G_-)8cC3o7EXk&iFacA{0$k z(c-3>U|hHs?gvr8FsY}Cnl1r6lu<(X$&u^8V{B`YOuHtC{Z)lH^eMZF8g;0zhaent zIMH#qoTtSsfg_9WpFlWQk%RFTASG2c${vO1&}?=AUhb6YgZN*@Ec8K4Fmr(PKX(Q_ zDuH!-Q8UFyM#Haz9b5?RFx(Ry*K-a7Ro+M-#bvp0AcWb#*1Kl1AcdFmRtkC-vCDDi zB&ObNWD<98rX04C{g+4e>r80w32xyIEl^xelNhN9)_|d|z|0Xp8)_wID!ksIqvyR} z=e(Z%PT~0*S1B`@c-`5Ea^CrBG=cd$plb_2aKdYrC}<|7S#19wUXZHtn~W8K|76}- z{n!R>Y#m+*+=aj5!~+26K9zrPC;S&xorwt*x?SGBhw?eEMwA>06_m}!DNLl6mP5fp z>ooPPK3BlfC56dRm9VWV)lV)gg|_m!;Y?ch1wukv+)?N6+PU!%5{9uV*iV?;+$K0h zX(z>$Zmh6ZUzP-Xk@nrD`uw72QmSLy0@EWSTvYLM0dOiQ>5t1&aZ*e}neboO8T)h0 zF^2n&y;GfSNVgW4qC=K*8kvwje&Cy%Ur49zV0L?jK$q-E6wrU3Bdsg6o3Tpwt4}UI zIC50v1RNJAXriKOxJDb;n~cmCg3*qQ{F!;Muxac?un~4Jgy7NjK!nSb>NIU?SQZ^` zj09{A3DxK&Mf}8Z;nY%9EkS50=qd$<1z75qQHj2(Ga9Fsvm&xqwIxt<$zH?1QImol z6O;r)hDfO}LVX^S;g<5asbE{rmI%3N(Qsi=DO@l0;TmwnEkr?n8qL?p?GR(ZE;b%F zJoM+$z~LMlrf+}rcS}bkl>31AR_lqJ&SC zi0?P9;)k{F2aAk#eF+cZ{AcjSnkukd|4Wb3GjnQlH=!B*jX@`zga`A$nGZuopbq}h zteIAlR?`Gb(py?38#(!W_!~r_TIMW zuqRK}mg@`H;G;P6i-Th03yj8w=O3F@IZXIrOr*g-_)c_fQ+ePH*wt{_G)r32>S%cK zalyInYFG(2I8#I)Cm}Rnb72%d1}b%PY8JM&>4*n?u_)3paGoiUL4g~GWU-eUUBCV5h_p}_!P$F7%N1IN{0rj_R6h&FYC_1r z3%nAS%%o~s7^;3k6?|46{OvSZKhSCTM?^ANt~+$)-I%Az#mFtfHK${Wd~Vp2jU!z% zc9PN#Gp$~Rf7$MZd0C~H`jQ$3v$EowD>zq4Ve*iMAyc_>VP$?$1S)aftBkpEC#iF{ z@N(|V^=rPo@MsqBq9Yqwezgm98Y(=L2fqt2o2Sy!#iswDVjdbgp^5Q$EE%0JFbQt# z0TCf>c1jVn3~tHlq6oV<+vZBGRAqxZW8|z?ZFkkri`LQO5{tr!V6|lcvF9-0UoQaQ z#X1J86WG-VVp-lSF^Qxv<|rY?M`xx$!b> zM(%bNc}TIZF%`hnv`FcLu&_S)pgbDh+LUm=y6a2Ag6RI5-jq72_k9$a9%pq>W zuM`*+iwCJZi?~ZO6vv)y6nozr##SY)e8Y5rN?fL_H}ovkL4tOzCwXL+(Q+K7Z zjGML3k3VbWM_N+{HzWuU9PF|ILpB;Lz+lxE;&ileOKXlQ?CJ(~&MdAKj+RxD_vS?Y zq+>DB4E99eX=iYGB>+L;U=l6%)RC>2!LU_;r!v3xB6CgU%6yx!4v1%4sZab69dW{M zmZ@~3)BAO}SPAunFeOyi;v0h7N!rtbStUgn(@V8*4h~Lcmxg$`xL`osNfkd;KmhT% zIih!Pkzl=X&rsBeZ*24^4?I9S0IDNl^f_a@(y8o8BCIev8I+9+^151@ps$3pL&MX}Q5=Ig8dL zh1fqT<6QN?r7`FCX4Z5HumAsdJb~H77SN@l` zRYJhf>cPU7(+#05>!>3{I0lqv*=1F#pnCM4TM^(`V%_ifVqK4c2pF}MIUlL5gPHL9 z=BKxfIRsD49L4I2W7Z_74d{BxoRH3TvO$NDl~y)( zBF6eGYNoSs+XUe`<7OxS4}1R~ zzu9a2V~>5j5B6H;8Icj05s{Hs+|T{IPS&P27qtBm>?W%z+>756*t$aZCg8WL5?ctP z20e4d>kp?zlAfe7V@Z=&+vxMPAN4h9AeTKT5mR)i|JhUx>LM&swu1EbJB|MsMTN;- zP2p#`{2&=gMYY^vxKtdomT19pj0AB|VzF0g&m;589!{_YmC_Df#1EZa()NVO%Hg3% zdkRf?FeNcI&~%#dZaaRP4@!br&JEjy40{n0(#OO;_iQYY3-?l9+%dxil3G*~r#NlH zD8kbasql(TCEa}{ii3Hft)7!JSA1^~G)$RE`ns)2=Y?@T1k+ld^Pe>hoFg^GasH?! z2P5c#jnG8d)au^>wuh%4URqdR+80?Rk*dt&3-+%&Whn3DW?aIK5|@zob{V-YR}6)n zbplb7@|3dr&~nVe>nnI611&~*KDGo`+2+8x#%{j{J1Xy}XPz6^NO^2}O@^w{lsexi zgmdp;Dib7EYFbP7^4VVh2-t)EIX15};8#Fatastk8ULk$^~C&A(8EAepvFx8do?cK(O(%y$ zz8E$BgA6{Qx``WPdeb~V6KgKsY@ChAT_bxRBLwDT&%r>F+e;e4SdRbjO5Zh6LPy~xc%;BO-tvlP*W3=j!rUO?&Q`DZSt*ELhP;&W?A0}F``3Fi7 zDero56$8`Kj5=blx)8;2!Px-eyA-3b*A&K3?2f5ua#D6fz##g3O|8XrdYR3o$2 zSk``L*l)Wrw#Rl%(y#*@KL_vA%3DX!2bJD|^tuIHYwfON@kI)$g&4)Eifs7CTglcI zOoN(gB4$fG6=ugXQa#x)7z__i_)X=oV8fd`+Gj`5;+PjJkX)6O$rX=zArBhm0iqV$ zBProW3e;}i)vx=?b@_synHE+C@QQXnQFJvbo1N%3&UBn6=R7LbrCfc%u#uRTqU5Ua zb3P)=X^CK%+R?pSt(JH}2kmoGlVf~kRW=DDvSI$-~XA% z=P!rO+}s$mlAIc@jne=9^ZAx{)vfMot z9AL{<;H6iQpuwXzUpIz!=zw9SpO0Kd;paFBFiM+06An;b= zoI}6Z)Lsfc4VOJm&?CymAh=^LJ2HupX$jxuvM;7f;1Haf{W z8o?U~beTxaeIMRqOuhvOlLW*4<-lH;{lw$!mB)ELLLH(b0#(l97B!0pYa1crLNH^q zvZTG5>Y<%I1CR;Fa~Rg$>dDz?yne;pj6@ZevuECBBC`CHE|km7$sYk7)@Ii%=h)(K z-+kUXhV0z?WhdTt&H}*>HJ&p@2=9<(UZ3RkTMqzQz0EJz+b;Lgy!7$Vx8--={PKa! zda(>Pr$*Y**$J9k^7D-lLK_Ec)IjZ(1HYPWA#Hg->|@n#_T%lAwvMZqQFu!VymM$l zc%1K>3fiPXie%5U%eKw>ptLCUsn!hPL=NzZ%zmZ=P=1rlEu(TdFU-b%c7xga7o z;Ch*YTMy8il{io@Jtr?Lo{Fe8V`zb5hZ^44sFB8#7=~?p0wdW+H)!p)SU!y7W;T?ryST)(vfV}1s&&Ah= z1F_Lw(IWwJ_B|y^JC2;IPrv8c(Qww;s(F0gXktj3$)uTlH4{VfX#vcbZ!`z$(gFnUkG%O{i zVQ(H#KTck8`@D2i|XOYXIg%A>pyy*l=BhkL^mM2I^Z6NGL)p^$MJy^3RQ18WG@+ z&am%IGtu}*-=jgQwW0$!D&Yqp+15#fSV;i-%{A8h571s}{{v_pO{hFc{}cSQZ~!>( z)*(>hxzvB0H!H#q8ao4YMfd9l6aQ1EBRDoT);yP7;vdNY6NvxWZgw`(uUHPppO8}V zF&csYkZ`5A%&zH;TlU)hA|_3gs?hXlPx$}jb&XYe&Y6T>|Y$Btx=!~yV`atAL9 z(xcqT*c;GB{hvhmohFPDz%~qkM#v#t$5QmXc!fico&sPoz~pB;y>rDDW~Ls620+8B zM2s+FE}EgxYdPr29B@&EU%!sUeQoJPpFg#{C%7k|a-N}wh{zxT|xN5U9B2oR$CmoLh~NqM5<3Y4c&-p zrd5yYsw-dsLY^CL$L|ck@eY=11IQk_jD5xxWYH?sQW5;yppH6DIwV)EQy2#AU1+33 zUY@3&c0W3poYBMF(R)11{41VezF;4l_q?>|0%_b`+r^@dMhF?MF~9;k(X93r(A?<^ z34i?F!UO%>XHK)fTr=paQ62u!F}1sS2a2vJWLSP(Ou8ZM4jsMI@&~+?Khd}NoO)kK zpqo5b#qS$Pay$NNOJ<~JP|v$0+uiF-?MFG@+-jN`L*T-{!c^GEsYSs}+v zV*1x<_#eoFu2pBCGYI$*1n3i9^3GjAJw#L+<;RP<8cSujv(!m*eBihzx&`_*=v`?XN$Mbsf2ua zr(1JEJ@tozz;N01)Gy<2h(R%&hse8u9K>>d=P)~kb;;^glT(Z9DY=%P1SFni`d5MF z9a$?)Y2K51{aa)J?fPPjQrkTVXV81FW&)}w8}2KzTPMd%Q*xLG?-K#yDO@Vx*+Gb) zr}|**lQ#I}%Iy{`{4;##NEfuYv=FR=SO06%@C&yWyKdKQhC(cQsD>R?2fZSbI~s6) z%wIwA_9(8wd{qy6j z82nwLe^u1>x@=zV)j;RdXXqR1DgE+VSl%_ns_jl#>(~BSxHGw-%oU{Lw%`h@>|z8w zM_<_4WrzcN8Wy~D>IlVj^ret*|AOh$E*E9ko5Ws6f^YFJpKni@UKkKiNBKtsLdvLb z*UlaspELsG^bzH`fAGYtG;lBT?2WC@1~(>da-3Qt65g76MH9a)j)%52WXrF*0`$m$ z$#>Gg;22eA#I-t;8eEd?`)W9>4pAdw0hEj>n%{B7^Our&O<7I`> zNlSA5p^gzDHHoXnq|^IfVLEe&Q6aIx_64}%wyTca{2{OPlxG~9ZNzq0Ll8uNzgJ8c zYOgv2)s3je*TcHjxT7MFP=w}@{hVJ6yIM@9eBm?gJ|5Bm1?7}+(ysH$b!s~RetSe# zZ2N}6CF%UU;#sqY8=ZlNvIV@QbV=-#_Zgd?OSH-1=esAk^Ty;WV5`6|RiwJz7i35e z+}A5XcK?uqF!Bl;)NRwhr@e-EmexZFsj2;EoR~OrefaqOUP?;~R|?pN6R=cf|2(%o z>Lw7uIV>($J?RV-%Vm2<5kd=MiW&RazYz00x&5R&RD-Bog%WpNn_lu_*|Qv79o|Ck z@W^=SacwX$IW0g)Mrnaet==lHRFAe%$Ywgdr_0&Dsv44Az=F;*GL3U|MBsB_+c&*T zWiD`9aLvwtwAB2CR^bKJV0}#aq0RDh#eKTPm9^pV~@bAp)9HOd2~%KI&eLQ z3ss^cFpP7>12s2yy>Le(Iy(7WPYbd1SwHZ9bNjB>ExTFvE$9}L!v$QAyL8~;TI9KB zk=B9g`wZemW!bN);;i7~AFW)bBtB_LzuKC052(~$VPvKIVM4cF(7Sz_VbMa=$QLad z(Sm!Em~eWDrtwt=O8U15N}zGwfuF42;NBGz=-NLoxP1FZk$Qw$FRsv0YhMcSG*9)* zO9^zL7+Q|`ZgL&9Lk;7^^hDqDk)gBJ!#3j)YSLjXYv!J2?uA8m2pJ*nT&4zsj8afk zNQV6h&RViLcM6r9@I2sj9=&!V+LqeBaX;z8fW~+SbYzbTyf<6b*b|~gZTYANNsUbH zYC>-uoJ*Z6^$Y<~Zb0Q^@#_iE`EZL#Ex$r^b51c>IrH~CK0PPp8;jf_%#cyfM3TWt zscD5$bV2nf57S&nh&k#Hji7T6cN8JS+VK=?V*PH7`#a*-?C%j!E$lp==Ugp+X zuo@+SGCuB~=ZKc*17Sk4?rczYN=@|m7--3KUJjvmz8*H6vlc-&t)7WgqX^R9^?dMu z2-PT`T9&f6l^Izd90^q(weeV5nR;rrB5ZHXC5meXc}S@2yUxj}<=%sk3SALB>s|7W zH(&h3?#xxfk%Mzgczd^CwOdOmqpzmDq=WjrO-qtE+%6quyW#d$P4Rl~*Hyi`@1~#I zE#=Fq-s`-BYmOoD1Rzm<8=?ES;F(Q$6zO|I7bW3Yq}D9v6|o=ben!}@m~~30ydO0R zgN;+q@I682XKRM$S-)M=$(|D8^2_9hSj@$N+GTsLZH~*2k@Wn)n>C#F9qjs6`?Ofb zSW8N1G0g*O;UKK5lXt2I;Q4(bTVUQ+QgT`&;! zNBcb;#@> zD2Hqf|7aH!z3C1&os{x@U5^{x$c^t#&eg{c)hAq_r}wfMky|&2<2Lalcd43HGFraj z0si@}h=}~1`mbN+WM5sMwB63p5^-d6!owb>5IVP(y1@kAd75KqbZFz+e%dRGzdbK7 zjw|sBd|za}04ukefjc2W>jAj9lt((j5{lh2Llfx`_}~_aodfALjB8Vzqe+;&bb4xG$2B~7fSg0Qm)D_ud{<)B@P(SH{Sy+ zy4a}o-`+N?L9X_Ih+FD`eM(t}~;BiUGG!V>RwUu@&vsvIiqY--uM@T(B?xtu_&HH_6tOu0J}4--m(( z#Et2K^?1T<$!qYY&iSzej_*&N;yy)0NW~A&_o_7j=>)?7->g}-OJscm$nK}d311>if{5hsSaA(uP&|i)uv?*3X=oA-tEYutg)*C*f5KEhY zwt^k=X?FHs=J62N-lG`ff^c;5+BvdNgoRI2oo*bp4+_zAckI7&c}yznN_V*AIj6Wr z;njE`&ud>wZTUKYh+1uJE3Wux7agn>NLObjwt><7YU+Qo8u4mRvt|j=_kHY{c`!(0 z0%QQOg5EY~&!@aRh}nrCLr*Lq&mB3Q;+6wRxmYRqsa#`G#PyP9h8LnDb-o%JVw=>D z4{CYLsM9b+H6ux`ClVG&X7K5FXJ@{4_v|&fmumC@O@!BmoW@3KDEFcWVb0KdigsBU zvHlaD%r=iE3yRd*!A8sLYsUv#s}0`1-FhhhTVm={_64^vZ)qvnp@O-IqB%}R?yvlV zca$yyw|)C|y_JwVQuT=P>&crC1dZC!jVW)rj~-~*0-%DC;a4k^*YGoXU)N?%m&)~o zDUJPRfEu2(A_DD5@L-NlgbYupQc56#mi|T5R1Ztl$~{V?GWmzjIh?Q4pnJc_?5eMw zf;}=CUp;;_RN7lgP2Z5((_Y8D?z`pL4|Iw*V`>;zYhN(OxcA}^UPy=QX(!P9Srco% z;UT5kI^K0CD71V7ZT(HTTi7EU=ahPRm!^^KA@1VVrz9$X_RuDmZP+8NL{XwcKE8(! z=im4LxY)o_C>~LQua$+36mEAZB>JlA1^Skc!b}*{Z@|n_1*aA+;R}q`c626Bjm|4O z5Gk)|+Beri3q`+RUewSJPDUDcFXp3uLQ@D_C5T#@-Pv7X!7TJexOWqbr(^cl1p z6g(xvrW_i%du3eJCvTx_PuQFD8Z4pY%z=^FK(GN#(KU|Y=*^|CNL}q=@rY90AC5Qp zhOSlqkWp;Dls25w`^8v|UcV5i&;(6<<%!aepuyMfIMDo9p3$BT_WDIUu_gA8(DLho zs2FN?fx4$^`hs+n=cc@hV&7ugkL|NQ%?b#^8TxG%)bb?WPf=+F-6j-h-<6A^M@61x z25_CS-nq~a)&qQxoF_OMkWwnkGkg&XvqaE#O|`uqdOZD!LT&Ewjl5?F4Zo*imS0bU zUfOE0SEmK*(hQ@$h&(?O$da7nj!3fl>?a4eA1h8D=!Nylh4l&_M&!iztW{sc($`OP zDbdtALU%sKan=c6Yv|P#CKNBbY7TT$jd<#`*&9ldhjyEQG8o{ER;Z6VJrZ+YX$XBN~4CQfi`YHK~~bs*k| zh{8Hy)8iA~Wg$umbk}sC*JoD3IdDMHy1zU%-V{Fb4>HHgKb~MGZR{8V!U%X^9ixty z9l?VWD%VJt2k#WxcH)dzBS)-#Gnm3>234-$F zUD3%|=kRkE|Mdj*{q~_}n`=n%NSCsz$I<$yy17JHXEe`S;@F!FC6>X#w0kU{i7f-V zG`U*0^!@pdyZlry&<=t=yy_QM4h6SH&+E4UJO)VD0itnXwwUbi{sK!FdGeq) z4>x?C6krI2tZ}@QQ6SHEcN5%)UXfosKA<1xDd2u@uRNfr6yC^jV_x?c6}tCppf@@^ zcpobdFi$a#ov6&UO#_c?w_OV-4|XjqXirwT(3{jlXgM16qrKHs(4udzT|L{Gh|eg) zA1i#@Y#{F~7koEozX&gT>g)Xxp4U`&(J=owZO=fEq?YHb;eXgF3Rpi^X<{q7g?Ee6g8SKHdQ7jo&!O zg)-!Ft*>+=vOl&IJlD%m!_z5U64Ls4UdcW^c7mOVnobo}`3k_QWXM_5h}N(}Q}s&WT+R(i&<#AWWEk|H`OeAf6hu z7!BM^xCqbxjMm~A&^Bv*!w(-NMtFumn8EboBfxT%{nMk~4Wi~L#n7u?OP93)`SMg^ zrzabJXT^(K>5hSuR&+dxoIshdgFwA~*GYS1wtjoj*!Z*;9}M~|T{-fd_gA;8`qDKr z4S!PLku5r|*Tc7N=r<%9_ZgN<71s6pFd`~dIWrD zS(`qIL@5LAWF=4Ku6aFB@Ej52YJr~coVPnnw*n6)*%rJgYlGyY4VFJFfd@!Ng%ZWsn z=MI`ZA78cJ(|)y~E8JpWA9JGh1i$H^B8bW}+@K9o!dah4OSnJvaA0F5~(&mrs zd@b%z8OLhzFV#oN+LQL<{Zw~lD#mup{MZ!-pGXRQApkv2Dm^mr+6jNfZlTiql>CPa zJo}^Fgr$@fNu{j+0Y02USzM-;oZ2Sc!lkO&DDXZ>x+%_~`Yx*=W=VJo5CeLzF3f7Y}A^CZ?EUpc-J9*4UTwOn$W6MLz* z$xL`yAItCv%3=TEu!@*nhEBh|Q1q}mR9RPdzqsK#eB(*9AYgQ;?<-2zrr1DG>yz!( zLB-AQ_*M5e!)eWxJw{ER&rf~NMjLnwbxYOo0l7vdn7Xh`%_i;#vSRqu(jDZP+O_~{ zjjd}W1tvdd1T{|e53Ie2^s6-$yzIUidvv+%*!Q*omll!u&2v&_5OXFuxPTn?Kc+h& zwoU8aFzrRK;f^gy!lRNlb>ji#RzCkf99&FDFD9G9q{8gVsK;n$6+Q>E6IEe#`ZcQ4 zX6Y0XG`jGJOpvrd0>lLQeMoEgja!&@)HG51ClnK4PaIGflpm~ZBKIRcKJXv>jGwZ> zBuCm1Ms(7XCNr1p{a28@2Ki463YERYPm=#aSy}%PBwNKdpI7_~&11pWRROHdTPsY8 zk?KE4-T(n8WSY=uqW52+?PfthMADk1cD%-atUXl*d{nHqSYh??JC&7C!8@uGbC2rD zmG$zUrO&sr_MV9Fn3A2x zQvV12LBJ;rU0ZNi-o|I;VnalSQqpXxHTZafKa^*pTbV1@T0!V~I&seGmHat4ClYX!KQguSJR9nwRq5f>%ziE!*xXkN(Agh=^%l?f7$G0FIRURBFaMDn#+PuU?Q_$L4gFi&to zdZ`-=tJrllBWC6W_i3WD>etv;`Gdl7u~+J$M#@hO7+sC{$)+A=hrf1f4T4W&f5?Z-E}PuoxD;>#aP)Z+Q9@HQ4Ax zEEXZ+4?7%5LO=YvCiYa7;;#-cL<_c}Uu*0*>}2H({0`b4X8eztUAaiskl%X0V5M%n zc#QWya?d2MkSaV@DI^ppI7Y|2xE>FPd#96>lm&J)j&)vgpD@UFEc2B%^^}aTWq(-Z z#N__M*5{8Kk%NgtA*6(oM!6b#@~?l+ixB;};QcjBC0f*y@|>9w*4WU^H`0o&`i4w- zVlEUON;z)6ua@qwrq3%NVrGRVak!7>3r4g2%;Vn*Sd4b5Bp($DC!e$Kmp5Zpwe`l; z5Hw{X5mT=%>J0F@2^=Q-3X#bPj^_ahXQ3Kj|MG_7l%`P6X_2&Sji7eLREqgPme9sy zGhbu;pMbDUuadM+nRv0Q9xI|?FzK%tZ$pkXN4^=3v8B^L6S!%3w@CE-Ki#9_`x9BT zx9u#*fiwyE*Z*P^G=h6873ZR>F|p0-4IUnOLeYLL1_^%0ce3E>ygAWu%l-4}C6s=BBKk)c-Ady8n`mQU9|MH|feXcg;{VMn=79-O+_q zfdt?URh2tr5~8k3FSHM$X#IH_*1ks?zwl?=)w6mbnc12gL|+-XQBq)BRsC|NBJ8-~SXy?ZT8(M{^h5!LEca4|gE1HH zcleW-t{@_Z)=JHyk{en|n$zIeRd?=sh-!GfivF1Av7;jU{lBlq_u=yiQux75yKIHE zJ(os#2{MyILNbw3o^I`cJ~^2W1@iS4EKy&3jnz{pSURn&(B@UrPUZEO^-L4`8SgXn zsgS4s#aSb0lONt*$ON;IK*m@&LaIR(`yv_?Gb6RM!; z?kxMf3Zs$#y4M)bAzXDa+NIoaZX0Q7%jPzfBc9Aw!1K&Rj}tZNiWGYw#??cQnTcAT z=;qR+Q7F$J{#husxfDpZ=NWs7vHsX6-6R2R~``LqcQ`Vr>copmPk>3v2jt#N?G-CmD=ccVk1F;kA!8f`uTU1@DVaK z$h+6NyuVbs@v2Dxx)1`$K~dH^+}|m>1RR(Xlhr0dfU}x^78;E}{!!=Rvd5>nA}Je0 z$D=7{yy@m29Z6T0#SfJ+^F)+{r5M${d$nsX!%X;;;~Ja1y(9hk>R&%|kNmv-pb#~0 z*zOi~VIKwVCGb!VDwb?TONeFu9iH?B2;fjq9R{C(qjQ5}W0C*9__5%?V)~Sl9;n?D z#O%5Cf&c9u#DRYT0U*sZFoiho|K{I6BODB{f%xzvr29K3h4o4C0oxAg*kAhs|DDYf z1Ni{rsaE00Z{z>ps{a4vS-pQdSzE3kf;9IpW6|^>yvpCWr8&O|L1P*hXiz9n8m+C{Wpo$|F=r$Cj`eNcufH* zF92Dfz5$HVm(sq)6xQ59=s*0mUe`v@C%XuTKKj3X)u(`$CG?JvdQblvy0;Pn+Jb^H z1<0V__s`AkvLI>`x~Ite7XFs86Yz%er^w{a%^N!p;W|0< z0#fJsugrHfK-)VA2VVYmu9^u@>Cy{ut;gRo)!?-WE+WBqe>E~ zsD&j~<`^>|egu+m!IH9WbiZ=O?{1OU?a>a9&eud@)s;iGf!ID85Qz(Fgvq)(b_Q(&>;Q@0VTx1 z8Yb@a&$CggAN4M*%KAzZr05bS5eKBg)tQ`br#%btAKN7*pz%kycXz5<}k-ais$SRXI5QC?(J4jhPxS)qckV16i{wzp5wrNS->T#2Ds;r*FUa%UIc z=9%t_32xQ!lD}AZ5g@>T~9a=twzvC;Q=wIe2> zU|Z#HQtzsR&p<+oQ?i+(oFfZjcT|i`ZN)es-PuWsHQhbrP9>kvN{lNF<|B$rRRCVg z?ZkD@K#GfZ3>CByH69eBGI$y_Ge*Yn4BRUJeHV+4L-AW!beO2%8eX$Xb=hfAiM)~6 zs9`=$-Hg!jR6#e@->u5ViJ3J4hg8d?0y!i~6)C(_=kY-?bDk;Tf`ejySRA3dnBv#- zN(j)eiVmsu(&%$*|M|}IO!<_1{70VJB17*(^3l3(&QZNh(G>&vl zB1r42e6{~Pwu!NpD|yIj+Al+~j1@b~iM4E>wQDbHX3Wj#qPi$pMk2z(Y;ZA5U zo_e!f46(4d2TcMUkztRDM2|h(-E0e2m<$CS*(DYoUq)%UCB5CBWZIR8gTWrUiVpHN z)B=Fi!=j2CiJ6EUmYI^c`Dd)UnLVnhl8nfpVIrpw8=(#s0S}mtsy!iH;RId2c!`V; z{msH!9lK>Z2MgmUq}6SSgUsZnl|UF7Y(yjlog+`Oaf4TYncpg;pBfa;1+qb7#EN35 zD~*W)CnRtHdyGTbOi1VPy?Nn#aG|!bh@6PCF1M;R6QQvXEo2puB@<-95kb_r^(f82 zc-iKnw}|$){{H*YQg|Z=$zb9{6OnZT-`5NO^%f#VA zH=^SM^{uke0u;ec1Z_E^s~e3(FQRi=MC-+A*+a>@3=`Wp;qFwe3s&pMtJgz|`-Lkd zl`0|W1N}9HI+48*v|RVnu4U0)kJnj~l++y)FvDT}4V-Z1%f&}2hb;n*!&wN492k`6 z=>tW+u@uS6LEx~(UTDasrYR({!%~|ury@nU9RTG$2FC#s7Af&N-}@{+skwfbuqf(?Z>2F40Uh^S)$688u&0{xW9nde8UvKAM1l~`LE~fmaaGh9 zE2l46jz@3bPT{RYCr}T@6P6^6U?`P8>egI|2$sb=6{}?8v4V}UC&GU@JaFLd@&H!< zb$tBHMlvNaYyTmA`WdSJ_{40Rv0}CM=Ly*sV&PCP4;s0ac^7g`ODIHRUF}N-E+$Uu zj=jYCwh>M8t!7*GY-^6HY7ucuj^v7E zggC3XU6Zjt$>#^*Q-y|keX?X@6SNggjZRMLoSeLMgAzEuX_5p}rIp!e1)JM?N#(i7 z`KDEhD>xfyjw;18D>)-bVo{~4ErhhICqJWC4U1?`RGeJYAuGL(dqsKMmctg0rW8xHaQ)ECi?w5$RZWnR42GH7P&7O#pqPpN25dpl^*9Zf5A zI@groS~NXq7T@WW={VCQZ$OMY*K8qKHrq?I=-?-hTODx9k=NGMQv%>Uz+=v! zrBn9cCRvVJ;*>*iDs3qL1nG#CpkuJ`kx83{SoKDeqE=>M_K4HaPm7S-kI;sD7u_O)_hCRDOBM)d!`2RnqL-J^LbdMa zi3zbFPE3|cZ6Ig;BT=^gy3t@$!vizH{nLBqIb}FYriStA?+|s8>N@9VFw7oE6!KsS z)theom%+k;e~vqFNfW|U3+7U7niQ*@)Ig$YtSG3hTlY zb|Ruza3XYd0VgGqI2fB$n6E)*Ci9O_+1t5NzYj_pDzU&OA?J%@H0F=3O9XHt!H#~= zTZJ~S)cg@MbQPd=aD;-V#N?Ow$fYSiBE-nw+mCDaN=J;kFy zksd8EL|w2x%Lv>bqQnZ?nM>;Ba8IK~O=dpc;9{&>axa~r++!#APgnW-(kEoU`$BT{ zkyW2Rak02m70Ua|A$JrJqGcx)0|?>?J)Bt>q%6CLZ_=3?PgL+!2`!YAPsnqP;&K<4 zUI2YrMUol9Nn|ntqDV9^BLqmBlQrs~run^KeTl=A0g!aA8W52O4`*%w!E!ejSnxLo zqPdt<1tnRk4yC8w)MiK#P%ZFgTZ=&Yi=S8f(FKr>oeJVVg!hvWC+TqM#}%DlGHRLi zs`S4ETp62!Ct%osS8x`H++9(D6xoP!1ovN%%a??Kg{}BqZY9;d<8)~1#w*B)V9H)l zVA~$Kekw&l%LQOvs|Pp zLuzrNos7<^4qH%-ts^(gyY$*rG~IDWqf%BDP~4x!IthS7`Lj5k+f}CEI0lT9<3kdt z$`vbvr&6x-f_P$ad2;x6fx9}33twC$d<+@n(6u;+N^eCqH!2ri5Ny7z9T%ZOhW0+5 z8+S}e#*8N-gyX+XEtmM=KfDrgoll1l7`8uTd~^Ka3@Tg&9~k2D1BqM302?8k91~>MfwTC_wiC)<9y#jZ{#sVtQ;P!N;JutqCP-voU=|wnrn&~5M=H!wb7efrk!I@`Gs=zNL37ZKHs=g@qo0HvX19UC>c%8Pgv|JUsy}~-+%R8B zatqIaoSmRb895nIU`{BwM6X7c-#Tb=7Y^KCU)yATds}NpHhMyhJT9c)|C8y6yU`ag zpLV`H(x154h*?LZgQg9{@3|=5D!gGXLrHJCKs%5^OsgfBe|BH-$9A)Z$ zMUsc9#}7X>f7JdbrhRTP1XW3b6-}JdY(BVVGFMJJeiybsRt9D0tOWvgU9su~Mx)JC z<=abxs-5eA{lP|)ZgBx)U7L3iHw;!~mdv^CMVLd8ls=52k0#*Kw}9c`XfY&y2n z{qim#k720|MM?xy%Q+DIOxo=5c24CqO@mrfnFt!o`CmLWsBArO&VmhbxOtVoI5ce= zatN^w4id$zVc}ZNnAKtSU;tkwP(gk8fsLt&e0o#iRPLFwP5neHa_^6*g=WYo(HVT> z8AbRYW0CUFf?9HpqTXJ9NDRf%W^R~>6O8FWwMH#XIi$gU_Ja{k)&c>s0&vJSF~BFk z(zr-x15778P}O07T%Lu102b7n9`I6V=cllnvN&-zct3vSYKl??omGub7CTg~G=gX~ z?`zr4txmQpZO&GScv>AFjf`J==^T1gl9^JVwwUioG6m6R2uJzBgc6xzN<#-ub7{7U z?JF{`yGUK-O!gSV*Kyvs-AO%i*% z7M&tjjtfP5QeIK19HF{-ap1FR>pK)am%MK-YwH=FYTgXjc|(`^F<8OZsW|rySV_#u zW?%ArRI+(-L0yvxoAva1BH{q~YF3d5Qi<_Ec67ZAHcPB3@b)Amw{0Aro2fxLIyK2l z6FIreX%N17y?W2I;$rHlPY!Dmi%CJ(wqZ(mwoXRtcy-;N9#VOAsnm(JvaJ)4@0#Bi z9C}xLb-}9a6~#v0Cit}t;agCoLVHkuomia%CXWz}Xpv2G@e@|IBSGJeJu>KKzEer2A+}Lgjby#JiPdthg>@1VL1$98WW4Or(|Yz>$9cV25>FD!=!-kmB%gH?>n#^=1$ahNl@M3o{o~#Of9={ctvDF2ME@dH8k}2!Q z`p%pUl|tlMFk>Di zBIob&sj$YYoZ`dS;ckHh;fMI1r)y?SEKEKOlxEQ!gryMfPM5;2#P}|NEi2igRA};Z zMB0+yGR&O_9lr^U%;}yM{cb&CEM87ncq243-?ZXzjd->@Cen3K<^HU$(c zOo5Q-yvZ<8J0Y~a#0j{oN^6T(7H*xB|BRCCvf!U@C=f9UCHdcj8cBtU%L;G=7pH{7 z%v0T2q-qHSW5UtOvTlFlA8wcBbrrVRPvaBwWfL-(tHbL=s{{Sf6j+LHPxLt(wxjW4 zP5AbW;*W%|fO1I|T1z)vAOCB-^>SkggjOk$r@jQR4j0R)n&%&g43!n;eAoi1jb&j= zR>OSrAb0FJHc`%nH7TWMcmOD%{P*XtfDZDAv+taTQ~WS|NSbtY?xY|tOE@}R5l3dT zXjVoSufrepbcQV}zJ6ZHru?nhdQCy5#ARa0C)b4=9SaT>Ux1wxGUI1)5ru5PA@m<8 zNO)N`;y2=td=?^fi6ISjK^2n?YxDAe;vsb{#~W$mmT?OnAwkp=Bx^*dQ^ukISdDl; zm{XvZcAhlk?xHxgXHn$X0Thy`qWL&{Fq+F*1gz!){U(7VQKpogu+x63SCp1;Ob&-z z)ryQ~pO65jCWsWu_JgFq~h3g)rskoW`mwqwQ1o9Lti{h)1&Q z$F+e@$X1yZr_iF38r2@WL)f3JW1NHn)We7(?KxCU>5mMWUE$}L2d3_bL-3umJc zVIpDua3Fysxw+Iss}Qro%PI@?9$v3O!4;38C&7>=1UahX9vh_?n;TYh>A94Uaw}2$ zB>nBA=VR-^*2X#eh#e?H)7rlc!a(dK=wnm1l8ZUael#D>y~3(gSp>Dd;~-^Cb8FJo z3G*_k`@c)u^Mat;>!c7UZgu@q-RQa!a+CZ%heTM4s59VcCQ#}$L$F+%g{rC=?%Q%VX00%Y>H zNJr~GS^WtIUA!Or6VN5r1|Q}ktfy*F$c7zI0Rxs60@|W=tw_}rY;<;o4#+{(nEo~} z0Hx-WcxQR2f^IC0m(QV}C&4atci}G7J6gNcBxkn9S|!C>2kmH}jhF1d;N#yf1GKQ*B}2btiob%pk+9 zEioV4&ZkPd01@vekaVwqZ`58P&crSb>9r2gOqj>YzUYx96t{l>YSU0NmYjA36{ zcI-GKfHtBF1F^}rdctFk<)`&V$??BOjF7%O>(K|rf{``lpTd8ixH}bz%VQl#$nt z{0l1O0VtDaeozDNFJoi_&`%d6WHdmU&VO+z{X76V!m-#dj{MigUKs#V+yEXL`d^d% zAfQQ$8B(ZR1}5>kXnsX-kBlQa4=oJ zb;g%o4-C4WNo+OweT;VRso|IYp{JuQ?c{4pX&zCv%=cZxEdp4J~TgyFrvk`ke zG!uih(=_6SV>&Na;L=mZwdkA5#7p+~wdAdZu2AQ#_XE#RiqZjhOW4{0daQ;*K-&A<|9YQY*qgp-41iX^7?LT~n9Ft7#T7P$+iWiD< z`{7N3H=DR%4+US~?bXtZv^Smfh16QL_c-^^VO8ZM5tSVyN1G)%8E;wC+s3{@==pxI zOl9*#M4-{-SNzVqNhkUEyuZ5>l9z`cBqJlWD}XoSy65d2eldCmufZB3Zr&xv!snh7_2WQO=ye#@zQGl$s9f6P2l3QxcH_nATNF77HLJlLZ+y}T-@t>hJEe`yi zSI^LLJ^F*Zt4~ij0c50GfyKo?t!&MNkjCV9L62^p2KIByCZxX@+{l;F4vR$#*|bF+ zPJEnB^RH)gSZ!A*OkxJ}8Jg+bGuohhc$>Xty0mi0HU|tHW(cdYP=DnfdJyMW^^I3< zkT2IF3*d6SMK6MbSu>{DytcXrl|2 zZf*U-$yOl6pI@=2sS&YZ&GgUzS95Ru6vy^PdnbfIfP~fQTUz1L?w+vCxRyl=s$9Fd2@z&b3HHh`fV?GZOXi;4P3zKXi_| z{b%M{CxctnQhL?63Ek3dA`}267I7UGdn=y%2J`QGF6h7B{q5LdgWw%}+}!aE%jfU& zP_!hMh4<6zXGT_*P5wamO1se|kt$2rHOC=46@|9|+{&?0!fSinC4H)B z&`w9j4VLCl3pc)9{hEKfBh9I1GIlu>Ppj5wO~lR3%{VvM_B30nT5Y+=eE0YWS$~19 zpPhAoh7=cObXDnhyA}b6-fSLo{ZmQWN8u5U^Tu_#BUN9|%`zJ%6hfY5=f|B7-@kqx%%_tVXny$F`TO#Q>}_axDL`g(>#ugv_##6+e8Dfn<0A6AtwE^A9QP)u z*@1!UxbCE=X`S4ec;akUQ!5sL3s zYwJKCe54(e_#O~cNh!`@_RaIskJ=IGmRB{Xd^dVP>sHZ^(+s?I%s~FUk0)|Gh|glm*oNJRw_8ZFr2NSBU;>wSSFo=J>VQzW&s zUzhu6w6xa~r)#q+Tu*6BShQ8(tWmL>n4uUpOcs=MJtxrGdT^l>7o3a?Ay=BZ(aRL z(NEiDXp6@iHeTCZ;P0zh{17XbW7LGe7?to1|N%_a}7a*S2q$|pEJ!wXg`3-kQE=t= zxRX})GxTRJMbq>`|fK|9@*TB5?=MLKt`QW2U#(T7%-KcQ}%&qfGbd=GOE zGJV^sYhB_k9-ZwG%mrw)3PveO4`h97yaLvs^p_8xWS~>W z{;KImrY#*Yx23_1X`@JHpGwiaCiNz>r?2kVv2PrMyn|U=NN8ty{!FwjPdLb}sP~bd zHEZ3i(1acL)o+==Iq5b`{*Z8i5_eRvZ(456f&_q3^b_ghm&<5dGLef~DO%7MOC#un&+@r3uEY1ZP)I`FP z814xw!7H5?aD+7*0r+6}VbY5vTc%fh`^oZ~vZbQsC4MN{q=Xr{3H^KB-aemawTHcT zLD}M}!j?useLQ#6Zw zSy*Tnf8)MO-xHJy)PtAi5a>|hHkBN8<4jc#k_5OjnGZthT8yZuD5HGawL(!A86aJV zg^UIl?{F*Mr@Gtt&d-xocI^mDL*7;8ljC_kKP!kGEY?oc(}kmls1Pc2K}=8j^5IV%Kz9 zKbb2=q##AFF|@Au9jW~c&oSZH3maMpwww0Znfa!+{7rDHO90fS8&qr49!NV=aDK$j zy#RFbTib-BH#W9PuXSL^c)@Y=uSQxf*hCnpeD(AMViX9yAg;CyXyCwD?-CVbJK=Rdtb2CePcqE)t9s+u zAE0B~Qe_z>rB^Mr!Hx07L}+PeN}Op6``v-v5Ti?y?E>@^vOPE5#N|#{v0>prc>f`B z?IoO0{b7wKurGfoNHw{Qn^LT|i$TY^l?a6OM3~#PmnBUkG3}dw*5L(LF?Z6x$nOr% z@I2h?kmFqm7n-451t2 z!x5X~D!6HMGPv^TJ;ReAKL&s%KX{O0XZaVuK1c?ACtWHeW!3k=2$)~02*H)H>UdH? zkjdneB;Unnn|~2v{Jo|_Nt3n6iWrNWQ{-DsQm_qG_yK7?|Deqh?r8+yRB}jE|1D+$ zlyl#kZraR)x@&2(a(_g9$Jd6>$I^#cYmjy)yCrgfF`F#zNI%0@tNpnBSHOANy8jsm z{G;Oy#Jz9xDB`5B2oycs-cfc7=b(flP5U0qsKH4!)Ry4YQn0~?V`_n+kN>;Huy;a{ zqDI91YMR6`wTj#?1MIJA*gE^XY@8bsQ%JM^^il+M9A`fiXkspmc(X-jPEO*XDDuOD3nyH z5`2TNprBA?v(9(F)L=#62f-hCAIRE&}e>(d9Yc6Bt$>)U}5o)7*!*-Y;f{s5IQ~dh0SACMjqZm$Y{40aA2Zb zI5FV3Yq0W@!9nN8@-myory~;^X#CC6A_ccVIvcBUR=%ukw2sEccf;&ioL(85Fpm(? z3k|M^;~ey1TjukSgCMr~Cnp4%w({ef*M7e8t%_#SV-h)hw%=G7r_#rHXnt`%QLo;4J{798hf*=W*w6trNJz{d<)F2CM`F+(fa6s7w!jS+C!GrW&9DF=b^757A-C@B2{Y+wR2&+7o| zjaFRGGHYvmqe)??Ay_kV%N?%Zq^=zZlj~yc?>rmbk<}Y>$2O{!5-Wu~ADpVmwH^EV zIi65lc}2u6!h`b1NTnI8pS{gf2CO7JHyhR;ohj%?B(3BuT&y(iX5^`Mqcmqsxj>qH#USE)nFdpVmE}Cuj91hUpN~P1q8BwO7vp#!H57 z7{`5GE z1&i?;)Fcv@D<}Y-w-$sgU9R39(8(UJ2F?P(Ra;J8EA#=I^mQ@XV<_@b=1Wq6P9qvl zfM4xrUvG$>-&jcl&ly;#a$<32z>ZCC-=dIoVb=PC3K*ZCzHE#l9J3@C?gq7@2^wSW zkTH?)aLW>@D>gq8x4e6)^a{QL-E2)mNS&RBoMXg7clk>D3FuX;A?qaaUhK+j;7pR* zU!y*_T%miJy`K|;uKM|3(6{anU}oID12-Y3?VB7zAk~=_1*7E?>)o0VZ8b2gyU0Zz z7xR#|dwfqyj!YwG@|Ld0kL|PG3YKotOBITC9koTBS{w0eq5CSc)pYFIj!Uk|luRrSASl8eCRv}3%g=(0dBWvWO9J<|3+A&C!#_AS&` zYF82aZKDHu!{Er&<<+O!)(Go&v-Vc`D(4FZ2V6zO5VI0!t4Rb(xg zpG=l#NvP#fCL!{tX@J!nnX-NKhysBMQ>MX&h_+et3*TLVr-NRJ zEVCC5(_Ue4m%8YUuOAzTUzCOes?LKSeaasj!b_cVvwIt88``+fC_IABz>Tlcor6xU zbIF8Y?Kk@6-b-!NN^uSOlPuBqFnCDijLC_eb%PNc$BKc6DISsHpopV?+tp#fwg@9d zCdC3)pnJpUJb?H7mwjU#k(=S;M`x(uy1F1w^5yI@r!11pT9a{65fT57#;KzY7%lmm z-GStEbW(htvrx2CW^WrF@6v76w$q5Na*&1eL0o7u{!Ft17dKWQ-^dU9Pov3eubhGh zlnQ|It@bFf(z4S`U-{t}bednjOJ(BcwRwA`5aQ7GTI1N;6qDQDYH9;Y z9aBgJ>yjl$QcO$EK!qPumk(rY=9!qmVYSB7rrs+CTVnc7KYi|#2{k?@UedJb-gEhP ztt$v^0w&V#E!6wkJ$&n1mUCa<4+|E(I&8~2zxeLiZPRMr^_loZK7mhwdwjuWm<5A< z&5u-FomLlOB0VL08P8uqJ59O~yYUBs0^G~-$}_n@spIFy+V5k-5k6^!89&%d(Cu!o z7vq&)6;(`H_W^EyGabG|r52Q#rcdoMZ3-Al?)0&M9b1&4ON;xmmt#4K8#Kw|Q9KWQ zH#FnQ#%#KN6`y9BaYraT2l7fvkXe2?Xtr}F{Zwbi-1qM++`MFDKHJs#d38NugzqT( zXD1DpYx(f-*GM+{m3p0*RED~2XnUVWxn-${=&I0ol0&IsX}P5Y9{HfUhiR)UhyjM( z?6)iusPgfwlq#OeSMuX2032Bd_)Lg`G&9^nGolwGQ-BTK={LxjY4t8}gLoVlyfaU3 z0p|JkyA?2w#`U>r#TgZp_#K*kr6K!$UmjSFgq>-XUWeS=jG7A;gRr|&HQCTMLn+U1 zIKqE8IW< z_E5LwcLy$ZUamS?Wh*afqRYPV2#0yR7$;71oSSKHlZQxZi%LYtx1w=0t~_dbKEBqHCD8)a~5QKQI`5Fh^Yycl}^# zg3ZDB_WYEl*Q>k5;UK2p%TV(PRJNg)qOtJ`^mwQHcAaz0pt07O~ z{S5}%YyQw|N6FJoLyG2&HqbWS^JCC!;T7narmFt+aAz2o-CXap#iu(ivsA9O-v3!K zcPALQytkeX+Lrmc)flpgwhtAUXhaPal2Bax*UyN4KHaPDy87e)A;FQoE9P+0elGu{ zE$8>y$+>{UjqJ8c>sj^~z*F+QWq^h0Ri7n~^B()dE&lV8a2?bRcb|M-9<=k2?<~c+mf>L<}1?ZJ-{I$SP6pmHd zH!&AwNYtT`@xT7m8I*!iTxKck;#yN~DeFn-^d*OdLs@S)0r_ElXgzI4sTwKuCqX+G zLT&!P7ua@V;MRF59{_$>-4N@wI)?o54#CU9_9#6e^7-?}Ca%}Rf+P`U2EyL9FOm}Y z97ATr6AR>#7CtmcTWzqb=8$&x{e|}R&606zpPuJ2{t8Dnj+eVNhX&!&VQAnSrQSmj zrZc4DLcUa~bNjwp&2F7yV+iSZ3D!5w{3XsmQtzI(kz0KKC?ZgFs+=>f77sR`CRE0C zDJZcmCL2_U$&0pKJG+abA417CulodrOC3$bY($%jXDgV?$PY?#utp-J1mbxt1FEUJ zX;`@PKm3eZ42y{q#!^n*XNeiw`zwzh%$^#Bju%cQ9k~!0Asiu(qS%iF2+Kb_I4JyfWB8zme=2yMReoG%eS=i zWS{s_RYNxLT!m(!aqaWlN>GB9u_SHd(XJ$-i(9 z@wfAnC=+EBju=x0Hdzt+d!1_Xb2 z(j-(c#MqCP&$_7LX9hGMG*i>kiq4tC;Cnd2sVCz|&{G?e zIW&T%7r!*>m!%NnK}CY=MRb(%4_9O~Kvd*i?~y$H6Uc&q=EhQBBn5E3Fb55qK#~0F za~iPA#C?)rX8pCaX$SM$TEHmcy=0X2JItIk;F`9Myqp~{C#$-*EGiJ1 zRN+p2UYdngDd7M#BkCRGR<&pnEx(FK=8o?q$ZE_O5Y;EZ$0Tbxr7#z11@=xUXwnT6 z=BE4XP_SetMNk*#?$qTsG|WA41BX-#6z?5E(bP4g^n%63YlNe|k)CU*$Mm9!T@zgu zbrlISAIQ+~N#9^cee}(5QkfR6`8_zdttHuFsw!L&$6&6(l~zz=lzUf7PsOWLkPAto zlo=|UjXMMWYi2vgby7;M0^R63o}rm^neOM_JO1ln)8e9vTCLv`c8dzGRcIR6#(^VW5W85r_m_%w67Dk`Ynz2caa+3 zaY+HK3+@f&7JY(;{}*v0qao(EtTFlF0R_Wnx#;#klAZ;KK1N5^BsEJ6toYWsV~9?f zA8Imrlu%nFke>0TCJdps($TGdG*whh_V<&`Z;y_V5-C=zA2p><(6U97pH7HUE~R!L z4xDR4rZB?FVxtOB$+Pi`=({flv(i?i7nG8%U@ZoTH3VsC*E;*JEh82zer-{6YZX~mNHww zDLb0zIAzD(&|{P5*uJO{M`$Y{O64%K&$xtOAg|JlPKAD=Q;!$m`#o#^UZAOV;h5PH ztJ)@6Lta}sQg4YZ*rT?nG_RPpR<2oLd7AG!2!-5BLnCCah0${6XcC{m2Ov4@9fDTo zNtJ}GLLRk7kTUT1u)Hs~Aj0V#D_BEICtmV$Oil1XK`^i0t%w$0=MIzC4ApVr}m9!LoNaX?=4k|uZiAupSV<9M%|~KR#d&I zsmzHq5Vdvw{5@nmr#;wx@=aPD;%=TVIuXkDbX$#l1p;R1fTjHu_p|%&TIrzmxWES$ zmXUI*ZL5&N0^k=degyqs$%(jT1j^a2#bkY&@t%Yy_q+SzF`6&pV^*@dVBc+}FI44e zL+{Cd?&mdcm^TLvhm~}}V&1#hqpOo;f9qpV?N$48Sm{4u>r3WM&x;9X8)(wde6&lV zA}qG1*)m#YS6tQ@JPmEI66AwJ15`B9$n^~jeM?7$-xr&1B~kfR7~8$>Q}_F#=kGKY zDjubrRD~F+2;7{}+(1YUOK0%Ej0r;EpK+qlDu*T972;+bq*tEzI*kln9nrqT;g|zJ zMBbh3dgnO8x+LL-QF71*WPFK9zkyk|T+QkI&f<1fA&;MQWQ=bBb!FJpI5B@njE62w zZ%XMljZJ#w{2zSQvuM_04$GDByaKkMdBNs@56Ey9U(pDLYre*{AxHu&6`6$$qO}`R zR&bkZ&M1s1qcC;raW%Im-&hVT(Tk;GNi<6S6{lVZc}kKV2&TzhlVm#3@>dSMoMlGH z15iXis>JBnUpQg3*gVJ&EPv5D!JuTVKw%Sa6(UKM@t~u`6PNvM!BcPLoq{QdvW(QOOY&R2)VkN6GggotJ*nZN&y!`E{a%2q}14sADw2e=iid* zE11>17>3?Ldv^h0`H&${h;{8(ba!EHvDFd+Z`7drF9)N3Lr85B}qQB$Jh! z`;J`nZo*=tzxUvv@?rbKVPNa6e^P5<9{j2HeAjjU3K_Oj$RutP#bMz}&y&*%RD DV4kVw literal 0 HcmV?d00001 diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md new file mode 100644 index 0000000000..68dcfe23ff --- /dev/null +++ b/doc/ci/runners/README.md @@ -0,0 +1,145 @@ +# Runners + +In GitLab CI, Runners run your [yaml](../yaml/README.md). +A runner is an isolated (virtual) machine that picks up builds +through the coordinator API of GitLab CI. + +A runner can be specific to a certain project or serve any project +in GitLab CI. A runner that serves all projects is called a shared runner. + +## Shared vs. Specific Runners + +A runner that is specific only runs for the specified project. A shared runner +can run jobs for every project that has enabled the option +`Allow shared runners`. + +**Shared runners** are useful for jobs that have similar requirements, +between multiple projects. Rather than having multiple runners idling for +many projects, you can have a single or a small number of runners that handle +multiple projects. This makes it easier to maintain and update runners. + +**Specific runners** are useful for jobs that have special requirements or for +projects with a very demand. If a job has certain requirements, you can set +up the specific runner with this in mind, while not having to do this for all +runners. For example, if you want to deploy a certain project, you can setup +a specific runner to have the right credentials for this. + +Projects with high demand of CI activity can also benefit from using specific runners. +By having dedicated runners you are guaranteed that the runner is not being held +up by another project's jobs. + +You can set up a specific runner to be used by multiple projects. The difference +with a shared runner is that you have to enable each project explicitly for +the runner to be able to run its jobs. + +Specific runners do not get shared with forked projects automatically. +A fork does copy the CI settings (jobs, allow shared, etc) of the cloned repository. + +# Creating and Registering a Runner + +There are several ways to create a runner. Only after creation, upon +registration its status as Shared or Specific is determined. + +[See the documentation for](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation) +the different methods of installing a Runner instance. + +After installing the runner, you can either register it as `Shared` or as `Specific`. +You can only register a Shared Runner if you have admin access to the GitLab instance. + +## Registering a Shared Runner + +You can only register a shared runner if you are an admin on the linked +GitLab instance. + +Grab the shared-runner token on the `admin/runners` page of your GitLab CI +instance. + +![shared token](shared_runner.png) + +Now simply register the runner as any runner: + +``` +sudo gitlab-runner register +``` + +Note that you will have to enable `Allows shared runners` for each project +that you want to make use of a shared runner. This is by default `off`. + +## Registering a Specific Runner + +Registering a specific can be done in two ways: + +1. Creating a runner with the project registration token +1. Converting a shared runner into a specific runner (one-way, admin only) + +There are several ways to create a runner instance. The steps below only +concern registering the runner on GitLab CI. + +### Registering a Specific Runner with a Project Registration token + +To create a specific runner without having admin rights to the GitLab instance, +visit the project you want to make the runner work for in GitLab CI. + +Click on the runner tab and use the registration token you find there to +setup a specific runner for this project. + +![project runners in GitLab CI](project_specific.png) + +To register the runner, run the command below and follow instructions: + +``` +sudo gitlab-runner register +``` + +### Making an existing Shared Runner Specific + +If you are an admin on your GitLab instance, +you can make any shared runner a specific runner, _but you can not +make a specific runner a shared runner_. + +To make a shared runner specific, go to the runner page (`/admin/runners`) +and find your runner. Add any projects on the left to make this runner +run exclusively for these projects, therefore making it a specific runner. + +![making a shared runner specific](shared_to_specific_admin.png) + +## Using Shared Runners Effectively + +If you are planning to use shared runners, there are several things you +should keep in mind. + +### Use Tags + +You must setup a runner to be able to run all the different types of jobs +that it may encounter on the projects it's shared over. This would be +problematic for large amounts of projects, if it wasn't for tags. + +By tagging a Runner for the types of jobs it can handle, you can make sure +shared runners will only run the jobs they are equipped to run. + +For instance, at GitLab we have runners tagged with "rails" if they contain +the appropriate dependencies to run Rails test suites. + +### Be Careful with Sensitive Information + +If you can run a build on a runner, you can get access to any code it runs +and get the token of the runner. With shared runners, this means that anyone +that runs jobs on the runner, can access anyone else's code that runs on the runner. + +In addition, because you can get access to the runner token, it is possible +to create a clone of a runner and submit false builds, for example. + +The above is easily avoided by restricting the usage of shared runners +on large public GitLab instances and controlling access to your GitLab instance. + +### Forks + +Whenever a project is forked, it copies the settings of the jobs that relate +to it. This means that if you have shared runners setup for a project and +someone forks that project, the shared runners will also serve jobs of this +project. + +# Attack vectors in runners + +Mentioned briefly earlier, but the following things of runners can be exploited. +We're always looking for contributions that can mitigate these [Security Considerations](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/security/index.md). diff --git a/doc/ci/runners/project_specific.png b/doc/ci/runners/project_specific.png new file mode 100644 index 0000000000000000000000000000000000000000..f51ea694e78f964656c568e4ab95d2977772bd4b GIT binary patch literal 31408 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