From a8e93b7f51d968c1380ed210499869b62b07fd15 Mon Sep 17 00:00:00 2001 From: Job van der Voort Date: Tue, 21 Apr 2015 16:21:51 +0200 Subject: [PATCH] Version 7.10.0.rc5 --- .foreman | 1 - .hound.yml | 4 - .pkgr.yml | 37 - .rspec | 1 - .rubocop.yml | 1006 ----------------- .ruby-version | 1 - .simplecov | 4 - .teatro.yml | 8 - CONTRIBUTING.md | 179 --- GITLAB_SHELL_VERSION | 1 - Guardfile | 27 - LICENSE | 19 - MAINTENANCE.md | 15 - PROCESS.md | 113 -- Procfile | 2 - README.md | 104 -- Rakefile | 7 - VERSION | 2 +- .../images/authbuttons/bitbucket_64.png | Bin 2163 -> 0 bytes app/assets/images/authbuttons/github_64.png | Bin 4196 -> 0 bytes app/assets/images/authbuttons/gitlab_64.png | Bin 6559 -> 0 bytes app/assets/images/authbuttons/google_64.png | Bin 3169 -> 0 bytes app/assets/images/authbuttons/twitter_64.png | Bin 3054 -> 0 bytes app/assets/images/bg-header.png | Bin 90 -> 0 bytes app/assets/images/bg_fallback.png | Bin 167 -> 0 bytes app/assets/images/brand_logo.png | Bin 27059 -> 0 bytes app/assets/images/chosen-sprite.png | Bin 367 -> 0 bytes app/assets/images/dark-scheme-preview.png | Bin 3996 -> 0 bytes app/assets/images/diff_note_add.png | Bin 418 -> 0 bytes app/assets/images/favicon.ico | Bin 32988 -> 0 bytes app/assets/images/gitorious-logo-black.png | Bin 809 -> 0 bytes app/assets/images/gitorious-logo-blue.png | Bin 495 -> 0 bytes app/assets/images/icon-link.png | Bin 726 -> 0 bytes app/assets/images/icon-search.png | Bin 222 -> 0 bytes app/assets/images/icon_sprite.png | Bin 2636 -> 0 bytes app/assets/images/images.png | Bin 5849 -> 0 bytes app/assets/images/logo-white.png | Bin 7699 -> 0 bytes app/assets/images/monokai-scheme-preview.png | Bin 3711 -> 0 bytes app/assets/images/move.png | Bin 197 -> 0 bytes app/assets/images/no_avatar.png | Bin 621 -> 0 bytes app/assets/images/no_group_avatar.png | Bin 942 -> 0 bytes app/assets/images/onion_skin_sprites.gif | Bin 548 -> 0 bytes app/assets/images/progress_bar.gif | Bin 494 -> 0 bytes app/assets/images/slider_handles.png | Bin 1377 -> 0 bytes .../images/solarized-dark-scheme-preview.png | Bin 3195 -> 0 bytes .../images/solarized-light-scheme-preview.png | Bin 3095 -> 0 bytes app/assets/images/swipemode_sprites.gif | Bin 505 -> 0 bytes app/assets/images/switch_icon.png | Bin 231 -> 0 bytes app/assets/images/trans_bg.gif | Bin 49 -> 0 bytes app/assets/images/white-scheme-preview.png | Bin 3751 -> 0 bytes app/assets/javascripts/activities.js.coffee | 29 - app/assets/javascripts/admin.js.coffee | 53 - app/assets/javascripts/api.js.coffee | 49 - app/assets/javascripts/application.js.coffee | 194 ---- app/assets/javascripts/aside.js.coffee | 17 - app/assets/javascripts/autosave.js.coffee | 39 - .../behaviors/details_behavior.coffee | 15 - .../javascripts/behaviors/taskable.js.coffee | 21 - .../behaviors/toggler_behavior.coffee | 14 - app/assets/javascripts/blob/blob.js.coffee | 73 -- .../javascripts/blob/edit_blob.js.coffee | 44 - .../javascripts/blob/new_blob.js.coffee | 21 - app/assets/javascripts/branch-graph.js.coffee | 340 ------ app/assets/javascripts/calendar.js.coffee | 38 - app/assets/javascripts/commit.js.coffee | 4 - app/assets/javascripts/commit/file.js.coffee | 5 - .../javascripts/commit/image-file.js.coffee | 126 --- app/assets/javascripts/commits.js.coffee | 55 - .../confirm_danger_modal.js.coffee | 18 - app/assets/javascripts/dashboard.js.coffee | 3 - app/assets/javascripts/diff.js.coffee | 44 - app/assets/javascripts/dispatcher.js.coffee | 154 --- .../javascripts/dropzone_input.js.coffee | 243 ---- app/assets/javascripts/extensions/array.js | 7 - .../javascripts/extensions/jquery.js.coffee | 13 - app/assets/javascripts/flash.js.coffee | 12 - .../javascripts/gfm_auto_complete.js.coffee | 67 -- app/assets/javascripts/group_avatar.js.coffee | 9 - app/assets/javascripts/groups.js.coffee | 4 - .../javascripts/groups_select.js.coffee | 41 - .../javascripts/importer_status.js.coffee | 35 - .../javascripts/issuable_form.js.coffee | 28 - app/assets/javascripts/issue.js.coffee | 24 - app/assets/javascripts/issues.js.coffee | 85 -- app/assets/javascripts/labels.js.coffee | 33 - app/assets/javascripts/lib/jquery.timeago.js | 181 --- app/assets/javascripts/lib/md5.js | 211 ---- app/assets/javascripts/lib/utf8_encode.js | 70 -- .../javascripts/merge_request.js.coffee | 166 --- .../javascripts/merge_requests.js.coffee | 35 - app/assets/javascripts/milestone.js.coffee | 124 -- .../javascripts/namespace_select.js.coffee | 25 - app/assets/javascripts/network.js.coffee | 9 - app/assets/javascripts/notes.js.coffee | 481 -------- app/assets/javascripts/pager.js.coffee | 42 - app/assets/javascripts/profile.js.coffee | 29 - app/assets/javascripts/project.js.coffee | 26 - .../javascripts/project_avatar.js.coffee | 9 - app/assets/javascripts/project_fork.js.coffee | 5 - .../javascripts/project_import.js.coffee | 5 - .../javascripts/project_members.js.coffee | 4 - app/assets/javascripts/project_new.js.coffee | 11 - app/assets/javascripts/project_show.js.coffee | 15 - .../javascripts/projects_list.js.coffee | 24 - .../javascripts/protected_branches.js.coffee | 21 - .../javascripts/search_autocomplete.js.coffee | 11 - app/assets/javascripts/shortcuts.js.coffee | 30 - .../shortcuts_dashboard_navigation.js.coffee | 14 - .../javascripts/shortcuts_issueable.coffee | 19 - .../javascripts/shortcuts_navigation.coffee | 20 - .../javascripts/shortcuts_network.js.coffee | 12 - app/assets/javascripts/sidebar.js.coffee | 9 - app/assets/javascripts/stat_graph.js.coffee | 6 - .../stat_graph_contributors.js.coffee | 69 -- .../stat_graph_contributors_graph.js.coffee | 167 --- .../stat_graph_contributors_util.js.coffee | 93 -- app/assets/javascripts/subscription.js.coffee | 17 - app/assets/javascripts/tree.js.coffee | 41 - app/assets/javascripts/user.js.coffee | 4 - app/assets/javascripts/users_select.js.coffee | 117 -- app/assets/javascripts/wikis.js.coffee | 9 - app/assets/javascripts/zen_mode.js.coffee | 67 -- app/assets/stylesheets/application.scss | 62 - app/assets/stylesheets/base/gl_bootstrap.scss | 251 ---- app/assets/stylesheets/base/gl_variables.scss | 133 --- app/assets/stylesheets/base/layout.scss | 22 - app/assets/stylesheets/base/mixins.scss | 147 --- app/assets/stylesheets/base/variables.scss | 34 - app/assets/stylesheets/behaviors.scss | 22 - app/assets/stylesheets/generic/avatar.scss | 42 - app/assets/stylesheets/generic/blocks.scss | 19 - app/assets/stylesheets/generic/buttons.scss | 74 -- app/assets/stylesheets/generic/calendar.scss | 90 -- app/assets/stylesheets/generic/common.scss | 376 ------ app/assets/stylesheets/generic/files.scss | 145 --- app/assets/stylesheets/generic/filters.scss | 55 - app/assets/stylesheets/generic/flash.scss | 17 - app/assets/stylesheets/generic/forms.scss | 95 -- app/assets/stylesheets/generic/gfm.scss | 21 - app/assets/stylesheets/generic/highlight.scss | 70 -- app/assets/stylesheets/generic/issue_box.scss | 32 - app/assets/stylesheets/generic/jquery.scss | 55 - app/assets/stylesheets/generic/lists.scss | 128 --- .../stylesheets/generic/markdown_area.scss | 87 -- app/assets/stylesheets/generic/mobile.scss | 69 -- .../stylesheets/generic/nav_sidebar.scss | 193 ---- app/assets/stylesheets/generic/selects.scss | 118 -- app/assets/stylesheets/generic/tables.scss | 20 - app/assets/stylesheets/generic/timeline.scss | 134 --- .../stylesheets/generic/typography.scss | 75 -- app/assets/stylesheets/generic/zen.scss | 98 -- app/assets/stylesheets/highlight/dark.scss | 88 -- app/assets/stylesheets/highlight/monokai.scss | 88 -- .../stylesheets/highlight/solarized_dark.scss | 110 -- .../highlight/solarized_light.scss | 110 -- app/assets/stylesheets/highlight/white.scss | 87 -- app/assets/stylesheets/pages/admin.scss | 63 -- app/assets/stylesheets/pages/commit.scss | 123 -- app/assets/stylesheets/pages/commits.scss | 118 -- app/assets/stylesheets/pages/dashboard.scss | 93 -- app/assets/stylesheets/pages/diff.scss | 358 ------ app/assets/stylesheets/pages/editor.scss | 54 - app/assets/stylesheets/pages/errors.scss | 14 - app/assets/stylesheets/pages/events.scss | 197 ---- app/assets/stylesheets/pages/explore.scss | 8 - app/assets/stylesheets/pages/graph.scss | 37 - app/assets/stylesheets/pages/groups.scss | 12 - app/assets/stylesheets/pages/header.scss | 194 ---- app/assets/stylesheets/pages/help.scss | 70 -- app/assets/stylesheets/pages/import.scss | 18 - app/assets/stylesheets/pages/issuable.scss | 47 - app/assets/stylesheets/pages/issues.scss | 156 --- app/assets/stylesheets/pages/labels.scss | 21 - app/assets/stylesheets/pages/login.scss | 124 -- .../stylesheets/pages/merge_requests.scss | 191 ---- app/assets/stylesheets/pages/milestone.scss | 9 - app/assets/stylesheets/pages/note_form.scss | 175 --- app/assets/stylesheets/pages/notes.scss | 206 ---- .../stylesheets/pages/notifications.scss | 22 - app/assets/stylesheets/pages/profile.scss | 95 -- app/assets/stylesheets/pages/projects.scss | 328 ------ app/assets/stylesheets/pages/search.scss | 7 - app/assets/stylesheets/pages/snippets.scss | 8 - app/assets/stylesheets/pages/stat_graph.scss | 50 - app/assets/stylesheets/pages/themes.scss | 0 app/assets/stylesheets/pages/tree.scss | 153 --- app/assets/stylesheets/pages/ui_dev_kit.scss | 9 - app/assets/stylesheets/pages/votes.scss | 4 - app/assets/stylesheets/pages/wiki.scss | 6 - app/assets/stylesheets/print.scss | 17 - app/assets/stylesheets/themes/dark-theme.scss | 63 -- app/assets/stylesheets/themes/ui_basic.scss | 30 - app/assets/stylesheets/themes/ui_blue.scss | 6 - app/assets/stylesheets/themes/ui_color.scss | 6 - app/assets/stylesheets/themes/ui_gray.scss | 6 - app/assets/stylesheets/themes/ui_mars.scss | 6 - app/assets/stylesheets/themes/ui_modern.scss | 6 - .../admin/application_controller.rb | 11 - .../admin/application_settings_controller.rb | 45 - .../admin/applications_controller.rb | 52 - .../admin/background_jobs_controller.rb | 6 - .../admin/broadcast_messages_controller.rb | 39 - app/controllers/admin/dashboard_controller.rb | 7 - .../admin/deploy_keys_controller.rb | 49 - app/controllers/admin/groups_controller.rb | 64 -- app/controllers/admin/hooks_controller.rb | 44 - app/controllers/admin/keys_controller.rb | 34 - app/controllers/admin/logs_controller.rb | 2 - app/controllers/admin/projects_controller.rb | 44 - app/controllers/admin/services_controller.rb | 54 - app/controllers/admin/users_controller.rb | 128 --- app/controllers/application_controller.rb | 345 ------ app/controllers/autocomplete_controller.rb | 30 - app/controllers/confirmations_controller.rb | 17 - .../dashboard/groups_controller.rb | 5 - .../dashboard/milestones_controller.rb | 34 - .../dashboard/projects_controller.rb | 27 - app/controllers/dashboard_controller.rb | 54 - app/controllers/explore/groups_controller.rb | 13 - .../explore/projects_controller.rb | 27 - .../groups/application_controller.rb | 28 - app/controllers/groups/avatars_controller.rb | 12 - .../groups/group_members_controller.rb | 84 -- .../groups/milestones_controller.rb | 56 - app/controllers/groups_controller.rb | 145 --- app/controllers/import/base_controller.rb | 19 - .../import/bitbucket_controller.rb | 82 -- app/controllers/import/github_controller.rb | 68 -- app/controllers/import/gitlab_controller.rb | 65 -- .../import/gitorious_controller.rb | 43 - app/controllers/invites_controller.rb | 83 -- app/controllers/namespaces_controller.rb | 25 - .../oauth/applications_controller.rb | 39 - .../oauth/authorizations_controller.rb | 57 - .../authorized_applications_controller.rb | 8 - .../omniauth_callbacks_controller.rb | 76 -- app/controllers/passwords_controller.rb | 18 - .../profiles/accounts_controller.rb | 13 - .../profiles/avatars_controller.rb | 13 - app/controllers/profiles/emails_controller.rb | 37 - app/controllers/profiles/keys_controller.rb | 61 - .../profiles/notifications_controller.rb | 44 - .../profiles/passwords_controller.rb | 88 -- app/controllers/profiles_controller.rb | 76 -- .../projects/application_controller.rb | 36 - .../projects/avatars_controller.rb | 29 - app/controllers/projects/blame_controller.rb | 13 - app/controllers/projects/blob_controller.rb | 163 --- .../projects/branches_controller.rb | 46 - app/controllers/projects/commit_controller.rb | 41 - .../projects/commits_controller.rb | 24 - .../projects/compare_controller.rb | 31 - .../projects/deploy_keys_controller.rb | 65 -- app/controllers/projects/forks_controller.rb | 25 - app/controllers/projects/graphs_controller.rb | 39 - app/controllers/projects/hooks_controller.rb | 58 - .../projects/imports_controller.rb | 51 - app/controllers/projects/issues_controller.rb | 159 --- app/controllers/projects/labels_controller.rb | 82 -- .../projects/merge_requests_controller.rb | 270 ----- .../projects/milestones_controller.rb | 116 -- .../projects/network_controller.rb | 18 - app/controllers/projects/notes_controller.rb | 125 -- .../projects/project_members_controller.rb | 98 -- .../projects/protected_branches_controller.rb | 51 - app/controllers/projects/raw_controller.rb | 37 - app/controllers/projects/refs_controller.rb | 64 -- .../projects/repositories_controller.rb | 28 - .../projects/services_controller.rb | 59 - .../projects/snippets_controller.rb | 93 -- app/controllers/projects/tags_controller.rb | 37 - app/controllers/projects/tree_controller.rb | 27 - app/controllers/projects/wikis_controller.rb | 123 -- app/controllers/projects_controller.rb | 198 ---- app/controllers/registrations_controller.rb | 41 - app/controllers/search_controller.rb | 55 - app/controllers/sessions_controller.rb | 37 - app/controllers/snippets_controller.rb | 113 -- app/controllers/uploads_controller.rb | 71 -- app/controllers/users_controller.rb | 97 -- app/finders/README.md | 22 - app/finders/groups_finder.rb | 38 - app/finders/issuable_finder.rb | 160 --- app/finders/issues_finder.rb | 22 - app/finders/merge_requests_finder.rb | 22 - app/finders/notes_finder.rb | 27 - app/finders/projects_finder.rb | 89 -- app/finders/snippets_finder.rb | 63 -- app/finders/trending_projects_finder.rb | 19 - app/helpers/appearances_helper.rb | 21 - app/helpers/application_helper.rb | 325 ------ app/helpers/application_settings_helper.rb | 38 - app/helpers/blob_helper.rb | 72 -- app/helpers/branches_helper.rb | 17 - app/helpers/broadcast_messages_helper.rb | 9 - app/helpers/commits_helper.rb | 183 --- app/helpers/compare_helper.rb | 22 - app/helpers/dashboard_helper.rb | 9 - app/helpers/diff_helper.rb | 157 --- app/helpers/emails_helper.rb | 38 - app/helpers/events_helper.rb | 199 ---- app/helpers/explore_helper.rb | 17 - app/helpers/external_wiki_helper.rb | 11 - app/helpers/git_helper.rb | 5 - app/helpers/gitlab_markdown_helper.rb | 275 ----- app/helpers/gitlab_routing_helper.rb | 55 - app/helpers/graph_helper.rb | 16 - app/helpers/groups_helper.rb | 59 - app/helpers/icons_helper.rb | 83 -- app/helpers/issues_helper.rb | 111 -- app/helpers/labels_helper.rb | 54 - app/helpers/merge_requests_helper.rb | 52 - app/helpers/milestones_helper.rb | 33 - app/helpers/namespaces_helper.rb | 36 - app/helpers/nav_helper.rb | 5 - app/helpers/notes_helper.rb | 85 -- app/helpers/notifications_helper.rb | 13 - app/helpers/oauth_helper.rb | 34 - app/helpers/profile_helper.rb | 13 - app/helpers/projects_helper.rb | 329 ------ app/helpers/search_helper.rb | 112 -- app/helpers/selects_helper.rb | 42 - app/helpers/snippets_helper.rb | 20 - app/helpers/sorting_helper.rb | 96 -- app/helpers/submodule_helper.rb | 74 -- app/helpers/tab_helper.rb | 123 -- app/helpers/tags_helper.rb | 14 - app/helpers/tree_helper.rb | 94 -- app/helpers/visibility_level_helper.rb | 67 -- app/helpers/wiki_helper.rb | 22 - app/mailers/.gitkeep | 0 app/mailers/emails/groups.rb | 52 - app/mailers/emails/issues.rb | 47 - app/mailers/emails/merge_requests.rb | 109 -- app/mailers/emails/notes.rb | 43 - app/mailers/emails/profile.rb | 23 - app/mailers/emails/projects.rb | 141 --- app/mailers/notify.rb | 167 --- app/models/.gitkeep | 0 app/models/ability.rb | 276 ----- app/models/application_setting.rb | 61 - app/models/broadcast_message.rb | 29 - app/models/commit.rb | 155 --- app/models/concerns/internal_id.rb | 17 - app/models/concerns/issuable.rb | 189 ---- app/models/concerns/mentionable.rb | 89 -- app/models/concerns/notifiable.rb | 15 - app/models/concerns/sortable.rb | 35 - app/models/concerns/taskable.rb | 51 - app/models/concerns/token_authenticatable.rb | 31 - app/models/deploy_key.rb | 38 - app/models/deploy_keys_project.rb | 29 - app/models/diff_line.rb | 3 - app/models/email.rb | 35 - app/models/event.rb | 330 ------ app/models/external_issue.rb | 25 - app/models/forked_project_link.rb | 15 - app/models/group.rb | 100 -- app/models/group_milestone.rb | 95 -- app/models/hooks/project_hook.rb | 25 - app/models/hooks/service_hook.rb | 20 - app/models/hooks/system_hook.rb | 19 - app/models/hooks/web_hook.rb | 60 - app/models/identity.rb | 19 - app/models/issue.rb | 78 -- app/models/key.rb | 86 -- app/models/label_link.rb | 19 - app/models/member.rb | 172 --- app/models/members/group_member.rb | 75 -- app/models/members/project_member.rb | 165 --- app/models/merge_request.rb | 368 ------ app/models/merge_request_diff.rb | 171 --- app/models/milestone.rb | 93 -- app/models/network/commit.rb | 35 - app/models/network/graph.rb | 267 ----- app/models/note.rb | 609 ---------- app/models/notification.rb | 60 - app/models/personal_snippet.rb | 19 - app/models/project_services/asana_service.rb | 127 --- .../project_services/assembla_service.rb | 56 - app/models/project_services/bamboo_service.rb | 137 --- .../project_services/buildkite_service.rb | 135 --- .../project_services/campfire_service.rb | 86 -- app/models/project_services/ci_service.rb | 57 - .../custom_issue_tracker_service.rb | 57 - .../emails_on_push_service.rb | 72 -- .../project_services/external_wiki_service.rb | 48 - .../project_services/flowdock_service.rb | 62 - .../project_services/gemnasium_service.rb | 61 - .../project_services/gitlab_ci_service.rb | 128 --- .../gitlab_issue_tracker_service.rb | 62 - .../project_services/hipchat_service.rb | 238 ---- app/models/project_services/irker_service.rb | 163 --- .../project_services/issue_tracker_service.rb | 125 -- app/models/project_services/jira_service.rb | 58 - .../pivotaltracker_service.rb | 72 -- .../project_services/pushover_service.rb | 125 -- .../project_services/redmine_service.rb | 44 - app/models/project_services/slack_service.rb | 105 -- .../slack_service/base_message.rb | 31 - .../slack_service/issue_message.rb | 56 - .../slack_service/merge_message.rb | 60 - .../slack_service/note_message.rb | 82 -- .../slack_service/push_message.rb | 110 -- .../project_services/teamcity_service.rb | 145 --- app/models/project_snippet.rb | 28 - app/models/project_team.rb | 169 --- app/models/project_wiki.rb | 149 --- app/models/protected_branch.rb | 23 - app/models/repository.rb | 377 ------ app/models/service.rb | 153 --- app/models/snippet.rb | 103 -- app/models/subscription.rb | 21 - app/models/tree.rb | 53 - app/models/user.rb | 614 ---------- app/models/users_star_project.rb | 19 - app/models/wiki_page.rb | 201 ---- app/services/archive_repository_service.rb | 62 - app/services/base_service.rb | 66 -- app/services/compare_service.rb | 27 - app/services/create_branch_service.rb | 42 - app/services/create_snippet_service.rb | 20 - app/services/create_tag_service.rb | 45 - app/services/delete_branch_service.rb | 56 - app/services/delete_tag_service.rb | 42 - app/services/event_create_service.rb | 84 -- app/services/files/base_service.rb | 17 - app/services/files/create_service.rb | 52 - app/services/files/delete_service.rb | 36 - app/services/files/update_service.rb | 39 - app/services/git_push_service.rb | 132 --- app/services/git_tag_push_service.rb | 37 - app/services/gravatar_service.rb | 30 - app/services/issuable_base_service.rb | 18 - app/services/issues/base_service.rb | 19 - app/services/issues/bulk_update_service.rb | 24 - app/services/issues/close_service.rb | 20 - app/services/issues/create_service.rb | 19 - app/services/issues/reopen_service.rb | 20 - app/services/issues/update_service.rb | 47 - .../merge_requests/auto_merge_service.rb | 30 - .../merge_requests/base_merge_service.rb | 10 - app/services/merge_requests/base_service.rb | 24 - app/services/merge_requests/build_service.rb | 74 -- app/services/merge_requests/close_service.rb | 18 - app/services/merge_requests/create_service.rb | 21 - app/services/merge_requests/merge_service.rb | 22 - .../merge_requests/refresh_service.rb | 94 -- app/services/merge_requests/reopen_service.rb | 16 - app/services/merge_requests/update_service.rb | 60 - app/services/milestones/base_service.rb | 4 - app/services/milestones/close_service.rb | 11 - app/services/milestones/create_service.rb | 13 - app/services/milestones/group_service.rb | 26 - app/services/milestones/reopen_service.rb | 11 - app/services/milestones/update_service.rb | 20 - app/services/notes/create_service.rb | 38 - app/services/notes/update_service.rb | 25 - app/services/notification_service.rb | 432 ------- .../oauth2/access_token_validation_service.rb | 41 - app/services/projects/autocomplete_service.rb | 15 - app/services/projects/create_service.rb | 96 -- app/services/projects/destroy_service.rb | 28 - app/services/projects/fork_service.rb | 66 -- app/services/projects/participants_service.rb | 50 - app/services/projects/transfer_service.rb | 74 -- app/services/projects/update_service.rb | 27 - app/services/projects/upload_service.rb | 28 - app/services/search/global_service.rb | 18 - app/services/search/project_service.rb | 15 - app/services/search/snippet_service.rb | 14 - app/services/system_hooks_service.rb | 98 -- app/services/test_hook_service.rb | 6 - app/services/update_snippet_service.rb | 22 - app/uploaders/attachment_uploader.rb | 26 - app/uploaders/avatar_uploader.rb | 32 - app/uploaders/file_uploader.rb | 48 - .../application_settings/_form.html.haml | 69 -- .../admin/application_settings/show.html.haml | 3 - .../admin/applications/_delete_form.html.haml | 4 - app/views/admin/applications/_form.html.haml | 26 - app/views/admin/applications/edit.html.haml | 3 - app/views/admin/applications/index.html.haml | 22 - app/views/admin/applications/new.html.haml | 3 - app/views/admin/applications/show.html.haml | 26 - .../admin/background_jobs/show.html.haml | 44 - .../admin/broadcast_messages/index.html.haml | 59 - app/views/admin/dashboard/index.html.haml | 137 --- app/views/admin/deploy_keys/index.html.haml | 27 - app/views/admin/deploy_keys/new.html.haml | 26 - app/views/admin/deploy_keys/show.html.haml | 34 - app/views/admin/groups/_form.html.haml | 27 - app/views/admin/groups/edit.html.haml | 3 - app/views/admin/groups/index.html.haml | 62 - app/views/admin/groups/new.html.haml | 3 - app/views/admin/groups/show.html.haml | 91 -- app/views/admin/hooks/index.html.haml | 37 - app/views/admin/keys/show.html.haml | 1 - app/views/admin/logs/show.html.haml | 25 - app/views/admin/projects/index.html.haml | 81 -- app/views/admin/projects/show.html.haml | 142 --- app/views/admin/services/_form.html.haml | 94 -- app/views/admin/services/edit.html.haml | 1 - app/views/admin/services/index.html.haml | 22 - app/views/admin/users/_form.html.haml | 90 -- app/views/admin/users/edit.html.haml | 7 - app/views/admin/users/index.html.haml | 88 -- app/views/admin/users/new.html.haml | 4 - app/views/admin/users/show.html.haml | 227 ---- app/views/dashboard/_activities.html.haml | 4 - app/views/dashboard/_projects.html.haml | 10 - app/views/dashboard/_sidebar.html.haml | 3 - .../_zero_authorized_projects.html.haml | 53 - app/views/dashboard/groups/index.html.haml | 40 - app/views/dashboard/issues.atom.builder | 13 - app/views/dashboard/issues.html.haml | 10 - app/views/dashboard/merge_requests.html.haml | 10 - .../dashboard/milestones/_issue.html.haml | 10 - .../dashboard/milestones/_issues.html.haml | 6 - .../milestones/_merge_request.html.haml | 10 - .../milestones/_merge_requests.html.haml | 6 - .../dashboard/milestones/_milestone.html.haml | 20 - .../dashboard/milestones/index.html.haml | 20 - app/views/dashboard/milestones/show.html.haml | 81 -- .../dashboard/projects/starred.html.haml | 23 - app/views/dashboard/show.atom.builder | 12 - app/views/dashboard/show.html.haml | 11 - app/views/devise/confirmations/new.html.haml | 14 - .../mailer/confirmation_instructions.html.erb | 9 - .../reset_password_instructions.html.erb | 8 - .../mailer/unlock_instructions.html.erb | 7 - app/views/devise/passwords/edit.html.haml | 19 - app/views/devise/passwords/new.html.haml | 14 - app/views/devise/registrations/edit.html.erb | 28 - app/views/devise/registrations/new.html.haml | 3 - app/views/devise/sessions/_new_base.html.haml | 12 - app/views/devise/sessions/_new_ldap.html.haml | 4 - app/views/devise/sessions/new.html.haml | 18 - app/views/devise/shared/_links.erb | 19 - .../devise/shared/_omniauth_box.html.haml | 10 - .../devise/shared/_sign_in_link.html.haml | 5 - app/views/devise/shared/_signin_box.html.haml | 26 - app/views/devise/shared/_signup_box.html.haml | 27 - app/views/devise/unlocks/new.html.erb | 12 - .../applications/_delete_form.html.haml | 4 - .../doorkeeper/applications/_form.html.haml | 24 - .../doorkeeper/applications/edit.html.haml | 2 - .../doorkeeper/applications/index.html.haml | 16 - .../doorkeeper/applications/new.html.haml | 2 - .../doorkeeper/applications/show.html.haml | 26 - .../doorkeeper/authorizations/error.html.haml | 3 - .../doorkeeper/authorizations/new.html.haml | 28 - .../doorkeeper/authorizations/show.html.haml | 3 - .../_delete_form.html.haml | 4 - .../authorized_applications/index.html.haml | 16 - app/views/errors/access_denied.html.haml | 5 - app/views/errors/encoding.html.haml | 4 - app/views/errors/git_not_found.html.haml | 6 - app/views/errors/not_found.html.haml | 4 - app/views/errors/omniauth_error.html.haml | 12 - app/views/events/_commit.html.haml | 5 - app/views/events/_event.html.haml | 16 - app/views/events/_event_issue.atom.haml | 3 - app/views/events/_event_last_push.html.haml | 14 - .../events/_event_merge_request.atom.haml | 3 - app/views/events/_event_note.atom.haml | 2 - app/views/events/_event_push.atom.haml | 14 - app/views/events/_events.html.haml | 1 - app/views/events/event/_common.html.haml | 18 - .../events/event/_created_project.html.haml | 27 - app/views/events/event/_note.html.haml | 26 - app/views/events/event/_push.html.haml | 31 - app/views/explore/groups/index.html.haml | 50 - app/views/explore/projects/_filter.html.haml | 67 -- app/views/explore/projects/_project.html.haml | 24 - app/views/explore/projects/index.html.haml | 11 - app/views/explore/projects/starred.html.haml | 10 - app/views/explore/projects/trending.html.haml | 11 - app/views/groups/_projects.html.haml | 10 - app/views/groups/_settings_nav.html.haml | 11 - app/views/groups/edit.html.haml | 37 - .../group_members/_group_member.html.haml | 54 - .../group_members/_new_group_member.html.haml | 18 - .../groups/group_members/index.html.haml | 43 - app/views/groups/group_members/update.js.haml | 2 - app/views/groups/issues.atom.builder | 13 - app/views/groups/issues.html.haml | 14 - app/views/groups/merge_requests.html.haml | 13 - app/views/groups/milestones/_issue.html.haml | 10 - app/views/groups/milestones/_issues.html.haml | 6 - .../milestones/_merge_request.html.haml | 10 - .../milestones/_merge_requests.html.haml | 6 - .../groups/milestones/_milestone.html.haml | 25 - app/views/groups/milestones/index.html.haml | 22 - app/views/groups/milestones/show.html.haml | 87 -- app/views/groups/new.html.haml | 19 - app/views/groups/projects.html.haml | 25 - app/views/groups/show.atom.builder | 12 - app/views/groups/show.html.haml | 22 - app/views/help/_shortcuts.html.haml | 209 ---- app/views/help/index.html.haml | 50 - app/views/help/shortcuts.js.haml | 3 - app/views/help/ui.html.haml | 227 ---- app/views/import/base/create.js.haml | 25 - app/views/import/bitbucket/status.html.haml | 45 - app/views/import/github/status.html.haml | 45 - app/views/import/gitlab/status.html.haml | 45 - app/views/import/gitorious/status.html.haml | 45 - app/views/import/google_code/new.html.haml | 60 - app/views/import/google_code/status.html.haml | 49 - app/views/invites/show.html.haml | 29 - .../kaminari/gitlab/_first_page.html.haml | 9 - app/views/kaminari/gitlab/_gap.html.haml | 9 - .../kaminari/gitlab/_last_page.html.haml | 9 - .../kaminari/gitlab/_next_page.html.haml | 9 - app/views/kaminari/gitlab/_page.html.haml | 10 - .../kaminari/gitlab/_paginator.html.haml | 17 - .../kaminari/gitlab/_prev_page.html.haml | 9 - app/views/layouts/_broadcast.html.haml | 4 - app/views/layouts/_collapse_button.html.haml | 4 - app/views/layouts/_flash.html.haml | 8 - app/views/layouts/_google_analytics.html.haml | 10 - app/views/layouts/_head.html.haml | 28 - app/views/layouts/_head_panel.html.haml | 48 - .../layouts/_init_auto_complete.html.haml | 3 - app/views/layouts/_page.html.haml | 23 - app/views/layouts/_page_title.html.haml | 2 - app/views/layouts/_piwik.html.haml | 12 - .../layouts/_public_head_panel.html.haml | 22 - app/views/layouts/_search.html.haml | 28 - app/views/layouts/admin.html.haml | 6 - app/views/layouts/application.html.haml | 6 - app/views/layouts/devise.html.haml | 35 - app/views/layouts/errors.html.haml | 9 - app/views/layouts/explore.html.haml | 30 - app/views/layouts/group.html.haml | 6 - app/views/layouts/nav/_admin.html.haml | 65 -- app/views/layouts/nav/_dashboard.html.haml | 38 - app/views/layouts/nav/_group.html.haml | 42 - app/views/layouts/nav/_profile.html.haml | 50 - app/views/layouts/nav/_project.html.haml | 97 -- app/views/layouts/navless.html.haml | 10 - app/views/layouts/notify.html.haml | 42 - app/views/layouts/profile.html.haml | 6 - app/views/layouts/project_settings.html.haml | 8 - app/views/layouts/projects.html.haml | 7 - app/views/layouts/public_group.html.haml | 6 - app/views/layouts/public_projects.html.haml | 6 - app/views/layouts/public_users.html.haml | 6 - app/views/layouts/search.html.haml | 10 - app/views/notify/_note_message.html.haml | 2 - .../_reassigned_issuable_email.html.haml | 10 - .../_reassigned_issuable_email.text.erb | 6 - app/views/notify/closed_issue_email.html.haml | 2 - app/views/notify/closed_issue_email.text.haml | 3 - .../closed_merge_request_email.html.haml | 2 - .../closed_merge_request_email.text.haml | 8 - .../group_access_granted_email.html.haml | 4 - .../group_access_granted_email.text.erb | 4 - .../group_invite_accepted_email.html.haml | 6 - .../group_invite_accepted_email.text.erb | 3 - .../group_invite_declined_email.html.haml | 5 - .../group_invite_declined_email.text.erb | 3 - .../group_member_invited_email.html.haml | 14 - .../group_member_invited_email.text.erb | 4 - .../issue_status_changed_email.html.haml | 2 - .../issue_status_changed_email.text.erb | 4 - .../merge_request_status_email.html.haml | 2 - .../merge_request_status_email.text.haml | 8 - .../merged_merge_request_email.html.haml | 2 - .../merged_merge_request_email.text.haml | 8 - app/views/notify/new_email_email.html.haml | 10 - app/views/notify/new_email_email.text.erb | 7 - app/views/notify/new_issue_email.html.haml | 6 - app/views/notify/new_issue_email.text.erb | 5 - .../notify/new_merge_request_email.html.haml | 9 - .../notify/new_merge_request_email.text.erb | 8 - app/views/notify/new_ssh_key_email.html.haml | 10 - app/views/notify/new_ssh_key_email.text.erb | 7 - app/views/notify/new_user_email.html.haml | 14 - app/views/notify/new_user_email.text.erb | 8 - app/views/notify/note_commit_email.html.haml | 2 - app/views/notify/note_commit_email.text.erb | 9 - app/views/notify/note_issue_email.html.haml | 1 - app/views/notify/note_issue_email.text.erb | 9 - .../notify/note_merge_request_email.html.haml | 7 - .../notify/note_merge_request_email.text.erb | 9 - .../project_access_granted_email.html.haml | 5 - .../project_access_granted_email.text.erb | 4 - .../project_invite_accepted_email.html.haml | 6 - .../project_invite_accepted_email.text.erb | 3 - .../project_invite_declined_email.html.haml | 5 - .../project_invite_declined_email.text.erb | 3 - .../project_member_invited_email.html.haml | 13 - .../project_member_invited_email.text.erb | 4 - .../notify/project_was_moved_email.html.haml | 15 - .../notify/project_was_moved_email.text.erb | 10 - .../notify/reassigned_issue_email.html.haml | 1 - .../notify/reassigned_issue_email.text.erb | 1 - .../reassigned_merge_request_email.html.haml | 1 - .../reassigned_merge_request_email.text.erb | 1 - .../notify/repository_push_email.html.haml | 66 -- .../notify/repository_push_email.text.haml | 49 - app/views/profiles/accounts/show.html.haml | 77 -- app/views/profiles/applications.html.haml | 49 - app/views/profiles/design.html.haml | 53 - app/views/profiles/emails/index.html.haml | 41 - app/views/profiles/history.html.haml | 10 - app/views/profiles/keys/_form.html.haml | 21 - app/views/profiles/keys/_key.html.haml | 12 - .../profiles/keys/_key_details.html.haml | 22 - app/views/profiles/keys/_key_table.html.haml | 19 - app/views/profiles/keys/index.html.haml | 10 - app/views/profiles/keys/new.html.haml | 16 - app/views/profiles/keys/show.html.haml | 1 - .../notifications/_settings.html.haml | 17 - .../profiles/notifications/show.html.haml | 78 -- .../profiles/notifications/update.js.haml | 6 - app/views/profiles/passwords/edit.html.haml | 38 - app/views/profiles/passwords/new.html.haml | 26 - app/views/profiles/show.html.haml | 110 -- app/views/profiles/update.js.erb | 9 - app/views/profiles/update_username.js.haml | 6 - .../_bitbucket_import_modal.html.haml | 13 - app/views/projects/_commit_button.html.haml | 6 - app/views/projects/_dropdown.html.haml | 37 - app/views/projects/_errors.html.haml | 4 - .../projects/_github_import_modal.html.haml | 13 - .../projects/_gitlab_import_modal.html.haml | 13 - app/views/projects/_home_panel.html.haml | 43 - app/views/projects/_issuable_form.html.haml | 87 -- app/views/projects/_md_preview.html.haml | 13 - app/views/projects/_settings_nav.html.haml | 31 - .../projects/_visibility_level.html.haml | 27 - app/views/projects/_zen.html.haml | 10 - app/views/projects/blame/show.html.haml | 35 - app/views/projects/blob/_actions.html.haml | 22 - app/views/projects/blob/_blob.html.haml | 37 - app/views/projects/blob/_download.html.haml | 7 - app/views/projects/blob/_editor.html.haml | 25 - app/views/projects/blob/_image.html.haml | 2 - app/views/projects/blob/_remove.html.haml | 22 - app/views/projects/blob/_text.html.haml | 13 - app/views/projects/blob/diff.html.haml | 19 - app/views/projects/blob/edit.html.haml | 31 - app/views/projects/blob/new.html.haml | 19 - app/views/projects/blob/preview.html.haml | 25 - app/views/projects/blob/show.html.haml | 8 - app/views/projects/branches/_branch.html.haml | 29 - app/views/projects/branches/destroy.js.haml | 1 - app/views/projects/branches/index.html.haml | 31 - app/views/projects/branches/new.html.haml | 28 - .../projects/commit/_commit_box.html.haml | 52 - app/views/projects/commit/branches.html.haml | 16 - app/views/projects/commit/show.html.haml | 3 - app/views/projects/commits/_commit.html.haml | 33 - .../projects/commits/_commit_list.html.haml | 11 - app/views/projects/commits/_commits.html.haml | 15 - app/views/projects/commits/_head.html.haml | 17 - .../projects/commits/_inline_commit.html.haml | 8 - app/views/projects/commits/show.atom.builder | 23 - app/views/projects/commits/show.html.haml | 23 - app/views/projects/compare/_form.html.haml | 29 - app/views/projects/compare/index.html.haml | 16 - app/views/projects/compare/show.html.haml | 23 - .../deploy_keys/_deploy_key.html.haml | 36 - .../projects/deploy_keys/_form.html.haml | 23 - .../projects/deploy_keys/index.html.haml | 41 - app/views/projects/deploy_keys/new.html.haml | 4 - app/views/projects/deploy_keys/show.html.haml | 13 - app/views/projects/diffs/_diffs.html.haml | 23 - app/views/projects/diffs/_file.html.haml | 50 - app/views/projects/diffs/_image.html.haml | 64 -- .../projects/diffs/_match_line.html.haml | 7 - .../diffs/_match_line_parallel.html.haml | 4 - .../projects/diffs/_parallel_view.html.haml | 41 - app/views/projects/diffs/_stats.html.haml | 38 - app/views/projects/diffs/_text_file.html.haml | 36 - app/views/projects/diffs/_warning.html.haml | 19 - app/views/projects/edit.html.haml | 206 ---- app/views/projects/empty.html.haml | 49 - app/views/projects/forks/error.html.haml | 20 - app/views/projects/forks/new.html.haml | 39 - app/views/projects/go_import.html.haml | 5 - app/views/projects/graphs/_head.html.haml | 5 - app/views/projects/graphs/commits.html.haml | 85 -- app/views/projects/graphs/show.html.haml | 37 - app/views/projects/hooks/index.html.haml | 68 -- app/views/projects/imports/new.html.haml | 21 - app/views/projects/imports/show.html.haml | 9 - .../projects/issues/_discussion.html.haml | 33 - app/views/projects/issues/_form.html.haml | 14 - app/views/projects/issues/_issue.html.haml | 52 - .../projects/issues/_issue_context.html.haml | 46 - app/views/projects/issues/_issues.html.haml | 13 - app/views/projects/issues/edit.html.haml | 1 - app/views/projects/issues/index.atom.builder | 12 - app/views/projects/issues/index.html.haml | 19 - app/views/projects/issues/new.html.haml | 1 - app/views/projects/issues/show.html.haml | 40 - app/views/projects/issues/update.js.haml | 17 - app/views/projects/labels/_label.html.haml | 10 - app/views/projects/labels/destroy.js.haml | 2 - app/views/projects/labels/edit.html.haml | 8 - app/views/projects/labels/index.html.haml | 15 - app/views/projects/labels/new.html.haml | 6 - .../merge_requests/_discussion.html.haml | 31 - .../projects/merge_requests/_form.html.haml | 12 - .../projects/merge_requests/_head.html.haml | 5 - .../merge_requests/_merge_request.html.haml | 48 - .../merge_requests/_merge_requests.html.haml | 13 - .../merge_requests/_new_compare.html.haml | 89 -- .../merge_requests/_new_submit.html.haml | 123 -- .../projects/merge_requests/_show.html.haml | 77 -- .../projects/merge_requests/automerge.js.haml | 6 - .../merge_requests/branch_from.js.haml | 2 - .../projects/merge_requests/branch_to.js.haml | 2 - .../projects/merge_requests/diffs.html.haml | 1 - .../projects/merge_requests/edit.html.haml | 4 - .../projects/merge_requests/index.html.haml | 11 - .../projects/merge_requests/invalid.html.haml | 23 - .../projects/merge_requests/new.html.haml | 4 - .../projects/merge_requests/show.html.haml | 1 - .../merge_requests/show/_commits.html.haml | 1 - .../merge_requests/show/_context.html.haml | 48 - .../merge_requests/show/_diffs.html.haml | 12 - .../show/_how_to_merge.html.haml | 53 - .../merge_requests/show/_mr_accept.html.haml | 74 -- .../merge_requests/show/_mr_box.html.haml | 9 - .../merge_requests/show/_mr_ci.html.haml | 34 - .../merge_requests/show/_mr_title.html.haml | 22 - .../merge_requests/show/_no_accept.html.haml | 14 - .../show/_participants.html.haml | 4 - .../show/_remove_source_branch.html.haml | 17 - .../show/_state_widget.html.haml | 50 - .../projects/merge_requests/update.js.haml | 8 - .../merge_requests/update_branches.js.haml | 9 - app/views/projects/milestones/_form.html.haml | 54 - .../projects/milestones/_issue.html.haml | 9 - .../projects/milestones/_issues.html.haml | 6 - .../milestones/_merge_request.html.haml | 8 - .../milestones/_merge_requests.html.haml | 6 - .../projects/milestones/_milestone.html.haml | 24 - app/views/projects/milestones/edit.html.haml | 1 - app/views/projects/milestones/index.html.haml | 17 - app/views/projects/milestones/new.html.haml | 1 - app/views/projects/milestones/show.html.haml | 103 -- app/views/projects/milestones/update.js.haml | 2 - app/views/projects/network/_head.html.haml | 3 - app/views/projects/network/show.html.haml | 26 - app/views/projects/network/show.json.erb | 23 - app/views/projects/new.html.haml | 120 -- app/views/projects/no_repo.html.haml | 22 - .../notes/_commit_discussion.html.haml | 0 .../notes/_diff_notes_with_reply.html.haml | 13 - .../_diff_notes_with_reply_parallel.html.haml | 34 - .../projects/notes/_discussion.html.haml | 13 - app/views/projects/notes/_edit_form.html.haml | 15 - app/views/projects/notes/_form.html.haml | 24 - .../projects/notes/_form_errors.html.haml | 3 - app/views/projects/notes/_note.html.haml | 71 -- app/views/projects/notes/_notes.html.haml | 11 - .../projects/notes/_notes_with_form.html.haml | 10 - .../notes/discussions/_active.html.haml | 20 - .../notes/discussions/_commit.html.haml | 27 - .../notes/discussions/_diff.html.haml | 29 - .../notes/discussions/_outdated.html.haml | 19 - .../project_members/_group_members.html.haml | 16 - .../_new_project_member.html.haml | 18 - .../project_members/_project_member.html.haml | 53 - .../projects/project_members/_team.html.haml | 11 - .../projects/project_members/import.html.haml | 14 - .../projects/project_members/index.html.haml | 35 - .../projects/project_members/update.js.haml | 3 - .../_branches_list.html.haml | 34 - .../protected_branches/index.html.haml | 35 - app/views/projects/refs/logs_tree.js.haml | 19 - .../repositories/_download_archive.html.haml | 37 - .../projects/repositories/_feed.html.haml | 18 - app/views/projects/services/_form.html.haml | 106 -- app/views/projects/services/edit.html.haml | 1 - app/views/projects/services/index.html.haml | 22 - app/views/projects/show.html.haml | 108 -- .../projects/snippets/_snippet.html.haml | 15 - app/views/projects/snippets/edit.html.haml | 4 - app/views/projects/snippets/index.html.haml | 15 - app/views/projects/snippets/new.html.haml | 4 - app/views/projects/snippets/show.html.haml | 37 - app/views/projects/tags/_tag.html.haml | 22 - app/views/projects/tags/destroy.js.haml | 3 - app/views/projects/tags/index.html.haml | 30 - app/views/projects/tags/new.html.haml | 34 - app/views/projects/transfer.js.haml | 2 - app/views/projects/tree/_blob_item.html.haml | 8 - app/views/projects/tree/_readme.html.haml | 7 - app/views/projects/tree/_spinner.html.haml | 3 - .../projects/tree/_submodule_item.html.haml | 6 - app/views/projects/tree/_tree.html.haml | 53 - .../tree/_tree_commit_column.html.haml | 3 - app/views/projects/tree/_tree_item.html.haml | 9 - app/views/projects/tree/show.html.haml | 9 - app/views/projects/update.js.haml | 9 - app/views/projects/wikis/_form.html.haml | 46 - .../projects/wikis/_main_links.html.haml | 8 - app/views/projects/wikis/_nav.html.haml | 19 - app/views/projects/wikis/_new.html.haml | 14 - app/views/projects/wikis/edit.html.haml | 13 - app/views/projects/wikis/empty.html.haml | 4 - app/views/projects/wikis/git_access.html.haml | 31 - app/views/projects/wikis/history.html.haml | 30 - app/views/projects/wikis/pages.html.haml | 12 - app/views/projects/wikis/show.html.haml | 20 - app/views/search/_filter.html.haml | 35 - app/views/search/_global_filter.html.haml | 16 - app/views/search/_project_filter.html.haml | 32 - app/views/search/_results.html.haml | 28 - app/views/search/_snippet_filter.html.haml | 13 - app/views/search/results/_blob.html.haml | 9 - app/views/search/results/_empty.html.haml | 4 - app/views/search/results/_issue.html.haml | 14 - .../search/results/_merge_request.html.haml | 16 - app/views/search/results/_note.html.haml | 26 - app/views/search/results/_project.html.haml | 6 - .../search/results/_snippet_blob.html.haml | 59 - .../search/results/_snippet_title.html.haml | 23 - app/views/search/results/_wiki_blob.html.haml | 9 - app/views/search/show.html.haml | 22 - .../_choose_group_avatar_button.html.haml | 7 - app/views/shared/_clone_panel.html.haml | 23 - .../_commit_message_container.html.haml | 14 - app/views/shared/_confirm_modal.html.haml | 22 - app/views/shared/_event_filter.html.haml | 19 - app/views/shared/_file_highlight.html.haml | 11 - app/views/shared/_group_form.html.haml | 29 - app/views/shared/_group_tips.html.haml | 6 - app/views/shared/_issuable_filter.html.haml | 58 - .../shared/_issuable_search_form.html.haml | 9 - app/views/shared/_issues.html.haml | 15 - app/views/shared/_merge_requests.html.haml | 14 - app/views/shared/_milestones_filter.html.haml | 14 - app/views/shared/_no_password.html.haml | 8 - app/views/shared/_no_ssh.html.haml | 8 - app/views/shared/_outdated_browser.html.haml | 8 - app/views/shared/_project.html.haml | 21 - app/views/shared/_projects_list.html.haml | 17 - app/views/shared/_promo.html.haml | 5 - app/views/shared/_ref_switcher.html.haml | 7 - app/views/shared/_sort_dropdown.html.haml | 22 - app/views/shared/snippets/_blob.html.haml | 14 - app/views/shared/snippets/_form.html.haml | 41 - .../snippets/_visibility_level.html.haml | 27 - app/views/snippets/_snippet.html.haml | 23 - app/views/snippets/_snippets.html.haml | 7 - .../snippets/current_user_index.html.haml | 39 - app/views/snippets/edit.html.haml | 4 - app/views/snippets/index.html.haml | 17 - app/views/snippets/new.html.haml | 4 - app/views/snippets/show.html.haml | 43 - app/views/snippets/user_index.html.haml | 13 - app/views/users/_groups.html.haml | 4 - app/views/users/_profile.html.haml | 31 - app/views/users/_projects.html.haml | 13 - app/views/users/calendar.html.haml | 12 - app/views/users/calendar_activities.html.haml | 23 - app/views/users/show.atom.builder | 12 - app/views/users/show.html.haml | 50 - app/views/votes/_votes_block.html.haml | 10 - app/views/votes/_votes_inline.html.haml | 9 - app/workers/auto_merge_worker.rb | 13 - app/workers/emails_on_push_worker.rb | 61 - app/workers/fork_registration_worker.rb | 12 - app/workers/gitlab_shell_worker.rb | 10 - app/workers/irker_worker.rb | 169 --- app/workers/post_receive.rb | 62 - app/workers/project_service_worker.rb | 10 - app/workers/project_web_hook_worker.rb | 10 - app/workers/repository_archive_worker.rb | 43 - app/workers/repository_import_worker.rb | 34 - app/workers/system_hook_worker.rb | 9 - bin/background_jobs | 80 -- bin/bundle | 3 - bin/check | 2 - bin/guard | 16 - bin/pkgr_before_precompile.sh | 20 - bin/rails | 8 - bin/rake | 8 - bin/rspec | 7 - bin/spinach | 7 - bin/spring | 18 - bin/upgrade.rb | 3 - bin/web | 49 - config.ru | 16 - config/application.rb | 104 -- config/aws.yml.example | 19 - config/boot.rb | 6 - config/database.yml.mysql | 42 - config/database.yml.postgresql | 45 - config/environment.rb | 5 - config/environments/development.rb | 34 - config/environments/production.rb | 80 -- config/environments/test.rb | 33 - config/gitlab.teatro.yml | 86 -- config/gitlab.yml.example | 337 ------ config/initializers/1_settings.rb | 206 ---- config/initializers/2_app.rb | 8 - config/initializers/3_grit_ext.rb | 5 - config/initializers/4_sidekiq.rb | 27 - config/initializers/5_backend.rb | 15 - config/initializers/6_rack_profiler.rb | 8 - config/initializers/7_omniauth.rb | 12 - config/initializers/backtrace_silencers.rb | 7 - config/initializers/carrierwave.rb | 41 - config/initializers/devise.rb | 246 ---- config/initializers/devise_async.rb | 1 - .../devise_password_length.rb.example | 6 - .../initializers/disable_email_interceptor.rb | 2 - .../initializers/gitlab_shell_secret_token.rb | 19 - config/initializers/haml.rb | 1 - config/initializers/inflections.rb | 31 - config/initializers/kaminari_config.rb | 10 - config/initializers/postgresql_limit_fix.rb | 26 - config/initializers/public_key.rb | 2 - config/initializers/rack_attack.rb.example | 26 - .../rack_attack_git_basic_auth.rb | 12 - config/initializers/redis-store-fix-expiry.rb | 44 - config/initializers/secret_token.rb | 26 - config/initializers/session_store.rb | 11 - config/initializers/smtp_settings.rb.sample | 22 - config/initializers/state_machine_patch.rb | 9 - config/initializers/static_files.rb | 15 - config/initializers/time_zone.rb | 1 - config/initializers/wrap_parameters.rb | 14 - config/locales/devise.en.yml | 60 - config/locales/doorkeeper.en.yml | 73 -- config/locales/en.yml | 10 - config/newrelic.yml | 16 - config/resque.yml.example | 3 - config/unicorn.rb.example | 123 -- config/unicorn.rb.example.development | 2 - db/fixtures/development/01_admin.rb | 13 - db/fixtures/development/04_project.rb | 52 - db/fixtures/development/05_users.rb | 32 - db/fixtures/development/06_teams.rb | 21 - db/fixtures/development/07_milestones.rb | 16 - db/fixtures/development/09_issues.rb | 16 - db/fixtures/development/10_merge_requests.rb | 41 - db/fixtures/development/11_keys.rb | 12 - db/fixtures/development/12_snippets.rb | 40 - db/fixtures/development/13_comments.rb | 31 - db/fixtures/production/001_admin.rb | 31 - db/fixtures/test/001_repo.rb | 0 db/migrate/20121220064453_init_schema.rb | 306 ----- ...055_rename_owner_to_creator_for_project.rb | 5 - .../20130110172407_add_public_to_project.rb | 5 - ...123114545_add_issues_tracker_to_project.rb | 5 - .../20130125090214_add_user_permissions.rb | 11 - ...070232_remove_private_flag_from_project.rb | 9 - ...206084024_add_description_to_namsespace.rb | 5 - ...20130207104426_add_description_to_teams.rb | 5 - ...085435_add_issues_tracker_id_to_project.rb | 5 - ...name_state_to_merge_status_in_milestone.rb | 5 - .../20130218140952_add_state_to_issue.rb | 5 - ...130218141038_add_state_to_merge_request.rb | 5 - .../20130218141117_add_state_to_milestone.rb | 5 - ...141258_convert_closed_to_state_in_issue.rb | 14 - ...onvert_closed_to_state_in_merge_request.rb | 16 - ...44_convert_closed_to_state_in_milestone.rb | 14 - ...141444_remove_merged_from_merge_request.rb | 9 - ...20130218141507_remove_closed_from_issue.rb | 9 - ...141536_remove_closed_from_merge_request.rb | 9 - ...0218141554_remove_closed_from_milestone.rb | 9 - ...4_add_new_merge_status_to_merge_request.rb | 5 - ...4_convert_merge_status_in_merge_request.rb | 17 - ..._remove_merge_status_from_merge_request.rb | 9 - ...rge_status_to_merge_status_in_milestone.rb | 5 - .../20130304104623_add_state_to_user.rb | 5 - ...20130304104740_convert_blocked_to_state.rb | 14 - ...20130304105317_remove_blocked_from_user.rb | 9 - .../20130315124931_user_color_scheme.rb | 12 - ...20130318212250_add_snippets_to_features.rb | 5 - ...30319214458_create_forked_project_links.rb | 11 - .../20130323174317_add_private_to_snippets.rb | 5 - .../20130324151736_add_type_to_snippets.rb | 5 - ...7_change_project_id_to_null_in_snipepts.rb | 9 - ...30324203535_add_type_value_for_snippets.rb | 8 - ...25173941_add_notification_level_to_user.rb | 5 - ...add_index_to_users_authentication_token.rb | 5 - ...0_add_last_activity_column_into_project.rb | 21 - ..._add_notification_level_to_user_project.rb | 5 - .../20130410175022_remove_wiki_table.rb | 9 - .../20130419190306_allow_merges_for_forks.rb | 13 - db/migrate/20130506085413_add_type_to_key.rb | 5 - ...30506090604_create_deploy_keys_projects.rb | 10 - ...130506095501_remove_project_id_from_key.rb | 22 - ...130522141856_add_more_fields_to_service.rb | 6 - .../20130528184641_add_system_to_notes.rb | 16 - ...10815_increase_snippet_text_column_size.rb | 9 - ...165816_add_password_expires_at_to_users.rb | 5 - ...0130613173246_add_created_by_id_to_user.rb | 5 - .../20130614132337_add_improted_to_project.rb | 5 - .../20130617095603_create_users_groups.rb | 11 - ...23_add_notification_level_to_user_group.rb | 5 - .../20130622115340_add_more_db_index.rb | 12 - .../20130624162710_add_fingerprint_to_key.rb | 6 - .../20130804151314_add_st_diff_to_note.rb | 5 - ...0809124851_add_permission_check_to_user.rb | 5 - ...0130812143708_add_import_url_to_project.rb | 5 - ...82730_add_internal_ids_to_issues_and_mr.rb | 6 - ...20130821090530_remove_deprecated_tables.rb | 11 - ...21090531_add_internal_ids_to_milestones.rb | 5 - ...132950_add_description_to_merge_request.rb | 5 - ...0130926081215_change_owner_id_for_group.rb | 9 - .../20131005191208_add_avatar_to_users.rb | 5 - ...20131009115346_add_confirmable_to_users.rb | 15 - .../20131106151520_remove_default_branch.rb | 9 - ...0131112114325_create_broadcast_messages.rb | 12 - ...220935_add_visibility_level_to_projects.rb | 13 - ...20131129154016_add_archived_to_projects.rb | 5 - ...dd_color_and_font_to_broadcast_messages.rb | 6 - ...202192556_add_event_fields_for_web_hook.rb | 7 - ...1214224427_add_hide_no_ssh_key_to_users.rb | 5 - ...0131217102743_add_recipients_to_service.rb | 5 - ...20140116231608_add_website_url_to_users.rb | 5 - ...140122112253_create_merge_request_diffs.rb | 12 - db/migrate/20140122114406_migrate_mr_diffs.rb | 9 - .../20140122122549_remove_m_rdiff_fields.rb | 21 - .../20140125162722_add_avatar_to_projects.rb | 5 - .../20140127170938_add_group_avatars.rb | 5 - db/migrate/20140209025651_create_emails.rb | 13 - .../20140214102325_add_api_key_to_services.rb | 5 - ...merge_request_diffs_on_merge_request_id.rb | 5 - ...3308_add_tag_push_hooks_to_project_hook.rb | 5 - ...0312145357_add_import_status_to_project.rb | 5 - ...92127_migrate_already_imported_projects.rb | 12 - db/migrate/20140407135544_fix_namespaces.rb | 10 - ...tate_to_allow_empty_merge_request_diffs.rb | 11 - db/migrate/20140415124820_limits_to_mysql.rb | 1 - db/migrate/20140416074002_add_index_on_iid.rb | 32 - ...40416185734_index_on_current_sign_in_at.rb | 5 - ...140428105831_add_notes_index_updated_at.rb | 5 - .../20140502115131_add_repo_size_to_db.rb | 5 - .../20140502125220_migrate_repo_size.rb | 21 - ...611135229_add_position_to_merge_request.rb | 5 - ...140625115202_create_users_star_projects.rb | 15 - db/migrate/20140729134820_create_labels.rb | 11 - .../20140729140420_create_label_links.rb | 11 - .../20140729145339_migrate_project_tags.rb | 9 - .../20140729152420_migrate_taggable_labels.rb | 35 - .../20140730111702_add_index_to_labels.rb | 7 - .../20140903115954_migrate_to_new_shell.rb | 10 - ...0907220153_serialize_service_properties.rb | 42 - .../20140914113604_add_members_table.rb | 19 - ...0914145549_migrate_to_new_members_model.rb | 11 - ...20140914173417_remove_old_member_tables.rb | 26 - ...006143943_move_slack_service_to_webhook.rb | 17 - ...7100818_add_visibility_level_to_snippet.rb | 21 - ...0141121133009_add_timestamps_to_members.rb | 15 - .../20141121161704_add_identity_table.rb | 46 - ...05134006_add_locked_at_to_merge_request.rb | 5 - ...20141216155758_create_doorkeeper_tables.rb | 42 - ...20141217125223_add_owner_to_application.rb | 7 - ...135007_add_import_data_to_project_table.rb | 8 - ...velopers_can_push_to_protected_branches.rb | 5 - ...50108073740_create_application_settings.rb | 13 - ..._home_page_url_for_application_settings.rb | 5 - ...6234545_add_gitlab_access_token_to_user.rb | 5 - ...0_add_default_branch_protection_setting.rb | 5 - ...0205211843_add_timestamps_to_identities.rb | 5 - .../20150206181414_add_index_to_created_at.rb | 16 - ...06222854_add_notification_email_to_user.rb | 11 - .../20150209222013_add_missing_index.rb | 5 - .../20150211172122_add_template_to_service.rb | 5 - ...74341_allow_null_in_services_project_id.rb | 5 - ...sharing_enabled_to_application_settings.rb | 5 - ...0213114800_add_hide_no_password_to_user.rb | 5 - ..._add_password_automatically_set_to_user.rb | 5 - ...tbucket_access_token_and_secret_to_user.rb | 6 - .../20150219004514_add_events_to_services.rb | 8 - ...0223022001_set_missing_last_activity_at.rb | 8 - ...50225065047_add_note_events_to_services.rb | 5 - ...sibility_levels_to_application_settings.rb | 5 - ...0150306023106_fix_namespace_duplication.rb | 21 - ...306023112_add_unique_index_to_namespace.rb | 9 - ...150313012111_create_subscriptions_table.rb | 16 - .../20150320234437_add_location_to_user.rb | 5 - ...55957_set_incorrect_assignee_id_to_null.rb | 6 - .../20150327122227_add_public_to_key.rb | 5 - ...150327150017_add_import_data_to_project.rb | 5 - ...attachment_size_to_application_settings.rb | 5 - ...0150406133311_add_invite_data_to_member.rb | 12 - db/migrate/20150411000035_fix_identities.rb | 45 - .../20150411180045_rename_buildbox_service.rb | 9 - ...0150413192223_add_public_email_to_users.rb | 5 - db/migrate/limits_to_mysql.rb | 10 - db/seeds.rb | 0 doc/README.md | 34 - doc/api/README.md | 209 ---- doc/api/branches.md | 192 ---- doc/api/commits.md | 158 --- doc/api/deploy_key_multiple_projects.md | 25 - doc/api/deploy_keys.md | 80 -- doc/api/groups.md | 178 --- doc/api/issues.md | 224 ---- doc/api/labels.md | 84 -- doc/api/merge_requests.md | 393 ------- doc/api/milestones.md | 87 -- doc/api/notes.md | 246 ---- doc/api/oauth2.md | 102 -- doc/api/project_snippets.md | 103 -- doc/api/projects.md | 713 ------------ doc/api/repositories.md | 252 ----- doc/api/repository_files.md | 109 -- doc/api/services.md | 46 - doc/api/session.md | 39 - doc/api/system_hooks.md | 70 -- doc/api/users.md | 394 ------- doc/customization/issue_closing.md | 36 - doc/customization/libravatar.md | 69 -- doc/customization/welcome_message.md | 38 - doc/development/README.md | 8 - doc/development/architecture.md | 188 --- doc/development/ci_setup.md | 46 - doc/development/gitlab_diagram_overview.odg | Bin 50512 -> 0 bytes doc/development/gitlab_diagram_overview.png | Bin 256612 -> 0 bytes doc/development/omnibus.md | 32 - doc/development/rake_tasks.md | 29 - doc/development/shell_commands.md | 179 --- doc/development/sidekiq_debugging.md | 14 - doc/development/ui_guide.md | 12 - doc/hooks/custom_hooks.md | 41 - doc/install/README.md | 6 - doc/install/database_mysql.md | 54 - doc/install/installation.md | 462 -------- doc/install/requirements.md | 109 -- doc/install/structure.md | 21 - doc/integration/README.md | 23 - doc/integration/bitbucket.md | 122 -- doc/integration/external-issue-tracker.md | 39 - doc/integration/github.md | 79 -- doc/integration/github_app.png | Bin 75297 -> 0 bytes doc/integration/gitlab.md | 84 -- doc/integration/gitlab_actions.png | Bin 17321 -> 0 bytes doc/integration/gitlab_app.png | Bin 55325 -> 0 bytes doc/integration/gitlab_buttons_in_gmail.md | 28 - doc/integration/google.md | 89 -- doc/integration/google_app.png | Bin 52669 -> 0 bytes doc/integration/jira-integration-points.png | Bin 67854 -> 0 bytes doc/integration/ldap.md | 148 --- doc/integration/oauth_provider.md | 35 - .../oauth_provider/admin_application.png | Bin 55533 -> 0 bytes .../oauth_provider/application_form.png | Bin 25075 -> 0 bytes .../oauth_provider/authorized_application.png | Bin 17260 -> 0 bytes .../oauth_provider/user_wide_applications.png | Bin 46238 -> 0 bytes doc/integration/omniauth.md | 127 --- doc/integration/redmine_configuration.png | Bin 118752 -> 0 bytes doc/integration/redmine_service_template.png | Bin 198077 -> 0 bytes doc/integration/shibboleth.md | 78 -- doc/integration/slack.md | 42 - doc/integration/twitter.md | 81 -- doc/integration/twitter_app_api_keys.png | Bin 72200 -> 0 bytes doc/integration/twitter_app_details.png | Bin 121621 -> 0 bytes doc/legal/README.md | 4 - ...corporate_contributor_license_agreement.md | 25 - ...ndividual_contributor_license_agreement.md | 25 - doc/logs/logs.md | 102 -- doc/markdown/markdown.md | 532 --------- doc/operations/README.md | 4 - doc/operations/cleaning_up_redis_sessions.md | 52 - doc/operations/sidekiq_memory_killer.md | 38 - doc/permissions/permissions.md | 55 - doc/project_services/bamboo.md | 60 - doc/project_services/hipchat.md | 54 - doc/project_services/irker.md | 46 - doc/project_services/project_services.md | 20 - doc/public_access/public_access.md | 44 - doc/raketasks/README.md | 9 - doc/raketasks/backup_hrz.png | Bin 21955 -> 0 bytes doc/raketasks/backup_restore.md | 240 ---- doc/raketasks/cleanup.md | 23 - doc/raketasks/features.md | 20 - doc/raketasks/import.md | 68 -- doc/raketasks/maintenance.md | 178 --- doc/raketasks/user_management.md | 49 - doc/raketasks/web_hooks.md | 45 - doc/release/README.md | 6 - doc/release/howto_rc1.md | 55 - doc/release/howto_update_guides.md | 55 - doc/release/master.md | 33 - doc/release/monthly.md | 212 ---- doc/release/patch.md | 55 - doc/release/security.md | 76 -- doc/security/README.md | 6 - doc/security/information_exclusivity.md | 9 - doc/security/password_length_limits.md | 11 - doc/security/rack_attack.md | 25 - doc/security/webhooks.md | 13 - doc/ssh/README.md | 73 -- doc/system_hooks/system_hooks.md | 180 --- doc/update/2.6-to-3.0.md | 62 - doc/update/2.9-to-3.0.md | 37 - doc/update/3.0-to-3.1.md | 97 -- doc/update/3.1-to-4.0.md | 90 -- doc/update/4.0-to-4.1.md | 56 - doc/update/4.1-to-4.2.md | 36 - doc/update/4.2-to-5.0.md | 211 ---- doc/update/5.0-to-5.1.md | 91 -- doc/update/5.1-to-5.2.md | 104 -- doc/update/5.1-to-5.4.md | 100 -- doc/update/5.1-to-6.0.md | 216 ---- doc/update/5.2-to-5.3.md | 86 -- doc/update/5.3-to-5.4.md | 90 -- doc/update/5.4-to-6.0.md | 149 --- doc/update/6.0-to-6.1.md | 108 -- doc/update/6.1-to-6.2.md | 122 -- doc/update/6.2-to-6.3.md | 108 -- doc/update/6.3-to-6.4.md | 90 -- doc/update/6.4-to-6.5.md | 96 -- doc/update/6.5-to-6.6.md | 97 -- doc/update/6.6-to-6.7.md | 109 -- doc/update/6.7-to-6.8.md | 122 -- doc/update/6.8-to-6.9.md | 103 -- doc/update/6.9-to-7.0.md | 141 --- doc/update/7.0-to-7.1.md | 138 --- doc/update/7.1-to-7.2.md | 137 --- doc/update/7.2-to-7.3.md | 145 --- doc/update/7.3-to-7.4.md | 197 ---- doc/update/7.4-to-7.5.md | 108 -- doc/update/7.5-to-7.6.md | 114 -- doc/update/7.6-to-7.7.md | 119 -- doc/update/7.7-to-7.8.md | 120 -- doc/update/7.8-to-7.9.md | 120 -- doc/update/README.md | 16 - doc/update/mysql_to_postgresql.md | 116 -- doc/update/patch_versions.md | 70 -- doc/update/upgrader.md | 76 -- doc/web_hooks/web_hooks.md | 218 ---- doc/workflow/README.md | 15 - .../authorization_for_merge_requests.md | 40 - doc/workflow/ci_mr.png | Bin 40065 -> 0 bytes doc/workflow/close_issue_mr.png | Bin 146292 -> 0 bytes doc/workflow/environment_branches.png | Bin 40210 -> 0 bytes doc/workflow/forking/branch_select.png | Bin 55352 -> 0 bytes doc/workflow/forking/fork_button.png | Bin 68271 -> 0 bytes doc/workflow/forking/groups.png | Bin 98109 -> 0 bytes doc/workflow/forking/merge_request.png | Bin 60597 -> 0 bytes doc/workflow/forking_workflow.md | 36 - doc/workflow/four_stages.png | Bin 20934 -> 0 bytes doc/workflow/git_pull.png | Bin 167056 -> 0 bytes doc/workflow/gitdashflow.png | Bin 184726 -> 0 bytes doc/workflow/github_flow.png | Bin 20600 -> 0 bytes doc/workflow/github_importer/importer.png | Bin 39335 -> 0 bytes .../github_importer/new_project_page.png | Bin 46276 -> 0 bytes doc/workflow/gitlab_flow.md | 316 ------ doc/workflow/gitlab_flow.png | Bin 90883 -> 0 bytes doc/workflow/gitlab_importer/importer.png | Bin 40778 -> 0 bytes .../gitlab_importer/new_project_page.png | Bin 72663 -> 0 bytes doc/workflow/good_commit.png | Bin 28433 -> 0 bytes doc/workflow/groups.md | 71 -- doc/workflow/groups/add_member_to_group.png | Bin 138184 -> 0 bytes doc/workflow/groups/group_dashboard.png | Bin 107332 -> 0 bytes .../groups/group_with_two_projects.png | Bin 129319 -> 0 bytes doc/workflow/groups/new_group_button.png | Bin 185406 -> 0 bytes doc/workflow/groups/new_group_form.png | Bin 106491 -> 0 bytes doc/workflow/groups/override_access_level.png | Bin 157193 -> 0 bytes .../groups/project_members_via_group.png | Bin 151339 -> 0 bytes doc/workflow/groups/transfer_project.png | Bin 164958 -> 0 bytes doc/workflow/import_projects_from_github.md | 13 - .../import_projects_from_gitlab_com.md | 18 - doc/workflow/labels.md | 16 - doc/workflow/labels/label1.png | Bin 5846 -> 0 bytes doc/workflow/labels/label2.png | Bin 16931 -> 0 bytes doc/workflow/labels/label3.png | Bin 19360 -> 0 bytes doc/workflow/merge_commits.png | Bin 41422 -> 0 bytes doc/workflow/merge_request.png | Bin 169503 -> 0 bytes doc/workflow/messy_flow.png | Bin 33829 -> 0 bytes doc/workflow/migrating_from_svn.md | 17 - doc/workflow/mr_inline_comments.png | Bin 193311 -> 0 bytes doc/workflow/notifications.md | 71 -- doc/workflow/notifications/settings.png | Bin 114727 -> 0 bytes doc/workflow/production_branch.png | Bin 21716 -> 0 bytes doc/workflow/project_features.md | 35 - doc/workflow/protected_branches.md | 33 - .../protected_branches1.png | Bin 170113 -> 0 bytes .../protected_branches2.png | Bin 25851 -> 0 bytes doc/workflow/rebase.png | Bin 123041 -> 0 bytes doc/workflow/release_branches.png | Bin 44173 -> 0 bytes doc/workflow/remove_checkbox.png | Bin 22272 -> 0 bytes doc/workflow/voting_slider.png | Bin 5329 -> 0 bytes doc/workflow/web_editor.md | 26 - doc/workflow/web_editor/edit_file.png | Bin 89039 -> 0 bytes doc/workflow/web_editor/empty_project.png | Bin 122296 -> 0 bytes doc/workflow/web_editor/new_file.png | Bin 85526 -> 0 bytes doc/workflow/web_editor/show_file.png | Bin 111479 -> 0 bytes doc/workflow/workflow.md | 31 - docker/.dockerignore | 1 - docker/Dockerfile | 33 - docker/README.md | 88 -- docker/assets/wrapper | 17 - docker/data/Dockerfile | 8 - docker/data/assets/gitlab.rb | 37 - docker/troubleshooting.md | 63 -- features/admin/active_tab.feature | 44 - features/admin/applications.feature | 18 - features/admin/broadcast_messages.feature | 21 - features/admin/deploy_keys.feature | 21 - features/admin/groups.feature | 29 - features/admin/logs.feature | 8 - features/admin/projects.feature | 20 - features/admin/settings.feature | 16 - features/admin/users.feature | 47 - features/dashboard/active_tab.feature | 24 - features/dashboard/archived_projects.feature | 12 - features/dashboard/dashboard.feature | 37 - features/dashboard/event_filters.feature | 52 - features/dashboard/group.feature | 56 - features/dashboard/help.feature | 9 - features/dashboard/issues.feature | 21 - features/dashboard/merge_requests.feature | 21 - features/dashboard/new_project.feature | 13 - features/dashboard/shortcuts.feature | 21 - features/dashboard/starred_projects.feature | 12 - features/explore/groups.feature | 147 --- features/explore/projects.feature | 116 -- features/groups.feature | 150 --- features/invites.feature | 45 - features/profile/active_tab.feature | 29 - features/profile/emails.feature | 26 - features/profile/notifications.feature | 9 - features/profile/profile.feature | 99 -- features/profile/ssh_keys.feature | 20 - features/project/active_tab.feature | 124 -- features/project/archived.feature | 30 - features/project/commits/branches.feature | 43 - features/project/commits/comments.feature | 49 - features/project/commits/commits.feature | 47 - .../project/commits/diff_comments.feature | 79 -- features/project/commits/tags.feature | 41 - features/project/commits/user_lookup.feature | 15 - features/project/create.feature | 23 - features/project/deploy_keys.feature | 40 - features/project/fork.feature | 16 - .../project/forked_merge_requests.feature | 40 - features/project/graph.feature | 14 - features/project/hooks.feature | 32 - features/project/issues/filter_labels.feature | 26 - features/project/issues/issues.feature | 219 ---- features/project/issues/labels.feature | 47 - features/project/issues/milestones.feature | 30 - features/project/merge_requests.feature | 241 ---- features/project/network_graph.feature | 40 - features/project/project.feature | 57 - features/project/redirects.feature | 38 - features/project/service.feature | 86 -- features/project/shortcuts.feature | 52 - features/project/snippets.feature | 34 - features/project/source/browse_files.feature | 160 --- features/project/source/git_blame.feature | 10 - .../project/source/markdown_render.feature | 132 --- .../project/source/multiselect_blob.feature | 85 -- features/project/source/search_code.feature | 15 - features/project/star.feature | 38 - features/project/team_management.feature | 43 - features/project/wiki.feature | 88 -- features/search.feature | 46 - features/snippet_search.feature | 20 - features/snippets/discover.feature | 13 - features/snippets/public_snippets.feature | 10 - features/snippets/snippets.feature | 28 - features/snippets/user.feature | 34 - features/steps/admin/active_tab.rb | 37 - features/steps/admin/applications.rb | 55 - features/steps/admin/broadcast_messages.rb | 41 - features/steps/admin/deploy_keys.rb | 57 - features/steps/admin/groups.rb | 85 -- features/steps/admin/logs.rb | 11 - features/steps/admin/projects.rb | 48 - features/steps/admin/settings.rb | 47 - features/steps/admin/users.rb | 117 -- features/steps/dashboard/active_tab.rb | 9 - features/steps/dashboard/archived_projects.rb | 22 - features/steps/dashboard/dashboard.rb | 85 -- features/steps/dashboard/event_filters.rb | 85 -- features/steps/dashboard/group.rb | 63 -- features/steps/dashboard/issues.rb | 83 -- features/steps/dashboard/merge_requests.rb | 113 -- features/steps/dashboard/new_project.rb | 27 - features/steps/dashboard/shortcuts.rb | 6 - features/steps/dashboard/starred_projects.rb | 15 - features/steps/explore/groups.rb | 92 -- features/steps/explore/projects.rb | 148 --- features/steps/groups.rb | 300 ----- features/steps/invites.rb | 80 -- features/steps/profile/active_tab.rb | 25 - features/steps/profile/emails.rb | 48 - features/steps/profile/notifications.rb | 12 - features/steps/profile/profile.rb | 242 ---- features/steps/profile/ssh_keys.rb | 46 - features/steps/project/active_tab.rb | 103 -- features/steps/project/archived.rb | 37 - features/steps/project/commits/branches.rb | 85 -- features/steps/project/commits/comments.rb | 6 - features/steps/project/commits/commits.rb | 103 -- .../steps/project/commits/diff_comments.rb | 6 - features/steps/project/commits/tags.rb | 82 -- features/steps/project/commits/user_lookup.rb | 48 - features/steps/project/create.rb | 42 - features/steps/project/deploy_keys.rb | 77 -- features/steps/project/fork.rb | 34 - .../steps/project/forked_merge_requests.rb | 136 --- features/steps/project/graph.rb | 23 - features/steps/project/hooks.rb | 64 -- .../steps/project/issues/filter_labels.rb | 60 - features/steps/project/issues/issues.rb | 276 ----- features/steps/project/issues/labels.rb | 101 -- features/steps/project/issues/milestones.rb | 59 - features/steps/project/merge_requests.rb | 337 ------ features/steps/project/network_graph.rb | 93 -- features/steps/project/project.rb | 97 -- features/steps/project/project_shortcuts.rb | 36 - features/steps/project/redirects.rb | 69 -- features/steps/project/services.rb | 225 ---- features/steps/project/snippets.rb | 95 -- features/steps/project/source/browse_files.rb | 218 ---- features/steps/project/source/git_blame.rb | 19 - .../steps/project/source/markdown_render.rb | 288 ----- .../steps/project/source/multiselect_blob.rb | 58 - features/steps/project/source/search_code.rb | 19 - features/steps/project/star.rb | 37 - features/steps/project/team_management.rb | 130 --- features/steps/project/wiki.rb | 165 --- features/steps/search.rb | 69 -- features/steps/shared/active_tab.rb | 47 - features/steps/shared/admin.rb | 12 - features/steps/shared/authentication.rb | 34 - features/steps/shared/diff_note.rb | 167 --- features/steps/shared/group.rb | 44 - features/steps/shared/issuable.rb | 15 - features/steps/shared/markdown.rb | 102 -- features/steps/shared/note.rb | 155 --- features/steps/shared/paths.rb | 480 -------- features/steps/shared/project.rb | 160 --- features/steps/shared/project_tab.rb | 48 - features/steps/shared/search.rb | 11 - features/steps/shared/shortcuts.rb | 18 - features/steps/shared/snippet.rb | 63 -- features/steps/shared/user.rb | 17 - features/steps/snippet_search.rb | 56 - features/steps/snippets/discover.rb | 21 - features/steps/snippets/public_snippets.rb | 25 - features/steps/snippets/snippets.rb | 64 -- features/steps/snippets/user.rb | 55 - features/steps/user.rb | 43 - features/support/env.rb | 54 - features/user.feature | 78 -- lib/api/api.rb | 53 - lib/api/api_guard.rb | 172 --- lib/api/branches.rb | 119 -- lib/api/commits.rb | 116 -- lib/api/deploy_keys.rb | 75 -- lib/api/entities.rb | 280 ----- lib/api/files.rb | 158 --- lib/api/group_members.rb | 87 -- lib/api/groups.rb | 89 -- lib/api/helpers.rb | 250 ---- lib/api/internal.rb | 85 -- lib/api/issues.rb | 181 --- lib/api/labels.rb | 98 -- lib/api/merge_requests.rb | 249 ---- lib/api/milestones.rb | 95 -- lib/api/namespaces.rb | 23 - lib/api/notes.rb | 103 -- lib/api/project_hooks.rb | 108 -- lib/api/project_members.rb | 106 -- lib/api/project_snippets.rb | 124 -- lib/api/projects.rb | 323 ------ lib/api/repositories.rb | 190 ---- lib/api/services.rb | 78 -- lib/api/session.rb | 21 - lib/api/system_hooks.rb | 70 -- lib/api/users.rb | 264 ----- lib/assets/.gitkeep | 0 lib/backup/database.rb | 78 -- lib/backup/manager.rb | 170 --- lib/backup/repository.rb | 140 --- lib/backup/uploads.rb | 30 - lib/disable_email_interceptor.rb | 8 - lib/email_validator.rb | 21 - lib/event_filter.rb | 68 -- lib/extracts_path.rb | 123 -- lib/file_size_validator.rb | 73 -- lib/gitlab.rb | 5 - lib/gitlab/access.rb | 73 -- lib/gitlab/app_logger.rb | 11 - lib/gitlab/auth.rb | 18 - lib/gitlab/backend/grack_auth.rb | 182 --- lib/gitlab/backend/rack_attack_helpers.rb | 31 - lib/gitlab/backend/shell.rb | 279 ----- lib/gitlab/backend/shell_adapter.rb | 11 - lib/gitlab/backend/shell_env.rb | 17 - lib/gitlab/bitbucket_import.rb | 6 - lib/gitlab/bitbucket_import/client.rb | 99 -- lib/gitlab/bitbucket_import/importer.rb | 52 - lib/gitlab/bitbucket_import/key_adder.rb | 23 - lib/gitlab/bitbucket_import/key_deleter.rb | 23 - .../bitbucket_import/project_creator.rb | 26 - lib/gitlab/blacklist.rb | 34 - lib/gitlab/closing_issue_extractor.rb | 20 - lib/gitlab/compare_result.rb | 9 - lib/gitlab/config_helper.rb | 9 - lib/gitlab/contributions_calendar.rb | 56 - lib/gitlab/contributor.rb | 9 - lib/gitlab/current_settings.rb | 28 - lib/gitlab/diff/file.rb | 49 - lib/gitlab/diff/line.rb | 12 - lib/gitlab/diff/line_code.rb | 9 - lib/gitlab/diff/parser.rb | 81 -- lib/gitlab/force_push_check.rb | 15 - lib/gitlab/git.rb | 25 - lib/gitlab/git_access.rb | 198 ---- lib/gitlab/git_access_status.rb | 15 - lib/gitlab/git_access_wiki.rb | 11 - lib/gitlab/git_logger.rb | 11 - lib/gitlab/git_ref_validator.rb | 12 - lib/gitlab/github_import/client.rb | 53 - lib/gitlab/github_import/importer.rb | 46 - lib/gitlab/github_import/project_creator.rb | 26 - lib/gitlab/gitlab_import/client.rb | 82 -- lib/gitlab/gitlab_import/importer.rb | 50 - lib/gitlab/gitlab_import/project_creator.rb | 26 - lib/gitlab/gitorious_import/client.rb | 31 - .../gitorious_import/project_creator.rb | 26 - lib/gitlab/gitorious_import/repository.rb | 37 - lib/gitlab/google_code_import/client.rb | 48 - lib/gitlab/google_code_import/repository.rb | 43 - lib/gitlab/graphs/commits.rb | 49 - lib/gitlab/identifier.rb | 23 - lib/gitlab/import_formatter.rb | 15 - lib/gitlab/inline_diff.rb | 78 -- lib/gitlab/issues_labels.rb | 27 - lib/gitlab/key_fingerprint.rb | 55 - lib/gitlab/ldap/access.rb | 62 - lib/gitlab/ldap/adapter.rb | 89 -- lib/gitlab/ldap/authentication.rb | 71 -- lib/gitlab/ldap/config.rb | 122 -- lib/gitlab/ldap/person.rb | 61 - lib/gitlab/ldap/user.rb | 71 -- lib/gitlab/logger.rb | 32 - lib/gitlab/markdown_helper.rb | 29 - lib/gitlab/middleware/static.rb | 13 - lib/gitlab/note_data_builder.rb | 77 -- lib/gitlab/o_auth/auth_hash.rb | 54 - lib/gitlab/o_auth/user.rb | 106 -- lib/gitlab/popen.rb | 35 - lib/gitlab/production_logger.rb | 7 - lib/gitlab/project_search_results.rb | 77 -- lib/gitlab/push_data_builder.rb | 90 -- lib/gitlab/reference_extractor.rb | 94 -- lib/gitlab/satellite/action.rb | 56 - 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 | 146 --- lib/gitlab/satellite/satellite.rb | 148 --- lib/gitlab/search_results.rb | 69 -- lib/gitlab/seeder.rb | 24 - lib/gitlab/sidekiq_logger.rb | 7 - .../sidekiq_middleware/arguments_logger.rb | 10 - .../sidekiq_middleware/memory_killer.rb | 53 - lib/gitlab/snippet_search_results.rb | 131 --- lib/gitlab/theme.rb | 39 - lib/gitlab/upgrader.rb | 102 -- lib/gitlab/url_builder.rb | 60 - lib/gitlab/user_access.rb | 13 - lib/gitlab/utils.rb | 13 - lib/gitlab/version_info.rb | 54 - lib/gitlab/visibility_level.rb | 64 -- lib/gt_one_coercion.rb | 5 - lib/redcarpet/render/gitlab_html.rb | 72 -- lib/repository_cache.rb | 21 - lib/static_model.rb | 47 - lib/support/deploy/deploy.sh | 45 - lib/support/init.d/gitlab | 301 ----- lib/support/init.d/gitlab.default.example | 31 - lib/support/logrotate/gitlab | 20 - lib/support/nginx/gitlab | 115 -- lib/support/nginx/gitlab-ssl | 162 --- lib/tasks/.gitkeep | 0 lib/tasks/brakeman.rake | 9 - lib/tasks/cache.rake | 11 - lib/tasks/dev.rake | 10 - lib/tasks/gitlab/backup.rake | 106 -- lib/tasks/gitlab/bulk_add_permission.rake | 48 - lib/tasks/gitlab/cleanup.rake | 113 -- .../db/drop_all_postgres_sequences.rake | 10 - lib/tasks/gitlab/db/drop_all_tables.rake | 10 - lib/tasks/gitlab/enable_automerge.rake | 39 - lib/tasks/gitlab/generate_docs.rake | 7 - lib/tasks/gitlab/import.rake | 77 -- lib/tasks/gitlab/info.rake | 72 -- .../mail_google_schema_whitelisting.rake | 73 -- lib/tasks/gitlab/setup.rake | 24 - lib/tasks/gitlab/shell.rake | 138 --- lib/tasks/gitlab/sidekiq.rake | 47 - lib/tasks/gitlab/task_helpers.rake | 131 --- lib/tasks/gitlab/test.rake | 16 - lib/tasks/gitlab/web_hook.rake | 65 -- lib/tasks/migrate/add_limits_mysql.rake | 7 - lib/tasks/migrate/migrate_iids.rake | 48 - lib/tasks/rubocop.rake | 4 - lib/tasks/setup.rake | 4 - lib/tasks/sidekiq.rake | 21 - lib/tasks/spec.rake | 45 - lib/tasks/spinach.rake | 40 - lib/tasks/test.rake | 13 - lib/unfold_form.rb | 11 - log/.gitkeep | 0 public/404.html | 14 - public/422.html | 16 - public/500.html | 13 - public/502.html | 13 - public/apple-touch-icon-precomposed.png | Bin 11979 -> 0 bytes public/apple-touch-icon.png | Bin 11979 -> 0 bytes public/deploy.html | 11 - public/favicon.ico | Bin 32988 -> 0 bytes public/gitlab_logo.png | Bin 13819 -> 0 bytes public/robots.txt | 5 - public/static.css | 30 - public/uploads/.gitkeep | 0 safe/public.pem | 9 - .../application_controller_spec.rb | 33 - .../autocomplete_controller_spec.rb | 51 - spec/controllers/blob_controller_spec.rb | 58 - spec/controllers/branches_controller_spec.rb | 58 - spec/controllers/commit_controller_spec.rb | 91 -- spec/controllers/commits_controller_spec.rb | 22 - .../import/bitbucket_controller_spec.rb | 163 --- .../import/github_controller_spec.rb | 153 --- .../import/gitlab_controller_spec.rb | 152 --- .../import/gitorious_controller_spec.rb | 67 -- .../import/google_code_controller_spec.rb | 47 - .../merge_requests_controller_spec.rb | 81 -- .../controllers/namespaces_controller_spec.rb | 121 -- .../profile_keys_controller_spec.rb | 59 - .../protected_branches_controller_spec.rb | 10 - .../projects/refs_controller_spec.rb | 41 - .../projects/repositories_controller_spec.rb | 65 -- spec/controllers/projects_controller_spec.rb | 47 - spec/controllers/tree_controller_spec.rb | 64 -- spec/controllers/uploads_controller_spec.rb | 296 ----- spec/controllers/users_controller_spec.rb | 46 - spec/factories.rb | 193 ---- spec/factories/broadcast_messages.rb | 27 - spec/factories/forked_project_links.rb | 19 - spec/factories/group_members.rb | 20 - spec/factories/label_links.rb | 20 - spec/factories/labels.rb | 21 - spec/factories/merge_requests.rb | 70 -- spec/factories/notes.rb | 65 -- spec/factories/projects.rb | 95 -- spec/factories_spec.rb | 9 - spec/features/admin/admin_hooks_spec.rb | 51 - spec/features/admin/admin_projects_spec.rb | 34 - spec/features/admin/admin_users_spec.rb | 109 -- spec/features/admin/security_spec.rb | 27 - spec/features/atom/dashboard_issues_spec.rb | 30 - spec/features/atom/dashboard_spec.rb | 44 - spec/features/atom/issues_spec.rb | 37 - spec/features/atom/users_spec.rb | 77 -- .../features/gitlab_flavored_markdown_spec.rb | 129 --- spec/features/issues_spec.rb | 320 ------ spec/features/notes_on_merge_requests_spec.rb | 230 ---- spec/features/profile_spec.rb | 35 - spec/features/projects_spec.rb | 32 - spec/features/search_spec.rb | 20 - .../security/dashboard_access_spec.rb | 63 -- .../security/group/group_access_spec.rb | 98 -- .../group/internal_group_access_spec.rb | 82 -- .../security/group/mixed_group_access_spec.rb | 83 -- .../group/public_group_access_spec.rb | 82 -- spec/features/security/profile_access_spec.rb | 65 -- .../security/project/internal_access_spec.rb | 227 ---- .../security/project/private_access_spec.rb | 205 ---- .../security/project/public_access_spec.rb | 232 ---- spec/features/users_spec.rb | 37 - spec/finders/issues_finder_spec.rb | 81 -- spec/finders/merge_requests_finder_spec.rb | 33 - spec/finders/notes_finder_spec.rb | 38 - spec/finders/projects_finder_spec.rb | 51 - spec/finders/snippets_finder_spec.rb | 101 -- spec/fixtures/GoogleCodeProjectHosting.json | 407 ------- spec/fixtures/banana_sample.gif | Bin 71759 -> 0 bytes spec/fixtures/dk.png | Bin 1143 -> 0 bytes spec/fixtures/doc_sample.txt | 3 - spec/fixtures/rails_sample.jpg | Bin 35255 -> 0 bytes spec/helpers/application_helper_spec.rb | 262 ----- .../helpers/broadcast_messages_helper_spec.rb | 22 - spec/helpers/diff_helper_spec.rb | 102 -- spec/helpers/events_helper_spec.rb | 65 -- spec/helpers/gitlab_markdown_helper_spec.rb | 916 --------------- spec/helpers/groups_helper.rb | 21 - spec/helpers/icons_helper_spec.rb | 109 -- spec/helpers/issues_helper_spec.rb | 138 --- spec/helpers/labels_helper_spec.rb | 6 - spec/helpers/merge_requests_helper.rb | 12 - spec/helpers/nav_helper_spec.rb | 25 - spec/helpers/notifications_helper_spec.rb | 38 - spec/helpers/oauth_helper_spec.rb | 20 - spec/helpers/projects_helper_spec.rb | 11 - spec/helpers/search_helper_spec.rb | 55 - spec/helpers/submodule_helper_spec.rb | 154 --- spec/helpers/tab_helper_spec.rb | 44 - spec/helpers/tree_helper_spec.rb | 28 - spec/javascripts/helpers/.gitkeep | 0 .../stat_graph_contributors_graph_spec.js | 126 --- .../stat_graph_contributors_util_spec.js | 208 ---- spec/javascripts/stat_graph_spec.js | 17 - spec/javascripts/support/jasmine.yml | 76 -- spec/javascripts/support/jasmine_helper.rb | 11 - spec/lib/disable_email_interceptor_spec.rb | 26 - spec/lib/extracts_path_spec.rb | 60 - spec/lib/file_size_validator_spec.rb | 43 - spec/lib/git_ref_validator_spec.rb | 20 - spec/lib/gitlab/auth_spec.rb | 54 - spec/lib/gitlab/backend/grack_auth_spec.rb | 196 ---- .../backend/rack_attack_helpers_spec.rb | 35 - spec/lib/gitlab/backend/shell_spec.rb | 18 - .../gitlab/bitbucket_import/client_spec.rb | 17 - .../bitbucket_import/project_creator_spec.rb | 26 - .../gitlab/closing_issue_extractor_spec.rb | 176 --- spec/lib/gitlab/diff/file_spec.rb | 21 - spec/lib/gitlab/diff/parser_spec.rb | 93 -- spec/lib/gitlab/git_access_spec.rb | 235 ---- spec/lib/gitlab/git_access_wiki_spec.rb | 22 - spec/lib/gitlab/github_import/client_spec.rb | 16 - .../github_import/project_creator_spec.rb | 28 - spec/lib/gitlab/gitlab_import/client_spec.rb | 16 - .../gitlab_import/project_creator_spec.rb | 28 - .../lib/gitlab/gitlab_markdown_helper_spec.rb | 28 - .../gitorious_import/project_creator_spec.rb | 26 - .../gitlab/google_code_import/client_spec.rb | 34 - .../project_creator_spec.rb | 27 - spec/lib/gitlab/key_fingerprint_spec.rb | 12 - spec/lib/gitlab/ldap/access_spec.rb | 55 - spec/lib/gitlab/ldap/adapter_spec.rb | 31 - spec/lib/gitlab/ldap/authentication_spec.rb | 53 - spec/lib/gitlab/ldap/config_spec.rb | 20 - spec/lib/gitlab/ldap/user_spec.rb | 106 -- spec/lib/gitlab/note_data_builder_spec.rb | 73 -- spec/lib/gitlab/o_auth/auth_hash_spec.rb | 55 - spec/lib/gitlab/o_auth/user_spec.rb | 109 -- spec/lib/gitlab/popen_spec.rb | 45 - spec/lib/gitlab/push_data_builder_spec.rb | 39 - spec/lib/gitlab/reference_extractor_spec.rb | 156 --- spec/lib/gitlab/regex_spec.rb | 21 - spec/lib/gitlab/satellite/action_spec.rb | 118 -- .../lib/gitlab/satellite/merge_action_spec.rb | 104 -- spec/lib/gitlab/upgrader_spec.rb | 24 - spec/lib/gitlab/url_builder_spec.rb | 77 -- spec/lib/gitlab/version_info_spec.rb | 69 -- spec/lib/repository_cache_spec.rb | 34 - spec/lib/votes_spec.rb | 185 --- spec/mailers/notify_spec.rb | 808 ------------- spec/models/application_setting_spec.rb | 24 - spec/models/broadcast_message_spec.rb | 39 - spec/models/commit_spec.rb | 80 -- spec/models/concerns/issuable_spec.rb | 66 -- spec/models/concerns/mentionable_spec.rb | 14 - spec/models/deploy_key_spec.rb | 25 - spec/models/deploy_keys_project_spec.rb | 72 -- spec/models/event_spec.rb | 67 -- spec/models/external_wiki_service_spec.rb | 39 - spec/models/forked_project_link_spec.rb | 67 -- spec/models/group_spec.rb | 73 -- spec/models/hooks/project_hook_spec.rb | 36 - spec/models/hooks/service_hook_spec.rb | 24 - spec/models/hooks/system_hook_spec.rb | 100 -- spec/models/hooks/web_hook_spec.rb | 74 -- spec/models/issue_spec.rb | 67 -- spec/models/key_spec.rb | 88 -- spec/models/label_link_spec.rb | 21 - spec/models/label_spec.rb | 43 - spec/models/member_spec.rb | 148 --- spec/models/members/group_member_spec.rb | 46 - spec/models/members/project_member_spec.rb | 92 -- spec/models/merge_request_spec.rb | 127 --- spec/models/milestone_spec.rb | 143 --- spec/models/namespace_spec.rb | 96 -- spec/models/note_spec.rb | 637 ----------- spec/models/project_security_spec.rb | 126 --- .../project_services/asana_service_spec.rb | 65 -- .../project_services/assembla_service_spec.rb | 53 - .../buildkite_service_spec.rb | 82 -- .../project_services/flowdock_service_spec.rb | 52 - .../gemnasium_service_spec.rb | 48 - .../gitlab_ci_service_spec.rb | 70 -- .../gitlab_issue_tracker_service_spec.rb | 66 -- .../project_services/hipchat_service_spec.rb | 217 ---- .../project_services/irker_service_spec.rb | 108 -- .../project_services/jira_service_spec.rb | 102 -- .../project_services/pushover_service_spec.rb | 74 -- .../slack_service/issue_message_spec.rb | 56 - .../slack_service/merge_message_spec.rb | 51 - .../slack_service/note_message_spec.rb | 129 --- .../slack_service/push_message_spec.rb | 88 -- .../project_services/slack_service_spec.rb | 170 --- spec/models/project_snippet_spec.rb | 31 - spec/models/project_spec.rb | 360 ------ spec/models/project_team_spec.rb | 70 -- spec/models/project_wiki_spec.rb | 244 ---- spec/models/protected_branch_spec.rb | 27 - spec/models/repository_spec.rb | 28 - spec/models/service_spec.rb | 92 -- spec/models/snippet_spec.rb | 40 - spec/models/user_spec.rb | 532 --------- spec/models/wiki_page_spec.rb | 210 ---- spec/requests/api/api_helpers_spec.rb | 173 --- spec/requests/api/branches_spec.rb | 170 --- spec/requests/api/commits_spec.rb | 149 --- spec/requests/api/doorkeeper_access_spec.rb | 31 - spec/requests/api/files_spec.rb | 164 --- spec/requests/api/fork_spec.rb | 73 -- spec/requests/api/group_members_spec.rb | 199 ---- spec/requests/api/groups_spec.rb | 187 --- spec/requests/api/internal_spec.rb | 229 ---- spec/requests/api/issues_spec.rb | 330 ------ spec/requests/api/labels_spec.rb | 170 --- spec/requests/api/merge_requests_spec.rb | 409 ------- spec/requests/api/milestones_spec.rb | 116 -- spec/requests/api/namespaces_spec.rb | 27 - spec/requests/api/notes_spec.rb | 188 --- spec/requests/api/project_hooks_spec.rb | 129 --- spec/requests/api/project_members_spec.rb | 153 --- spec/requests/api/projects_spec.rb | 825 -------------- spec/requests/api/repositories_spec.rb | 247 ---- spec/requests/api/services_spec.rb | 56 - spec/requests/api/session_spec.rb | 78 -- spec/requests/api/system_hooks_spec.rb | 81 -- spec/requests/api/users_spec.rb | 524 --------- spec/routing/admin_routing_spec.rb | 121 -- spec/routing/notifications_routing_spec.rb | 13 - spec/routing/project_routing_spec.rb | 492 -------- .../archive_repository_service_spec.rb | 93 -- spec/services/create_snippet_service_spec.rb | 44 - spec/services/event_create_service_spec.rb | 103 -- spec/services/git_push_service_spec.rb | 238 ---- spec/services/git_tag_push_service_spec.rb | 89 -- .../issues/bulk_update_service_spec.rb | 121 -- spec/services/issues/close_service_spec.rb | 35 - spec/services/issues/create_service_spec.rb | 23 - spec/services/issues/update_service_spec.rb | 54 - .../merge_requests/close_service_spec.rb | 44 - .../merge_requests/create_service_spec.rb | 34 - .../merge_requests/merge_service_spec.rb | 44 - .../merge_requests/refresh_service_spec.rb | 98 -- .../merge_requests/reopen_service_spec.rb | 45 - .../merge_requests/update_service_spec.rb | 65 -- .../services/milestones/group_service_spec.rb | 70 -- spec/services/notes/create_service_spec.rb | 26 - spec/services/notification_service_spec.rb | 455 -------- spec/services/projects/create_service_spec.rb | 90 -- spec/services/projects/fork_service_spec.rb | 108 -- .../projects/transfer_service_spec.rb | 41 - spec/services/projects/update_service_spec.rb | 108 -- spec/services/projects/upload_service_spec.rb | 85 -- spec/services/search_service_spec.rb | 46 - spec/services/system_hooks_service_spec.rb | 69 -- spec/services/test_hook_service_spec.rb | 14 - spec/services/update_snippet_service_spec.rb | 52 - spec/spec_helper.rb | 48 - spec/support/api_helpers.rb | 34 - spec/support/db_cleaner.rb | 50 - spec/support/login_helpers.rb | 26 - spec/support/matchers.rb | 79 -- spec/support/mentionable_shared_examples.rb | 115 -- spec/support/repo_helpers.rb | 118 -- spec/support/select2_helper.rb | 25 - spec/support/taskable_shared_examples.rb | 42 - spec/support/test_env.rb | 122 -- spec/tasks/gitlab/backup_rake_spec.rb | 152 --- .../gitlab/mail_google_schema_whitelisting.rb | 27 - spec/workers/fork_registration_worker_spec.rb | 10 - spec/workers/post_receive_spec.rb | 45 - .../workers/repository_archive_worker_spec.rb | 80 -- tmp/.gitkeep | 0 tmp/pids/.gitkeep | 0 tmp/sockets/.gitkeep | 0 vendor/assets/javascripts/chart-lib.min.js | 11 - vendor/assets/javascripts/g.bar-min.js | 8 - vendor/assets/javascripts/g.raphael-min.js | 7 - vendor/assets/javascripts/jquery.blockUI.js | 590 ---------- vendor/assets/javascripts/jquery.cookie.js | 41 - .../javascripts/jquery.endless-scroll.js | 128 --- vendor/assets/javascripts/jquery.highlight.js | 53 - vendor/assets/javascripts/jquery.history.js | 1 - .../javascripts/jquery.sticky-kit.min.js | 9 - .../javascripts/jquery.waitforimages.js | 144 --- vendor/assets/stylesheets/.gitkeep | 0 2000 files changed, 1 insertion(+), 109356 deletions(-) delete mode 100644 .foreman delete mode 100644 .hound.yml delete mode 100644 .pkgr.yml delete mode 100644 .rspec delete mode 100644 .rubocop.yml delete mode 100644 .ruby-version delete mode 100644 .simplecov delete mode 100644 .teatro.yml delete mode 100644 CONTRIBUTING.md delete mode 100644 GITLAB_SHELL_VERSION delete mode 100644 Guardfile delete mode 100644 LICENSE delete mode 100644 MAINTENANCE.md delete mode 100644 PROCESS.md delete mode 100644 Procfile delete mode 100644 README.md delete mode 100644 Rakefile delete mode 100644 app/assets/images/authbuttons/bitbucket_64.png delete mode 100644 app/assets/images/authbuttons/github_64.png delete mode 100644 app/assets/images/authbuttons/gitlab_64.png delete mode 100644 app/assets/images/authbuttons/google_64.png delete mode 100644 app/assets/images/authbuttons/twitter_64.png delete mode 100644 app/assets/images/bg-header.png delete mode 100644 app/assets/images/bg_fallback.png delete mode 100644 app/assets/images/brand_logo.png delete mode 100644 app/assets/images/chosen-sprite.png delete mode 100644 app/assets/images/dark-scheme-preview.png delete mode 100644 app/assets/images/diff_note_add.png delete mode 100644 app/assets/images/favicon.ico delete mode 100644 app/assets/images/gitorious-logo-black.png delete mode 100644 app/assets/images/gitorious-logo-blue.png delete mode 100644 app/assets/images/icon-link.png delete mode 100644 app/assets/images/icon-search.png delete mode 100644 app/assets/images/icon_sprite.png delete mode 100644 app/assets/images/images.png delete mode 100644 app/assets/images/logo-white.png delete mode 100644 app/assets/images/monokai-scheme-preview.png delete mode 100644 app/assets/images/move.png delete mode 100644 app/assets/images/no_avatar.png delete mode 100644 app/assets/images/no_group_avatar.png delete mode 100644 app/assets/images/onion_skin_sprites.gif delete mode 100644 app/assets/images/progress_bar.gif delete mode 100644 app/assets/images/slider_handles.png delete mode 100644 app/assets/images/solarized-dark-scheme-preview.png delete mode 100644 app/assets/images/solarized-light-scheme-preview.png delete mode 100644 app/assets/images/swipemode_sprites.gif delete mode 100644 app/assets/images/switch_icon.png delete mode 100644 app/assets/images/trans_bg.gif delete mode 100644 app/assets/images/white-scheme-preview.png delete mode 100644 app/assets/javascripts/activities.js.coffee delete mode 100644 app/assets/javascripts/admin.js.coffee delete mode 100644 app/assets/javascripts/api.js.coffee delete mode 100644 app/assets/javascripts/application.js.coffee delete mode 100644 app/assets/javascripts/aside.js.coffee delete mode 100644 app/assets/javascripts/autosave.js.coffee delete mode 100644 app/assets/javascripts/behaviors/details_behavior.coffee delete mode 100644 app/assets/javascripts/behaviors/taskable.js.coffee delete mode 100644 app/assets/javascripts/behaviors/toggler_behavior.coffee delete mode 100644 app/assets/javascripts/blob/blob.js.coffee delete mode 100644 app/assets/javascripts/blob/edit_blob.js.coffee delete mode 100644 app/assets/javascripts/blob/new_blob.js.coffee delete mode 100644 app/assets/javascripts/branch-graph.js.coffee delete mode 100644 app/assets/javascripts/calendar.js.coffee delete mode 100644 app/assets/javascripts/commit.js.coffee delete mode 100644 app/assets/javascripts/commit/file.js.coffee delete mode 100644 app/assets/javascripts/commit/image-file.js.coffee delete mode 100644 app/assets/javascripts/commits.js.coffee delete mode 100644 app/assets/javascripts/confirm_danger_modal.js.coffee delete mode 100644 app/assets/javascripts/dashboard.js.coffee delete mode 100644 app/assets/javascripts/diff.js.coffee delete mode 100644 app/assets/javascripts/dispatcher.js.coffee delete mode 100644 app/assets/javascripts/dropzone_input.js.coffee delete mode 100644 app/assets/javascripts/extensions/array.js delete mode 100644 app/assets/javascripts/extensions/jquery.js.coffee delete mode 100644 app/assets/javascripts/flash.js.coffee delete mode 100644 app/assets/javascripts/gfm_auto_complete.js.coffee delete mode 100644 app/assets/javascripts/group_avatar.js.coffee delete mode 100644 app/assets/javascripts/groups.js.coffee delete mode 100644 app/assets/javascripts/groups_select.js.coffee delete mode 100644 app/assets/javascripts/importer_status.js.coffee delete mode 100644 app/assets/javascripts/issuable_form.js.coffee delete mode 100644 app/assets/javascripts/issue.js.coffee delete mode 100644 app/assets/javascripts/issues.js.coffee delete mode 100644 app/assets/javascripts/labels.js.coffee delete mode 100644 app/assets/javascripts/lib/jquery.timeago.js delete mode 100644 app/assets/javascripts/lib/md5.js delete mode 100644 app/assets/javascripts/lib/utf8_encode.js delete mode 100644 app/assets/javascripts/merge_request.js.coffee delete mode 100644 app/assets/javascripts/merge_requests.js.coffee delete mode 100644 app/assets/javascripts/milestone.js.coffee delete mode 100644 app/assets/javascripts/namespace_select.js.coffee delete mode 100644 app/assets/javascripts/network.js.coffee delete mode 100644 app/assets/javascripts/notes.js.coffee delete mode 100644 app/assets/javascripts/pager.js.coffee delete mode 100644 app/assets/javascripts/profile.js.coffee delete mode 100644 app/assets/javascripts/project.js.coffee delete mode 100644 app/assets/javascripts/project_avatar.js.coffee delete mode 100644 app/assets/javascripts/project_fork.js.coffee delete mode 100644 app/assets/javascripts/project_import.js.coffee delete mode 100644 app/assets/javascripts/project_members.js.coffee delete mode 100644 app/assets/javascripts/project_new.js.coffee delete mode 100644 app/assets/javascripts/project_show.js.coffee delete mode 100644 app/assets/javascripts/projects_list.js.coffee delete mode 100644 app/assets/javascripts/protected_branches.js.coffee delete mode 100644 app/assets/javascripts/search_autocomplete.js.coffee delete mode 100644 app/assets/javascripts/shortcuts.js.coffee delete mode 100644 app/assets/javascripts/shortcuts_dashboard_navigation.js.coffee delete mode 100644 app/assets/javascripts/shortcuts_issueable.coffee delete mode 100644 app/assets/javascripts/shortcuts_navigation.coffee delete mode 100644 app/assets/javascripts/shortcuts_network.js.coffee delete mode 100644 app/assets/javascripts/sidebar.js.coffee delete mode 100644 app/assets/javascripts/stat_graph.js.coffee delete mode 100644 app/assets/javascripts/stat_graph_contributors.js.coffee delete mode 100644 app/assets/javascripts/stat_graph_contributors_graph.js.coffee delete mode 100644 app/assets/javascripts/stat_graph_contributors_util.js.coffee delete mode 100644 app/assets/javascripts/subscription.js.coffee delete mode 100644 app/assets/javascripts/tree.js.coffee delete mode 100644 app/assets/javascripts/user.js.coffee delete mode 100644 app/assets/javascripts/users_select.js.coffee delete mode 100644 app/assets/javascripts/wikis.js.coffee delete mode 100644 app/assets/javascripts/zen_mode.js.coffee delete mode 100644 app/assets/stylesheets/application.scss delete mode 100644 app/assets/stylesheets/base/gl_bootstrap.scss delete mode 100644 app/assets/stylesheets/base/gl_variables.scss delete mode 100644 app/assets/stylesheets/base/layout.scss delete mode 100644 app/assets/stylesheets/base/mixins.scss delete mode 100644 app/assets/stylesheets/base/variables.scss delete mode 100644 app/assets/stylesheets/behaviors.scss delete mode 100644 app/assets/stylesheets/generic/avatar.scss delete mode 100644 app/assets/stylesheets/generic/blocks.scss delete mode 100644 app/assets/stylesheets/generic/buttons.scss delete mode 100644 app/assets/stylesheets/generic/calendar.scss delete mode 100644 app/assets/stylesheets/generic/common.scss delete mode 100644 app/assets/stylesheets/generic/files.scss delete mode 100644 app/assets/stylesheets/generic/filters.scss delete mode 100644 app/assets/stylesheets/generic/flash.scss delete mode 100644 app/assets/stylesheets/generic/forms.scss delete mode 100644 app/assets/stylesheets/generic/gfm.scss delete mode 100644 app/assets/stylesheets/generic/highlight.scss delete mode 100644 app/assets/stylesheets/generic/issue_box.scss delete mode 100644 app/assets/stylesheets/generic/jquery.scss delete mode 100644 app/assets/stylesheets/generic/lists.scss delete mode 100644 app/assets/stylesheets/generic/markdown_area.scss delete mode 100644 app/assets/stylesheets/generic/mobile.scss delete mode 100644 app/assets/stylesheets/generic/nav_sidebar.scss delete mode 100644 app/assets/stylesheets/generic/selects.scss delete mode 100644 app/assets/stylesheets/generic/tables.scss delete mode 100644 app/assets/stylesheets/generic/timeline.scss delete mode 100644 app/assets/stylesheets/generic/typography.scss delete mode 100644 app/assets/stylesheets/generic/zen.scss delete mode 100644 app/assets/stylesheets/highlight/dark.scss delete mode 100644 app/assets/stylesheets/highlight/monokai.scss delete mode 100644 app/assets/stylesheets/highlight/solarized_dark.scss delete mode 100644 app/assets/stylesheets/highlight/solarized_light.scss delete mode 100644 app/assets/stylesheets/highlight/white.scss delete mode 100644 app/assets/stylesheets/pages/admin.scss delete mode 100644 app/assets/stylesheets/pages/commit.scss delete mode 100644 app/assets/stylesheets/pages/commits.scss delete mode 100644 app/assets/stylesheets/pages/dashboard.scss delete mode 100644 app/assets/stylesheets/pages/diff.scss delete mode 100644 app/assets/stylesheets/pages/editor.scss delete mode 100644 app/assets/stylesheets/pages/errors.scss delete mode 100644 app/assets/stylesheets/pages/events.scss delete mode 100644 app/assets/stylesheets/pages/explore.scss delete mode 100644 app/assets/stylesheets/pages/graph.scss delete mode 100644 app/assets/stylesheets/pages/groups.scss delete mode 100644 app/assets/stylesheets/pages/header.scss delete mode 100644 app/assets/stylesheets/pages/help.scss delete mode 100644 app/assets/stylesheets/pages/import.scss delete mode 100644 app/assets/stylesheets/pages/issuable.scss delete mode 100644 app/assets/stylesheets/pages/issues.scss delete mode 100644 app/assets/stylesheets/pages/labels.scss delete mode 100644 app/assets/stylesheets/pages/login.scss delete mode 100644 app/assets/stylesheets/pages/merge_requests.scss delete mode 100644 app/assets/stylesheets/pages/milestone.scss delete mode 100644 app/assets/stylesheets/pages/note_form.scss delete mode 100644 app/assets/stylesheets/pages/notes.scss delete mode 100644 app/assets/stylesheets/pages/notifications.scss delete mode 100644 app/assets/stylesheets/pages/profile.scss delete mode 100644 app/assets/stylesheets/pages/projects.scss delete mode 100644 app/assets/stylesheets/pages/search.scss delete mode 100644 app/assets/stylesheets/pages/snippets.scss delete mode 100644 app/assets/stylesheets/pages/stat_graph.scss delete mode 100644 app/assets/stylesheets/pages/themes.scss delete mode 100644 app/assets/stylesheets/pages/tree.scss delete mode 100644 app/assets/stylesheets/pages/ui_dev_kit.scss delete mode 100644 app/assets/stylesheets/pages/votes.scss delete mode 100644 app/assets/stylesheets/pages/wiki.scss delete mode 100644 app/assets/stylesheets/print.scss delete mode 100644 app/assets/stylesheets/themes/dark-theme.scss delete mode 100644 app/assets/stylesheets/themes/ui_basic.scss delete mode 100644 app/assets/stylesheets/themes/ui_blue.scss delete mode 100644 app/assets/stylesheets/themes/ui_color.scss delete mode 100644 app/assets/stylesheets/themes/ui_gray.scss delete mode 100644 app/assets/stylesheets/themes/ui_mars.scss delete mode 100644 app/assets/stylesheets/themes/ui_modern.scss delete mode 100644 app/controllers/admin/application_controller.rb delete mode 100644 app/controllers/admin/application_settings_controller.rb delete mode 100644 app/controllers/admin/applications_controller.rb delete mode 100644 app/controllers/admin/background_jobs_controller.rb delete mode 100644 app/controllers/admin/broadcast_messages_controller.rb delete mode 100644 app/controllers/admin/dashboard_controller.rb delete mode 100644 app/controllers/admin/deploy_keys_controller.rb delete mode 100644 app/controllers/admin/groups_controller.rb delete mode 100644 app/controllers/admin/hooks_controller.rb delete mode 100644 app/controllers/admin/keys_controller.rb delete mode 100644 app/controllers/admin/logs_controller.rb delete mode 100644 app/controllers/admin/projects_controller.rb delete mode 100644 app/controllers/admin/services_controller.rb delete mode 100644 app/controllers/admin/users_controller.rb delete mode 100644 app/controllers/application_controller.rb delete mode 100644 app/controllers/autocomplete_controller.rb delete mode 100644 app/controllers/confirmations_controller.rb delete mode 100644 app/controllers/dashboard/groups_controller.rb delete mode 100644 app/controllers/dashboard/milestones_controller.rb delete mode 100644 app/controllers/dashboard/projects_controller.rb delete mode 100644 app/controllers/dashboard_controller.rb delete mode 100644 app/controllers/explore/groups_controller.rb delete mode 100644 app/controllers/explore/projects_controller.rb delete mode 100644 app/controllers/groups/application_controller.rb delete mode 100644 app/controllers/groups/avatars_controller.rb delete mode 100644 app/controllers/groups/group_members_controller.rb delete mode 100644 app/controllers/groups/milestones_controller.rb delete mode 100644 app/controllers/groups_controller.rb delete mode 100644 app/controllers/import/base_controller.rb delete mode 100644 app/controllers/import/bitbucket_controller.rb delete mode 100644 app/controllers/import/github_controller.rb delete mode 100644 app/controllers/import/gitlab_controller.rb delete mode 100644 app/controllers/import/gitorious_controller.rb delete mode 100644 app/controllers/invites_controller.rb delete mode 100644 app/controllers/namespaces_controller.rb delete mode 100644 app/controllers/oauth/applications_controller.rb delete mode 100644 app/controllers/oauth/authorizations_controller.rb delete mode 100644 app/controllers/oauth/authorized_applications_controller.rb delete mode 100644 app/controllers/omniauth_callbacks_controller.rb delete mode 100644 app/controllers/passwords_controller.rb delete mode 100644 app/controllers/profiles/accounts_controller.rb delete mode 100644 app/controllers/profiles/avatars_controller.rb delete mode 100644 app/controllers/profiles/emails_controller.rb delete mode 100644 app/controllers/profiles/keys_controller.rb delete mode 100644 app/controllers/profiles/notifications_controller.rb delete mode 100644 app/controllers/profiles/passwords_controller.rb delete mode 100644 app/controllers/profiles_controller.rb delete mode 100644 app/controllers/projects/application_controller.rb delete mode 100644 app/controllers/projects/avatars_controller.rb delete mode 100644 app/controllers/projects/blame_controller.rb delete mode 100644 app/controllers/projects/blob_controller.rb delete mode 100644 app/controllers/projects/branches_controller.rb delete mode 100644 app/controllers/projects/commit_controller.rb delete mode 100644 app/controllers/projects/commits_controller.rb delete mode 100644 app/controllers/projects/compare_controller.rb delete mode 100644 app/controllers/projects/deploy_keys_controller.rb delete mode 100644 app/controllers/projects/forks_controller.rb delete mode 100644 app/controllers/projects/graphs_controller.rb delete mode 100644 app/controllers/projects/hooks_controller.rb delete mode 100644 app/controllers/projects/imports_controller.rb delete mode 100644 app/controllers/projects/issues_controller.rb delete mode 100644 app/controllers/projects/labels_controller.rb delete mode 100644 app/controllers/projects/merge_requests_controller.rb delete mode 100644 app/controllers/projects/milestones_controller.rb delete mode 100644 app/controllers/projects/network_controller.rb delete mode 100644 app/controllers/projects/notes_controller.rb delete mode 100644 app/controllers/projects/project_members_controller.rb delete mode 100644 app/controllers/projects/protected_branches_controller.rb delete mode 100644 app/controllers/projects/raw_controller.rb delete mode 100644 app/controllers/projects/refs_controller.rb delete mode 100644 app/controllers/projects/repositories_controller.rb delete mode 100644 app/controllers/projects/services_controller.rb delete mode 100644 app/controllers/projects/snippets_controller.rb delete mode 100644 app/controllers/projects/tags_controller.rb delete mode 100644 app/controllers/projects/tree_controller.rb delete mode 100644 app/controllers/projects/wikis_controller.rb delete mode 100644 app/controllers/projects_controller.rb delete mode 100644 app/controllers/registrations_controller.rb delete mode 100644 app/controllers/search_controller.rb delete mode 100644 app/controllers/sessions_controller.rb delete mode 100644 app/controllers/snippets_controller.rb delete mode 100644 app/controllers/uploads_controller.rb delete mode 100644 app/controllers/users_controller.rb delete mode 100644 app/finders/README.md delete mode 100644 app/finders/groups_finder.rb delete mode 100644 app/finders/issuable_finder.rb delete mode 100644 app/finders/issues_finder.rb delete mode 100644 app/finders/merge_requests_finder.rb delete mode 100644 app/finders/notes_finder.rb delete mode 100644 app/finders/projects_finder.rb delete mode 100644 app/finders/snippets_finder.rb delete mode 100644 app/finders/trending_projects_finder.rb delete mode 100644 app/helpers/appearances_helper.rb delete mode 100644 app/helpers/application_helper.rb delete mode 100644 app/helpers/application_settings_helper.rb delete mode 100644 app/helpers/blob_helper.rb delete mode 100644 app/helpers/branches_helper.rb delete mode 100644 app/helpers/broadcast_messages_helper.rb delete mode 100644 app/helpers/commits_helper.rb delete mode 100644 app/helpers/compare_helper.rb delete mode 100644 app/helpers/dashboard_helper.rb delete mode 100644 app/helpers/diff_helper.rb delete mode 100644 app/helpers/emails_helper.rb delete mode 100644 app/helpers/events_helper.rb delete mode 100644 app/helpers/explore_helper.rb delete mode 100644 app/helpers/external_wiki_helper.rb delete mode 100644 app/helpers/git_helper.rb delete mode 100644 app/helpers/gitlab_markdown_helper.rb delete mode 100644 app/helpers/gitlab_routing_helper.rb delete mode 100644 app/helpers/graph_helper.rb delete mode 100644 app/helpers/groups_helper.rb delete mode 100644 app/helpers/icons_helper.rb delete mode 100644 app/helpers/issues_helper.rb delete mode 100644 app/helpers/labels_helper.rb delete mode 100644 app/helpers/merge_requests_helper.rb delete mode 100644 app/helpers/milestones_helper.rb delete mode 100644 app/helpers/namespaces_helper.rb delete mode 100644 app/helpers/nav_helper.rb delete mode 100644 app/helpers/notes_helper.rb delete mode 100644 app/helpers/notifications_helper.rb delete mode 100644 app/helpers/oauth_helper.rb delete mode 100644 app/helpers/profile_helper.rb delete mode 100644 app/helpers/projects_helper.rb delete mode 100644 app/helpers/search_helper.rb delete mode 100644 app/helpers/selects_helper.rb delete mode 100644 app/helpers/snippets_helper.rb delete mode 100644 app/helpers/sorting_helper.rb delete mode 100644 app/helpers/submodule_helper.rb delete mode 100644 app/helpers/tab_helper.rb delete mode 100644 app/helpers/tags_helper.rb delete mode 100644 app/helpers/tree_helper.rb delete mode 100644 app/helpers/visibility_level_helper.rb delete mode 100644 app/helpers/wiki_helper.rb delete mode 100644 app/mailers/.gitkeep delete mode 100644 app/mailers/emails/groups.rb delete mode 100644 app/mailers/emails/issues.rb delete mode 100644 app/mailers/emails/merge_requests.rb delete mode 100644 app/mailers/emails/notes.rb delete mode 100644 app/mailers/emails/profile.rb delete mode 100644 app/mailers/emails/projects.rb delete mode 100644 app/mailers/notify.rb delete mode 100644 app/models/.gitkeep delete mode 100644 app/models/ability.rb delete mode 100644 app/models/application_setting.rb delete mode 100644 app/models/broadcast_message.rb delete mode 100644 app/models/commit.rb delete mode 100644 app/models/concerns/internal_id.rb delete mode 100644 app/models/concerns/issuable.rb delete mode 100644 app/models/concerns/mentionable.rb delete mode 100644 app/models/concerns/notifiable.rb delete mode 100644 app/models/concerns/sortable.rb delete mode 100644 app/models/concerns/taskable.rb delete mode 100644 app/models/concerns/token_authenticatable.rb delete mode 100644 app/models/deploy_key.rb delete mode 100644 app/models/deploy_keys_project.rb delete mode 100644 app/models/diff_line.rb delete mode 100644 app/models/email.rb delete mode 100644 app/models/event.rb delete mode 100644 app/models/external_issue.rb delete mode 100644 app/models/forked_project_link.rb delete mode 100644 app/models/group.rb delete mode 100644 app/models/group_milestone.rb delete mode 100644 app/models/hooks/project_hook.rb delete mode 100644 app/models/hooks/service_hook.rb delete mode 100644 app/models/hooks/system_hook.rb delete mode 100644 app/models/hooks/web_hook.rb delete mode 100644 app/models/identity.rb delete mode 100644 app/models/issue.rb delete mode 100644 app/models/key.rb delete mode 100644 app/models/label_link.rb delete mode 100644 app/models/member.rb delete mode 100644 app/models/members/group_member.rb delete mode 100644 app/models/members/project_member.rb delete mode 100644 app/models/merge_request.rb delete mode 100644 app/models/merge_request_diff.rb delete mode 100644 app/models/milestone.rb delete mode 100644 app/models/network/commit.rb delete mode 100644 app/models/network/graph.rb delete mode 100644 app/models/note.rb delete mode 100644 app/models/notification.rb delete mode 100644 app/models/personal_snippet.rb delete mode 100644 app/models/project_services/asana_service.rb delete mode 100644 app/models/project_services/assembla_service.rb delete mode 100644 app/models/project_services/bamboo_service.rb delete mode 100644 app/models/project_services/buildkite_service.rb delete mode 100644 app/models/project_services/campfire_service.rb delete mode 100644 app/models/project_services/ci_service.rb delete mode 100644 app/models/project_services/custom_issue_tracker_service.rb delete mode 100644 app/models/project_services/emails_on_push_service.rb delete mode 100644 app/models/project_services/external_wiki_service.rb delete mode 100644 app/models/project_services/flowdock_service.rb delete mode 100644 app/models/project_services/gemnasium_service.rb delete mode 100644 app/models/project_services/gitlab_ci_service.rb delete mode 100644 app/models/project_services/gitlab_issue_tracker_service.rb delete mode 100644 app/models/project_services/hipchat_service.rb delete mode 100644 app/models/project_services/irker_service.rb delete mode 100644 app/models/project_services/issue_tracker_service.rb delete mode 100644 app/models/project_services/jira_service.rb delete mode 100644 app/models/project_services/pivotaltracker_service.rb delete mode 100644 app/models/project_services/pushover_service.rb delete mode 100644 app/models/project_services/redmine_service.rb delete mode 100644 app/models/project_services/slack_service.rb delete mode 100644 app/models/project_services/slack_service/base_message.rb delete mode 100644 app/models/project_services/slack_service/issue_message.rb delete mode 100644 app/models/project_services/slack_service/merge_message.rb delete mode 100644 app/models/project_services/slack_service/note_message.rb delete mode 100644 app/models/project_services/slack_service/push_message.rb delete mode 100644 app/models/project_services/teamcity_service.rb delete mode 100644 app/models/project_snippet.rb delete mode 100644 app/models/project_team.rb delete mode 100644 app/models/project_wiki.rb delete mode 100644 app/models/protected_branch.rb delete mode 100644 app/models/repository.rb delete mode 100644 app/models/service.rb delete mode 100644 app/models/snippet.rb delete mode 100644 app/models/subscription.rb delete mode 100644 app/models/tree.rb delete mode 100644 app/models/user.rb delete mode 100644 app/models/users_star_project.rb delete mode 100644 app/models/wiki_page.rb delete mode 100644 app/services/archive_repository_service.rb delete mode 100644 app/services/base_service.rb delete mode 100644 app/services/compare_service.rb delete mode 100644 app/services/create_branch_service.rb delete mode 100644 app/services/create_snippet_service.rb delete mode 100644 app/services/create_tag_service.rb delete mode 100644 app/services/delete_branch_service.rb delete mode 100644 app/services/delete_tag_service.rb delete mode 100644 app/services/event_create_service.rb delete mode 100644 app/services/files/base_service.rb delete mode 100644 app/services/files/create_service.rb delete mode 100644 app/services/files/delete_service.rb delete mode 100644 app/services/files/update_service.rb delete mode 100644 app/services/git_push_service.rb delete mode 100644 app/services/git_tag_push_service.rb delete mode 100644 app/services/gravatar_service.rb delete mode 100644 app/services/issuable_base_service.rb delete mode 100644 app/services/issues/base_service.rb delete mode 100644 app/services/issues/bulk_update_service.rb delete mode 100644 app/services/issues/close_service.rb delete mode 100644 app/services/issues/create_service.rb delete mode 100644 app/services/issues/reopen_service.rb delete mode 100644 app/services/issues/update_service.rb delete mode 100644 app/services/merge_requests/auto_merge_service.rb delete mode 100644 app/services/merge_requests/base_merge_service.rb delete mode 100644 app/services/merge_requests/base_service.rb delete mode 100644 app/services/merge_requests/build_service.rb delete mode 100644 app/services/merge_requests/close_service.rb delete mode 100644 app/services/merge_requests/create_service.rb delete mode 100644 app/services/merge_requests/merge_service.rb delete mode 100644 app/services/merge_requests/refresh_service.rb delete mode 100644 app/services/merge_requests/reopen_service.rb delete mode 100644 app/services/merge_requests/update_service.rb delete mode 100644 app/services/milestones/base_service.rb delete mode 100644 app/services/milestones/close_service.rb delete mode 100644 app/services/milestones/create_service.rb delete mode 100644 app/services/milestones/group_service.rb delete mode 100644 app/services/milestones/reopen_service.rb delete mode 100644 app/services/milestones/update_service.rb delete mode 100644 app/services/notes/create_service.rb delete mode 100644 app/services/notes/update_service.rb delete mode 100644 app/services/notification_service.rb delete mode 100644 app/services/oauth2/access_token_validation_service.rb delete mode 100644 app/services/projects/autocomplete_service.rb delete mode 100644 app/services/projects/create_service.rb delete mode 100644 app/services/projects/destroy_service.rb delete mode 100644 app/services/projects/fork_service.rb delete mode 100644 app/services/projects/participants_service.rb delete mode 100644 app/services/projects/transfer_service.rb delete mode 100644 app/services/projects/update_service.rb delete mode 100644 app/services/projects/upload_service.rb delete mode 100644 app/services/search/global_service.rb delete mode 100644 app/services/search/project_service.rb delete mode 100644 app/services/search/snippet_service.rb delete mode 100644 app/services/system_hooks_service.rb delete mode 100644 app/services/test_hook_service.rb delete mode 100644 app/services/update_snippet_service.rb delete mode 100644 app/uploaders/attachment_uploader.rb delete mode 100644 app/uploaders/avatar_uploader.rb delete mode 100644 app/uploaders/file_uploader.rb delete mode 100644 app/views/admin/application_settings/_form.html.haml delete mode 100644 app/views/admin/application_settings/show.html.haml delete mode 100644 app/views/admin/applications/_delete_form.html.haml delete mode 100644 app/views/admin/applications/_form.html.haml delete mode 100644 app/views/admin/applications/edit.html.haml delete mode 100644 app/views/admin/applications/index.html.haml delete mode 100644 app/views/admin/applications/new.html.haml delete mode 100644 app/views/admin/applications/show.html.haml delete mode 100644 app/views/admin/background_jobs/show.html.haml delete mode 100644 app/views/admin/broadcast_messages/index.html.haml delete mode 100644 app/views/admin/dashboard/index.html.haml delete mode 100644 app/views/admin/deploy_keys/index.html.haml delete mode 100644 app/views/admin/deploy_keys/new.html.haml delete mode 100644 app/views/admin/deploy_keys/show.html.haml delete mode 100644 app/views/admin/groups/_form.html.haml delete mode 100644 app/views/admin/groups/edit.html.haml delete mode 100644 app/views/admin/groups/index.html.haml delete mode 100644 app/views/admin/groups/new.html.haml delete mode 100644 app/views/admin/groups/show.html.haml delete mode 100644 app/views/admin/hooks/index.html.haml delete mode 100644 app/views/admin/keys/show.html.haml delete mode 100644 app/views/admin/logs/show.html.haml delete mode 100644 app/views/admin/projects/index.html.haml delete mode 100644 app/views/admin/projects/show.html.haml delete mode 100644 app/views/admin/services/_form.html.haml delete mode 100644 app/views/admin/services/edit.html.haml delete mode 100644 app/views/admin/services/index.html.haml delete mode 100644 app/views/admin/users/_form.html.haml delete mode 100644 app/views/admin/users/edit.html.haml delete mode 100644 app/views/admin/users/index.html.haml delete mode 100644 app/views/admin/users/new.html.haml delete mode 100644 app/views/admin/users/show.html.haml delete mode 100644 app/views/dashboard/_activities.html.haml delete mode 100644 app/views/dashboard/_projects.html.haml delete mode 100644 app/views/dashboard/_sidebar.html.haml delete mode 100644 app/views/dashboard/_zero_authorized_projects.html.haml delete mode 100644 app/views/dashboard/groups/index.html.haml delete mode 100644 app/views/dashboard/issues.atom.builder delete mode 100644 app/views/dashboard/issues.html.haml delete mode 100644 app/views/dashboard/merge_requests.html.haml delete mode 100644 app/views/dashboard/milestones/_issue.html.haml delete mode 100644 app/views/dashboard/milestones/_issues.html.haml delete mode 100644 app/views/dashboard/milestones/_merge_request.html.haml delete mode 100644 app/views/dashboard/milestones/_merge_requests.html.haml delete mode 100644 app/views/dashboard/milestones/_milestone.html.haml delete mode 100644 app/views/dashboard/milestones/index.html.haml delete mode 100644 app/views/dashboard/milestones/show.html.haml delete mode 100644 app/views/dashboard/projects/starred.html.haml delete mode 100644 app/views/dashboard/show.atom.builder delete mode 100644 app/views/dashboard/show.html.haml delete mode 100644 app/views/devise/confirmations/new.html.haml delete mode 100644 app/views/devise/mailer/confirmation_instructions.html.erb delete mode 100644 app/views/devise/mailer/reset_password_instructions.html.erb delete mode 100644 app/views/devise/mailer/unlock_instructions.html.erb delete mode 100644 app/views/devise/passwords/edit.html.haml delete mode 100644 app/views/devise/passwords/new.html.haml delete mode 100644 app/views/devise/registrations/edit.html.erb delete mode 100644 app/views/devise/registrations/new.html.haml delete mode 100644 app/views/devise/sessions/_new_base.html.haml delete mode 100644 app/views/devise/sessions/_new_ldap.html.haml delete mode 100644 app/views/devise/sessions/new.html.haml delete mode 100644 app/views/devise/shared/_links.erb delete mode 100644 app/views/devise/shared/_omniauth_box.html.haml delete mode 100644 app/views/devise/shared/_sign_in_link.html.haml delete mode 100644 app/views/devise/shared/_signin_box.html.haml delete mode 100644 app/views/devise/shared/_signup_box.html.haml delete mode 100644 app/views/devise/unlocks/new.html.erb delete mode 100644 app/views/doorkeeper/applications/_delete_form.html.haml delete mode 100644 app/views/doorkeeper/applications/_form.html.haml delete mode 100644 app/views/doorkeeper/applications/edit.html.haml delete mode 100644 app/views/doorkeeper/applications/index.html.haml delete mode 100644 app/views/doorkeeper/applications/new.html.haml delete mode 100644 app/views/doorkeeper/applications/show.html.haml delete mode 100644 app/views/doorkeeper/authorizations/error.html.haml delete mode 100644 app/views/doorkeeper/authorizations/new.html.haml delete mode 100644 app/views/doorkeeper/authorizations/show.html.haml delete mode 100644 app/views/doorkeeper/authorized_applications/_delete_form.html.haml delete mode 100644 app/views/doorkeeper/authorized_applications/index.html.haml delete mode 100644 app/views/errors/access_denied.html.haml delete mode 100644 app/views/errors/encoding.html.haml delete mode 100644 app/views/errors/git_not_found.html.haml delete mode 100644 app/views/errors/not_found.html.haml delete mode 100644 app/views/errors/omniauth_error.html.haml delete mode 100644 app/views/events/_commit.html.haml delete mode 100644 app/views/events/_event.html.haml delete mode 100644 app/views/events/_event_issue.atom.haml delete mode 100644 app/views/events/_event_last_push.html.haml delete mode 100644 app/views/events/_event_merge_request.atom.haml delete mode 100644 app/views/events/_event_note.atom.haml delete mode 100644 app/views/events/_event_push.atom.haml delete mode 100644 app/views/events/_events.html.haml delete mode 100644 app/views/events/event/_common.html.haml delete mode 100644 app/views/events/event/_created_project.html.haml delete mode 100644 app/views/events/event/_note.html.haml delete mode 100644 app/views/events/event/_push.html.haml delete mode 100644 app/views/explore/groups/index.html.haml delete mode 100644 app/views/explore/projects/_filter.html.haml delete mode 100644 app/views/explore/projects/_project.html.haml delete mode 100644 app/views/explore/projects/index.html.haml delete mode 100644 app/views/explore/projects/starred.html.haml delete mode 100644 app/views/explore/projects/trending.html.haml delete mode 100644 app/views/groups/_projects.html.haml delete mode 100644 app/views/groups/_settings_nav.html.haml delete mode 100644 app/views/groups/edit.html.haml delete mode 100644 app/views/groups/group_members/_group_member.html.haml delete mode 100644 app/views/groups/group_members/_new_group_member.html.haml delete mode 100644 app/views/groups/group_members/index.html.haml delete mode 100644 app/views/groups/group_members/update.js.haml delete mode 100644 app/views/groups/issues.atom.builder delete mode 100644 app/views/groups/issues.html.haml delete mode 100644 app/views/groups/merge_requests.html.haml delete mode 100644 app/views/groups/milestones/_issue.html.haml delete mode 100644 app/views/groups/milestones/_issues.html.haml delete mode 100644 app/views/groups/milestones/_merge_request.html.haml delete mode 100644 app/views/groups/milestones/_merge_requests.html.haml delete mode 100644 app/views/groups/milestones/_milestone.html.haml delete mode 100644 app/views/groups/milestones/index.html.haml delete mode 100644 app/views/groups/milestones/show.html.haml delete mode 100644 app/views/groups/new.html.haml delete mode 100644 app/views/groups/projects.html.haml delete mode 100644 app/views/groups/show.atom.builder delete mode 100644 app/views/groups/show.html.haml delete mode 100644 app/views/help/_shortcuts.html.haml delete mode 100644 app/views/help/index.html.haml delete mode 100644 app/views/help/shortcuts.js.haml delete mode 100644 app/views/help/ui.html.haml delete mode 100644 app/views/import/base/create.js.haml delete mode 100644 app/views/import/bitbucket/status.html.haml delete mode 100644 app/views/import/github/status.html.haml delete mode 100644 app/views/import/gitlab/status.html.haml delete mode 100644 app/views/import/gitorious/status.html.haml delete mode 100644 app/views/import/google_code/new.html.haml delete mode 100644 app/views/import/google_code/status.html.haml delete mode 100644 app/views/invites/show.html.haml delete mode 100644 app/views/kaminari/gitlab/_first_page.html.haml delete mode 100644 app/views/kaminari/gitlab/_gap.html.haml delete mode 100644 app/views/kaminari/gitlab/_last_page.html.haml delete mode 100644 app/views/kaminari/gitlab/_next_page.html.haml delete mode 100644 app/views/kaminari/gitlab/_page.html.haml delete mode 100644 app/views/kaminari/gitlab/_paginator.html.haml delete mode 100644 app/views/kaminari/gitlab/_prev_page.html.haml delete mode 100644 app/views/layouts/_broadcast.html.haml delete mode 100644 app/views/layouts/_collapse_button.html.haml delete mode 100644 app/views/layouts/_flash.html.haml delete mode 100644 app/views/layouts/_google_analytics.html.haml delete mode 100644 app/views/layouts/_head.html.haml delete mode 100644 app/views/layouts/_head_panel.html.haml delete mode 100644 app/views/layouts/_init_auto_complete.html.haml delete mode 100644 app/views/layouts/_page.html.haml delete mode 100644 app/views/layouts/_page_title.html.haml delete mode 100644 app/views/layouts/_piwik.html.haml delete mode 100644 app/views/layouts/_public_head_panel.html.haml delete mode 100644 app/views/layouts/_search.html.haml delete mode 100644 app/views/layouts/admin.html.haml delete mode 100644 app/views/layouts/application.html.haml delete mode 100644 app/views/layouts/devise.html.haml delete mode 100644 app/views/layouts/errors.html.haml delete mode 100644 app/views/layouts/explore.html.haml delete mode 100644 app/views/layouts/group.html.haml delete mode 100644 app/views/layouts/nav/_admin.html.haml delete mode 100644 app/views/layouts/nav/_dashboard.html.haml delete mode 100644 app/views/layouts/nav/_group.html.haml delete mode 100644 app/views/layouts/nav/_profile.html.haml delete mode 100644 app/views/layouts/nav/_project.html.haml delete mode 100644 app/views/layouts/navless.html.haml delete mode 100644 app/views/layouts/notify.html.haml delete mode 100644 app/views/layouts/profile.html.haml delete mode 100644 app/views/layouts/project_settings.html.haml delete mode 100644 app/views/layouts/projects.html.haml delete mode 100644 app/views/layouts/public_group.html.haml delete mode 100644 app/views/layouts/public_projects.html.haml delete mode 100644 app/views/layouts/public_users.html.haml delete mode 100644 app/views/layouts/search.html.haml delete mode 100644 app/views/notify/_note_message.html.haml delete mode 100644 app/views/notify/_reassigned_issuable_email.html.haml delete mode 100644 app/views/notify/_reassigned_issuable_email.text.erb delete mode 100644 app/views/notify/closed_issue_email.html.haml delete mode 100644 app/views/notify/closed_issue_email.text.haml delete mode 100644 app/views/notify/closed_merge_request_email.html.haml delete mode 100644 app/views/notify/closed_merge_request_email.text.haml delete mode 100644 app/views/notify/group_access_granted_email.html.haml delete mode 100644 app/views/notify/group_access_granted_email.text.erb delete mode 100644 app/views/notify/group_invite_accepted_email.html.haml delete mode 100644 app/views/notify/group_invite_accepted_email.text.erb delete mode 100644 app/views/notify/group_invite_declined_email.html.haml delete mode 100644 app/views/notify/group_invite_declined_email.text.erb delete mode 100644 app/views/notify/group_member_invited_email.html.haml delete mode 100644 app/views/notify/group_member_invited_email.text.erb delete mode 100644 app/views/notify/issue_status_changed_email.html.haml delete mode 100644 app/views/notify/issue_status_changed_email.text.erb delete mode 100644 app/views/notify/merge_request_status_email.html.haml delete mode 100644 app/views/notify/merge_request_status_email.text.haml delete mode 100644 app/views/notify/merged_merge_request_email.html.haml delete mode 100644 app/views/notify/merged_merge_request_email.text.haml delete mode 100644 app/views/notify/new_email_email.html.haml delete mode 100644 app/views/notify/new_email_email.text.erb delete mode 100644 app/views/notify/new_issue_email.html.haml delete mode 100644 app/views/notify/new_issue_email.text.erb delete mode 100644 app/views/notify/new_merge_request_email.html.haml delete mode 100644 app/views/notify/new_merge_request_email.text.erb delete mode 100644 app/views/notify/new_ssh_key_email.html.haml delete mode 100644 app/views/notify/new_ssh_key_email.text.erb delete mode 100644 app/views/notify/new_user_email.html.haml delete mode 100644 app/views/notify/new_user_email.text.erb delete mode 100644 app/views/notify/note_commit_email.html.haml delete mode 100644 app/views/notify/note_commit_email.text.erb delete mode 100644 app/views/notify/note_issue_email.html.haml delete mode 100644 app/views/notify/note_issue_email.text.erb delete mode 100644 app/views/notify/note_merge_request_email.html.haml delete mode 100644 app/views/notify/note_merge_request_email.text.erb delete mode 100644 app/views/notify/project_access_granted_email.html.haml delete mode 100644 app/views/notify/project_access_granted_email.text.erb delete mode 100644 app/views/notify/project_invite_accepted_email.html.haml delete mode 100644 app/views/notify/project_invite_accepted_email.text.erb delete mode 100644 app/views/notify/project_invite_declined_email.html.haml delete mode 100644 app/views/notify/project_invite_declined_email.text.erb delete mode 100644 app/views/notify/project_member_invited_email.html.haml delete mode 100644 app/views/notify/project_member_invited_email.text.erb delete mode 100644 app/views/notify/project_was_moved_email.html.haml delete mode 100644 app/views/notify/project_was_moved_email.text.erb delete mode 100644 app/views/notify/reassigned_issue_email.html.haml delete mode 100644 app/views/notify/reassigned_issue_email.text.erb delete mode 100644 app/views/notify/reassigned_merge_request_email.html.haml delete mode 100644 app/views/notify/reassigned_merge_request_email.text.erb delete mode 100644 app/views/notify/repository_push_email.html.haml delete mode 100644 app/views/notify/repository_push_email.text.haml delete mode 100644 app/views/profiles/accounts/show.html.haml delete mode 100644 app/views/profiles/applications.html.haml delete mode 100644 app/views/profiles/design.html.haml delete mode 100644 app/views/profiles/emails/index.html.haml delete mode 100644 app/views/profiles/history.html.haml delete mode 100644 app/views/profiles/keys/_form.html.haml delete mode 100644 app/views/profiles/keys/_key.html.haml delete mode 100644 app/views/profiles/keys/_key_details.html.haml delete mode 100644 app/views/profiles/keys/_key_table.html.haml delete mode 100644 app/views/profiles/keys/index.html.haml delete mode 100644 app/views/profiles/keys/new.html.haml delete mode 100644 app/views/profiles/keys/show.html.haml delete mode 100644 app/views/profiles/notifications/_settings.html.haml delete mode 100644 app/views/profiles/notifications/show.html.haml delete mode 100644 app/views/profiles/notifications/update.js.haml delete mode 100644 app/views/profiles/passwords/edit.html.haml delete mode 100644 app/views/profiles/passwords/new.html.haml delete mode 100644 app/views/profiles/show.html.haml delete mode 100644 app/views/profiles/update.js.erb delete mode 100644 app/views/profiles/update_username.js.haml delete mode 100644 app/views/projects/_bitbucket_import_modal.html.haml delete mode 100644 app/views/projects/_commit_button.html.haml delete mode 100644 app/views/projects/_dropdown.html.haml delete mode 100644 app/views/projects/_errors.html.haml delete mode 100644 app/views/projects/_github_import_modal.html.haml delete mode 100644 app/views/projects/_gitlab_import_modal.html.haml delete mode 100644 app/views/projects/_home_panel.html.haml delete mode 100644 app/views/projects/_issuable_form.html.haml delete mode 100644 app/views/projects/_md_preview.html.haml delete mode 100644 app/views/projects/_settings_nav.html.haml delete mode 100644 app/views/projects/_visibility_level.html.haml delete mode 100644 app/views/projects/_zen.html.haml delete mode 100644 app/views/projects/blame/show.html.haml delete mode 100644 app/views/projects/blob/_actions.html.haml delete mode 100644 app/views/projects/blob/_blob.html.haml delete mode 100644 app/views/projects/blob/_download.html.haml delete mode 100644 app/views/projects/blob/_editor.html.haml delete mode 100644 app/views/projects/blob/_image.html.haml delete mode 100644 app/views/projects/blob/_remove.html.haml delete mode 100644 app/views/projects/blob/_text.html.haml delete mode 100644 app/views/projects/blob/diff.html.haml delete mode 100644 app/views/projects/blob/edit.html.haml delete mode 100644 app/views/projects/blob/new.html.haml delete mode 100644 app/views/projects/blob/preview.html.haml delete mode 100644 app/views/projects/blob/show.html.haml delete mode 100644 app/views/projects/branches/_branch.html.haml delete mode 100644 app/views/projects/branches/destroy.js.haml delete mode 100644 app/views/projects/branches/index.html.haml delete mode 100644 app/views/projects/branches/new.html.haml delete mode 100644 app/views/projects/commit/_commit_box.html.haml delete mode 100644 app/views/projects/commit/branches.html.haml delete mode 100644 app/views/projects/commit/show.html.haml delete mode 100644 app/views/projects/commits/_commit.html.haml delete mode 100644 app/views/projects/commits/_commit_list.html.haml delete mode 100644 app/views/projects/commits/_commits.html.haml delete mode 100644 app/views/projects/commits/_head.html.haml delete mode 100644 app/views/projects/commits/_inline_commit.html.haml delete mode 100644 app/views/projects/commits/show.atom.builder delete mode 100644 app/views/projects/commits/show.html.haml delete mode 100644 app/views/projects/compare/_form.html.haml delete mode 100644 app/views/projects/compare/index.html.haml delete mode 100644 app/views/projects/compare/show.html.haml delete mode 100644 app/views/projects/deploy_keys/_deploy_key.html.haml delete mode 100644 app/views/projects/deploy_keys/_form.html.haml delete mode 100644 app/views/projects/deploy_keys/index.html.haml delete mode 100644 app/views/projects/deploy_keys/new.html.haml delete mode 100644 app/views/projects/deploy_keys/show.html.haml delete mode 100644 app/views/projects/diffs/_diffs.html.haml delete mode 100644 app/views/projects/diffs/_file.html.haml delete mode 100644 app/views/projects/diffs/_image.html.haml delete mode 100644 app/views/projects/diffs/_match_line.html.haml delete mode 100644 app/views/projects/diffs/_match_line_parallel.html.haml delete mode 100644 app/views/projects/diffs/_parallel_view.html.haml delete mode 100644 app/views/projects/diffs/_stats.html.haml delete mode 100644 app/views/projects/diffs/_text_file.html.haml delete mode 100644 app/views/projects/diffs/_warning.html.haml delete mode 100644 app/views/projects/edit.html.haml delete mode 100644 app/views/projects/empty.html.haml delete mode 100644 app/views/projects/forks/error.html.haml delete mode 100644 app/views/projects/forks/new.html.haml delete mode 100644 app/views/projects/go_import.html.haml delete mode 100644 app/views/projects/graphs/_head.html.haml delete mode 100644 app/views/projects/graphs/commits.html.haml delete mode 100644 app/views/projects/graphs/show.html.haml delete mode 100644 app/views/projects/hooks/index.html.haml delete mode 100644 app/views/projects/imports/new.html.haml delete mode 100644 app/views/projects/imports/show.html.haml delete mode 100644 app/views/projects/issues/_discussion.html.haml delete mode 100644 app/views/projects/issues/_form.html.haml delete mode 100644 app/views/projects/issues/_issue.html.haml delete mode 100644 app/views/projects/issues/_issue_context.html.haml delete mode 100644 app/views/projects/issues/_issues.html.haml delete mode 100644 app/views/projects/issues/edit.html.haml delete mode 100644 app/views/projects/issues/index.atom.builder delete mode 100644 app/views/projects/issues/index.html.haml delete mode 100644 app/views/projects/issues/new.html.haml delete mode 100644 app/views/projects/issues/show.html.haml delete mode 100644 app/views/projects/issues/update.js.haml delete mode 100644 app/views/projects/labels/_label.html.haml delete mode 100644 app/views/projects/labels/destroy.js.haml delete mode 100644 app/views/projects/labels/edit.html.haml delete mode 100644 app/views/projects/labels/index.html.haml delete mode 100644 app/views/projects/labels/new.html.haml delete mode 100644 app/views/projects/merge_requests/_discussion.html.haml delete mode 100644 app/views/projects/merge_requests/_form.html.haml delete mode 100644 app/views/projects/merge_requests/_head.html.haml delete mode 100644 app/views/projects/merge_requests/_merge_request.html.haml delete mode 100644 app/views/projects/merge_requests/_merge_requests.html.haml delete mode 100644 app/views/projects/merge_requests/_new_compare.html.haml delete mode 100644 app/views/projects/merge_requests/_new_submit.html.haml delete mode 100644 app/views/projects/merge_requests/_show.html.haml delete mode 100644 app/views/projects/merge_requests/automerge.js.haml delete mode 100644 app/views/projects/merge_requests/branch_from.js.haml delete mode 100644 app/views/projects/merge_requests/branch_to.js.haml delete mode 100644 app/views/projects/merge_requests/diffs.html.haml delete mode 100644 app/views/projects/merge_requests/edit.html.haml delete mode 100644 app/views/projects/merge_requests/index.html.haml delete mode 100644 app/views/projects/merge_requests/invalid.html.haml delete mode 100644 app/views/projects/merge_requests/new.html.haml delete mode 100644 app/views/projects/merge_requests/show.html.haml delete mode 100644 app/views/projects/merge_requests/show/_commits.html.haml delete mode 100644 app/views/projects/merge_requests/show/_context.html.haml delete mode 100644 app/views/projects/merge_requests/show/_diffs.html.haml delete mode 100644 app/views/projects/merge_requests/show/_how_to_merge.html.haml delete mode 100644 app/views/projects/merge_requests/show/_mr_accept.html.haml delete mode 100644 app/views/projects/merge_requests/show/_mr_box.html.haml delete mode 100644 app/views/projects/merge_requests/show/_mr_ci.html.haml delete mode 100644 app/views/projects/merge_requests/show/_mr_title.html.haml delete mode 100644 app/views/projects/merge_requests/show/_no_accept.html.haml delete mode 100644 app/views/projects/merge_requests/show/_participants.html.haml delete mode 100644 app/views/projects/merge_requests/show/_remove_source_branch.html.haml delete mode 100644 app/views/projects/merge_requests/show/_state_widget.html.haml delete mode 100644 app/views/projects/merge_requests/update.js.haml delete mode 100644 app/views/projects/merge_requests/update_branches.js.haml delete mode 100644 app/views/projects/milestones/_form.html.haml delete mode 100644 app/views/projects/milestones/_issue.html.haml delete mode 100644 app/views/projects/milestones/_issues.html.haml delete mode 100644 app/views/projects/milestones/_merge_request.html.haml delete mode 100644 app/views/projects/milestones/_merge_requests.html.haml delete mode 100644 app/views/projects/milestones/_milestone.html.haml delete mode 100644 app/views/projects/milestones/edit.html.haml delete mode 100644 app/views/projects/milestones/index.html.haml delete mode 100644 app/views/projects/milestones/new.html.haml delete mode 100644 app/views/projects/milestones/show.html.haml delete mode 100644 app/views/projects/milestones/update.js.haml delete mode 100644 app/views/projects/network/_head.html.haml delete mode 100644 app/views/projects/network/show.html.haml delete mode 100644 app/views/projects/network/show.json.erb delete mode 100644 app/views/projects/new.html.haml delete mode 100644 app/views/projects/no_repo.html.haml delete mode 100644 app/views/projects/notes/_commit_discussion.html.haml delete mode 100644 app/views/projects/notes/_diff_notes_with_reply.html.haml delete mode 100644 app/views/projects/notes/_diff_notes_with_reply_parallel.html.haml delete mode 100644 app/views/projects/notes/_discussion.html.haml delete mode 100644 app/views/projects/notes/_edit_form.html.haml delete mode 100644 app/views/projects/notes/_form.html.haml delete mode 100644 app/views/projects/notes/_form_errors.html.haml delete mode 100644 app/views/projects/notes/_note.html.haml delete mode 100644 app/views/projects/notes/_notes.html.haml delete mode 100644 app/views/projects/notes/_notes_with_form.html.haml delete mode 100644 app/views/projects/notes/discussions/_active.html.haml delete mode 100644 app/views/projects/notes/discussions/_commit.html.haml delete mode 100644 app/views/projects/notes/discussions/_diff.html.haml delete mode 100644 app/views/projects/notes/discussions/_outdated.html.haml delete mode 100644 app/views/projects/project_members/_group_members.html.haml delete mode 100644 app/views/projects/project_members/_new_project_member.html.haml delete mode 100644 app/views/projects/project_members/_project_member.html.haml delete mode 100644 app/views/projects/project_members/_team.html.haml delete mode 100644 app/views/projects/project_members/import.html.haml delete mode 100644 app/views/projects/project_members/index.html.haml delete mode 100644 app/views/projects/project_members/update.js.haml delete mode 100644 app/views/projects/protected_branches/_branches_list.html.haml delete mode 100644 app/views/projects/protected_branches/index.html.haml delete mode 100644 app/views/projects/refs/logs_tree.js.haml delete mode 100644 app/views/projects/repositories/_download_archive.html.haml delete mode 100644 app/views/projects/repositories/_feed.html.haml delete mode 100644 app/views/projects/services/_form.html.haml delete mode 100644 app/views/projects/services/edit.html.haml delete mode 100644 app/views/projects/services/index.html.haml delete mode 100644 app/views/projects/show.html.haml delete mode 100644 app/views/projects/snippets/_snippet.html.haml delete mode 100644 app/views/projects/snippets/edit.html.haml delete mode 100644 app/views/projects/snippets/index.html.haml delete mode 100644 app/views/projects/snippets/new.html.haml delete mode 100644 app/views/projects/snippets/show.html.haml delete mode 100644 app/views/projects/tags/_tag.html.haml delete mode 100644 app/views/projects/tags/destroy.js.haml delete mode 100644 app/views/projects/tags/index.html.haml delete mode 100644 app/views/projects/tags/new.html.haml delete mode 100644 app/views/projects/transfer.js.haml delete mode 100644 app/views/projects/tree/_blob_item.html.haml delete mode 100644 app/views/projects/tree/_readme.html.haml delete mode 100644 app/views/projects/tree/_spinner.html.haml delete mode 100644 app/views/projects/tree/_submodule_item.html.haml delete mode 100644 app/views/projects/tree/_tree.html.haml delete mode 100644 app/views/projects/tree/_tree_commit_column.html.haml delete mode 100644 app/views/projects/tree/_tree_item.html.haml delete mode 100644 app/views/projects/tree/show.html.haml delete mode 100644 app/views/projects/update.js.haml delete mode 100644 app/views/projects/wikis/_form.html.haml delete mode 100644 app/views/projects/wikis/_main_links.html.haml delete mode 100644 app/views/projects/wikis/_nav.html.haml delete mode 100644 app/views/projects/wikis/_new.html.haml delete mode 100644 app/views/projects/wikis/edit.html.haml delete mode 100644 app/views/projects/wikis/empty.html.haml delete mode 100644 app/views/projects/wikis/git_access.html.haml delete mode 100644 app/views/projects/wikis/history.html.haml delete mode 100644 app/views/projects/wikis/pages.html.haml delete mode 100644 app/views/projects/wikis/show.html.haml delete mode 100644 app/views/search/_filter.html.haml delete mode 100644 app/views/search/_global_filter.html.haml delete mode 100644 app/views/search/_project_filter.html.haml delete mode 100644 app/views/search/_results.html.haml delete mode 100644 app/views/search/_snippet_filter.html.haml delete mode 100644 app/views/search/results/_blob.html.haml delete mode 100644 app/views/search/results/_empty.html.haml delete mode 100644 app/views/search/results/_issue.html.haml delete mode 100644 app/views/search/results/_merge_request.html.haml delete mode 100644 app/views/search/results/_note.html.haml delete mode 100644 app/views/search/results/_project.html.haml delete mode 100644 app/views/search/results/_snippet_blob.html.haml delete mode 100644 app/views/search/results/_snippet_title.html.haml delete mode 100644 app/views/search/results/_wiki_blob.html.haml delete mode 100644 app/views/search/show.html.haml delete mode 100644 app/views/shared/_choose_group_avatar_button.html.haml delete mode 100644 app/views/shared/_clone_panel.html.haml delete mode 100644 app/views/shared/_commit_message_container.html.haml delete mode 100644 app/views/shared/_confirm_modal.html.haml delete mode 100644 app/views/shared/_event_filter.html.haml delete mode 100644 app/views/shared/_file_highlight.html.haml delete mode 100644 app/views/shared/_group_form.html.haml delete mode 100644 app/views/shared/_group_tips.html.haml delete mode 100644 app/views/shared/_issuable_filter.html.haml delete mode 100644 app/views/shared/_issuable_search_form.html.haml delete mode 100644 app/views/shared/_issues.html.haml delete mode 100644 app/views/shared/_merge_requests.html.haml delete mode 100644 app/views/shared/_milestones_filter.html.haml delete mode 100644 app/views/shared/_no_password.html.haml delete mode 100644 app/views/shared/_no_ssh.html.haml delete mode 100644 app/views/shared/_outdated_browser.html.haml delete mode 100644 app/views/shared/_project.html.haml delete mode 100644 app/views/shared/_projects_list.html.haml delete mode 100644 app/views/shared/_promo.html.haml delete mode 100644 app/views/shared/_ref_switcher.html.haml delete mode 100644 app/views/shared/_sort_dropdown.html.haml delete mode 100644 app/views/shared/snippets/_blob.html.haml delete mode 100644 app/views/shared/snippets/_form.html.haml delete mode 100644 app/views/shared/snippets/_visibility_level.html.haml delete mode 100644 app/views/snippets/_snippet.html.haml delete mode 100644 app/views/snippets/_snippets.html.haml delete mode 100644 app/views/snippets/current_user_index.html.haml delete mode 100644 app/views/snippets/edit.html.haml delete mode 100644 app/views/snippets/index.html.haml delete mode 100644 app/views/snippets/new.html.haml delete mode 100644 app/views/snippets/show.html.haml delete mode 100644 app/views/snippets/user_index.html.haml delete mode 100644 app/views/users/_groups.html.haml delete mode 100644 app/views/users/_profile.html.haml delete mode 100644 app/views/users/_projects.html.haml delete mode 100644 app/views/users/calendar.html.haml delete mode 100644 app/views/users/calendar_activities.html.haml delete mode 100644 app/views/users/show.atom.builder delete mode 100644 app/views/users/show.html.haml delete mode 100644 app/views/votes/_votes_block.html.haml delete mode 100644 app/views/votes/_votes_inline.html.haml delete mode 100644 app/workers/auto_merge_worker.rb delete mode 100644 app/workers/emails_on_push_worker.rb delete mode 100644 app/workers/fork_registration_worker.rb delete mode 100644 app/workers/gitlab_shell_worker.rb delete mode 100644 app/workers/irker_worker.rb delete mode 100644 app/workers/post_receive.rb delete mode 100644 app/workers/project_service_worker.rb delete mode 100644 app/workers/project_web_hook_worker.rb delete mode 100644 app/workers/repository_archive_worker.rb delete mode 100644 app/workers/repository_import_worker.rb delete mode 100644 app/workers/system_hook_worker.rb delete mode 100755 bin/background_jobs delete mode 100755 bin/bundle delete mode 100755 bin/check delete mode 100755 bin/guard delete mode 100755 bin/pkgr_before_precompile.sh delete mode 100755 bin/rails delete mode 100755 bin/rake delete mode 100755 bin/rspec delete mode 100755 bin/spinach delete mode 100755 bin/spring delete mode 100644 bin/upgrade.rb delete mode 100755 bin/web delete mode 100644 config.ru delete mode 100644 config/application.rb delete mode 100644 config/aws.yml.example delete mode 100644 config/boot.rb delete mode 100644 config/database.yml.mysql delete mode 100644 config/database.yml.postgresql delete mode 100644 config/environment.rb delete mode 100644 config/environments/development.rb delete mode 100644 config/environments/production.rb delete mode 100644 config/environments/test.rb delete mode 100644 config/gitlab.teatro.yml delete mode 100644 config/gitlab.yml.example delete mode 100644 config/initializers/1_settings.rb delete mode 100644 config/initializers/2_app.rb delete mode 100644 config/initializers/3_grit_ext.rb delete mode 100644 config/initializers/4_sidekiq.rb delete mode 100644 config/initializers/5_backend.rb delete mode 100644 config/initializers/6_rack_profiler.rb delete mode 100644 config/initializers/7_omniauth.rb delete mode 100644 config/initializers/backtrace_silencers.rb delete mode 100644 config/initializers/carrierwave.rb delete mode 100644 config/initializers/devise.rb delete mode 100644 config/initializers/devise_async.rb delete mode 100644 config/initializers/devise_password_length.rb.example delete mode 100644 config/initializers/disable_email_interceptor.rb delete mode 100644 config/initializers/gitlab_shell_secret_token.rb delete mode 100644 config/initializers/haml.rb delete mode 100644 config/initializers/inflections.rb delete mode 100644 config/initializers/kaminari_config.rb delete mode 100644 config/initializers/postgresql_limit_fix.rb delete mode 100644 config/initializers/public_key.rb delete mode 100644 config/initializers/rack_attack.rb.example delete mode 100644 config/initializers/rack_attack_git_basic_auth.rb delete mode 100644 config/initializers/redis-store-fix-expiry.rb delete mode 100644 config/initializers/secret_token.rb delete mode 100644 config/initializers/session_store.rb delete mode 100644 config/initializers/smtp_settings.rb.sample delete mode 100644 config/initializers/state_machine_patch.rb delete mode 100644 config/initializers/static_files.rb delete mode 100644 config/initializers/time_zone.rb delete mode 100644 config/initializers/wrap_parameters.rb delete mode 100644 config/locales/devise.en.yml delete mode 100644 config/locales/doorkeeper.en.yml delete mode 100644 config/locales/en.yml delete mode 100644 config/newrelic.yml delete mode 100644 config/resque.yml.example delete mode 100644 config/unicorn.rb.example delete mode 100644 config/unicorn.rb.example.development delete mode 100644 db/fixtures/development/01_admin.rb delete mode 100644 db/fixtures/development/04_project.rb delete mode 100644 db/fixtures/development/05_users.rb delete mode 100644 db/fixtures/development/06_teams.rb delete mode 100644 db/fixtures/development/07_milestones.rb delete mode 100644 db/fixtures/development/09_issues.rb delete mode 100644 db/fixtures/development/10_merge_requests.rb delete mode 100644 db/fixtures/development/11_keys.rb delete mode 100644 db/fixtures/development/12_snippets.rb delete mode 100644 db/fixtures/development/13_comments.rb delete mode 100644 db/fixtures/production/001_admin.rb delete mode 100644 db/fixtures/test/001_repo.rb delete mode 100644 db/migrate/20121220064453_init_schema.rb delete mode 100644 db/migrate/20130102143055_rename_owner_to_creator_for_project.rb delete mode 100644 db/migrate/20130110172407_add_public_to_project.rb delete mode 100644 db/migrate/20130123114545_add_issues_tracker_to_project.rb delete mode 100644 db/migrate/20130125090214_add_user_permissions.rb delete mode 100644 db/migrate/20130131070232_remove_private_flag_from_project.rb delete mode 100644 db/migrate/20130206084024_add_description_to_namsespace.rb delete mode 100644 db/migrate/20130207104426_add_description_to_teams.rb delete mode 100644 db/migrate/20130211085435_add_issues_tracker_id_to_project.rb delete mode 100644 db/migrate/20130214154045_rename_state_to_merge_status_in_milestone.rb delete mode 100644 db/migrate/20130218140952_add_state_to_issue.rb delete mode 100644 db/migrate/20130218141038_add_state_to_merge_request.rb delete mode 100644 db/migrate/20130218141117_add_state_to_milestone.rb delete mode 100644 db/migrate/20130218141258_convert_closed_to_state_in_issue.rb delete mode 100644 db/migrate/20130218141327_convert_closed_to_state_in_merge_request.rb delete mode 100644 db/migrate/20130218141344_convert_closed_to_state_in_milestone.rb delete mode 100644 db/migrate/20130218141444_remove_merged_from_merge_request.rb delete mode 100644 db/migrate/20130218141507_remove_closed_from_issue.rb delete mode 100644 db/migrate/20130218141536_remove_closed_from_merge_request.rb delete mode 100644 db/migrate/20130218141554_remove_closed_from_milestone.rb delete mode 100644 db/migrate/20130220124204_add_new_merge_status_to_merge_request.rb delete mode 100644 db/migrate/20130220125544_convert_merge_status_in_merge_request.rb delete mode 100644 db/migrate/20130220125545_remove_merge_status_from_merge_request.rb delete mode 100644 db/migrate/20130220133245_rename_new_merge_status_to_merge_status_in_milestone.rb delete mode 100644 db/migrate/20130304104623_add_state_to_user.rb delete mode 100644 db/migrate/20130304104740_convert_blocked_to_state.rb delete mode 100644 db/migrate/20130304105317_remove_blocked_from_user.rb delete mode 100644 db/migrate/20130315124931_user_color_scheme.rb delete mode 100644 db/migrate/20130318212250_add_snippets_to_features.rb delete mode 100644 db/migrate/20130319214458_create_forked_project_links.rb delete mode 100644 db/migrate/20130323174317_add_private_to_snippets.rb delete mode 100644 db/migrate/20130324151736_add_type_to_snippets.rb delete mode 100644 db/migrate/20130324172327_change_project_id_to_null_in_snipepts.rb delete mode 100644 db/migrate/20130324203535_add_type_value_for_snippets.rb delete mode 100644 db/migrate/20130325173941_add_notification_level_to_user.rb delete mode 100644 db/migrate/20130326142630_add_index_to_users_authentication_token.rb delete mode 100644 db/migrate/20130403003950_add_last_activity_column_into_project.rb delete mode 100644 db/migrate/20130404164628_add_notification_level_to_user_project.rb delete mode 100644 db/migrate/20130410175022_remove_wiki_table.rb delete mode 100644 db/migrate/20130419190306_allow_merges_for_forks.rb delete mode 100644 db/migrate/20130506085413_add_type_to_key.rb delete mode 100644 db/migrate/20130506090604_create_deploy_keys_projects.rb delete mode 100644 db/migrate/20130506095501_remove_project_id_from_key.rb delete mode 100644 db/migrate/20130522141856_add_more_fields_to_service.rb delete mode 100644 db/migrate/20130528184641_add_system_to_notes.rb delete mode 100644 db/migrate/20130611210815_increase_snippet_text_column_size.rb delete mode 100644 db/migrate/20130613165816_add_password_expires_at_to_users.rb delete mode 100644 db/migrate/20130613173246_add_created_by_id_to_user.rb delete mode 100644 db/migrate/20130614132337_add_improted_to_project.rb delete mode 100644 db/migrate/20130617095603_create_users_groups.rb delete mode 100644 db/migrate/20130621195223_add_notification_level_to_user_group.rb delete mode 100644 db/migrate/20130622115340_add_more_db_index.rb delete mode 100644 db/migrate/20130624162710_add_fingerprint_to_key.rb delete mode 100644 db/migrate/20130804151314_add_st_diff_to_note.rb delete mode 100644 db/migrate/20130809124851_add_permission_check_to_user.rb delete mode 100644 db/migrate/20130812143708_add_import_url_to_project.rb delete mode 100644 db/migrate/20130819182730_add_internal_ids_to_issues_and_mr.rb delete mode 100644 db/migrate/20130821090530_remove_deprecated_tables.rb delete mode 100644 db/migrate/20130821090531_add_internal_ids_to_milestones.rb delete mode 100644 db/migrate/20130909132950_add_description_to_merge_request.rb delete mode 100644 db/migrate/20130926081215_change_owner_id_for_group.rb delete mode 100644 db/migrate/20131005191208_add_avatar_to_users.rb delete mode 100644 db/migrate/20131009115346_add_confirmable_to_users.rb delete mode 100644 db/migrate/20131106151520_remove_default_branch.rb delete mode 100644 db/migrate/20131112114325_create_broadcast_messages.rb delete mode 100644 db/migrate/20131112220935_add_visibility_level_to_projects.rb delete mode 100644 db/migrate/20131129154016_add_archived_to_projects.rb delete mode 100644 db/migrate/20131130165425_add_color_and_font_to_broadcast_messages.rb delete mode 100644 db/migrate/20131202192556_add_event_fields_for_web_hook.rb delete mode 100644 db/migrate/20131214224427_add_hide_no_ssh_key_to_users.rb delete mode 100644 db/migrate/20131217102743_add_recipients_to_service.rb delete mode 100644 db/migrate/20140116231608_add_website_url_to_users.rb delete mode 100644 db/migrate/20140122112253_create_merge_request_diffs.rb delete mode 100644 db/migrate/20140122114406_migrate_mr_diffs.rb delete mode 100644 db/migrate/20140122122549_remove_m_rdiff_fields.rb delete mode 100644 db/migrate/20140125162722_add_avatar_to_projects.rb delete mode 100644 db/migrate/20140127170938_add_group_avatars.rb delete mode 100644 db/migrate/20140209025651_create_emails.rb delete mode 100644 db/migrate/20140214102325_add_api_key_to_services.rb delete mode 100644 db/migrate/20140304005354_add_index_merge_request_diffs_on_merge_request_id.rb delete mode 100644 db/migrate/20140305193308_add_tag_push_hooks_to_project_hook.rb delete mode 100644 db/migrate/20140312145357_add_import_status_to_project.rb delete mode 100644 db/migrate/20140313092127_migrate_already_imported_projects.rb delete mode 100644 db/migrate/20140407135544_fix_namespaces.rb delete mode 100644 db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb delete mode 100644 db/migrate/20140415124820_limits_to_mysql.rb delete mode 100644 db/migrate/20140416074002_add_index_on_iid.rb delete mode 100644 db/migrate/20140416185734_index_on_current_sign_in_at.rb delete mode 100644 db/migrate/20140428105831_add_notes_index_updated_at.rb delete mode 100644 db/migrate/20140502115131_add_repo_size_to_db.rb delete mode 100644 db/migrate/20140502125220_migrate_repo_size.rb delete mode 100644 db/migrate/20140611135229_add_position_to_merge_request.rb delete mode 100644 db/migrate/20140625115202_create_users_star_projects.rb delete mode 100644 db/migrate/20140729134820_create_labels.rb delete mode 100644 db/migrate/20140729140420_create_label_links.rb delete mode 100644 db/migrate/20140729145339_migrate_project_tags.rb delete mode 100644 db/migrate/20140729152420_migrate_taggable_labels.rb delete mode 100644 db/migrate/20140730111702_add_index_to_labels.rb delete mode 100644 db/migrate/20140903115954_migrate_to_new_shell.rb delete mode 100644 db/migrate/20140907220153_serialize_service_properties.rb delete mode 100644 db/migrate/20140914113604_add_members_table.rb delete mode 100644 db/migrate/20140914145549_migrate_to_new_members_model.rb delete mode 100644 db/migrate/20140914173417_remove_old_member_tables.rb delete mode 100644 db/migrate/20141006143943_move_slack_service_to_webhook.rb delete mode 100644 db/migrate/20141007100818_add_visibility_level_to_snippet.rb delete mode 100644 db/migrate/20141121133009_add_timestamps_to_members.rb delete mode 100644 db/migrate/20141121161704_add_identity_table.rb delete mode 100644 db/migrate/20141205134006_add_locked_at_to_merge_request.rb delete mode 100644 db/migrate/20141216155758_create_doorkeeper_tables.rb delete mode 100644 db/migrate/20141217125223_add_owner_to_application.rb delete mode 100644 db/migrate/20141223135007_add_import_data_to_project_table.rb delete mode 100644 db/migrate/20141226080412_add_developers_can_push_to_protected_branches.rb delete mode 100644 db/migrate/20150108073740_create_application_settings.rb delete mode 100644 db/migrate/20150116234544_add_home_page_url_for_application_settings.rb delete mode 100644 db/migrate/20150116234545_add_gitlab_access_token_to_user.rb delete mode 100644 db/migrate/20150125163100_add_default_branch_protection_setting.rb delete mode 100644 db/migrate/20150205211843_add_timestamps_to_identities.rb delete mode 100644 db/migrate/20150206181414_add_index_to_created_at.rb delete mode 100644 db/migrate/20150206222854_add_notification_email_to_user.rb delete mode 100644 db/migrate/20150209222013_add_missing_index.rb delete mode 100644 db/migrate/20150211172122_add_template_to_service.rb delete mode 100644 db/migrate/20150211174341_allow_null_in_services_project_id.rb delete mode 100644 db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb delete mode 100644 db/migrate/20150213114800_add_hide_no_password_to_user.rb delete mode 100644 db/migrate/20150213121042_add_password_automatically_set_to_user.rb delete mode 100644 db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb delete mode 100644 db/migrate/20150219004514_add_events_to_services.rb delete mode 100644 db/migrate/20150223022001_set_missing_last_activity_at.rb delete mode 100644 db/migrate/20150225065047_add_note_events_to_services.rb delete mode 100644 db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb delete mode 100644 db/migrate/20150306023106_fix_namespace_duplication.rb delete mode 100644 db/migrate/20150306023112_add_unique_index_to_namespace.rb delete mode 100644 db/migrate/20150313012111_create_subscriptions_table.rb delete mode 100644 db/migrate/20150320234437_add_location_to_user.rb delete mode 100644 db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb delete mode 100644 db/migrate/20150327122227_add_public_to_key.rb delete mode 100644 db/migrate/20150327150017_add_import_data_to_project.rb delete mode 100644 db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb delete mode 100644 db/migrate/20150406133311_add_invite_data_to_member.rb delete mode 100644 db/migrate/20150411000035_fix_identities.rb delete mode 100644 db/migrate/20150411180045_rename_buildbox_service.rb delete mode 100644 db/migrate/20150413192223_add_public_email_to_users.rb delete mode 100644 db/migrate/limits_to_mysql.rb delete mode 100644 db/seeds.rb delete mode 100644 doc/README.md delete mode 100644 doc/api/README.md delete mode 100644 doc/api/branches.md delete mode 100644 doc/api/commits.md delete mode 100644 doc/api/deploy_key_multiple_projects.md delete mode 100644 doc/api/deploy_keys.md delete mode 100644 doc/api/groups.md delete mode 100644 doc/api/issues.md delete mode 100644 doc/api/labels.md delete mode 100644 doc/api/merge_requests.md delete mode 100644 doc/api/milestones.md delete mode 100644 doc/api/notes.md delete mode 100644 doc/api/oauth2.md delete mode 100644 doc/api/project_snippets.md delete mode 100644 doc/api/projects.md delete mode 100644 doc/api/repositories.md delete mode 100644 doc/api/repository_files.md delete mode 100644 doc/api/services.md delete mode 100644 doc/api/session.md delete mode 100644 doc/api/system_hooks.md delete mode 100644 doc/api/users.md delete mode 100644 doc/customization/issue_closing.md delete mode 100644 doc/customization/libravatar.md delete mode 100644 doc/customization/welcome_message.md delete mode 100644 doc/development/README.md delete mode 100644 doc/development/architecture.md delete mode 100644 doc/development/ci_setup.md delete mode 100644 doc/development/gitlab_diagram_overview.odg delete mode 100644 doc/development/gitlab_diagram_overview.png delete mode 100644 doc/development/omnibus.md delete mode 100644 doc/development/rake_tasks.md delete mode 100644 doc/development/shell_commands.md delete mode 100644 doc/development/sidekiq_debugging.md delete mode 100644 doc/development/ui_guide.md delete mode 100644 doc/hooks/custom_hooks.md delete mode 100644 doc/install/README.md delete mode 100644 doc/install/database_mysql.md delete mode 100644 doc/install/installation.md delete mode 100644 doc/install/requirements.md delete mode 100644 doc/install/structure.md delete mode 100644 doc/integration/README.md delete mode 100644 doc/integration/bitbucket.md delete mode 100644 doc/integration/external-issue-tracker.md delete mode 100644 doc/integration/github.md delete mode 100644 doc/integration/github_app.png delete mode 100644 doc/integration/gitlab.md delete mode 100644 doc/integration/gitlab_actions.png delete mode 100644 doc/integration/gitlab_app.png delete mode 100644 doc/integration/gitlab_buttons_in_gmail.md delete mode 100644 doc/integration/google.md delete mode 100644 doc/integration/google_app.png delete mode 100644 doc/integration/jira-integration-points.png delete mode 100644 doc/integration/ldap.md delete mode 100644 doc/integration/oauth_provider.md delete mode 100644 doc/integration/oauth_provider/admin_application.png delete mode 100644 doc/integration/oauth_provider/application_form.png delete mode 100644 doc/integration/oauth_provider/authorized_application.png delete mode 100644 doc/integration/oauth_provider/user_wide_applications.png delete mode 100644 doc/integration/omniauth.md delete mode 100644 doc/integration/redmine_configuration.png delete mode 100644 doc/integration/redmine_service_template.png delete mode 100644 doc/integration/shibboleth.md delete mode 100644 doc/integration/slack.md delete mode 100644 doc/integration/twitter.md delete mode 100644 doc/integration/twitter_app_api_keys.png delete mode 100644 doc/integration/twitter_app_details.png delete mode 100644 doc/legal/README.md delete mode 100644 doc/legal/corporate_contributor_license_agreement.md delete mode 100644 doc/legal/individual_contributor_license_agreement.md delete mode 100644 doc/logs/logs.md delete mode 100644 doc/markdown/markdown.md delete mode 100644 doc/operations/README.md delete mode 100644 doc/operations/cleaning_up_redis_sessions.md delete mode 100644 doc/operations/sidekiq_memory_killer.md delete mode 100644 doc/permissions/permissions.md delete mode 100644 doc/project_services/bamboo.md delete mode 100644 doc/project_services/hipchat.md delete mode 100644 doc/project_services/irker.md delete mode 100644 doc/project_services/project_services.md delete mode 100644 doc/public_access/public_access.md delete mode 100644 doc/raketasks/README.md delete mode 100644 doc/raketasks/backup_hrz.png delete mode 100644 doc/raketasks/backup_restore.md delete mode 100644 doc/raketasks/cleanup.md delete mode 100644 doc/raketasks/features.md delete mode 100644 doc/raketasks/import.md delete mode 100644 doc/raketasks/maintenance.md delete mode 100644 doc/raketasks/user_management.md delete mode 100644 doc/raketasks/web_hooks.md delete mode 100644 doc/release/README.md delete mode 100644 doc/release/howto_rc1.md delete mode 100644 doc/release/howto_update_guides.md delete mode 100644 doc/release/master.md delete mode 100644 doc/release/monthly.md delete mode 100644 doc/release/patch.md delete mode 100644 doc/release/security.md delete mode 100644 doc/security/README.md delete mode 100644 doc/security/information_exclusivity.md delete mode 100644 doc/security/password_length_limits.md delete mode 100644 doc/security/rack_attack.md delete mode 100644 doc/security/webhooks.md delete mode 100644 doc/ssh/README.md delete mode 100644 doc/system_hooks/system_hooks.md delete mode 100644 doc/update/2.6-to-3.0.md delete mode 100644 doc/update/2.9-to-3.0.md delete mode 100644 doc/update/3.0-to-3.1.md delete mode 100644 doc/update/3.1-to-4.0.md delete mode 100644 doc/update/4.0-to-4.1.md delete mode 100644 doc/update/4.1-to-4.2.md delete mode 100644 doc/update/4.2-to-5.0.md delete mode 100644 doc/update/5.0-to-5.1.md delete mode 100644 doc/update/5.1-to-5.2.md delete mode 100644 doc/update/5.1-to-5.4.md delete mode 100644 doc/update/5.1-to-6.0.md delete mode 100644 doc/update/5.2-to-5.3.md delete mode 100644 doc/update/5.3-to-5.4.md delete mode 100644 doc/update/5.4-to-6.0.md delete mode 100644 doc/update/6.0-to-6.1.md delete mode 100644 doc/update/6.1-to-6.2.md delete mode 100644 doc/update/6.2-to-6.3.md delete mode 100644 doc/update/6.3-to-6.4.md delete mode 100644 doc/update/6.4-to-6.5.md delete mode 100644 doc/update/6.5-to-6.6.md delete mode 100644 doc/update/6.6-to-6.7.md delete mode 100644 doc/update/6.7-to-6.8.md delete mode 100644 doc/update/6.8-to-6.9.md delete mode 100644 doc/update/6.9-to-7.0.md delete mode 100644 doc/update/7.0-to-7.1.md delete mode 100644 doc/update/7.1-to-7.2.md delete mode 100644 doc/update/7.2-to-7.3.md delete mode 100644 doc/update/7.3-to-7.4.md delete mode 100644 doc/update/7.4-to-7.5.md delete mode 100644 doc/update/7.5-to-7.6.md delete mode 100644 doc/update/7.6-to-7.7.md delete mode 100644 doc/update/7.7-to-7.8.md delete mode 100644 doc/update/7.8-to-7.9.md delete mode 100644 doc/update/README.md delete mode 100644 doc/update/mysql_to_postgresql.md delete mode 100644 doc/update/patch_versions.md delete mode 100644 doc/update/upgrader.md delete mode 100644 doc/web_hooks/web_hooks.md delete mode 100644 doc/workflow/README.md delete mode 100644 doc/workflow/authorization_for_merge_requests.md delete mode 100644 doc/workflow/ci_mr.png delete mode 100644 doc/workflow/close_issue_mr.png delete mode 100644 doc/workflow/environment_branches.png delete mode 100644 doc/workflow/forking/branch_select.png delete mode 100644 doc/workflow/forking/fork_button.png delete mode 100644 doc/workflow/forking/groups.png delete mode 100644 doc/workflow/forking/merge_request.png delete mode 100644 doc/workflow/forking_workflow.md delete mode 100644 doc/workflow/four_stages.png delete mode 100644 doc/workflow/git_pull.png delete mode 100644 doc/workflow/gitdashflow.png delete mode 100644 doc/workflow/github_flow.png delete mode 100644 doc/workflow/github_importer/importer.png delete mode 100644 doc/workflow/github_importer/new_project_page.png delete mode 100644 doc/workflow/gitlab_flow.md delete mode 100644 doc/workflow/gitlab_flow.png delete mode 100644 doc/workflow/gitlab_importer/importer.png delete mode 100644 doc/workflow/gitlab_importer/new_project_page.png delete mode 100644 doc/workflow/good_commit.png delete mode 100644 doc/workflow/groups.md delete mode 100644 doc/workflow/groups/add_member_to_group.png delete mode 100644 doc/workflow/groups/group_dashboard.png delete mode 100644 doc/workflow/groups/group_with_two_projects.png delete mode 100644 doc/workflow/groups/new_group_button.png delete mode 100644 doc/workflow/groups/new_group_form.png delete mode 100644 doc/workflow/groups/override_access_level.png delete mode 100644 doc/workflow/groups/project_members_via_group.png delete mode 100644 doc/workflow/groups/transfer_project.png delete mode 100644 doc/workflow/import_projects_from_github.md delete mode 100644 doc/workflow/import_projects_from_gitlab_com.md delete mode 100644 doc/workflow/labels.md delete mode 100644 doc/workflow/labels/label1.png delete mode 100644 doc/workflow/labels/label2.png delete mode 100644 doc/workflow/labels/label3.png delete mode 100644 doc/workflow/merge_commits.png delete mode 100644 doc/workflow/merge_request.png delete mode 100644 doc/workflow/messy_flow.png delete mode 100644 doc/workflow/migrating_from_svn.md delete mode 100644 doc/workflow/mr_inline_comments.png delete mode 100644 doc/workflow/notifications.md delete mode 100644 doc/workflow/notifications/settings.png delete mode 100644 doc/workflow/production_branch.png delete mode 100644 doc/workflow/project_features.md delete mode 100644 doc/workflow/protected_branches.md delete mode 100644 doc/workflow/protected_branches/protected_branches1.png delete mode 100644 doc/workflow/protected_branches/protected_branches2.png delete mode 100644 doc/workflow/rebase.png delete mode 100644 doc/workflow/release_branches.png delete mode 100644 doc/workflow/remove_checkbox.png delete mode 100644 doc/workflow/voting_slider.png delete mode 100644 doc/workflow/web_editor.md delete mode 100644 doc/workflow/web_editor/edit_file.png delete mode 100644 doc/workflow/web_editor/empty_project.png delete mode 100644 doc/workflow/web_editor/new_file.png delete mode 100644 doc/workflow/web_editor/show_file.png delete mode 100644 doc/workflow/workflow.md delete mode 100644 docker/.dockerignore delete mode 100644 docker/Dockerfile delete mode 100644 docker/README.md delete mode 100755 docker/assets/wrapper delete mode 100644 docker/data/Dockerfile delete mode 100644 docker/data/assets/gitlab.rb delete mode 100644 docker/troubleshooting.md delete mode 100644 features/admin/active_tab.feature delete mode 100644 features/admin/applications.feature delete mode 100644 features/admin/broadcast_messages.feature delete mode 100644 features/admin/deploy_keys.feature delete mode 100644 features/admin/groups.feature delete mode 100644 features/admin/logs.feature delete mode 100644 features/admin/projects.feature delete mode 100644 features/admin/settings.feature delete mode 100644 features/admin/users.feature delete mode 100644 features/dashboard/active_tab.feature delete mode 100644 features/dashboard/archived_projects.feature delete mode 100644 features/dashboard/dashboard.feature delete mode 100644 features/dashboard/event_filters.feature delete mode 100644 features/dashboard/group.feature delete mode 100644 features/dashboard/help.feature delete mode 100644 features/dashboard/issues.feature delete mode 100644 features/dashboard/merge_requests.feature delete mode 100644 features/dashboard/new_project.feature delete mode 100644 features/dashboard/shortcuts.feature delete mode 100644 features/dashboard/starred_projects.feature delete mode 100644 features/explore/groups.feature delete mode 100644 features/explore/projects.feature delete mode 100644 features/groups.feature delete mode 100644 features/invites.feature delete mode 100644 features/profile/active_tab.feature delete mode 100644 features/profile/emails.feature delete mode 100644 features/profile/notifications.feature delete mode 100644 features/profile/profile.feature delete mode 100644 features/profile/ssh_keys.feature delete mode 100644 features/project/active_tab.feature delete mode 100644 features/project/archived.feature delete mode 100644 features/project/commits/branches.feature delete mode 100644 features/project/commits/comments.feature delete mode 100644 features/project/commits/commits.feature delete mode 100644 features/project/commits/diff_comments.feature delete mode 100644 features/project/commits/tags.feature delete mode 100644 features/project/commits/user_lookup.feature delete mode 100644 features/project/create.feature delete mode 100644 features/project/deploy_keys.feature delete mode 100644 features/project/fork.feature delete mode 100644 features/project/forked_merge_requests.feature delete mode 100644 features/project/graph.feature delete mode 100644 features/project/hooks.feature delete mode 100644 features/project/issues/filter_labels.feature delete mode 100644 features/project/issues/issues.feature delete mode 100644 features/project/issues/labels.feature delete mode 100644 features/project/issues/milestones.feature delete mode 100644 features/project/merge_requests.feature delete mode 100644 features/project/network_graph.feature delete mode 100644 features/project/project.feature delete mode 100644 features/project/redirects.feature delete mode 100644 features/project/service.feature delete mode 100644 features/project/shortcuts.feature delete mode 100644 features/project/snippets.feature delete mode 100644 features/project/source/browse_files.feature delete mode 100644 features/project/source/git_blame.feature delete mode 100644 features/project/source/markdown_render.feature delete mode 100644 features/project/source/multiselect_blob.feature delete mode 100644 features/project/source/search_code.feature delete mode 100644 features/project/star.feature delete mode 100644 features/project/team_management.feature delete mode 100644 features/project/wiki.feature delete mode 100644 features/search.feature delete mode 100644 features/snippet_search.feature delete mode 100644 features/snippets/discover.feature delete mode 100644 features/snippets/public_snippets.feature delete mode 100644 features/snippets/snippets.feature delete mode 100644 features/snippets/user.feature delete mode 100644 features/steps/admin/active_tab.rb delete mode 100644 features/steps/admin/applications.rb delete mode 100644 features/steps/admin/broadcast_messages.rb delete mode 100644 features/steps/admin/deploy_keys.rb delete mode 100644 features/steps/admin/groups.rb delete mode 100644 features/steps/admin/logs.rb delete mode 100644 features/steps/admin/projects.rb delete mode 100644 features/steps/admin/settings.rb delete mode 100644 features/steps/admin/users.rb delete mode 100644 features/steps/dashboard/active_tab.rb delete mode 100644 features/steps/dashboard/archived_projects.rb delete mode 100644 features/steps/dashboard/dashboard.rb delete mode 100644 features/steps/dashboard/event_filters.rb delete mode 100644 features/steps/dashboard/group.rb delete mode 100644 features/steps/dashboard/issues.rb delete mode 100644 features/steps/dashboard/merge_requests.rb delete mode 100644 features/steps/dashboard/new_project.rb delete mode 100644 features/steps/dashboard/shortcuts.rb delete mode 100644 features/steps/dashboard/starred_projects.rb delete mode 100644 features/steps/explore/groups.rb delete mode 100644 features/steps/explore/projects.rb delete mode 100644 features/steps/groups.rb delete mode 100644 features/steps/invites.rb delete mode 100644 features/steps/profile/active_tab.rb delete mode 100644 features/steps/profile/emails.rb delete mode 100644 features/steps/profile/notifications.rb delete mode 100644 features/steps/profile/profile.rb delete mode 100644 features/steps/profile/ssh_keys.rb delete mode 100644 features/steps/project/active_tab.rb delete mode 100644 features/steps/project/archived.rb delete mode 100644 features/steps/project/commits/branches.rb delete mode 100644 features/steps/project/commits/comments.rb delete mode 100644 features/steps/project/commits/commits.rb delete mode 100644 features/steps/project/commits/diff_comments.rb delete mode 100644 features/steps/project/commits/tags.rb delete mode 100644 features/steps/project/commits/user_lookup.rb delete mode 100644 features/steps/project/create.rb delete mode 100644 features/steps/project/deploy_keys.rb delete mode 100644 features/steps/project/fork.rb delete mode 100644 features/steps/project/forked_merge_requests.rb delete mode 100644 features/steps/project/graph.rb delete mode 100644 features/steps/project/hooks.rb delete mode 100644 features/steps/project/issues/filter_labels.rb delete mode 100644 features/steps/project/issues/issues.rb delete mode 100644 features/steps/project/issues/labels.rb delete mode 100644 features/steps/project/issues/milestones.rb delete mode 100644 features/steps/project/merge_requests.rb delete mode 100644 features/steps/project/network_graph.rb delete mode 100644 features/steps/project/project.rb delete mode 100644 features/steps/project/project_shortcuts.rb delete mode 100644 features/steps/project/redirects.rb delete mode 100644 features/steps/project/services.rb delete mode 100644 features/steps/project/snippets.rb delete mode 100644 features/steps/project/source/browse_files.rb delete mode 100644 features/steps/project/source/git_blame.rb delete mode 100644 features/steps/project/source/markdown_render.rb delete mode 100644 features/steps/project/source/multiselect_blob.rb delete mode 100644 features/steps/project/source/search_code.rb delete mode 100644 features/steps/project/star.rb delete mode 100644 features/steps/project/team_management.rb delete mode 100644 features/steps/project/wiki.rb delete mode 100644 features/steps/search.rb delete mode 100644 features/steps/shared/active_tab.rb delete mode 100644 features/steps/shared/admin.rb delete mode 100644 features/steps/shared/authentication.rb delete mode 100644 features/steps/shared/diff_note.rb delete mode 100644 features/steps/shared/group.rb delete mode 100644 features/steps/shared/issuable.rb delete mode 100644 features/steps/shared/markdown.rb delete mode 100644 features/steps/shared/note.rb delete mode 100644 features/steps/shared/paths.rb delete mode 100644 features/steps/shared/project.rb delete mode 100644 features/steps/shared/project_tab.rb delete mode 100644 features/steps/shared/search.rb delete mode 100644 features/steps/shared/shortcuts.rb delete mode 100644 features/steps/shared/snippet.rb delete mode 100644 features/steps/shared/user.rb delete mode 100644 features/steps/snippet_search.rb delete mode 100644 features/steps/snippets/discover.rb delete mode 100644 features/steps/snippets/public_snippets.rb delete mode 100644 features/steps/snippets/snippets.rb delete mode 100644 features/steps/snippets/user.rb delete mode 100644 features/steps/user.rb delete mode 100644 features/support/env.rb delete mode 100644 features/user.feature delete mode 100644 lib/api/api.rb delete mode 100644 lib/api/api_guard.rb delete mode 100644 lib/api/branches.rb delete mode 100644 lib/api/commits.rb delete mode 100644 lib/api/deploy_keys.rb delete mode 100644 lib/api/entities.rb delete mode 100644 lib/api/files.rb delete mode 100644 lib/api/group_members.rb delete mode 100644 lib/api/groups.rb delete mode 100644 lib/api/helpers.rb delete mode 100644 lib/api/internal.rb delete mode 100644 lib/api/issues.rb delete mode 100644 lib/api/labels.rb delete mode 100644 lib/api/merge_requests.rb delete mode 100644 lib/api/milestones.rb delete mode 100644 lib/api/namespaces.rb delete mode 100644 lib/api/notes.rb delete mode 100644 lib/api/project_hooks.rb delete mode 100644 lib/api/project_members.rb delete mode 100644 lib/api/project_snippets.rb delete mode 100644 lib/api/projects.rb delete mode 100644 lib/api/repositories.rb delete mode 100644 lib/api/services.rb delete mode 100644 lib/api/session.rb delete mode 100644 lib/api/system_hooks.rb delete mode 100644 lib/api/users.rb delete mode 100644 lib/assets/.gitkeep delete mode 100644 lib/backup/database.rb delete mode 100644 lib/backup/manager.rb delete mode 100644 lib/backup/repository.rb delete mode 100644 lib/backup/uploads.rb delete mode 100644 lib/disable_email_interceptor.rb delete mode 100644 lib/email_validator.rb delete mode 100644 lib/event_filter.rb delete mode 100644 lib/extracts_path.rb delete mode 100644 lib/file_size_validator.rb delete mode 100644 lib/gitlab.rb delete mode 100644 lib/gitlab/access.rb delete mode 100644 lib/gitlab/app_logger.rb delete mode 100644 lib/gitlab/auth.rb delete mode 100644 lib/gitlab/backend/grack_auth.rb delete mode 100644 lib/gitlab/backend/rack_attack_helpers.rb delete mode 100644 lib/gitlab/backend/shell.rb delete mode 100644 lib/gitlab/backend/shell_adapter.rb delete mode 100644 lib/gitlab/backend/shell_env.rb delete mode 100644 lib/gitlab/bitbucket_import.rb delete mode 100644 lib/gitlab/bitbucket_import/client.rb delete mode 100644 lib/gitlab/bitbucket_import/importer.rb delete mode 100644 lib/gitlab/bitbucket_import/key_adder.rb delete mode 100644 lib/gitlab/bitbucket_import/key_deleter.rb delete mode 100644 lib/gitlab/bitbucket_import/project_creator.rb delete mode 100644 lib/gitlab/blacklist.rb delete mode 100644 lib/gitlab/closing_issue_extractor.rb delete mode 100644 lib/gitlab/compare_result.rb delete mode 100644 lib/gitlab/config_helper.rb delete mode 100644 lib/gitlab/contributions_calendar.rb delete mode 100644 lib/gitlab/contributor.rb delete mode 100644 lib/gitlab/current_settings.rb delete mode 100644 lib/gitlab/diff/file.rb delete mode 100644 lib/gitlab/diff/line.rb delete mode 100644 lib/gitlab/diff/line_code.rb delete mode 100644 lib/gitlab/diff/parser.rb delete mode 100644 lib/gitlab/force_push_check.rb delete mode 100644 lib/gitlab/git.rb delete mode 100644 lib/gitlab/git_access.rb delete mode 100644 lib/gitlab/git_access_status.rb delete mode 100644 lib/gitlab/git_access_wiki.rb delete mode 100644 lib/gitlab/git_logger.rb delete mode 100644 lib/gitlab/git_ref_validator.rb delete mode 100644 lib/gitlab/github_import/client.rb delete mode 100644 lib/gitlab/github_import/importer.rb delete mode 100644 lib/gitlab/github_import/project_creator.rb delete mode 100644 lib/gitlab/gitlab_import/client.rb delete mode 100644 lib/gitlab/gitlab_import/importer.rb delete mode 100644 lib/gitlab/gitlab_import/project_creator.rb delete mode 100644 lib/gitlab/gitorious_import/client.rb delete mode 100644 lib/gitlab/gitorious_import/project_creator.rb delete mode 100644 lib/gitlab/gitorious_import/repository.rb delete mode 100644 lib/gitlab/google_code_import/client.rb delete mode 100644 lib/gitlab/google_code_import/repository.rb delete mode 100644 lib/gitlab/graphs/commits.rb delete mode 100644 lib/gitlab/identifier.rb delete mode 100644 lib/gitlab/import_formatter.rb delete mode 100644 lib/gitlab/inline_diff.rb delete mode 100644 lib/gitlab/issues_labels.rb delete mode 100644 lib/gitlab/key_fingerprint.rb delete mode 100644 lib/gitlab/ldap/access.rb delete mode 100644 lib/gitlab/ldap/adapter.rb delete mode 100644 lib/gitlab/ldap/authentication.rb delete mode 100644 lib/gitlab/ldap/config.rb delete mode 100644 lib/gitlab/ldap/person.rb delete mode 100644 lib/gitlab/ldap/user.rb delete mode 100644 lib/gitlab/logger.rb delete mode 100644 lib/gitlab/markdown_helper.rb delete mode 100644 lib/gitlab/middleware/static.rb delete mode 100644 lib/gitlab/note_data_builder.rb delete mode 100644 lib/gitlab/o_auth/auth_hash.rb delete mode 100644 lib/gitlab/o_auth/user.rb delete mode 100644 lib/gitlab/popen.rb delete mode 100644 lib/gitlab/production_logger.rb delete mode 100644 lib/gitlab/project_search_results.rb delete mode 100644 lib/gitlab/push_data_builder.rb delete mode 100644 lib/gitlab/reference_extractor.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/gitlab/search_results.rb delete mode 100644 lib/gitlab/seeder.rb delete mode 100644 lib/gitlab/sidekiq_logger.rb delete mode 100644 lib/gitlab/sidekiq_middleware/arguments_logger.rb delete mode 100644 lib/gitlab/sidekiq_middleware/memory_killer.rb delete mode 100644 lib/gitlab/snippet_search_results.rb delete mode 100644 lib/gitlab/theme.rb delete mode 100644 lib/gitlab/upgrader.rb delete mode 100644 lib/gitlab/url_builder.rb delete mode 100644 lib/gitlab/user_access.rb delete mode 100644 lib/gitlab/utils.rb delete mode 100644 lib/gitlab/version_info.rb delete mode 100644 lib/gitlab/visibility_level.rb delete mode 100644 lib/gt_one_coercion.rb delete mode 100644 lib/redcarpet/render/gitlab_html.rb delete mode 100644 lib/repository_cache.rb delete mode 100644 lib/static_model.rb delete mode 100755 lib/support/deploy/deploy.sh delete mode 100755 lib/support/init.d/gitlab delete mode 100755 lib/support/init.d/gitlab.default.example delete mode 100644 lib/support/logrotate/gitlab delete mode 100644 lib/support/nginx/gitlab delete mode 100644 lib/support/nginx/gitlab-ssl delete mode 100644 lib/tasks/.gitkeep delete mode 100644 lib/tasks/brakeman.rake delete mode 100644 lib/tasks/cache.rake delete mode 100644 lib/tasks/dev.rake delete mode 100644 lib/tasks/gitlab/backup.rake delete mode 100644 lib/tasks/gitlab/bulk_add_permission.rake delete mode 100644 lib/tasks/gitlab/cleanup.rake delete mode 100644 lib/tasks/gitlab/db/drop_all_postgres_sequences.rake delete mode 100644 lib/tasks/gitlab/db/drop_all_tables.rake delete mode 100644 lib/tasks/gitlab/enable_automerge.rake delete mode 100644 lib/tasks/gitlab/generate_docs.rake delete mode 100644 lib/tasks/gitlab/import.rake delete mode 100644 lib/tasks/gitlab/info.rake delete mode 100644 lib/tasks/gitlab/mail_google_schema_whitelisting.rake delete mode 100644 lib/tasks/gitlab/setup.rake delete mode 100644 lib/tasks/gitlab/shell.rake delete mode 100644 lib/tasks/gitlab/sidekiq.rake delete mode 100644 lib/tasks/gitlab/task_helpers.rake delete mode 100644 lib/tasks/gitlab/test.rake delete mode 100644 lib/tasks/gitlab/web_hook.rake delete mode 100644 lib/tasks/migrate/add_limits_mysql.rake delete mode 100644 lib/tasks/migrate/migrate_iids.rake delete mode 100644 lib/tasks/rubocop.rake delete mode 100644 lib/tasks/setup.rake delete mode 100644 lib/tasks/sidekiq.rake delete mode 100644 lib/tasks/spec.rake delete mode 100644 lib/tasks/spinach.rake delete mode 100644 lib/tasks/test.rake delete mode 100644 lib/unfold_form.rb delete mode 100644 log/.gitkeep delete mode 100644 public/404.html delete mode 100644 public/422.html delete mode 100644 public/500.html delete mode 100644 public/502.html delete mode 100644 public/apple-touch-icon-precomposed.png delete mode 100644 public/apple-touch-icon.png delete mode 100644 public/deploy.html delete mode 100644 public/favicon.ico delete mode 100644 public/gitlab_logo.png delete mode 100644 public/robots.txt delete mode 100644 public/static.css delete mode 100644 public/uploads/.gitkeep delete mode 100644 safe/public.pem delete mode 100644 spec/controllers/application_controller_spec.rb delete mode 100644 spec/controllers/autocomplete_controller_spec.rb delete mode 100644 spec/controllers/blob_controller_spec.rb delete mode 100644 spec/controllers/branches_controller_spec.rb delete mode 100644 spec/controllers/commit_controller_spec.rb delete mode 100644 spec/controllers/commits_controller_spec.rb delete mode 100644 spec/controllers/import/bitbucket_controller_spec.rb delete mode 100644 spec/controllers/import/github_controller_spec.rb delete mode 100644 spec/controllers/import/gitlab_controller_spec.rb delete mode 100644 spec/controllers/import/gitorious_controller_spec.rb delete mode 100644 spec/controllers/import/google_code_controller_spec.rb delete mode 100644 spec/controllers/merge_requests_controller_spec.rb delete mode 100644 spec/controllers/namespaces_controller_spec.rb delete mode 100644 spec/controllers/profile_keys_controller_spec.rb delete mode 100644 spec/controllers/projects/protected_branches_controller_spec.rb delete mode 100644 spec/controllers/projects/refs_controller_spec.rb delete mode 100644 spec/controllers/projects/repositories_controller_spec.rb delete mode 100644 spec/controllers/projects_controller_spec.rb delete mode 100644 spec/controllers/tree_controller_spec.rb delete mode 100644 spec/controllers/uploads_controller_spec.rb delete mode 100644 spec/controllers/users_controller_spec.rb delete mode 100644 spec/factories.rb delete mode 100644 spec/factories/broadcast_messages.rb delete mode 100644 spec/factories/forked_project_links.rb delete mode 100644 spec/factories/group_members.rb delete mode 100644 spec/factories/label_links.rb delete mode 100644 spec/factories/labels.rb delete mode 100644 spec/factories/merge_requests.rb delete mode 100644 spec/factories/notes.rb delete mode 100644 spec/factories/projects.rb delete mode 100644 spec/factories_spec.rb delete mode 100644 spec/features/admin/admin_hooks_spec.rb delete mode 100644 spec/features/admin/admin_projects_spec.rb delete mode 100644 spec/features/admin/admin_users_spec.rb delete mode 100644 spec/features/admin/security_spec.rb delete mode 100644 spec/features/atom/dashboard_issues_spec.rb delete mode 100644 spec/features/atom/dashboard_spec.rb delete mode 100644 spec/features/atom/issues_spec.rb delete mode 100644 spec/features/atom/users_spec.rb delete mode 100644 spec/features/gitlab_flavored_markdown_spec.rb delete mode 100644 spec/features/issues_spec.rb delete mode 100644 spec/features/notes_on_merge_requests_spec.rb delete mode 100644 spec/features/profile_spec.rb delete mode 100644 spec/features/projects_spec.rb delete mode 100644 spec/features/search_spec.rb delete mode 100644 spec/features/security/dashboard_access_spec.rb delete mode 100644 spec/features/security/group/group_access_spec.rb delete mode 100644 spec/features/security/group/internal_group_access_spec.rb delete mode 100644 spec/features/security/group/mixed_group_access_spec.rb delete mode 100644 spec/features/security/group/public_group_access_spec.rb delete mode 100644 spec/features/security/profile_access_spec.rb delete mode 100644 spec/features/security/project/internal_access_spec.rb delete mode 100644 spec/features/security/project/private_access_spec.rb delete mode 100644 spec/features/security/project/public_access_spec.rb delete mode 100644 spec/features/users_spec.rb delete mode 100644 spec/finders/issues_finder_spec.rb delete mode 100644 spec/finders/merge_requests_finder_spec.rb delete mode 100644 spec/finders/notes_finder_spec.rb delete mode 100644 spec/finders/projects_finder_spec.rb delete mode 100644 spec/finders/snippets_finder_spec.rb delete mode 100644 spec/fixtures/GoogleCodeProjectHosting.json delete mode 100644 spec/fixtures/banana_sample.gif delete mode 100644 spec/fixtures/dk.png delete mode 100644 spec/fixtures/doc_sample.txt delete mode 100644 spec/fixtures/rails_sample.jpg delete mode 100644 spec/helpers/application_helper_spec.rb delete mode 100644 spec/helpers/broadcast_messages_helper_spec.rb delete mode 100644 spec/helpers/diff_helper_spec.rb delete mode 100644 spec/helpers/events_helper_spec.rb delete mode 100644 spec/helpers/gitlab_markdown_helper_spec.rb delete mode 100644 spec/helpers/groups_helper.rb delete mode 100644 spec/helpers/icons_helper_spec.rb delete mode 100644 spec/helpers/issues_helper_spec.rb delete mode 100644 spec/helpers/labels_helper_spec.rb delete mode 100644 spec/helpers/merge_requests_helper.rb delete mode 100644 spec/helpers/nav_helper_spec.rb delete mode 100644 spec/helpers/notifications_helper_spec.rb delete mode 100644 spec/helpers/oauth_helper_spec.rb delete mode 100644 spec/helpers/projects_helper_spec.rb delete mode 100644 spec/helpers/search_helper_spec.rb delete mode 100644 spec/helpers/submodule_helper_spec.rb delete mode 100644 spec/helpers/tab_helper_spec.rb delete mode 100644 spec/helpers/tree_helper_spec.rb delete mode 100644 spec/javascripts/helpers/.gitkeep delete mode 100644 spec/javascripts/stat_graph_contributors_graph_spec.js delete mode 100644 spec/javascripts/stat_graph_contributors_util_spec.js delete mode 100644 spec/javascripts/stat_graph_spec.js delete mode 100644 spec/javascripts/support/jasmine.yml delete mode 100644 spec/javascripts/support/jasmine_helper.rb delete mode 100644 spec/lib/disable_email_interceptor_spec.rb delete mode 100644 spec/lib/extracts_path_spec.rb delete mode 100644 spec/lib/file_size_validator_spec.rb delete mode 100644 spec/lib/git_ref_validator_spec.rb delete mode 100644 spec/lib/gitlab/auth_spec.rb delete mode 100644 spec/lib/gitlab/backend/grack_auth_spec.rb delete mode 100644 spec/lib/gitlab/backend/rack_attack_helpers_spec.rb delete mode 100644 spec/lib/gitlab/backend/shell_spec.rb delete mode 100644 spec/lib/gitlab/bitbucket_import/client_spec.rb delete mode 100644 spec/lib/gitlab/bitbucket_import/project_creator_spec.rb delete mode 100644 spec/lib/gitlab/closing_issue_extractor_spec.rb delete mode 100644 spec/lib/gitlab/diff/file_spec.rb delete mode 100644 spec/lib/gitlab/diff/parser_spec.rb delete mode 100644 spec/lib/gitlab/git_access_spec.rb delete mode 100644 spec/lib/gitlab/git_access_wiki_spec.rb delete mode 100644 spec/lib/gitlab/github_import/client_spec.rb delete mode 100644 spec/lib/gitlab/github_import/project_creator_spec.rb delete mode 100644 spec/lib/gitlab/gitlab_import/client_spec.rb delete mode 100644 spec/lib/gitlab/gitlab_import/project_creator_spec.rb delete mode 100644 spec/lib/gitlab/gitlab_markdown_helper_spec.rb delete mode 100644 spec/lib/gitlab/gitorious_import/project_creator_spec.rb delete mode 100644 spec/lib/gitlab/google_code_import/client_spec.rb delete mode 100644 spec/lib/gitlab/google_code_import/project_creator_spec.rb delete mode 100644 spec/lib/gitlab/key_fingerprint_spec.rb delete mode 100644 spec/lib/gitlab/ldap/access_spec.rb delete mode 100644 spec/lib/gitlab/ldap/adapter_spec.rb delete mode 100644 spec/lib/gitlab/ldap/authentication_spec.rb delete mode 100644 spec/lib/gitlab/ldap/config_spec.rb delete mode 100644 spec/lib/gitlab/ldap/user_spec.rb delete mode 100644 spec/lib/gitlab/note_data_builder_spec.rb delete mode 100644 spec/lib/gitlab/o_auth/auth_hash_spec.rb delete mode 100644 spec/lib/gitlab/o_auth/user_spec.rb delete mode 100644 spec/lib/gitlab/popen_spec.rb delete mode 100644 spec/lib/gitlab/push_data_builder_spec.rb delete mode 100644 spec/lib/gitlab/reference_extractor_spec.rb delete mode 100644 spec/lib/gitlab/regex_spec.rb delete mode 100644 spec/lib/gitlab/satellite/action_spec.rb delete mode 100644 spec/lib/gitlab/satellite/merge_action_spec.rb delete mode 100644 spec/lib/gitlab/upgrader_spec.rb delete mode 100644 spec/lib/gitlab/url_builder_spec.rb delete mode 100644 spec/lib/gitlab/version_info_spec.rb delete mode 100644 spec/lib/repository_cache_spec.rb delete mode 100644 spec/lib/votes_spec.rb delete mode 100644 spec/mailers/notify_spec.rb delete mode 100644 spec/models/application_setting_spec.rb delete mode 100644 spec/models/broadcast_message_spec.rb delete mode 100644 spec/models/commit_spec.rb delete mode 100644 spec/models/concerns/issuable_spec.rb delete mode 100644 spec/models/concerns/mentionable_spec.rb delete mode 100644 spec/models/deploy_key_spec.rb delete mode 100644 spec/models/deploy_keys_project_spec.rb delete mode 100644 spec/models/event_spec.rb delete mode 100644 spec/models/external_wiki_service_spec.rb delete mode 100644 spec/models/forked_project_link_spec.rb delete mode 100644 spec/models/group_spec.rb delete mode 100644 spec/models/hooks/project_hook_spec.rb delete mode 100644 spec/models/hooks/service_hook_spec.rb delete mode 100644 spec/models/hooks/system_hook_spec.rb delete mode 100644 spec/models/hooks/web_hook_spec.rb delete mode 100644 spec/models/issue_spec.rb delete mode 100644 spec/models/key_spec.rb delete mode 100644 spec/models/label_link_spec.rb delete mode 100644 spec/models/label_spec.rb delete mode 100644 spec/models/member_spec.rb delete mode 100644 spec/models/members/group_member_spec.rb delete mode 100644 spec/models/members/project_member_spec.rb delete mode 100644 spec/models/merge_request_spec.rb delete mode 100644 spec/models/milestone_spec.rb delete mode 100644 spec/models/namespace_spec.rb delete mode 100644 spec/models/note_spec.rb delete mode 100644 spec/models/project_security_spec.rb delete mode 100644 spec/models/project_services/asana_service_spec.rb delete mode 100644 spec/models/project_services/assembla_service_spec.rb delete mode 100644 spec/models/project_services/buildkite_service_spec.rb delete mode 100644 spec/models/project_services/flowdock_service_spec.rb delete mode 100644 spec/models/project_services/gemnasium_service_spec.rb delete mode 100644 spec/models/project_services/gitlab_ci_service_spec.rb delete mode 100644 spec/models/project_services/gitlab_issue_tracker_service_spec.rb delete mode 100644 spec/models/project_services/hipchat_service_spec.rb delete mode 100644 spec/models/project_services/irker_service_spec.rb delete mode 100644 spec/models/project_services/jira_service_spec.rb delete mode 100644 spec/models/project_services/pushover_service_spec.rb delete mode 100644 spec/models/project_services/slack_service/issue_message_spec.rb delete mode 100644 spec/models/project_services/slack_service/merge_message_spec.rb delete mode 100644 spec/models/project_services/slack_service/note_message_spec.rb delete mode 100644 spec/models/project_services/slack_service/push_message_spec.rb delete mode 100644 spec/models/project_services/slack_service_spec.rb delete mode 100644 spec/models/project_snippet_spec.rb delete mode 100644 spec/models/project_spec.rb delete mode 100644 spec/models/project_team_spec.rb delete mode 100644 spec/models/project_wiki_spec.rb delete mode 100644 spec/models/protected_branch_spec.rb delete mode 100644 spec/models/repository_spec.rb delete mode 100644 spec/models/service_spec.rb delete mode 100644 spec/models/snippet_spec.rb delete mode 100644 spec/models/user_spec.rb delete mode 100644 spec/models/wiki_page_spec.rb delete mode 100644 spec/requests/api/api_helpers_spec.rb delete mode 100644 spec/requests/api/branches_spec.rb delete mode 100644 spec/requests/api/commits_spec.rb delete mode 100644 spec/requests/api/doorkeeper_access_spec.rb delete mode 100644 spec/requests/api/files_spec.rb delete mode 100644 spec/requests/api/fork_spec.rb delete mode 100644 spec/requests/api/group_members_spec.rb delete mode 100644 spec/requests/api/groups_spec.rb delete mode 100644 spec/requests/api/internal_spec.rb delete mode 100644 spec/requests/api/issues_spec.rb delete mode 100644 spec/requests/api/labels_spec.rb delete mode 100644 spec/requests/api/merge_requests_spec.rb delete mode 100644 spec/requests/api/milestones_spec.rb delete mode 100644 spec/requests/api/namespaces_spec.rb delete mode 100644 spec/requests/api/notes_spec.rb delete mode 100644 spec/requests/api/project_hooks_spec.rb delete mode 100644 spec/requests/api/project_members_spec.rb delete mode 100644 spec/requests/api/projects_spec.rb delete mode 100644 spec/requests/api/repositories_spec.rb delete mode 100644 spec/requests/api/services_spec.rb delete mode 100644 spec/requests/api/session_spec.rb delete mode 100644 spec/requests/api/system_hooks_spec.rb delete mode 100644 spec/requests/api/users_spec.rb delete mode 100644 spec/routing/admin_routing_spec.rb delete mode 100644 spec/routing/notifications_routing_spec.rb delete mode 100644 spec/routing/project_routing_spec.rb delete mode 100644 spec/services/archive_repository_service_spec.rb delete mode 100644 spec/services/create_snippet_service_spec.rb delete mode 100644 spec/services/event_create_service_spec.rb delete mode 100644 spec/services/git_push_service_spec.rb delete mode 100644 spec/services/git_tag_push_service_spec.rb delete mode 100644 spec/services/issues/bulk_update_service_spec.rb delete mode 100644 spec/services/issues/close_service_spec.rb delete mode 100644 spec/services/issues/create_service_spec.rb delete mode 100644 spec/services/issues/update_service_spec.rb delete mode 100644 spec/services/merge_requests/close_service_spec.rb delete mode 100644 spec/services/merge_requests/create_service_spec.rb delete mode 100644 spec/services/merge_requests/merge_service_spec.rb delete mode 100644 spec/services/merge_requests/refresh_service_spec.rb delete mode 100644 spec/services/merge_requests/reopen_service_spec.rb delete mode 100644 spec/services/merge_requests/update_service_spec.rb delete mode 100644 spec/services/milestones/group_service_spec.rb delete mode 100644 spec/services/notes/create_service_spec.rb delete mode 100644 spec/services/notification_service_spec.rb delete mode 100644 spec/services/projects/create_service_spec.rb delete mode 100644 spec/services/projects/fork_service_spec.rb delete mode 100644 spec/services/projects/transfer_service_spec.rb delete mode 100644 spec/services/projects/update_service_spec.rb delete mode 100644 spec/services/projects/upload_service_spec.rb delete mode 100644 spec/services/search_service_spec.rb delete mode 100644 spec/services/system_hooks_service_spec.rb delete mode 100644 spec/services/test_hook_service_spec.rb delete mode 100644 spec/services/update_snippet_service_spec.rb delete mode 100644 spec/spec_helper.rb delete mode 100644 spec/support/api_helpers.rb delete mode 100644 spec/support/db_cleaner.rb delete mode 100644 spec/support/login_helpers.rb delete mode 100644 spec/support/matchers.rb delete mode 100644 spec/support/mentionable_shared_examples.rb delete mode 100644 spec/support/repo_helpers.rb delete mode 100644 spec/support/select2_helper.rb delete mode 100644 spec/support/taskable_shared_examples.rb delete mode 100644 spec/support/test_env.rb delete mode 100644 spec/tasks/gitlab/backup_rake_spec.rb delete mode 100644 spec/tasks/gitlab/mail_google_schema_whitelisting.rb delete mode 100644 spec/workers/fork_registration_worker_spec.rb delete mode 100644 spec/workers/post_receive_spec.rb delete mode 100644 spec/workers/repository_archive_worker_spec.rb delete mode 100644 tmp/.gitkeep delete mode 100644 tmp/pids/.gitkeep delete mode 100644 tmp/sockets/.gitkeep delete mode 100644 vendor/assets/javascripts/chart-lib.min.js delete mode 100644 vendor/assets/javascripts/g.bar-min.js delete mode 100644 vendor/assets/javascripts/g.raphael-min.js delete mode 100644 vendor/assets/javascripts/jquery.blockUI.js delete mode 100644 vendor/assets/javascripts/jquery.cookie.js delete mode 100644 vendor/assets/javascripts/jquery.endless-scroll.js delete mode 100644 vendor/assets/javascripts/jquery.highlight.js delete mode 100644 vendor/assets/javascripts/jquery.history.js delete mode 100644 vendor/assets/javascripts/jquery.sticky-kit.min.js delete mode 100644 vendor/assets/javascripts/jquery.waitforimages.js delete mode 100644 vendor/assets/stylesheets/.gitkeep diff --git a/.foreman b/.foreman deleted file mode 100644 index 87c3f5a1c15..00000000000 --- a/.foreman +++ /dev/null @@ -1 +0,0 @@ -port: 3000 diff --git a/.hound.yml b/.hound.yml deleted file mode 100644 index 3bde29fb2bf..00000000000 --- a/.hound.yml +++ /dev/null @@ -1,4 +0,0 @@ -# Prefer single quotes -StringLiterals: - EnforcedStyle: single_quotes - Enabled: true diff --git a/.pkgr.yml b/.pkgr.yml deleted file mode 100644 index 8fc9fddf8f7..00000000000 --- a/.pkgr.yml +++ /dev/null @@ -1,37 +0,0 @@ -user: git -group: git -services: - - postgres -before_precompile: ./bin/pkgr_before_precompile.sh -targets: - debian-7: &wheezy - build_dependencies: - - libkrb5-dev - - libicu-dev - - cmake - - pkg-config - dependencies: - - libicu48 - - libpcre3 - - git - ubuntu-12.04: *wheezy - ubuntu-14.04: - build_dependencies: - - libkrb5-dev - - libicu-dev - - cmake - - pkg-config - dependencies: - - libicu52 - - libpcre3 - - git - centos-6: - build_dependencies: - - krb5-devel - - libicu-devel - - cmake - - pkgconfig - dependencies: - - libicu - - pcre - - git diff --git a/.rspec b/.rspec deleted file mode 100644 index 4e1e0d2f722..00000000000 --- a/.rspec +++ /dev/null @@ -1 +0,0 @@ ---color diff --git a/.rubocop.yml b/.rubocop.yml deleted file mode 100644 index 03b78d68840..00000000000 --- a/.rubocop.yml +++ /dev/null @@ -1,1006 +0,0 @@ -Style/AccessModifierIndentation: - Description: Check indentation of private/protected visibility modifiers. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-public-private-protected' - Enabled: true - -Style/AccessorMethodName: - Description: Check the naming of accessor methods for get_/set_. - Enabled: false - -Style/Alias: - Description: 'Use alias_method instead of alias.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method' - Enabled: true - -Style/AlignArray: - Description: >- - Align the elements of an array literal if they span more than - one line. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#align-multiline-arrays' - Enabled: true - -Style/AlignHash: - Description: >- - Align the elements of a hash literal if they span more than - one line. - Enabled: true - -Style/AlignParameters: - Description: >- - Align the parameters of a method call if they span more - than one line. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent' - Enabled: false - -Style/AndOr: - Description: 'Use &&/|| instead of and/or.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-and-or-or' - Enabled: false - -Style/ArrayJoin: - Description: 'Use Array#join instead of Array#*.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join' - Enabled: false - -Style/AsciiComments: - Description: 'Use only ascii symbols in comments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments' - Enabled: true - -Style/AsciiIdentifiers: - Description: 'Use only ascii symbols in identifiers.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers' - Enabled: true - -Style/Attr: - Description: 'Checks for uses of Module#attr.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr' - Enabled: false - -Style/BeginBlock: - Description: 'Avoid the use of BEGIN blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-BEGIN-blocks' - Enabled: true - -Style/BarePercentLiterals: - Description: 'Checks if usage of %() or %Q() matches configuration.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q-shorthand' - Enabled: false - -Style/BlockComments: - Description: 'Do not use block comments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-block-comments' - Enabled: false - -Style/BlockEndNewline: - Description: 'Put end statement of multiline block on its own line.' - Enabled: true - -Style/Blocks: - Description: >- - Avoid using {...} for multi-line blocks (multiline chaining is - always ugly). - Prefer {...} over do...end for single-line blocks. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' - Enabled: true - -Style/BracesAroundHashParameters: - Description: 'Enforce braces style around hash parameters.' - Enabled: false - -Style/CaseEquality: - Description: 'Avoid explicit use of the case equality operator(===).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality' - Enabled: false - -Style/CaseIndentation: - Description: 'Indentation of when in a case/when/[else/]end.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-when-to-case' - Enabled: true - -Style/CharacterLiteral: - Description: 'Checks for uses of character literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals' - Enabled: true - -Style/ClassAndModuleCamelCase: - Description: 'Use CamelCase for classes and modules.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#camelcase-classes' - Enabled: true - -Style/ClassAndModuleChildren: - Description: 'Checks style of children classes and modules.' - Enabled: false - -Style/ClassCheck: - Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.' - Enabled: false - -Style/ClassMethods: - Description: 'Use self when defining module/class methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#def-self-singletons' - Enabled: false - -Style/ClassVars: - Description: 'Avoid the use of class variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars' - Enabled: true - -Style/ColonMethodCall: - Description: 'Do not use :: for method call.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons' - Enabled: false - -Style/CommentAnnotation: - Description: >- - Checks formatting of special comments - (TODO, FIXME, OPTIMIZE, HACK, REVIEW). - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords' - Enabled: false - -Style/CommentIndentation: - Description: 'Indentation of comments.' - Enabled: true - -Style/ConstantName: - Description: 'Constants should use SCREAMING_SNAKE_CASE.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#screaming-snake-case' - Enabled: true - -Style/DefWithParentheses: - Description: 'Use def with parentheses when there are arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' - Enabled: false - -Style/DeprecatedHashMethods: - Description: 'Checks for use of deprecated Hash methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-key' - Enabled: false - -Style/Documentation: - Description: 'Document classes and non-namespace modules.' - Enabled: false - -Style/DotPosition: - Description: 'Checks the position of the dot in multi-line method calls.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains' - Enabled: false - -Style/DoubleNegation: - Description: 'Checks for uses of double negation (!!).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang' - Enabled: false - -Style/EachWithObject: - Description: 'Prefer `each_with_object` over `inject` or `reduce`.' - Enabled: false - -Style/ElseAlignment: - Description: 'Align elses and elsifs correctly.' - Enabled: true - -Style/EmptyElse: - Description: 'Avoid empty else-clauses.' - Enabled: false - -Style/EmptyLineBetweenDefs: - Description: 'Use empty lines between defs.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#empty-lines-between-methods' - Enabled: false - -Style/EmptyLines: - Description: "Don't use several empty lines in a row." - Enabled: false - -Style/EmptyLinesAroundAccessModifier: - Description: "Keep blank lines around access modifiers." - Enabled: false - -Style/EmptyLinesAroundBlockBody: - Description: "Keeps track of empty lines around block bodies." - Enabled: false - -Style/EmptyLinesAroundClassBody: - Description: "Keeps track of empty lines around class bodies." - Enabled: false - -Style/EmptyLinesAroundModuleBody: - Description: "Keeps track of empty lines around module bodies." - Enabled: false - -Style/EmptyLinesAroundMethodBody: - Description: "Keeps track of empty lines around method bodies." - Enabled: false - -Style/EmptyLiteral: - Description: 'Prefer literals to Array.new/Hash.new/String.new.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash' - Enabled: false - -Style/EndBlock: - Description: 'Avoid the use of END blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-END-blocks' - Enabled: false - -Style/EndOfLine: - Description: 'Use Unix-style line endings.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#crlf' - Enabled: false - -Style/EvenOdd: - Description: 'Favor the use of Fixnum#even? && Fixnum#odd?' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' - Enabled: false - -Style/FileName: - Description: 'Use snake_case for source file names.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files' - Enabled: false - -Style/FlipFlop: - Description: 'Checks for flip flops' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops' - Enabled: false - -Style/For: - Description: 'Checks use of for or each in multiline loops.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-for-loops' - Enabled: false - -Style/FormatString: - Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf' - Enabled: false - -Style/GlobalVars: - Description: 'Do not introduce global variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars' - Enabled: false - -Style/GuardClause: - Description: 'Check for conditionals that can be replaced with guard clauses' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' - Enabled: false - -Style/HashSyntax: - Description: >- - Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax - { :a => 1, :b => 2 }. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-literals' - Enabled: true - -Style/IfUnlessModifier: - Description: >- - Favor modifier if/unless usage when you have a - single-line body. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier' - Enabled: false - -Style/IfWithSemicolon: - Description: 'Do not use if x; .... Use the ternary operator instead.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs' - Enabled: false - -Style/IndentationConsistency: - Description: 'Keep indentation straight.' - Enabled: true - -Style/IndentationWidth: - Description: 'Use 2 spaces for indentation.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' - Enabled: true - -Style/IndentArray: - Description: >- - Checks the indentation of the first element in an array - literal. - Enabled: false - -Style/IndentHash: - Description: 'Checks the indentation of the first key in a hash literal.' - Enabled: false - -Style/InfiniteLoop: - Description: 'Use Kernel#loop for infinite loops.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#infinite-loop' - Enabled: false - -Style/Lambda: - Description: 'Use the new lambda literal syntax for single-line blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line' - Enabled: false - -Style/LambdaCall: - Description: 'Use lambda.call(...) instead of lambda.(...).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call' - Enabled: false - -Style/LeadingCommentSpace: - Description: 'Comments should start with a space.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-space' - Enabled: false - -Style/LineEndConcatenation: - Description: >- - Use \ instead of + or << to concatenate two string literals at - line end. - Enabled: false - -Style/MethodCallParentheses: - Description: 'Do not use parentheses for method calls with no arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-args-no-parens' - Enabled: false - -Style/MethodDefParentheses: - Description: >- - Checks if the method definitions have or don't have - parentheses. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' - Enabled: false - -Style/MethodName: - Description: 'Use the configured style when naming methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' - Enabled: false - -Style/ModuleFunction: - Description: 'Checks for usage of `extend self` in modules.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function' - Enabled: false - -Style/MultilineBlockChain: - Description: 'Avoid multi-line chains of blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' - Enabled: false - -Style/MultilineBlockLayout: - Description: 'Ensures newlines after multiline block do statements.' - Enabled: true - -Style/MultilineIfThen: - Description: 'Do not use then for multi-line if/unless.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-then' - Enabled: false - -Style/MultilineOperationIndentation: - Description: >- - Checks indentation of binary operations that span more than - one line. - Enabled: false - -Style/MultilineTernaryOperator: - Description: >- - Avoid multi-line ?: (the ternary operator); - use if/unless instead. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-ternary' - Enabled: false - -Style/NegatedIf: - Description: >- - Favor unless over if for negative conditions - (or control flow or). - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives' - Enabled: false - -Style/NegatedWhile: - Description: 'Favor until over while for negative conditions.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives' - Enabled: false - -Style/NestedTernaryOperator: - Description: 'Use one expression per branch in a ternary operator.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-ternary' - Enabled: true - -Style/Next: - Description: 'Use `next` to skip iteration instead of a condition at the end.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' - Enabled: false - -Style/NilComparison: - Description: 'Prefer x.nil? to x == nil.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' - Enabled: true - -Style/NonNilCheck: - Description: 'Checks for redundant nil checks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-non-nil-checks' - Enabled: true - -Style/Not: - Description: 'Use ! instead of not.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not' - Enabled: true - -Style/NumericLiterals: - Description: >- - Add underscores to large numeric literals to improve their - readability. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics' - Enabled: false - -Style/OneLineConditional: - Description: >- - Favor the ternary operator(?:) over - if/then/else/end constructs. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator' - Enabled: true - -Style/OpMethod: - Description: 'When defining binary operators, name the argument other.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg' - Enabled: false - -Style/ParenthesesAroundCondition: - Description: >- - Don't use parentheses around the condition of an - if/unless/while. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-parens-if' - Enabled: true - -Style/PercentLiteralDelimiters: - Description: 'Use `%`-literal delimiters consistently' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces' - Enabled: false - -Style/PercentQLiterals: - Description: 'Checks if uses of %Q/%q match the configured preference.' - Enabled: false - -Style/PerlBackrefs: - Description: 'Avoid Perl-style regex back references.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers' - Enabled: false - -Style/PredicateName: - Description: 'Check the names of predicate methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark' - Enabled: false - -Style/Proc: - Description: 'Use proc instead of Proc.new.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc' - Enabled: false - -Style/RaiseArgs: - Description: 'Checks the arguments passed to raise/fail.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages' - Enabled: false - -Style/RedundantBegin: - Description: "Don't use begin blocks when they are not needed." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#begin-implicit' - Enabled: false - -Style/RedundantException: - Description: "Checks for an obsolete RuntimeException argument in raise/fail." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-runtimeerror' - Enabled: false - -Style/RedundantReturn: - Description: "Don't use return where it's not required." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-return' - Enabled: true - -Style/RedundantSelf: - Description: "Don't use self where it's not needed." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-self-unless-required' - Enabled: false - -Style/RegexpLiteral: - Description: >- - Use %r for regular expressions matching more than - `MaxSlashes` '/' characters. - Use %r only for regular expressions matching more than - `MaxSlashes` '/' character. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r' - Enabled: false - -Style/RescueModifier: - Description: 'Avoid using rescue in its modifier form.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-rescue-modifiers' - Enabled: false - -Style/SelfAssignment: - Description: >- - Checks for places where self-assignment shorthand should have - been used. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment' - Enabled: false - -Style/Semicolon: - Description: "Don't use semicolons to terminate expressions." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon' - Enabled: false - -Style/SignalException: - Description: 'Checks for proper usage of fail and raise.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method' - Enabled: false - -Style/SingleLineBlockParams: - Description: 'Enforces the names of some block params.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks' - Enabled: false - -Style/SingleLineMethods: - Description: 'Avoid single-line methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods' - Enabled: false - -Style/SingleSpaceBeforeFirstArg: - Description: >- - Checks that exactly one space is used between a method name - and the first argument for method calls without parentheses. - Enabled: false - -Style/SpaceAfterColon: - Description: 'Use spaces after colons.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceAfterComma: - Description: 'Use spaces after commas.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceAfterControlKeyword: - Description: 'Use spaces after if/elsif/unless/while/until/case/when.' - Enabled: false - -Style/SpaceAfterMethodName: - Description: >- - Do not put a space between a method name and the opening - parenthesis in a method definition. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' - Enabled: false - -Style/SpaceAfterNot: - Description: Tracks redundant space after the ! operator. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-bang' - Enabled: false - -Style/SpaceAfterSemicolon: - Description: 'Use spaces after semicolons.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceBeforeBlockBraces: - Description: >- - Checks that the left block brace has or doesn't have space - before it. - Enabled: false - -Style/SpaceBeforeComma: - Description: 'No spaces before commas.' - Enabled: false - -Style/SpaceBeforeComment: - Description: >- - Checks for missing space between code and a comment on the - same line. - Enabled: false - -Style/SpaceBeforeSemicolon: - Description: 'No spaces before semicolons.' - Enabled: false - -Style/SpaceInsideBlockBraces: - Description: >- - Checks that block braces have or don't have surrounding space. - For blocks taking parameters, checks that the left brace has - or doesn't have trailing space. - Enabled: false - -Style/SpaceAroundEqualsInParameterDefault: - Description: >- - Checks that the equals signs in parameter default assignments - have or don't have surrounding space depending on - configuration. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-around-equals' - Enabled: false - -Style/SpaceAroundOperators: - Description: 'Use spaces around operators.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceBeforeModifierKeyword: - Description: 'Put a space before the modifier keyword.' - Enabled: false - -Style/SpaceInsideBrackets: - Description: 'No spaces after [ or before ].' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' - Enabled: false - -Style/SpaceInsideHashLiteralBraces: - Description: "Use spaces inside hash literal braces - or don't." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: true - -Style/SpaceInsideParens: - Description: 'No spaces after ( or before ).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' - Enabled: false - -Style/SpaceInsideRangeLiteral: - Description: 'No spaces inside range literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-inside-range-literals' - Enabled: false - -Style/SpecialGlobalVars: - Description: 'Avoid Perl-style global variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms' - Enabled: false - -Style/StringLiterals: - Description: 'Checks if uses of quotes match the configured preference.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals' - Enabled: false - -Style/StringLiteralsInInterpolation: - Description: >- - Checks if uses of quotes inside expressions in interpolated - strings match the configured preference. - Enabled: false - -Style/SymbolProc: - Description: 'Use symbols as procs instead of blocks when possible.' - Enabled: false - -Style/Tab: - Description: 'No hard tabs.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' - Enabled: true - -Style/TrailingBlankLines: - Description: 'Checks trailing blank lines and final newline.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#newline-eof' - Enabled: true - -Style/TrailingComma: - Description: 'Checks for trailing comma in parameter lists and literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas' - Enabled: false - -Style/TrailingWhitespace: - Description: 'Avoid trailing whitespace.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-whitespace' - Enabled: false - -Style/TrivialAccessors: - Description: 'Prefer attr_* methods to trivial readers/writers.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family' - Enabled: false - -Style/UnlessElse: - Description: >- - Do not use unless with else. Rewrite these with the positive - case first. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-else-with-unless' - Enabled: false - -Style/UnneededCapitalW: - Description: 'Checks for %W when interpolation is not needed.' - Enabled: false - -Style/UnneededPercentQ: - Description: 'Checks for %q/%Q when single quotes or double quotes would do.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q' - Enabled: false - -Style/UnneededPercentX: - Description: 'Checks for %x when `` would do.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-x' - Enabled: false - -Style/VariableInterpolation: - Description: >- - Don't interpolate global, instance and class variables - directly in strings. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate' - Enabled: false - -Style/VariableName: - Description: 'Use the configured style when naming variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' - Enabled: false - -Style/WhenThen: - Description: 'Use when x then ... for one-line cases.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases' - Enabled: false - -Style/WhileUntilDo: - Description: 'Checks for redundant do after while or until.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do' - Enabled: false - -Style/WhileUntilModifier: - Description: >- - Favor modifier while/until usage when you have a - single-line body. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier' - Enabled: false - -Style/WordArray: - Description: 'Use %w or %W for arrays of words.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w' - Enabled: false - -#################### Metrics ################################ - -Metrics/AbcSize: - Description: >- - A calculated magnitude based on number of assignments, - branches, and conditions. - Enabled: false - -Metrics/BlockNesting: - Description: 'Avoid excessive block nesting' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count' - Enabled: false - -Metrics/ClassLength: - Description: 'Avoid classes longer than 100 lines of code.' - Enabled: false - -Metrics/CyclomaticComplexity: - Description: >- - A complexity metric that is strongly correlated to the number - of test cases needed to validate a method. - Enabled: false - -Metrics/LineLength: - Description: 'Limit lines to 80 characters.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits' - Enabled: false - -Metrics/MethodLength: - Description: 'Avoid methods longer than 10 lines of code.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods' - Enabled: false - -Metrics/ParameterLists: - Description: 'Avoid parameter lists longer than three or four parameters.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params' - Enabled: false - -Metrics/PerceivedComplexity: - Description: >- - A complexity metric geared towards measuring complexity for a - human reader. - Enabled: false - -#################### Lint ################################ -### Warnings - -Lint/AmbiguousOperator: - Description: >- - Checks for ambiguous operators in the first argument of a - method invocation without parentheses. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args' - Enabled: false - -Lint/AmbiguousRegexpLiteral: - Description: >- - Checks for ambiguous regexp literals in the first argument of - a method invocation without parenthesis. - Enabled: false - -Lint/AssignmentInCondition: - Description: "Don't use assignment in conditions." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition' - Enabled: false - -Lint/BlockAlignment: - Description: 'Align block ends correctly.' - Enabled: false - -Lint/ConditionPosition: - Description: >- - Checks for condition placed in a confusing position relative to - the keyword. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition' - Enabled: false - -Lint/Debugger: - Description: 'Check for debugger calls.' - Enabled: false - -Lint/DefEndAlignment: - Description: 'Align ends corresponding to defs correctly.' - Enabled: false - -Lint/DeprecatedClassMethods: - Description: 'Check for deprecated class method calls.' - Enabled: false - -Lint/ElseLayout: - Description: 'Check for odd code arrangement in an else block.' - Enabled: false - -Lint/EmptyEnsure: - Description: 'Checks for empty ensure block.' - Enabled: false - -Lint/EmptyInterpolation: - Description: 'Checks for empty string interpolation.' - Enabled: false - -Lint/EndAlignment: - Description: 'Align ends correctly.' - Enabled: false - -Lint/EndInMethod: - Description: 'END blocks should not be placed inside method definitions.' - Enabled: false - -Lint/EnsureReturn: - Description: 'Do not use return in an ensure block.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-return-ensure' - Enabled: false - -Lint/Eval: - Description: 'The use of eval represents a serious security risk.' - Enabled: false - -Lint/HandleExceptions: - Description: "Don't suppress exception." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions' - Enabled: false - -Lint/InvalidCharacterLiteral: - Description: >- - Checks for invalid character literals with a non-escaped - whitespace character. - Enabled: false - -Lint/LiteralInCondition: - Description: 'Checks of literals used in conditions.' - Enabled: false - -Lint/LiteralInInterpolation: - Description: 'Checks for literals used in interpolation.' - Enabled: false - -Lint/Loop: - Description: >- - Use Kernel#loop with break rather than begin/end/until or - begin/end/while for post-loop tests. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break' - Enabled: false - -Lint/ParenthesesAsGroupedExpression: - Description: >- - Checks for method calls with a space before the opening - parenthesis. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' - Enabled: true - -Lint/RequireParentheses: - Description: >- - Use parentheses in the method call to avoid confusion - about precedence. - Enabled: false - -Lint/RescueException: - Description: 'Avoid rescuing the Exception class.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-blind-rescues' - Enabled: false - -Lint/ShadowingOuterLocalVariable: - Description: >- - Do not use the same name as outer local variable - for block arguments or block local variables. - Enabled: false - -Lint/SpaceBeforeFirstArg: - Description: >- - Put a space between a method name and the first argument - in a method call without parentheses. - Enabled: false - -Lint/StringConversionInInterpolation: - Description: 'Checks for Object#to_s usage in string interpolation.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-to-s' - Enabled: false - -Lint/UnderscorePrefixedVariableName: - Description: 'Do not use prefix `_` for a variable that is used.' - Enabled: true - -Lint/UnusedBlockArgument: - Description: 'Checks for unused block arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: false - -Lint/UnusedMethodArgument: - Description: 'Checks for unused method arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: false - -Lint/UnreachableCode: - Description: 'Unreachable code.' - Enabled: false - -Lint/UselessAccessModifier: - Description: 'Checks for useless access modifiers.' - Enabled: false - -Lint/UselessAssignment: - Description: 'Checks for useless assignment to a local variable.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: false - -Lint/UselessComparison: - Description: 'Checks for comparison of something with itself.' - Enabled: false - -Lint/UselessElseWithoutRescue: - Description: 'Checks for useless `else` in `begin..end` without `rescue`.' - Enabled: false - -Lint/UselessSetterCall: - Description: 'Checks for useless setter call to a local variable.' - Enabled: false - -Lint/Void: - Description: 'Possible use of operator/literal/variable in void context.' - Enabled: false - -##################### Rails ################################## - -Rails/ActionFilter: - Description: 'Enforces consistent use of action filter methods.' - Enabled: false - -Rails/DefaultScope: - Description: 'Checks if the argument passed to default_scope is a block.' - Enabled: false - -Rails/Delegate: - Description: 'Prefer delegate method for delegations.' - Enabled: false - -Rails/HasAndBelongsToMany: - Description: 'Prefer has_many :through to has_and_belongs_to_many.' - Enabled: true - -Rails/Output: - Description: 'Checks for calls to puts, print, etc.' - Enabled: true - -Rails/ReadWriteAttribute: - Description: >- - Checks for read_attribute(:attr) and - write_attribute(:attr, val). - Enabled: false - -Rails/ScopeArgs: - Description: 'Checks the arguments of ActiveRecord scopes.' - Enabled: false - -Rails/Validation: - Description: 'Use validates :attribute, hash of validations.' - Enabled: false - - -# Exclude some of GitLab files -# -# -AllCops: - RunRailsCops: true - Exclude: - - 'spec/**/*' - - 'features/**/*' - - 'vendor/**/*' - - 'db/**/*' - - 'tmp/**/*' - - 'bin/**/*' - - 'lib/backup/**/*' - - 'lib/tasks/**/*' - - 'lib/email_validator.rb' - - 'lib/gitlab/upgrader.rb' - - 'lib/gitlab/seeder.rb' diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 399088bf465..00000000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.1.6 diff --git a/.simplecov b/.simplecov deleted file mode 100644 index d979288df44..00000000000 --- a/.simplecov +++ /dev/null @@ -1,4 +0,0 @@ -# .simplecov -SimpleCov.start 'rails' do - merge_timeout 3600 -end diff --git a/.teatro.yml b/.teatro.yml deleted file mode 100644 index 30054361981..00000000000 --- a/.teatro.yml +++ /dev/null @@ -1,8 +0,0 @@ -stage: - before: - - cp config/gitlab.teatro.yml config/gitlab.yml - - mkdir /apps/gitlab-satellites - - mkdir /apps/repositories - - database: - - RAILS_ENV=development force=yes bundle exec rake db:create gitlab:setup \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 3165b7379d3..00000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,179 +0,0 @@ -# Contribute to GitLab - -Thank you for your interest in contributing to GitLab. -This guide details how contribute to GitLab in a way that is efficient for everyone. -If you have read this guide and want to know how the GitLab core-team operates please see [the GitLab contributing process](PROCESS.md). - -## Contributor license agreement - -By submitting code as an individual you agree to the [individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md). By submitting code as an entity you agree to the [corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md). - -## Security vulnerability disclosure - -Please report suspected security vulnerabilities in private to support@gitlab.com, also see the [disclosure section on the GitLab.com website](http://about.gitlab.com/disclosure/). Please do NOT create publicly viewable issues for suspected security vulnerabilities. - -## Closing policy for issues and merge requests - -GitLab is a popular open source project and the capacity to deal with issues and merge requests is limited. Out of respect for our volunteers, issues and merge requests not in line with the guidelines listed in this document may be closed without notice. - -Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved. - -Issues and merge requests should be in English and contain appropriate language for audiences of all ages. - -## Helping others - -Please help other GitLab users when you can. -The channnels people will reach out on can be found on the [getting help page](https://about.gitlab.com/getting-help/). -Sign up for the mailinglist, answer GitLab questions on StackOverflow or respond in the irc channel. -You can also sign up on [CodeTriage](http://www.codetriage.com/gitlabhq/gitlabhq) to help with one issue every day. - -## Issue tracker - -To get support for your particular problem please use the channels as detailed in the [getting help section of the readme](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/README.md#getting-help). Professional [support subscriptions](http://about.gitlab.com/subscription/) and [consulting services](http://about.gitlab.com/consultancy/) are available from [GitLab.com](http://about.gitlab.com/). - -The [issue tracker](https://gitlab.com/gitlab-org/gitlab-ce/issues) is only for obvious errors in the latest [stable or development release of GitLab](MAINTENANCE.md). If something is wrong but it is not a regression compared to older versions of GitLab please do not open an issue but a feature request. When submitting an issue please conform to the issue submission guidelines listed below. Not all issues will be addressed and your issue is more likely to be addressed if you submit a merge request which partially or fully addresses the issue. - -Issues can be filed either at [gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues) or [github.com](https://github.com/gitlabhq/gitlabhq/issues). - -Do not use the issue tracker for feature requests. We have a specific [feature request forum](http://feedback.gitlab.com) for this purpose. Please keep feature requests as small and simple as possible, complex ones might be edited to make them small and simple. - -Please send a merge request with a tested solution or a merge request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [mailing list](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](http://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there. - -### Issue tracker guidelines - -**[Search the issues](https://gitlab.com/gitlab-org/gitlab-ce/issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post): - -1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen) -1. **Steps to reproduce:** How can we reproduce the issue -1. **Expected behavior:** Describe your issue in detail -1. **Observed behavior** -1. **Relevant logs and/or screenshots:** Please use code blocks (\`\`\`) to format console output, logs, and code as it's very hard to read otherwise. -1. **Output of checks** - * Results of GitLab [Application Check](doc/install/installation.md#check-application-status) (`sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production SANITIZE=true`); we will only investigate if the tests are passing - * Version of GitLab you are running; we will only investigate issues in the latest stable and development releases as per the [maintenance policy](MAINTENANCE.md) - * Add the last commit SHA-1 of the GitLab version you used to replicate the issue (obtainable from the help page) - * Describe your setup (use relevant parts from `sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`) -1. **Possible fixes**: If you can, link to the line of code that might be responsible for the problem - -## Merge requests - -We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge requests' on our feature request forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome. If you want to add a new feature that is not marked it is best to first create a feedback issue (if there isn't one already) and leave a comment asking for it to be marked accepting merge requests. Please include screenshots or wireframes if the feature will also change the UI. - -Merge requests can be filed either at [gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests) or [github.com](https://github.com/gitlabhq/gitlabhq/pulls). - -If you are new to GitLab development (or web development in general), search for the label `easyfix` ([gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=easyfix), [github](https://github.com/gitlabhq/gitlabhq/labels/easyfix)). Those are issues easy to fix, marked by the GitLab core-team. If you are unsure how to proceed but want to help, mention one of the core-team members to give you a hint. - -To start with GitLab download the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit) and see [Development section](doc/development/README.md) in the help file. - -### Merge request guidelines - -If you can, please submit a merge request with the fix or improvements including tests. If you don't know how to fix the issue but can write a test that exposes the issue we will accept that as well. In general bug fixes that include a regression test are merged quickly while new features without proper tests are least likely to receive timely feedback. The workflow to make a merge request is as follows: - -1. Fork the project on GitLab Cloud -1. Create a feature branch -1. Write [tests](https://gitlab.com/gitlab-org/gitlab-development-kit#running-the-tests) and code -1. Add your changes to the [CHANGELOG](CHANGELOG) -1. If you are changing the README, some documentation or other things which have no effect on the tests, add `[ci skip]` somewhere in the commit message -1. If you have multiple commits please combine them into one commit by [squashing them](http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits) -1. Push the commit to your fork -1. Submit a merge request (MR) to the master branch -1. The MR title should describe the change you want to make -1. The MR description should give a motive for your change and the method you used to achieve it -1. If the MR changes the UI it should include before and after screenshots -1. If the MR changes CSS classes please include the list of affected pages `grep css-class ./app -R` -1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feature requests](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR -1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submission -1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md). -1. Also have a look at the [shell command guidelines](doc/development/shell_commands.md) if your code reads or opens files, or handles paths to files on disk. - -The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast. Before this time the GitLab B.V. team is still dealing with work that is created by the monthly release such as assisting subscribers with upgrade issues, the release of Enterprise Edition and the upgrade of GitLab Cloud. After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features. - -Please keep the change in a single MR **as small as possible**. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? Can you do part of the refactor? The increased reviewability of small MR's that leads to higher code quality is more important to us than having a minimal commit log. The smaller a MR is the more likely it is it will be merged (quickly), after that you can send more MR's to enhance it. - -For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). If you would like quick feedback on your merge request feel free to mention one of the Merge Marshalls of [the core-team](https://about.gitlab.com/core-team/). Please ensure that your merge request meets the contribution acceptance criteria. - -## Definition of done - -If you contribute to GitLab please know that changes involve more than just code. -We have the following [definition of done](http://guide.agilealliance.org/guide/definition-of-done.html). -Please ensure you support the feature you contribute through all of these steps. - -1. Description explaning the relevancy (see following item) -1. Working and clean code that is commented where needed -1. Unit and integration tests that pass on the CI server -1. Documented in the /doc directory -1. Changelog entry added -1. Reviewed and any concerns are addressed -1. Merged by the project lead -1. Added to the release blog article -1. Added to [the website](https://gitlab.com/gitlab-com/www-gitlab-com/) if relevant -1. Community questions answered -1. Answers to questions radiated (in docs/wiki/etc.) - -If you add a dependency in GitLab (such as an operating system package) please consider updating the following and note the applicability of each in your merge request: - -1. Note the addition in the release blog post (create one if it doesn't exist yet) https://gitlab.com/gitlab-com/www-gitlab-com/merge_requests/ -1. Upgrade guide, for example https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/7.5-to-7.6.md -1. Upgrader https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md#2-run-gitlab-upgrade-tool -1. Installation guide https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies -1. GitLab Development Kit https://gitlab.com/gitlab-org/gitlab-development-kit -1. Test suite https://gitlab.com/gitlab-org/gitlab-ci/blob/master/doc/examples/configure_a_runner_to_run_the_gitlab_ce_test_suite.md -1. Omnibus package creator https://gitlab.com/gitlab-org/omnibus-gitlab - -## Merge request description format - -1. What does this MR do? -1. Are there points in the code the reviewer needs to double check? -1. Why was this MR needed? -1. What are the relevant issue numbers / [Feature requests](http://feedback.gitlab.com/)? -1. Screenshots (if relevant) - -## Contribution acceptance criteria - -1. The change is as small as possible (see the above paragraph for details) -1. Include proper tests and make all tests pass (unless it contains a test exposing a bug in existing code) -1. All tests have to pass, if you suspect a failing CI build is unrelated to your contribution ask for tests to be restarted. See [the CI setup document](http://doc.gitlab.com/ce/development/ci_setup.html) on who you can ask for test restart. -1. Initially contains a single commit (please use `git rebase -i` to squash commits) -1. Can merge without problems (if not please merge `master`, never rebase commits pushed to the remote server) -1. Does not break any existing functionality -1. Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed) -1. Migrations should do only one thing (eg: either create a table, move data to a new table or remove an old table) to aid retrying on failure -1. Keeps the GitLab code base clean and well structured -1. Contains functionality we think other users will benefit from too -1. Doesn't add configuration options since they complicate future changes -1. Changes after submitting the merge request should be in separate commits (no squashing). You will be asked to squash when the review is over, before merging. -1. It conforms to the following style guides. - If your change touches a line that does not follow the style, - modify the entire line to follow it. This prevents linting tools from generating warnings. - Don't touch neighbouring lines. As an exception, automatic mass refactoring modifications - may leave style non-compliant. - -## Style guides - -1. [Ruby](https://github.com/bbatsov/ruby-style-guide). - Important sections include [Source Code Layout](https://github.com/bbatsov/ruby-style-guide#source-code-layout) - and [Naming](https://github.com/bbatsov/ruby-style-guide#naming). Use: - - multi-line method chaining style **Option B**: dot `.` on previous line - - string literal quoting style **Option A**: single quoted by default -1. [Rails](https://github.com/bbatsov/rails-style-guide) -1. [Testing](https://github.com/thoughtbot/guides/tree/master/style#testing) -1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style#coffeescript) -1. [Shell commands](doc/development/shell_commands.md) created by GitLab contributors to enhance security -1. [Markdown](http://www.cirosantilli.com/markdown-styleguide) -1. Interface text should be written subjectively instead of objectively. It should be the gitlab core team addressing a person. It should be written in present time and never use past tense (has been/was). For example instead of "prohibited this user from being saved due to the following errors:" the text should be "sorry, we could not create your account because:". Also these [excellent writing guidelines](https://github.com/NARKOZ/guides#writing). - -This is also the style used by linting tools such as [RuboCop](https://github.com/bbatsov/rubocop), [PullReview](https://www.pullreview.com/) and [Hound CI](https://houndci.com). - -## Code of conduct -As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. - -We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion. - -Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. - -Instances of abusive, harassing, or otherwise unacceptable behavior can be -reported by emailing contact@gitlab.com - -This Code of Conduct is adapted from the [Contributor Covenant](http:contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION deleted file mode 100644 index 097a15a2af3..00000000000 --- a/GITLAB_SHELL_VERSION +++ /dev/null @@ -1 +0,0 @@ -2.6.2 diff --git a/Guardfile b/Guardfile deleted file mode 100644 index 68ac3232b09..00000000000 --- a/Guardfile +++ /dev/null @@ -1,27 +0,0 @@ -# A sample Guardfile -# More info at https://github.com/guard/guard#readme - -guard 'rspec', cmd: "spring rspec", all_on_start: false, all_after_pass: false do - watch(%r{^spec/.+_spec\.rb$}) - watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" } - watch(%r{^lib/api/(.+)\.rb$}) { |m| "spec/requests/api/#{m[1]}_spec.rb" } - watch('spec/spec_helper.rb') { "spec" } - - # Rails example - watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } - watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" } - watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] } - watch(%r{^spec/support/(.+)\.rb$}) { "spec" } - watch('config/routes.rb') { "spec/routing" } - watch('app/controllers/application_controller.rb') { "spec/controllers" } - - # Capybara request specs - watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" } -end - -guard 'spinach', command_prefix: 'spring' do - watch(%r|^features/(.*)\.feature|) - watch(%r|^features/steps/(.*)([^/]+)\.rb|) do |m| - "features/#{m[1]}#{m[2]}.feature" - end -end diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d8cb29f3638..00000000000 --- a/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011-2015 GitLab B.V. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/MAINTENANCE.md b/MAINTENANCE.md deleted file mode 100644 index d3d36670693..00000000000 --- a/MAINTENANCE.md +++ /dev/null @@ -1,15 +0,0 @@ -# GitLab Maintenance Policy - -GitLab is a fast moving and evolving project. We currently don't have the resources to support many releases concurrently. We support exactly one stable release at any given time. - -GitLab follows the [Semantic Versioning](http://semver.org/) for its releases: `(Major).(Minor).(Patch)` in a [pragmatic way](https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e). - -- **Major version**: Whenever there is something significant or any backwards incompatible changes are introduced to the public API. -- **Minor version**: When new, backwards compatible functionality is introduced to the public API or a minor feature is introduced, or when a set of smaller features is rolled out. -- **Patch number**: When backwards compatible bug fixes are introduced that fix incorrect behavior. - -The current stable release will receive security patches and bug fixes (eg. `5.0` -> `5.0.1`). Feature releases will mark the next supported stable release where the minor version is increased numerically by increments of one (eg. `5.0 -> 5.1`). - -We encourage everyone to run the latest stable release to ensure that you can easily upgrade to the most secure and feature rich GitLab experience. In order to make sure you can easily run the most recent stable release, we are working hard to keep the update process simple and reliable. - -More information about the release procedures can be found in the doc/release directory. diff --git a/PROCESS.md b/PROCESS.md deleted file mode 100644 index 1b6b3e7d32d..00000000000 --- a/PROCESS.md +++ /dev/null @@ -1,113 +0,0 @@ -# GitLab Contributing Process - -## Purpose of describing the contributing process - -Below we describe the contributing process to GitLab for two reasons. So that contributors know what to expect from maintainers (possible responses, friendly treatment, etc.). And so that maintainers know what to expect from contributors (use the latest version, ensure that the issue is addressed, friendly treatment, etc.). - -## Common actions - -### Issue team -- Looks for issues without [workflow labels](#how-we-handle-issues) and triages issue -- Closes invalid issues with a comment (duplicates, [feature requests](#feature-requests), [fixed in newer version](#issue-fixed-in-newer-version), [issue report for old version](#issue-report-for-old-version), not a problem in GitLab, etc.) -- Asks for feedback from issue reporter ([invalid issue reports](#improperly-formatted-issue), [format code](#code-format), etc.) -- Monitors all issues for feedback (but especially ones commented on since automatically watching them) -- Closes issues with no feedback from the reporter for two weeks - -### Merge marshal - -- Responds to merge requests the issue team mentions them in and monitors for new merge requests -- Provides feedback to the merge request submitter to improve the merge request (style, tests, etc.) -- Mark merge requests 'ready-for-merge' when they meet the contribution guidelines -- Mention developer(s) based on the [list of members and their specialities](https://about.gitlab.com/core-team/) -- Closes merge requests with no feedback from the reporter for two weeks - -## Priorities of the issue team - -1. Mentioning people (critical) -1. Workflow labels (normal) -1. Functional labels (minor) -1. Assigning issues (avoid if possible) - -## Mentioning people - -The most important thing is making sure valid issues receive feedback from the development team. Therefore the priority is mentioning developers that can help on those issue. Please select someone with relevant experience from [GitLab core team](https://about.gitlab.com/core-team/). If there is nobody mentioned with that expertise look in the commit history for the affected files to find someone. Avoid mentioning the lead developer, this is the person that is least likely to give a timely response. If the involvement of the lead developer is needed the other core team members will mention this person. - -## Workflow labels - -Workflow labels are purposely not very detailed since that would be hard to keep updated as you would need to re-evaluate them after every comment. We optionally use functional labels on demand when want to group related issues to get an overview (for example all issues related to RVM, to tackle them in one go) and to add details to the issue. - -- *Awaiting feedback*: Feedback pending from the reporter -- *Awaiting confirmation of fix*: The issue should already be solved in **master** (generally you can avoid this workflow item and just close the issue right away) -- *Attached MR*: There is a MR attached and the discussion should happen there - - We need to let issues stay in sync with the MR's. We can do this with a "Closing #XXXX" or "Fixes #XXXX" comment in the MR. We can't close the issue when there is a merge request because sometimes a MR is not good and we just close the MR, then the issue must stay. -- *Awaiting developer action/feedback*: Issue needs to be fixed or clarified by a developer - -## Functional labels - -These labels describe what development specialities are involved such as: PostgreSQL, UX, LDAP. - -## Assigning issues - -If an issue is complex and needs the attention of a specific person, assignment is a good option but assigning issues might discourage other people from contributing to that issue. We need all the contributions we can get so this should never be discouraged. Also, an assigned person might not have time for a few weeks, so others should feel free to takeover. - -## Label colors - -- Light orange `#fef2c0`: workflow labels for issue team members (awaiting feedback, awaiting confirmation of fix) -- Bright orange `#eb6420`: workflow labels for core team members (attached MR, awaiting developer action/feedback) -- Light blue `#82C5FF`: functional labels -- Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately: - - Feature request (see copy & paste response: [Feature requests](#feature-requests)) - - Support (see copy & paste response: [Support requests and configuration questions](#support-requests-and-configuration-questions) - -## Be kind - -Be kind to people trying to contribute. Be aware that people may be a non-native English speaker, they might not understand things or they might be very sensitive as to how you word things. Use Emoji to express your feelings (heart, star, smile, etc.). Some good tips about giving feedback to merge requests is in the [Thoughtbot code review guide](https://github.com/thoughtbot/guides/tree/master/code-review). - -## Copy & paste responses - -### Improperly formatted issue - -Thanks for the issue report. Please reformat your issue to conform to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines). - -### Feature requests - -Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the \[feature request forum\]\(http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information. - -### Issue report for old version - -Thanks for the issue report but we only support issues for the latest stable version of GitLab. I'm closing this issue but if you still experience this problem in the latest stable version, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines). - -### Support requests and configuration questions - -Thanks for your interest in GitLab. We don't use the issue tracker for support requests and configuration questions. Please use the \[support forum\]\(https://groups.google.com/forum/#!forum/gitlabhq), \[Stack Overflow\]\(http://stackoverflow.com/questions/tagged/gitlab), the #gitlab IRC channel on Freenode or the http://about.gitlab.com paid services for this purpose. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information. - -### Code format - -Please use ``` to format console output, logs, and code as it's very hard to read otherwise. - -### Issue fixed in newer version - -Thanks for the issue report. This issue has already been fixed in newer versions of GitLab. Due to the size of this project and our limited resources we are only able to support the latest stable release as outlined in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker). In order to get this bug fix and enjoy many new features please \[upgrade\]\(https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update). If you still experience issues at that time please open a new issue following our issue tracker guidelines found in the \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines). - -### Improperly formatted merge request - -Thanks for your interest in improving the GitLab codebase! Please update your merge request according to the \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#pull-request-guidelines). - -### Inactivity close of an issue - -It's been at least 2 weeks (and a new release) since we heard from you. I'm closing this issue but if you still experience this problem, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines). - -### Inactivity close of a merge request - -This merge request has been closed because a request for more information has not been reacted to for more than 2 weeks. If you respond and conform to the merge request guidelines in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#pull-requests) we will reopen this merge request. - -### Accepting merge requests - -Is there a request on [the feature request forum](http://feedback.gitlab.com/forums/176466-general) that is similar to this? If so, can you make a comment with a link to it? Please be aware that new functionality that is not marked [accepting merge/pull requests](http://feedback.gitlab.com/forums/176466-general/status/796455) on the forum might not make it into GitLab. You might be asked to make changes and even after implementing them your feature might still be declined. If you want to reduce the chance of this happening please have a discussion in the forum first. - -### Only accepting merge requests with green tests - -We can only accept a merge request if all the tests are green. I've just -restarted the build. When the tests are still not passing after this restart and -you're sure that is does not have anything to do with your code changes, please -rebase with master to see if that solves the issue. diff --git a/Procfile b/Procfile deleted file mode 100644 index 799b92729fa..00000000000 --- a/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -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 diff --git a/README.md b/README.md deleted file mode 100644 index 0563ceca409..00000000000 --- a/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# ![logo](https://about.gitlab.com/images/gitlab_logo.png) GitLab - -## Open source software to collaborate on code - -![Animated screenshots](https://about.gitlab.com/images/animated/compiled.gif) - -- Manage Git repositories with fine grained access controls that keep your code secure -- Perform code reviews and enhance collaboration with merge requests -- Each project can also have an issue tracker and a wiki -- Used by more than 100,000 organizations, GitLab is the most popular solution to manage Git repositories on-premises -- Completely free and open source (MIT Expat license) -- Powered by [Ruby on Rails](https://github.com/rails/rails) - -## Editions - -There are two editions of GitLab. -*GitLab [Community Edition](https://about.gitlab.com/features/) (CE)* is available without any costs under an MIT license. - -*GitLab Enterprise Edition (EE)* includes [extra features](https://about.gitlab.com/features/#compare) that are most useful for organizations with more than 100 users. -To get access to the EE and support please [become a subscriber](https://about.gitlab.com/pricing/). - -## Canonical source - -The source of GitLab Community Edition is [hosted on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/) and there are mirrors to make [contributing](CONTRIBUTING.md) as easy as possible. - -## Code status - -- [![build status](https://ci.gitlab.org/projects/1/status.png?ref=master)](https://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch) - -- [![Build Status](https://semaphoreapp.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/243338/badge.png)](https://semaphoreapp.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) - -## Website - -On [about.gitlab.com](https://about.gitlab.com/) you can find more information about: - -- [Subscriptions](https://about.gitlab.com/subscription/) -- [Consultancy](https://about.gitlab.com/consultancy/) -- [Community](https://about.gitlab.com/community/) -- [Hosted GitLab.com](https://about.gitlab.com/gitlab-com/) use GitLab as a free service -- [GitLab Enterprise Edition](https://about.gitlab.com/gitlab-ee/) with additional features aimed at larger organizations. -- [GitLab CI](https://about.gitlab.com/gitlab-ci/) a continuous integration (CI) server that is easy to integrate with GitLab. - -## Requirements - -GitLab requires the following software: - -- Ubuntu/Debian/CentOS/RHEL -- Ruby (MRI) 2.0 or 2.1 -- Git 1.7.10+ -- Redis 2.0+ -- MySQL or PostgreSQL - -Please see the [requirements documentation](doc/install/requirements.md) for system requirements and more information about the supported operating systems. - -## Installation - -The recommended way to install GitLab is using the provided [Omnibus packages](https://about.gitlab.com/downloads/). Compared to an installation from source, this is faster and less error prone. Just select your operating system, download the respective package (Debian or RPM) and install it using the system's package manager. - -There are various other options to install GitLab, please refer to the [installation page on the GitLab website](https://about.gitlab.com/installation/) for more information. - -You can access a new installation with the login **`root`** and password **`5iveL!fe`**, after login you are required to set a unique password. - -## Third-party applications - -There are a lot of [third-party applications integrating with GitLab](https://about.gitlab.com/applications/). These include GUI Git clients, mobile applications and API wrappers for various languages. - -## GitLab release cycle - -Since 2011 a minor or major version of GitLab is released on the 22nd of every month. Patch and security releases are published when needed. New features are detailed on the [blog](https://about.gitlab.com/blog/) and in the [changelog](CHANGELOG). For more information about the release process see the [release documentation](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/release). Features that will likely be in the next releases can be found on the [feature request forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457). - -## Upgrading - -For updating the Omnibus installation please see the [update documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/update.md). For installations from source there is an [upgrader script](doc/update/upgrader.md) and there are [upgrade guides](doc/update) detailing all necessary commands to migrate to the next version. - -## Install a development environment - -To work on GitLab itself, we recommend setting up your development environment with [the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit). -If you do not use the GitLab Development Kit you need to install and setup all the dependencies yourself, this is a lot of work and error prone. -One small thing you also have to do when installing it yourself is to copy the example development unicorn configuration file: - - cp config/unicorn.rb.example.development config/unicorn.rb - -Instructions on how to start GitLab and how to run the tests can be found in the [development section of the GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit#development). - -## Documentation - -All documentation can be found on [doc.gitlab.com/ce/](http://doc.gitlab.com/ce/). - -## Getting help - -Please see [Getting help for GitLab](https://about.gitlab.com/getting-help/) on our website for the many options to get help. - -## Is it any good? - -[Yes](https://news.ycombinator.com/item?id=3067434) - -## Is it awesome? - -Thanks for [asking this question](https://twitter.com/supersloth/status/489462789384056832) Joshua. -[These people](https://twitter.com/gitlab/favorites) seem to like it. diff --git a/Rakefile b/Rakefile deleted file mode 100644 index 35b2f05cbb4..00000000000 --- a/Rakefile +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env rake -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require File.expand_path('../config/application', __FILE__) - -Gitlab::Application.load_tasks diff --git a/VERSION b/VERSION index bdc6df1ef36..5306ee61e00 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.10.0.rc4 \ No newline at end of file +7.10.0.rc5 \ No newline at end of file diff --git a/app/assets/images/authbuttons/bitbucket_64.png b/app/assets/images/authbuttons/bitbucket_64.png deleted file mode 100644 index 4b90a57bc7de93163275f99ea2971e2740af98af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2163 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 diff --git a/app/assets/images/authbuttons/gitlab_64.png b/app/assets/images/authbuttons/gitlab_64.png deleted file mode 100644 index 31281a194441d4e23bb691de89110c6097021ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6559 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 E0EL3ng8%>k diff --git a/app/assets/images/authbuttons/google_64.png b/app/assets/images/authbuttons/google_64.png deleted file mode 100644 index 94a0e089c6efe07dcb50af341d51c2d13b689639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3169 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 HDWM4f4Snc( diff --git a/app/assets/images/authbuttons/twitter_64.png b/app/assets/images/authbuttons/twitter_64.png deleted file mode 100644 index 5c9f14cb0771005efaa2ed050560298aa03131b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 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 ABme*a diff --git a/app/assets/images/chosen-sprite.png b/app/assets/images/chosen-sprite.png deleted file mode 100644 index 3d936b07d443fb420a71cac72750537bb54ad2cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 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 Y+uWTDhCb~|3=9kmp00i_>zopr01kMyb^rhX diff --git a/app/assets/images/diff_note_add.png b/app/assets/images/diff_note_add.png deleted file mode 100644 index 0084422e3303593e2f067c7de013413f393b0f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rag4i*LmhP=H?HZU+SW_r3fhEy=tPTK1o9VpQr zZ`JZe|(YrntQbV@qB zI+y>2s(i$%@`M}<%hkyz)2Hn@Jni3N_tspy=uP_4LYE)yuM05bI)CzYN8nRy`Hd5+ zmIrQ^W&2Xu-813Yow%;a`Fr&jthSu0xX!0E{GyWCmT!HkX(vDRO}ff7`={EOg4|ac zYPVvmbvO>G#9J(pS@?8^?X!bd_zOX)%_@1w66K$lP70Q cHvUuY{JuIoV1hX(0|Nttr>mdKI;Vst0LHAu3;+NC diff --git a/app/assets/images/favicon.ico b/app/assets/images/favicon.ico deleted file mode 100644 index bfb74960c480e6cb14f1d38437303af6b375ccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32988 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 diff --git a/app/assets/images/gitorious-logo-black.png b/app/assets/images/gitorious-logo-black.png deleted file mode 100644 index 78f17a9af79dc2395acd9bcc2a391589dd6b6ed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4i*Lm28M*4p$rTROiAAEE)4(M`_JrWU|`@Z z@Q5sCV9-+rVaAH3_GJtV4D2PIzOL-|nZ)_j1bkfE!WbBsc6quuhGg7(JJZ)ABv9md z{rlb(ky@OBiZUyFUAnF){Ze95R`p!to8Zy1)>}YJscFTxcUhMgEf5o|6`UpzGC??E z!i?EU!v5V$I?Xayx?Xm2pWAPKrndav<_C8h6W{GEzW4L)?{|Oa7vC@bpi|UV=Ec}v zJ|``LbCJcock3^2Tw&$fs@BXs#AYW=z-Lkst&9Ss>jLDti%21$_Q|>kQ z^a|Aj)eLGiQRc^2xxd&Taa8*)TjPC`pPS~FICxolRl2!P>JC}9H6~SqdrN%$@^71U zmiJ0LI8z&Q=VyLLpp&}vCWc3Tub3jG%+I~r(q^`IzBi|DP^jgBxjoCKuZz+(+w2qh z{?hg<2VYzaVpdsPqrmi|pJAEtt9&Qc2_cI%F8G-&#L?icwD5z^wTqsT4?cvg=af=o zXy_}tw*G~foT(R=@r?dT262lNi3907mY5eSS1@UOYB^iH@~6u2r`yhLE+UiQ$qq>MYDI9b}PNE-N|mD_%!WyL9m;_z1IalECP&w zlo`a_jm>8;ir3vd?8=z&g})%+RqkGI>EF3Y2Peclv#h&6_h`mR!*0*_*UOSUIJ!U0 z`>y*#v`^*@7nM(E>Jwr=-hTw;>(ZH_U}>+Rc%bA_RhSMEBhlh&HZ=a&i_SW z!j+{C7c91_FcsQ+^s2Qq%_}{v7j^TL*6QbvR(@(PjQilg9%T6_{v5;H8@G!7y#i$c MPgg&ebxsLQ0E*vQZvX%Q diff --git a/app/assets/images/gitorious-logo-blue.png b/app/assets/images/gitorious-logo-blue.png deleted file mode 100644 index 4962cffba3153927ddd8cd5ff295fe4ca142bfa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEH=O_WMlYe8$3$ej5H@U|_8Aba4!+xb=3{M!`b{ zJg!e=idUovv7HdwlH)LyHzTr%(a6(FS4gXHr*eZ#j<(;w{Md-9X{nKA3s|jU-#uQw z@!>^Q!G%#*mXyrvcyS}neU%6A+ZYBUpqG?Z&Tug3-m@w9WM|BDQCY3~_pMCHJaGp9 z=gZrs#&kTq$f~3ycr%^PV%zn=#R=Oz0~YfxKQM2uee64Br378|hH&2pQS4{to?e<; zX?$Rot?ufql`O@k0c#bc&-3M-+qt&8L4^ZhpIYRrQr&!WP6wBLVG+e!|K1YaCU)sE z>xMh*eE)quWczG)I_WRGF>r?lQ_{W@6){_rcb$pcf1={6WYV*vhG27UZr*rZ^8sJO z%x>on-J|@Ly%(z%sI=S&swuWq_$JqcY#GCZpzI$tnOhaFypY+(z+l0+;^oQHtDd}P zGF`cUuJaeM8$lulpFeFscx$o4?vS%VMRC06L(XNZs247pmNBE+qL#_1cSD?2bHP54 O`#oL#T-G@yGywpa6T8&_ diff --git a/app/assets/images/icon-link.png b/app/assets/images/icon-link.png deleted file mode 100644 index 60021d5ac47686cce70570d22bad6670082caf56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 726 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4h9AWhJGeJCI$wkxt=bLAr*{suR3~!1WFwJ z`2JjiLAPd+*(?{nT~iD)1P;0G5IE$zAmoD5QrC{zG0POWf&`kvws4!ATwtOmk{0~7 zX$FVM5e`@Ji6=6;CWz@R5|HnP+PscXz{rrFJvwP|tds-j%JzKVI-W|Cvamf>D zbK+N(?=DGLd{lI;Qn=QJDc@Gc{|U@IkTi9(v=YPHl?qG0X}PdY^I7j?lJNA5qhR*j z885vh9T$C1JY4^=rIZfU-4c1rSQ z+*bcHn)B^i1Fen?SIZ5eSATKX{UAg7qXRShGr5@k6$_VEXR#;F{_4QXyzHFi{wHrs zS*CwqzV+dOU#j6-K817S9GGv~#-#o1Z^zx{n>Cl@OSyjjpTRrp`_@B0eYxK6Tu}Qn z|Dmnumh!&>mxK>~c^S*`J~>?N{=M}&Vmb3qFgyMJVa#x2#dYqVSHB!z#>nyZ_{RNb ztM*=4cHW8c+G>X?j`yJndzqGmH+~cN5ZC&7OZ$bokDKa_{=X#W^jm9sVB%D!Hd0u=tzLq1$Ch|^ry^F?$H|Ny_?tGU{ zJ@@{|-FOc6S%37?1h#Ee4?iC^_uQSDjm$=wpB?1;%wB$Uc*TBZ+IA&I%jeip?YP*g75la_icau`+R31L)Bct6MvT;C~Fn;@MnDT$W6hP^}~&o8;;%Q=S%Qt zJvH&BKeOj0VFy;(my!#Z-dj4bToOLOwdXm5+_96t1w|dqLhmg9tRd>KQ2XJZQ@_gv oWiRCRZZp4f#jMQlpW~Ik?9KuOS(SE@&p`>+)78&qol`;+06}6|%>V!Z diff --git a/app/assets/images/icon-search.png b/app/assets/images/icon-search.png deleted file mode 100644 index 3c1c146541d456a042db5768154a307b9b535e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0y~yVBi5^4i*LmhCek^au^sGmU_B4hDb=J9#r&dE@WW8 z5O1_2A;N?w);QN(;P8=z&pi54Y88z63C2=tyV5?hDXlPAylIchp%m}Q`yXxRPuVy9 z&xVEXukI}Sw<$U0-NhqU0<&h_+w&qLLptKcvPUzopr02WzZ=l}o! diff --git a/app/assets/images/icon_sprite.png b/app/assets/images/icon_sprite.png deleted file mode 100644 index 2e7a5023398e7aa1d2794755af4f90d59b431919..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2636 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 XV35t6T@mdJ3=9mOu6{1-oD!M>8!oFyTt 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�!-A0Y}@#PC; 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 DM4tW> diff --git a/app/assets/images/monokai-scheme-preview.png b/app/assets/images/monokai-scheme-preview.png deleted file mode 100644 index fbb339c6a9170de79c5fee8fc2a5abd6a785f4e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3711 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 diff --git a/app/assets/images/move.png b/app/assets/images/move.png deleted file mode 100644 index 6a0567f8f2534837e7280dd41e4bf4b98725a3bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4i*LmhMUEk>KPaqdOTemLn;`rPTk1stjObX zvtgpdSGS}kM_TCv)HUz3%k9&}80y8HybL zxbJ_k&Xx_kxVo;*;PI)O5-3^AWjA=Uvjhx=GyhRg&kltEVRKOJvKwdg?ao&ez}GzLQyT zbbny0PO9OwoqIR%ge8~1+z_g`_O<3E(e#%ymKILyisVY4n|w_&eQw`GKaJCJiz9nd z`7ZKgP45U~%@RMcf>q=754o2Oo452tNTo|EHgh&_R!C#KR5ktKhG|+&b2nTom0#r2 zyfs03)3%0fT>(t_QdMsrDUnAn$3LCheyZKre)f#iQ;xf)W=_9!^YY)6 zrfJVQC%>8JcJfH))N9#al_aNkow6|tSMojfbnWr1O}+~A#9hxhUk~YDGcC76_0~q7 z`xBC%-F$VuB>S#)eoU?UcBbQAFT-9%)%f=94s+bjbzSRa*vqJ|MXouKyQjqltZgmT zjnM5}o0wv_>gcg+eOYghO^XqjoV_y1zbP0l+XkKy3aIH diff --git a/app/assets/images/no_group_avatar.png b/app/assets/images/no_group_avatar.png deleted file mode 100644 index bfb31bb2184f6895c55c3027ddf9e357170bc338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmeAS@N?(olHy`uVBq!ia0y~yU^oH791IK$3?0TFofsIHOFdm2Ln;{G+%D{ERTDY- z@aF$8eis!b#xqO*Z}GfrR+WBgC%@W1u@95pFVt8O|3kHQ;s36%_B|8CKRLyn;I35E zf6}^VLUy9Z*_Rv#AHM%7&=>N`Xu_6rg)vk&u1#{cTmQ@BoSeXPj(^s|7c#KiUTZ6W=RZ$CM9$Vg1rmT%s|>)icG z(xXt~PFXEeQBuvio6braso5SZD|5Iz7fjVv6g;v?R;4LwTa%1Jc#eYPo0!cFCLcZ@ zYVT-ww3gp=c*$g5%^!XbJ(m8vIkTzRs=QF~(Sls-tpDlZ_ZI3DC<^Y1$@#l~@@41H zG^bY+-nOh+WTEJEXh!I26%8*N57})gxpDR?EFK4nXP5YHdbsgOQ;3cDZl$G1HY)@^ zmC(?X=~yA7tZL0Z>Eo4a`$LN>JTxZczBse~R>w)66Rr{bxjXcY6e{lsuARqj%PjPj zeVSeWZ#||XkM|w9u}6aHFXPjA-PmF271wqV9PQB^CKz}2ct zZ7UwUS>isik6H1_S^bVVQgxh9Htf$_qH^w^*}Nd8`b5*C4L|m=r5txIiMT z!XCQyJg?=#*Dr#dRh+J0Ti$kpE!J;Yn~8hv@{4PDa(ABRvFzY;?s#*d>|3YeCdcSE z!p^fETm2B&cUUOsC7-kh+ueojH!O;tJ3lLvaG2HE%%9o!@98{FmmZm%j+{UFPQD6( zZztFpKUorQ=cDjT*!JsAMd^^8cb>P+QM)WEuXOI2$#Q2U6W5oMon7|xnwzUQ2EP03 zJm+G`(KeCQFS~d^Vu_RD*VoGTvDna{?6)p;}!c`o0EkZ7zEgw zey`72EFHnobmA}Db=FHxN$gBalN1ylJ2*JJV_|}TB$K8F?4V+e0}_}Q(#vI^U41N4 Q0F)6uUHx3vIVCg!0E-QxcK`qY diff --git a/app/assets/images/onion_skin_sprites.gif b/app/assets/images/onion_skin_sprites.gif deleted file mode 100644 index 337aa1bfb632ff492b0a24ffe652ca5ab46f6ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548 zcmZ?wbhEHbzs&Ycq{PUPj~UA}yI_3G90=FQu*Y174v7mpk{($&>9 zapJ_IM~`maym{Tab@S)XKYjXiNl8g_bMuueS8m_FefI3xojZ3vfByXZ`SS}FEI4%N zP+?)=xpU`Mty)!FT)c4M!sEw}&z(EBwYBx;&6~Nox!bpIU%Pf~K|#Uc!-o$XIMC72 zv1ZMh4I4JJwY5Ea_U!-v|1)RKJagvE-Me>Rym-Mt1W^3X9pM|G;F4I97~vb>VsGGN zWaesaU}|Y*X=1LVP?1~U>ucqiS6q^qmz?SuALAiwH}g4I2m(n!r`>fogrRx z171(nYKhr+Rlh;{@1(7lHW$u~m0!L7$7$E{xlcd;ijCWz{;@W_wxX%DC9=7wwWK{X z&oyA;q{&mJPMbbsrgML`sPX&-3m1sbTDolciU6b4Yu2t?zhOO#@W$0rYz7AWJR3B3 z?l<6EC!)Ahn{}r=<64QG?5p{9a;)Vzcj3}n#vKN%vO6VDuhlrPlW7CbZGMHVMl39E zK79Q2d847s8#QKcb>0oE;pd}z6*juGcBl#-TI;nT<)9X;_nD1C7d|8&$@#^wWx|Fd b&4)sD)WF2;E4_MN-;?mu|=h>_{(v*#~f zzIy%UEfed9kDoq&`TFhq4_4;ifByda&%n$jWAUKjU^9oXR?LYF3lB4MD0$8C*tqCu zw}i2h!hwy8kM}D$cgc88YG|CS5xgqqJQ*R6A z#OSajHnv=6WNPOYz@0mbero&ljH$Li^iKtvP{@guvetAd8-0b4R2qg&9+DG9(STYy0URvpwTX!Tqt1E+(+f zP|r^^j{0M1AY9SlFoBJy!7t|J!oyc{r$p6F-Dg!hQ}_3s{JH?)8~oQ!Fu!TMy7|%h z=J11A1rj_jX0vImT{Lr3*6kIW{)%1weqa6ZUd3&1iuY@tt32_ZmAzrU&%|RodAiyU zbSE&Zdv5mS^1VmhAw^qf^X&iYIGt_YrJeiKOSU~XjQ+NB{^MmfwU2ctnfEewr&O(7 zeqwqV>%j*;j;9q=r^hV2+IzfGA3k7Y#3 z2&HdYugfnbXwUd@g|ceeN2i-H`h9Yile#qj)~Kh(y^~8j`b}l>hf5dqeZK9@?NomB za_e=CR~em2Pr5AcPmcCHx%6wvj%~#f-@=c|r6g|qFXcWr>74ueX|q>~`ij)<=_$Et z??2;w|J;RJyqc4?YFw+_mpI|jW$w)Kd;DAWZz_#R+N7Nk9=7w9mHGP%shga4_a)0Y z?>o6nRwA&daZTzCZgKL9yOdJnz@d zMRi)+n5-It4Qv*7n7uu_r2jGh#?<-0Bd27_eGU=Hai9C#(5T(b!Rtc*jwe4?&UwD7 zevzw!!@hlf*YX9UKQ30?=ke5k$uIt^C!%+p*z}1}`(V^YyG!qtDy6p8uaLU7$!F_< zz_L#=+a6`B=H(u|f4}IT`=gBDM$rw7QU=T!N3)jP_xhxhl@^%0#7|yidhoo-C9mc% z*3Sl|GyCIb`8T>mJl_7&c>9h!U0#1%%XVF`bdYW4e|c{5{+qLE-aWT?Ubyc{ueObC zLiC$QNB+FB7HyMzwa?zAcYFQvTeJON=Dbhd_Gb1k%X5|Q+1so7zBjBqP_}IH=Hi^N zoBmUE_m;eT_SkT}n2dh*n?-YHs)nv8WiiXTe?aO+{j3GuXVw`8%q&a_=RS9ORpzp@ zoSC-+^Ou`dMH^WEd2q7(*DgKobz%(W`s*H7T@2jv@_?$=;vWZ7)`_jyefsO7#Tii# z%x+0Hq0HObrSUG0_g$+A}`)(frAo^j@C)9Wkldd2T{ z8|qXVg>%p6jh=kvc}!UMS(CGqcnfz)Pm9rITJ-(u;%m{hTTfWA=dJrZJugbW{>4F; zbz*bO)7QBxyo$Mcedn8i2Q2qyeC^7fP#;nAI3k?8Px-y_lWMK96}N6Gt^aOSQQmle z*A)IkkD{29gXKP6ZPNXH=X{~yywsBqmrk6xqp4Nt5r5cb(fWl)WX~R&Ht%_vk(T%a zwmV06dF-F-`h4e>i}j0MI%p?FeRLJ6{O|gky(@4|Dof(#A_fKq22WQ%mvv4FO#qe2 BwBY~% diff --git a/app/assets/images/solarized-dark-scheme-preview.png b/app/assets/images/solarized-dark-scheme-preview.png deleted file mode 100644 index 7ed7336896b1daa3d06b3f304931bc2006a3b145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3195 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 ZrS+Hnj7##@7#J8BJYD@<);T3K0RR>(?(+Zu diff --git a/app/assets/images/swipemode_sprites.gif b/app/assets/images/swipemode_sprites.gif deleted file mode 100644 index b010b4e4482760d5e144d93c2b6c76fa4f981438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 505 zcmZ?wbhEHblw%NM_^QS*bLPz3w{LfKb*)>sE;l!K?%cWi_wQf4cyW1o`TF(imo8m; z{P^*C^X4sIzP!G^J})n?xw(1u>ebt}ZQHwd@5+@cSFKvr)6=tT*|Gx%4y;(QV&A@f zO-)UinVE+VAHIJ5`s~@WFJHdAVZ(;IckkZ0bLZBrTWM)&|NsAIpdL{C&mG|#px}~N zk{IC|z-(Vpz@Ye(g_VIpjX?)w3&@)cZ2ui5UobH;;o?1UQ@kO=v-FQd?zX7=rBgOc zZ*s5}v}WUA5#Dz1+V(XKexLv4Gq-LF5A@j}Smg8h*Yoek^5ta0ei$yWyma$aKBpPG lvY~8@jD&$ASGyS(!=~~?og*F!S_}*f44$rjF6*2UngH{lRImU5 diff --git a/app/assets/images/trans_bg.gif b/app/assets/images/trans_bg.gif deleted file mode 100644 index 1a1c9c15ec71a58db869578399068cf313c51599..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49 zcmZ?wbh9u|!m|T4YyN*GkK@_-!(Kf4QTXiNP8G Dhh`8a diff --git a/app/assets/images/white-scheme-preview.png b/app/assets/images/white-scheme-preview.png deleted file mode 100644 index fc4c40b9227cced4692d9c3f0b3e09d62894fe3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3751 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 fODQI7`Oi>bk~!o5iZnI`1_lOCS3j3^P6 - Pager.init 20, true - $(".event_filter_link").bind "click", (event) => - event.preventDefault() - @toggleFilter($(event.currentTarget)) - @reloadActivities() - - reloadActivities: -> - $(".content_list").html '' - Pager.init 20, true - - - toggleFilter: (sender) -> - sender.parent().toggleClass "active" - event_filters = $.cookie("event_filter") - filter = sender.attr("id").split("_")[0] - if event_filters - event_filters = event_filters.split(",") - else - event_filters = new Array() - - index = event_filters.indexOf(filter) - if index is -1 - event_filters.push filter - else - event_filters.splice index, 1 - - $.cookie "event_filter", event_filters.join(","), { path: '/' } diff --git a/app/assets/javascripts/admin.js.coffee b/app/assets/javascripts/admin.js.coffee deleted file mode 100644 index bcb2e6df7c0..00000000000 --- a/app/assets/javascripts/admin.js.coffee +++ /dev/null @@ -1,53 +0,0 @@ -class @Admin - constructor: -> - $('input#user_force_random_password').on 'change', (elem) -> - elems = $('#user_password, #user_password_confirmation') - - if $(@).attr 'checked' - elems.val('').attr 'disabled', true - else - elems.removeAttr 'disabled' - - $('body').on 'click', '.js-toggle-colors-link', (e) -> - e.preventDefault() - $('.js-toggle-colors-link').hide() - $('.js-toggle-colors-container').show() - - $('input#broadcast_message_color').on 'input', -> - previewColor = $('input#broadcast_message_color').val() - $('div.broadcast-message-preview').css('background-color', previewColor) - - $('input#broadcast_message_font').on 'input', -> - previewColor = $('input#broadcast_message_font').val() - $('div.broadcast-message-preview').css('color', previewColor) - - $('textarea#broadcast_message_message').on 'input', -> - previewMessage = $('textarea#broadcast_message_message').val() - $('div.broadcast-message-preview span').text(previewMessage) - - $('.log-tabs a').click (e) -> - e.preventDefault() - $(this).tab('show') - - $('.log-bottom').click (e) -> - e.preventDefault() - visible_log = $(".file-content:visible") - visible_log.animate({ scrollTop: visible_log.find('ol').height() }, "fast") - - modal = $('.change-owner-holder') - - $('.change-owner-link').bind "click", (e) -> - e.preventDefault() - $(this).hide() - modal.show() - - $('.change-owner-cancel-link').bind "click", (e) -> - e.preventDefault() - modal.hide() - $('.change-owner-link').show() - - $('li.project_member').bind 'ajax:success', -> - Turbolinks.visit(location.href) - - $('li.group_member').bind 'ajax:success', -> - Turbolinks.visit(location.href) diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee deleted file mode 100644 index 9e5d594c861..00000000000 --- a/app/assets/javascripts/api.js.coffee +++ /dev/null @@ -1,49 +0,0 @@ -@Api = - groups_path: "/api/:version/groups.json" - group_path: "/api/:version/groups/:id.json" - namespaces_path: "/api/:version/namespaces.json" - - group: (group_id, callback) -> - url = Api.buildUrl(Api.group_path) - url = url.replace(':id', group_id) - - $.ajax( - url: url - data: - private_token: gon.api_token - dataType: "json" - ).done (group) -> - callback(group) - - # Return groups list. Filtered by query - # Only active groups retrieved - groups: (query, skip_ldap, callback) -> - url = Api.buildUrl(Api.groups_path) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - per_page: 20 - dataType: "json" - ).done (groups) -> - callback(groups) - - # Return namespaces list. Filtered by query - namespaces: (query, callback) -> - url = Api.buildUrl(Api.namespaces_path) - - $.ajax( - url: url - data: - private_token: gon.api_token - search: query - per_page: 20 - dataType: "json" - ).done (namespaces) -> - callback(namespaces) - - buildUrl: (url) -> - url = gon.relative_url_root + url if gon.relative_url_root? - return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee deleted file mode 100644 index fda142293bc..00000000000 --- a/app/assets/javascripts/application.js.coffee +++ /dev/null @@ -1,194 +0,0 @@ -# This is a manifest file that'll be compiled into including all the files listed below. -# Add new JavaScript/Coffee code in separate files in this directory and they'll automatically -# be included in the compiled file accessible from http://example.com/assets/application.js -# It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the -# the compiled file. -# -#= require jquery -#= require jquery.ui.all -#= require jquery_ujs -#= require jquery.cookie -#= require jquery.endless-scroll -#= require jquery.highlight -#= require jquery.history -#= require jquery.waitforimages -#= require jquery.atwho -#= require jquery.scrollTo -#= require jquery.blockUI -#= require jquery.turbolinks -#= require jquery.sticky-kit.min -#= require turbolinks -#= require autosave -#= require bootstrap -#= require select2 -#= require raphael -#= require g.raphael-min -#= require g.bar-min -#= require chart-lib.min -#= require branch-graph -#= require ace/ace -#= require ace/ext-searchbox -#= require d3 -#= require underscore -#= require nprogress -#= require nprogress-turbolinks -#= require dropzone -#= require mousetrap -#= require mousetrap/pause -#= require shortcuts -#= require shortcuts_navigation -#= require shortcuts_dashboard_navigation -#= require shortcuts_issueable -#= require shortcuts_network -#= require cal-heatmap -#= require_tree . - -window.slugify = (text) -> - text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() - -window.ajaxGet = (url) -> - $.ajax({type: "GET", url: url, dataType: "script"}) - -window.showAndHide = (selector) -> - -window.split = (val) -> - return val.split( /,\s*/ ) - -window.extractLast = (term) -> - return split( term ).pop() - -window.rstrip = (val) -> - return if val then val.replace(/\s+$/, '') else val - -# Disable button if text field is empty -window.disableButtonIfEmptyField = (field_selector, button_selector) -> - field = $(field_selector) - closest_submit = field.closest('form').find(button_selector) - - closest_submit.disable() if rstrip(field.val()) is "" - - field.on 'input', -> - if rstrip($(@).val()) is "" - closest_submit.disable() - else - closest_submit.enable() - -# Disable button if any input field with given selector is empty -window.disableButtonIfAnyEmptyField = (form, form_selector, button_selector) -> - closest_submit = form.find(button_selector) - updateButtons = -> - filled = true - form.find('input').filter(form_selector).each -> - filled = rstrip($(this).val()) != "" || !$(this).attr('required') - - if filled - closest_submit.enable() - else - closest_submit.disable() - - updateButtons() - form.keyup(updateButtons) - -window.sanitize = (str) -> - return str.replace(/<(?:.|\n)*?>/gm, '') - -window.linkify = (str) -> - exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig - return str.replace(exp,"$1") - -window.simpleFormat = (str) -> - linkify(sanitize(str).replace(/\n/g, '
')) - -window.unbindEvents = -> - $(document).unbind('scroll') - $(document).off('scroll') - -window.shiftWindow = -> - scrollBy 0, -50 - -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 - -$ -> - # Click a .one_click_select field, select the contents - $(".one_click_select").on 'click', -> $(@).select() - - $('.remove-row').bind 'ajax:success', -> - $(this).closest('li').fadeOut() - - # Initialize select2 selects - $('select.select2').select2(width: 'resolve', dropdownAutoWidth: true) - - # Close select2 on escape - $('.js-select2').bind 'select2-close', -> - setTimeout ( -> - $('.select2-container-active').removeClass('select2-container-active') - $(':focus').blur() - ), 1 - - # Initialize tooltips - $('.has_tooltip').tooltip() - - # Bottom tooltip - $('.has_bottom_tooltip').tooltip(placement: 'bottom') - - # Form submitter - $('.trigger-submit').on 'change', -> - $(@).parents('form').submit() - - $("abbr.timeago").timeago() - $('.js-timeago').timeago() - - # Flash - if (flash = $(".flash-container")).length > 0 - flash.click -> $(@).fadeOut() - flash.show() - - # Disable form buttons while a form is submitting - $('body').on 'ajax:complete, ajax:beforeSend, submit', 'form', (e) -> - buttons = $('[type="submit"]', @) - - switch e.type - when 'ajax:beforeSend', 'submit' - buttons.disable() - else - buttons.enable() - - # Show/Hide the profile menu when hovering the account box - $('.account-box').hover -> $(@).toggleClass('hover') - - # Commit show suppressed diff - $(".diff-content").on "click", ".supp_diff_link", -> - $(@).next('table').show() - $(@).remove() - - # Show/hide comments on diff - $("body").on "click", ".js-toggle-diff-comments", (e) -> - $(@).toggleClass('active') - $(@).closest(".diff-file").find(".notes_holder").toggle() - e.preventDefault() - - $(document).on "click", '.js-confirm-danger', (e) -> - e.preventDefault() - btn = $(e.target) - text = btn.data("confirm-danger-message") - form = btn.closest("form") - new ConfirmDangerModal(form, text) - - new Aside() - -(($) -> - # Disable an element and add the 'disabled' Bootstrap class - $.fn.extend disable: -> - $(@).attr('disabled', 'disabled').addClass('disabled') - - # Enable an element and remove the 'disabled' Bootstrap class - $.fn.extend enable: -> - $(@).removeAttr('disabled').removeClass('disabled') - -)(jQuery) diff --git a/app/assets/javascripts/aside.js.coffee b/app/assets/javascripts/aside.js.coffee deleted file mode 100644 index 85473101944..00000000000 --- a/app/assets/javascripts/aside.js.coffee +++ /dev/null @@ -1,17 +0,0 @@ -class @Aside - constructor: -> - $(document).off "click", "a.show-aside" - $(document).on "click", 'a.show-aside', (e) -> - e.preventDefault() - btn = $(e.currentTarget) - icon = btn.find('i') - console.log('1') - - if icon.hasClass('fa-angle-left') - btn.parent().find('section').hide() - btn.parent().find('aside').fadeIn() - icon.removeClass('fa-angle-left').addClass('fa-angle-right') - else - btn.parent().find('aside').hide() - btn.parent().find('section').fadeIn() - icon.removeClass('fa-angle-right').addClass('fa-angle-left') diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee deleted file mode 100644 index 5d3fe81da74..00000000000 --- a/app/assets/javascripts/autosave.js.coffee +++ /dev/null @@ -1,39 +0,0 @@ -class @Autosave - constructor: (field, key) -> - @field = field - - key = key.join("/") if key.join? - @key = "autosave/#{key}" - - @field.data "autosave", this - - @restore() - - @field.on "input", => @save() - - restore: -> - return unless window.localStorage? - - try - text = window.localStorage.getItem @key - catch - return - - @field.val text if text?.length > 0 - @field.trigger "input" - - save: -> - return unless window.localStorage? - - text = @field.val() - if text?.length > 0 - try - window.localStorage.setItem @key, text - else - @reset() - - reset: -> - return unless window.localStorage? - - try - window.localStorage.removeItem @key diff --git a/app/assets/javascripts/behaviors/details_behavior.coffee b/app/assets/javascripts/behaviors/details_behavior.coffee deleted file mode 100644 index decab3e1bed..00000000000 --- a/app/assets/javascripts/behaviors/details_behavior.coffee +++ /dev/null @@ -1,15 +0,0 @@ -$ -> - $("body").on "click", ".js-details-target", -> - container = $(@).closest(".js-details-container") - container.toggleClass("open") - - # Show details content. Hides link after click. - # - # %div - # %a.js-details-expand - # %div.js-details-content - # - $("body").on "click", ".js-details-expand", (e) -> - $(@).next('.js-details-content').removeClass("hide") - $(@).hide() - e.preventDefault() diff --git a/app/assets/javascripts/behaviors/taskable.js.coffee b/app/assets/javascripts/behaviors/taskable.js.coffee deleted file mode 100644 index ddce71c1886..00000000000 --- a/app/assets/javascripts/behaviors/taskable.js.coffee +++ /dev/null @@ -1,21 +0,0 @@ -window.updateTaskState = (taskableType) -> - objType = taskableType.data - isChecked = $(this).prop("checked") - if $(this).is(":checked") - stateEvent = "task_check" - else - stateEvent = "task_uncheck" - - taskableUrl = $("form.edit-" + objType).first().attr("action") - taskableNum = taskableUrl.match(/\d+$/) - taskNum = 0 - $("li.task-list-item input:checkbox").each( (index, e) => - if e == this - taskNum = index + 1 - ) - - $.ajax - type: "PATCH" - url: taskableUrl - data: objType + "[state_event]=" + stateEvent + - "&" + objType + "[task_num]=" + taskNum diff --git a/app/assets/javascripts/behaviors/toggler_behavior.coffee b/app/assets/javascripts/behaviors/toggler_behavior.coffee deleted file mode 100644 index 177b6918270..00000000000 --- a/app/assets/javascripts/behaviors/toggler_behavior.coffee +++ /dev/null @@ -1,14 +0,0 @@ -$ -> - # Toggle button. Show/hide content inside parent container. - # Button does not change visibility. If button has icon - it changes chevron style. - # - # %div.js-toggle-container - # %a.js-toggle-button - # %div.js-toggle-content - # - $("body").on "click", ".js-toggle-button", (e) -> - $(@).find('i'). - toggleClass('fa fa-chevron-down'). - toggleClass('fa fa-chevron-up') - $(@).closest(".js-toggle-container").find(".js-toggle-content").toggle() - e.preventDefault() diff --git a/app/assets/javascripts/blob/blob.js.coffee b/app/assets/javascripts/blob/blob.js.coffee deleted file mode 100644 index 37a175fdbc7..00000000000 --- a/app/assets/javascripts/blob/blob.js.coffee +++ /dev/null @@ -1,73 +0,0 @@ -class @BlobView - constructor: -> - # handle multi-line select - handleMultiSelect = (e) -> - [ first_line, last_line ] = parseSelectedLines() - [ line_number ] = parseSelectedLines($(this).attr("id")) - hash = "L#{line_number}" - - if e.shiftKey and not isNaN(first_line) and not isNaN(line_number) - if line_number < first_line - last_line = first_line - first_line = line_number - else - last_line = line_number - - hash = if first_line == last_line then "L#{first_line}" else "L#{first_line}-#{last_line}" - - setHash(hash) - e.preventDefault() - - # See if there are lines selected - # "#L12" and "#L34-56" supported - highlightBlobLines = (e) -> - [ first_line, last_line ] = parseSelectedLines() - - unless isNaN first_line - $("#tree-content-holder .highlight .line").removeClass("hll") - $("#LC#{line}").addClass("hll") for line in [first_line..last_line] - $.scrollTo("#L#{first_line}", offset: -50) unless e? - - # parse selected lines from hash - # always return first and last line (initialized to NaN) - parseSelectedLines = (str) -> - first_line = NaN - last_line = NaN - hash = str || window.location.hash - - if hash isnt "" - matches = hash.match(/\#?L(\d+)(\-(\d+))?/) - first_line = parseInt(matches?[1]) - last_line = parseInt(matches?[3]) - last_line = first_line if isNaN(last_line) - - [ first_line, last_line ] - - setHash = (hash) -> - hash = hash.replace(/^\#/, "") - nodes = $("#" + hash) - # if any nodes are using this id, they must be temporarily changed - # also, add a temporary div at the top of the screen to prevent scrolling - if nodes.length > 0 - scroll_top = $(document).scrollTop() - nodes.attr("id", "") - tmp = $("
") - .css({ position: "absolute", visibility: "hidden", top: scroll_top + "px" }) - .attr("id", hash) - .appendTo(document.body) - - window.location.hash = hash - - # restore the nodes - if nodes.length > 0 - tmp.remove() - nodes.attr("id", hash) - - # initialize multi-line select - $("#tree-content-holder .line-numbers a[id^=L]").on("click", handleMultiSelect) - - # Highlight the correct lines on load - highlightBlobLines() - - # Highlight the correct lines when the hash part of the URL changes - $(window).on("hashchange", highlightBlobLines) diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee deleted file mode 100644 index 2e91a06daa8..00000000000 --- a/app/assets/javascripts/blob/edit_blob.js.coffee +++ /dev/null @@ -1,44 +0,0 @@ -class @EditBlob - constructor: (assets_path, mode)-> - ace.config.set "modePath", assets_path + '/ace' - ace.config.loadModule "ace/ext/searchbox" - if mode - ace_mode = mode - editor = ace.edit("editor") - editor.focus() - @editor = editor - - if ace_mode - editor.getSession().setMode "ace/mode/" + ace_mode - - disableButtonIfEmptyField "#commit_message", ".js-commit-button" - $(".js-commit-button").click -> - $("#file-content").val editor.getValue() - $(".file-editor form").submit() - return false - - editModePanes = $(".js-edit-mode-pane") - editModeLinks = $(".js-edit-mode a") - editModeLinks.click (event) -> - event.preventDefault() - currentLink = $(this) - paneId = currentLink.attr("href") - currentPane = editModePanes.filter(paneId) - editModeLinks.parent().removeClass "active hover" - currentLink.parent().addClass "active hover" - editModePanes.hide() - if paneId is "#preview" - currentPane.fadeIn 200 - $.post currentLink.data("preview-url"), - content: editor.getValue() - , (response) -> - currentPane.empty().append response - return - - else - currentPane.fadeIn 200 - editor.focus() - return - - editor: -> - return @editor diff --git a/app/assets/javascripts/blob/new_blob.js.coffee b/app/assets/javascripts/blob/new_blob.js.coffee deleted file mode 100644 index ab8f98715e8..00000000000 --- a/app/assets/javascripts/blob/new_blob.js.coffee +++ /dev/null @@ -1,21 +0,0 @@ -class @NewBlob - constructor: (assets_path, mode)-> - ace.config.set "modePath", assets_path + '/ace' - ace.config.loadModule "ace/ext/searchbox" - if mode - ace_mode = mode - editor = ace.edit("editor") - editor.focus() - @editor = editor - - if ace_mode - editor.getSession().setMode "ace/mode/" + ace_mode - - disableButtonIfEmptyField "#commit_message", ".js-commit-button" - $(".js-commit-button").click -> - $("#file-content").val editor.getValue() - $(".file-editor form").submit() - return false - - editor: -> - return @editor diff --git a/app/assets/javascripts/branch-graph.js.coffee b/app/assets/javascripts/branch-graph.js.coffee deleted file mode 100644 index 010a2b0e42b..00000000000 --- a/app/assets/javascripts/branch-graph.js.coffee +++ /dev/null @@ -1,340 +0,0 @@ -class @BranchGraph - constructor: (@element, @options) -> - @preparedCommits = {} - @mtime = 0 - @mspace = 0 - @parents = {} - @colors = ["#000"] - @offsetX = 150 - @offsetY = 20 - @unitTime = 30 - @unitSpace = 10 - @prev_start = -1 - @load() - - load: -> - $.ajax - url: @options.url - method: "get" - dataType: "json" - success: $.proxy((data) -> - $(".loading", @element).hide() - @prepareData data.days, data.commits - @buildGraph() - , this) - - prepareData: (@days, @commits) -> - @collectParents() - @graphHeight = $(@element).height() - @graphWidth = $(@element).width() - ch = Math.max(@graphHeight, @offsetY + @unitTime * @mtime + 150) - cw = Math.max(@graphWidth, @offsetX + @unitSpace * @mspace + 300) - @r = Raphael(@element.get(0), cw, ch) - @top = @r.set() - @barHeight = Math.max(@graphHeight, @unitTime * @days.length + 320) - - for c in @commits - c.isParent = true if c.id of @parents - @preparedCommits[c.id] = c - @markCommit(c) - - @collectColors() - - collectParents: -> - for c in @commits - @mtime = Math.max(@mtime, c.time) - @mspace = Math.max(@mspace, c.space) - for p in c.parents - @parents[p[0]] = true - @mspace = Math.max(@mspace, p[1]) - - collectColors: -> - k = 0 - while k < @mspace - @colors.push Raphael.getColor(.8) - # Skipping a few colors in the spectrum to get more contrast between colors - Raphael.getColor() - Raphael.getColor() - k++ - - buildGraph: -> - r = @r - cuday = 0 - cumonth = "" - - r.rect(0, 0, 40, @barHeight).attr fill: "#222" - r.rect(40, 0, 30, @barHeight).attr fill: "#444" - - for day, mm in @days - if cuday isnt day[0] - # Dates - r.text(55, @offsetY + @unitTime * mm, day[0]) - .attr( - font: "12px Monaco, monospace" - fill: "#BBB" - ) - cuday = day[0] - - if cumonth isnt day[1] - # Months - r.text(20, @offsetY + @unitTime * mm, day[1]) - .attr( - font: "12px Monaco, monospace" - fill: "#EEE" - ) - cumonth = day[1] - - @renderPartialGraph() - - @bindEvents() - - renderPartialGraph: -> - start = Math.floor((@element.scrollTop() - @offsetY) / @unitTime) - 10 - if start < 0 - isGraphEdge = true - start = 0 - end = start + 40 - if @commits.length < end - isGraphEdge = true - end = @commits.length - - if @prev_start == -1 or Math.abs(@prev_start - start) > 10 or isGraphEdge - i = start - - @prev_start = start - - while i < end - commit = @commits[i] - i += 1 - - if commit.hasDrawn isnt true - x = @offsetX + @unitSpace * (@mspace - commit.space) - y = @offsetY + @unitTime * commit.time - - @drawDot(x, y, commit) - - @drawLines(x, y, commit) - - @appendLabel(x, y, commit) - - @appendAnchor(x, y, commit) - - commit.hasDrawn = true - - @top.toFront() - - bindEvents: -> - element = @element - - $(element).scroll (event) => - @renderPartialGraph() - - scrollDown: => - @element.scrollTop @element.scrollTop() + 50 - @renderPartialGraph() - - scrollUp: => - @element.scrollTop @element.scrollTop() - 50 - @renderPartialGraph() - - scrollLeft: => - @element.scrollLeft @element.scrollLeft() - 50 - @renderPartialGraph() - - scrollRight: => - @element.scrollLeft @element.scrollLeft() + 50 - @renderPartialGraph() - - scrollBottom: => - @element.scrollTop @element.find('svg').height() - - scrollTop: => - @element.scrollTop 0 - - appendLabel: (x, y, commit) -> - return unless commit.refs - - r = @r - shortrefs = commit.refs - # Truncate if longer than 15 chars - shortrefs = shortrefs.substr(0, 15) + "…" if shortrefs.length > 17 - text = r.text(x + 4, y, shortrefs).attr( - "text-anchor": "start" - font: "10px Monaco, monospace" - fill: "#FFF" - title: commit.refs - ) - textbox = text.getBBox() - # Create rectangle based on the size of the textbox - rect = r.rect(x, y - 7, textbox.width + 5, textbox.height + 5, 4).attr( - fill: "#000" - "fill-opacity": .5 - stroke: "none" - ) - triangle = r.path(["M", x - 5, y, "L", x - 15, y - 4, "L", x - 15, y + 4, "Z"]).attr( - fill: "#000" - "fill-opacity": .5 - stroke: "none" - ) - - label = r.set(rect, text) - label.transform(["t", -rect.getBBox().width - 15, 0]) - - # Set text to front - text.toFront() - - appendAnchor: (x, y, commit) -> - r = @r - top = @top - options = @options - anchor = r.circle(x, y, 10).attr( - fill: "#000" - opacity: 0 - cursor: "pointer" - ).click(-> - window.open options.commit_url.replace("%s", commit.id), "_blank" - ).hover(-> - @tooltip = r.commitTooltip(x + 5, y, commit) - top.push @tooltip.insertBefore(this) - , -> - @tooltip and @tooltip.remove() and delete @tooltip - ) - top.push anchor - - drawDot: (x, y, commit) -> - r = @r - r.circle(x, y, 3).attr( - fill: @colors[commit.space] - stroke: "none" - ) - - avatar_box_x = @offsetX + @unitSpace * @mspace + 10 - avatar_box_y = y - 10 - r.rect(avatar_box_x, avatar_box_y, 20, 20).attr( - stroke: @colors[commit.space] - "stroke-width": 2 - ) - r.image(gon.relative_url_root + commit.author.icon, avatar_box_x, avatar_box_y, 20, 20) - r.text(@offsetX + @unitSpace * @mspace + 35, y, commit.message.split("\n")[0]).attr( - "text-anchor": "start" - font: "14px Monaco, monospace" - ) - - drawLines: (x, y, commit) -> - r = @r - for parent, i in commit.parents - parentCommit = @preparedCommits[parent[0]] - parentY = @offsetY + @unitTime * parentCommit.time - parentX1 = @offsetX + @unitSpace * (@mspace - parentCommit.space) - parentX2 = @offsetX + @unitSpace * (@mspace - parent[1]) - - # Set line color - if parentCommit.space <= commit.space - color = @colors[commit.space] - - else - color = @colors[parentCommit.space] - - # Build line shape - if parent[1] is commit.space - offset = [0, 5] - arrow = "l-2,5,4,0,-2,-5,0,5" - - else if parent[1] < commit.space - offset = [3, 3] - arrow = "l5,0,-2,4,-3,-4,4,2" - - else - offset = [-3, 3] - arrow = "l-5,0,2,4,3,-4,-4,2" - - # Start point - route = ["M", x + offset[0], y + offset[1]] - - # Add arrow if not first parent - if i > 0 - route.push(arrow) - - # Circumvent if overlap - if commit.space isnt parentCommit.space or commit.space isnt parent[1] - route.push( - "L", parentX2, y + 10, - "L", parentX2, parentY - 5, - ) - - # End point - route.push("L", parentX1, parentY) - - r - .path(route) - .attr( - stroke: color - "stroke-width": 2) - - markCommit: (commit) -> - if commit.id is @options.commit_id - r = @r - x = @offsetX + @unitSpace * (@mspace - commit.space) - y = @offsetY + @unitTime * commit.time - r.path(["M", x + 5, y, "L", x + 15, y + 4, "L", x + 15, y - 4, "Z"]).attr( - fill: "#000" - "fill-opacity": .5 - stroke: "none" - ) - # Displayed in the center - @element.scrollTop(y - @graphHeight / 2) - -Raphael::commitTooltip = (x, y, commit) -> - boxWidth = 300 - boxHeight = 200 - icon = @image(gon.relative_url_root + commit.author.icon, x, y, 20, 20) - nameText = @text(x + 25, y + 10, commit.author.name) - idText = @text(x, y + 35, commit.id) - messageText = @text(x, y + 50, commit.message) - textSet = @set(icon, nameText, idText, messageText).attr( - "text-anchor": "start" - font: "12px Monaco, monospace" - ) - nameText.attr( - font: "14px Arial" - "font-weight": "bold" - ) - - idText.attr fill: "#AAA" - @textWrap messageText, boxWidth - 50 - rect = @rect(x - 10, y - 10, boxWidth, 100, 4).attr( - fill: "#FFF" - stroke: "#000" - "stroke-linecap": "round" - "stroke-width": 2 - ) - tooltip = @set(rect, textSet) - rect.attr( - height: tooltip.getBBox().height + 10 - width: tooltip.getBBox().width + 10 - ) - - tooltip.transform ["t", 20, 20] - tooltip - -Raphael::textWrap = (t, width) -> - content = t.attr("text") - abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" - t.attr text: abc - letterWidth = t.getBBox().width / abc.length - t.attr text: content - words = content.split(" ") - x = 0 - s = [] - - for word in words - if x + (word.length * letterWidth) > width - s.push "\n" - x = 0 - x += word.length * letterWidth - s.push word + " " - - t.attr text: s.join("") - b = t.getBBox() - h = Math.abs(b.y2) - Math.abs(b.y) + 1 - t.attr y: b.y + h diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee deleted file mode 100644 index 44d75bd694f..00000000000 --- a/app/assets/javascripts/calendar.js.coffee +++ /dev/null @@ -1,38 +0,0 @@ -class @Calendar - options = - month: "short" - day: "numeric" - year: "numeric" - - constructor: (timestamps, starting_year, starting_month, calendar_activities_path) -> - cal = new CalHeatMap() - cal.init - itemName: ["contribution"] - data: timestamps - start: new Date(starting_year, starting_month) - domainLabelFormat: "%b" - id: "cal-heatmap" - domain: "month" - subDomain: "day" - range: 12 - tooltip: true - label: - position: "top" - legend: [ - 0 - 10 - 20 - 30 - ] - legendCellPadding: 3 - onClick: (date, count) -> - formated_date = date.getFullYear() + "-" + (date.getMonth()+1) + "-" + date.getDate() - $.ajax - url: calendar_activities_path - data: - date: formated_date - cache: false - dataType: "html" - success: (data) -> - $(".user-calendar-activities").html data - diff --git a/app/assets/javascripts/commit.js.coffee b/app/assets/javascripts/commit.js.coffee deleted file mode 100644 index 0566e239191..00000000000 --- a/app/assets/javascripts/commit.js.coffee +++ /dev/null @@ -1,4 +0,0 @@ -class @Commit - constructor: -> - $('.files .diff-file').each -> - new CommitFile(this) diff --git a/app/assets/javascripts/commit/file.js.coffee b/app/assets/javascripts/commit/file.js.coffee deleted file mode 100644 index 83e793863b6..00000000000 --- a/app/assets/javascripts/commit/file.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -class @CommitFile - - constructor: (file) -> - if $('.image', file).length - new ImageFile(file) diff --git a/app/assets/javascripts/commit/image-file.js.coffee b/app/assets/javascripts/commit/image-file.js.coffee deleted file mode 100644 index 9e5f49b1f69..00000000000 --- a/app/assets/javascripts/commit/image-file.js.coffee +++ /dev/null @@ -1,126 +0,0 @@ -class @ImageFile - - # Width where images must fits in, for 2-up this gets divided by 2 - @availWidth = 900 - @viewModes = ['two-up', 'swipe'] - - constructor: (@file) -> - # Determine if old and new file has same dimensions, if not show 'two-up' view - this.requestImageInfo $('.two-up.view .frame.deleted img', @file), (deletedWidth, deletedHeight) => - this.requestImageInfo $('.two-up.view .frame.added img', @file), (width, height) => - if width == deletedWidth && height == deletedHeight - this.initViewModes() - else - this.initView('two-up') - - initViewModes: -> - viewMode = ImageFile.viewModes[0] - - $('.view-modes', @file).removeClass 'hide' - $('.view-modes-menu', @file).on 'click', 'li', (event) => - unless $(event.currentTarget).hasClass('active') - this.activateViewMode(event.currentTarget.className) - - this.activateViewMode(viewMode) - - activateViewMode: (viewMode) -> - $('.view-modes-menu li', @file) - .removeClass('active') - .filter(".#{viewMode}").addClass 'active' - $(".view:visible:not(.#{viewMode})", @file).fadeOut 200, => - $(".view.#{viewMode}", @file).fadeIn(200) - this.initView viewMode - - initView: (viewMode) -> - this.views[viewMode].call(this) - - prepareFrames = (view) -> - maxWidth = 0 - maxHeight = 0 - $('.frame', view).each (index, frame) => - width = $(frame).width() - height = $(frame).height() - maxWidth = if width > maxWidth then width else maxWidth - maxHeight = if height > maxHeight then height else maxHeight - .css - width: maxWidth - height: maxHeight - - [maxWidth, maxHeight] - - views: - 'two-up': -> - $('.two-up.view .wrap', @file).each (index, wrap) => - $('img', wrap).each -> - currentWidth = $(this).width() - if currentWidth > ImageFile.availWidth / 2 - $(this).width ImageFile.availWidth / 2 - - this.requestImageInfo $('img', wrap), (width, height) -> - $('.image-info .meta-width', wrap).text "#{width}px" - $('.image-info .meta-height', wrap).text "#{height}px" - $('.image-info', wrap).removeClass('hide') - - 'swipe': -> - maxWidth = 0 - maxHeight = 0 - - $('.swipe.view', @file).each (index, view) => - - [maxWidth, maxHeight] = prepareFrames(view) - - $('.swipe-frame', view).css - width: maxWidth + 16 - height: maxHeight + 28 - - $('.swipe-wrap', view).css - width: maxWidth + 1 - height: maxHeight + 2 - - $('.swipe-bar', view).css - left: 0 - .draggable - axis: 'x' - containment: 'parent' - drag: (event) -> - $('.swipe-wrap', view).width (maxWidth + 1) - $(this).position().left - stop: (event) -> - $('.swipe-wrap', view).width (maxWidth + 1) - $(this).position().left - - 'onion-skin': -> - maxWidth = 0 - maxHeight = 0 - - dragTrackWidth = $('.drag-track', @file).width() - $('.dragger', @file).width() - - $('.onion-skin.view', @file).each (index, view) => - - [maxWidth, maxHeight] = prepareFrames(view) - - $('.onion-skin-frame', view).css - width: maxWidth + 16 - height: maxHeight + 28 - - $('.swipe-wrap', view).css - width: maxWidth + 1 - height: maxHeight + 2 - - $('.dragger', view).css - left: dragTrackWidth - .draggable - axis: 'x' - containment: 'parent' - drag: (event) -> - $('.frame.added', view).css('opacity', $(this).position().left / dragTrackWidth) - stop: (event) -> - $('.frame.added', view).css('opacity', $(this).position().left / dragTrackWidth) - - - - requestImageInfo: (img, callback) -> - domImg = img.get(0) - 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/commits.js.coffee b/app/assets/javascripts/commits.js.coffee deleted file mode 100644 index c183e78e513..00000000000 --- a/app/assets/javascripts/commits.js.coffee +++ /dev/null @@ -1,55 +0,0 @@ -class @CommitsList - @data = - ref: null - limit: 0 - offset: 0 - @disable = false - - @showProgress: -> - $('.loading').show() - - @hideProgress: -> - $('.loading').hide() - - @init: (ref, limit) -> - $("body").on "click", ".day-commits-table li.commit", (event) -> - if event.target.nodeName != "A" - location.href = $(this).attr("url") - e.stopPropagation() - return false - - @data.ref = ref - @data.limit = limit - @data.offset = limit - - this.initLoadMore() - this.showProgress() - - @getOld: -> - this.showProgress() - $.ajax - type: "GET" - url: location.href - data: @data - complete: this.hideProgress - success: (data) -> - CommitsList.append(data.count, data.html) - dataType: "json" - - @append: (count, html) -> - $("#commits-list").append(html) - if count > 0 - @data.offset += count - else - @disable = true - - @initLoadMore: -> - $(document).unbind('scroll') - $(document).endlessScroll - bottomPixels: 400 - fireDelay: 1000 - fireOnce: true - ceaseFire: => - @disable - callback: => - this.getOld() diff --git a/app/assets/javascripts/confirm_danger_modal.js.coffee b/app/assets/javascripts/confirm_danger_modal.js.coffee deleted file mode 100644 index bb99edbd09e..00000000000 --- a/app/assets/javascripts/confirm_danger_modal.js.coffee +++ /dev/null @@ -1,18 +0,0 @@ -class @ConfirmDangerModal - constructor: (form, text) -> - @form = form - $('.js-confirm-text').text(text || '') - $('.js-confirm-danger-input').val('') - $('#modal-confirm-danger').modal('show') - project_path = $('.js-confirm-danger-match').text() - submit = $('.js-confirm-danger-submit') - submit.disable() - - $('.js-confirm-danger-input').on 'input', -> - if rstrip($(@).val()) is project_path - submit.enable() - else - submit.disable() - - $('.js-confirm-danger-submit').on 'click', => - @form.submit() diff --git a/app/assets/javascripts/dashboard.js.coffee b/app/assets/javascripts/dashboard.js.coffee deleted file mode 100644 index 00ee503ff16..00000000000 --- a/app/assets/javascripts/dashboard.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -class @Dashboard - constructor: -> - new ProjectsList() diff --git a/app/assets/javascripts/diff.js.coffee b/app/assets/javascripts/diff.js.coffee deleted file mode 100644 index 069f91c30e1..00000000000 --- a/app/assets/javascripts/diff.js.coffee +++ /dev/null @@ -1,44 +0,0 @@ -class @Diff - UNFOLD_COUNT = 20 - constructor: -> - $(document).off('click', '.js-unfold') - $(document).on('click', '.js-unfold', (event) => - target = $(event.target) - unfoldBottom = target.hasClass('js-unfold-bottom') - unfold = true - - [old_line, line_number] = @lineNumbers(target.parent()) - offset = line_number - old_line - - if unfoldBottom - line_number += 1 - since = line_number - to = line_number + UNFOLD_COUNT - else - [prev_old_line, prev_new_line] = @lineNumbers(target.parent().prev()) - line_number -= 1 - to = line_number - if line_number - UNFOLD_COUNT > prev_new_line + 1 - since = line_number - UNFOLD_COUNT - else - since = prev_new_line + 1 - unfold = false - - link = target.parents('.diff-file').attr('data-blob-diff-path') - params = - since: since - to: to - bottom: unfoldBottom - offset: offset - unfold: unfold - - $.get(link, params, (response) => - target.parent().replaceWith(response) - ) - ) - - lineNumbers: (line) -> - return ([0, 0]) unless line.children().length - lines = line.children().slice(0, 2) - line_numbers = ($(l).attr('data-linenumber') for l in lines) - (parseInt(line_number) for line_number in line_numbers) diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee deleted file mode 100644 index 330ebac6f75..00000000000 --- a/app/assets/javascripts/dispatcher.js.coffee +++ /dev/null @@ -1,154 +0,0 @@ -$ -> - new Dispatcher() - -class Dispatcher - constructor: () -> - @initSearch() - @initPageScripts() - - initPageScripts: -> - page = $('body').attr('data-page') - project_id = $('body').attr('data-project-id') - - unless page - return false - - path = page.split(':') - shortcut_handler = null - - switch page - when 'projects:issues:index' - Issues.init() - shortcut_handler = new ShortcutsNavigation() - when 'projects:issues:show' - new Issue() - shortcut_handler = new ShortcutsIssueable() - new ZenMode() - when 'projects:milestones:show' - new Milestone() - when 'projects:milestones:new', 'projects:milestones:edit' - new ZenMode() - when 'projects:compare:show' - new Diff() - when 'projects:issues:new','projects:issues:edit' - GitLab.GfmAutoComplete.setup() - shortcut_handler = new ShortcutsNavigation() - new ZenMode() - new DropzoneInput($('.issue-form')) - if page == 'projects:issues:new' - new IssuableForm($('.issue-form')) - when 'projects:merge_requests:new', 'projects:merge_requests:edit' - GitLab.GfmAutoComplete.setup() - new Diff() - shortcut_handler = new ShortcutsNavigation() - new ZenMode() - new DropzoneInput($('.merge-request-form')) - if page == 'projects:merge_requests:new' - new IssuableForm($('.merge-request-form')) - when 'projects:merge_requests:show' - new Diff() - shortcut_handler = new ShortcutsIssueable() - new ZenMode() - when "projects:merge_requests:diffs" - new Diff() - new ZenMode() - when 'projects:merge_requests:index' - shortcut_handler = new ShortcutsNavigation() - MergeRequests.init() - when 'dashboard:show' - new Dashboard() - new Activities() - when 'dashboard:projects:starred' - new Activities() - new ProjectsList() - when 'projects:commit:show' - new Commit() - new Diff() - new ZenMode() - shortcut_handler = new ShortcutsNavigation() - when 'projects:commits:show' - shortcut_handler = new ShortcutsNavigation() - when 'projects:show' - new Activities() - shortcut_handler = new ShortcutsNavigation() - when 'groups:show' - new Activities() - shortcut_handler = new ShortcutsNavigation() - new ProjectsList() - when 'groups:group_members:index' - new GroupMembers() - new UsersSelect() - when 'projects:project_members:index' - new ProjectMembers() - new UsersSelect() - when 'groups:new', 'groups:edit', 'admin:groups:edit' - new GroupAvatar() - when 'projects:tree:show' - new TreeView() - shortcut_handler = new ShortcutsNavigation() - when 'projects:blob:show' - new BlobView() - shortcut_handler = new ShortcutsNavigation() - when 'projects:labels:new', 'projects:labels:edit' - new Labels() - when 'projects:network:show' - # Ensure we don't create a particular shortcut handler here. This is - # already created, where the network graph is created. - shortcut_handler = true - when 'projects:forks:new' - new ProjectFork() - when 'users:show' - new User() - new Activities() - when 'admin:users:show' - new ProjectsList() - - switch path.first() - when 'admin' - new Admin() - switch path[1] - when 'groups' - new UsersSelect() - when 'projects' - new NamespaceSelect() - when 'dashboard' - shortcut_handler = new ShortcutsDashboardNavigation() - when 'profiles' - new Profile() - when 'projects' - new Project() - new ProjectAvatar() - switch path[1] - when 'compare' - shortcut_handler = new ShortcutsNavigation() - when 'edit' - shortcut_handler = new ShortcutsNavigation() - new ProjectNew() - when 'new' - new ProjectNew() - when 'show' - new ProjectShow() - when 'issues', 'merge_requests' - new UsersSelect() - when 'wikis' - new Wikis() - shortcut_handler = new ShortcutsNavigation() - new ZenMode() - new DropzoneInput($('.wiki-form')) - when 'snippets', 'labels', 'graphs' - shortcut_handler = new ShortcutsNavigation() - when 'project_members', 'deploy_keys', 'hooks', 'services', 'protected_branches' - shortcut_handler = new ShortcutsNavigation() - - - # If we haven't installed a custom shortcut handler, install the default one - if not shortcut_handler - new Shortcuts() - - initSearch: -> - opts = $('.search-autocomplete-opts') - path = opts.data('autocomplete-path') - project_id = opts.data('autocomplete-project-id') - project_ref = opts.data('autocomplete-project-ref') - - new SearchAutocomplete(path, project_id, project_ref) diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee deleted file mode 100644 index fca2a290e2d..00000000000 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ /dev/null @@ -1,243 +0,0 @@ -class @DropzoneInput - constructor: (form) -> - Dropzone.autoDiscover = false - alertClass = "alert alert-danger alert-dismissable div-dropzone-alert" - alertAttr = "class=\"close\" data-dismiss=\"alert\"" + "aria-hidden=\"true\"" - divHover = "
" - divSpinner = "
" - divAlert = "
" - iconPaperclip = "" - iconSpinner = "" - btnAlert = "" - project_uploads_path = window.project_uploads_path or null - max_file_size = gon.max_file_size or 10 - - form_textarea = $(form).find("textarea.markdown-area") - form_textarea.wrap "
" - form_textarea.bind 'paste', (event) => - handlePaste(event) - - form_dropzone = $(form).find('.div-dropzone') - form_dropzone.parent().addClass "div-dropzone-wrapper" - form_dropzone.append divHover - $(".div-dropzone-hover").append iconPaperclip - form_dropzone.append divSpinner - $(".div-dropzone-spinner").append iconSpinner - $(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - - # Preview button - $(document).off "click", ".js-md-preview-button" - $(document).on "click", ".js-md-preview-button", (e) -> - ### - Shows the Markdown preview. - - Lets the server render GFM into Html and displays it. - ### - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-md-write-button").parent().removeClass "active" - form.find(".js-md-preview-button").parent().addClass "active" - - # toggle content - form.find(".md-write-holder").hide() - form.find(".md-preview-holder").show() - - preview = form.find(".js-md-preview") - mdText = form.find(".markdown-area").val() - if mdText.trim().length is 0 - preview.text "Nothing to preview." - else - preview.text "Loading..." - $.post($(this).data("url"), - md_text: mdText - ).success (previewData) -> - preview.html previewData - - # Write button - $(document).off "click", ".js-md-write-button" - $(document).on "click", ".js-md-write-button", (e) -> - ### - Shows the Markdown textarea. - ### - e.preventDefault() - form = $(this).closest("form") - # toggle tabs - form.find(".js-md-write-button").parent().addClass "active" - form.find(".js-md-preview-button").parent().removeClass "active" - - # toggle content - form.find(".md-write-holder").show() - form.find(".md-preview-holder").hide() - - dropzone = form_dropzone.dropzone( - url: project_uploads_path - dictDefaultMessage: "" - clickable: true - paramName: "file" - maxFilesize: max_file_size - uploadMultiple: false - headers: - "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") - - previewContainer: false - - processing: -> - $(".div-dropzone-alert").alert "close" - - dragover: -> - form_textarea.addClass "div-dropzone-focus" - form.find(".div-dropzone-hover").css "opacity", 0.7 - return - - dragleave: -> - form_textarea.removeClass "div-dropzone-focus" - form.find(".div-dropzone-hover").css "opacity", 0 - return - - drop: -> - form_textarea.removeClass "div-dropzone-focus" - form.find(".div-dropzone-hover").css "opacity", 0 - form_textarea.focus() - return - - success: (header, response) -> - child = $(dropzone[0]).children("textarea") - $(child).val $(child).val() + formatLink(response.link) + "\n" - return - - error: (temp, errorMessage) -> - errorAlert = $(form).find('.error-alert') - checkIfMsgExists = errorAlert.children().length - if checkIfMsgExists is 0 - errorAlert.append divAlert - $(".div-dropzone-alert").append btnAlert + errorMessage - return - - sending: -> - form_dropzone.find(".div-dropzone-spinner").css - "opacity": 0.7 - "display": "inherit" - return - - complete: -> - $(".dz-preview").remove() - $(".markdown-area").trigger "input" - $(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - return - ) - - child = $(dropzone[0]).children("textarea") - - formatLink = (link) -> - text = "[#{link.alt}](#{link.url})" - text = "!#{text}" if link.is_image - text - - handlePaste = (event) -> - pasteEvent = event.originalEvent - if pasteEvent.clipboardData and pasteEvent.clipboardData.items - image = isImage(pasteEvent) - if image - event.preventDefault() - - filename = getFilename(pasteEvent) or "image.png" - text = "{{" + filename + "}}" - pasteText(text) - uploadFile image.getAsFile(), filename - - isImage = (data) -> - i = 0 - while i < data.clipboardData.items.length - item = data.clipboardData.items[i] - if item.type.indexOf("image") isnt -1 - return item - i++ - return false - - pasteText = (text) -> - caretStart = $(child)[0].selectionStart - caretEnd = $(child)[0].selectionEnd - textEnd = $(child).val().length - - beforeSelection = $(child).val().substring 0, caretStart - afterSelection = $(child).val().substring caretEnd, textEnd - $(child).val beforeSelection + text + afterSelection - form_textarea.trigger "input" - - getFilename = (e) -> - if window.clipboardData and window.clipboardData.getData - value = window.clipboardData.getData("Text") - else if e.clipboardData and e.clipboardData.getData - value = e.clipboardData.getData("text/plain") - - value = value.split("\r") - value.first() - - uploadFile = (item, filename) -> - formData = new FormData() - formData.append "file", item, filename - $.ajax - url: project_uploads_path - type: "POST" - data: formData - dataType: "json" - processData: false - contentType: false - headers: - "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") - - beforeSend: -> - showSpinner() - closeAlertMessage() - - success: (e, textStatus, response) -> - insertToTextArea(filename, formatLink(response.responseJSON.link)) - - error: (response) -> - showError(response.responseJSON.message) - - complete: -> - closeSpinner() - - insertToTextArea = (filename, url) -> - $(child).val (index, val) -> - val.replace("{{" + filename + "}}", url + "\n") - - appendToTextArea = (url) -> - $(child).val (index, val) -> - val + url + "\n" - - showSpinner = (e) -> - form.find(".div-dropzone-spinner").css - "opacity": 0.7 - "display": "inherit" - - closeSpinner = -> - form.find(".div-dropzone-spinner").css - "opacity": 0 - "display": "none" - - showError = (message) -> - errorAlert = $(form).find('.error-alert') - checkIfMsgExists = errorAlert.children().length - if checkIfMsgExists is 0 - errorAlert.append divAlert - $(".div-dropzone-alert").append btnAlert + message - - closeAlertMessage = -> - form.find(".div-dropzone-alert").alert "close" - - form.find(".markdown-selector").click (e) -> - e.preventDefault() - $(@).closest('.gfm-form').find('.div-dropzone').click() - return - - formatLink: (link) -> - text = "[#{link.alt}](#{link.url})" - text = "!#{text}" if link.is_image - text diff --git a/app/assets/javascripts/extensions/array.js b/app/assets/javascripts/extensions/array.js deleted file mode 100644 index 24f9e00097c..00000000000 --- a/app/assets/javascripts/extensions/array.js +++ /dev/null @@ -1,7 +0,0 @@ -Array.prototype.first = function() { - return this[0]; -} - -Array.prototype.last = function() { - return this[this.length-1]; -} diff --git a/app/assets/javascripts/extensions/jquery.js.coffee b/app/assets/javascripts/extensions/jquery.js.coffee deleted file mode 100644 index 40fb6cb9fc3..00000000000 --- a/app/assets/javascripts/extensions/jquery.js.coffee +++ /dev/null @@ -1,13 +0,0 @@ -$.fn.showAndHide = -> - $(@).show(). - delay(3000). - fadeOut() - -$.fn.enableButton = -> - $(@).removeAttr('disabled'). - removeClass('disabled') - -$.fn.disableButton = -> - $(@).attr('disabled', 'disabled'). - addClass('disabled') - diff --git a/app/assets/javascripts/flash.js.coffee b/app/assets/javascripts/flash.js.coffee deleted file mode 100644 index b39ab0c4475..00000000000 --- a/app/assets/javascripts/flash.js.coffee +++ /dev/null @@ -1,12 +0,0 @@ -class @Flash - constructor: (message, type)-> - flash = $(".flash-container") - flash.html("") - - $('
', - class: "flash-#{type}", - text: message - ).appendTo(".flash-container") - - flash.click -> $(@).fadeOut() - flash.show() diff --git a/app/assets/javascripts/gfm_auto_complete.js.coffee b/app/assets/javascripts/gfm_auto_complete.js.coffee deleted file mode 100644 index 00d56ae5b4b..00000000000 --- a/app/assets/javascripts/gfm_auto_complete.js.coffee +++ /dev/null @@ -1,67 +0,0 @@ -# Creates the variables for setting up GFM auto-completion - -window.GitLab ?= {} -GitLab.GfmAutoComplete = - # private_token: '' - dataSource: '' - # Emoji - Emoji: - template: '
  • ${name} ${name}
  • ' - - # Team Members - Members: - template: '
  • ${username} ${name}
  • ' - - # Issues and MergeRequests - Issues: - template: '
  • ${id} ${title}
  • ' - - # Add GFM auto-completion to all input fields, that accept GFM input. - setup: -> - input = $('.js-gfm-input') - - # Emoji - input.atwho - at: ':' - tpl: @Emoji.template - callbacks: - before_save: (emojis) => - $.map emojis, (em) => name: em.name, insert: em.name+ ':', image: em.path - - # Team Members - input.atwho - at: '@' - tpl: @Members.template - search_key: 'search' - callbacks: - before_save: (members) => - $.map members, (m) => name: m.name, username: m.username, search: "#{m.username} #{m.name}" - - input.atwho - at: '#' - alias: 'issues' - search_key: 'search' - tpl: @Issues.template - callbacks: - before_save: (issues) -> - $.map issues, (i) -> id: i.iid, title: sanitize(i.title), search: "#{i.iid} #{i.title}" - - input.atwho - at: '!' - alias: 'mergerequests' - search_key: 'search' - tpl: @Issues.template - callbacks: - before_save: (merges) -> - $.map merges, (m) -> id: m.iid, title: sanitize(m.title), search: "#{m.iid} #{m.title}" - - input.one "focus", => - $.getJSON(@dataSource).done (data) -> - # load members - input.atwho 'load', "@", data.members - # load issues - input.atwho 'load', "issues", data.issues - # load merge requests - input.atwho 'load', "mergerequests", data.mergerequests - # load emojis - input.atwho 'load', ":", data.emojis diff --git a/app/assets/javascripts/group_avatar.js.coffee b/app/assets/javascripts/group_avatar.js.coffee deleted file mode 100644 index 0825fd3ce52..00000000000 --- a/app/assets/javascripts/group_avatar.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class @GroupAvatar - constructor: -> - $('.js-choose-group-avatar-button').bind "click", -> - form = $(this).closest("form") - form.find(".js-group-avatar-input").click() - $('.js-group-avatar-input').bind "change", -> - form = $(this).closest("form") - filename = $(this).val().replace(/^.*[\\\/]/, '') - form.find(".js-avatar-filename").text(filename) diff --git a/app/assets/javascripts/groups.js.coffee b/app/assets/javascripts/groups.js.coffee deleted file mode 100644 index cc905e91ea2..00000000000 --- a/app/assets/javascripts/groups.js.coffee +++ /dev/null @@ -1,4 +0,0 @@ -class @GroupMembers - constructor: -> - $('li.group_member').bind 'ajax:success', -> - $(this).fadeOut() diff --git a/app/assets/javascripts/groups_select.js.coffee b/app/assets/javascripts/groups_select.js.coffee deleted file mode 100644 index 1084e2a17d1..00000000000 --- a/app/assets/javascripts/groups_select.js.coffee +++ /dev/null @@ -1,41 +0,0 @@ -class @GroupsSelect - constructor: -> - $('.ajax-groups-select').each (i, select) => - skip_ldap = $(select).hasClass('skip_ldap') - - $(select).select2 - placeholder: "Search for a group" - multiple: $(select).hasClass('multiselect') - minimumInputLength: 0 - query: (query) -> - Api.groups query.term, skip_ldap, (groups) -> - data = { results: groups } - query.callback(data) - - initSelection: (element, callback) -> - id = $(element).val() - if id isnt "" - Api.group(id, callback) - - - formatResult: (args...) => - @formatResult(args...) - formatSelection: (args...) => - @formatSelection(args...) - dropdownCssClass: "ajax-groups-dropdown" - escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results - m - - formatResult: (group) -> - if group.avatar_url - avatar = group.avatar_url - else - avatar = gon.default_avatar_url - - "
    -
    #{group.name}
    -
    #{group.path}
    -
    " - - formatSelection: (group) -> - group.name diff --git a/app/assets/javascripts/importer_status.js.coffee b/app/assets/javascripts/importer_status.js.coffee deleted file mode 100644 index be8d225e73b..00000000000 --- a/app/assets/javascripts/importer_status.js.coffee +++ /dev/null @@ -1,35 +0,0 @@ -class @ImporterStatus - constructor: (@jobs_url, @import_url) -> - this.initStatusPage() - this.setAutoUpdate() - - initStatusPage: -> - $(".js-add-to-import").click (event) => - new_namespace = null - tr = $(event.currentTarget).closest("tr") - id = tr.attr("id").replace("repo_", "") - if tr.find(".import-target input").length > 0 - new_namespace = tr.find(".import-target input").prop("value") - tr.find(".import-target").empty().append(new_namespace + "/" + tr.find(".import-target").data("project_name")) - $.post @import_url, {repo_id: id, new_namespace: new_namespace}, dataType: 'script' - - $(".js-import-all").click (event) => - $(".js-add-to-import").each -> - $(this).click() - - setAutoUpdate: -> - setInterval (=> - $.get @jobs_url, (data) => - $.each data, (i, job) => - job_item = $("#project_" + job.id) - status_field = job_item.find(".job-status") - - if job.import_status == 'finished' - job_item.removeClass("active").addClass("success") - status_field.html(' done') - else if job.import_status == 'started' - status_field.html(" started") - else - status_field.html(job.import_status) - - ), 4000 diff --git a/app/assets/javascripts/issuable_form.js.coffee b/app/assets/javascripts/issuable_form.js.coffee deleted file mode 100644 index abd58bcf978..00000000000 --- a/app/assets/javascripts/issuable_form.js.coffee +++ /dev/null @@ -1,28 +0,0 @@ -class @IssuableForm - constructor: (@form) -> - @titleField = @form.find("input[name*='[title]']") - @descriptionField = @form.find("textarea[name*='[description]']") - - return unless @titleField.length && @descriptionField.length - - @initAutosave() - - @form.on "submit", @resetAutosave - @form.on "click", ".btn-cancel", @resetAutosave - - initAutosave: -> - new Autosave @titleField, [ - document.location.pathname, - document.location.search, - "title" - ] - - new Autosave @descriptionField, [ - document.location.pathname, - document.location.search, - "description" - ] - - resetAutosave: => - @titleField.data("autosave").reset() - @descriptionField.data("autosave").reset() diff --git a/app/assets/javascripts/issue.js.coffee b/app/assets/javascripts/issue.js.coffee deleted file mode 100644 index 4e2e6550eb2..00000000000 --- a/app/assets/javascripts/issue.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -class @Issue - constructor: -> - $('.edit-issue.inline-update input[type="submit"]').hide() - $(".context .inline-update").on "change", "select", -> - $(this).submit() - $(".context .inline-update").on "change", "#issue_assignee_id", -> - $(this).submit() - - if $("a.btn-close").length - $("li.task-list-item input:checkbox").prop("disabled", false) - - $('.task-list-item input:checkbox').off('change') - $('.task-list-item input:checkbox').change('issue', updateTaskState) - - $('.issue-details').waitForImages -> - $('.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/issues.js.coffee b/app/assets/javascripts/issues.js.coffee deleted file mode 100644 index 40bb9e9cb0c..00000000000 --- a/app/assets/javascripts/issues.js.coffee +++ /dev/null @@ -1,85 +0,0 @@ -@Issues = - init: -> - Issues.initSearch() - Issues.initSelects() - Issues.initChecks() - - $("body").on "ajax:success", ".close_issue, .reopen_issue", -> - t = $(this) - totalIssues = undefined - reopen = t.hasClass("reopen_issue") - $(".issue_counter").each -> - issue = $(this) - totalIssues = parseInt($(this).html(), 10) - if reopen and issue.closest(".main_menu").length - $(this).html totalIssues + 1 - else - $(this).html totalIssues - 1 - $("body").on "click", ".issues-other-filters .dropdown-menu a", -> - $('.issues-list').block( - message: null, - overlayCSS: - backgroundColor: '#DDD' - opacity: .4 - ) - - reload: -> - Issues.initSelects() - Issues.initChecks() - $('#filter_issue_search').val($('#issue_search').val()) - - initSelects: -> - $("select#update_status").select2(width: 'resolve', dropdownAutoWidth: true) - $("select#update_assignee_id").select2(width: 'resolve', dropdownAutoWidth: true) - $("select#update_milestone_id").select2(width: 'resolve', dropdownAutoWidth: true) - $("select#label_name").select2(width: 'resolve', dropdownAutoWidth: true) - $("#milestone_id, #assignee_id, #label_name").on "change", -> - $(this).closest("form").submit() - - initChecks: -> - $(".check_all_issues").click -> - $(".selected_issue").prop("checked", @checked) - Issues.checkChanged() - - $(".selected_issue").bind "change", Issues.checkChanged - - # Make sure we trigger ajax request only after user stop typing - initSearch: -> - @timer = null - $("#issue_search").keyup -> - clearTimeout(@timer) - @timer = setTimeout(Issues.filterResults, 500) - - filterResults: => - form = $("#issue_search_form") - search = $("#issue_search").val() - $('.issues-holder').css("opacity", '0.5') - issues_url = form.attr('action') + '? '+ form.serialize() - - $.ajax - type: "GET" - url: form.attr('action') - data: form.serialize() - complete: -> - $('.issues-holder').css("opacity", '1.0') - success: (data) -> - $('.issues-holder').html(data.html) - # Change url so if user reload a page - search results are saved - History.replaceState {page: issues_url}, document.title, issues_url - Issues.reload() - dataType: "json" - - checkChanged: -> - checked_issues = $(".selected_issue:checked") - if checked_issues.length > 0 - ids = [] - $.each checked_issues, (index, value) -> - ids.push $(value).attr("data-id") - - $("#update_issues_ids").val ids - $(".issues-other-filters").hide() - $(".issues_bulk_update").show() - else - $("#update_issues_ids").val [] - $(".issues_bulk_update").hide() - $(".issues-other-filters").show() diff --git a/app/assets/javascripts/labels.js.coffee b/app/assets/javascripts/labels.js.coffee deleted file mode 100644 index 1bc8840f9ac..00000000000 --- a/app/assets/javascripts/labels.js.coffee +++ /dev/null @@ -1,33 +0,0 @@ -class @Labels - constructor: -> - form = $('.label-form') - @setupLabelForm(form) - @cleanBinding() - @addBinding() - @updateColorPreview() - - addBinding: -> - $(document).on 'click', '.suggest-colors a', @setSuggestedColor - $(document).on 'input', 'input#label_color', @updateColorPreview - - cleanBinding: -> - $(document).off 'click', '.suggest-colors a' - $(document).off 'input', 'input#label_color' - - # Initializes the form to disable the save button if no color or title is entered - setupLabelForm: (form) -> - disableButtonIfAnyEmptyField form, '.form-control', form.find('.js-save-button') - - # Updates the the preview color with the hex-color input - updateColorPreview: => - previewColor = $('input#label_color').val() - $('div.label-color-preview').css('background-color', previewColor) - - # Updates the preview color with a click on a suggested color - setSuggestedColor: (e) => - color = $(e.currentTarget).data('color') - $('input#label_color').val(color) - @updateColorPreview() - # Notify the form, that color has changed - $('.label-form').trigger('keyup') - e.preventDefault() diff --git a/app/assets/javascripts/lib/jquery.timeago.js b/app/assets/javascripts/lib/jquery.timeago.js deleted file mode 100644 index cc17aa7d3d1..00000000000 --- a/app/assets/javascripts/lib/jquery.timeago.js +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Timeago is a jQuery plugin that makes it easy to support automatically - * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago"). - * - * @name timeago - * @version 1.1.0 - * @requires jQuery v1.2.3+ - * @author Ryan McGeary - * @license MIT License - http://www.opensource.org/licenses/mit-license.php - * - * For usage and examples, visit: - * http://timeago.yarp.com/ - * - * Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org) - */ - -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - $.timeago = function(timestamp) { - if (timestamp instanceof Date) { - return inWords(timestamp); - } else if (typeof timestamp === "string") { - return inWords($.timeago.parse(timestamp)); - } else if (typeof timestamp === "number") { - return inWords(new Date(timestamp)); - } else { - return inWords($.timeago.datetime(timestamp)); - } - }; - var $t = $.timeago; - - $.extend($.timeago, { - settings: { - refreshMillis: 60000, - allowFuture: false, - strings: { - prefixAgo: null, - prefixFromNow: null, - suffixAgo: "ago", - suffixFromNow: "from now", - seconds: "less than a minute", - minute: "about a minute", - minutes: "%d minutes", - hour: "about an hour", - hours: "about %d hours", - day: "a day", - days: "%d days", - month: "about a month", - months: "%d months", - year: "about a year", - years: "%d years", - wordSeparator: " ", - numbers: [] - } - }, - inWords: function(distanceMillis) { - var $l = this.settings.strings; - var prefix = $l.prefixAgo; - var suffix = $l.suffixAgo; - if (this.settings.allowFuture) { - if (distanceMillis < 0) { - prefix = $l.prefixFromNow; - suffix = $l.suffixFromNow; - } - } - - var seconds = Math.abs(distanceMillis) / 1000; - var minutes = seconds / 60; - var hours = minutes / 60; - var days = hours / 24; - var years = days / 365; - - function substitute(stringOrFunction, number) { - var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; - var value = ($l.numbers && $l.numbers[number]) || number; - return string.replace(/%d/i, value); - } - - var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || - seconds < 90 && substitute($l.minute, 1) || - minutes < 45 && substitute($l.minutes, Math.round(minutes)) || - minutes < 90 && substitute($l.hour, 1) || - hours < 24 && substitute($l.hours, Math.round(hours)) || - hours < 42 && substitute($l.day, 1) || - days < 30 && substitute($l.days, Math.round(days)) || - days < 45 && substitute($l.month, 1) || - days < 365 && substitute($l.months, Math.round(days / 30)) || - years < 1.5 && substitute($l.year, 1) || - substitute($l.years, Math.round(years)); - - var separator = $l.wordSeparator || ""; - if ($l.wordSeparator === undefined) { separator = " "; } - return $.trim([prefix, words, suffix].join(separator)); - }, - parse: function(iso8601) { - var s = $.trim(iso8601); - s = s.replace(/\.\d+/,""); // remove milliseconds - s = s.replace(/-/,"/").replace(/-/,"/"); - s = s.replace(/T/," ").replace(/Z/," UTC"); - s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 - return new Date(s); - }, - datetime: function(elem) { - var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); - return $t.parse(iso8601); - }, - isTime: function(elem) { - // jQuery's `is()` doesn't play well with HTML5 in IE - return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); - } - }); - - // functions that can be called via $(el).timeago('action') - // init is default when no action is given - // functions are called with context of a single element - var functions = { - init: function(){ - var refresh_el = $.proxy(refresh, this); - refresh_el(); - var $s = $t.settings; - if ($s.refreshMillis > 0) { - setInterval(refresh_el, $s.refreshMillis); - } - }, - update: function(time){ - $(this).data('timeago', { datetime: $t.parse(time) }); - refresh.apply(this); - } - }; - - $.fn.timeago = function(action, options) { - var fn = action ? functions[action] : functions.init; - if(!fn){ - throw new Error("Unknown function name '"+ action +"' for timeago"); - } - // each over objects here and call the requested function - this.each(function(){ - fn.call(this, options); - }); - return this; - }; - - function refresh() { - var data = prepareData(this); - if (!isNaN(data.datetime)) { - $(this).text(inWords(data.datetime)); - } - return this; - } - - function prepareData(element) { - element = $(element); - if (!element.data("timeago")) { - element.data("timeago", { datetime: $t.datetime(element) }); - var text = $.trim(element.text()); - if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { - element.attr("title", text); - } - } - return element.data("timeago"); - } - - function inWords(date) { - return $t.inWords(distance(date)); - } - - function distance(date) { - return (new Date().getTime() - date.getTime()); - } - - // fix for IE6 suckage - document.createElement("abbr"); - document.createElement("time"); -})); diff --git a/app/assets/javascripts/lib/md5.js b/app/assets/javascripts/lib/md5.js deleted file mode 100644 index b63716eaad2..00000000000 --- a/app/assets/javascripts/lib/md5.js +++ /dev/null @@ -1,211 +0,0 @@ -function md5 (str) { - // http://kevin.vanzonneveld.net - // + original by: Webtoolkit.info (http://www.webtoolkit.info/) - // + namespaced by: Michael White (http://getsprink.com) - // + tweaked by: Jack - // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + input by: Brett Zamir (http://brett-zamir.me) - // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // - depends on: utf8_encode - // * example 1: md5('Kevin van Zonneveld'); - // * returns 1: '6e658d4bfcb59cc13f96c14450ac40b9' - var xl; - - var rotateLeft = function (lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - }; - - var addUnsigned = function (lX, lY) { - var lX4, lY4, lX8, lY8, lResult; - lX8 = (lX & 0x80000000); - lY8 = (lY & 0x80000000); - lX4 = (lX & 0x40000000); - lY4 = (lY & 0x40000000); - lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); - if (lX4 & lY4) { - return (lResult ^ 0x80000000 ^ lX8 ^ lY8); - } - if (lX4 | lY4) { - if (lResult & 0x40000000) { - return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); - } else { - return (lResult ^ 0x40000000 ^ lX8 ^ lY8); - } - } else { - return (lResult ^ lX8 ^ lY8); - } - }; - - var _F = function (x, y, z) { - return (x & y) | ((~x) & z); - }; - var _G = function (x, y, z) { - return (x & z) | (y & (~z)); - }; - var _H = function (x, y, z) { - return (x ^ y ^ z); - }; - var _I = function (x, y, z) { - return (y ^ (x | (~z))); - }; - - var _FF = function (a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(_F(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var _GG = function (a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(_G(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var _HH = function (a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(_H(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var _II = function (a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(_I(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - }; - - var convertToWordArray = function (str) { - var lWordCount; - var lMessageLength = str.length; - var lNumberOfWords_temp1 = lMessageLength + 8; - var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; - var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; - var lWordArray = new Array(lNumberOfWords - 1); - var lBytePosition = 0; - var lByteCount = 0; - while (lByteCount < lMessageLength) { - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = (lWordArray[lWordCount] | (str.charCodeAt(lByteCount) << lBytePosition)); - lByteCount++; - } - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); - lWordArray[lNumberOfWords - 2] = lMessageLength << 3; - lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; - return lWordArray; - }; - - var wordToHex = function (lValue) { - var wordToHexValue = "", - wordToHexValue_temp = "", - lByte, lCount; - for (lCount = 0; lCount <= 3; lCount++) { - lByte = (lValue >>> (lCount * 8)) & 255; - wordToHexValue_temp = "0" + lByte.toString(16); - wordToHexValue = wordToHexValue + wordToHexValue_temp.substr(wordToHexValue_temp.length - 2, 2); - } - return wordToHexValue; - }; - - var x = [], - k, AA, BB, CC, DD, a, b, c, d, S11 = 7, - S12 = 12, - S13 = 17, - S14 = 22, - S21 = 5, - S22 = 9, - S23 = 14, - S24 = 20, - S31 = 4, - S32 = 11, - S33 = 16, - S34 = 23, - S41 = 6, - S42 = 10, - S43 = 15, - S44 = 21; - - str = this.utf8_encode(str); - x = convertToWordArray(str); - a = 0x67452301; - b = 0xEFCDAB89; - c = 0x98BADCFE; - d = 0x10325476; - - xl = x.length; - for (k = 0; k < xl; k += 16) { - AA = a; - BB = b; - CC = c; - DD = d; - a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); - d = _FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); - c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB); - b = _FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); - a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); - d = _FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); - c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613); - b = _FF(b, c, d, a, x[k + 7], S14, 0xFD469501); - a = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8); - d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); - c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); - b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); - a = _FF(a, b, c, d, x[k + 12], S11, 0x6B901122); - d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193); - c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E); - b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821); - a = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); - d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340); - c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); - b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); - a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); - d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453); - c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); - b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); - a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); - d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); - c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); - b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); - a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); - d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); - c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); - b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); - a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); - d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681); - c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); - b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); - a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); - d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); - c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); - b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); - a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); - d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); - c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); - b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05); - a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); - d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); - c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); - b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); - a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244); - d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97); - c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); - b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039); - a = _II(a, b, c, d, x[k + 12], S41, 0x655B59C3); - d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); - c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); - b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1); - a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); - d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); - c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314); - b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); - a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82); - d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); - c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); - b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391); - a = addUnsigned(a, AA); - b = addUnsigned(b, BB); - c = addUnsigned(c, CC); - d = addUnsigned(d, DD); - } - - var temp = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d); - - return temp.toLowerCase(); -} diff --git a/app/assets/javascripts/lib/utf8_encode.js b/app/assets/javascripts/lib/utf8_encode.js deleted file mode 100644 index 39ffe44dae0..00000000000 --- a/app/assets/javascripts/lib/utf8_encode.js +++ /dev/null @@ -1,70 +0,0 @@ -function utf8_encode (argString) { - // http://kevin.vanzonneveld.net - // + original by: Webtoolkit.info (http://www.webtoolkit.info/) - // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) - // + improved by: sowberry - // + tweaked by: Jack - // + bugfixed by: Onno Marsman - // + improved by: Yves Sucaet - // + bugfixed by: Onno Marsman - // + bugfixed by: Ulrich - // + bugfixed by: Rafal Kukawski - // + improved by: kirilloid - // + bugfixed by: kirilloid - // * example 1: utf8_encode('Kevin van Zonneveld'); - // * returns 1: 'Kevin van Zonneveld' - - if (argString === null || typeof argString === "undefined") { - return ""; - } - - var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n"); - var utftext = '', - start, end, stringl = 0; - - start = end = 0; - stringl = string.length; - for (var n = 0; n < stringl; n++) { - var c1 = string.charCodeAt(n); - var enc = null; - - if (c1 < 128) { - end++; - } else if (c1 > 127 && c1 < 2048) { - enc = String.fromCharCode( - (c1 >> 6) | 192, - ( c1 & 63) | 128 - ); - } else if (c1 & 0xF800 != 0xD800) { - enc = String.fromCharCode( - (c1 >> 12) | 224, - ((c1 >> 6) & 63) | 128, - ( c1 & 63) | 128 - ); - } else { // surrogate pairs - if (c1 & 0xFC00 != 0xD800) { throw new RangeError("Unmatched trail surrogate at " + n); } - var c2 = string.charCodeAt(++n); - if (c2 & 0xFC00 != 0xDC00) { throw new RangeError("Unmatched lead surrogate at " + (n-1)); } - c1 = ((c1 & 0x3FF) << 10) + (c2 & 0x3FF) + 0x10000; - enc = String.fromCharCode( - (c1 >> 18) | 240, - ((c1 >> 12) & 63) | 128, - ((c1 >> 6) & 63) | 128, - ( c1 & 63) | 128 - ); - } - if (enc !== null) { - if (end > start) { - utftext += string.slice(start, end); - } - utftext += enc; - start = end = n + 1; - } - } - - if (end > start) { - utftext += string.slice(start, stringl); - } - - return utftext; -} diff --git a/app/assets/javascripts/merge_request.js.coffee b/app/assets/javascripts/merge_request.js.coffee deleted file mode 100644 index fc75f143836..00000000000 --- a/app/assets/javascripts/merge_request.js.coffee +++ /dev/null @@ -1,166 +0,0 @@ -class @MergeRequest - constructor: (@opts) -> - @initContextWidget() - this.$el = $('.merge-request') - @diffs_loaded = if @opts.action == 'diffs' then true else false - @commits_loaded = false - - this.activateTab(@opts.action) - - this.bindEvents() - - this.initMergeWidget() - this.$('.show-all-commits').on 'click', => - this.showAllCommits() - - modal = $('#modal_merge_info').modal(show: false) - - disableButtonIfEmptyField '#commit_message', '.accept_merge_request' - - if $("a.btn-close").length - $("li.task-list-item input:checkbox").prop("disabled", false) - - $('.merge-request-details').waitForImages -> - $('.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('') - - # Local jQuery finder - $: (selector) -> - this.$el.find(selector) - - initContextWidget: -> - $('.edit-merge_request.inline-update input[type="submit"]').hide() - $(".context .inline-update").on "change", "select", -> - $(this).submit() - $(".context .inline-update").on "change", "#merge_request_assignee_id", -> - $(this).submit() - - initMergeWidget: -> - this.showState( @opts.current_status ) - - if this.$('.automerge_widget').length and @opts.check_enable - $.get @opts.url_to_automerge_check, (data) => - this.showState( data.merge_status ) - , 'json' - - if @opts.ci_enable - $.get @opts.url_to_ci_check, (data) => - this.showCiState data.status - if data.coverage - this.showCiCoverage data.coverage - , 'json' - - bindEvents: -> - this.$('.merge-request-tabs').on 'click', 'a', (event) => - a = $(event.currentTarget) - - href = a.attr('href') - History.replaceState {path: href}, document.title, href - - event.preventDefault() - - this.$('.merge-request-tabs').on 'click', 'li', (event) => - this.activateTab($(event.currentTarget).data('action')) - - this.$('.accept_merge_request').on 'click', -> - $('.automerge_widget.can_be_merged').hide() - $('.merge-in-progress').show() - - this.$('.remove_source_branch').on 'click', -> - $('.remove_source_branch_widget').hide() - $('.remove_source_branch_in_progress').show() - - this.$(".remove_source_branch").on "ajax:success", (e, data, status, xhr) -> - location.reload() - - this.$(".remove_source_branch").on "ajax:error", (e, data, status, xhr) => - this.$('.remove_source_branch_widget').hide() - this.$('.remove_source_branch_in_progress').hide() - this.$('.remove_source_branch_widget.failed').show() - - $('.task-list-item input:checkbox').off('change') - $('.task-list-item input:checkbox').change('merge_request', updateTaskState) - - activateTab: (action) -> - this.$('.merge-request-tabs li').removeClass 'active' - this.$('.tab-content').hide() - switch action - when 'diffs' - this.$('.merge-request-tabs .diffs-tab').addClass 'active' - this.loadDiff() unless @diffs_loaded - this.$('.diffs').show() - $(".diff-header").trigger("sticky_kit:recalc") - when 'commits' - this.$('.merge-request-tabs .commits-tab').addClass 'active' - this.$('.commits').show() - else - this.$('.merge-request-tabs .notes-tab').addClass 'active' - this.$('.notes').show() - - showState: (state) -> - $('.automerge_widget').hide() - $('.automerge_widget.' + state).show() - - showCiState: (state) -> - $('.ci_widget').hide() - allowed_states = ["failed", "canceled", "running", "pending", "success"] - if state in allowed_states - $('.ci_widget.ci-' + state).show() - switch state - when "failed", "canceled" - @setMergeButtonClass('btn-danger') - when "running", "pending" - @setMergeButtonClass('btn-warning') - else - $('.ci_widget.ci-error').show() - @setMergeButtonClass('btn-danger') - - showCiCoverage: (coverage) -> - cov_html = $('') - cov_html.addClass('ci-coverage') - cov_html.text('Coverage ' + coverage + '%') - $('.ci_widget:visible').append(cov_html) - - loadDiff: (event) -> - $.ajax - type: 'GET' - url: this.$('.merge-request-tabs .diffs-tab a').attr('href') + ".json" - beforeSend: => - this.$('.mr-loading-status .loading').show() - complete: => - @diffs_loaded = true - this.$('.mr-loading-status .loading').hide() - success: (data) => - this.$(".diffs").html(data.html) - dataType: 'json' - - showAllCommits: -> - this.$('.first-commits').remove() - this.$('.all-commits').removeClass 'hide' - - alreadyOrCannotBeMerged: -> - this.$('.automerge_widget').hide() - this.$('.merge-in-progress').hide() - this.$('.automerge_widget.already_cannot_be_merged').show() - - setMergeButtonClass: (css_class) -> - $('.accept_merge_request').removeClass("btn-create").addClass(css_class) - - mergeInProgress: -> - $.ajax - type: 'GET' - url: $('.merge-request').data('url') - success: (data) => - switch data.state - when 'merged' - location.reload() - else - setTimeout(merge_request.mergeInProgress, 3000) - dataType: 'json' diff --git a/app/assets/javascripts/merge_requests.js.coffee b/app/assets/javascripts/merge_requests.js.coffee deleted file mode 100644 index 83434c1b9ba..00000000000 --- a/app/assets/javascripts/merge_requests.js.coffee +++ /dev/null @@ -1,35 +0,0 @@ -# -# * Filter merge requests -# -@MergeRequests = - init: -> - MergeRequests.initSearch() - - # Make sure we trigger ajax request only after user stop typing - initSearch: -> - @timer = null - $("#issue_search").keyup -> - clearTimeout(@timer) - @timer = setTimeout(MergeRequests.filterResults, 500) - - filterResults: => - form = $("#issue_search_form") - search = $("#issue_search").val() - $('.merge-requests-holder').css("opacity", '0.5') - issues_url = form.attr('action') + '? '+ form.serialize() - - $.ajax - type: "GET" - url: form.attr('action') - data: form.serialize() - complete: -> - $('.merge-requests-holder').css("opacity", '1.0') - success: (data) -> - $('.merge-requests-holder').html(data.html) - # Change url so if user reload a page - search results are saved - History.replaceState {page: issues_url}, document.title, issues_url - MergeRequests.reload() - dataType: "json" - - reload: -> - $('#filter_issue_search').val($('#issue_search').val()) diff --git a/app/assets/javascripts/milestone.js.coffee b/app/assets/javascripts/milestone.js.coffee deleted file mode 100644 index d644d50b669..00000000000 --- a/app/assets/javascripts/milestone.js.coffee +++ /dev/null @@ -1,124 +0,0 @@ -class @Milestone - @updateIssue: (li, issue_url, data) -> - $.ajax - type: "PUT" - url: issue_url - data: data - success: (data) -> - if data.saved == true - if data.assignee_avatar_url - img_tag = $('') - img_tag.attr('src', data.assignee_avatar_url) - img_tag.addClass('avatar s16') - $(li).find('.assignee-icon').html(img_tag) - else - $(li).find('.assignee-icon').html('') - $(li).effect 'highlight' - else - new Flash("Issue update failed", 'alert') - dataType: "json" - - @sortIssues: (data) -> - sort_issues_url = location.href + "/sort_issues" - - $.ajax - type: "PUT" - url: sort_issues_url - data: data - success: (data) -> - if data.saved != true - new Flash("Issues update failed", 'alert') - dataType: "json" - - @sortMergeRequests: (data) -> - sort_mr_url = location.href + "/sort_merge_requests" - - $.ajax - type: "PUT" - url: sort_mr_url - data: data - success: (data) -> - if data.saved != true - new Flash("MR update failed", 'alert') - dataType: "json" - - @updateMergeRequest: (li, merge_request_url, data) -> - $.ajax - type: "PUT" - url: merge_request_url - data: data - success: (data) -> - if data.saved == true - if data.assignee_avatar_url - img_tag = $('') - img_tag.attr('src', data.assignee_avatar_url) - img_tag.addClass('avatar s16') - $(li).find('.assignee-icon').html(img_tag) - else - $(li).find('.assignee-icon').html('') - $(li).effect 'highlight' - else - new Flash("Issue update failed", 'alert') - dataType: "json" - - constructor: -> - @bindIssuesSorting() - @bindMergeRequestSorting() - - bindIssuesSorting: -> - $("#issues-list-unassigned, #issues-list-ongoing, #issues-list-closed").sortable( - connectWith: ".issues-sortable-list", - dropOnEmpty: true, - items: "li:not(.ui-sort-disabled)", - update: (event, ui) -> - data = $(this).sortable("serialize") - Milestone.sortIssues(data) - - receive: (event, ui) -> - new_state = $(this).data('state') - issue_id = ui.item.data('iid') - issue_url = ui.item.data('url') - - data = switch new_state - when 'ongoing' - "issue[assignee_id]=" + gon.current_user_id - when 'unassigned' - "issue[assignee_id]=" - when 'closed' - "issue[state_event]=close" - - if $(ui.sender).data('state') == "closed" - data += "&issue[state_event]=reopen" - - Milestone.updateIssue(ui.item, issue_url, data) - - ).disableSelection() - - bindMergeRequestSorting: -> - $("#merge_requests-list-unassigned, #merge_requests-list-ongoing, #merge_requests-list-closed").sortable( - connectWith: ".merge_requests-sortable-list", - dropOnEmpty: true, - items: "li:not(.ui-sort-disabled)", - update: (event, ui) -> - data = $(this).sortable("serialize") - Milestone.sortMergeRequests(data) - - receive: (event, ui) -> - new_state = $(this).data('state') - merge_request_id = ui.item.data('iid') - merge_request_url = ui.item.data('url') - - data = switch new_state - when 'ongoing' - "merge_request[assignee_id]=" + gon.current_user_id - when 'unassigned' - "merge_request[assignee_id]=" - when 'closed' - "merge_request[state_event]=close" - - if $(ui.sender).data('state') == "closed" - data += "&merge_request[state_event]=reopen" - - Milestone.updateMergeRequest(ui.item, merge_request_url, data) - - ).disableSelection() diff --git a/app/assets/javascripts/namespace_select.js.coffee b/app/assets/javascripts/namespace_select.js.coffee deleted file mode 100644 index a02c4515ccc..00000000000 --- a/app/assets/javascripts/namespace_select.js.coffee +++ /dev/null @@ -1,25 +0,0 @@ -class @NamespaceSelect - constructor: -> - namespaceFormatResult = (namespace) -> - markup = "
    " - markup += "" + namespace.kind + "" - markup += "" + namespace.path + "" - markup += "
    " - markup - - formatSelection = (namespace) -> - namespace.kind + ": " + namespace.path - - $('.ajax-namespace-select').each (i, select) -> - $(select).select2 - placeholder: "Search for namespace" - multiple: $(select).hasClass('multiselect') - minimumInputLength: 0 - query: (query) -> - Api.namespaces query.term, (namespaces) -> - data = { results: namespaces } - query.callback(data) - - dropdownCssClass: "ajax-namespace-dropdown" - formatResult: namespaceFormatResult - formatSelection: formatSelection diff --git a/app/assets/javascripts/network.js.coffee b/app/assets/javascripts/network.js.coffee deleted file mode 100644 index f4ef07a50a7..00000000000 --- a/app/assets/javascripts/network.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class @Network - constructor: (opts) -> - $("#filter_ref").click -> - $(this).closest('form').submit() - - @branch_graph = new BranchGraph($(".network-graph"), opts) - - vph = $(window).height() - 250 - $('.network-graph').css 'height': (vph + 'px') diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee deleted file mode 100644 index 6dfe10f0006..00000000000 --- a/app/assets/javascripts/notes.js.coffee +++ /dev/null @@ -1,481 +0,0 @@ -class @Notes - @interval: null - - constructor: (notes_url, note_ids, last_fetched_at) -> - @notes_url = notes_url - @notes_url = gon.relative_url_root + @notes_url if gon.relative_url_root? - @note_ids = note_ids - @last_fetched_at = last_fetched_at - @noteable_url = document.URL - @initRefresh() - @setupMainTargetNoteForm() - @cleanBinding() - @addBinding() - - addBinding: -> - # add note to UI after creation - $(document).on "ajax:success", ".js-main-target-form", @addNote - $(document).on "ajax:success", ".js-discussion-note-form", @addDiscussionNote - - # change note in UI after update - $(document).on "ajax:success", "form.edit_note", @updateNote - - # Edit note link - $(document).on "click", ".js-note-edit", @showEditForm - $(document).on "click", ".note-edit-cancel", @cancelEdit - - # Reopen and close actions for Issue/MR combined with note form submit - $(document).on "click", ".js-note-target-reopen", @targetReopen - $(document).on "click", ".js-note-target-close", @targetClose - $(document).on "click", ".js-comment-button", @updateCloseButton - $(document).on "keyup", ".js-note-text", @updateTargetButtons - - # remove a note (in general) - $(document).on "click", ".js-note-delete", @removeNote - - # delete note attachment - $(document).on "click", ".js-note-attachment-delete", @removeAttachment - - # reset main target form after submit - $(document).on "ajax:complete", ".js-main-target-form", @reenableTargetFormSubmitButton - $(document).on "ajax:success", ".js-main-target-form", @resetMainTargetForm - - # update the file name when an attachment is selected - $(document).on "change", ".js-note-attachment-input", @updateFormAttachment - - # reply to diff/discussion notes - $(document).on "click", ".js-discussion-reply-button", @replyToDiscussionNote - - # add diff note - $(document).on "click", ".js-add-diff-note-button", @addDiffNote - - # hide diff note form - $(document).on "click", ".js-close-discussion-note-form", @cancelDiscussionForm - - # fetch notes when tab becomes visible - $(document).on "visibilitychange", @visibilityChange - - @notes_forms = '.js-main-target-form textarea, .js-discussion-note-form textarea' - # Chrome doesn't fire keypress or keyup for Command+Enter, so we need keydown. - $(document).on('keydown', @notes_forms, (e) -> - return if e.originalEvent.repeat - if e.keyCode == 10 || ((e.metaKey || e.ctrlKey) && e.keyCode == 13) - $(@).parents('form').submit() - ) - - cleanBinding: -> - $(document).off "ajax:success", ".js-main-target-form" - $(document).off "ajax:success", ".js-discussion-note-form" - $(document).off "ajax:success", "form.edit_note" - $(document).off "click", ".js-note-edit" - $(document).off "click", ".note-edit-cancel" - $(document).off "click", ".js-note-delete" - $(document).off "click", ".js-note-attachment-delete" - $(document).off "ajax:complete", ".js-main-target-form" - $(document).off "ajax:success", ".js-main-target-form" - $(document).off "click", ".js-discussion-reply-button" - $(document).off "click", ".js-add-diff-note-button" - $(document).off "visibilitychange" - $(document).off "keydown", @notes_forms - $(document).off "keyup", ".js-note-text" - $(document).off "click", ".js-note-target-reopen" - $(document).off "click", ".js-note-target-close" - - initRefresh: -> - clearInterval(Notes.interval) - Notes.interval = setInterval => - @refresh() - , 15000 - - refresh: -> - unless document.hidden or (@noteable_url != document.URL) - @getContent() - - getContent: -> - $.ajax - url: @notes_url - data: "last_fetched_at=" + @last_fetched_at - dataType: "json" - success: (data) => - notes = data.notes - @last_fetched_at = data.last_fetched_at - $.each notes, (i, note) => - @renderNote(note) - - - ### - Render note in main comments area. - - Note: for rendering inline notes use renderDiscussionNote - ### - renderNote: (note) -> - # render note if it not present in loaded list - # or skip if rendered - if @isNewNote(note) - @note_ids.push(note.id) - $('ul.main-notes-list').append(note.html) - - ### - Check if note does not exists on page - ### - isNewNote: (note) -> - $.inArray(note.id, @note_ids) == -1 - - - ### - Render note in discussion area. - - Note: for rendering inline notes use renderDiscussionNote - ### - renderDiscussionNote: (note) -> - @note_ids.push(note.id) - form = $("form[rel='" + note.discussion_id + "']") - row = form.closest("tr") - - # is this the first note of discussion? - if row.is(".js-temp-notes-holder") - # insert the note and the reply button after the temp row - row.after note.discussion_html - - # remove the note (will be added again below) - row.next().find(".note").remove() - - # Add note to 'Changes' page discussions - $(".notes[rel='" + note.discussion_id + "']").append note.html - - # Init discussion on 'Discussion' page if it is merge request page - if $('body').attr('data-page').indexOf('projects:merge_request') == 0 - $('ul.main-notes-list').append(note.discussion_with_diff_html) - else - # append new note to all matching discussions - $(".notes[rel='" + note.discussion_id + "']").append note.html - - # cleanup after successfully creating a diff/discussion note - @removeDiscussionNoteForm(form) - - ### - Called in response the main target form has been successfully submitted. - - Removes any errors. - Resets text and preview. - Resets buttons. - ### - resetMainTargetForm: -> - form = $(".js-main-target-form") - - # remove validation errors - form.find(".js-errors").remove() - - # reset text and preview - form.find(".js-md-write-button").click() - form.find(".js-note-text").val("").trigger "input" - - form.find(".js-note-text").data("autosave").reset() - - reenableTargetFormSubmitButton: -> - form = $(".js-main-target-form") - - form.find(".js-note-text").trigger "input" - - ### - Shows the main form and does some setup on it. - - Sets some hidden fields in the form. - ### - setupMainTargetNoteForm: -> - - # find the form - form = $(".js-new-note-form") - - # insert the form after the button - form.clone().replaceAll $(".js-main-target-form") - form = form.prev("form") - - # show the form - @setupNoteForm(form) - - # fix classes - form.removeClass "js-new-note-form" - form.addClass "js-main-target-form" - - # remove unnecessary fields and buttons - form.find("#note_line_code").remove() - form.find(".js-close-discussion-note-form").remove() - - ### - General note form setup. - - deactivates the submit button when text is empty - hides the preview button when text is empty - setup GFM auto complete - show the form - ### - setupNoteForm: (form) -> - disableButtonIfEmptyField form.find(".js-note-text"), form.find(".js-comment-button") - form.removeClass "js-new-note-form" - form.find('.div-dropzone').remove() - - # setup preview buttons - form.find(".js-md-write-button, .js-md-preview-button").tooltip placement: "left" - previewButton = form.find(".js-md-preview-button") - - textarea = form.find(".js-note-text") - - textarea.on "input", -> - if $(this).val().trim() isnt "" - previewButton.removeClass("turn-off").addClass "turn-on" - else - previewButton.removeClass("turn-on").addClass "turn-off" - - new Autosave textarea, [ - "Note" - form.find("#note_commit_id").val() - form.find("#note_line_code").val() - form.find("#note_noteable_type").val() - form.find("#note_noteable_id").val() - ] - - # remove notify commit author checkbox for non-commit notes - form.find(".js-notify-commit-author").remove() if form.find("#note_noteable_type").val() isnt "Commit" - GitLab.GfmAutoComplete.setup() - new DropzoneInput(form) - form.show() - - ### - Called in response to the new note form being submitted - - Adds new note to list. - ### - addNote: (xhr, note, status) => - @renderNote(note) - @updateVotes() - - ### - Called in response to the new note form being submitted - - Adds new note to list. - ### - addDiscussionNote: (xhr, note, status) => - @renderDiscussionNote(note) - - ### - Called in response to the edit note form being submitted - - Updates the current note field. - ### - updateNote: (xhr, note, status) => - note_li = $(".note-row-" + note.id) - note_li.replaceWith(note.html) - note_li.find('.note-edit-form').hide() - note_li.find('.note-body > .note-text').show() - - ### - Called in response to clicking the edit note link - - Replaces the note text with the note edit form - Adds a hidden div with the original content of the note to fill the edit note form with - if the user cancels - ### - showEditForm: (e) -> - e.preventDefault() - note = $(this).closest(".note") - note.find(".note-body > .note-text").hide() - note.find(".note-header").hide() - base_form = note.find(".note-edit-form") - form = base_form.clone().insertAfter(base_form) - form.addClass('current-note-edit-form') - form.find('.div-dropzone').remove() - - # Show the attachment delete link - note.find(".js-note-attachment-delete").show() - - # Setup markdown form - GitLab.GfmAutoComplete.setup() - new DropzoneInput(form) - - form.show() - textarea = form.find("textarea") - textarea.focus() - disableButtonIfEmptyField textarea, form.find(".js-comment-button") - - ### - Called in response to clicking the edit note link - - Hides edit form - ### - cancelEdit: (e) -> - e.preventDefault() - note = $(this).closest(".note") - note.find(".note-body > .note-text").show() - note.find(".note-header").show() - note.find(".current-note-edit-form").remove() - - ### - Called in response to deleting a note of any kind. - - Removes the actual note from view. - Removes the whole discussion if the last note is being removed. - ### - removeNote: -> - note = $(this).closest(".note") - notes = note.closest(".notes") - - # check if this is the last note for this line - if notes.find(".note").length is 1 - - # for discussions - notes.closest(".discussion").remove() - - # for diff lines - notes.closest("tr").remove() - - note.remove() - - ### - Called in response to clicking the delete attachment link - - Removes the attachment wrapper view, including image tag if it exists - Resets the note editing form - ### - removeAttachment: -> - note = $(this).closest(".note") - note.find(".note-attachment").remove() - note.find(".note-body > .note-text").show() - note.find(".js-note-attachment-delete").hide() - note.find(".note-edit-form").hide() - - ### - Called when clicking on the "reply" button for a diff line. - - Shows the note form below the notes. - ### - replyToDiscussionNote: (e) => - form = $(".js-new-note-form") - replyLink = $(e.target).closest(".js-discussion-reply-button") - replyLink.hide() - - # insert the form after the button - form.clone().insertAfter replyLink - - # show the form - @setupDiscussionNoteForm(replyLink, replyLink.next("form")) - - ### - Shows the diff or discussion form and does some setup on it. - - Sets some hidden fields in the form. - - Note: dataHolder must have the "discussionId", "lineCode", "noteableType" - and "noteableId" data attributes set. - ### - setupDiscussionNoteForm: (dataHolder, form) => - # setup note target - form.attr "rel", dataHolder.data("discussionId") - form.find("#note_commit_id").val dataHolder.data("commitId") - form.find("#note_line_code").val dataHolder.data("lineCode") - form.find("#note_noteable_type").val dataHolder.data("noteableType") - form.find("#note_noteable_id").val dataHolder.data("noteableId") - @setupNoteForm form - form.find(".js-note-text").focus() - form.addClass "js-discussion-note-form" - - ### - Called when clicking on the "add a comment" button on the side of a diff line. - - Inserts a temporary row for the form below the line. - Sets up the form and shows it. - ### - addDiffNote: (e) => - e.preventDefault() - link = e.currentTarget - form = $(".js-new-note-form") - row = $(link).closest("tr") - nextRow = row.next() - - # does it already have notes? - if nextRow.is(".notes_holder") - replyButton = nextRow.find(".js-discussion-reply-button") - if replyButton.length > 0 - $.proxy(@replyToDiscussionNote, replyButton).call() - else - # add a notes row and insert the form - row.after "" - form.clone().appendTo row.next().find(".notes_content") - - # show the form - @setupDiscussionNoteForm $(link), row.next().find("form") - - ### - Called in response to "cancel" on a diff note form. - - Shows the reply button again. - Removes the form and if necessary it's temporary row. - ### - removeDiscussionNoteForm: (form)-> - row = form.closest("tr") - - form.find(".js-note-text").data("autosave").reset() - - # show the reply button (will only work for replies) - form.prev(".js-discussion-reply-button").show() - if row.is(".js-temp-notes-holder") - # remove temporary row for diff lines - row.remove() - else - # only remove the form - form.remove() - - - cancelDiscussionForm: (e) => - e.preventDefault() - form = $(".js-new-note-form") - form = $(e.target).closest(".js-discussion-note-form") - @removeDiscussionNoteForm(form) - - updateVotes: -> - true - - ### - Called after an attachment file has been selected. - - Updates the file name for the selected attachment. - ### - updateFormAttachment: -> - form = $(this).closest("form") - - # get only the basename - filename = $(this).val().replace(/^.*[\\\/]/, "") - form.find(".js-attachment-filename").text filename - - ### - Called when the tab visibility changes - ### - visibilityChange: => - @refresh() - - targetReopen: (e) => - @submitNoteForm($(e.target).parents('form')) - - targetClose: (e) => - @submitNoteForm($(e.target).parents('form')) - - submitNoteForm: (form) => - noteText = form.find(".js-note-text").val() - if noteText.trim().length > 0 - form.submit() - - updateCloseButton: (e) => - textarea = $(e.target) - form = textarea.parents('form') - form.find('.js-note-target-close').text('Close') - - updateTargetButtons: (e) => - textarea = $(e.target) - form = textarea.parents('form') - - if textarea.val().trim().length > 0 - form.find('.js-note-target-reopen').text('Comment & reopen') - form.find('.js-note-target-close').text('Comment & close') - else - form.find('.js-note-target-reopen').text('Reopen') - form.find('.js-note-target-close').text('Close') diff --git a/app/assets/javascripts/pager.js.coffee b/app/assets/javascripts/pager.js.coffee deleted file mode 100644 index fe83dc0410e..00000000000 --- a/app/assets/javascripts/pager.js.coffee +++ /dev/null @@ -1,42 +0,0 @@ -@Pager = - init: (@limit = 0, preload, @disable = false) -> - @loading = $(".loading") - if preload - @offset = 0 - @getOld() - else - @offset = @limit - @initLoadMore() - - getOld: -> - @loading.show() - $.ajax - type: "GET" - url: location.href - data: "limit=" + @limit + "&offset=" + @offset - complete: => - @loading.hide() - success: (data) -> - Pager.append(data.count, data.html) - dataType: "json" - - append: (count, html) -> - $(".content_list").append html - if count > 0 - @offset += count - else - @disable = true - - initLoadMore: -> - $(document).unbind('scroll') - $(document).endlessScroll - bottomPixels: 400 - fireDelay: 1000 - fireOnce: true - ceaseFire: -> - Pager.disable - - callback: (i) => - unless @loading.is(':visible') - @loading.show() - Pager.getOld() diff --git a/app/assets/javascripts/profile.js.coffee b/app/assets/javascripts/profile.js.coffee deleted file mode 100644 index de356fbec77..00000000000 --- a/app/assets/javascripts/profile.js.coffee +++ /dev/null @@ -1,29 +0,0 @@ -class @Profile - constructor: -> - $('.edit_user .application-theme input, .edit_user .code-preview-theme input').click -> - # Submit the form - $('.edit_user').submit() - - new Flash("Appearance settings saved", "notice") - - $('.update-username form').on 'ajax:before', -> - $('.loading-gif').show() - $(this).find('.update-success').hide() - $(this).find('.update-failed').hide() - - $('.update-username form').on 'ajax:complete', -> - $(this).find('.btn-save').enableButton() - $(this).find('.loading-gif').hide() - - $('.update-notifications').on 'ajax:complete', -> - $(this).find('.btn-save').enableButton() - - - $('.js-choose-user-avatar-button').bind "click", -> - form = $(this).closest("form") - form.find(".js-user-avatar-input").click() - - $('.js-user-avatar-input').bind "change", -> - form = $(this).closest("form") - filename = $(this).val().replace(/^.*[\\\/]/, '') - form.find(".js-avatar-filename").text(filename) diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee deleted file mode 100644 index eb8c1fa1426..00000000000 --- a/app/assets/javascripts/project.js.coffee +++ /dev/null @@ -1,26 +0,0 @@ -class @Project - constructor: -> - # Git clone panel switcher - scope = $ '.git-clone-holder' - if scope.length > 0 - $('a, button', scope).click -> - $('a, button', scope).removeClass 'active' - $(@).addClass 'active' - $('#project_clone', scope).val $(@).data 'clone' - $(".clone").text("").append $(@).data 'clone' - - # Ref switcher - $('.project-refs-select').on 'change', -> - $(@).parents('form').submit() - - $('.hide-no-ssh-message').on 'click', (e) -> - path = '/' - $.cookie('hide_no_ssh_message', 'false', { path: path }) - $(@).parents('.no-ssh-key-message').remove() - e.preventDefault() - - $('.hide-no-password-message').on 'click', (e) -> - path = '/' - $.cookie('hide_no_password_message', 'false', { path: path }) - $(@).parents('.no-password-message').remove() - e.preventDefault() diff --git a/app/assets/javascripts/project_avatar.js.coffee b/app/assets/javascripts/project_avatar.js.coffee deleted file mode 100644 index 8bec6e2ccca..00000000000 --- a/app/assets/javascripts/project_avatar.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class @ProjectAvatar - constructor: -> - $('.js-choose-project-avatar-button').bind 'click', -> - form = $(this).closest('form') - form.find('.js-project-avatar-input').click() - $('.js-project-avatar-input').bind 'change', -> - form = $(this).closest('form') - filename = $(this).val().replace(/^.*[\\\/]/, '') - form.find('.js-avatar-filename').text(filename) diff --git a/app/assets/javascripts/project_fork.js.coffee b/app/assets/javascripts/project_fork.js.coffee deleted file mode 100644 index e15a1c4ef76..00000000000 --- a/app/assets/javascripts/project_fork.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -class @ProjectFork - constructor: -> - $('.fork-thumbnail a').on 'click', -> - $('.fork-namespaces').hide() - $('.save-project-loader').show() diff --git a/app/assets/javascripts/project_import.js.coffee b/app/assets/javascripts/project_import.js.coffee deleted file mode 100644 index 6633564a079..00000000000 --- a/app/assets/javascripts/project_import.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -class @ProjectImport - constructor: -> - setTimeout -> - Turbolinks.visit(location.href) - , 5000 diff --git a/app/assets/javascripts/project_members.js.coffee b/app/assets/javascripts/project_members.js.coffee deleted file mode 100644 index 896ba7e53ee..00000000000 --- a/app/assets/javascripts/project_members.js.coffee +++ /dev/null @@ -1,4 +0,0 @@ -class @ProjectMembers - constructor: -> - $('li.project_member').bind 'ajax:success', -> - $(this).fadeOut() diff --git a/app/assets/javascripts/project_new.js.coffee b/app/assets/javascripts/project_new.js.coffee deleted file mode 100644 index 836269c44f9..00000000000 --- a/app/assets/javascripts/project_new.js.coffee +++ /dev/null @@ -1,11 +0,0 @@ -class @ProjectNew - constructor: -> - $('.project-edit-container').on 'ajax:before', => - $('.project-edit-container').hide() - $('.save-project-loader').show() - - @initEvents() - - - initEvents: -> - disableButtonIfEmptyField '#project_name', '.project-submit' diff --git a/app/assets/javascripts/project_show.js.coffee b/app/assets/javascripts/project_show.js.coffee deleted file mode 100644 index 6828ae471e5..00000000000 --- a/app/assets/javascripts/project_show.js.coffee +++ /dev/null @@ -1,15 +0,0 @@ -class @ProjectShow - constructor: -> - $('.project-home-panel .star').on 'ajax:success', (e, data, status, xhr) -> - $(@).toggleClass('on').find('.count').html(data.star_count) - .on 'ajax:error', (e, xhr, status, error) -> - new Flash('Star toggle failed. Try again later.', 'alert') - - $("a[data-toggle='tab']").on "shown.bs.tab", (e) -> - $.cookie "default_view", $(e.target).attr("href"), { expires: 30, path: '/' } - - defaultView = $.cookie("default_view") - if defaultView - $("a[href=" + defaultView + "]").tab "show" - else - $("a[data-toggle='tab']:first").tab "show" diff --git a/app/assets/javascripts/projects_list.js.coffee b/app/assets/javascripts/projects_list.js.coffee deleted file mode 100644 index c0e36d1ccc5..00000000000 --- a/app/assets/javascripts/projects_list.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -class @ProjectsList - constructor: -> - $(".projects-list .js-expand").on 'click', (e) -> - e.preventDefault() - list = $(this).closest('.projects-list') - list.find("li").show() - list.find("li.bottom").hide() - - $(".projects-list-filter").keyup -> - terms = $(this).val() - uiBox = $(this).closest('.panel') - if terms == "" || terms == undefined - uiBox.find(".projects-list li").show() - else - uiBox.find(".projects-list li").each (index) -> - name = $(this).find(".filter-title").text() - - if name.toLowerCase().search(terms.toLowerCase()) == -1 - $(this).hide() - else - $(this).show() - uiBox.find(".projects-list li.bottom").hide() - - diff --git a/app/assets/javascripts/protected_branches.js.coffee b/app/assets/javascripts/protected_branches.js.coffee deleted file mode 100644 index 5753c9d4e72..00000000000 --- a/app/assets/javascripts/protected_branches.js.coffee +++ /dev/null @@ -1,21 +0,0 @@ -$ -> - $(".protected-branches-list :checkbox").change (e) -> - name = $(this).attr("name") - if name == "developers_can_push" - id = $(this).val() - checked = $(this).is(":checked") - url = $(this).data("url") - $.ajax - type: "PUT" - url: url - dataType: "json" - data: - id: id - developers_can_push: checked - - success: -> - row = $(e.target) - row.closest('tr').effect('highlight') - - error: -> - new Flash("Failed to update branch!", "alert") diff --git a/app/assets/javascripts/search_autocomplete.js.coffee b/app/assets/javascripts/search_autocomplete.js.coffee deleted file mode 100644 index c1801365266..00000000000 --- a/app/assets/javascripts/search_autocomplete.js.coffee +++ /dev/null @@ -1,11 +0,0 @@ -class @SearchAutocomplete - constructor: (search_autocomplete_path, project_id, project_ref) -> - project_id = '' unless project_id - project_ref = '' unless project_ref - query = "?project_id=" + project_id + "&project_ref=" + project_ref - - $("#search").autocomplete - source: search_autocomplete_path + query - minLength: 1 - select: (event, ui) -> - location.href = ui.item.url diff --git a/app/assets/javascripts/shortcuts.js.coffee b/app/assets/javascripts/shortcuts.js.coffee deleted file mode 100644 index e9aeb1e9525..00000000000 --- a/app/assets/javascripts/shortcuts.js.coffee +++ /dev/null @@ -1,30 +0,0 @@ -class @Shortcuts - constructor: -> - @enabledHelp = [] - Mousetrap.reset() - Mousetrap.bind('?', @selectiveHelp) - Mousetrap.bind('s', Shortcuts.focusSearch) - - selectiveHelp: (e) => - Shortcuts.showHelp(e, @enabledHelp) - - @showHelp: (e, location) -> - if $('#modal-shortcuts').length > 0 - $('#modal-shortcuts').modal('show') - else - $.ajax( - url: '/help/shortcuts', - dataType: 'script', - success: (e) -> - if location and location.length > 0 - for l in location - $(l).show() - else - $('.hidden-shortcut').show() - $('.js-more-help-button').remove() - ) - e.preventDefault() - - @focusSearch: (e) -> - $('#search').focus() - e.preventDefault() diff --git a/app/assets/javascripts/shortcuts_dashboard_navigation.js.coffee b/app/assets/javascripts/shortcuts_dashboard_navigation.js.coffee deleted file mode 100644 index 4a05bdccdb3..00000000000 --- a/app/assets/javascripts/shortcuts_dashboard_navigation.js.coffee +++ /dev/null @@ -1,14 +0,0 @@ -#= require shortcuts - -class @ShortcutsDashboardNavigation extends Shortcuts - constructor: -> - super() - Mousetrap.bind('g a', -> ShortcutsDashboardNavigation.findAndFollowLink('.shortcuts-activity')) - Mousetrap.bind('g i', -> ShortcutsDashboardNavigation.findAndFollowLink('.shortcuts-issues')) - Mousetrap.bind('g m', -> ShortcutsDashboardNavigation.findAndFollowLink('.shortcuts-merge_requests')) - Mousetrap.bind('g p', -> ShortcutsDashboardNavigation.findAndFollowLink('.shortcuts-projects')) - - @findAndFollowLink: (selector) -> - link = $(selector).attr('href') - if link - window.location = link diff --git a/app/assets/javascripts/shortcuts_issueable.coffee b/app/assets/javascripts/shortcuts_issueable.coffee deleted file mode 100644 index b8dae71e037..00000000000 --- a/app/assets/javascripts/shortcuts_issueable.coffee +++ /dev/null @@ -1,19 +0,0 @@ -#= require shortcuts_navigation - -class @ShortcutsIssueable extends ShortcutsNavigation - constructor: (isMergeRequest) -> - super() - Mousetrap.bind('a', -> - $('.js-assignee').select2('open') - return false - ) - Mousetrap.bind('m', -> - $('.js-milestone').select2('open') - return false - ) - - if isMergeRequest - @enabledHelp.push('.hidden-shortcut.merge_reuests') - else - @enabledHelp.push('.hidden-shortcut.issues') - diff --git a/app/assets/javascripts/shortcuts_navigation.coffee b/app/assets/javascripts/shortcuts_navigation.coffee deleted file mode 100644 index 31895fbf2bc..00000000000 --- a/app/assets/javascripts/shortcuts_navigation.coffee +++ /dev/null @@ -1,20 +0,0 @@ -#= require shortcuts - -class @ShortcutsNavigation extends Shortcuts - constructor: -> - super() - Mousetrap.bind('g p', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-project')) - Mousetrap.bind('g f', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-tree')) - Mousetrap.bind('g c', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-commits')) - Mousetrap.bind('g n', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-network')) - Mousetrap.bind('g g', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-graphs')) - Mousetrap.bind('g i', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-issues')) - Mousetrap.bind('g m', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-merge_requests')) - Mousetrap.bind('g w', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-wiki')) - Mousetrap.bind('g s', -> ShortcutsNavigation.findAndFollowLink('.shortcuts-snippets')) - @enabledHelp.push('.hidden-shortcut.project') - - @findAndFollowLink: (selector) -> - link = $(selector).attr('href') - if link - window.location = link diff --git a/app/assets/javascripts/shortcuts_network.js.coffee b/app/assets/javascripts/shortcuts_network.js.coffee deleted file mode 100644 index cc95ad7ebfe..00000000000 --- a/app/assets/javascripts/shortcuts_network.js.coffee +++ /dev/null @@ -1,12 +0,0 @@ -#= require shortcuts_navigation - -class @ShortcutsNetwork extends ShortcutsNavigation - constructor: (@graph) -> - super() - Mousetrap.bind(['left', 'h'], @graph.scrollLeft) - Mousetrap.bind(['right', 'l'], @graph.scrollRight) - Mousetrap.bind(['up', 'k'], @graph.scrollUp) - Mousetrap.bind(['down', 'j'], @graph.scrollDown) - Mousetrap.bind(['shift+up', 'shift+k'], @graph.scrollTop) - Mousetrap.bind(['shift+down', 'shift+j'], @graph.scrollBottom) - @enabledHelp.push('.hidden-shortcut.network') diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee deleted file mode 100644 index 2e3f5608257..00000000000 --- a/app/assets/javascripts/sidebar.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -$(document).on("click", '.toggle-nav-collapse', (e) -> - e.preventDefault() - collapsed = 'page-sidebar-collapsed' - expanded = 'page-sidebar-expanded' - - $('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}") - $('.toggle-nav-collapse i').toggleClass("fa-angle-right fa-angle-left") - $.cookie("collapsed_nav", $('.page-with-sidebar').hasClass(collapsed), { path: '/' }) -) diff --git a/app/assets/javascripts/stat_graph.js.coffee b/app/assets/javascripts/stat_graph.js.coffee deleted file mode 100644 index f36c71fd25e..00000000000 --- a/app/assets/javascripts/stat_graph.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -class @StatGraph - @log: {} - @get_log: -> - @log - @set_log: (data) -> - @log = data diff --git a/app/assets/javascripts/stat_graph_contributors.js.coffee b/app/assets/javascripts/stat_graph_contributors.js.coffee deleted file mode 100644 index 27f0fd31d50..00000000000 --- a/app/assets/javascripts/stat_graph_contributors.js.coffee +++ /dev/null @@ -1,69 +0,0 @@ -class @ContributorsStatGraph - init: (log) -> - @parsed_log = ContributorsStatGraphUtil.parse_log(log) - @set_current_field("commits") - total_commits = ContributorsStatGraphUtil.get_total_data(@parsed_log, @field) - author_commits = ContributorsStatGraphUtil.get_author_data(@parsed_log, @field) - @add_master_graph(total_commits) - @add_authors_graph(author_commits) - @change_date_header() - add_master_graph: (total_data) -> - @master_graph = new ContributorsMasterGraph(total_data) - @master_graph.draw() - add_authors_graph: (author_data) -> - @authors = [] - limited_author_data = author_data.slice(0, 100) - _.each(limited_author_data, (d) => - author_header = @create_author_header(d) - $(".contributors-list").append(author_header) - @authors[d.author_name] = author_graph = new ContributorsAuthorGraph(d.dates) - author_graph.draw() - ) - format_author_commit_info: (author) -> - commits = $('', { - class: 'graph-author-commits-count' - }) - commits.text(author.commits + " commits") - $('').append(commits) - - create_author_header: (author) -> - list_item = $('
  • ', { - class: 'person' - style: 'display: block;' - }) - author_name = $('

    ' + author.author_name + '

    ') - author_email = $('

    ' + author.author_email + '

    ') - author_commit_info_span = $('', { - class: 'commits' - }) - author_commit_info = @format_author_commit_info(author) - author_commit_info_span.html(author_commit_info) - list_item.append(author_name) - list_item.append(author_email) - list_item.append(author_commit_info_span) - list_item - redraw_master: -> - total_data = ContributorsStatGraphUtil.get_total_data(@parsed_log, @field) - @master_graph.set_data(total_data) - @master_graph.redraw() - redraw_authors: -> - $("ol").html("") - x_domain = ContributorsGraph.prototype.x_domain - author_commits = ContributorsStatGraphUtil.get_author_data(@parsed_log, @field, x_domain) - _.each(author_commits, (d) => - @redraw_author_commit_info(d) - $(@authors[d.author_name].list_item).appendTo("ol") - @authors[d.author_name].set_data(d.dates) - @authors[d.author_name].redraw() - ) - set_current_field: (field) -> - @field = field - change_date_header: -> - x_domain = ContributorsGraph.prototype.x_domain - print_date_format = d3.time.format("%B %e %Y") - print = print_date_format(x_domain[0]) + " - " + print_date_format(x_domain[1]) - $("#date_header").text(print) - redraw_author_commit_info: (author) -> - author_list_item = $(@authors[author.author_name].list_item) - author_commit_info = @format_author_commit_info(author) - author_list_item.find("span").html(author_commit_info) diff --git a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee b/app/assets/javascripts/stat_graph_contributors_graph.js.coffee deleted file mode 100644 index 8b82d20c6c2..00000000000 --- a/app/assets/javascripts/stat_graph_contributors_graph.js.coffee +++ /dev/null @@ -1,167 +0,0 @@ -class @ContributorsGraph - MARGIN: - top: 20 - right: 20 - bottom: 30 - left: 50 - x_domain: null - y_domain: null - dates: [] - @set_x_domain: (data) => - @prototype.x_domain = data - @set_y_domain: (data) => - @prototype.y_domain = [0, d3.max(data, (d) -> - d.commits = d.commits ? d.additions ? d.deletions - )] - @init_x_domain: (data) => - @prototype.x_domain = d3.extent(data, (d) -> - d.date - ) - @init_y_domain: (data) => - @prototype.y_domain = [0, d3.max(data, (d) -> - d.commits = d.commits ? d.additions ? d.deletions - )] - @init_domain: (data) => - @init_x_domain(data) - @init_y_domain(data) - @set_dates: (data) => - @prototype.dates = data - set_x_domain: -> - @x.domain(@x_domain) - set_y_domain: -> - @y.domain(@y_domain) - set_domain: -> - @set_x_domain() - @set_y_domain() - create_scale: (width, height) -> - @x = d3.time.scale().range([0, width]).clamp(true) - @y = d3.scale.linear().range([height, 0]).nice() - draw_x_axis: -> - @svg.append("g").attr("class", "x axis").attr("transform", "translate(0, #{@height})") - .call(@x_axis) - draw_y_axis: -> - @svg.append("g").attr("class", "y axis").call(@y_axis) - set_data: (data) -> - @data = data - -class @ContributorsMasterGraph extends ContributorsGraph - constructor: (@data) -> - @width = $('.container').width() - 345 - @height = 200 - @x = null - @y = null - @x_axis = null - @y_axis = null - @area = null - @svg = null - @brush = null - @x_max_domain = null - process_dates: (data) -> - dates = @get_dates(data) - @parse_dates(data) - ContributorsGraph.set_dates(dates) - get_dates: (data) -> - _.pluck(data, 'date') - parse_dates: (data) -> - parseDate = d3.time.format("%Y-%m-%d").parse - data.forEach((d) -> - d.date = parseDate(d.date) - ) - create_scale: -> - super @width, @height - create_axes: -> - @x_axis = d3.svg.axis().scale(@x).orient("bottom") - @y_axis = d3.svg.axis().scale(@y).orient("left").ticks(5) - create_svg: -> - @svg = d3.select("#contributors-master").append("svg") - .attr("width", @width + @MARGIN.left + @MARGIN.right) - .attr("height", @height + @MARGIN.top + @MARGIN.bottom) - .attr("class", "tint-box") - .append("g") - .attr("transform", "translate(" + @MARGIN.left + "," + @MARGIN.top + ")") - create_area: (x, y) -> - @area = d3.svg.area().x((d) -> - x(d.date) - ).y0(@height).y1((d) -> - xa = d.commits = d.commits ? d.additions ? d.deletions - y(xa) - ).interpolate("basis") - create_brush: -> - @brush = d3.svg.brush().x(@x).on("brushend", @update_content) - draw_path: (data) -> - @svg.append("path").datum(data).attr("class", "area").attr("d", @area) - add_brush: -> - @svg.append("g").attr("class", "selection").call(@brush).selectAll("rect").attr("height", @height) - update_content: => - ContributorsGraph.set_x_domain(if @brush.empty() then @x_max_domain else @brush.extent()) - $("#brush_change").trigger('change') - draw: -> - @process_dates(@data) - @create_scale() - @create_axes() - ContributorsGraph.init_domain(@data) - @x_max_domain = @x_domain - @set_domain() - @create_area(@x, @y) - @create_svg() - @create_brush() - @draw_path(@data) - @draw_x_axis() - @draw_y_axis() - @add_brush() - redraw: -> - @process_dates(@data) - ContributorsGraph.set_y_domain(@data) - @set_y_domain() - @svg.select("path").datum(@data) - @svg.select("path").attr("d", @area) - @svg.select(".y.axis").call(@y_axis) - -class @ContributorsAuthorGraph extends ContributorsGraph - constructor: (@data) -> - @width = $('.container').width()/2 - 225 - @height = 200 - @x = null - @y = null - @x_axis = null - @y_axis = null - @area = null - @svg = null - @list_item = null - create_scale: -> - super @width, @height - create_axes: -> - @x_axis = d3.svg.axis().scale(@x).orient("bottom").ticks(8) - @y_axis = d3.svg.axis().scale(@y).orient("left").ticks(5) - create_area: (x, y) -> - @area = d3.svg.area().x((d) -> - parseDate = d3.time.format("%Y-%m-%d").parse - x(parseDate(d)) - ).y0(@height).y1((d) => - if @data[d]? then y(@data[d]) else y(0) - ).interpolate("basis") - create_svg: -> - @list_item = d3.selectAll(".person")[0].pop() - @svg = d3.select(@list_item).append("svg") - .attr("width", @width + @MARGIN.left + @MARGIN.right) - .attr("height", @height + @MARGIN.top + @MARGIN.bottom) - .attr("class", "spark") - .append("g") - .attr("transform", "translate(" + @MARGIN.left + "," + @MARGIN.top + ")") - draw_path: (data) -> - @svg.append("path").datum(data).attr("class", "area-contributor").attr("d", @area) - draw: -> - @create_scale() - @create_axes() - @set_domain() - @create_area(@x, @y) - @create_svg() - @draw_path(@dates) - @draw_x_axis() - @draw_y_axis() - redraw: -> - @set_domain() - @svg.select("path").datum(@dates) - @svg.select("path").attr("d", @area) - @svg.select(".x.axis").call(@x_axis) - @svg.select(".y.axis").call(@y_axis) diff --git a/app/assets/javascripts/stat_graph_contributors_util.js.coffee b/app/assets/javascripts/stat_graph_contributors_util.js.coffee deleted file mode 100644 index 1670f5c7bc1..00000000000 --- a/app/assets/javascripts/stat_graph_contributors_util.js.coffee +++ /dev/null @@ -1,93 +0,0 @@ -window.ContributorsStatGraphUtil = - parse_log: (log) -> - total = {} - by_author = {} - for entry in log - @add_date(entry.date, total) unless total[entry.date]? - @add_author(entry, by_author) unless by_author[entry.author_name]? - @add_date(entry.date, by_author[entry.author_name]) unless by_author[entry.author_name][entry.date] - @store_data(entry, total[entry.date], by_author[entry.author_name][entry.date]) - total = _.toArray(total) - by_author = _.toArray(by_author) - total: total, by_author: by_author - - add_date: (date, collection) -> - collection[date] = {} - collection[date].date = date - - add_author: (author, by_author) -> - by_author[author.author_name] = {} - by_author[author.author_name].author_name = author.author_name - by_author[author.author_name].author_email = author.author_email - - store_data: (entry, total, by_author) -> - @store_commits(total, by_author) - @store_additions(entry, total, by_author) - @store_deletions(entry, total, by_author) - - store_commits: (total, by_author) -> - @add(total, "commits", 1) - @add(by_author, "commits", 1) - - add: (collection, field, value) -> - collection[field] ?= 0 - collection[field] += value - - store_additions: (entry, total, by_author) -> - entry.additions ?= 0 - @add(total, "additions", entry.additions) - @add(by_author, "additions", entry.additions) - - store_deletions: (entry, total, by_author) -> - entry.deletions ?= 0 - @add(total, "deletions", entry.deletions) - @add(by_author, "deletions", entry.deletions) - - get_total_data: (parsed_log, field) -> - log = parsed_log.total - total_data = @pick_field(log, field) - _.sortBy(total_data, (d) -> - d.date - ) - pick_field: (log, field) -> - total_data = [] - _.each(log, (d) -> - total_data.push(_.pick(d, [field, 'date'])) - ) - total_data - - get_author_data: (parsed_log, field, date_range = null) -> - log = parsed_log.by_author - author_data = [] - - _.each(log, (log_entry) => - parsed_log_entry = @parse_log_entry(log_entry, field, date_range) - if not _.isEmpty(parsed_log_entry.dates) - author_data.push(parsed_log_entry) - ) - - _.sortBy(author_data, (d) -> - d[field] - ).reverse() - - parse_log_entry: (log_entry, field, date_range) -> - parsed_entry = {} - parsed_entry.author_name = log_entry.author_name - parsed_entry.author_email = log_entry.author_email - parsed_entry.dates = {} - parsed_entry.commits = parsed_entry.additions = parsed_entry.deletions = 0 - _.each(_.omit(log_entry, 'author_name', 'author_email'), (value, key) => - if @in_range(value.date, date_range) - parsed_entry.dates[value.date] = value[field] - parsed_entry.commits += value.commits - parsed_entry.additions += value.additions - parsed_entry.deletions += value.deletions - ) - return parsed_entry - - in_range: (date, date_range) -> - if date_range is null || date_range[0] <= new Date(date) <= date_range[1] - true - else - false - diff --git a/app/assets/javascripts/subscription.js.coffee b/app/assets/javascripts/subscription.js.coffee deleted file mode 100644 index 7f41616d4e7..00000000000 --- a/app/assets/javascripts/subscription.js.coffee +++ /dev/null @@ -1,17 +0,0 @@ -class @Subscription - constructor: (url) -> - $(".subscribe-button").unbind("click").click (event)=> - btn = $(event.currentTarget) - action = btn.find("span").text() - current_status = $(".subscription-status").attr("data-status") - btn.prop("disabled", true) - - $.post url, => - btn.prop("disabled", false) - status = if current_status == "subscribed" then "unsubscribed" else "subscribed" - $(".subscription-status").attr("data-status", status) - action = if status == "subscribed" then "Unsubscribe" else "Subscribe" - btn.find("span").text(action) - $(".subscription-status>div").toggleClass("hidden") - - diff --git a/app/assets/javascripts/tree.js.coffee b/app/assets/javascripts/tree.js.coffee deleted file mode 100644 index d428db5b422..00000000000 --- a/app/assets/javascripts/tree.js.coffee +++ /dev/null @@ -1,41 +0,0 @@ -class @TreeView - constructor: -> - @initKeyNav() - - # Code browser tree slider - # Make the entire tree-item row clickable, but not if clicking another link (like a commit message) - $(".tree-content-holder .tree-item").on 'click', (e) -> - if (e.target.nodeName != "A") - path = $('.tree-item-file-name a', this).attr('href') - Turbolinks.visit(path) - - # Show the "Loading commit data" for only the first element - $('span.log_loading:first').removeClass('hide') - - initKeyNav: -> - li = $("tr.tree-item") - liSelected = null - $('body').keydown (e) -> - if e.which is 40 - if liSelected - next = liSelected.next() - if next.length > 0 - liSelected.removeClass "selected" - liSelected = next.addClass("selected") - else - liSelected = li.eq(0).addClass("selected") - - $(liSelected).focus() - else if e.which is 38 - if liSelected - next = liSelected.prev() - if next.length > 0 - liSelected.removeClass "selected" - liSelected = next.addClass("selected") - else - liSelected = li.last().addClass("selected") - - $(liSelected).focus() - else if e.which is 13 - path = $('.tree-item.selected .tree-item-file-name a').attr('href') - Turbolinks.visit(path) diff --git a/app/assets/javascripts/user.js.coffee b/app/assets/javascripts/user.js.coffee deleted file mode 100644 index d0d81f96921..00000000000 --- a/app/assets/javascripts/user.js.coffee +++ /dev/null @@ -1,4 +0,0 @@ -class @User - constructor: -> - $('.profile-groups-avatars').tooltip("placement": "top") - new ProjectsList() diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee deleted file mode 100644 index aeeed9ca3cc..00000000000 --- a/app/assets/javascripts/users_select.js.coffee +++ /dev/null @@ -1,117 +0,0 @@ -class @UsersSelect - constructor: -> - @usersPath = "/autocomplete/users.json" - @userPath = "/autocomplete/users/:id.json" - - $('.ajax-users-select').each (i, select) => - @projectId = $(select).data('project-id') - @groupId = $(select).data('group-id') - showNullUser = $(select).data('null-user') - showAnyUser = $(select).data('any-user') - showEmailUser = $(select).data('email-user') - firstUser = $(select).data('first-user') - - $(select).select2 - placeholder: "Search for a user" - multiple: $(select).hasClass('multiselect') - minimumInputLength: 0 - query: (query) => - @users query.term, (users) => - data = { results: users } - - if query.term.length == 0 - if firstUser - # Move current user to the front of the list - for obj, index in data.results - if obj.username == firstUser - data.results.splice(index, 1) - data.results.unshift(obj) - break - - if showNullUser - nullUser = { - name: 'Unassigned', - avatar: null, - username: 'none', - id: 0 - } - data.results.unshift(nullUser) - - if showAnyUser - anyUser = { - name: 'Any', - avatar: null, - username: 'none', - id: null - } - data.results.unshift(anyUser) - - if showEmailUser && data.results.length == 0 && query.term.match(/^[^@]+@[^@]+$/) - emailUser = { - name: "Invite \"#{query.term}\"", - avatar: null, - username: query.term, - id: query.term - } - data.results.unshift(emailUser) - - query.callback(data) - - initSelection: (element, callback) => - id = $(element).val() - if id != "" && id != "0" - @user(id, callback) - - formatResult: (args...) => - @formatResult(args...) - formatSelection: (args...) => - @formatSelection(args...) - dropdownCssClass: "ajax-users-dropdown" - escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results - m - - formatResult: (user) -> - if user.avatar_url - avatar = user.avatar_url - else - avatar = gon.default_avatar_url - - "
    -
    -
    #{user.name}
    -
    #{user.username}
    -
    " - - formatSelection: (user) -> - user.name - - user: (user_id, callback) => - url = @buildUrl(@userPath) - url = url.replace(':id', user_id) - - $.ajax( - url: url - dataType: "json" - ).done (user) -> - callback(user) - - # Return users list. Filtered by query - # Only active users retrieved - users: (query, callback) => - url = @buildUrl(@usersPath) - - $.ajax( - url: url - data: - search: query - per_page: 20 - active: true - project_id: @projectId - group_id: @groupId - dataType: "json" - ).done (users) -> - callback(users) - - buildUrl: (url) -> - url = gon.relative_url_root + url if gon.relative_url_root? - return url diff --git a/app/assets/javascripts/wikis.js.coffee b/app/assets/javascripts/wikis.js.coffee deleted file mode 100644 index 66757565d3a..00000000000 --- a/app/assets/javascripts/wikis.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -class @Wikis - constructor: -> - $('.build-new-wiki').bind "click", -> - field = $('#new_wiki_path') - slug = field.val() - path = field.attr('data-wikis-path') - - if(slug.length > 0) - location.href = path + "/" + slug diff --git a/app/assets/javascripts/zen_mode.js.coffee b/app/assets/javascripts/zen_mode.js.coffee deleted file mode 100644 index 0fb8f7ed75f..00000000000 --- a/app/assets/javascripts/zen_mode.js.coffee +++ /dev/null @@ -1,67 +0,0 @@ -class @ZenMode - @fullscreen_prefix = 'fullscreen_' - - constructor: -> - @active_zen_area = null - @active_checkbox = null - @scroll_position = 0 - - $(window).scroll => - if not @active_checkbox - @scroll_position = window.pageYOffset - - $('body').on 'click', '.zen-enter-link', (e) => - e.preventDefault() - $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', true) - - $('body').on 'click', '.zen-leave-link', (e) => - e.preventDefault() - $(e.currentTarget).closest('.zennable').find('.zen-toggle-comment').prop('checked', false) - - $('body').on 'change', '.zen-toggle-comment', (e) => - checkbox = e.currentTarget - if checkbox.checked - # Disable other keyboard shortcuts in ZEN mode - Mousetrap.pause() - @udpateActiveZenArea(checkbox) - else - @exitZenMode() - - $(document).on 'keydown', (e) => - if e.keyCode is $.ui.keyCode.ESCAPE - @exitZenMode() - e.preventDefault() - - $(window).on 'hashchange', @updateZenModeFromLocationHash - - udpateActiveZenArea: (checkbox) => - @active_checkbox = $(checkbox) - @active_checkbox.prop('checked', true) - @active_zen_area = @active_checkbox.parent().find('textarea') - @active_zen_area.focus() - window.location.hash = ZenMode.fullscreen_prefix + @active_checkbox.prop('id') - - exitZenMode: => - if @active_zen_area isnt null - Mousetrap.unpause() - @active_checkbox.prop('checked', false) - @active_zen_area = null - @active_checkbox = null - window.location.hash = '' - window.scrollTo(window.pageXOffset, @scroll_position) - # Enable dropzone when leaving ZEN mode - Dropzone.forElement('.div-dropzone').enable() - - checkboxFromLocationHash: (e) -> - id = $.trim(window.location.hash.replace('#' + ZenMode.fullscreen_prefix, '')) - if id - return $('.zennable input[type=checkbox]#' + id)[0] - else - return null - - updateZenModeFromLocationHash: (e) => - checkbox = @checkboxFromLocationHash() - if checkbox - @udpateActiveZenArea(checkbox) - else - @exitZenMode() diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss deleted file mode 100644 index 015ff2ce4ec..00000000000 --- a/app/assets/stylesheets/application.scss +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This is a manifest file that'll automatically include all the stylesheets available in this directory - * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at - * the top of the compiled file, but it's generally better to create a new file per style scope. - *= require jquery.ui.datepicker - *= require jquery.ui.autocomplete - *= require jquery.atwho - *= require select2 - *= require_self - *= require dropzone/basic - *= require cal-heatmap -*/ - - -@import "base/variables"; -@import "base/mixins"; -@import "base/layout"; - - -/** - * Customized Twitter bootstrap - */ -@import 'base/gl_variables'; -@import 'base/gl_bootstrap'; - -/** - * NProgress load bar css - */ -@import 'nprogress'; -@import 'nprogress-bootstrap'; - -/** - * Font icons - * - */ -@import "font-awesome"; - -/** - * Generic css (forms, nav etc): - */ -@import "generic/*"; - -/** - * Page specific styles (issues, projects etc): - */ - -@import "pages/*"; - -/** - * Code highlight - */ -@import "highlight/*"; - -/** - * UI themes: - */ -@import "themes/*"; - -/** - * Styles for JS behaviors. - */ -@import "behaviors.scss"; diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss deleted file mode 100644 index 62a3eade5c7..00000000000 --- a/app/assets/stylesheets/base/gl_bootstrap.scss +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Twitter bootstrap with GitLab customizations/additions - * - */ - -// Core variables and mixins -@import "bootstrap/variables"; -@import "bootstrap/mixins"; - -// Reset -@import "bootstrap/normalize"; -@import "bootstrap/print"; - -// Core CSS -@import "bootstrap/scaffolding"; -@import "bootstrap/type"; -@import "bootstrap/code"; -@import "bootstrap/grid"; -@import "bootstrap/tables"; -@import "bootstrap/forms"; -@import "bootstrap/buttons"; - -// Components -@import "bootstrap/component-animations"; -@import "bootstrap/dropdowns"; -@import "bootstrap/button-groups"; -@import "bootstrap/input-groups"; -@import "bootstrap/navs"; -@import "bootstrap/navbar"; -@import "bootstrap/breadcrumbs"; -@import "bootstrap/pagination"; -@import "bootstrap/pager"; -@import "bootstrap/labels"; -@import "bootstrap/badges"; -@import "bootstrap/jumbotron"; -@import "bootstrap/thumbnails"; -@import "bootstrap/alerts"; -@import "bootstrap/progress-bars"; -@import "bootstrap/list-group"; -@import "bootstrap/wells"; -@import "bootstrap/close"; -@import "bootstrap/panels"; - -// Components w/ JavaScript -@import "bootstrap/modals"; -@import "bootstrap/tooltip"; -@import "bootstrap/popovers"; -@import "bootstrap/carousel"; - -// Utility classes -.clearfix { - @include clearfix(); -} -.center-block { - @include center-block(); -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - @include text-hide(); -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; -} - -@import "bootstrap/responsive-utilities"; - -// Labels -.label { - padding: 2px 4px; - font-size: 12px; - font-style: normal; - font-weight: normal; - display: inline-block; - - &.label-gray { - background-color: #eee; - color: #999; - text-shadow: none; - } - - &.label-inverse { - background-color: #333333; - } -} - -// Nav tabs -.nav.nav-tabs { - margin-bottom: 15px; - - li { - > a { - margin-right: 5px; - line-height: 20px; - border-color: #EEE; - color: #888; - border-bottom: 1px solid #ddd; - .badge { - background-color: #eee; - color: #888; - text-shadow: 0 1px 1px #fff; - } - i[class~="fa"] { - line-height: 14px; - } - } - &.active { - > a { - border-color: #CCC; - border-bottom: 1px solid #fff; - color: #333; - font-weight: bold; - } - } - } -} - -.nav-tabs > li > a, -.nav-pills > li > a { - color: #666; -} - -/** - * fix to keep tooltips position in top navigation bar - * - */ -.navbar .nav > li { - position: relative; - white-space: nowrap; -} - -/** - * Add some extra stuff to panels - * - */ -.panel { - .panel-heading { - font-weight: bold; - - .panel-head-actions { - position: relative; - top: -5px; - float: right; - } - } - - .panel-body { - form { - margin: 0; - } - - .form-actions { - margin: -15px; - margin-top: 18px; - } - } - - .panel-footer { - .pagination { - margin: 0; - } - } - - &.panel-small { - .panel-heading { - padding: 6px 15px; - font-size: 13px; - font-weight: normal; - a { - color: #777; - } - } - } -} - -.panel-succes .panel-heading, -.panel-info .panel-heading, -.panel-danger .panel-heading, -.panel-warning .panel-heading, -.panel-primary .panel-heading, -.alert { - a:not(.btn) { - @extend .alert-link; - color: #fff; - text-decoration: underline; - } -} - -// Typography ================================================================= - -.text-primary, -.text-primary:hover { - color: $brand-primary; -} - -.text-success, -.text-success:hover { - color: $brand-success; -} - -.text-danger, -.text-danger:hover { - color: $brand-danger; -} - -.text-warning, -.text-warning:hover { - color: $brand-warning; -} - -.text-info, -.text-info:hover { - color: $brand-info; -} - -// Tables ===================================================================== - -table.table { - .dropdown-menu a { - text-decoration: none; - } - - .success, - .warning, - .danger, - .info { - color: #fff; - - a:not(.btn) { - text-decoration: underline; - color: #fff; - } - } -} diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss deleted file mode 100644 index 56f4c794e1b..00000000000 --- a/app/assets/stylesheets/base/gl_variables.scss +++ /dev/null @@ -1,133 +0,0 @@ -// Override Bootstrap variables here (defaults from bootstrap-sass v3.3.3): -// For all variables see https://github.com/twbs/bootstrap-sass/blob/master/templates/project/_bootstrap-variables.sass -// -// Variables -// -------------------------------------------------- - - -//== Colors -// -//## Gray and brand colors for use across Bootstrap. - -// $gray-base: #000 -// $gray-darker: lighten($gray-base, 13.5%) // #222 -// $gray-dark: lighten($gray-base, 20%) // #333 -// $gray: lighten($gray-base, 33.5%) // #555 -// $gray-light: lighten($gray-base, 46.7%) // #777 -// $gray-lighter: lighten($gray-base, 93.5%) // #eee - -$brand-primary: $gl-primary; -$brand-success: $gl-success; -$brand-info: $gl-info; -$brand-warning: $gl-warning; -$brand-danger: $gl-danger; - - -//== Scaffolding -// -$text-color: $gl-text-color; -$link-color: $gl-link-color; - - -//== Typography -// -//## Font, line-height, and color for body text, headings, and more. - -$font-family-sans-serif: $regular_font; -$font-family-monospace: $monospace_font; -$font-size-base: $gl-font-size; - - -//== Components -// -//## 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; - - -//== Forms -// -//## - -$input-color: $text-color; -$input-border: #DDD; -$input-border-focus: $brand-info; -$legend-color: $text-color; - - -//== Pagination -// -//## - -$pagination-color: #fff; -$pagination-bg: $brand-success; -$pagination-border: transparent; - -$pagination-hover-color: #fff; -$pagination-hover-bg: darken($brand-success, 15%); -$pagination-hover-border: transparent; - -$pagination-active-color: #fff; -$pagination-active-bg: darken($brand-success, 15%); -$pagination-active-border: transparent; - -$pagination-disabled-color: #b4bcc2; -$pagination-disabled-bg: lighten($brand-success, 15%); -$pagination-disabled-border: transparent; - - -//== Form states and alerts -// -//## Define colors for form feedback states and, by default, alerts. - -$state-success-text: #fff; -$state-success-bg: $brand-success; -$state-success-border: $brand-success; - -$state-info-text: #fff; -$state-info-bg: $brand-info; -$state-info-border: $brand-info; - -$state-warning-text: #fff; -$state-warning-bg: $brand-warning; -$state-warning-border: $brand-warning; - -$state-danger-text: #fff; -$state-danger-bg: $brand-danger; -$state-danger-border: $brand-danger; - - -//== Alerts -// -//## Define alert colors, border radius, and padding. - -$alert-border-radius: 0; - - -//== Panels -// -//## - -$panel-border-radius: 0; -$panel-default-text: $text-color; -$panel-default-border: $border-color; -$panel-default-heading-bg: $background-color; - - -//== Wells -// -//## - -$well-bg: #F9F9F9; -$well-border: #EEE; - -//== Code -// -//## - -$code-color: #c7254e; -$code-bg: #f9f2f4; - -$kbd-color: #fff; -$kbd-bg: #333; diff --git a/app/assets/stylesheets/base/layout.scss b/app/assets/stylesheets/base/layout.scss deleted file mode 100644 index 62c11b06368..00000000000 --- a/app/assets/stylesheets/base/layout.scss +++ /dev/null @@ -1,22 +0,0 @@ -html { - overflow-y: scroll; - - &.touch .tooltip { display: none !important; } - - body { - padding-top: 46px; - } -} - -.container { - padding-top: 0; - z-index: 5; -} - -.container .content { - margin: 0 0; -} - -.navless-container { - margin-top: 30px; -} diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss deleted file mode 100644 index 216f25cdcd5..00000000000 --- a/app/assets/stylesheets/base/mixins.scss +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Generic mixins - */ - @mixin box-shadow($shadow) { - -webkit-box-shadow: $shadow; - -moz-box-shadow: $shadow; - -ms-box-shadow: $shadow; - -o-box-shadow: $shadow; - box-shadow: $shadow; -} - -@mixin border-radius($radius) { - -webkit-border-radius: $radius; - -moz-border-radius: $radius; - -ms-border-radius: $radius; - -o-border-radius: $radius; - border-radius: $radius; -} - -@mixin border-radius-left($radius) { - @include border-radius($radius 0 0 $radius) -} - -@mixin linear-gradient($from, $to) { - background-image: -webkit-gradient(linear, 0 0, 0 100%, from($from), to($to)); - background-image: -webkit-linear-gradient($from, $to); - background-image: -moz-linear-gradient($from, $to); - background-image: -ms-linear-gradient($from, $to); - background-image: -o-linear-gradient($from, $to); -} - -@mixin transition($transition) { - -webkit-transition: $transition; - -moz-transition: $transition; - -ms-transition: $transition; - -o-transition: $transition; - transition: $transition; -} - -/** - * Prefilled mixins - * Mixins with fixed values - */ - -@mixin shade { - @include box-shadow(0 0 3px #ddd); -} - -@mixin solid-shade { - @include box-shadow(0 0 0 3px #f1f1f1); -} - -@mixin header-font { - color: $style_color; - font-size: 16px; - line-height: 44px; - font-weight: normal; -} - -@mixin md-typography { - font-size: 15px; - line-height: 1.5; - - img { - max-width: 100%; - } - - *:first-child { - margin-top: 0; - } - - code { - font-family: $monospace_font; - white-space: pre; - word-wrap: normal; - padding: 0; - } - - h1 { - margin-top: 45px; - font-size: 2.5em; - } - - h2 { - margin-top: 40px; - font-size: 2em; - } - - h3 { - margin-top: 35px; - font-size: 1.5em; - } - - h4 { - margin-top: 30px; - font-size: 1.2em; - } - - blockquote p { - color: #888; - font-size: 15px; - line-height: 1.5; - } - - table { - @extend .table; - @extend .table-bordered; - th { - background: #EEE; - } - } - - p > code { - font-size: inherit; - font-weight: inherit; - color: #555; - } - - li { - line-height: 1.5; - } - - a[href*="/uploads/"], a[href*="storage.googleapis.com/google-code-attachments/"] { - &:before { - margin-right: 4px; - - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - content: "\f0c6"; - } - - &:hover:before { - text-decoration: none; - } - } -} - -@mixin str-truncated($max_width: 82%) { - display: inline-block; - overflow: hidden; - text-overflow: ellipsis; - vertical-align: top; - white-space: nowrap; - max-width: $max_width; -} diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss deleted file mode 100644 index 596376c3970..00000000000 --- a/app/assets/stylesheets/base/variables.scss +++ /dev/null @@ -1,34 +0,0 @@ -$style_color: #474D57; -$hover: #FFF3EB; -$gl-text-color: #222222; -$gl-link-color: #446e9b; -$nprogress-color: #c0392b; -$gl-font-size: 14px; -$list-font-size: 15px; -$sidebar_width: 230px; -$avatar_radius: 50%; -$code_font_size: 13px; -$code_line_height: 1.5; -$border-color: #E5E5E5; -$background-color: #f5f5f5; - -/* - * State colors: - */ -$gl-primary: #446e9b; -$gl-success: #019875; -$gl-info: #029ACF; -$gl-warning: #EB9532; -$gl-danger: #d9534f; - -/* - * Commit Diff Colors - */ -$added: #63c363; -$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; diff --git a/app/assets/stylesheets/behaviors.scss b/app/assets/stylesheets/behaviors.scss deleted file mode 100644 index 469f4f296ae..00000000000 --- a/app/assets/stylesheets/behaviors.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Details -//-------- -.js-details-container { - .content { - display: none; - &.hide { display: block; } - } - &.open .content { - display: block; - &.hide { display: none; } - } -} - -// Toggle between two states. -.js-toggler-container { - .turn-on { display: block; } - .turn-off { display: none; } - &.on { - .turn-on { display: none; } - .turn-off { display: block; } - } -} diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss deleted file mode 100644 index 8595887c3b9..00000000000 --- a/app/assets/stylesheets/generic/avatar.scss +++ /dev/null @@ -1,42 +0,0 @@ -.avatar { - float: left; - margin-right: 12px; - width: 40px; - height: 40px; - padding: 0; - @include border-radius($avatar_radius); - - &.avatar-inline { - float: none; - margin-left: 4px; - margin-bottom: 2px; - - &.s16 { margin-right: 4px; } - &.s24 { margin-right: 4px; } - } - - &.group-avatar, &.project-avatar, &.avatar-tile { - @include border-radius(0px); - } - - &.s16 { width: 16px; height: 16px; margin-right: 6px; } - &.s24 { width: 24px; height: 24px; margin-right: 8px; } - &.s26 { width: 26px; height: 26px; margin-right: 8px; } - &.s32 { width: 32px; height: 32px; margin-right: 10px; } - &.s60 { width: 60px; height: 60px; margin-right: 12px; } - &.s90 { width: 90px; height: 90px; margin-right: 15px; } - &.s160 { width: 160px; height: 160px; margin-right: 20px; } -} - -.identicon { - text-align: center; - vertical-align: top; - - &.s16 { font-size: 12px; line-height: 1.33; } - &.s24 { font-size: 14px; line-height: 1.8; } - &.s26 { font-size: 20px; line-height: 1.33; } - &.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; } -} diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss deleted file mode 100644 index 3536a68f416..00000000000 --- a/app/assets/stylesheets/generic/blocks.scss +++ /dev/null @@ -1,19 +0,0 @@ -.light-well { - background: #f9f9f9; - padding: 15px; -} - -.centered-light-block { - text-align: center; - color: #888; - margin: 20px; -} - -.nothing-here-block { - text-align: center; - padding: 20px; - color: #666; - font-weight: normal; - font-size: 16px; - line-height: 36px; -} diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss deleted file mode 100644 index cd6bf64c0ae..00000000000 --- a/app/assets/stylesheets/generic/buttons.scss +++ /dev/null @@ -1,74 +0,0 @@ -.btn { - @extend .btn-default; - - &.btn-new { - @extend .btn-success; - } - - &.btn-create { - @extend .btn-success; - } - - &.btn-save { - @extend .btn-primary; - } - - &.btn-remove { - @extend .btn-danger; - } - - &.btn-cancel { - float: right; - } - - &.btn-close { - color: $gl-danger; - border-color: $gl-danger; - &:hover { - color: #B94A48; - } - } - - &.btn-reopen { - color: $gl-success; - border-color: $gl-success; - &:hover { - color: #468847; - } - } - - &.btn-grouped { - margin-right: 7px; - float: left; - &:last-child { - margin-right: 0px; - } - } - - &.btn-save { - @extend .btn-primary; - } - - &.btn-new, &.btn-create { - @extend .btn-success; - } -} - -.btn-block { - width: 100%; - margin: 0; - margin-bottom: 15px; - &.btn { - padding: 6px 0; - } -} - -.btn-group { - &.btn-grouped { - margin-right: 7px; - float: left; - &:last-child { - margin-right: 0px; - } - } -} diff --git a/app/assets/stylesheets/generic/calendar.scss b/app/assets/stylesheets/generic/calendar.scss deleted file mode 100644 index a36fefe22c5..00000000000 --- a/app/assets/stylesheets/generic/calendar.scss +++ /dev/null @@ -1,90 +0,0 @@ -.user-calendar-activities { - .calendar_onclick_hr { - padding: 0; - margin: 10px 0; - } - - .str-truncated { - max-width: 70%; - } - - .text-expander { - background: #eee; - color: #555; - padding: 0 5px; - cursor: pointer; - margin-left: 4px; - &:hover { - background-color: #ddd; - } - } -} -/** -* This overwrites the default values of the cal-heatmap gem -*/ -.calendar { - .qi { - background-color: #999; - fill: #fff; - } - - .q1 { - background-color: #dae289; - fill: #ededed; - } - - .q2 { - background-color: #cedb9c; - fill: #ACD5F2; - } - - .q3 { - background-color: #b5cf6b; - fill: #7FA8D1; - } - - .q4 { - background-color: #637939; - fill: #49729B; - } - - .q5 { - background-color: #3b6427; - fill: #254E77; - } - - .domain-background { - fill: none; - shape-rendering: crispedges; - } - - .ch-tooltip { - position: absolute; - display: none; - margin-top: 22px; - margin-left: 1px; - font-size: 13px; - padding: 3px; - font-weight: 550; - background-color: #222; - span { - position: absolute; - width: 200px; - text-align: center; - visibility: hidden; - border-radius: 10px; - &:after { - content: ''; - position: absolute; - top: 100%; - left: 50%; - margin-left: -8px; - width: 0; - height: 0; - border-top: 8px solid #000000; - border-right: 8px solid transparent; - border-left: 8px solid transparent; - } - } - } -} diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss deleted file mode 100644 index 7c3021989a8..00000000000 --- a/app/assets/stylesheets/generic/common.scss +++ /dev/null @@ -1,376 +0,0 @@ -/** COLORS **/ -.cgray { color: gray } -.clgray { color: #BBB } -.cred { color: #D12F19 } -.cgreen { color: #4a2 } -.cdark { color: #444 } - -/** COMMON CLASSES **/ -.prepend-top-10 { margin-top:10px } -.prepend-top-20 { margin-top:20px } -.prepend-left-10 { margin-left:10px } -.prepend-left-20 { margin-left:20px } -.append-right-10 { margin-right:10px } -.append-right-20 { margin-right:20px } -.append-bottom-10 { margin-bottom:10px } -.append-bottom-15 { margin-bottom:15px } -.append-bottom-20 { margin-bottom:20px } -.inline { display: inline-block } -.center { text-align: center } - -.underlined-link { text-decoration: underline; } -.hint { font-style: italic; color: #999; } -.light { color: #888 } - -.slead { - color: #666; - font-size: 15px; - margin-bottom: 12px; - font-weight: normal; - line-height: 24px; -} - -.tab-content { - overflow: visible; -} - -pre { - &.clean { - background: none; - border: none; - margin: 0; - padding: 0; - } - - &.well-pre { - border: 1px solid #EEE; - background: #f9f9f9; - border-radius: 0; - color: #555; - } -} - -.dropdown-menu > li > a { - text-shadow: none; -} - -.dropdown-menu-align-right { - left: auto; - right: 0px; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background: $gl-primary; - color: #FFF -} - -.str-truncated { - @include str-truncated; -} - -/** FLASH message **/ -.author_link { - color: $gl-link-color; -} - -.help li { color:$style_color; } - -.back-link { - font-size: 14px; -} - -table a code { - position: relative; - top: -2px; - margin-right: 3px; -} - -.loading { - margin: 20px auto; - height: 40px; - color: #555; - font-size: 32px; - text-align: center; -} - -span.update-author { - display: block; - color: #999; - font-weight: normal; - font-style: italic; - strong { - font-weight: bold; - font-style: normal; - } -} - -.user-mention { - color: #2FA0BB; - font-weight: bold; -} - -.field_with_errors { - display: inline; -} - -.line_holder { - &:hover { - td { - background: #FFFFCF !important; - } - } -} - -p.time { - color: #999; - font-size: 90%; - margin: 30px 3px 3px 2px; -} - -.highlight { - text-shadow: none; -} - -.highlight_word { - background: #fafe3d; -} - -.thin_area{ - height: 150px; -} - -// Fixes alignment on notes. -.new_note { - label { - text-align: left; - } -} - -// Fix issue with notes & lists creating a bunch of bottom borders. -li.note { - img { max-width:100% } - .note-title { - li { - border-bottom:none !important; - } - } -} - -.markdown { - img { - max-width: 100%; - } -} - -.wiki_content code, .readme code{ - background-color: inherit; -} - -.project_member_show { - td:first-child { - color: #aaa; - } -} - -.rss-icon { - img { - width: 24px; - vertical-align: top; - } - - strong { - line-height: 24px; - } -} - -.supp_diff_link, -.show-all-commits { - cursor: pointer; -} - -.git_error_tips { - @extend .col-md-6; - text-align: left; - margin-top: 40px; - pre { - background: white; - border: none; - font-size: 12px; - } -} - -.error-message { - padding: 10px; - background: #C67; - margin: 0; - color: #FFF; - - a { - color: #fff; - text-decoration: underline; - } -} - -.browser-alert { - padding: 10px; - text-align: center; - background: #C67; - color: #fff; - font-weight: bold; - a { - color: #fff; - text-decoration: underline; - } -} - -.warning_message { - border-left: 4px solid #ed9; - color: #b90; - padding: 10px; - margin-bottom: 10px; - background: #ffffe6; - padding-left: 20px; - - &.centered { - text-align: center; - } -} - -.gitlab-promo { - a { - color: #aaa; - margin-right: 30px; - } -} - -.milestone { - &.milestone-closed { - background: #f9f9f9; - } - .progress { - margin-bottom: 0; - margin-top: 4px; - } -} - -.control-group { - .controls { - span { - &.descr { - position: relative; - top: 2px; - left: 5px; - color: #666; - } - } - } -} - -img.emoji { - height: 20px; - vertical-align: middle; - width: 20px; -} - -.chart { - overflow: hidden; - height: 220px; -} - -.description-block { - @extend .light-well; - @extend .light; - margin-bottom: 10px; -} - -table { - td.permission-x { - background: #D9EDF7 !important; - text-align: center; - } -} - -.dashboard-intro-icon { - float: left; - text-align: center; - font-size: 32px; - color: #AAA; - width: 60px; -} - -.dashboard-intro-text { - display: inline-block; - margin-left: -60px; - padding-left: 60px; - width: 100%; -} - -.btn-sign-in { - margin-top: 5px; - text-shadow: none; -} - -.side-filters { - fieldset { - margin-bottom: 15px; - } -} - -.wiki .highlight, .note-body .highlight { - margin-bottom: 9px; -} - -.wiki .code { - overflow-x: auto; -} - -.footer-links { - margin-bottom: 20px; - a { - margin-right: 15px; - } -} - -.search_box { - position: relative; - padding: 30px; - text-align: center; - background-color: #F9F9F9; - border: 1px solid #DDDDDD; - border-radius: 0px; -} - -.search_glyph { - color: #555; - font-size: 42px; -} - -.task-status { - margin-left: 10px; -} - -#nprogress .spinner { - top: auto !important; - bottom: 20px !important; - left: 20px !important; -} - -.header-with-avatar { - h3 { - margin: 0; - font-weight: bold; - } - - .username { - font-size: 18px; - color: #666; - margin-top: 8px; - } - - .description { - font-size: 16px; - color: #666; - margin-top: 8px; - } -} diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss deleted file mode 100644 index 8014dcb165b..00000000000 --- a/app/assets/stylesheets/generic/files.scss +++ /dev/null @@ -1,145 +0,0 @@ -/** - * File content holder - * - */ -.file-holder { - border: 1px solid $border-color; - margin-bottom: 1em; - - table { - @extend .table; - } - - .file-title { - position: relative; - background: $background-color; - border-bottom: 1px solid $border-color; - text-shadow: 0 1px 1px #fff; - margin: 0; - text-align: left; - padding: 10px 15px; - - .file-actions { - float: right; - position: absolute; - top: 5px; - right: 15px; - - .btn { - padding: 0px 10px; - font-size: 13px; - line-height: 28px; - } - } - - .left-options { - margin-top: -3px; - } - } - .file-content { - background: #fff; - - &.image_file { - background: #eee; - text-align: center; - img { - padding: 100px; - max-width: 50%; - } - } - - &.wiki { - padding: 25px; - - .highlight { - margin-bottom: 9px; - - > pre { - margin: 0; - } - } - } - - &.blob_file { - - } - - &.blob-no-preview { - background: #eee; - text-shadow: 0 1px 2px #FFF; - padding: 100px 0; - } - - /** - * Blame file - */ - &.blame { - table { - border: none; - box-shadow: none; - margin: 0; - } - tr { - border-bottom: 1px solid #eee; - } - td { - &:first-child { - border-left: none; - } - &:last-child { - border-right: none; - } - background: #fff; - padding: 5px; - } - .author, - .blame_commit { - background: $background-color; - vertical-align: top; - } - .lines { - pre { - padding: 0; - margin: 0; - background: none; - border: none; - } - } - } - - &.logs { - background: #eee; - max-height: 700px; - overflow-y: auto; - - ol { - margin-left: 40px; - padding: 10px 0; - border-left: 1px solid $border-color; - margin-bottom: 0; - background: white; - li { - color: #888; - p { - margin: 0; - color: #333; - line-height: 24px; - padding-left: 10px; - } - - &:hover { - background: $hover; - } - } - } - } - - /** - * Code file - */ - &.code { - padding: 0; - } - } -} - diff --git a/app/assets/stylesheets/generic/filters.scss b/app/assets/stylesheets/generic/filters.scss deleted file mode 100644 index bd93a79722d..00000000000 --- a/app/assets/stylesheets/generic/filters.scss +++ /dev/null @@ -1,55 +0,0 @@ -.filter-item { - 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 { - select, .select2-container { - width: 120px !important; - display: inline-block; - } - } -} - -@media (min-width: 1200px) { - .issues-filters, - .issues_bulk_update { - select, .select2-container { - width: 150px !important; - display: inline-block; - } - } -} - -.issues-filters, -.issues_bulk_update { - .select2-container .select2-choice { - color: #444 !important; - } -} diff --git a/app/assets/stylesheets/generic/flash.scss b/app/assets/stylesheets/generic/flash.scss deleted file mode 100644 index 82eb50ad4be..00000000000 --- a/app/assets/stylesheets/generic/flash.scss +++ /dev/null @@ -1,17 +0,0 @@ -.flash-container { - cursor: pointer; - margin: 0; - font-size: 14px; - width: 100%; - z-index: 100; - - .flash-notice { - @extend .alert; - @extend .alert-info; - } - - .flash-alert { - @extend .alert; - @extend .alert-danger; - } -} diff --git a/app/assets/stylesheets/generic/forms.scss b/app/assets/stylesheets/generic/forms.scss deleted file mode 100644 index 266041403e0..00000000000 --- a/app/assets/stylesheets/generic/forms.scss +++ /dev/null @@ -1,95 +0,0 @@ -textarea { - resize: vertical; -} - -input[type='search'].search-text-input { - background-image: image-url("icon-search.png"); - background-repeat: no-repeat; - background-position: 10px; - padding-left: 25px; -} - -input[type='text'].danger { - background: #F2DEDE!important; - border-color: #D66; - text-shadow: 0 1px 1px #fff -} - -.datetime-controls { - select { - width: 100px; - } -} - -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: $background-color; - border-top: 1px solid $border-color; -} - -@media (min-width: $screen-sm-min) { - .form-actions { - padding-left: 17%; - } -} - -label { - &.control-label { - @extend .col-sm-2; - } - - &.inline-label { - margin: 0; - } -} - -.inline-input-group { - width: 250px; -} - -.input-mx-250 { - max-width: 250px; -} - -.input-mn-300 { - min-width: 300px; -} - -.custom-form-control { - width: 150px; -} - -@media (min-width: $screen-sm-min) { - .custom-form-control { - width: 150px; - } -} - -/* Medium devices (desktops, 992px and up) */ -@media (min-width: $screen-md-min) { - .custom-form-control { - width: 170px; - } -} - -/* Large devices (large desktops, 1200px and up) */ -@media (min-width: $screen-lg-min) { - .custom-form-control { - width: 200px; - } -} - -.fieldset-form fieldset { - margin-bottom: 20px; -} - -.form-control { - @include box-shadow(none); -} - -.issuable-description, -.wiki-content { - margin-top: 35px; -} diff --git a/app/assets/stylesheets/generic/gfm.scss b/app/assets/stylesheets/generic/gfm.scss deleted file mode 100644 index 8fac5e534fa..00000000000 --- a/app/assets/stylesheets/generic/gfm.scss +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Styles that apply to all GFM related forms. - */ -.issue-form, .merge-request-form, .wiki-form { - .description { - height: 16em; - border-top-left-radius: 0; - } -} - -.wiki-form { - .description { - height: 26em; - } -} - -.milestone-form { - .description { - height: 14em; - } -} diff --git a/app/assets/stylesheets/generic/highlight.scss b/app/assets/stylesheets/generic/highlight.scss deleted file mode 100644 index 2e13ee842e0..00000000000 --- a/app/assets/stylesheets/generic/highlight.scss +++ /dev/null @@ -1,70 +0,0 @@ -.file-content.code { - border: none; - box-shadow: none; - margin: 0px; - padding: 0px; - table-layout: fixed; - - pre { - padding: 10px; - border: none; - border-radius: 0; - font-family: $monospace_font; - font-size: $code_font_size !important; - line-height: $code_line_height !important; - margin: 0; - overflow: auto; - overflow-y: hidden; - white-space: pre; - word-wrap: normal; - - code { - font-family: $monospace_font; - white-space: pre; - word-wrap: normal; - padding: 0; - - .line { - display: inline; - } - } - } - - .line-numbers { - padding: 10px; - text-align: right; - float: left; - - a { - font-family: $monospace_font; - display: block; - font-size: $code_font_size !important; - line-height: $code_line_height !important; - white-space: nowrap; - - i { - visibility: hidden; - @extend .pull-left; - } - - &:hover i { - visibility: visible; - } - } - } -} - -.note-text .code { - border: none; - box-shadow: none; - background: $background-color; - padding: 1em; - overflow-x: auto; - - code { - font-family: $monospace_font; - white-space: pre; - word-wrap: normal; - padding: 0; - } -} diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss deleted file mode 100644 index 9558f241b7c..00000000000 --- a/app/assets/stylesheets/generic/issue_box.scss +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Issue box for showing Open/Closed state: - * Used for Issue#show page, MergeRequest#show page etc - * - */ - -.issue-box { - display: inline-block; - padding: 7px 13px; - font-weight: normal; - margin-right: 5px; - - &.issue-box-closed { - background-color: $gl-danger; - color: #FFF; - } - - &.issue-box-merged { - background-color: $gl-primary; - color: #FFF; - } - - &.issue-box-open { - background-color: $gl-success; - color: #FFF; - } - - &.issue-box-expired { - background: #cea61b; - color: #FFF; - } -} diff --git a/app/assets/stylesheets/generic/jquery.scss b/app/assets/stylesheets/generic/jquery.scss deleted file mode 100644 index 871b808bad4..00000000000 --- a/app/assets/stylesheets/generic/jquery.scss +++ /dev/null @@ -1,55 +0,0 @@ -.ui-widget { - font-family: $regular_font; - font-size: $font-size-base; - - &.ui-datepicker-inline { - border: 1px solid #DDD; - padding: 10px; - width: 270px; - - .ui-datepicker-header { - background: #FFF; - border-color: #DDD; - } - - .ui-datepicker-calendar td a { - padding: 5px; - text-align: center; - } - } - - &.ui-autocomplete { - border-color: #DDD; - padding: 0; - margin-top: 2px; - z-index: 1001; - - .ui-menu-item a { - padding: 4px 10px; - } - } - - .ui-state-default { - border: 1px solid #FFF; - background: #FFF; - color: #777; - } - - .ui-state-highlight { - border: 1px solid #EEE; - background: #EEE; - } - - .ui-state-active { - border: 1px solid $gl-primary; - background: $gl-primary; - color: #FFF; - } - - .ui-state-hover, - .ui-state-focus { - border: 1px solid $hover; - background: $hover; - color: #333; - } -} diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss deleted file mode 100644 index 08bf6e943d2..00000000000 --- a/app/assets/stylesheets/generic/lists.scss +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Well styled list - * - */ -.well-list { - margin: 0; - padding: 0; - list-style: none; - - li { - padding: 10px 15px; - min-height: 20px; - border-bottom: 1px solid #eee; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); - - &:after { - content: " "; - display: table; - clear: both; - } - - &.disabled { - color: #888; - } - - &.unstyled { - &:hover { - background: none; - } - } - - &.warning-row { - background-color: #fcf8e3; - border-color: #faebcc; - color: #8a6d3b; - } - - &.smoke { background-color: $background-color; } - - &:hover { - background: $hover; - border-bottom: 1px solid darken($hover, 10%); - } - - &:last-child { - border-bottom: none; - - &.bottom { - background: $background-color; - } - } - - .author { color: #999; } - - .list-item-name { - float: left; - position: relative; - top: 3px; - } - - p { - padding-top: 1px; - margin: 0; - color: $gray-dark; - img { - position: relative; - top: 3px; - } - } - - .well-title { - font-size: $list-font-size; - line-height: 18px; - } - - .row_title { - color: $gray-dark; - - &:hover { - color: $text-color; - text-decoration: underline; - } - } - } -} - -ol, ul { - &.styled { - li { - padding: 2px; - } - } -} - -/** 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; } - } - } - - &.top-list { - li:first-child { - padding-top: 0; - h4, h5 { - margin-top: 0; - } - } - } -} - -li.task-list-item { - list-style-type: none; -} diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss deleted file mode 100644 index eb39b6bb7e9..00000000000 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ /dev/null @@ -1,87 +0,0 @@ -.div-dropzone-wrapper { - .div-dropzone { - position: relative; - padding: 0; - border: 0; - margin-bottom: 5px; - - .div-dropzone-focus { - border-color: #66afe9 !important; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6) !important; - outline: 0 !important; - } - - .div-dropzone-hover { - position: absolute; - top: 50%; - left: 50%; - margin-top: -0.5em; - margin-left: -0.6em; - opacity: 0; - font-size: 50px; - transition: opacity 200ms ease-in-out; - pointer-events: none; - } - - .div-dropzone-spinner { - position: absolute; - top: 100%; - left: 100%; - margin-top: -1.1em; - margin-left: -1.1em; - opacity: 0; - font-size: 30px; - transition: opacity 200ms ease-in-out; - } - - .div-dropzone-icon { - display: block; - text-align: center; - font-size: inherit; - } - - .dz-preview { - display: none; - } - } -} - -.div-dropzone-alert { - margin-top: 5px; - margin-bottom: 0; - transition: opacity 200ms ease-in-out; -} - -.md-preview-holder { - background: #FFF; - border: 1px solid #ddd; - min-height: 100px; - padding: 5px; - box-shadow: none; -} - -.new_note, -.edit_note, -.issuable-description, -.milestone-description, -.wiki-content, -.merge-request-form { - .nav-tabs { - margin-bottom: 0; - border: none; - - li a, - li.active a { - border: 1px solid #DDD; - } - } -} - -.markdown-area { - background: #FFF; - border: 1px solid #ddd; - min-height: 100px; - padding: 5px; - box-shadow: none; - width: 100%; -} diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss deleted file mode 100644 index 71a1fc4493f..00000000000 --- a/app/assets/stylesheets/generic/mobile.scss +++ /dev/null @@ -1,69 +0,0 @@ -/** Common mobile (screen XS, SM) styles **/ -@media (max-width: $screen-xs-max) { - .container .content { - margin-top: 20px; - } - - .nav.nav-tabs > li > a { - padding: 10px; - font-size: 12px; - margin-right: 3px; - - .badge { - display: none; - } - } - - .issues-filters, - .dash-projects-filters, - .check-all-holder { - display: none; - } - - .rss-btn { - display: none !important; - } - - .project-home-links { - display: none; - } -} - -@media (max-width: $screen-sm-max) { - .issues-filters { - .milestone-filter, .labels-filter { - display: none; - } - } - - .page-title { - .note_created_ago, .new-issue-link { - display: none; - } - } - - .issue_edited_ago, .note_edited_ago { - display: none; - } - - aside { - display: none; - } - - .show-aside { - display: block !important; - } -} - -.show-aside { - display: none; - position: fixed; - right: 0px; - top: 30%; - padding: 5px 15px; - background: #EEE; - font-size: 20px; - color: #777; - z-index: 100; - @include box-shadow(0 1px 2px #DDD); -} diff --git a/app/assets/stylesheets/generic/nav_sidebar.scss b/app/assets/stylesheets/generic/nav_sidebar.scss deleted file mode 100644 index 3bcb7b81333..00000000000 --- a/app/assets/stylesheets/generic/nav_sidebar.scss +++ /dev/null @@ -1,193 +0,0 @@ -.page-with-sidebar { - background: $background-color; - - .sidebar-wrapper { - position: fixed; - top: 0; - left: 0; - height: 100%; - border-right: 1px solid $border-color; - } -} - -.sidebar-wrapper { - z-index: 99; - background: $background-color; -} - -.content-wrapper { - width: 100%; - padding: 15px; - background: #FFF; -} - -.nav-sidebar { - margin: 0; - list-style: none; - - &.navbar-collapse { - padding: 0px !important; - } -} - -.nav-sidebar li a .count { - float: right; - background: #eee; - padding: 0px 8px; - @include border-radius(6px); -} - -.nav-sidebar li { - &.active a { - color: $text-color; - background: #FFF !important; - font-weight: bold; - border: 1px solid #EEE; - border-right: 1px solid transparent; - border-left: 3px solid $style_color; - - &.no-highlight { - background: none !important; - border: none; - } - - i { - color: $text-color; - } - } -} - -.nav-sidebar li { - &.separate-item { - border-top: 1px solid $border-color; - padding-top: 10px; - margin-top: 10px; - } - - a { - color: $gray; - display: block; - text-decoration: none; - padding: 8px 15px; - font-size: 13px; - line-height: 20px; - padding-left: 20px; - - &:hover { - text-decoration: none; - color: $text-color; - background: $border-color; - } - - &:active, &:focus { - text-decoration: none; - } - - i { - width: 20px; - color: $gray-light; - margin-right: 23px; - } - } -} - -.sidebar-subnav { - margin-left: 0px; - padding-left: 0px; - - li { - list-style: none; - } -} - -@mixin expanded-sidebar { - padding-left: $sidebar_width; - - .sidebar-wrapper { - width: $sidebar_width; - - .nav-sidebar { - margin-top: 29px; - position: fixed; - top: 45px; - width: $sidebar_width; - } - } - - .content-wrapper { - padding: 20px; - } -} - -@mixin folded-sidebar { - padding-left: 50px; - - .sidebar-wrapper { - width: 52px; - - .nav-sidebar { - margin-top: 29px; - position: fixed; - top: 45px; - width: 52px; - - li a { - padding-left: 18px; - font-size: 14px; - padding: 8px 15px; - text-align: center; - - - & > span { - display: none; - } - } - } - - .collapse-nav a { - left: 0px; - padding: 7px 23px 3px 22px; - } - } -} - -.collapse-nav a { - position: fixed; - top: 46px; - padding: 5px 13px 5px 13px; - left: 198px; - font-size: 13px; - background: transparent; - color: black; - border-left: 1px solid $border-color; - border-bottom: 1px solid $border-color; -} - -.collapse-nav a:hover { - text-decoration: none; - background: #f2f6f7; -} - -@media (max-width: $screen-md-max) { - .page-sidebar-collapsed { - @include folded-sidebar; - } - - .page-sidebar-expanded { - @include folded-sidebar; - } - - .collapse-nav { - display: none; - } -} - -@media(min-width: $screen-md-max) { - .page-sidebar-collapsed { - @include folded-sidebar; - } - - .page-sidebar-expanded { - @include expanded-sidebar; - } -} diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss deleted file mode 100644 index d8e0dc028d1..00000000000 --- a/app/assets/stylesheets/generic/selects.scss +++ /dev/null @@ -1,118 +0,0 @@ -/** Select2 selectbox style override **/ -.select2-container, .select2-container.select2-drop-above { - .select2-choice { - background: #FFF; - border-color: #DDD; - height: 34px; - padding: 6px 14px; - font-size: 14px; - line-height: 1.42857143; - - @include border-radius(4px); - - .select2-arrow { - background: #FFF; - border-left: none; - padding-top: 3px; - } - } -} - -.select2-container-multi .select2-choices { - @include border-radius(4px); - border-color: #CCC; -} - -.select2-container-multi .select2-choices .select2-search-field input { - padding: 8px 14px; - font-size: 13px; - line-height: 18px; - height: auto; -} - -.select2-drop-active { - border: 1px solid #BBB !important; - margin-top: 4px; - font-size: 13px; - - &.select2-drop-above { - margin-bottom: 8px; - } - - .select2-search input { - background: #fafafa; - border-color: #DDD; - } - - .select2-results { - max-height: 350px; - .select2-highlighted { - background: $gl-primary; - } - } -} - -.select2-container { - width: 100% !important; -} - -/** Branch/tag selector **/ -.project-refs-form .select2-container { - width: 160px !important; -} - -.ajax-users-dropdown, .ajax-project-users-dropdown { - .select2-search { - padding-top: 4px; - } -} - -.ajax-users-select { - width: 400px; - - &.input-large { - width: 210px; - } - - &.input-clamp { - max-width: 100%; - } -} - -.group-result { - .group-image { - float: left; - } - .group-name { - font-weight: bold; - } - .group-path { - color: #999; - } -} - -.user-result { - .user-image { - float: left; - } - .user-name { - } - .user-username { - color: #999; - } -} - -.namespace-result { - .namespace-kind { - color: #AAA; - font-weight: normal; - } - .namespace-path { - margin-left: 10px; - font-weight: bolder; - } -} - -.ajax-users-dropdown { - min-width: 225px !important; -} diff --git a/app/assets/stylesheets/generic/tables.scss b/app/assets/stylesheets/generic/tables.scss deleted file mode 100644 index a66e45577de..00000000000 --- a/app/assets/stylesheets/generic/tables.scss +++ /dev/null @@ -1,20 +0,0 @@ -table { - &.table { - tr { - td, th { - padding: 8px 10px; - line-height: 20px; - vertical-align: middle; - } - th { - font-weight: normal; - font-size: 15px; - border-bottom: 1px solid $border-color !important; - } - td { - border-color: #F1F1F1 !important; - border-bottom: 1px solid; - } - } - } -} diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss deleted file mode 100644 index 97831eb7c27..00000000000 --- a/app/assets/stylesheets/generic/timeline.scss +++ /dev/null @@ -1,134 +0,0 @@ -.timeline { - list-style: none; - padding: 20px 0 20px; - position: relative; - - &:before { - top: 0; - bottom: 0; - position: absolute; - content: " "; - width: 3px; - background-color: #eeeeee; - margin-left: 29px; - } - - .timeline-entry { - position: relative; - margin-top: 5px; - margin-left: 30px; - margin-bottom: 10px; - clear: both; - - - &:target { - .timeline-entry-inner .timeline-content { - -webkit-animation:target-note 2s linear; - background: $hover; - } - } - - .timeline-entry-inner { - position: relative; - margin-left: -20px; - - &: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; - } - } - } - } - - .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; - } - } - - .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; - } - } - } -} - -@media (max-width: $screen-xs-max) { - .timeline { - &:before { - background: none; - } - .timeline-entry .timeline-entry-inner { - .timeline-icon { - display: none; - } - - .timeline-content { - margin-left: 0; - } - } - } -} diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss deleted file mode 100644 index 80190424c1b..00000000000 --- a/app/assets/stylesheets/generic/typography.scss +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Headers - * - */ -.page-title { - margin-top: 0px; - line-height: 1.5; - font-weight: normal; - margin-bottom: 5px; -} - -/** CODE **/ -pre { - font-family: $monospace_font; - - &.dark { - background: #333; - color: $background-color; - } -} - -.monospace { - font-family: $monospace_font; -} - -/** - * Wiki typography - * - */ -.wiki { - @include md-typography; - - word-wrap: break-word; - - /* Link to current header. */ - h1, h2, h3, h4, h5, h6 { - position: relative; - &:hover > :last-child { - $size: 16px; - position: absolute; - right: 100%; - top: 50%; - margin-top: -$size/2; - margin-right: 0px; - padding-right: 20px; - display: inline-block; - width: $size; - height: $size; - background-image: image-url("icon-link.png"); - background-size: contain; - background-repeat: no-repeat; - } - } - - ul { - padding: 0; - margin: 0 0 9px 25px !important; - } -} - -.md { - @include md-typography; -} - -/** - * Textareas intended for GFM - * - */ -textarea.js-gfm-input { - font-family: $monospace_font; -} - -.strikethrough { - text-decoration: line-through; -} diff --git a/app/assets/stylesheets/generic/zen.scss b/app/assets/stylesheets/generic/zen.scss deleted file mode 100644 index 26afc21a6ab..00000000000 --- a/app/assets/stylesheets/generic/zen.scss +++ /dev/null @@ -1,98 +0,0 @@ -.zennable { - position: relative; - - input { - display: none; - } - - .zen-enter-link { - color: #888; - position: absolute; - top: -26px; - right: 4px; - } - - .zen-leave-link { - display: none; - color: #888; - position: absolute; - top: 10px; - right: 10px; - padding: 5px; - font-size: 36px; - - &:hover { - color: #111; - } - } - - input:checked ~ .zen-backdrop .zen-enter-link { - display: none; - } - - input:checked ~ .zen-backdrop .zen-leave-link { - display: block; - position: absolute; - top: 0; - } - - input:checked ~ .zen-backdrop { - background-color: white; - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: 1031; - - textarea { - border: none; - box-shadow: none; - border-radius: 0; - color: #000; - font-size: 20px; - line-height: 26px; - padding: 30px; - display: block; - outline: none; - resize: none; - height: 100vh; - max-width: 900px; - margin: 0 auto; - } - } - - .zen-backdrop textarea::-webkit-input-placeholder { - color: white; - } - - .zen-backdrop textarea:-moz-placeholder { - color: white; - } - - .zen-backdrop textarea::-moz-placeholder { - color: white; - } - - .zen-backdrop textarea:-ms-input-placeholder { - color: white; - } - - input:checked ~ .zen-backdrop textarea::-webkit-input-placeholder { - color: #999; - } - - input:checked ~ .zen-backdrop textarea:-moz-placeholder { - color: #999; - opacity: 1; - } - - input:checked ~ .zen-backdrop textarea::-moz-placeholder { - color: #999; - opacity: 1; - } - - input:checked ~ .zen-backdrop textarea:-ms-input-placeholder { - color: #999; - } -} diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss deleted file mode 100644 index c8cb18ec35f..00000000000 --- a/app/assets/stylesheets/highlight/dark.scss +++ /dev/null @@ -1,88 +0,0 @@ -/* https://github.com/MozMorris/tomorrow-pygments */ -pre.code.highlight.dark, -.code.dark { - - background-color: #1d1f21; - color: #c5c8c6; - - pre.code, - .line-numbers, - .line-numbers a { - background-color: #1d1f21 !important; - color: #c5c8c6 !important; - } - - pre.code { - border-left: 1px solid #666; - } - - // highlight line via anchor - pre .hll { - background-color: #557 !important; - } - - .hll { background-color: #373b41 } - .c { color: #969896 } /* Comment */ - .err { color: #cc6666 } /* Error */ - .k { color: #b294bb } /* Keyword */ - .l { color: #de935f } /* Literal */ - .n { color: #c5c8c6 } /* Name */ - .o { color: #8abeb7 } /* Operator */ - .p { color: #c5c8c6 } /* Punctuation */ - .cm { color: #969896 } /* Comment.Multiline */ - .cp { color: #969896 } /* Comment.Preproc */ - .c1 { color: #969896 } /* Comment.Single */ - .cs { color: #969896 } /* Comment.Special */ - .gd { color: #cc6666 } /* Generic.Deleted */ - .ge { font-style: italic } /* Generic.Emph */ - .gh { color: #c5c8c6; font-weight: bold } /* Generic.Heading */ - .gi { color: #b5bd68 } /* Generic.Inserted */ - .gp { color: #969896; font-weight: bold } /* Generic.Prompt */ - .gs { font-weight: bold } /* Generic.Strong */ - .gu { color: #8abeb7; font-weight: bold } /* Generic.Subheading */ - .kc { color: #b294bb } /* Keyword.Constant */ - .kd { color: #b294bb } /* Keyword.Declaration */ - .kn { color: #8abeb7 } /* Keyword.Namespace */ - .kp { color: #b294bb } /* Keyword.Pseudo */ - .kr { color: #b294bb } /* Keyword.Reserved */ - .kt { color: #f0c674 } /* Keyword.Type */ - .ld { color: #b5bd68 } /* Literal.Date */ - .m { color: #de935f } /* Literal.Number */ - .s { color: #b5bd68 } /* Literal.String */ - .na { color: #81a2be } /* Name.Attribute */ - .nb { color: #c5c8c6 } /* Name.Builtin */ - .nc { color: #f0c674 } /* Name.Class */ - .no { color: #cc6666 } /* Name.Constant */ - .nd { color: #8abeb7 } /* Name.Decorator */ - .ni { color: #c5c8c6 } /* Name.Entity */ - .ne { color: #cc6666 } /* Name.Exception */ - .nf { color: #81a2be } /* Name.Function */ - .nl { color: #c5c8c6 } /* Name.Label */ - .nn { color: #f0c674 } /* Name.Namespace */ - .nx { color: #81a2be } /* Name.Other */ - .py { color: #c5c8c6 } /* Name.Property */ - .nt { color: #8abeb7 } /* Name.Tag */ - .nv { color: #cc6666 } /* Name.Variable */ - .ow { color: #8abeb7 } /* Operator.Word */ - .w { color: #c5c8c6 } /* Text.Whitespace */ - .mf { color: #de935f } /* Literal.Number.Float */ - .mh { color: #de935f } /* Literal.Number.Hex */ - .mi { color: #de935f } /* Literal.Number.Integer */ - .mo { color: #de935f } /* Literal.Number.Oct */ - .sb { color: #b5bd68 } /* Literal.String.Backtick */ - .sc { color: #c5c8c6 } /* Literal.String.Char */ - .sd { color: #969896 } /* Literal.String.Doc */ - .s2 { color: #b5bd68 } /* Literal.String.Double */ - .se { color: #de935f } /* Literal.String.Escape */ - .sh { color: #b5bd68 } /* Literal.String.Heredoc */ - .si { color: #de935f } /* Literal.String.Interpol */ - .sx { color: #b5bd68 } /* Literal.String.Other */ - .sr { color: #b5bd68 } /* Literal.String.Regex */ - .s1 { color: #b5bd68 } /* Literal.String.Single */ - .ss { color: #b5bd68 } /* Literal.String.Symbol */ - .bp { color: #c5c8c6 } /* Name.Builtin.Pseudo */ - .vc { color: #cc6666 } /* Name.Variable.Class */ - .vg { color: #cc6666 } /* Name.Variable.Global */ - .vi { color: #cc6666 } /* Name.Variable.Instance */ - .il { color: #de935f } /* Literal.Number.Integer.Long */ -} diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss deleted file mode 100644 index 001e8b31020..00000000000 --- a/app/assets/stylesheets/highlight/monokai.scss +++ /dev/null @@ -1,88 +0,0 @@ -/* https://github.com/richleland/pygments-css/blob/master/monokai.css */ -pre.code.monokai, -.code.monokai { - - background: #272822; - color: #f8f8f2; - - pre.highlight, - .line-numbers, - .line-numbers a { - background:#272822 !important; - color:#f8f8f2 !important; - } - - pre.code { - border-left: 1px solid #555; - } - - // highlight line via anchor - pre .hll { - background-color: #49483e !important; - } - - .hll { background-color: #49483e } - .c { color: #75715e } /* Comment */ - .err { color: #960050; background-color: #1e0010 } /* Error */ - .k { color: #66d9ef } /* Keyword */ - .l { color: #ae81ff } /* Literal */ - .n { color: #f8f8f2 } /* Name */ - .o { color: #f92672 } /* Operator */ - .p { color: #f8f8f2 } /* Punctuation */ - .cm { color: #75715e } /* Comment.Multiline */ - .cp { color: #75715e } /* Comment.Preproc */ - .c1 { color: #75715e } /* Comment.Single */ - .cs { color: #75715e } /* Comment.Special */ - .ge { font-style: italic } /* Generic.Emph */ - .gs { font-weight: bold } /* Generic.Strong */ - .kc { color: #66d9ef } /* Keyword.Constant */ - .kd { color: #66d9ef } /* Keyword.Declaration */ - .kn { color: #f92672 } /* Keyword.Namespace */ - .kp { color: #66d9ef } /* Keyword.Pseudo */ - .kr { color: #66d9ef } /* Keyword.Reserved */ - .kt { color: #66d9ef } /* Keyword.Type */ - .ld { color: #e6db74 } /* Literal.Date */ - .m { color: #ae81ff } /* Literal.Number */ - .s { color: #e6db74 } /* Literal.String */ - .na { color: #a6e22e } /* Name.Attribute */ - .nb { color: #f8f8f2 } /* Name.Builtin */ - .nc { color: #a6e22e } /* Name.Class */ - .no { color: #66d9ef } /* Name.Constant */ - .nd { color: #a6e22e } /* Name.Decorator */ - .ni { color: #f8f8f2 } /* Name.Entity */ - .ne { color: #a6e22e } /* Name.Exception */ - .nf { color: #a6e22e } /* Name.Function */ - .nl { color: #f8f8f2 } /* Name.Label */ - .nn { color: #f8f8f2 } /* Name.Namespace */ - .nx { color: #a6e22e } /* Name.Other */ - .py { color: #f8f8f2 } /* Name.Property */ - .nt { color: #f92672 } /* Name.Tag */ - .nv { color: #f8f8f2 } /* Name.Variable */ - .ow { color: #f92672 } /* Operator.Word */ - .w { color: #f8f8f2 } /* Text.Whitespace */ - .mf { color: #ae81ff } /* Literal.Number.Float */ - .mh { color: #ae81ff } /* Literal.Number.Hex */ - .mi { color: #ae81ff } /* Literal.Number.Integer */ - .mo { color: #ae81ff } /* Literal.Number.Oct */ - .sb { color: #e6db74 } /* Literal.String.Backtick */ - .sc { color: #e6db74 } /* Literal.String.Char */ - .sd { color: #e6db74 } /* Literal.String.Doc */ - .s2 { color: #e6db74 } /* Literal.String.Double */ - .se { color: #ae81ff } /* Literal.String.Escape */ - .sh { color: #e6db74 } /* Literal.String.Heredoc */ - .si { color: #e6db74 } /* Literal.String.Interpol */ - .sx { color: #e6db74 } /* Literal.String.Other */ - .sr { color: #e6db74 } /* Literal.String.Regex */ - .s1 { color: #e6db74 } /* Literal.String.Single */ - .ss { color: #e6db74 } /* Literal.String.Symbol */ - .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ - .vc { color: #f8f8f2 } /* Name.Variable.Class */ - .vg { color: #f8f8f2 } /* Name.Variable.Global */ - .vi { color: #f8f8f2 } /* Name.Variable.Instance */ - .il { color: #ae81ff } /* Literal.Number.Integer.Long */ - - .gh { } /* Generic Heading & Diff Header */ - .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ - .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ - .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ -} diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss deleted file mode 100644 index f5b827e7c02..00000000000 --- a/app/assets/stylesheets/highlight/solarized_dark.scss +++ /dev/null @@ -1,110 +0,0 @@ -/* https://gist.github.com/qguv/7936275 */ -pre.code.highlight.solarized-dark, -.code.solarized-dark { - - background-color: #002b36; - color: #93a1a1; - - pre.code, - .line-numbers, - .line-numbers a { - background-color: #002b36 !important; - color: #93a1a1 !important; - } - - pre.code { - border-left: 1px solid #113b46; - } - - // highlight line via anchor - pre .hll { - background-color: #174652 !important; - } - - /* Solarized Dark - - For use with Jekyll and Pygments - - http://ethanschoonover.com/solarized - - SOLARIZED HEX ROLE - --------- -------- ------------------------------------------ - base03 #002b36 background - base01 #586e75 comments / secondary content - base1 #93a1a1 body text / default code / primary content - orange #cb4b16 constants - red #dc322f regex, special keywords - blue #268bd2 reserved keywords - cyan #2aa198 strings, numbers - green #859900 operators, other keywords - */ - - .c { color: #586e75 } /* Comment */ - .err { color: #93a1a1 } /* Error */ - .g { color: #93a1a1 } /* Generic */ - .k { color: #859900 } /* Keyword */ - .l { color: #93a1a1 } /* Literal */ - .n { color: #93a1a1 } /* Name */ - .o { color: #859900 } /* Operator */ - .x { color: #cb4b16 } /* Other */ - .p { color: #93a1a1 } /* Punctuation */ - .cm { color: #586e75 } /* Comment.Multiline */ - .cp { color: #859900 } /* Comment.Preproc */ - .c1 { color: #586e75 } /* Comment.Single */ - .cs { color: #859900 } /* Comment.Special */ - .gd { color: #2aa198 } /* Generic.Deleted */ - .ge { color: #93a1a1; font-style: italic } /* Generic.Emph */ - .gr { color: #dc322f } /* Generic.Error */ - .gh { color: #cb4b16 } /* Generic.Heading */ - .gi { color: #859900 } /* Generic.Inserted */ - .go { color: #93a1a1 } /* Generic.Output */ - .gp { color: #93a1a1 } /* Generic.Prompt */ - .gs { color: #93a1a1; font-weight: bold } /* Generic.Strong */ - .gu { color: #cb4b16 } /* Generic.Subheading */ - .gt { color: #93a1a1 } /* Generic.Traceback */ - .kc { color: #cb4b16 } /* Keyword.Constant */ - .kd { color: #268bd2 } /* Keyword.Declaration */ - .kn { color: #859900 } /* Keyword.Namespace */ - .kp { color: #859900 } /* Keyword.Pseudo */ - .kr { color: #268bd2 } /* Keyword.Reserved */ - .kt { color: #dc322f } /* Keyword.Type */ - .ld { color: #93a1a1 } /* Literal.Date */ - .m { color: #2aa198 } /* Literal.Number */ - .s { color: #2aa198 } /* Literal.String */ - .na { color: #93a1a1 } /* Name.Attribute */ - .nb { color: #B58900 } /* Name.Builtin */ - .nc { color: #268bd2 } /* Name.Class */ - .no { color: #cb4b16 } /* Name.Constant */ - .nd { color: #268bd2 } /* Name.Decorator */ - .ni { color: #cb4b16 } /* Name.Entity */ - .ne { color: #cb4b16 } /* Name.Exception */ - .nf { color: #268bd2 } /* Name.Function */ - .nl { color: #93a1a1 } /* Name.Label */ - .nn { color: #93a1a1 } /* Name.Namespace */ - .nx { color: #93a1a1 } /* Name.Other */ - .py { color: #93a1a1 } /* Name.Property */ - .nt { color: #268bd2 } /* Name.Tag */ - .nv { color: #268bd2 } /* Name.Variable */ - .ow { color: #859900 } /* Operator.Word */ - .w { color: #93a1a1 } /* Text.Whitespace */ - .mf { color: #2aa198 } /* Literal.Number.Float */ - .mh { color: #2aa198 } /* Literal.Number.Hex */ - .mi { color: #2aa198 } /* Literal.Number.Integer */ - .mo { color: #2aa198 } /* Literal.Number.Oct */ - .sb { color: #586e75 } /* Literal.String.Backtick */ - .sc { color: #2aa198 } /* Literal.String.Char */ - .sd { color: #93a1a1 } /* Literal.String.Doc */ - .s2 { color: #2aa198 } /* Literal.String.Double */ - .se { color: #cb4b16 } /* Literal.String.Escape */ - .sh { color: #93a1a1 } /* Literal.String.Heredoc */ - .si { color: #2aa198 } /* Literal.String.Interpol */ - .sx { color: #2aa198 } /* Literal.String.Other */ - .sr { color: #dc322f } /* Literal.String.Regex */ - .s1 { color: #2aa198 } /* Literal.String.Single */ - .ss { color: #2aa198 } /* Literal.String.Symbol */ - .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ - .vc { color: #268bd2 } /* Name.Variable.Class */ - .vg { color: #268bd2 } /* Name.Variable.Global */ - .vi { color: #268bd2 } /* Name.Variable.Instance */ - .il { color: #2aa198 } /* Literal.Number.Integer.Long */ -} diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss deleted file mode 100644 index 6b44c00c305..00000000000 --- a/app/assets/stylesheets/highlight/solarized_light.scss +++ /dev/null @@ -1,110 +0,0 @@ -/* https://gist.github.com/qguv/7936275 */ -pre.code.highlight.solarized-light, -.code.solarized-light { - - background-color: #fdf6e3; - color: #586e75; - - pre.code, - .line-numbers, - .line-numbers a { - background-color: #fdf6e3 !important; - color: #586e75 !important; - } - - pre.code { - border-left: 1px solid #c5d0d4; - } - - // highlight line via anchor - pre .hll { - background-color: #ddd8c5 !important; - } - - /* Solarized Light - - For use with Jekyll and Pygments - - http://ethanschoonover.com/solarized - - SOLARIZED HEX ROLE - --------- -------- ------------------------------------------ - base01 #586e75 body text / default code / primary content - base1 #93a1a1 comments / secondary content - base3 #fdf6e3 background - orange #cb4b16 constants - red #dc322f regex, special keywords - blue #268bd2 reserved keywords - cyan #2aa198 strings, numbers - green #859900 operators, other keywords - */ - - .c { color: #93a1a1 } /* Comment */ - .err { color: #586e75 } /* Error */ - .g { color: #586e75 } /* Generic */ - .k { color: #859900 } /* Keyword */ - .l { color: #586e75 } /* Literal */ - .n { color: #586e75 } /* Name */ - .o { color: #859900 } /* Operator */ - .x { color: #cb4b16 } /* Other */ - .p { color: #586e75 } /* Punctuation */ - .cm { color: #93a1a1 } /* Comment.Multiline */ - .cp { color: #859900 } /* Comment.Preproc */ - .c1 { color: #93a1a1 } /* Comment.Single */ - .cs { color: #859900 } /* Comment.Special */ - .gd { color: #2aa198 } /* Generic.Deleted */ - .ge { color: #586e75; font-style: italic } /* Generic.Emph */ - .gr { color: #dc322f } /* Generic.Error */ - .gh { color: #cb4b16 } /* Generic.Heading */ - .gi { color: #859900 } /* Generic.Inserted */ - .go { color: #586e75 } /* Generic.Output */ - .gp { color: #586e75 } /* Generic.Prompt */ - .gs { color: #586e75; font-weight: bold } /* Generic.Strong */ - .gu { color: #cb4b16 } /* Generic.Subheading */ - .gt { color: #586e75 } /* Generic.Traceback */ - .kc { color: #cb4b16 } /* Keyword.Constant */ - .kd { color: #268bd2 } /* Keyword.Declaration */ - .kn { color: #859900 } /* Keyword.Namespace */ - .kp { color: #859900 } /* Keyword.Pseudo */ - .kr { color: #268bd2 } /* Keyword.Reserved */ - .kt { color: #dc322f } /* Keyword.Type */ - .ld { color: #586e75 } /* Literal.Date */ - .m { color: #2aa198 } /* Literal.Number */ - .s { color: #2aa198 } /* Literal.String */ - .na { color: #586e75 } /* Name.Attribute */ - .nb { color: #B58900 } /* Name.Builtin */ - .nc { color: #268bd2 } /* Name.Class */ - .no { color: #cb4b16 } /* Name.Constant */ - .nd { color: #268bd2 } /* Name.Decorator */ - .ni { color: #cb4b16 } /* Name.Entity */ - .ne { color: #cb4b16 } /* Name.Exception */ - .nf { color: #268bd2 } /* Name.Function */ - .nl { color: #586e75 } /* Name.Label */ - .nn { color: #586e75 } /* Name.Namespace */ - .nx { color: #586e75 } /* Name.Other */ - .py { color: #586e75 } /* Name.Property */ - .nt { color: #268bd2 } /* Name.Tag */ - .nv { color: #268bd2 } /* Name.Variable */ - .ow { color: #859900 } /* Operator.Word */ - .w { color: #586e75 } /* Text.Whitespace */ - .mf { color: #2aa198 } /* Literal.Number.Float */ - .mh { color: #2aa198 } /* Literal.Number.Hex */ - .mi { color: #2aa198 } /* Literal.Number.Integer */ - .mo { color: #2aa198 } /* Literal.Number.Oct */ - .sb { color: #93a1a1 } /* Literal.String.Backtick */ - .sc { color: #2aa198 } /* Literal.String.Char */ - .sd { color: #586e75 } /* Literal.String.Doc */ - .s2 { color: #2aa198 } /* Literal.String.Double */ - .se { color: #cb4b16 } /* Literal.String.Escape */ - .sh { color: #586e75 } /* Literal.String.Heredoc */ - .si { color: #2aa198 } /* Literal.String.Interpol */ - .sx { color: #2aa198 } /* Literal.String.Other */ - .sr { color: #dc322f } /* Literal.String.Regex */ - .s1 { color: #2aa198 } /* Literal.String.Single */ - .ss { color: #2aa198 } /* Literal.String.Symbol */ - .bp { color: #268bd2 } /* Name.Builtin.Pseudo */ - .vc { color: #268bd2 } /* Name.Variable.Class */ - .vg { color: #268bd2 } /* Name.Variable.Global */ - .vi { color: #268bd2 } /* Name.Variable.Instance */ - .il { color: #2aa198 } /* Literal.Number.Integer.Long */ -} diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss deleted file mode 100644 index a52ffc971d1..00000000000 --- a/app/assets/stylesheets/highlight/white.scss +++ /dev/null @@ -1,87 +0,0 @@ -/* https://github.com/aahan/pygments-github-style */ -pre.code.highlight.white, -.code.white { - - background-color: #fff; - color: #333; - - pre.highlight, - .line-numbers, - .line-numbers a { - background-color: #fff !important; - color: #333 !important; - } - - pre.code { - border-left: 1px solid #bbb; - } - - // highlight line via anchor - pre .hll { - background-color: #f8eec7 !important; - } - - .hll { background-color: #f8f8f8 } - .c { color: #999988; font-style: italic; } - .err { color: #a61717; background-color: #e3d2d2; } - .k { font-weight: bold; } - .o { font-weight: bold; } - .cm { color: #999988; font-style: italic; } - .cp { color: #999999; font-weight: bold; } - .c1 { color: #999988; font-style: italic; } - .cs { color: #999999; font-weight: bold; font-style: italic; } - .gd { color: #000000; background-color: #ffdddd; } - .gd .x { color: #000000; background-color: #ffaaaa; } - .ge { font-style: italic; } - .gr { color: #aa0000; } - .gh { color: #999999; } - .gi { color: #000000; background-color: #ddffdd; } - .gi .x { color: #000000; background-color: #aaffaa; } - .go { color: #888888; } - .gp { color: #555555; } - .gs { font-weight: bold; } - .gu { color: #800080; font-weight: bold; } - .gt { color: #aa0000; } - .kc { font-weight: bold; } - .kd { font-weight: bold; } - .kn { font-weight: bold; } - .kp { font-weight: bold; } - .kr { font-weight: bold; } - .kt { color: #445588; font-weight: bold; } - .m { color: #009999; } - .s { color: #dd1144; } - .n { color: #333333; } - .na { color: teal; } - .nb { color: #0086b3; } - .nc { color: #445588; font-weight: bold; } - .no { color: teal; } - .ni { color: purple; } - .ne { color: #990000; font-weight: bold; } - .nf { color: #990000; font-weight: bold; } - .nn { color: #555555; } - .nt { color: navy; } - .nv { color: teal; } - .ow { font-weight: bold; } - .w { color: #bbbbbb; } - .mf { color: #009999; } - .mh { color: #009999; } - .mi { color: #009999; } - .mo { color: #009999; } - .sb { color: #dd1144; } - .sc { color: #dd1144; } - .sd { color: #dd1144; } - .s2 { color: #dd1144; } - .se { color: #dd1144; } - .sh { color: #dd1144; } - .si { color: #dd1144; } - .sx { color: #dd1144; } - .sr { color: #009926; } - .s1 { color: #dd1144; } - .ss { color: #990073; } - .bp { color: #999999; } - .vc { color: teal; } - .vg { color: teal; } - .vi { color: teal; } - .il { color: #009999; } - .gc { color: #999; background-color: #EAF2F5; } -} diff --git a/app/assets/stylesheets/pages/admin.scss b/app/assets/stylesheets/pages/admin.scss deleted file mode 100644 index 144852e7874..00000000000 --- a/app/assets/stylesheets/pages/admin.scss +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Admin area - * - */ -.admin-dashboard { - .data { - a { - h1 { - line-height: 48px; - font-size: 48px; - padding: 20px; - text-align: center; - font-weight: normal; - } - } - } - - .str-truncated { - max-width: 60%; - } -} - -.admin-filter form { - .select2-container { - width: 100% - } - - .controls { - margin-left: 130px; - } - - .form-actions { - padding-left: 130px; - background: #fff - } - - .visibility-levels { - .controls { - margin-bottom: 9px; - } - - i { - color: inherit; - } - } -} - -.broadcast-messages { - .message { - line-height: 2; - } -} - -.broadcast-message { - @extend .alert-warning; - padding: 10px; - text-align: center; -} - -.broadcast-message-preview { - @extend .broadcast-message; - margin-bottom: 20px; -} diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss deleted file mode 100644 index e7125c03993..00000000000 --- a/app/assets/stylesheets/pages/commit.scss +++ /dev/null @@ -1,123 +0,0 @@ -.commit-title{ - display: block; -} - -.commit-title{ - margin-bottom: 10px; -} - -.commit-author, .commit-committer{ - display: block; - color: #999; - font-weight: normal; - font-style: italic; -} - -.commit-author strong, .commit-committer strong{ - font-weight: bold; - font-style: normal; -} - -.commit-description { - background: none; - border: none; - margin: 0; - padding: 0; - 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 { - @extend .avatar-inline; - } - .commit-committer-link, - .commit-author-link { - color: #444; - font-weight: bold; - } -} - -.commit-box { - margin: 10px 0; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding: 20px 0; - - .commit-title { - margin: 0; - } - - .commit-description { - margin-top: 15px; - } -} - -.file-stats a { - color: $style_color; -} - -.file-stats { - .new-file { - a { - color: #090; - } - i { - color: #1BCF00; - } - } - .renamed-file { - i { - color: #FE9300; - } - } - .deleted-file { - a { - color: #B00; - } - i { - color: #EE0000; - } - } - .edit-file{ - i{ - color: #555; - } - } -} - -/* - * Commit message textarea for web editor and - * custom merge request message - */ -.commit-message-container { - background-color: $body-bg; - position: relative; - font-family: $monospace_font; - $left: 12px; - .max-width-marker { - width: 72ch; - color: rgba(0, 0, 0, 0.0); - font-family: inherit; - left: $left; - height: 100%; - border-right: 1px solid mix($input-border, white); - position: absolute; - z-index: 1; - } - > textarea { - background-color: rgba(0, 0, 0, 0.0); - font-family: inherit; - padding-left: $left; - position: relative; - z-index: 2; - } -} diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss deleted file mode 100644 index 84361e15481..00000000000 --- a/app/assets/stylesheets/pages/commits.scss +++ /dev/null @@ -1,118 +0,0 @@ -.commits-compare-switch{ - @extend .btn; - background: image-url("switch_icon.png") no-repeat center center; - text-indent: -9999px; - float: left; - margin-right: 9px; -} - -.lists-separator { - margin: 10px 0; - border-color: #DDD; -} - -.commits-row { - ul { - margin: 0; - - li.commit { - padding: 8px 0; - } - } - - .commits-row-date { - font-size: 15px; - line-height: 20px; - margin-bottom: 5px; - } -} - -.commits-feed-holder { - float: right; - - .btn { - padding: 4px 12px; - } -} - -li.commit { - .commit-row-title { - font-size: $list-font-size; - line-height: 20px; - margin-bottom: 2px; - - .notes_count { - float: right; - margin-right: 10px; - } - - .commit_short_id { - min-width: 65px; - font-family: $monospace_font; - } - - .str-truncated { - max-width: 70%; - } - - .commit-row-message { - color: #444; - - &:hover { - text-decoration: underline; - } - } - - .text-expander { - background: #eee; - color: #555; - padding: 0 5px; - cursor: pointer; - margin-left: 4px; - &:hover { - background-color: #ddd; - } - } - } - - .commit-row-description { - font-size: 14px; - border-left: 1px solid #EEE; - padding: 10px 15px; - margin: 5px 0 10px 5px; - background: #f9f9f9; - display: none; - - pre { - border: none; - background: inherit; - padding: 0; - margin: 0; - } - } - - .commit-row-info { - color: #777; - line-height: 24px; - font-size: 13px; - - a { - color: #777; - } - - .committed_ago { - display: inline-block; - } - } - - &.inline-commit { - .commit-row-title { - font-size: 13px; - } - - .committed_ago { - float: right; - @extend .cgray; - } - } -} diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss deleted file mode 100644 index af9c83e5dc8..00000000000 --- a/app/assets/stylesheets/pages/dashboard.scss +++ /dev/null @@ -1,93 +0,0 @@ -.dashboard { - .side { - .panel { - .panel-heading { - background: #EEE; - border-top-left-radius: 0; - } - border-top-left-radius: 0; - } - } -} - -.dashboard-search-filter { - padding:5px; - - .search-text-input { - float:left; - @extend .col-md-2; - } - .btn { - margin-left: 5px; - float:left; - } -} - -.project-row, .group-row { - padding: 0 !important; - font-size: 14px; - line-height: 24px; - - .str-truncated { - max-width: 72%; - } - - 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; - margin-right: 15px; - margin-bottom: 15px; - - i { - color: #888; - } -} - -.dash-project-avatar { - float: left; - - .avatar { - margin-top: -8px; - margin-left: -15px; - @include border-radius(0px); - } - .identicon { - line-height: 40px; - } -} - -.dash-project-access-icon { - float: left; - margin-right: 5px; - width: 16px; -} diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss deleted file mode 100644 index af6ea58382f..00000000000 --- a/app/assets/stylesheets/pages/diff.scss +++ /dev/null @@ -1,358 +0,0 @@ -.diff-file { - border: 1px solid $border-color; - margin-bottom: 1em; - - .diff-header { - position: relative; - background: $background-color; - border-bottom: 1px solid $border-color; - padding: 10px 15px; - color: #555; - z-index: 10; - - > span { - font-family: $monospace_font; - word-break: break-all; - margin-right: 200px; - display: block; - - .file-mode { - margin-left: 10px; - color: #777; - } - } - - .diff-btn-group { - float: right; - position: absolute; - top: 5px; - right: 15px; - - .btn { - padding: 0px 10px; - font-size: 13px; - line-height: 28px; - } - } - - .commit-short-id { - font-family: $monospace_font; - font-size: smaller; - } - } - .diff-content { - overflow: auto; - overflow-y: hidden; - background: #FFF; - color: #333; - font-size: $code_font_size; - .old { - span.idiff { - background-color: #f8cbcb; - } - } - .new { - span.idiff { - background-color: #a6f3a6; - } - } - .unfold { - cursor: pointer; - } - - .file-mode-changed { - padding: 10px; - color: #777; - } - - table { - width: 100%; - font-family: $monospace_font; - border: none; - margin: 0px; - padding: 0px; - td { - line-height: $code_line_height; - font-size: $code_font_size; - } - } - - tr.line_holder.parallel{ - .old_line, .new_line, .diff_line { - min-width: 50px; - } - - td.line_content.parallel{ - width: 50%; - } - } - - .old_line, .new_line, .diff_line { - margin: 0px; - padding: 0px; - border: none; - background: $background-color; - color: rgba(0,0,0,0.3); - padding: 0px 5px; - border-right: 1px solid $border-color; - text-align: right; - min-width: 35px; - max-width: 50px; - width: 35px; - @include user-select(none); - a { - float: left; - width: 35px; - font-weight: normal; - color: rgba(0,0,0,0.3); - &:hover { - text-decoration: underline; - } - } - &.new { - background: #CFD; - } - &.old { - background: #FDD; - } - } - .diff_line { - padding: 0; - } - .line_holder { - &.old .old_line, - &.old .new_line { - background: #ffdddd; - border-color: #f1c0c0; - } - &.new .old_line, - &.new .new_line { - background: #dbffdb; - border-color: #c1e9c1; - } - } - .line_content { - display: block; - margin: 0px; - padding: 0px 0.5em; - border: none; - &.new { - background: #eaffea; - } - &.old { - background: #ffecec; - } - &.matched { - color: $border-color; - background: #fafafa; - } - &.parallel { - display: table-cell; - } - } - } - .image { - background: #ddd; - text-align: center; - padding: 30px; - .wrap{ - display: inline-block; - } - - .frame { - display: inline-block; - background-color: #fff; - line-height: 0; - img{ - border: 1px solid #FFF; - background: image-url('trans_bg.gif'); - max-width: 100%; - } - &.deleted { - border: 1px solid $deleted; - } - - &.added { - border: 1px solid $added; - } - } - .image-info{ - font-size: 12px; - margin: 5px 0 0 0; - color: grey; - } - - .view.swipe{ - position: relative; - - .swipe-frame{ - display: block; - margin: auto; - position: relative; - } - .swipe-wrap{ - overflow: hidden; - border-left: 1px solid #999; - position: absolute; - display: block; - top: 13px; - right: 7px; - } - .frame{ - top: 0; - right: 0; - position: absolute; - &.deleted{ - margin: 0; - display: block; - top: 13px; - right: 7px; - } - } - .swipe-bar{ - display: block; - height: 100%; - width: 15px; - z-index: 100; - position: absolute; - cursor: pointer; - &:hover{ - .top-handle{ - background-position: -15px 3px; - } - .bottom-handle{ - background-position: -15px -11px; - } - }; - .top-handle{ - display: block; - height: 14px; - width: 15px; - position: absolute; - top: 0px; - background: image-url('swipemode_sprites.gif') 0 3px no-repeat; - } - .bottom-handle{ - display: block; - height: 14px; - width: 15px; - position: absolute; - bottom: 0px; - background: image-url('swipemode_sprites.gif') 0 -11px no-repeat; - } - } - } //.view.swipe - .view.onion-skin{ - .onion-skin-frame{ - display: block; - margin: auto; - position: relative; - } - .frame.added, .frame.deleted { - position: absolute; - display: block; - top: 0px; - left: 0px; - } - .controls{ - display: block; - height: 14px; - width: 300px; - z-index: 100; - position: absolute; - bottom: 0px; - left: 50%; - margin-left: -150px; - - .drag-track{ - display: block; - position: absolute; - left: 12px; - height: 10px; - width: 276px; - background: image-url('onion_skin_sprites.gif') -4px -20px repeat-x; - } - - .dragger { - display: block; - position: absolute; - left: 0px; - top: 0px; - height: 14px; - width: 14px; - background: image-url('onion_skin_sprites.gif') 0px -34px repeat-x; - cursor: pointer; - } - - .transparent { - display: block; - position: absolute; - top: 2px; - right: 0px; - height: 10px; - width: 10px; - background: image-url('onion_skin_sprites.gif') -2px 0px no-repeat; - } - - .opaque { - display: block; - position: absolute; - top: 2px; - left: 0px; - height: 10px; - width: 10px; - background: image-url('onion_skin_sprites.gif') -2px -10px no-repeat; - } - } - } //.view.onion-skin - } - .view-modes{ - padding: 10px; - text-align: center; - background: #EEE; - - ul, li{ - list-style: none; - margin: 0; - padding: 0; - display: inline-block; - } - - li{ - color: grey; - border-left: 1px solid #c1c1c1; - padding: 0 12px 0 16px; - cursor: pointer; - &:first-child{ - border-left: none; - } - &:hover{ - text-decoration: underline; - } - &.active{ - &:hover{ - text-decoration: none; - } - cursor: default; - color: #333; - } - &.disabled{ - display: none; - } - } - } -} - -.file-content .diff-file { - margin: 0; - border: none; -} - -.diff-file .line_content { - white-space: pre; -} - -.diff-wrap-lines .line_content { - white-space: pre-wrap; -} - diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss deleted file mode 100644 index 759ba6b1c22..00000000000 --- a/app/assets/stylesheets/pages/editor.scss +++ /dev/null @@ -1,54 +0,0 @@ -.file-editor { - #editor{ - border: none; - @include border-radius(0); - height: 500px; - margin: 0; - padding: 0; - position: relative; - width: 100%; - } - - .cancel-btn { - color: #B94A48; - &:hover { - color: #B94A48; - } - } - .commit-button-annotation { - display: inline-block; - margin: 0; - padding: 2px; - - > * { - float: left; - } - - .message { - display: inline-block; - margin: 5px 8px 0 8px; - } - } - - .file-title { - @extend .monospace; - font-size: 14px; - padding: 5px; - } - - .editor-ref { - background: $background-color; - padding: 11px 15px; - border-right: 1px solid #CCC; - display: inline-block; - margin: -5px -5px; - margin-right: 10px; - } - - .editor-file-name { - .new-file-name { - display: inline-block; - width: 200px; - } - } -} diff --git a/app/assets/stylesheets/pages/errors.scss b/app/assets/stylesheets/pages/errors.scss deleted file mode 100644 index 32d2d7b1dbf..00000000000 --- a/app/assets/stylesheets/pages/errors.scss +++ /dev/null @@ -1,14 +0,0 @@ -.error-page { - max-width: 400px; - margin: 0 auto; - - h1, h2, h3 { - text-align: center; - } - - h1 { - font-size: 56px; - line-height: 100px; - font-weight: 300; - } -} diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss deleted file mode 100644 index d4af7506d5b..00000000000 --- a/app/assets/stylesheets/pages/events.scss +++ /dev/null @@ -1,197 +0,0 @@ -/** - * 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; - } - - &.event-inline { - .avatar { - position: relative; - top: -2px; - } - } - - 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; - .author_name { - color: #333; - } - } - .event-body { - font-size: 13px; - margin-left: 35px; - margin-right: 80px; - color: #777; - - .event-note { - margin-top: 5px; - word-wrap: break-word; - - .md { - font-size: 13px; - - iframe.twitter-share-button { - vertical-align: bottom; - } - } - - pre { - border: none; - background: #f9f9f9; - border-radius: 0; - color: #777; - margin: 0 20px; - overflow: hidden; - } - - .note-image-attach { - margin-top: 4px; - margin-left: 0px; - max-width: 200px; - float: none; - } - - p:last-child { - margin-bottom: 0; - } - } - .event-note-icon { - color: #777; - float: left; - font-size: 16px; - line-height: 16px; - margin-right: 5px; - } - } - .event_icon { - position: relative; - float: right; - border: 1px solid #EEE; - padding: 5px; - @include border-radius(5px); - background: #F9F9F9; - margin-left: 10px; - top: -6px; - img { - width: 20px; - } - } - - &:last-child { border:none } - - .event_commits { - margin-top: 5px; - - li { - &.commit { - background: transparent; - padding: 3px; - padding-left: 0; - border: none; - .commit-row-title { - font-size: 12px; - } - } - &.commits-stat { - display: block; - padding: 3px; - padding-left: 0; - - &:hover { - background: none; - } - } - } - } - - .event-item-timestamp { - float: right; - color: #999; - line-height: 22px; - } -} - - -/* - * Last push widget - */ -.event-last-push { - overflow: auto; - .event-last-push-text { - @include str-truncated(100%); - padding: 5px 0; - font-size: 13px; - float:left; - margin-right: -150px; - padding-right: 150px; - line-height: 20px; - } -} - -@media (max-width: $screen-xs-max) { - .event-item { - .event-title { - white-space: normal; - overflow: visible; - max-width: 100%; - } - .avatar { - display: none; - } - - .event-body { - margin: 0; - border-left: 2px solid #DDD; - padding-left: 10px; - } - - .event-item-timestamp { - display: none; - } - } -} - -.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 deleted file mode 100644 index 9b92128624c..00000000000 --- a/app/assets/stylesheets/pages/explore.scss +++ /dev/null @@ -1,8 +0,0 @@ -.explore-title { - text-align: center; - - h3 { - font-weight: normal; - font-size: 30px; - } -} diff --git a/app/assets/stylesheets/pages/graph.scss b/app/assets/stylesheets/pages/graph.scss deleted file mode 100644 index c3b10d144e1..00000000000 --- a/app/assets/stylesheets/pages/graph.scss +++ /dev/null @@ -1,37 +0,0 @@ -.project-network { - border: 1px solid $border-color; - - .controls { - color: #888; - font-size: 14px; - padding: 5px; - border-bottom: 1px solid $border-color; - background: #EEE; - } - - .network-graph { - background: #FFF; - height: 500px; - overflow-y: scroll; - overflow-x: hidden; - } -} - -.graphs { - .graph-author-commits-count { - } - - .graph-author-email { - float: right; - color: #777; - } - - .graph-additions { - color: #4a2; - } - - .graph-deletions { - color: #d12f19; - } -} - diff --git a/app/assets/stylesheets/pages/groups.scss b/app/assets/stylesheets/pages/groups.scss deleted file mode 100644 index 2b1b747139a..00000000000 --- a/app/assets/stylesheets/pages/groups.scss +++ /dev/null @@ -1,12 +0,0 @@ -.new-group-member-holder { - margin-top: 50px; - padding-top: 20px; -} - -.member-search-form { - float: left; -} - -.milestone-row { - @include str-truncated(90%); -} diff --git a/app/assets/stylesheets/pages/header.scss b/app/assets/stylesheets/pages/header.scss deleted file mode 100644 index dde19b801f8..00000000000 --- a/app/assets/stylesheets/pages/header.scss +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Application Header - * - */ -header { - &.navbar-gitlab { - z-index: 100; - margin-bottom: 0; - min-height: 40px; - border: none; - width: 100%; - - .navbar-inner { - filter: none; - - .nav > li > a { - font-size: 14px; - line-height: 32px; - padding: 6px 10px; - - &:hover, &:focus, &:active { - background: none; - } - } - - /** NAV block with links and profile **/ - .nav { - float: right; - margin-right: 0; - } - - .navbar-toggle { - color: $style_color; - margin: 0; - padding: 10px; - border-radius: 0; - - button i { font-size: 22px; } - - &.collapsed { background-color: transparent !important;} - - &:hover { - background-color: #EEE; - } - } - } - - .turbolink-spinner { - font-size: 20px; - margin-right: 10px; - } - - @media (max-width: $screen-xs-max) { - border-width: 0; - font-size: 18px; - - .title { - @include str-truncated(70%); - } - - .navbar-collapse { - margin-top: 47px; - padding-right: 0; - padding-left: 0; - } - - .navbar-nav { - margin: 5px 0; - - .visible-xs, .visable-sm { - display: table-cell !important; - } - } - - li { - display: table-cell; - width: 1%; - - a { - text-align: center; - font-size: 18px !important; - } - } - } - } - - .container { - width: 100% !important; - padding: 0px; - } - - /** - * - * Logo holder - * - */ - .app_logo { - float: left; - margin-right: 9px; - - a { - float: left; - padding: 5px 0; - height: 46px; - width: 52px; - text-align: center; - - img { - width: 36px; - height: 36px; - } - } - &:hover { - background-color: #EEE; - } - } - - /** - * - * Project / Area name - * - */ - .title { - position: relative; - float: left; - margin: 0; - margin-left: 5px; - @include header-font; - @include str-truncated(37%); - } - - .profile-pic { - padding: 0px !important; - width: 46px; - height: 46px; - margin-left: 5px; - img { - width: 46px; - height: 46px; - } - } - - /** - * - * Search box - * - */ - .search { - margin-right: 10px; - margin-left: 10px; - margin-top: 8px; - - form { - margin: 0; - padding: 0; - } - - .search-input { - 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; - @include border-radius(3px); - border: 1px solid #c6c6c6; - box-shadow: none; - @include transition(all 0.15s ease-in 0s); - } - } -} - -.search .search-input { - width: 300px; - &:focus { - width: 330px; - } -} - -@media (max-width: 1200px) { - .search .search-input { - width: 200px; - &:focus { - width: 230px; - } - } -} - -@media (max-width: $screen-xs-max) { - #nprogress .spinner { - right: 35px !important; - } -} diff --git a/app/assets/stylesheets/pages/help.scss b/app/assets/stylesheets/pages/help.scss deleted file mode 100644 index 6da7a2511a2..00000000000 --- a/app/assets/stylesheets/pages/help.scss +++ /dev/null @@ -1,70 +0,0 @@ -.documentation-index { - h1 { - margin: 0; - } - - h2 { - font-size: 20px; - } - - li { - line-height: 24px; - color: #888; - - a { - margin-right: 3px; - } - } -} - - -.shortcut-mappings { - font-size: 12px; - color: #555; - - tbody:first-child tr:first-child { - padding-top: 0 - } - - th { - padding-top: 15px; - line-height: 1.5; - color: #333; - text-align: left - } - - td { - padding-top: 3px; - padding-bottom: 3px; - vertical-align: top; - line-height: 20px - } - - .shortcut { - padding-right: 10px; - color: #999; - text-align: right; - white-space: nowrap - } - - .key { - @extend .label; - @extend .label-inverse; - font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; - padding: 3px 5px; - } -} - -.modal-body { - position: relative; - overflow-y: auto; - padding: 15px; -} - -body.modal-open { - overflow: hidden; -} - -.modal .modal-dialog { - width: 860px; -} diff --git a/app/assets/stylesheets/pages/import.scss b/app/assets/stylesheets/pages/import.scss deleted file mode 100644 index 3df4bb84bd2..00000000000 --- a/app/assets/stylesheets/pages/import.scss +++ /dev/null @@ -1,18 +0,0 @@ -i.icon-gitorious { - display: inline-block; - background-position: 0px 0px; - background-size: contain; - background-repeat: no-repeat; -} - -i.icon-gitorious-small { - background-image: image-url('gitorious-logo-blue.png'); - width: 13px; - height: 13px; -} - -i.icon-gitorious-big { - background-image: image-url('gitorious-logo-black.png'); - width: 18px; - height: 18px; -} diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss deleted file mode 100644 index a640a4e2051..00000000000 --- a/app/assets/stylesheets/pages/issuable.scss +++ /dev/null @@ -1,47 +0,0 @@ -@media (max-width: $screen-sm-max) { - .issuable-affix { - margin-top: 20px; - } -} - -@media (max-width: $screen-md-max) { - .issuable-affix { - position: static; - } -} - -@media (min-width: $screen-md-max) { - .issuable-affix { - &.affix-top { - position: static; - } - - &.affix { - position: fixed; - top: 70px; - width: 220px; - } - } -} - -.issuable-context-title { - font-size: 14px; - line-height: 1.4; - margin-bottom: 5px; - - .avatar { - margin-left: 0; - } - - label { - color: #666; - font-weight: normal; - margin-right: 4px; - } -} - -.issuable-affix .context { - font-size: 13px; - - .btn { font-size: 13px; } -} diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss deleted file mode 100644 index cd86a9be8b2..00000000000 --- a/app/assets/stylesheets/pages/issues.scss +++ /dev/null @@ -1,156 +0,0 @@ -.issues-list { - .issue { - padding: 10px 15px; - position: relative; - - .issue-title { - margin-bottom: 5px; - font-size: $list-font-size; - font-weight: bold; - } - - .issue-info { - color: #999; - font-size: 13px; - } - - .issue-check { - float: left; - padding-right: 8px; - margin-bottom: 10px; - min-width: 15px; - } - - .issue-labels { - display: inline-block; - } - - .issue-actions { - display: none; - position: absolute; - top: 10px; - right: 15px; - } - - &:hover { - .issue-actions { - display: block; - } - } - } -} - -.check-all-holder { - line-height: 36px; - float: left; - margin-right: 15px; -} - -.issues_content { - .title { - height: 40px; - } - - form { - margin: 0; - } -} - -.participants { - margin-bottom: 20px; -} - -.issue-search-form { - margin: 0; - height: 24px; - - .issue_search { - border: 1px solid #DDD !important; - background-color: #f4f4f4; - } -} - -.issue-show-labels { - a { - margin-right: 5px; - margin-bottom: 5px; - display: inline-block; - .color-label { - padding: 6px 10px; - } - } -} - -form.edit-issue { - margin: 0; -} - -.merge-request, -.issue { - &.today { - background: #EFE; - border-color: #CEC; - } - - &.closed { - background: #F9F9F9; - border-color: #E5E5E5; - } - - &.merged { - background: #F9F9F9; - border-color: #E5E5E5; - } -} - -@media (max-width: $screen-xs-max) { - .issue-btn-group { - width: 100%; - margin-top: 5px; - - .btn-group { - width: 100%; - - ul { - width: 100%; - text-align: center; - } - } - - .btn { - width: 100%; - margin-top: -1px; - - &:first-child:not(:last-child) { - border-radius: 4px 4px 0 0; - } - - &:not(:first-child):not(:last-child) { - border-radius: 0; - } - - &:last-child:not(:first-child) { - border-radius: 0 0 4px 4px; - } - } - } - - .issue { - &:hover .issue-actions { - display: none !important; - } - - .issue-updated-at { - display: none; - } - } -} - -h2.issue-title { - margin-top: 0; - font-weight: bold; -} - -.issue-form .select2-container { - width: 250px !important; -} diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss deleted file mode 100644 index d1590e42fcb..00000000000 --- a/app/assets/stylesheets/pages/labels.scss +++ /dev/null @@ -1,21 +0,0 @@ -.suggest-colors { - margin-top: 5px; - a { - @include border-radius(4px); - width: 30px; - height: 30px; - display: inline-block; - margin-right: 10px; - } -} - -.manage-labels-list { - .label { - padding: 9px; - font-size: 14px; - } -} - -.color-label { - padding: 3px 4px; -} diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss deleted file mode 100644 index 83b866c3a64..00000000000 --- a/app/assets/stylesheets/pages/login.scss +++ /dev/null @@ -1,124 +0,0 @@ -/* Login Page */ -.login-page { - .container { - max-width: 960px; - } - - .navbar-gitlab .container { - max-width: none; - } - - .brand-holder { - font-size: 18px; - line-height: 1.5; - - p { - color: #888; - } - - h1:first-child { - font-weight: normal; - margin-bottom: 30px; - } - - img { - max-width: 100%; - margin-bottom: 30px; - } - - a { - font-weight: bold; - } - } - - .login-box{ - background: #fafafa; - border-radius: 10px; - box-shadow: 0 0px 2px #CCC; - padding: 15px; - - .login-heading h3 { - font-weight: 300; - line-height: 1.5; - margin: 0 0 10px 0; - } - - .login-footer { - margin-top: 10px; - - p:last-child { - margin-bottom: 0; - } - } - - a.forgot { - float: right; - padding-top: 6px - } - - .nav .active a { - background: transparent; - } - } - - .form-control { - font-size: 14px; - padding: 10px 8px; - width: 100%; - height: auto; - - &.top { - @include border-radius(5px 5px 0 0); - margin-bottom: 0px; - } - - &.bottom { - @include border-radius(0 0 5px 5px); - border-top: 0; - margin-bottom: 20px; - } - - &.middle { - border-top: 0; - margin-bottom:0px; - @include border-radius(0); - } - - &:active, &:focus { - background-color: #FFF; - } - } - - .devise-errors { - h2 { - margin-top: 0; - font-size: 14px; - color: #a00; - } - } - - .remember-me { - margin-top: -10px; - - label { - font-weight: normal; - } - } -} - -@media (max-width: $screen-xs-max) { - .login-page { - .col-sm-5.pull-right { - float: none !important; - } - } -} - -.oauth-image-link { - margin-right: 10px; - - img { - width: 32px; - height: 32px; - } -} diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss deleted file mode 100644 index 8abd4207beb..00000000000 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ /dev/null @@ -1,191 +0,0 @@ - - /** - * MR -> show: Automerge widget - * - */ -.automerge_widget { - form { - margin-bottom: 0; - .clearfix { - margin-bottom: 0; - } - } - - .accept-merge-holder { - .accept-action { - display: inline-block; - } - - .accept-control { - display: inline-block; - margin: 0; - margin-left: 20px; - padding: 10px 0; - line-height: 20px; - font-weight: bold; - - .remove_source_checkbox { - margin: 0; - font-weight: bold; - } - } - } -} - -@media(min-width: $screen-sm-max) { - .merge-request .merge-request-tabs{ - margin: 20px 0; - - li { - a { - padding: 15px 40px; - font-size: 14px; - } - } - } -} - -.mr_source_commit, -.mr_target_commit { - .commit { - margin: 0; - padding: 2px 0; - list-style: none; - &:hover { - background: none; - } - } -} - -.label-branch { - @include border-radius(4px); - padding: 3px 4px; - border: none; - background: $hover; - color: #333; - font-family: $monospace_font; - font-weight: normal; - overflow: hidden; - - .label-project { - @include border-radius-left(4px); - padding: 3px 4px; - background: #279; - position: relative; - left: -4px; - letter-spacing: -1px; - } -} - -.mr-list { - .merge-request { - padding: 10px 15px; - position: relative; - - .merge-request-title { - margin-bottom: 5px; - font-size: $list-font-size; - font-weight: bold; - } - - .merge-request-info { - color: #999; - font-size: 13px; - - .merge-request-labels { - display: inline-block; - } - } - } -} - -.merge-request-angle { - text-align: center; - margin: 0 auto; - font-size: 2em; - line-height: 1.1; -} - -.merge-request-form-info { - padding-top: 15px; -} - -// hide mr close link for inline diff comment form -.diff-file .close-mr-link, -.diff-file .reopen-mr-link { - display: none; -} - -.mr-state-widget { - font-size: 13px; - background: #F9F9F9; - margin-bottom: 20px; - color: #666; - border: 1px solid #EEE; - @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.09)); - - .ci_widget { - padding: 10px 15px; - font-size: 15px; - border-bottom: 1px solid #BBB; - color: #777; - background-color: $background-color; - - &.ci-success { - color: $gl-success; - border-color: $gl-success; - background-color: #F1FAF1; - } - - &.ci-pending, - &.ci-running { - color: $gl-warning; - border-color: $gl-warning; - background-color: #FAF5F1; - } - - &.ci-failed, - &.ci-canceled, - &.ci-error { - color: $gl-danger; - border-color: $gl-danger; - background-color: #FAF1F1; - } - } - - .mr-widget-body { - padding: 10px 15px; - - h4 { - font-weight: normal; - } - - p:last-child { - margin-bottom: 0; - } - } - - .mr-widget-footer { - padding: 10px 15px; - border-top: 1px solid #EEE; - } - - .ci-coverage { - float: right; - } -} - -.merge-request-show-labels { - a { - margin-right: 5px; - margin-bottom: 5px; - display: inline-block; - .color-label { - padding: 6px 10px; - } - } -} - -.merge-request-form .select2-container { - width: 250px !important; -} diff --git a/app/assets/stylesheets/pages/milestone.scss b/app/assets/stylesheets/pages/milestone.scss deleted file mode 100644 index 15e3948e402..00000000000 --- a/app/assets/stylesheets/pages/milestone.scss +++ /dev/null @@ -1,9 +0,0 @@ -.issues-sortable-list .str-truncated { - max-width: 90%; -} - -li.milestone { - h4 { - font-weight: bold; - } -} diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss deleted file mode 100644 index a0522030785..00000000000 --- a/app/assets/stylesheets/pages/note_form.scss +++ /dev/null @@ -1,175 +0,0 @@ -/** - * Note Form - */ - -.comment-btn { - @extend .btn-create; -} -.reply-btn { - @extend .btn-primary; -} -.diff-file .diff-content { - tr.line_holder:hover { - &> td.line_content { - background: $hover !important; - border-color: darken($hover, 10%) !important; - } - &> td.new_line, - &> td.old_line { - background: darken($hover, 4%) !important; - border-color: darken($hover, 10%) !important; - } - } - - tr.line_holder:hover > td .line_note_link { - opacity: 1.0; - filter: alpha(opacity=100); - } -} -.diff-file, -.discussion { - .new_note { - margin: 0; - border: none; - } -} -.new_note { - display: none; -} - -.new_note, .edit_note { - .buttons { - float: left; - margin-top: 8px; - } - .clearfix { - margin-bottom: 0; - } - - .note-preview-holder { - > p { - overflow-x: auto; - } - } - - img { - max-width: 100%; - } - - .note_text { - width: 100%; - } -} - -/* loading indicator */ -.notes-busy { - margin: 18px; -} - -.note-image-attach { - @extend .col-md-4; - @extend .thumbnail; - margin-left: 45px; - float: none; -} - -.common-note-form { - margin: 0; - background: #F9F9F9; - padding: 5px; - border: 1px solid #DDD; -} - -.note-form-actions { - background: #F9F9F9; - height: 45px; - - .note-form-option { - margin-top: 8px; - margin-left: 30px; - @extend .pull-left; - } - - .js-notify-commit-author { - float: left; - } - - .write-preview-btn { - // makes the "absolute" position for links relative to this - position: relative; - - // preview/edit buttons - > a { - position: absolute; - right: 5px; - top: 8px; - } - } -} - -.note-edit-form { - display: none; - font-size: 13px; - - .form-actions { - padding-left: 20px; - - .btn-save { - float: left; - } - - .note-form-option { - float: left; - padding: 2px 0 0 25px; - } - } -} - -.js-note-attachment-delete { - display: none; -} - -.parallel-comment { - padding: 6px; -} - -.error-alert > .alert { - margin-top: 5px; - margin-bottom: 5px; -} - -.discussion-body, -.diff-file { - .notes .note { - border-color: #ddd; - padding: 10px 15px; - } - - .discussion-reply-holder { - background: #f9f9f9; - padding: 10px 15px; - border-top: 1px solid #DDD; - } -} - -.discussion-notes-count { - font-size: 16px; -} - -.edit_note { - .markdown-area { - min-height: 140px; - } - .note-form-actions { - background: transparent; - } -} - -.comment-hints { - color: #999; - background: #FFF; - padding: 5px; - margin-top: -11px; - border: 1px solid #DDD; - font-size: 13px; -} diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss deleted file mode 100644 index facd7e19314..00000000000 --- a/app/assets/stylesheets/pages/notes.scss +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Notes - */ - -@-webkit-keyframes targe3-note { - from { background:#fffff0; } - 50% { background:#ffffd3; } - to { background:#fffff0; } -} - -ul.notes { - display: block; - list-style: none; - margin: 0px; - padding: 0px; - - .discussion-header, - .note-header { - @extend .cgray; - padding-bottom: 15px; - - a:hover { - text-decoration: none; - } - - .avatar { - float: left; - margin-right: 10px; - } - - .discussion-last-update, - .note-last-update { - &:before { - content: "\00b7"; - } - font-size: 13px; - } - .author { - color: #333; - font-weight: bold; - &:hover { - color: $gl-link-color; - } - } - .author-username { - } - } - - .discussion { - overflow: hidden; - display: block; - position:relative; - } - - .note { - display: block; - position:relative; - .note-body { - overflow: auto; - .note-text { - overflow: auto; - word-wrap: break-word; - @include md-typography; - - hr { - margin: 10px 0; - } - } - } - .note-header { - padding-bottom: 3px; - } - - &:last-child { - border-bottom: none; - } - } -} - -// Diff code in discussion view -.discussion-body .diff-file { - .diff-header > span { - margin-right: 10px; - } - .line_content { - white-space: pre-wrap; - } -} - -.diff-file .notes_holder { - font-size: 13px; - line-height: 18px; - font-family: $regular_font; - - td { - border: 1px solid #ddd; - border-left: none; - - &.notes_line { - text-align: center; - padding: 10px 0; - background: #FFF; - } - &.notes_line2 { - text-align: center; - padding: 10px 0; - border-left: 1px solid #ddd !important; - } - &.notes_content { - background-color: #fff; - border-width: 1px 0; - padding-top: 0; - vertical-align: top; - &.parallel{ - border-width: 1px; - } - } - } -} - -/** - * Actions for Discussions/Notes - */ - -.discussion, -.note { - &.note:hover { - .note-actions { display: block; } - } - .discussion-header:hover { - .discussion-actions { display: block; } - } - - .discussion-actions, - .note-actions { - display: none; - float: right; - - [class~="fa"] { - font-size: 16px; - line-height: 16px; - vertical-align: middle; - } - - a { - @extend .cgray; - - &:hover { - &.danger { @extend .cred; } - } - } - } -} -.diff-file .note .note-actions { - right: 0; - top: 0; -} - - -/** - * Line note button on the side of diffs - */ - -.diff-file tr.line_holder { - @mixin show-add-diff-note { - filter: alpha(opacity=100); - opacity: 1.0; - } - - .add-diff-note { - margin-top: -4px; - @include border-radius(40px); - background: #FFF; - padding: 4px; - font-size: 16px; - color: $gl-link-color; - margin-left: -60px; - position: absolute; - z-index: 10; - width: 32px; - - transition: all 0.2s ease; - - // "hide" it by default - opacity: 0.0; - filter: alpha(opacity=0); - - &:hover { - width: 38px; - font-size: 20px; - background: $gl-info; - color: #FFF; - @include show-add-diff-note; - } - } - - // "show" the icon also if we just hover somewhere over the line - &:hover > td { - background: $hover !important; - - .add-diff-note { - @include show-add-diff-note; - } - } -} - diff --git a/app/assets/stylesheets/pages/notifications.scss b/app/assets/stylesheets/pages/notifications.scss deleted file mode 100644 index cc273f55222..00000000000 --- a/app/assets/stylesheets/pages/notifications.scss +++ /dev/null @@ -1,22 +0,0 @@ -.global-notifications-form .level-title { - font-size: 15px; - color: #333; - font-weight: bold; -} - -.notification-icon-holder { - width: 20px; - float: left; -} - -.ns-part { - color: $gl-primary; -} - -.ns-watch { - color: $gl-success; -} - -.ns-mute { - color: $gl-danger; -} diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss deleted file mode 100644 index 65655d4bfa3..00000000000 --- a/app/assets/stylesheets/pages/profile.scss +++ /dev/null @@ -1,95 +0,0 @@ -.account-page { - fieldset { - margin-bottom: 15px; - padding-bottom: 15px; - } -} - -.btn-build-token { - float: left; - padding: 6px 20px; - margin-right: 12px; -} - -.profile-avatar-form-option { - hr { - margin: 10px 0; - } -} - -/* - * Appearance settings - * - */ -.themes_opts { - label { - margin-right: 20px; - text-align: center; - - .prev { - height: 80px; - width: 160px; - margin-bottom: 10px; - @include border-radius(4px); - - &.classic { - background: #31363e; - } - - &.default { - background: #f1f1f1; - } - - &.modern { - background: #009871; - } - - &.gray { - background: #373737; - } - - &.violet { - background: #548; - } - - &.blue { - background: #2980b9; - } - } - } -} - -.code_highlight_opts { - margin-top: 10px; - - label { - margin-right: 20px; - text-align: center; - - .prev { - width: 160px; - margin-bottom: 10px; - - img { - max-width: 100%; - @include border-radius(4px); - } - } - } -} - -.oauth-buttons { - .btn-group { - margin-right: 10px; - } - - .btn { - line-height: 36px; - height: 56px; - - img { - width: 32px; - height: 32px; - } - } -} diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss deleted file mode 100644 index c005470355e..00000000000 --- a/app/assets/stylesheets/pages/projects.scss +++ /dev/null @@ -1,328 +0,0 @@ -.new_project, -.edit_project { - fieldset.features { - .control-label { - font-weight: bold; - } - } -} - -.project-name-holder { - .help-inline { - vertical-align: top; - padding: 7px; - } -} - -.project-home-panel { - margin-bottom: 20px; - position: relative; - padding-left: 85px; - - &.empty-project { - border-bottom: 0px; - padding-bottom: 15px; - margin-bottom: 0px; - } - - .project-identicon-holder { - position: absolute; - left: 0; - - .avatar { - width: 70px; - height: 70px; - } - - .identicon { - font-size: 45px; - line-height: 1.6; - } - - .avatar, .identicon { - @include border-radius(4px); - box-shadow: 0 1px 2px #ddd; - } - } - - .project-home-dropdown { - margin-left: 10px; - float: right; - } - - .project-home-row { - @extend .clearfix; - margin-bottom: 15px; - - &.project-home-row-top { - margin-bottom: 15px; - } - - .project-home-desc { - font-size: 16px; - line-height: 1.3; - margin-right: 215px; - } - - .project-home-desc { - float: left; - color: $gray; - } - } - - .visibility-level-label { - color: $gray; - i { - color: inherit; - } - } - - .project-repo-buttons { - margin-top: -3px; - position: absolute; - right: 0; - width: 260px; - text-align: right; - - .btn { - font-weight: bold; - font-size: 14px; - line-height: 16px; - - .count { - padding-left: 10px; - border-left: 1px solid #ccc; - display: inline-block; - margin-left: 10px; - } - } - } -} - -.project-home-links { - padding: 10px 0px; - float: right; - a { - margin-left: 10px; - font-weight: 500; - } -} - -.git-clone-holder { - .project-home-dropdown + & { - margin-right: 45px; - } - - .form-control { - cursor: auto; - @extend .monospace; - background: #FAFAFA; - width: 100%; - } - - .input-group-addon { - background: #FAFAFA; - } -} - -.project-visibility-level-holder { - .radio { - margin-bottom: 10px; - - i { - margin: 0 3px; - font-size: 20px; - } - - .option-title { - font-weight: bold; - display: inline-block; - } - - .option-descr { - margin-left: 24px; - color: $gray; - } - } -} - -.save-project-loader { - margin-top: 50px; - margin-bottom: 50px; - color: #555; -} - -ul.nav.nav-projects-tabs { - @extend .nav-tabs; - - padding-left: 8px; - - li { - a { - padding: 6px 25px; - margin-top: 2px; - border-color: #DDD; - background-color: #EEE; - text-shadow: 0 1px 1px white; - color: #555; - } - &.active { - a { - font-weight: bold; - } - } - } -} - -.project_member_row form { - 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 { - .btn-block { - background-image: none; - - .btn, &.btn { - white-space: normal; - text-align: left; - padding: 10px 15px; - - &.dropdown-toggle { - text-align: center; - } - - &:hover { - background-color: #eee; - border-color: #DDD; - } - } - - .count { - float: right; - font-weight: 500; - text-shadow: 0 1px #FFF; - } - - &.btn-group-justified { - .btn { - width: 100%; - } - .dropdown-toggle { - width: 30px; - padding: 10px; - } - ul { - width: 100%; - } - } - } - - .project-fork-icon { - float: left; - font-size: 26px; - margin-right: 10px; - line-height: 1.5; - } -} - -.transfer-project .select2-container { - min-width: 200px; -} - -.deploy-project-label { - margin: 1px; -} - -.vs-public { - color: $gl-primary; -} - -.vs-internal { - color: $gl-warning; -} - -.vs-private { - color: $gl-success; -} - -.breadcrumb.repo-breadcrumb { - padding: 2px 0; - background: white; - border: none; - font-size: 16px; - - > li + li:before { - padding: 0 3px; - color: #999; - } -} - -.fork-namespaces { - .thumbnail { - - &.fork-exists-thumbnail { - border-color: #EEE; - - .caption { - color: #999; - } - } - - &.fork-thumbnail { - border-color: #AAA; - - &:hover { - background-color: $hover; - } - } - - a { - text-decoration: none; - } - } -} - -table.table.protected-branches-list tr.no-border { - th, td { - border: 0; - } -} - -.project-import .btn { - float: left; - margin-right: 10px; -} diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss deleted file mode 100644 index bdaa17ac339..00000000000 --- a/app/assets/stylesheets/pages/search.scss +++ /dev/null @@ -1,7 +0,0 @@ -.search-results { - .search-result-row { - border-bottom: 1px solid #EEE; - padding-bottom: 10px; - margin-bottom: 10px; - } -} diff --git a/app/assets/stylesheets/pages/snippets.scss b/app/assets/stylesheets/pages/snippets.scss deleted file mode 100644 index d79591d9915..00000000000 --- a/app/assets/stylesheets/pages/snippets.scss +++ /dev/null @@ -1,8 +0,0 @@ -.my-snippets li:first-child { - h4 { margin-top: 0; } - padding-top: 0; -} - -.snippet-form-holder .file-holder .file-title { - padding: 2px; -} diff --git a/app/assets/stylesheets/pages/stat_graph.scss b/app/assets/stylesheets/pages/stat_graph.scss deleted file mode 100644 index b9be47e7700..00000000000 --- a/app/assets/stylesheets/pages/stat_graph.scss +++ /dev/null @@ -1,50 +0,0 @@ -.tint-box { - background: #f3f3f3; - position: relative; - margin-bottom: 10px; -} - -.area { - fill: #1db34f; - fill-opacity: 0.5; -} - -.axis { - fill: #aaa; - font-size: 10px; -} - -#contributors { - .contributors-list { - margin: 0 0 10px 0; - list-style: none; - padding: 0; - } - - .person { - &:nth-child(even) { - float: right; - } - float: left; - margin-top: 10px; - } - - .person .spark { - display: block; - background: #f3f3f3; - } - - .person .area-contributor { - fill: #f17f49; - } -} - -.selection rect { - fill: #333; - fill-opacity: 0.1; - stroke: #333; - stroke-width: 1px; - stroke-opacity: 0.4; - shape-rendering: crispedges; - stroke-dasharray: 3 3; -} diff --git a/app/assets/stylesheets/pages/themes.scss b/app/assets/stylesheets/pages/themes.scss deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss deleted file mode 100644 index 57f63b52aa1..00000000000 --- a/app/assets/stylesheets/pages/tree.scss +++ /dev/null @@ -1,153 +0,0 @@ -.tree-holder { - .tree-content-holder { - float: left; - width: 100%; - } - - .tree_progress { - display: none; - margin: 20px; - &.loading { - display: block; - } - } - - .tree-table { - @extend .table; - @include border-radius(0); - - tr { - &:hover { - td { - background: $hover; - border-top: 1px solid #ADF; - border-bottom: 1px solid #ADF; - } - cursor: pointer; - } - &.selected { - td { - background: $background-color; - border-top: 1px solid #EEE; - border-bottom: 1px solid #EEE; - } - } - } - } - - .tree-item { - .tree-item-file-name { - max-width: 320px; - vertical-align: middle; - - i, a { - color: $gl-link-color; - } - - img { - position: relative; - top:-1px; - } - } - - .tree_commit { - max-width: 320px; - } - - .tree_time_ago { - min-width: 135px; - } - } - - .tree_author { - padding-right: 8px; - - .commit-author-name { - color: gray; - } - } - - .tree_commit { - color: gray; - - .tree-commit-link { - color: 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; - } - td.blame-numbers { - pre { - color: #AAA; - white-space: pre; - } - background: #f1f1f1; - border-left: 1px solid #DDD; - } - td.lines { - code { - font-family: $monospace_font; - } - } - } -} - -.tree-download-holder .btn { - padding: 4px 12px; -} - -.tree-ref-holder { - float: left; - margin-right: 15px; - - .select2-container .select2-choice, .select2-container.select2-drop-above .select2-choice { - padding: 4px 12px; - } -} - -.readme-holder { - .readme-file-title { - font-size: 14px; - font-weight: bold; - margin-bottom: 20px; - color: #777; - border-bottom: 1px solid #DDD; - padding: 10px 0; - } -} - -.blob-commit-info { - list-style: none; - margin: 0; - padding: 0; - margin-bottom: 10px; - - .commit { - padding: 10px 15px; - - .commit-row-title { - font-size: 13px; - - .commit-row-message { - font-weight: normal; - color: #555; - } - } - } -} - -#modal-remove-blob > .modal-dialog { width: 850px; } diff --git a/app/assets/stylesheets/pages/ui_dev_kit.scss b/app/assets/stylesheets/pages/ui_dev_kit.scss deleted file mode 100644 index 277afa1db9e..00000000000 --- a/app/assets/stylesheets/pages/ui_dev_kit.scss +++ /dev/null @@ -1,9 +0,0 @@ -.gitlab-ui-dev-kit { - > h2 { - font-size: 27px; - border-bottom: 1px solid #CCC; - color: #666; - margin: 30px 0; - font-weight: bold; - } -} diff --git a/app/assets/stylesheets/pages/votes.scss b/app/assets/stylesheets/pages/votes.scss deleted file mode 100644 index dc9a7d71e8b..00000000000 --- a/app/assets/stylesheets/pages/votes.scss +++ /dev/null @@ -1,4 +0,0 @@ -.votes-inline { - display: inline-block; - margin: 0 8px; -} diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss deleted file mode 100644 index dfaeba41cf6..00000000000 --- a/app/assets/stylesheets/pages/wiki.scss +++ /dev/null @@ -1,6 +0,0 @@ -.title .edit-wiki-header { - width: 780px; - margin-left: auto; - margin-right: auto; - padding-right: 7px; -} diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss deleted file mode 100644 index 1be0551ad3b..00000000000 --- a/app/assets/stylesheets/print.scss +++ /dev/null @@ -1,17 +0,0 @@ -/* Generic print styles */ -header, nav, nav.main-nav, nav.navbar-collapse, nav.navbar-collapse.collapse {display: none!important;} -.profiler-results {display: none;} - -/* Styles targeted specifically at printing files */ -.tree-ref-holder, .tree-holder .breadcrumb, .blob-commit-info {display: none;} -.file-title {display: none;} -.file-holder {border: none;} - -.wiki h1, .wiki h2, .wiki h3, .wiki h4, .wiki h5, .wiki h6 {margin-top: 17px; } -.wiki h1 {font-size: 30px;} -.wiki h2 {font-size: 22px;} -.wiki h3 {font-size: 18px; font-weight: bold; } - -.sidebar-wrapper { display: none; } -.nav { display: none; } -.btn { display: none; } diff --git a/app/assets/stylesheets/themes/dark-theme.scss b/app/assets/stylesheets/themes/dark-theme.scss deleted file mode 100644 index b7b22a8724e..00000000000 --- a/app/assets/stylesheets/themes/dark-theme.scss +++ /dev/null @@ -1,63 +0,0 @@ -@mixin dark-theme($color-light, $color, $color-darker, $color-dark) { - header { - &.navbar-gitlab { - .navbar-inner { - background: $color; - - .navbar-toggle { - color: #FFF; - } - - .app_logo, .navbar-toggle { - &:hover { - background-color: $color-darker; - } - } - - .app_logo { - background-color: $color-dark; - } - - .title { - color: #FFF; - - a { - color: #FFF; - &:hover { - text-decoration: underline; - } - } - } - - .search { - .search-input { - background-color: $color-light; - background-color: rgba(255, 255, 255, 0.5); - border: 1px solid $color-light; - - &:focus { - background-color: white; - } - } - } - - .search-input::-webkit-input-placeholder { - color: #666; - } - - .nav > li > a { - color: $color-light; - - &:hover, &:focus, &:active { - background: none; - color: #FFF; - } - } - - .search-input { - border-color: $color-light; - } - } - } - } -} diff --git a/app/assets/stylesheets/themes/ui_basic.scss b/app/assets/stylesheets/themes/ui_basic.scss deleted file mode 100644 index 097d5c5b73c..00000000000 --- a/app/assets/stylesheets/themes/ui_basic.scss +++ /dev/null @@ -1,30 +0,0 @@ -/** - * This file represent some UI that can be changed - * during web app restyle or theme select. - * - */ -.ui_basic { - header { - &.navbar-gitlab { - .navbar-inner { - background: #F1F1F1; - border-bottom: 1px solid #DDD; - - .title { - color: #555; - - a { - color: #555; - &:hover { - text-decoration: underline; - } - } - } - - .nav > li > a { - color: $style_color; - } - } - } - } -} diff --git a/app/assets/stylesheets/themes/ui_blue.scss b/app/assets/stylesheets/themes/ui_blue.scss deleted file mode 100644 index e223058be8b..00000000000 --- a/app/assets/stylesheets/themes/ui_blue.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Blue GitLab UI theme - */ -.ui_blue { - @include dark-theme(#BECDE9, #2980b9, #1970a9, #096099); -} diff --git a/app/assets/stylesheets/themes/ui_color.scss b/app/assets/stylesheets/themes/ui_color.scss deleted file mode 100644 index 7ac6903b2e4..00000000000 --- a/app/assets/stylesheets/themes/ui_color.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Violet GitLab UI theme - */ -.ui_color { - @include dark-theme(#98C, #548, #436, #325); -} diff --git a/app/assets/stylesheets/themes/ui_gray.scss b/app/assets/stylesheets/themes/ui_gray.scss deleted file mode 100644 index 9257e5f4d40..00000000000 --- a/app/assets/stylesheets/themes/ui_gray.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Gray GitLab UI theme - */ -.ui_gray { - @include dark-theme(#979797, #373737, #272727, #222222); -} diff --git a/app/assets/stylesheets/themes/ui_mars.scss b/app/assets/stylesheets/themes/ui_mars.scss deleted file mode 100644 index 4caf5843d9b..00000000000 --- a/app/assets/stylesheets/themes/ui_mars.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Classic GitLab UI theme - */ -.ui_mars { - @include dark-theme(#979DA7, #474D57, #373D47, #24272D); -} diff --git a/app/assets/stylesheets/themes/ui_modern.scss b/app/assets/stylesheets/themes/ui_modern.scss deleted file mode 100644 index 70449882317..00000000000 --- a/app/assets/stylesheets/themes/ui_modern.scss +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Modern GitLab UI theme - */ -.ui_modern { - @include dark-theme(#ADC, #019875, #018865, #017855); -} diff --git a/app/controllers/admin/application_controller.rb b/app/controllers/admin/application_controller.rb deleted file mode 100644 index 6a8f20f6047..00000000000 --- a/app/controllers/admin/application_controller.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Provides a base class for Admin controllers to subclass -# -# Automatically sets the layout and ensures an administrator is logged in -class Admin::ApplicationController < ApplicationController - layout 'admin' - before_filter :authenticate_admin! - - def authenticate_admin! - return render_404 unless current_user.is_admin? - end -end diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb deleted file mode 100644 index b5fda196bf0..00000000000 --- a/app/controllers/admin/application_settings_controller.rb +++ /dev/null @@ -1,45 +0,0 @@ -class Admin::ApplicationSettingsController < Admin::ApplicationController - before_filter :set_application_setting - - def show - end - - def update - if @application_setting.update_attributes(application_setting_params) - redirect_to admin_application_settings_path, - notice: 'Application settings saved successfully' - else - render :show - end - end - - private - - def set_application_setting - @application_setting = ApplicationSetting.current - end - - def application_setting_params - restricted_levels = params[:application_setting][:restricted_visibility_levels] - if restricted_levels.nil? - params[:application_setting][:restricted_visibility_levels] = [] - else - restricted_levels.map! do |level| - level.to_i - end - end - - params.require(:application_setting).permit( - :default_projects_limit, - :default_branch_protection, - :signup_enabled, - :signin_enabled, - :gravatar_enabled, - :twitter_sharing_enabled, - :sign_in_text, - :home_page_url, - :max_attachment_size, - restricted_visibility_levels: [] - ) - end -end diff --git a/app/controllers/admin/applications_controller.rb b/app/controllers/admin/applications_controller.rb deleted file mode 100644 index 471d24934a0..00000000000 --- a/app/controllers/admin/applications_controller.rb +++ /dev/null @@ -1,52 +0,0 @@ -class Admin::ApplicationsController < Admin::ApplicationController - before_action :set_application, only: [:show, :edit, :update, :destroy] - - def index - @applications = Doorkeeper::Application.where("owner_id IS NULL") - end - - def show - end - - def new - @application = Doorkeeper::Application.new - end - - def edit - end - - def create - @application = Doorkeeper::Application.new(application_params) - - if @application.save - flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) - redirect_to admin_application_url(@application) - else - render :new - end - end - - def update - if @application.update(application_params) - redirect_to admin_application_path(@application), notice: 'Application was successfully updated.' - else - render :edit - end - end - - def destroy - @application.destroy - redirect_to admin_applications_url, notice: 'Application was successfully destroyed.' - end - - private - - def set_application - @application = Doorkeeper::Application.where("owner_id IS NULL").find(params[:id]) - end - - # Only allow a trusted parameter "white list" through. - def application_params - params[:doorkeeper_application].permit(:name, :redirect_uri) - end -end diff --git a/app/controllers/admin/background_jobs_controller.rb b/app/controllers/admin/background_jobs_controller.rb deleted file mode 100644 index 338496013a0..00000000000 --- a/app/controllers/admin/background_jobs_controller.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Admin::BackgroundJobsController < Admin::ApplicationController - def show - ps_output, _ = Gitlab::Popen.popen(%W(ps -U #{Gitlab.config.gitlab.user} -o pid,pcpu,pmem,stat,start,command)) - @sidekiq_processes = ps_output.split("\n").grep(/sidekiq/) - end -end diff --git a/app/controllers/admin/broadcast_messages_controller.rb b/app/controllers/admin/broadcast_messages_controller.rb deleted file mode 100644 index e1643bb34bf..00000000000 --- a/app/controllers/admin/broadcast_messages_controller.rb +++ /dev/null @@ -1,39 +0,0 @@ -class Admin::BroadcastMessagesController < Admin::ApplicationController - before_filter :broadcast_messages - - def index - @broadcast_message = BroadcastMessage.new - end - - def create - @broadcast_message = BroadcastMessage.new(broadcast_message_params) - - if @broadcast_message.save - redirect_to admin_broadcast_messages_path, notice: 'Broadcast Message was successfully created.' - else - render :index - end - end - - def destroy - BroadcastMessage.find(params[:id]).destroy - - respond_to do |format| - format.html { redirect_to :back } - format.js { render nothing: true } - end - end - - protected - - def broadcast_messages - @broadcast_messages ||= BroadcastMessage.order("starts_at DESC").page(params[:page]) - end - - def broadcast_message_params - params.require(:broadcast_message).permit( - :alert_type, :color, :ends_at, :font, - :message, :starts_at - ) - end -end diff --git a/app/controllers/admin/dashboard_controller.rb b/app/controllers/admin/dashboard_controller.rb deleted file mode 100644 index c491e5c7550..00000000000 --- a/app/controllers/admin/dashboard_controller.rb +++ /dev/null @@ -1,7 +0,0 @@ -class Admin::DashboardController < Admin::ApplicationController - def index - @projects = Project.limit(10) - @users = User.limit(10) - @groups = Group.limit(10) - end -end diff --git a/app/controllers/admin/deploy_keys_controller.rb b/app/controllers/admin/deploy_keys_controller.rb deleted file mode 100644 index e93603bef36..00000000000 --- a/app/controllers/admin/deploy_keys_controller.rb +++ /dev/null @@ -1,49 +0,0 @@ -class Admin::DeployKeysController < Admin::ApplicationController - before_filter :deploy_keys, only: [:index] - before_filter :deploy_key, only: [:show, :destroy] - - def index - - end - - def show - - end - - def new - @deploy_key = deploy_keys.new - end - - def create - @deploy_key = deploy_keys.new(deploy_key_params) - - if @deploy_key.save - redirect_to admin_deploy_keys_path - else - render "new" - end - end - - def destroy - deploy_key.destroy - - respond_to do |format| - format.html { redirect_to admin_deploy_keys_path } - format.json { head :ok } - end - end - - protected - - def deploy_key - @deploy_key ||= deploy_keys.find(params[:id]) - end - - def deploy_keys - @deploy_keys ||= DeployKey.are_public - end - - def deploy_key_params - params.require(:deploy_key).permit(:key, :title) - end -end diff --git a/app/controllers/admin/groups_controller.rb b/app/controllers/admin/groups_controller.rb deleted file mode 100644 index 22d045fc388..00000000000 --- a/app/controllers/admin/groups_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Admin::GroupsController < Admin::ApplicationController - before_filter :group, only: [:edit, :show, :update, :destroy, :project_update, :members_update] - - def index - @groups = Group.all - @groups = @groups.sort(@sort = params[:sort]) - @groups = @groups.search(params[:name]) if params[:name].present? - @groups = @groups.page(params[:page]).per(PER_PAGE) - end - - def show - @members = @group.members.order("access_level DESC").page(params[:members_page]).per(PER_PAGE) - @projects = @group.projects.page(params[:projects_page]).per(PER_PAGE) - end - - def new - @group = Group.new - end - - def edit - end - - def create - @group = Group.new(group_params) - @group.name = @group.path.dup unless @group.name - - if @group.save - @group.add_owner(current_user) - redirect_to [:admin, @group], notice: 'Group was successfully created.' - else - render "new" - end - end - - def update - if @group.update_attributes(group_params) - redirect_to [:admin, @group], notice: 'Group was successfully updated.' - else - render "edit" - end - end - - def members_update - @group.add_users(params[:user_ids].split(','), params[:access_level], current_user) - - redirect_to [:admin, @group], notice: 'Users were successfully added.' - end - - def destroy - @group.destroy - - redirect_to admin_groups_path, notice: 'Group was successfully deleted.' - end - - private - - def group - @group = Group.find_by(path: params[:id]) - end - - def group_params - params.require(:group).permit(:name, :description, :path, :avatar) - end -end diff --git a/app/controllers/admin/hooks_controller.rb b/app/controllers/admin/hooks_controller.rb deleted file mode 100644 index 0a463239d74..00000000000 --- a/app/controllers/admin/hooks_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -class Admin::HooksController < Admin::ApplicationController - def index - @hooks = SystemHook.all - @hook = SystemHook.new - end - - def create - @hook = SystemHook.new(hook_params) - - if @hook.save - redirect_to admin_hooks_path, notice: 'Hook was successfully created.' - else - @hooks = SystemHook.all - render :index - end - end - - def destroy - @hook = SystemHook.find(params[:id]) - @hook.destroy - - redirect_to admin_hooks_path - end - - - def test - @hook = SystemHook.find(params[:hook_id]) - data = { - event_name: "project_create", - name: "Ruby", - path: "ruby", - project_id: 1, - owner_name: "Someone", - owner_email: "example@gitlabhq.com" - } - @hook.execute(data) - - redirect_to :back - end - - def hook_params - params.require(:hook).permit(:url) - end -end diff --git a/app/controllers/admin/keys_controller.rb b/app/controllers/admin/keys_controller.rb deleted file mode 100644 index 21111bb44f5..00000000000 --- a/app/controllers/admin/keys_controller.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Admin::KeysController < Admin::ApplicationController - before_filter :user, only: [:show, :destroy] - - def show - @key = user.keys.find(params[:id]) - - respond_to do |format| - format.html - format.js { render nothing: true } - end - end - - def destroy - key = user.keys.find(params[:id]) - - respond_to do |format| - if key.destroy - format.html { redirect_to [:admin, user], notice: 'User key was successfully removed.' } - else - format.html { redirect_to [:admin, user], alert: 'Failed to remove user key.' } - end - end - end - - protected - - def user - @user ||= User.find_by!(username: params[:user_id]) - end - - def key_params - params.require(:user_id, :id) - end -end diff --git a/app/controllers/admin/logs_controller.rb b/app/controllers/admin/logs_controller.rb deleted file mode 100644 index b999018dde4..00000000000 --- a/app/controllers/admin/logs_controller.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Admin::LogsController < Admin::ApplicationController -end diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb deleted file mode 100644 index 5176a8399ae..00000000000 --- a/app/controllers/admin/projects_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -class Admin::ProjectsController < Admin::ApplicationController - before_filter :project, only: [:show, :transfer] - before_filter :group, only: [:show, :transfer] - before_filter :repository, only: [:show, :transfer] - - def index - @projects = Project.all - @projects = @projects.where(namespace_id: params[:namespace_id]) if params[:namespace_id].present? - @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.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) - end - - def show - if @group - @group_members = @group.members.order("access_level DESC").page(params[:group_members_page]).per(PER_PAGE) - end - - @project_members = @project.project_members.page(params[:project_members_page]).per(PER_PAGE) - end - - def transfer - ::Projects::TransferService.new(@project, current_user, params.dup).execute - - @project.reload - redirect_to admin_namespace_project_path(@project.namespace, @project) - end - - protected - - def project - @project = Project.find_with_namespace( - [params[:namespace_id], '/', params[:id]].join('') - ) - @project || render_404 - end - - def group - @group ||= @project.group - end -end diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb deleted file mode 100644 index 76a938c5fe4..00000000000 --- a/app/controllers/admin/services_controller.rb +++ /dev/null @@ -1,54 +0,0 @@ -class Admin::ServicesController < Admin::ApplicationController - before_filter :service, only: [:edit, :update] - - def index - @services = services_templates - end - - def edit - unless service.present? - redirect_to admin_application_settings_services_path, - alert: "Service is unknown or it doesn't exist" - end - end - - def update - if service.update_attributes(application_services_params[:service]) - redirect_to admin_application_settings_services_path, - notice: 'Application settings saved successfully' - else - render :edit - end - end - - private - - def services_templates - templates = [] - - Service.available_services_names.each do |service_name| - service_template = service_name.concat("_service").camelize.constantize - templates << service_template.where(template: true).first_or_create - end - - templates - end - - def service - @service ||= Service.where(id: params[:id], template: true).first - end - - def application_services_params - params.permit(:id, - service: [ - :title, :token, :type, :active, :api_key, :subdomain, - :room, :recipients, :project_url, :webhook, - :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server, :teamcity_url, :build_type, - :description, :issues_url, :new_issue_url, :restrict_to_branch, - :send_from_committer_email, :disable_diffs, - :push_events, :tag_push_events, :note_events, :issues_events, - :merge_requests_events - ]) - end -end diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb deleted file mode 100644 index b4c011f213c..00000000000 --- a/app/controllers/admin/users_controller.rb +++ /dev/null @@ -1,128 +0,0 @@ -class Admin::UsersController < Admin::ApplicationController - before_filter :user, only: [:show, :edit, :update, :destroy] - - def index - @users = User.order_name_asc.filter(params[:filter]) - @users = @users.search(params[:name]) if params[:name].present? - @users = @users.sort(@sort = params[:sort]) - @users = @users.page(params[:page]) - end - - def show - @personal_projects = user.personal_projects - @joined_projects = user.projects.joined(@user) - @keys = user.keys - end - - def new - @user = User.new - end - - def edit - user - end - - def block - if user.block - redirect_to :back, notice: "Successfully blocked" - else - redirect_to :back, alert: "Error occurred. User was not blocked" - end - end - - def unblock - if user.activate - redirect_to :back, notice: "Successfully unblocked" - else - redirect_to :back, alert: "Error occurred. User was not unblocked" - end - end - - def create - opts = { - force_random_password: true, - password_expires_at: nil - } - - @user = User.new(user_params.merge(opts)) - @user.created_by_id = current_user.id - @user.generate_password - @user.generate_reset_token - @user.skip_confirmation! - - respond_to do |format| - if @user.save - format.html { redirect_to [:admin, @user], notice: 'User was successfully created.' } - format.json { render json: @user, status: :created, location: @user } - else - format.html { render "new" } - format.json { render json: @user.errors, status: :unprocessable_entity } - end - end - end - - def update - user_params_with_pass = user_params.dup - - if params[:user][:password].present? - user_params_with_pass.merge!( - password: params[:user][:password], - password_confirmation: params[:user][:password_confirmation], - ) - end - - respond_to do |format| - user.skip_reconfirmation! - if user.update_attributes(user_params_with_pass) - format.html { redirect_to [:admin, user], notice: 'User was successfully updated.' } - format.json { head :ok } - else - # restore username to keep form action url. - user.username = params[:id] - format.html { render "edit" } - format.json { render json: user.errors, status: :unprocessable_entity } - end - end - end - - def destroy - # 1. Remove groups where user is the only owner - user.solo_owned_groups.map(&:destroy) - - # 2. Remove user with all authored content including personal projects - user.destroy - - respond_to do |format| - format.html { redirect_to admin_users_path } - format.json { head :ok } - end - end - - def remove_email - email = user.emails.find(params[:email_id]) - email.destroy - - user.set_notification_email - user.save if user.notification_email_changed? - - respond_to do |format| - format.html { redirect_to :back, notice: "Successfully removed email." } - format.js { render nothing: true } - end - end - - protected - - def user - @user ||= User.find_by!(username: params[:id]) - end - - def user_params - params.require(:user).permit( - :email, :remember_me, :bio, :name, :username, - :skype, :linkedin, :twitter, :website_url, :color_scheme_id, :theme_id, :force_random_password, - :extern_uid, :provider, :password_expires_at, :avatar, :hide_no_ssh_key, :hide_no_password, - :projects_limit, :can_create_group, :admin, :key_id - ) - end -end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb deleted file mode 100644 index 920a981e7c9..00000000000 --- a/app/controllers/application_controller.rb +++ /dev/null @@ -1,345 +0,0 @@ -require 'gon' - -class ApplicationController < ActionController::Base - include Gitlab::CurrentSettings - include GitlabRoutingHelper - - PER_PAGE = 20 - - before_filter :authenticate_user_from_token! - before_filter :authenticate_user! - before_filter :reject_blocked! - before_filter :check_password_expiration - before_filter :ldap_security_check - before_filter :default_headers - before_filter :add_gon_variables - before_filter :configure_permitted_parameters, if: :devise_controller? - before_filter :require_email, unless: :devise_controller? - - protect_from_forgery with: :exception - - helper_method :abilities, :can?, :current_application_settings - helper_method :github_import_enabled?, :gitlab_import_enabled?, :bitbucket_import_enabled? - - rescue_from Encoding::CompatibilityError do |exception| - log_exception(exception) - render "errors/encoding", layout: "errors", status: 500 - end - - rescue_from ActiveRecord::RecordNotFound do |exception| - log_exception(exception) - render "errors/not_found", layout: "errors", status: 404 - end - - protected - - # From https://github.com/plataformatec/devise/wiki/How-To:-Simple-Token-Authentication-Example - # https://gist.github.com/josevalim/fb706b1e933ef01e4fb6 - def authenticate_user_from_token! - user_token = if params[:authenticity_token].presence - params[:authenticity_token].presence - elsif params[:private_token].presence - params[:private_token].presence - end - user = user_token && User.find_by_authentication_token(user_token.to_s) - - if user - # Notice we are passing store false, so the user is not - # actually stored in the session and a token is needed - # for every request. If you want the token to work as a - # sign in token, you can simply remove store: false. - sign_in user, store: false - end - end - - 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? - if current_user.nil? && controller_name == 'dashboard' && action_name == 'show' - redirect_to current_application_settings.home_page_url and return - end - end - - super(*args) - end - - def log_exception(exception) - application_trace = ActionDispatch::ExceptionWrapper.new(env, exception).application_trace - application_trace.map!{ |t| " #{t}\n" } - logger.error "\n#{exception.class.name} (#{exception.message}):\n#{application_trace.join}" - end - - def reject_blocked! - if current_user && current_user.blocked? - sign_out current_user - flash[:alert] = "Your account is blocked. Retry when an admin has unblocked it." - redirect_to new_user_session_path - end - end - - def after_sign_in_path_for(resource) - if resource.is_a?(User) && resource.respond_to?(:blocked?) && resource.blocked? - sign_out resource - flash[:alert] = "Your account is blocked. Retry when an admin has unblocked it." - new_user_session_path - else - stored_location_for(:redirect) || stored_location_for(resource) || root_path - end - end - - def abilities - Ability.abilities - end - - def can?(object, action, subject) - abilities.allowed?(object, action, subject) - end - - def project - unless @project - namespace = params[:namespace_id] - id = params[:project_id] || params[:id] - - # Redirect from - # localhost/group/project.git - # to - # localhost/group/project - # - if id =~ /\.git\Z/ - redirect_to request.original_url.gsub(/\.git\Z/, '') and return - end - - @project = Project.find_with_namespace("#{namespace}/#{id}") - - if @project and can?(current_user, :read_project, @project) - @project - elsif current_user.nil? - @project = nil - authenticate_user! - else - @project = nil - render_404 and return - end - end - @project - end - - def repository - @repository ||= project.repository - rescue Grit::NoSuchPathError => e - log_exception(e) - nil - end - - def authorize_project!(action) - return access_denied! unless can?(current_user, action, project) - end - - def authorize_labels! - # Labels should be accessible for issues and/or merge requests - authorize_read_issue! || authorize_read_merge_request! - end - - def access_denied! - render "errors/access_denied", layout: "errors", status: 404 - end - - def not_found! - render "errors/not_found", layout: "errors", status: 404 - end - - def git_not_found! - render "errors/git_not_found", layout: "errors", status: 404 - end - - def method_missing(method_sym, *arguments, &block) - if method_sym.to_s =~ /\Aauthorize_(.*)!\z/ - authorize_project!($1.to_sym) - else - super - end - end - - def render_403 - head :forbidden - end - - def render_404 - render file: Rails.root.join("public", "404"), layout: false, status: "404" - end - - def require_non_empty_project - redirect_to @project if @project.empty_repo? - end - - def no_cache_headers - 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 default_url_options - if !Rails.env.test? - port = Gitlab.config.gitlab.port unless Gitlab.config.gitlab_on_standard_port? - { host: Gitlab.config.gitlab.host, - protocol: Gitlab.config.gitlab.protocol, - port: port, - script_name: Gitlab.config.gitlab.relative_url_root } - else - super - end - end - - def default_headers - headers['X-Frame-Options'] = 'DENY' - headers['X-XSS-Protection'] = '1; mode=block' - headers['X-UA-Compatible'] = 'IE=edge' - headers['X-Content-Type-Options'] = 'nosniff' - headers['Strict-Transport-Security'] = 'max-age=31536000' if Gitlab.config.gitlab.https - end - - def add_gon_variables - 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; - - if current_user - gon.current_user_id = current_user.id - gon.api_token = current_user.private_token - end - end - - def check_password_expiration - if current_user && current_user.password_expires_at && current_user.password_expires_at < Time.now && !current_user.ldap_user? - redirect_to new_profile_password_path and return - end - end - - def ldap_security_check - if current_user && current_user.requires_ldap_check? - unless Gitlab::LDAP::Access.allowed?(current_user) - sign_out current_user - flash[:alert] = "Access denied for your LDAP account." - redirect_to new_user_session_path - end - end - end - - def event_filter - filters = cookies['event_filter'].split(',') if cookies['event_filter'].present? - @event_filter ||= EventFilter.new(filters) - end - - def gitlab_ldap_access(&block) - Gitlab::LDAP::Access.open { |access| block.call(access) } - 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 view_to_html_string(partial) - render_to_string( - partial, - layout: false, - formats: [:html] - ) - end - - def configure_permitted_parameters - devise_parameter_sanitizer.sanitize(:sign_in) { |u| u.permit(:username, :email, :password, :login, :remember_me) } - end - - def hexdigest(string) - Digest::SHA1.hexdigest string - end - - def require_email - if current_user && current_user.temp_oauth_email? - redirect_to profile_path, notice: 'Please complete your profile with email address' and return - end - end - - def set_filters_params - params[:sort] ||= 'created_desc' - params[:scope] = 'all' if params[:scope].blank? - params[:state] = 'opened' if params[:state].blank? - - @filter_params = params.dup - - if @project - @filter_params[:project_id] = @project.id - elsif @group - @filter_params[:group_id] = @group.id - else - # TODO: this filter ignore issues/mr created in public or - # internal repos where you are not a member. Enable this filter - # or improve current implementation to filter only issues you - # created or assigned or mentioned - #@filter_params[:authorized_only] = true - end - - @filter_params - end - - def set_filter_values(collection) - assignee_id = @filter_params[:assignee_id] - author_id = @filter_params[:author_id] - milestone_id = @filter_params[:milestone_id] - - @sort = @filter_params[:sort] - @assignees = User.where(id: collection.pluck(:assignee_id)) - @authors = User.where(id: collection.pluck(:author_id)) - @milestones = Milestone.where(id: collection.pluck(:milestone_id)) - - if assignee_id.present? && !assignee_id.to_i.zero? - @assignee = @assignees.find_by(id: assignee_id) - end - - if author_id.present? && !author_id.to_i.zero? - @author = @authors.find_by(id: author_id) - end - - if milestone_id.present? && !milestone_id.to_i.zero? - @milestone = @milestones.find_by(id: milestone_id) - end - end - - def get_issues_collection - set_filters_params - issues = IssuesFinder.new.execute(current_user, @filter_params) - set_filter_values(issues) - issues - end - - def get_merge_requests_collection - set_filters_params - merge_requests = MergeRequestsFinder.new.execute(current_user, @filter_params) - set_filter_values(merge_requests) - merge_requests - end - - def github_import_enabled? - OauthHelper.enabled_oauth_providers.include?(:github) - end - - def gitlab_import_enabled? - OauthHelper.enabled_oauth_providers.include?(:gitlab) - end - - def bitbucket_import_enabled? - OauthHelper.enabled_oauth_providers.include?(:bitbucket) && Gitlab::BitbucketImport.public_key.present? - end -end diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb deleted file mode 100644 index 11af9895261..00000000000 --- a/app/controllers/autocomplete_controller.rb +++ /dev/null @@ -1,30 +0,0 @@ -class AutocompleteController < ApplicationController - def users - @users = - if params[:project_id].present? - project = Project.find(params[:project_id]) - - if can?(current_user, :read_project, project) - project.team.users - end - elsif params[:group_id] - group = Group.find(params[:group_id]) - - if can?(current_user, :read_group, group) - group.users - end - else - User.all - end - - @users = @users.search(params[:search]) if params[:search].present? - @users = @users.active - @users = @users.page(params[:page]).per(PER_PAGE) - render json: @users, only: [:name, :username, :id], methods: [:avatar_url] - end - - def user - @user = User.find(params[:id]) - render json: @user, only: [:name, :username, :id], methods: [:avatar_url] - end -end diff --git a/app/controllers/confirmations_controller.rb b/app/controllers/confirmations_controller.rb deleted file mode 100644 index af1faca93f6..00000000000 --- a/app/controllers/confirmations_controller.rb +++ /dev/null @@ -1,17 +0,0 @@ -class ConfirmationsController < Devise::ConfirmationsController - - protected - - def after_confirmation_path_for(resource_name, resource) - if signed_in?(resource_name) - after_sign_in_path_for(resource) - else - sign_in(resource) - if signed_in?(resource_name) - after_sign_in_path_for(resource) - else - new_session_path(resource_name) - end - end - end -end diff --git a/app/controllers/dashboard/groups_controller.rb b/app/controllers/dashboard/groups_controller.rb deleted file mode 100644 index ed14f4e1f3b..00000000000 --- a/app/controllers/dashboard/groups_controller.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Dashboard::GroupsController < ApplicationController - def index - @group_members = current_user.group_members.page(params[:page]).per(PER_PAGE) - end -end diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb deleted file mode 100644 index cb51792df16..00000000000 --- a/app/controllers/dashboard/milestones_controller.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Dashboard::MilestonesController < ApplicationController - before_filter :load_projects - - def index - project_milestones = case params[:state] - when 'all'; state - when 'closed'; state('closed') - else state('active') - end - @dashboard_milestones = Milestones::GroupService.new(project_milestones).execute - @dashboard_milestones = Kaminari.paginate_array(@dashboard_milestones).page(params[:page]).per(PER_PAGE) - end - - def show - project_milestones = Milestone.where(project_id: @projects).order("due_date ASC") - @dashboard_milestone = Milestones::GroupService.new(project_milestones).milestone(title) - end - - private - - def load_projects - @projects = current_user.authorized_projects.sorted_by_activity.non_archived - end - - def title - params[:title] - end - - def state(state = nil) - conditions = { project_id: @projects } - conditions.reverse_merge!(state: state) if state - Milestone.where(conditions).order("title ASC") - end -end diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb deleted file mode 100644 index 56e6fcc41ca..00000000000 --- a/app/controllers/dashboard/projects_controller.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Dashboard::ProjectsController < ApplicationController - before_filter :event_filter - - def starred - @projects = current_user.starred_projects - @projects = @projects.includes(:namespace, :forked_from_project, :tags) - @projects = @projects.sort(@sort = params[:sort]) - @groups = [] - - respond_to do |format| - format.html - - format.json do - load_events - pager_json("events/_events", @events.count) - end - end - end - - private - - def load_events - @events = Event.in_projects(@projects.pluck(:id)) - @events = @event_filter.apply_filter(@events).with_associations - @events = @events.limit(20).offset(params[:offset] || 0) - end -end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb deleted file mode 100644 index 9bd853ed5c7..00000000000 --- a/app/controllers/dashboard_controller.rb +++ /dev/null @@ -1,54 +0,0 @@ -class DashboardController < ApplicationController - respond_to :html - - before_filter :load_projects, except: [:projects] - before_filter :event_filter, only: :show - - 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) - @merge_requests = @merge_requests.preload(:author, :target_project) - end - - def issues - @issues = get_issues_collection - @issues = @issues.page(params[:page]).per(PER_PAGE) - @issues = @issues.preload(:author, :project) - - respond_to do |format| - format.html - format.atom { render layout: false } - end - end - - protected - - def load_projects - @projects = current_user.authorized_projects.sorted_by_activity.non_archived - end - - def load_events - @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) - @events = @event_filter.apply_filter(@events).with_associations - @events = @events.limit(20).offset(params[:offset] || 0) - end -end diff --git a/app/controllers/explore/groups_controller.rb b/app/controllers/explore/groups_controller.rb deleted file mode 100644 index c51a4a211a6..00000000000 --- a/app/controllers/explore/groups_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Explore::GroupsController < ApplicationController - skip_before_filter :authenticate_user!, - :reject_blocked, :set_current_user_for_observers - - layout "explore" - - def index - @groups = GroupsFinder.new.execute(current_user) - @groups = @groups.search(params[:search]) if params[:search].present? - @groups = @groups.sort(@sort = params[:sort]) - @groups = @groups.page(params[:page]).per(PER_PAGE) - end -end diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb deleted file mode 100644 index b295f295bb1..00000000000 --- a/app/controllers/explore/projects_controller.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Explore::ProjectsController < ApplicationController - skip_before_filter :authenticate_user!, - :reject_blocked - - layout 'explore' - - 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.search(params[:search]) if params[:search].present? - @projects = @projects.sort(@sort = params[:sort]) - @projects = @projects.includes(:namespace).page(params[:page]).per(PER_PAGE) - end - - def trending - @trending_projects = TrendingProjectsFinder.new.execute(current_user) - @trending_projects = @trending_projects.page(params[:page]).per(PER_PAGE) - end - - def starred - @starred_projects = ProjectsFinder.new.execute(current_user) - @starred_projects = @starred_projects.reorder('star_count DESC') - @starred_projects = @starred_projects.page(params[:page]).per(PER_PAGE) - end -end diff --git a/app/controllers/groups/application_controller.rb b/app/controllers/groups/application_controller.rb deleted file mode 100644 index 469a6813ee2..00000000000 --- a/app/controllers/groups/application_controller.rb +++ /dev/null @@ -1,28 +0,0 @@ -class Groups::ApplicationController < ApplicationController - - private - - def authorize_read_group! - unless @group and can?(current_user, :read_group, @group) - if current_user.nil? - return authenticate_user! - else - return render_404 - end - end - end - - def authorize_admin_group! - unless can?(current_user, :admin_group, group) - return render_404 - end - end - - def determine_layout - if current_user - 'group' - else - 'public_group' - end - end -end diff --git a/app/controllers/groups/avatars_controller.rb b/app/controllers/groups/avatars_controller.rb deleted file mode 100644 index 38071410f40..00000000000 --- a/app/controllers/groups/avatars_controller.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Groups::AvatarsController < ApplicationController - layout "profile" - - def destroy - @group = Group.find_by(path: params[:group_id]) - @group.remove_avatar! - - @group.save - - redirect_to edit_group_path(@group) - end -end diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb deleted file mode 100644 index 265cf4f0f4a..00000000000 --- a/app/controllers/groups/group_members_controller.rb +++ /dev/null @@ -1,84 +0,0 @@ -class Groups::GroupMembersController < Groups::ApplicationController - skip_before_filter :authenticate_user!, only: [:index] - before_filter :group - - # Authorize - before_filter :authorize_read_group! - before_filter :authorize_admin_group!, except: [:index, :leave] - - layout :determine_layout - - def index - @project = @group.projects.find(params[:project_id]) if params[:project_id] - @members = @group.group_members - @members = @members.non_invite unless can?(current_user, :admin_group, @group) - - if params[:search].present? - users = @group.users.search(params[:search]).to_a - @members = @members.where(user_id: users) - end - - @members = @members.order('access_level DESC').page(params[:page]).per(50) - @group_member = GroupMember.new - end - - def create - @group.add_users(params[:user_ids].split(','), params[:access_level], current_user) - - redirect_to group_group_members_path(@group), notice: 'Users were successfully added.' - end - - def update - @member = @group.group_members.find(params[:id]) - @member.update_attributes(member_params) - end - - def destroy - @group_member = @group.group_members.find(params[:id]) - - if can?(current_user, :destroy_group_member, @group_member) # May fail if last owner. - @group_member.destroy - respond_to do |format| - format.html { redirect_to group_group_members_path(@group), notice: 'User was successfully removed from group.' } - format.js { render nothing: true } - end - else - return render_403 - end - end - - def resend_invite - redirect_path = group_group_members_path(@group) - - @group_member = @group.group_members.find(params[:id]) - - if @group_member.invite? - @group_member.resend_invite - - redirect_to redirect_path, notice: 'The invitation was successfully resent.' - else - redirect_to redirect_path, alert: 'The invitation has already been accepted.' - end - end - - def leave - @group_member = @group.group_members.where(user_id: current_user.id).first - - if can?(current_user, :destroy_group_member, @group_member) - @group_member.destroy - redirect_to(dashboard_groups_path, notice: "You left #{group.name} group.") - else - return render_403 - end - end - - protected - - def group - @group ||= Group.find_by(path: params[:group_id]) - end - - def member_params - params.require(:group_member).permit(:access_level, :user_id) - end -end diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb deleted file mode 100644 index 546ff2cc71f..00000000000 --- a/app/controllers/groups/milestones_controller.rb +++ /dev/null @@ -1,56 +0,0 @@ -class Groups::MilestonesController < ApplicationController - layout 'group' - - before_filter :authorize_group_milestone!, only: :update - - def index - project_milestones = case params[:state] - when 'all'; state - when 'closed'; state('closed') - else state('active') - end - @group_milestones = Milestones::GroupService.new(project_milestones).execute - @group_milestones = Kaminari.paginate_array(@group_milestones).page(params[:page]).per(PER_PAGE) - end - - def show - project_milestones = Milestone.where(project_id: group.projects).order("due_date ASC") - @group_milestone = Milestones::GroupService.new(project_milestones).milestone(title) - end - - def update - project_milestones = Milestone.where(project_id: group.projects).order("due_date ASC") - @group_milestones = Milestones::GroupService.new(project_milestones).milestone(title) - - @group_milestones.milestones.each do |milestone| - Milestones::UpdateService.new(milestone.project, current_user, params[:milestone]).execute(milestone) - end - - respond_to do |format| - format.js - format.html do - redirect_to group_milestones_path(group) - end - end - end - - private - - def group - @group ||= Group.find_by(path: params[:group_id]) - end - - def title - params[:title] - end - - def state(state = nil) - conditions = { project_id: group.projects } - conditions.reverse_merge!(state: state) if state - Milestone.where(conditions).order("title ASC") - end - - def authorize_group_milestone! - return render_404 unless can?(current_user, :admin_group, group) - end -end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb deleted file mode 100644 index 7af3c077182..00000000000 --- a/app/controllers/groups_controller.rb +++ /dev/null @@ -1,145 +0,0 @@ -class GroupsController < Groups::ApplicationController - skip_before_filter :authenticate_user!, only: [:show, :issues, :merge_requests] - respond_to :html - before_filter :group, except: [:new, :create] - - # Authorize - before_filter :authorize_read_group!, except: [:new, :create] - before_filter :authorize_admin_group!, only: [:edit, :update, :destroy, :projects] - before_filter :authorize_create_group!, only: [:new, :create] - - # Load group projects - before_filter :load_projects, except: [:new, :create, :projects, :edit, :update] - before_filter :event_filter, only: :show - before_filter :set_title, only: [:new, :create] - - layout :determine_layout - - def new - @group = Group.new - end - - def create - @group = Group.new(group_params) - @group.name = @group.path.dup unless @group.name - - if @group.save - @group.add_owner(current_user) - redirect_to @group, notice: 'Group was successfully created.' - else - render action: "new" - end - end - - def show - @last_push = current_user.recent_push if current_user - @projects = @projects.includes(:namespace) - - 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) - @merge_requests = @merge_requests.preload(:author, :target_project) - end - - def issues - @issues = get_issues_collection - @issues = @issues.page(params[:page]).per(PER_PAGE) - @issues = @issues.preload(:author, :project) - - respond_to do |format| - format.html - format.atom { render layout: false } - end - end - - def edit - end - - def projects - @projects = @group.projects.page(params[:page]) - end - - def update - if @group.update_attributes(group_params) - redirect_to edit_group_path(@group), notice: 'Group was successfully updated.' - else - render action: "edit" - end - end - - def destroy - @group.destroy - - redirect_to root_path, notice: 'Group was removed.' - end - - protected - - def group - @group ||= Group.find_by(path: params[:id]) - end - - def load_projects - @projects ||= ProjectsFinder.new.execute(current_user, group: group).sorted_by_activity.non_archived - end - - def project_ids - @projects.pluck(:id) - end - - # Dont allow unauthorized access to group - def authorize_read_group! - unless @group and (@projects.present? or can?(current_user, :read_group, @group)) - if current_user.nil? - return authenticate_user! - else - return render_404 - end - end - end - - def authorize_create_group! - unless can?(current_user, :create_group, nil) - return render_404 - end - end - - def set_title - @title = 'New Group' - end - - def determine_layout - if [:new, :create].include?(action_name.to_sym) - 'navless' - elsif current_user - 'group' - else - 'public_group' - end - end - - def group_params - params.require(:group).permit(:name, :description, :path, :avatar) - end - - def load_events - @events = Event.in_projects(project_ids) - @events = event_filter.apply_filter(@events).with_associations - @events = @events.limit(20).offset(params[:offset] || 0) - end -end diff --git a/app/controllers/import/base_controller.rb b/app/controllers/import/base_controller.rb deleted file mode 100644 index 93a7ace3530..00000000000 --- a/app/controllers/import/base_controller.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Import::BaseController < ApplicationController - - private - - def get_or_create_namespace - begin - namespace = Group.create!(name: @target_namespace, path: @target_namespace, owner: current_user) - namespace.add_owner(current_user) - rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid - namespace = Namespace.find_by_path_or_name(@target_namespace) - unless current_user.can?(:create_projects, namespace) - @already_been_taken = true - return false - end - end - - namespace - end -end diff --git a/app/controllers/import/bitbucket_controller.rb b/app/controllers/import/bitbucket_controller.rb deleted file mode 100644 index bb8d7e0235c..00000000000 --- a/app/controllers/import/bitbucket_controller.rb +++ /dev/null @@ -1,82 +0,0 @@ -class Import::BitbucketController < Import::BaseController - before_filter :verify_bitbucket_import_enabled - before_filter :bitbucket_auth, except: :callback - - rescue_from OAuth::Error, with: :bitbucket_unauthorized - - def callback - request_token = session.delete(:oauth_request_token) - raise "Session expired!" if request_token.nil? - - request_token.symbolize_keys! - - 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 - - current_user.save - redirect_to status_import_bitbucket_url - end - - def status - @repos = client.projects - - @already_added_projects = current_user.created_projects.where(import_type: "bitbucket") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.to_a.reject!{ |repo| already_added_projects_names.include? "#{repo["owner"]}/#{repo["slug"]}" } - end - - def jobs - jobs = current_user.created_projects.where(import_type: "bitbucket").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id] || "" - repo = client.project(@repo_id.gsub("___", "/")) - @project_name = repo["slug"] - - repo_owner = repo["owner"] - repo_owner = current_user.username if repo_owner == client.user["user"]["username"] - @target_namespace = params[:new_namespace].presence || repo_owner - - namespace = get_or_create_namespace || (render and return) - - unless Gitlab::BitbucketImport::KeyAdder.new(repo, current_user).execute - @access_denied = true - render - return - end - - @project = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::BitbucketImport::Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) - end - - def verify_bitbucket_import_enabled - not_found! unless bitbucket_import_enabled? - end - - def bitbucket_auth - if current_user.bitbucket_access_token.blank? - go_to_bitbucket_for_permissions - end - end - - def go_to_bitbucket_for_permissions - request_token = client.request_token(callback_import_bitbucket_url) - session[:oauth_request_token] = request_token - - redirect_to client.authorize_url(request_token, callback_import_bitbucket_url) - end - - def bitbucket_unauthorized - go_to_bitbucket_for_permissions - end -end diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb deleted file mode 100644 index 87b41454c77..00000000000 --- a/app/controllers/import/github_controller.rb +++ /dev/null @@ -1,68 +0,0 @@ -class Import::GithubController < Import::BaseController - before_filter :verify_github_import_enabled - before_filter :github_auth, except: :callback - - rescue_from Octokit::Unauthorized, with: :github_unauthorized - - def callback - token = client.get_token(params[:code]) - current_user.github_access_token = token - current_user.save - redirect_to status_import_github_url - end - - def status - @repos = client.repos - client.orgs.each do |org| - @repos += client.org_repos(org.login) - end - - @already_added_projects = current_user.created_projects.where(import_type: "github") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.reject!{ |repo| already_added_projects_names.include? repo.full_name } - end - - def jobs - jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id].to_i - repo = client.repo(@repo_id) - @project_name = repo.name - - repo_owner = repo.owner.login - repo_owner = current_user.username if repo_owner == client.user.login - @target_namespace = params[:new_namespace].presence || repo_owner - - namespace = get_or_create_namespace || (render and return) - - @project = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::GithubImport::Client.new(current_user.github_access_token) - end - - def verify_github_import_enabled - not_found! unless github_import_enabled? - end - - def github_auth - if current_user.github_access_token.blank? - go_to_github_for_permissions - end - end - - def go_to_github_for_permissions - redirect_to client.authorize_url(callback_import_github_url) - end - - def github_unauthorized - go_to_github_for_permissions - end -end diff --git a/app/controllers/import/gitlab_controller.rb b/app/controllers/import/gitlab_controller.rb deleted file mode 100644 index bddbfded812..00000000000 --- a/app/controllers/import/gitlab_controller.rb +++ /dev/null @@ -1,65 +0,0 @@ -class Import::GitlabController < Import::BaseController - before_filter :verify_gitlab_import_enabled - before_filter :gitlab_auth, except: :callback - - 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 - redirect_to status_import_gitlab_url - end - - def status - @repos = client.projects - - @already_added_projects = current_user.created_projects.where(import_type: "gitlab") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos = @repos.to_a.reject{ |repo| already_added_projects_names.include? repo["path_with_namespace"] } - end - - def jobs - jobs = current_user.created_projects.where(import_type: "gitlab").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id].to_i - repo = client.project(@repo_id) - @project_name = repo["name"] - - repo_owner = repo["namespace"]["path"] - repo_owner = current_user.username if repo_owner == client.user["username"] - @target_namespace = params[:new_namespace].presence || repo_owner - - namespace = get_or_create_namespace || (render and return) - - @project = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::GitlabImport::Client.new(current_user.gitlab_access_token) - end - - def verify_gitlab_import_enabled - not_found! unless gitlab_import_enabled? - end - - def gitlab_auth - if current_user.gitlab_access_token.blank? - go_to_gitlab_for_permissions - end - end - - def go_to_gitlab_for_permissions - redirect_to client.authorize_url(callback_import_gitlab_url) - end - - def gitlab_unauthorized - go_to_gitlab_for_permissions - end -end diff --git a/app/controllers/import/gitorious_controller.rb b/app/controllers/import/gitorious_controller.rb deleted file mode 100644 index 6067a87ee04..00000000000 --- a/app/controllers/import/gitorious_controller.rb +++ /dev/null @@ -1,43 +0,0 @@ -class Import::GitoriousController < Import::BaseController - - def new - redirect_to client.authorize_url(callback_import_gitorious_url) - end - - def callback - session[:gitorious_repos] = params[:repos] - redirect_to status_import_gitorious_url - end - - def status - @repos = client.repos - - @already_added_projects = current_user.created_projects.where(import_type: "gitorious") - already_added_projects_names = @already_added_projects.pluck(:import_source) - - @repos.reject! { |repo| already_added_projects_names.include? repo.full_name } - end - - def jobs - jobs = current_user.created_projects.where(import_type: "gitorious").to_json(only: [:id, :import_status]) - render json: jobs - end - - def create - @repo_id = params[:repo_id] - repo = client.repo(@repo_id) - @target_namespace = params[:new_namespace].presence || repo.namespace - @project_name = repo.name - - namespace = get_or_create_namespace || (render and return) - - @project = Gitlab::GitoriousImport::ProjectCreator.new(repo, namespace, current_user).execute - end - - private - - def client - @client ||= Gitlab::GitoriousImport::Client.new(session[:gitorious_repos]) - end - -end diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb deleted file mode 100644 index 1f97ff16c55..00000000000 --- a/app/controllers/invites_controller.rb +++ /dev/null @@ -1,83 +0,0 @@ -class InvitesController < ApplicationController - before_filter :member - skip_before_filter :authenticate_user!, only: :decline - - respond_to :html - - layout 'navless' - - def show - - end - - def accept - if member.accept_invite!(current_user) - label, path = source_info(member.source) - - redirect_to path, notice: "You have been granted #{member.human_access} access to #{label}." - else - redirect_to :back, alert: "The invitation could not be accepted." - end - end - - def decline - if member.decline_invite! - label, _ = source_info(member.source) - - path = - if current_user - dashboard_path - else - new_user_session_path - end - - redirect_to path, notice: "You have declined the invitation to join #{label}." - else - redirect_to :back, alert: "The invitation could not be declined." - end - end - - private - - def member - return @member if defined?(@member) - - @token = params[:id] - @member = Member.find_by_invite_token(@token) - - unless @member - render_404 and return - end - - @member - end - - def authenticate_user! - return if current_user - - notice = "To accept this invitation, sign in" - notice << " or create an account" if current_application_settings.signup_enabled? - notice << "." - - store_location_for :user, request.fullpath - redirect_to new_user_session_path, notice: notice - end - - def source_info(source) - case source - when Project - project = member.source - label = "project #{project.name_with_namespace}" - path = namespace_project_path(project.namespace, project) - when Group - group = member.source - label = "group #{group.name}" - path = group_path(group) - else - label = "who knows what" - path = dashboard_path - end - - [label, path] - end -end diff --git a/app/controllers/namespaces_controller.rb b/app/controllers/namespaces_controller.rb deleted file mode 100644 index 386d103ee5a..00000000000 --- a/app/controllers/namespaces_controller.rb +++ /dev/null @@ -1,25 +0,0 @@ -class NamespacesController < ApplicationController - skip_before_filter :authenticate_user! - - def show - namespace = Namespace.find_by(path: params[:id]) - - if namespace - if namespace.is_a?(Group) - group = namespace - else - user = namespace.owner - end - end - - if user - redirect_to user_path(user) - elsif group && can?(current_user, :read_group, group) - redirect_to group_path(group) - elsif current_user.nil? - authenticate_user! - else - render_404 - end - end -end diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb deleted file mode 100644 index efa291d9397..00000000000 --- a/app/controllers/oauth/applications_controller.rb +++ /dev/null @@ -1,39 +0,0 @@ -class Oauth::ApplicationsController < Doorkeeper::ApplicationsController - before_filter :authenticate_user! - layout "profile" - - def index - head :forbidden and return - end - - def create - @application = Doorkeeper::Application.new(application_params) - - @application.owner = current_user - - if @application.save - flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create]) - redirect_to oauth_application_url(@application) - else - render :new - end - end - - def destroy - if @application.destroy - flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :destroy]) - end - - redirect_to applications_profile_url - end - - private - - def set_application - @application = current_user.oauth_applications.find(params[:id]) - end - - rescue_from ActiveRecord::RecordNotFound do |exception| - render "errors/not_found", layout: "errors", status: 404 - end -end diff --git a/app/controllers/oauth/authorizations_controller.rb b/app/controllers/oauth/authorizations_controller.rb deleted file mode 100644 index a57b4a60c24..00000000000 --- a/app/controllers/oauth/authorizations_controller.rb +++ /dev/null @@ -1,57 +0,0 @@ -class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController - before_filter :authenticate_resource_owner! - layout "profile" - - def new - if pre_auth.authorizable? - if skip_authorization? || matching_token? - auth = authorization.authorize - redirect_to auth.redirect_uri - else - render "doorkeeper/authorizations/new" - end - else - render "doorkeeper/authorizations/error" - end - end - - # TODO: Handle raise invalid authorization - def create - redirect_or_render authorization.authorize - end - - def destroy - redirect_or_render authorization.deny - end - - private - - def matching_token? - Doorkeeper::AccessToken.matching_token_for(pre_auth.client, - current_resource_owner.id, - pre_auth.scopes) - end - - def redirect_or_render(auth) - if auth.redirectable? - redirect_to auth.redirect_uri - else - render json: auth.body, status: auth.status - end - end - - def pre_auth - @pre_auth ||= - Doorkeeper::OAuth::PreAuthorization.new(Doorkeeper.configuration, - server.client_via_uid, - params) - end - - def authorization - @authorization ||= strategy.request - end - - def strategy - @strategy ||= server.authorization_request(pre_auth.response_type) - end -end diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb deleted file mode 100644 index 0b27ce7da72..00000000000 --- a/app/controllers/oauth/authorized_applications_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicationsController - layout "profile" - - def destroy - Doorkeeper::AccessToken.revoke_all_for(params[:id], current_resource_owner) - redirect_to applications_profile_url, notice: I18n.t(:notice, scope: [:doorkeeper, :flash, :authorized_applications, :destroy]) - end -end diff --git a/app/controllers/omniauth_callbacks_controller.rb b/app/controllers/omniauth_callbacks_controller.rb deleted file mode 100644 index bb9d65c9ed6..00000000000 --- a/app/controllers/omniauth_callbacks_controller.rb +++ /dev/null @@ -1,76 +0,0 @@ -class OmniauthCallbacksController < Devise::OmniauthCallbacksController - Gitlab.config.omniauth.providers.each do |provider| - define_method provider['name'] do - handle_omniauth - end - end - - # Extend the standard message generation to accept our custom exception - def failure_message - exception = env["omniauth.error"] - error = exception.error_reason if exception.respond_to?(:error_reason) - error ||= exception.error if exception.respond_to?(:error) - error ||= exception.message if exception.respond_to?(:message) - error ||= env["omniauth.error.type"].to_s - error.to_s.humanize if error - end - - # We only find ourselves here - # if the authentication to LDAP was successful. - def ldap - @user = Gitlab::LDAP::User.new(oauth) - @user.save if @user.changed? # will also save new users - gl_user = @user.gl_user - gl_user.remember_me = true if @user.persisted? - - # Do additional LDAP checks for the user filter and EE features - if @user.allowed? - sign_in_and_redirect(gl_user) - else - flash[:alert] = "Access denied for your LDAP account." - redirect_to new_user_session_path - end - end - - def omniauth_error - @provider = params[:provider] - @error = params[:error] - render 'errors/omniauth_error', layout: "errors", status: 422 - end - - private - - def handle_omniauth - if current_user - # Add new authentication method - current_user.identities.find_or_create_by(extern_uid: oauth['uid'], provider: oauth['provider']) - redirect_to profile_account_path, notice: 'Authentication method updated' - else - @user = Gitlab::OAuth::User.new(oauth) - @user.save - - # Only allow properly saved users to login. - if @user.persisted? && @user.valid? - sign_in_and_redirect(@user.gl_user) - else - error_message = - if @user.gl_user.errors.any? - @user.gl_user.errors.map do |attribute, message| - "#{attribute} #{message}" - end.join(", ") - else - '' - end - - redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return - end - end - rescue Gitlab::OAuth::ForbiddenAction => e - flash[:notice] = e.message - redirect_to new_user_session_path - end - - def oauth - @oauth ||= request.env['omniauth.auth'] - end -end diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb deleted file mode 100644 index dcbbe5baa4b..00000000000 --- a/app/controllers/passwords_controller.rb +++ /dev/null @@ -1,18 +0,0 @@ -class PasswordsController < Devise::PasswordsController - - def create - email = resource_params[:email] - resource_found = resource_class.find_by_email(email) - if resource_found && resource_found.ldap_user? - flash[:alert] = "Cannot reset password for LDAP user." - respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name)) and return - end - - self.resource = resource_class.send_reset_password_instructions(resource_params) - if successfully_sent?(resource) - respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name)) - else - respond_with(resource) - end - end -end diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb deleted file mode 100644 index 9bd34fe2261..00000000000 --- a/app/controllers/profiles/accounts_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Profiles::AccountsController < ApplicationController - layout "profile" - - def show - @user = current_user - end - - def unlink - provider = params[:provider] - current_user.identities.find_by(provider: provider).destroy - redirect_to profile_account_path - end -end diff --git a/app/controllers/profiles/avatars_controller.rb b/app/controllers/profiles/avatars_controller.rb deleted file mode 100644 index 57f3bbf0627..00000000000 --- a/app/controllers/profiles/avatars_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -class Profiles::AvatarsController < ApplicationController - layout "profile" - - def destroy - @user = current_user - @user.remove_avatar! - - @user.save - @user.reset_events_cache - - redirect_to profile_path - end -end diff --git a/app/controllers/profiles/emails_controller.rb b/app/controllers/profiles/emails_controller.rb deleted file mode 100644 index 954c98c0d9f..00000000000 --- a/app/controllers/profiles/emails_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -class Profiles::EmailsController < ApplicationController - layout "profile" - - def index - @primary = current_user.email - @public_email = current_user.public_email - @emails = current_user.emails - end - - def create - @email = current_user.emails.new(email_params) - - flash[:alert] = @email.errors.full_messages.first unless @email.save - - redirect_to profile_emails_url - end - - def destroy - @email = current_user.emails.find(params[:id]) - @email.destroy - - current_user.set_notification_email - current_user.set_public_email - current_user.save if current_user.notification_email_changed? or current_user.public_email_changed? - - respond_to do |format| - format.html { redirect_to profile_emails_url } - format.js { render nothing: true } - end - end - - private - - def email_params - params.require(:email).permit(:email) - end -end diff --git a/app/controllers/profiles/keys_controller.rb b/app/controllers/profiles/keys_controller.rb deleted file mode 100644 index 4e2bd0a9b4b..00000000000 --- a/app/controllers/profiles/keys_controller.rb +++ /dev/null @@ -1,61 +0,0 @@ -class Profiles::KeysController < ApplicationController - layout "profile" - skip_before_filter :authenticate_user!, only: [:get_keys] - - def index - @keys = current_user.keys - end - - def show - @key = current_user.keys.find(params[:id]) - end - - def new - @key = current_user.keys.new - end - - def create - @key = current_user.keys.new(key_params) - - if @key.save - redirect_to profile_key_path(@key) - else - render 'new' - end - end - - def destroy - @key = current_user.keys.find(params[:id]) - @key.destroy - - respond_to do |format| - format.html { redirect_to profile_keys_url } - format.js { render nothing: true } - end - end - - # Get all keys of a user(params[:username]) in a text format - # Helpful for sysadmins to put in respective servers - def get_keys - if params[:username].present? - begin - user = User.find_by_username(params[:username]) - if user.present? - render text: user.all_ssh_keys.join("\n"), content_type: "text/plain" - else - render_404 and return - end - rescue => e - render text: e.message - end - else - render_404 and return - end - end - - private - - def key_params - params.require(:key).permit(:title, :key) - end -end diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb deleted file mode 100644 index 3fdcbbab61b..00000000000 --- a/app/controllers/profiles/notifications_controller.rb +++ /dev/null @@ -1,44 +0,0 @@ -class Profiles::NotificationsController < ApplicationController - layout 'profile' - - def show - @user = current_user - @notification = current_user.notification - @project_members = current_user.project_members - @group_members = current_user.group_members - end - - def update - type = params[:notification_type] - - @saved = if type == 'global' - current_user.update_attributes(user_params) - elsif type == 'group' - group_member = current_user.group_members.find(params[:notification_id]) - group_member.notification_level = params[:notification_level] - group_member.save - else - project_member = current_user.project_members.find(params[:notification_id]) - project_member.notification_level = params[:notification_level] - project_member.save - end - - respond_to do |format| - format.html do - if @saved - flash[:notice] = "Notification settings saved" - else - flash[:alert] = "Failed to save new settings" - end - - redirect_to :back - end - - format.js - end - end - - def user_params - params.require(:user).permit(:notification_email, :notification_level) - end -end diff --git a/app/controllers/profiles/passwords_controller.rb b/app/controllers/profiles/passwords_controller.rb deleted file mode 100644 index 0c614969a3f..00000000000 --- a/app/controllers/profiles/passwords_controller.rb +++ /dev/null @@ -1,88 +0,0 @@ -class Profiles::PasswordsController < ApplicationController - layout :determine_layout - - skip_before_filter :check_password_expiration, only: [:new, :create] - - before_filter :set_user - before_filter :set_title - before_filter :authorize_change_password! - - def new - end - - def create - unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) - redirect_to new_profile_password_path, alert: 'You must provide a valid current password' - return - end - - new_password = user_params[:password] - new_password_confirmation = user_params[:password_confirmation] - - result = @user.update_attributes( - password: new_password, - password_confirmation: new_password_confirmation, - password_automatically_set: false - ) - - if result - @user.update_attributes(password_expires_at: nil) - redirect_to root_path, notice: 'Password successfully changed' - else - render :new - end - end - - def edit - end - - def update - password_attributes = user_params.select do |key, value| - %w(password password_confirmation).include?(key.to_s) - end - password_attributes[:password_automatically_set] = false - - unless @user.password_automatically_set || @user.valid_password?(user_params[:current_password]) - redirect_to edit_profile_password_path, alert: 'You must provide a valid current password' - return - end - - if @user.update_attributes(password_attributes) - flash[:notice] = "Password was successfully updated. Please login with it" - redirect_to new_user_session_path - else - render 'edit' - end - end - - def reset - current_user.send_reset_password_instructions - redirect_to edit_profile_password_path, notice: 'We sent you an email with reset password instructions' - end - - private - - def set_user - @user = current_user - end - - def set_title - @title = "New password" - end - - def determine_layout - if [:new, :create].include?(action_name.to_sym) - 'navless' - else - 'profile' - end - end - - def authorize_change_password! - return render_404 if @user.ldap_user? - end - - def user_params - params.require(:user).permit(:current_password, :password, :password_confirmation) - end -end diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb deleted file mode 100644 index 7f76906066d..00000000000 --- a/app/controllers/profiles_controller.rb +++ /dev/null @@ -1,76 +0,0 @@ -class ProfilesController < ApplicationController - include ActionView::Helpers::SanitizeHelper - - before_filter :user - before_filter :authorize_change_username!, only: :update_username - skip_before_filter :require_email, only: [:show, :update] - - layout 'profile' - - def show - end - - def design - end - - def applications - @applications = current_user.oauth_applications - @authorized_tokens = current_user.oauth_authorized_tokens - @authorized_apps = @authorized_tokens.map(&:application).uniq - end - - def update - user_params.except!(:email) if @user.ldap_user? - - if @user.update_attributes(user_params) - flash[:notice] = "Profile was successfully updated" - else - messages = @user.errors.full_messages.uniq.join('. ') - flash[:alert] = "Failed to update profile. #{messages}" - end - - respond_to do |format| - format.html { redirect_to :back } - format.js - end - end - - def reset_private_token - if current_user.reset_authentication_token! - flash[:notice] = "Token was successfully updated" - end - - redirect_to profile_account_path - end - - def history - @events = current_user.recent_events.page(params[:page]).per(PER_PAGE) - end - - def update_username - @user.update_attributes(username: user_params[:username]) - - respond_to do |format| - format.js - end - end - - private - - def user - @user = current_user - end - - def authorize_change_username! - return render_404 unless @user.can_change_username? - end - - def user_params - params.require(:user).permit( - :email, :password, :password_confirmation, :bio, :name, - :username, :skype, :linkedin, :twitter, :website_url, - :color_scheme_id, :theme_id, :avatar, :hide_no_ssh_key, - :hide_no_password, :location, :public_email - ) - end -end diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb deleted file mode 100644 index 4719933394f..00000000000 --- a/app/controllers/projects/application_controller.rb +++ /dev/null @@ -1,36 +0,0 @@ -class Projects::ApplicationController < ApplicationController - before_filter :project - before_filter :repository - layout :determine_layout - - def authenticate_user! - # Restrict access to Projects area only - # for non-signed users - if !current_user - id = params[:project_id] || params[:id] - project_with_namespace = "#{params[:namespace_id]}/#{id}" - @project = Project.find_with_namespace(project_with_namespace) - - return if @project && @project.public? - end - - super - end - - def determine_layout - if current_user - 'projects' - else - 'public_projects' - end - end - - def require_branch_head - unless @repository.branch_names.include?(@ref) - redirect_to( - namespace_project_tree_path(@project.namespace, @project, @ref), - notice: "This action is not allowed unless you are on top of a branch" - ) - end - end -end diff --git a/app/controllers/projects/avatars_controller.rb b/app/controllers/projects/avatars_controller.rb deleted file mode 100644 index a482b90880d..00000000000 --- a/app/controllers/projects/avatars_controller.rb +++ /dev/null @@ -1,29 +0,0 @@ -class Projects::AvatarsController < Projects::ApplicationController - layout 'project' - - before_filter :project - - def show - @blob = @project.repository.blob_at_branch('master', @project.avatar_in_git) - if @blob - headers['X-Content-Type-Options'] = 'nosniff' - send_data( - @blob.data, - type: @blob.mime_type, - disposition: 'inline', - filename: @blob.name - ) - else - not_found! - end - end - - def destroy - @project.remove_avatar! - - @project.save - @project.reset_events_cache - - redirect_to edit_project_path(@project) - end -end diff --git a/app/controllers/projects/blame_controller.rb b/app/controllers/projects/blame_controller.rb deleted file mode 100644 index a87b8270a22..00000000000 --- a/app/controllers/projects/blame_controller.rb +++ /dev/null @@ -1,13 +0,0 @@ -# Controller for viewing a file's blame -class Projects::BlameController < Projects::ApplicationController - include ExtractsPath - - before_filter :require_non_empty_project - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def show - @blame = Gitlab::Git::Blame.new(@repository, @commit.id, @path) - @blob = @blame.blob - end -end diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb deleted file mode 100644 index 4b7eb4df298..00000000000 --- a/app/controllers/projects/blob_controller.rb +++ /dev/null @@ -1,163 +0,0 @@ -# Controller for viewing a file's blame -class Projects::BlobController < Projects::ApplicationController - include ExtractsPath - include ActionView::Helpers::SanitizeHelper - - # Raised when given an invalid file path - class InvalidPathError < StandardError; end - - before_filter :require_non_empty_project, except: [:new, :create] - before_filter :authorize_download_code! - before_filter :authorize_push_code!, only: [:destroy] - before_filter :assign_blob_vars - before_filter :commit, except: [:new, :create] - before_filter :blob, except: [:new, :create] - before_filter :from_merge_request, only: [:edit, :update] - before_filter :after_edit_path, only: [:edit, :update] - before_filter :require_branch_head, 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 - - 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)) - else - flash[:alert] = result[:message] - render :new - end - end - - def show - end - - def edit - @last_commit = Gitlab::Git::Commit.last_for_path(@repository, @ref, @path).sha - end - - def update - result = Files::UpdateService. - new( - @project, - current_user, - params.merge(new_branch: sanitized_new_branch_name), - @ref, - @path - ).execute - - if result[:status] == :success - flash[:notice] = "Your changes have been successfully committed" - - if from_merge_request - from_merge_request.reload_code - end - - redirect_to after_edit_path - else - flash[:alert] = result[:message] - render :edit - end - end - - def preview - @content = params[:content] - diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true) - @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/)) - - render layout: false - end - - def destroy - result = Files::DeleteService.new(@project, current_user, params, @ref, @path).execute - - if result[:status] == :success - flash[:notice] = "Your changes have been successfully committed" - redirect_to namespace_project_tree_path(@project.namespace, @project, - @ref) - else - flash[:alert] = result[:message] - render :show - end - end - - def diff - @form = UnfoldForm.new(params) - @lines = @blob.data.lines[@form.since - 1..@form.to - 1] - - if @form.bottom? - @match_line = '' - else - lines_length = @lines.length - 1 - line = [@form.since, lines_length].join(',') - @match_line = "@@ -#{line}+#{line} @@" - end - - render layout: false - end - - private - - def blob - @blob ||= @repository.blob_at(@commit.id, @path) - - if @blob - @blob - else - if tree = @repository.tree(@commit.id, @path) - if tree.entries.any? - redirect_to namespace_project_tree_path(@project.namespace, @project, File.join(@ref, @path)) and return - end - end - - return not_found! - end - end - - def commit - @commit = @repository.commit(@ref) - - return not_found! unless @commit - end - - def assign_blob_vars - @id = params[:id] - @ref, @path = extract_ref(@id) - - - rescue InvalidPathError - not_found! - end - - def after_edit_path - @after_edit_path ||= - 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)) - else - namespace_project_blob_path(@project.namespace, @project, @id) - end - end - - def from_merge_request - # If blob edit was initiated from merge request page - @from_merge_request ||= MergeRequest.find_by(id: params[:from_merge_request_id]) - end - - def sanitized_new_branch_name - @new_branch ||= sanitize(strip_tags(params[:new_branch])) - end -end diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb deleted file mode 100644 index f049e96e61d..00000000000 --- a/app/controllers/projects/branches_controller.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Projects::BranchesController < Projects::ApplicationController - include ActionView::Helpers::SanitizeHelper - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - before_filter :authorize_push_code!, only: [:create, :destroy] - - def index - @sort = params[:sort] || 'name' - @branches = @repository.branches_sorted_by(@sort) - @branches = Kaminari.paginate_array(@branches).page(params[:page]).per(PER_PAGE) - end - - def recent - @branches = @repository.recent_branches - end - - def create - branch_name = sanitize(strip_tags(params[:branch_name])) - ref = sanitize(strip_tags(params[:ref])) - result = CreateBranchService.new(project, current_user). - execute(branch_name, ref) - - if result[:status] == :success - @branch = result[:branch] - redirect_to namespace_project_tree_path(@project.namespace, @project, - @branch.name) - else - @error = result[:message] - render action: 'new' - end - end - - def destroy - DeleteBranchService.new(project, current_user).execute(params[:id]) - @branch_name = params[:id] - - respond_to do |format| - format.html do - redirect_to namespace_project_branches_path(@project.namespace, - @project) - end - format.js - end - end -end diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb deleted file mode 100644 index 87e39f1363a..00000000000 --- a/app/controllers/projects/commit_controller.rb +++ /dev/null @@ -1,41 +0,0 @@ -# Controller for a specific Commit -# -# Not to be confused with CommitsController, plural. -class Projects::CommitController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - before_filter :commit - - def show - return git_not_found! unless @commit - - @line_notes = @project.notes.for_commit_id(commit.id).inline - @diffs = @commit.diffs - @note = @project.build_commit_note(commit) - @notes_count = @project.notes.for_commit_id(commit.id).count - @notes = @project.notes.for_commit_id(@commit.id).not_inline.fresh - @noteable = @commit - @comments_allowed = @reply_allowed = true - @comments_target = { - noteable_type: 'Commit', - commit_id: @commit.id - } - - respond_to do |format| - format.html - format.diff { render text: @commit.to_diff } - format.patch { render text: @commit.to_patch } - end - end - - def branches - @branches = @project.repository.branch_names_contains(commit.id) - @tags = @project.repository.tag_names_contains(commit.id) - render layout: false - end - - def commit - @commit ||= @project.repository.commit(params[:id]) - end -end diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb deleted file mode 100644 index 4b6ab437476..00000000000 --- a/app/controllers/projects/commits_controller.rb +++ /dev/null @@ -1,24 +0,0 @@ -require "base64" - -class Projects::CommitsController < Projects::ApplicationController - include ExtractsPath - - before_filter :require_non_empty_project - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def show - @repo = @project.repository - @limit, @offset = (params[:limit] || 40), (params[:offset] || 0) - - @commits = @repo.commits(@ref, @path, @limit, @offset) - @note_counts = Note.where(commit_id: @commits.map(&:id)). - group(:commit_id).count - - respond_to do |format| - format.html - format.json { pager_json("projects/commits/_commits", @commits.size) } - format.atom { render layout: false } - end - end -end diff --git a/app/controllers/projects/compare_controller.rb b/app/controllers/projects/compare_controller.rb deleted file mode 100644 index 146808fa562..00000000000 --- a/app/controllers/projects/compare_controller.rb +++ /dev/null @@ -1,31 +0,0 @@ -class Projects::CompareController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - - def index - end - - def show - base_ref = params[:from] - head_ref = params[:to] - - compare_result = CompareService.new.execute( - current_user, - @project, - head_ref, - @project, - base_ref - ) - - @commits = compare_result.commits - @diffs = compare_result.diffs - @commit = @commits.last - @line_notes = [] - end - - def create - redirect_to namespace_project_compare_path(@project.namespace, @project, - params[:from], params[:to]) - end -end diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb deleted file mode 100644 index 6fba3ce299b..00000000000 --- a/app/controllers/projects/deploy_keys_controller.rb +++ /dev/null @@ -1,65 +0,0 @@ -class Projects::DeployKeysController < Projects::ApplicationController - respond_to :html - - # Authorize - before_filter :authorize_admin_project! - - layout "project_settings" - - def index - @enabled_keys = @project.deploy_keys - - @available_keys = accessible_keys - @enabled_keys - @available_project_keys = current_user.project_deploy_keys - @enabled_keys - @available_public_keys = DeployKey.are_public - @enabled_keys - - # Public keys that are already used by another accessible project are already - # in @available_project_keys. - @available_public_keys -= @available_project_keys - end - - def show - @key = @project.deploy_keys.find(params[:id]) - end - - def new - @key = @project.deploy_keys.new - - respond_with(@key) - end - - def create - @key = DeployKey.new(deploy_key_params) - - if @key.valid? && @project.deploy_keys << @key - redirect_to namespace_project_deploy_keys_path(@project.namespace, - @project) - else - render "new" - end - end - - def enable - @key = accessible_keys.find(params[:id]) - @project.deploy_keys << @key - - redirect_to namespace_project_deploy_keys_path(@project.namespace, - @project) - end - - def disable - @project.deploy_keys_projects.find_by(deploy_key_id: params[:id]).destroy - - redirect_to :back - end - - protected - - def accessible_keys - @accessible_keys ||= current_user.accessible_deploy_keys - end - - def deploy_key_params - params.require(:deploy_key).permit(:key, :title) - end -end diff --git a/app/controllers/projects/forks_controller.rb b/app/controllers/projects/forks_controller.rb deleted file mode 100644 index 21a151a426e..00000000000 --- a/app/controllers/projects/forks_controller.rb +++ /dev/null @@ -1,25 +0,0 @@ -class Projects::ForksController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - - def new - @namespaces = current_user.manageable_namespaces - @namespaces.delete(@project.namespace) - end - - def create - namespace = Namespace.find(params[:namespace_key]) - @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.' - ) - else - @title = 'Fork project' - render :error - end - end -end diff --git a/app/controllers/projects/graphs_controller.rb b/app/controllers/projects/graphs_controller.rb deleted file mode 100644 index 6e54af356e0..00000000000 --- a/app/controllers/projects/graphs_controller.rb +++ /dev/null @@ -1,39 +0,0 @@ -class Projects::GraphsController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - - def show - respond_to do |format| - format.html - format.json do - fetch_graph - end - end - end - - def commits - @commits = @project.repository.commits(nil, nil, 2000, 0, true) - @commits_graph = Gitlab::Graphs::Commits.new(@commits) - @commits_per_week_days = @commits_graph.commits_per_week_days - @commits_per_time = @commits_graph.commits_per_time - @commits_per_month = @commits_graph.commits_per_month - end - - private - - def fetch_graph - @commits = @project.repository.commits(nil, nil, 6000, 0, true) - @log = [] - - @commits.each do |commit| - @log << { - author_name: commit.author_name, - author_email: commit.author_email, - date: commit.committed_date.strftime("%Y-%m-%d") - } - end - - render json: @log.to_json - end -end diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb deleted file mode 100644 index ba95bb13e1f..00000000000 --- a/app/controllers/projects/hooks_controller.rb +++ /dev/null @@ -1,58 +0,0 @@ -class Projects::HooksController < Projects::ApplicationController - # Authorize - before_filter :authorize_admin_project! - - respond_to :html - - layout "project_settings" - - def index - @hooks = @project.hooks - @hook = ProjectHook.new - end - - def create - @hook = @project.hooks.new(hook_params) - @hook.save - - if @hook.valid? - redirect_to namespace_project_hooks_path(@project.namespace, @project) - else - @hooks = @project.hooks.select(&:persisted?) - render :index - end - end - - def test - if !@project.empty_repo? - status = TestHookService.new.execute(hook, current_user) - - if status - flash[:notice] = 'Hook successfully executed.' - else - flash[:alert] = 'Hook execution failed. '\ - 'Ensure hook URL is correct and service is up.' - end - else - flash[:alert] = 'Hook execution failed. Ensure the project has commits.' - end - - redirect_to :back - end - - def destroy - hook.destroy - - redirect_to namespace_project_hooks_path(@project.namespace, @project) - end - - private - - def hook - @hook ||= @project.hooks.find(params[:id]) - end - - def hook_params - params.require(:hook).permit(:url, :push_events, :issues_events, :merge_requests_events, :tag_push_events) - end -end diff --git a/app/controllers/projects/imports_controller.rb b/app/controllers/projects/imports_controller.rb deleted file mode 100644 index b64491b4666..00000000000 --- a/app/controllers/projects/imports_controller.rb +++ /dev/null @@ -1,51 +0,0 @@ -class Projects::ImportsController < Projects::ApplicationController - # Authorize - before_filter :authorize_admin_project! - before_filter :require_no_repo - before_filter :redirect_if_progress, except: :show - - def new - end - - def create - @project.import_url = params[:project][:import_url] - - if @project.save - @project.reload - - if @project.import_failed? - @project.import_retry - else - @project.import_start - end - end - - redirect_to namespace_project_import_path(@project.namespace, @project) - end - - def show - unless @project.import_in_progress? - if @project.import_finished? - redirect_to(project_path(@project)) and return - else - redirect_to new_namespace_project_import_path(@project.namespace, - @project) && return - end - end - end - - private - - def require_no_repo - if @project.repository_exists? && !@project.import_in_progress? - redirect_to(namespace_project_path(@project.namespace, @project)) and return - end - end - - def redirect_if_progress - if @project.import_in_progress? - redirect_to namespace_project_import_path(@project.namespace, @project) && - return - end - end -end diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb deleted file mode 100644 index 88302276b5e..00000000000 --- a/app/controllers/projects/issues_controller.rb +++ /dev/null @@ -1,159 +0,0 @@ -class Projects::IssuesController < Projects::ApplicationController - before_filter :module_enabled - before_filter :issue, only: [:edit, :update, :show, :toggle_subscription] - - # Allow read any issue - before_filter :authorize_read_issue! - - # Allow write(create) issue - before_filter :authorize_write_issue!, only: [:new, :create] - - # Allow modify issue - before_filter :authorize_modify_issue!, only: [:edit, :update] - - # Allow issues bulk update - before_filter :authorize_admin_issues!, only: [:bulk_update] - - respond_to :html - - def index - terms = params['issue_search'] - @issues = get_issues_collection - @issues = @issues.full_search(terms) if terms.present? - @issues = @issues.page(params[:page]).per(PER_PAGE) - - respond_to do |format| - format.html - format.atom { render layout: false } - format.json do - render json: { - html: view_to_html_string("projects/issues/_issues") - } - end - end - end - - def new - params[:issue] ||= ActionController::Parameters.new( - assignee_id: "" - ) - - @issue = @project.issues.new(issue_params) - respond_with(@issue) - end - - def edit - respond_with(@issue) - end - - def show - @note = @project.notes.new(noteable: @issue) - @notes = @issue.notes.inc_author.fresh - @noteable = @issue - - respond_with(@issue) - end - - def create - @issue = Issues::CreateService.new(project, current_user, issue_params).execute - - respond_to do |format| - format.html do - if @issue.valid? - redirect_to issue_path(@issue) - else - render :new - end - end - format.js do |format| - @link = @issue.attachment.url.to_js - end - end - end - - def update - @issue = Issues::UpdateService.new(project, current_user, issue_params).execute(issue) - - respond_to do |format| - format.js - format.html do - if @issue.valid? - redirect_to issue_path(@issue) - else - render :edit - end - end - format.json do - render json: { - saved: @issue.valid?, - assignee_avatar_url: @issue.assignee.try(:avatar_url) - } - end - end - end - - def bulk_update - result = Issues::BulkUpdateService.new(project, current_user, bulk_update_params).execute - redirect_to :back, notice: "#{result[:count]} issues updated" - end - - def toggle_subscription - @issue.toggle_subscription(current_user) - - render nothing: true - end - - protected - - def issue - @issue ||= begin - @project.issues.find_by!(iid: params[:id]) - rescue ActiveRecord::RecordNotFound - redirect_old - end - end - - def authorize_modify_issue! - return render_404 unless can?(current_user, :modify_issue, @issue) - end - - def authorize_admin_issues! - return render_404 unless can?(current_user, :admin_issue, @project) - end - - def module_enabled - return render_404 unless @project.issues_enabled - end - - # Since iids are implemented only in 6.1 - # user may navigate to issue page using old global ids. - # - # To prevent 404 errors we provide a redirect to correct iids until 7.0 release - # - def redirect_old - issue = @project.issues.find_by(id: params[:id]) - - if issue - redirect_to issue_path(issue) - return - else - raise ActiveRecord::RecordNotFound.new - end - end - - def issue_params - params.require(:issue).permit( - :title, :assignee_id, :position, :description, - :milestone_id, :state_event, :task_num, label_ids: [] - ) - end - - def bulk_update_params - params.require(:update).permit( - :issues_ids, - :assignee_id, - :milestone_id, - :state_event - ) - end -end diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb deleted file mode 100644 index 207a01ed3b0..00000000000 --- a/app/controllers/projects/labels_controller.rb +++ /dev/null @@ -1,82 +0,0 @@ -class Projects::LabelsController < Projects::ApplicationController - before_filter :module_enabled - before_filter :label, only: [:edit, :update, :destroy] - before_filter :authorize_labels! - before_filter :authorize_admin_labels!, except: [:index] - - respond_to :js, :html - - def index - @labels = @project.labels.page(params[:page]).per(PER_PAGE) - end - - def new - @label = @project.labels.new - end - - def create - @label = @project.labels.create(label_params) - - if @label.valid? - redirect_to namespace_project_labels_path(@project.namespace, @project) - else - render 'new' - end - end - - def edit - end - - def update - if @label.update_attributes(label_params) - redirect_to namespace_project_labels_path(@project.namespace, @project) - else - render 'edit' - end - end - - def generate - Gitlab::IssuesLabels.generate(@project) - - if params[:redirect] == 'issues' - redirect_to namespace_project_issues_path(@project.namespace, @project) - elsif params[:redirect] == 'merge_requests' - redirect_to namespace_project_merge_requests_path(@project.namespace, - @project) - else - redirect_to namespace_project_labels_path(@project.namespace, @project) - end - end - - def destroy - @label.destroy - - respond_to do |format| - format.html do - redirect_to(namespace_project_labels_path(@project.namespace, @project), - notice: 'Label was removed') - end - format.js - end - end - - protected - - def module_enabled - unless @project.issues_enabled || @project.merge_requests_enabled - return render_404 - end - end - - def label_params - params.require(:label).permit(:title, :color) - end - - def label - @label = @project.labels.find(params[:id]) - end - - def authorize_admin_labels! - return render_404 unless can?(current_user, :admin_label, @project) - end -end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb deleted file mode 100644 index 47ce8467358..00000000000 --- a/app/controllers/projects/merge_requests_controller.rb +++ /dev/null @@ -1,270 +0,0 @@ -require 'gitlab/satellite/satellite' - -class Projects::MergeRequestsController < Projects::ApplicationController - before_filter :module_enabled - before_filter :merge_request, only: [:edit, :update, :show, :diffs, :automerge, :automerge_check, :ci_status, :toggle_subscription] - before_filter :closes_issues, only: [:edit, :update, :show, :diffs] - before_filter :validates_merge_request, only: [:show, :diffs] - before_filter :define_show_vars, only: [:show, :diffs] - - # Allow read any merge_request - before_filter :authorize_read_merge_request! - - # Allow write(create) merge_request - before_filter :authorize_write_merge_request!, only: [:new, :create] - - # Allow modify merge_request - before_filter :authorize_modify_merge_request!, only: [:close, :edit, :update, :sort] - - def index - terms = params['issue_search'] - @merge_requests = get_merge_requests_collection - @merge_requests = @merge_requests.full_search(terms) if terms.present? - @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE) - - respond_to do |format| - format.html - format.json do - render json: { - html: view_to_html_string("projects/merge_requests/_merge_requests") - } - end - end - end - - def show - @note_counts = Note.where(commit_id: @merge_request.commits.map(&:id)). - group(:commit_id).count - - respond_to do |format| - format.html - format.json { render json: @merge_request } - format.diff { render text: @merge_request.to_diff(current_user) } - format.patch { render text: @merge_request.to_patch(current_user) } - end - end - - def diffs - @commit = @merge_request.last_commit - @comments_allowed = @reply_allowed = true - @comments_target = { - noteable_type: 'MergeRequest', - noteable_id: @merge_request.id - } - @line_notes = @merge_request.notes.where("line_code is not null") - - respond_to do |format| - format.html - format.json { render json: { html: view_to_html_string("projects/merge_requests/show/_diffs") } } - end - end - - def new - params[:merge_request] ||= ActionController::Parameters.new(source_project: @project) - @merge_request = MergeRequests::BuildService.new(project, current_user, merge_request_params).execute - - @target_branches = if @merge_request.target_project - @merge_request.target_project.repository.branch_names - else - [] - end - - @target_project = merge_request.target_project - @source_project = merge_request.source_project - @commits = @merge_request.compare_commits - @commit = @merge_request.compare_commits.last - @diffs = @merge_request.compare_diffs - @note_counts = Note.where(commit_id: @commits.map(&:id)). - group(:commit_id).count - end - - def edit - @source_project = @merge_request.source_project - @target_project = @merge_request.target_project - @target_branches = @merge_request.target_project.repository.branch_names - end - - def create - @target_branches ||= [] - @merge_request = MergeRequests::CreateService.new(project, current_user, merge_request_params).execute - - if @merge_request.valid? - redirect_to(merge_request_path(@merge_request)) - else - @source_project = @merge_request.source_project - @target_project = @merge_request.target_project - render action: "new" - end - end - - def update - @merge_request = MergeRequests::UpdateService.new(project, current_user, merge_request_params).execute(@merge_request) - - if @merge_request.valid? - respond_to do |format| - format.js - format.html do - redirect_to([@merge_request.target_project.namespace.becomes(Namespace), - @merge_request.target_project, @merge_request]) - end - format.json do - render json: { - saved: @merge_request.valid?, - assignee_avatar_url: @merge_request.assignee.try(:avatar_url) - } - end - end - else - render "edit" - end - end - - def automerge_check - if @merge_request.unchecked? - @merge_request.check_if_can_be_merged - end - - render json: { merge_status: @merge_request.merge_status_name } - end - - def automerge - return access_denied! unless allowed_to_merge? - - if @merge_request.open? && @merge_request.can_be_merged? - AutoMergeWorker.perform_async(@merge_request.id, current_user.id, params) - @status = true - else - @status = false - end - end - - def branch_from - #This is always source - @source_project = @merge_request.nil? ? @project : @merge_request.source_project - @commit = @repository.commit(params[:ref]) if params[:ref].present? - end - - def branch_to - @target_project = selected_target_project - @commit = @target_project.repository.commit(params[:ref]) if params[:ref].present? - end - - def update_branches - @target_project = selected_target_project - @target_branches = @target_project.repository.branch_names - - respond_to do |format| - format.js - end - end - - def ci_status - ci_service = @merge_request.source_project.ci_service - status = ci_service.commit_status(merge_request.last_commit.sha, merge_request.source_branch) - - if ci_service.respond_to?(:commit_coverage) - coverage = ci_service.commit_coverage(merge_request.last_commit.sha, merge_request.source_branch) - end - - response = { - status: status, - coverage: coverage - } - - render json: response - end - - def toggle_subscription - @merge_request.toggle_subscription(current_user) - - render nothing: true - end - - protected - - def selected_target_project - if @project.id.to_s == params[:target_project_id] || @project.forked_project_link.nil? - @project - else - @project.forked_project_link.forked_from_project - end - end - - def merge_request - @merge_request ||= @project.merge_requests.find_by!(iid: params[:id]) - end - - def closes_issues - @closes_issues ||= @merge_request.closes_issues - end - - def authorize_modify_merge_request! - return render_404 unless can?(current_user, :modify_merge_request, @merge_request) - end - - def authorize_admin_merge_request! - return render_404 unless can?(current_user, :admin_merge_request, @merge_request) - end - - def module_enabled - return render_404 unless @project.merge_requests_enabled - end - - def validates_merge_request - # If source project was removed (Ex. mr from fork to origin) - return invalid_mr unless @merge_request.source_project - - # Show git not found page - # if there is no saved commits between source & target branch - if @merge_request.commits.blank? - # and if target branch doesn't exist - return invalid_mr unless @merge_request.target_branch_exists? - - # or if source branch doesn't exist - return invalid_mr unless @merge_request.source_branch_exists? - end - end - - def define_show_vars - # Build a note object for comment form - @note = @project.notes.new(noteable: @merge_request) - @notes = @merge_request.mr_and_commit_notes.inc_author.fresh - @discussions = Note.discussions_from_notes(@notes) - @noteable = @merge_request - - # Get commits from repository - # or from cache if already merged - @commits = @merge_request.commits - - @merge_request_diff = @merge_request.merge_request_diff - @allowed_to_merge = allowed_to_merge? - @show_merge_controls = @merge_request.open? && @commits.any? && @allowed_to_merge - @source_branch = @merge_request.source_project.repository.find_branch(@merge_request.source_branch).try(:name) - - if @merge_request.locked_long_ago? - @merge_request.unlock_mr - @merge_request.close - end - end - - def allowed_to_merge? - allowed_to_push_code?(project, @merge_request.target_branch) - end - - def invalid_mr - # Render special view for MR with removed source or target branch - render 'invalid' - end - - def allowed_to_push_code?(project, branch) - ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(branch) - end - - def merge_request_params - params.require(:merge_request).permit( - :title, :assignee_id, :source_project_id, :source_branch, - :target_project_id, :target_branch, :milestone_id, - :state_event, :description, :task_num, label_ids: [] - ) - end -end diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb deleted file mode 100644 index b49b549547a..00000000000 --- a/app/controllers/projects/milestones_controller.rb +++ /dev/null @@ -1,116 +0,0 @@ -class Projects::MilestonesController < Projects::ApplicationController - before_filter :module_enabled - before_filter :milestone, only: [:edit, :update, :destroy, :show, :sort_issues, :sort_merge_requests] - - # Allow read any milestone - before_filter :authorize_read_milestone! - - # Allow admin milestone - before_filter :authorize_admin_milestone!, except: [:index, :show] - - respond_to :html - - def index - @milestones = case params[:state] - when 'all'; @project.milestones.order("state, due_date DESC") - when 'closed'; @project.milestones.closed.order("due_date DESC") - else @project.milestones.active.order("due_date ASC") - end - - @milestones = @milestones.includes(:project) - @milestones = @milestones.page(params[:page]).per(PER_PAGE) - end - - def new - @milestone = @project.milestones.new - respond_with(@milestone) - end - - def edit - respond_with(@milestone) - end - - def show - @issues = @milestone.issues - @users = @milestone.participants.uniq - @merge_requests = @milestone.merge_requests - end - - def create - @milestone = Milestones::CreateService.new(project, current_user, milestone_params).execute - - if @milestone.save - redirect_to namespace_project_milestone_path(@project.namespace, - @project, @milestone) - else - render "new" - end - end - - def update - @milestone = Milestones::UpdateService.new(project, current_user, milestone_params).execute(milestone) - - respond_to do |format| - format.js - format.html do - if @milestone.valid? - redirect_to namespace_project_milestone_path(@project.namespace, - @project, @milestone) - else - render :edit - end - end - end - end - - def destroy - return access_denied! unless can?(current_user, :admin_milestone, @milestone) - - @milestone.destroy - - respond_to do |format| - format.html { redirect_to namespace_project_milestones_path } - format.js { render nothing: true } - end - end - - def sort_issues - @issues = @milestone.issues.where(id: params['sortable_issue']) - @issues.each do |issue| - issue.position = params['sortable_issue'].index(issue.id.to_s) + 1 - issue.save - end - - render json: { saved: true } - end - - def sort_merge_requests - @merge_requests = @milestone.merge_requests.where(id: params['sortable_merge_request']) - @merge_requests.each do |merge_request| - merge_request.position = params['sortable_merge_request'].index(merge_request.id.to_s) + 1 - merge_request.save - end - - render json: { saved: true } - end - - protected - - def milestone - @milestone ||= @project.milestones.find_by!(iid: params[:id]) - end - - def authorize_admin_milestone! - return render_404 unless can?(current_user, :admin_milestone, @project) - end - - def module_enabled - unless @project.issues_enabled || @project.merge_requests_enabled - return render_404 - end - end - - def milestone_params - params.require(:milestone).permit(:title, :description, :due_date, :state_event) - end -end diff --git a/app/controllers/projects/network_controller.rb b/app/controllers/projects/network_controller.rb deleted file mode 100644 index 83d1c1dacae..00000000000 --- a/app/controllers/projects/network_controller.rb +++ /dev/null @@ -1,18 +0,0 @@ -class Projects::NetworkController < Projects::ApplicationController - include ExtractsPath - include ApplicationHelper - - before_filter :require_non_empty_project - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def show - respond_to do |format| - format.html - - format.json do - @graph = Network::Graph.new(project, @ref, @commit, @options[:filter_ref]) - end - end - end -end diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb deleted file mode 100644 index 868629a0bc4..00000000000 --- a/app/controllers/projects/notes_controller.rb +++ /dev/null @@ -1,125 +0,0 @@ -class Projects::NotesController < Projects::ApplicationController - # Authorize - before_filter :authorize_read_note! - before_filter :authorize_write_note!, only: [:create] - before_filter :authorize_admin_note!, only: [:update, :destroy] - before_filter :find_current_user_notes, except: [:destroy, :delete_attachment] - - def index - current_fetched_at = Time.now.to_i - - notes_json = { notes: [], last_fetched_at: current_fetched_at } - - @notes.each do |note| - notes_json[:notes] << { - id: note.id, - html: note_to_html(note) - } - end - - render json: notes_json - end - - def create - @note = Notes::CreateService.new(project, current_user, note_params).execute - - respond_to do |format| - format.json { render_note_json(@note) } - format.html { redirect_to :back } - end - end - - def update - if note.editable? - note.update_attributes(note_params) - note.reset_events_cache - end - - respond_to do |format| - format.json { render_note_json(note) } - format.html { redirect_to :back } - end - end - - def destroy - if note.editable? - note.destroy - note.reset_events_cache - end - - respond_to do |format| - format.js { render nothing: true } - end - end - - def delete_attachment - note.remove_attachment! - note.update_attribute(:attachment, nil) - - respond_to do |format| - format.js { render nothing: true } - end - end - - private - - def note - @note ||= @project.notes.find(params[:id]) - end - - def note_to_html(note) - render_to_string( - "projects/notes/_note", - layout: false, - formats: [:html], - locals: { note: note } - ) - end - - def note_to_discussion_html(note) - render_to_string( - "projects/notes/_diff_notes_with_reply", - layout: false, - formats: [:html], - locals: { notes: [note] } - ) - end - - def note_to_discussion_with_diff_html(note) - return unless note.for_diff_line? - - render_to_string( - "projects/notes/_discussion", - layout: false, - formats: [:html], - locals: { discussion_notes: [note] } - ) - end - - def render_note_json(note) - render json: { - id: note.id, - discussion_id: note.discussion_id, - html: note_to_html(note), - discussion_html: note_to_discussion_html(note), - discussion_with_diff_html: note_to_discussion_with_diff_html(note) - } - end - - def authorize_admin_note! - return access_denied! unless can?(current_user, :admin_note, note) - end - - def note_params - params.require(:note).permit( - :note, :noteable, :noteable_id, :noteable_type, :project_id, - :attachment, :line_code, :commit_id - ) - end - - private - - def find_current_user_notes - @notes = NotesFinder.new.execute(project, current_user, params) - end -end diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb deleted file mode 100644 index 72967a26ff1..00000000000 --- a/app/controllers/projects/project_members_controller.rb +++ /dev/null @@ -1,98 +0,0 @@ -class Projects::ProjectMembersController < Projects::ApplicationController - # Authorize - before_filter :authorize_admin_project!, except: :leave - - layout "project_settings" - - def index - @project_members = @project.project_members - @project_members = @project_members.non_invite unless can?(current_user, :admin_project, @project) - - if params[:search].present? - users = @project.users.search(params[:search]).to_a - @project_members = @project_members.where(user_id: users) - end - - @project_members = @project_members.order('access_level DESC') - - @group = @project.group - if @group - @group_members = @group.group_members - @group_members = @group_members.non_invite unless can?(current_user, :admin_group, @group) - - if params[:search].present? - users = @group.users.search(params[:search]).to_a - @group_members = @group_members.where(user_id: users) - end - - @group_members = @group_members.order('access_level DESC').limit(20) - end - - @project_member = @project.project_members.new - end - - def new - @project_member = @project.project_members.new - end - - def create - @project.team.add_users(params[:user_ids].split(','), params[:access_level], current_user) - - redirect_to namespace_project_project_members_path(@project.namespace, @project) - end - - def update - @project_member = @project.project_members.find(params[:id]) - @project_member.update_attributes(member_params) - end - - def destroy - @project_member = @project.project_members.find(params[:id]) - @project_member.destroy - - respond_to do |format| - format.html do - redirect_to namespace_project_project_members_path(@project.namespace, @project) - end - format.js { render nothing: true } - end - end - - def resend_invite - redirect_path = namespace_project_project_members_path(@project.namespace, @project) - - @project_member = @project.project_members.find(params[:id]) - - if @project_member.invite? - @project_member.resend_invite - - redirect_to redirect_path, notice: 'The invitation was successfully resent.' - else - redirect_to redirect_path, alert: 'The invitation has already been accepted.' - end - end - - def leave - @project.project_members.find_by(user_id: current_user).destroy - - respond_to do |format| - format.html { redirect_to :back } - format.js { render nothing: true } - end - end - - def apply_import - giver = Project.find(params[:source_project_id]) - status = @project.team.import(giver, current_user) - notice = status ? "Successfully imported" : "Import failed" - - redirect_to(namespace_project_project_members_path(project.namespace, project), - notice: notice) - end - - protected - - def member_params - params.require(:project_member).permit(:user_id, :access_level) - end -end diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb deleted file mode 100644 index ac36ac6fcd3..00000000000 --- a/app/controllers/projects/protected_branches_controller.rb +++ /dev/null @@ -1,51 +0,0 @@ -class Projects::ProtectedBranchesController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_admin_project! - - layout "project_settings" - - def index - @branches = @project.protected_branches.to_a - @protected_branch = @project.protected_branches.new - end - - def create - @project.protected_branches.create(protected_branch_params) - redirect_to namespace_project_protected_branches_path(@project.namespace, - @project) - end - - def update - protected_branch = @project.protected_branches.find(params[:id]) - - if protected_branch && - protected_branch.update_attributes( - developers_can_push: params[:developers_can_push] - ) - - respond_to do |format| - format.json { render json: protected_branch, status: :ok } - end - else - respond_to do |format| - format.json { render json: protected_branch.errors, status: :unprocessable_entity } - end - end - end - - def destroy - @project.protected_branches.find(params[:id]).destroy - - respond_to do |format| - format.html { redirect_to namespace_project_protected_branches_path } - format.js { render nothing: true } - end - end - - private - - def protected_branch_params - params.require(:protected_branch).permit(:name, :developers_can_push) - end -end diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb deleted file mode 100644 index b1a029ce696..00000000000 --- a/app/controllers/projects/raw_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -# Controller for viewing a file's raw -class Projects::RawController < Projects::ApplicationController - include ExtractsPath - - before_filter :require_non_empty_project - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def show - @blob = @repository.blob_at(@commit.id, @path) - - if @blob - type = get_blob_type - - headers['X-Content-Type-Options'] = 'nosniff' - - send_data( - @blob.data, - type: type, - disposition: 'inline', - filename: @blob.name - ) - else - not_found! - end - end - - private - - def get_blob_type - if @blob.text? - 'text/plain; charset=utf-8' - else - 'application/octet-stream' - end - end -end diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb deleted file mode 100644 index ec3b2b8d75a..00000000000 --- a/app/controllers/projects/refs_controller.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Projects::RefsController < Projects::ApplicationController - include ExtractsPath - - before_filter :require_non_empty_project - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def switch - respond_to do |format| - format.html do - new_path = if params[:destination] == "tree" - namespace_project_tree_path(@project.namespace, @project, - (@id)) - elsif params[:destination] == "blob" - namespace_project_blob_path(@project.namespace, @project, - (@id)) - elsif params[:destination] == "graph" - namespace_project_network_path(@project.namespace, @project, @id, @options) - else - namespace_project_commits_path(@project.namespace, @project, @id) - end - - redirect_to new_path - end - format.js do - @ref = params[:ref] - define_tree_vars - tree - render "tree" - end - end - end - - def logs_tree - @offset = if params[:offset].present? - params[:offset].to_i - else - 0 - end - - @limit = 25 - - @path = params[:path] - - contents = [] - contents.push(*tree.trees) - contents.push(*tree.blobs) - contents.push(*tree.submodules) - - @logs = contents[@offset, @limit].to_a.map do |content| - file = @path ? File.join(@path, content.name) : content.name - last_commit = @repo.last_commit_for_path(@commit.id, file) - { - file_name: content.name, - commit: last_commit - } - end - - respond_to do |format| - format.html { render_404 } - format.js - end - end -end diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb deleted file mode 100644 index 96defb0c721..00000000000 --- a/app/controllers/projects/repositories_controller.rb +++ /dev/null @@ -1,28 +0,0 @@ -class Projects::RepositoriesController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project, except: :create - before_filter :authorize_download_code! - before_filter :authorize_admin_project!, only: :create - - def create - @project.create_repository - - redirect_to project_path(@project) - end - - def archive - begin - file_path = ArchiveRepositoryService.new(@project, params[:ref], params[:format]).execute - rescue - return head :not_found - end - - if file_path - # Send file to user - response.headers["Content-Length"] = File.open(file_path).size.to_s - send_file file_path - else - redirect_to request.fullpath - end - end -end diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb deleted file mode 100644 index 9a484c109ba..00000000000 --- a/app/controllers/projects/services_controller.rb +++ /dev/null @@ -1,59 +0,0 @@ -class Projects::ServicesController < Projects::ApplicationController - # Authorize - before_filter :authorize_admin_project! - before_filter :service, only: [:edit, :update, :test] - - respond_to :html - - layout "project_settings" - - def index - @project.build_missing_services - @services = @project.services.visible.reload - end - - def edit - end - - def update - if @service.update_attributes(service_params) - redirect_to( - edit_namespace_project_service_path(@project.namespace, @project, - @service.to_param, notice: - 'Successfully updated.') - ) - else - render 'edit' - end - end - - def test - data = Gitlab::PushDataBuilder.build_sample(project, current_user) - if @service.execute(data) - message = { notice: 'We sent a request to the provided URL' } - else - message = { alert: 'We tried to send a request to the provided URL but an error occured' } - end - - redirect_to :back, message - end - - private - - def service - @service ||= @project.services.find { |service| service.to_param == params[:id] } - end - - def service_params - params.require(:service).permit( - :title, :token, :type, :active, :api_key, :subdomain, - :room, :recipients, :project_url, :webhook, - :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server, :teamcity_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 - ) - end -end diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb deleted file mode 100644 index ed268400373..00000000000 --- a/app/controllers/projects/snippets_controller.rb +++ /dev/null @@ -1,93 +0,0 @@ -class Projects::SnippetsController < Projects::ApplicationController - before_filter :module_enabled - before_filter :snippet, only: [:show, :edit, :destroy, :update, :raw] - - # Allow read any snippet - before_filter :authorize_read_project_snippet! - - # Allow write(create) snippet - before_filter :authorize_write_project_snippet!, only: [:new, :create] - - # Allow modify snippet - before_filter :authorize_modify_project_snippet!, only: [:edit, :update] - - # Allow destroy snippet - before_filter :authorize_admin_project_snippet!, only: [:destroy] - - respond_to :html - - def index - @snippets = SnippetsFinder.new.execute(current_user, { - filter: :by_project, - project: @project - }) - end - - def new - @snippet = @project.snippets.build - end - - def create - @snippet = CreateSnippetService.new(@project, current_user, - snippet_params).execute - respond_with(@snippet, - location: namespace_project_snippet_path(@project.namespace, - @project, @snippet)) - end - - def edit - end - - def update - UpdateSnippetService.new(project, current_user, @snippet, - snippet_params).execute - respond_with(@snippet, - location: namespace_project_snippet_path(@project.namespace, - @project, @snippet)) - end - - def show - @note = @project.notes.new(noteable: @snippet) - @notes = @snippet.notes.fresh - @noteable = @snippet - end - - def destroy - return access_denied! unless can?(current_user, :admin_project_snippet, @snippet) - - @snippet.destroy - - redirect_to namespace_project_snippets_path(@project.namespace, @project) - end - - def raw - send_data( - @snippet.content, - type: 'text/plain; charset=utf-8', - disposition: 'inline', - filename: @snippet.sanitized_file_name - ) - end - - protected - - def snippet - @snippet ||= @project.snippets.find(params[:id]) - end - - def authorize_modify_project_snippet! - return render_404 unless can?(current_user, :modify_project_snippet, @snippet) - end - - def authorize_admin_project_snippet! - return render_404 unless can?(current_user, :admin_project_snippet, @snippet) - end - - def module_enabled - return render_404 unless @project.snippets_enabled - end - - def snippet_params - params.require(:project_snippet).permit(:title, :content, :file_name, :private, :visibility_level) - end -end diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb deleted file mode 100644 index 83f4937bce3..00000000000 --- a/app/controllers/projects/tags_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -class Projects::TagsController < Projects::ApplicationController - # Authorize - before_filter :require_non_empty_project - before_filter :authorize_download_code! - before_filter :authorize_push_code!, only: [:create] - before_filter :authorize_admin_project!, only: [:destroy] - - def index - sorted = VersionSorter.rsort(@repository.tag_names) - @tags = Kaminari.paginate_array(sorted).page(params[:page]).per(PER_PAGE) - end - - def create - result = CreateTagService.new(@project, current_user). - execute(params[:tag_name], params[:ref], params[:message]) - - if result[:status] == :success - @tag = result[:tag] - redirect_to namespace_project_tags_path(@project.namespace, @project) - else - @error = result[:message] - render action: 'new' - end - end - - def destroy - DeleteTagService.new(project, current_user).execute(params[:id]) - - respond_to do |format| - format.html do - redirect_to namespace_project_tags_path(@project.namespace, - @project) - end - format.js - end - end -end diff --git a/app/controllers/projects/tree_controller.rb b/app/controllers/projects/tree_controller.rb deleted file mode 100644 index b23010bf595..00000000000 --- a/app/controllers/projects/tree_controller.rb +++ /dev/null @@ -1,27 +0,0 @@ -# Controller for viewing a repository's file structure -class Projects::TreeController < Projects::ApplicationController - include ExtractsPath - - before_filter :require_non_empty_project, except: [:new, :create] - before_filter :assign_ref_vars - before_filter :authorize_download_code! - - def show - if tree.entries.empty? - if @repository.blob_at(@commit.id, @path) - redirect_to( - namespace_project_blob_path(@project.namespace, @project, - File.join(@ref, @path)) - ) and return - else - return not_found! - end - end - - respond_to do |format| - format.html - # Disable cache so browser history works - format.js { no_cache_headers } - end - end -end diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb deleted file mode 100644 index aeb7f0699f5..00000000000 --- a/app/controllers/projects/wikis_controller.rb +++ /dev/null @@ -1,123 +0,0 @@ -require 'project_wiki' - -class Projects::WikisController < Projects::ApplicationController - before_filter :authorize_read_wiki! - before_filter :authorize_write_wiki!, only: [:edit, :create, :history] - before_filter :authorize_admin_wiki!, only: :destroy - before_filter :load_project_wiki - include WikiHelper - - def pages - @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE) - end - - def show - @page = @project_wiki.find_page(params[:id], params[:version_id]) - - if @page - render 'show' - elsif file = @project_wiki.find_file(params[:id], params[:version_id]) - if file.on_disk? - send_file file.on_disk_path, disposition: 'inline' - else - send_data( - file.raw_data, - type: file.mime_type, - disposition: 'inline', - filename: file.name - ) - end - else - return render('empty') unless can?(current_user, :write_wiki, @project) - @page = WikiPage.new(@project_wiki) - @page.title = params[:id] - - render 'edit' - end - end - - def edit - @page = @project_wiki.find_page(params[:id]) - end - - def update - @page = @project_wiki.find_page(params[:id]) - - return render('empty') unless can?(current_user, :write_wiki, @project) - - if @page.update(content, format, message) - redirect_to( - namespace_project_wiki_path(@project.namespace, @project, @page), - notice: 'Wiki was successfully updated.' - ) - else - render 'edit' - end - end - - def create - @page = WikiPage.new(@project_wiki) - - if @page.create(wiki_params) - redirect_to( - namespace_project_wiki_path(@project.namespace, @project, @page), - notice: 'Wiki was successfully updated.' - ) - else - render action: "edit" - end - end - - def history - @page = @project_wiki.find_page(params[:id]) - - unless @page - redirect_to( - namespace_project_wiki_path(@project.namespace, @project, :home), - notice: "Page not found" - ) - end - end - - def destroy - @page = @project_wiki.find_page(params[:id]) - @page.delete if @page - - redirect_to( - namespace_project_wiki_path(@project.namespace, @project, :home), - notice: "Page was successfully deleted" - ) - end - - def git_access - end - - private - - def load_project_wiki - @project_wiki = ProjectWiki.new(@project, current_user) - - # Call #wiki to make sure the Wiki Repo is initialized - @project_wiki.wiki - rescue ProjectWiki::CouldNotCreateWikiError => ex - flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." - redirect_to project_path(@project) - return false - end - - def wiki_params - params[:wiki].slice(:title, :content, :format, :message) - end - - def content - params[:wiki][:content] - end - - def format - params[:wiki][:format] - end - - def message - params[:wiki][:message] - end -end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb deleted file mode 100644 index 0f28794b736..00000000000 --- a/app/controllers/projects_controller.rb +++ /dev/null @@ -1,198 +0,0 @@ -class ProjectsController < ApplicationController - prepend_before_filter :render_go_import, only: [:show] - skip_before_filter :authenticate_user!, only: [:show] - before_filter :project, except: [:new, :create] - before_filter :repository, except: [:new, :create] - - # Authorize - before_filter :authorize_admin_project!, only: [:edit, :update, :destroy, :transfer, :archive, :unarchive] - before_filter :set_title, only: [:new, :create] - before_filter :event_filter, only: :show - - layout 'navless', only: [:new, :create, :fork] - - def new - @project = Project.new - end - - def edit - render 'edit', layout: 'project_settings' - end - - def create - @project = ::Projects::CreateService.new(current_user, project_params).execute - - if @project.saved? - redirect_to( - project_path(@project), - notice: 'Project was successfully created.' - ) - else - render 'new' - end - end - - def update - status = ::Projects::UpdateService.new(@project, current_user, project_params).execute - - respond_to do |format| - if status - flash[:notice] = 'Project was successfully updated.' - format.html do - redirect_to( - edit_project_path(@project), - notice: 'Project was successfully updated.' - ) - end - format.js - else - format.html { render 'edit', layout: 'project_settings' } - format.js - end - end - end - - def transfer - transfer_params = params.permit(:new_namespace_id) - ::Projects::TransferService.new(project, current_user, transfer_params).execute - if @project.errors[:namespace_id].present? - flash[:alert] = @project.errors[:namespace_id].first - end - end - - def show - if @project.import_in_progress? - redirect_to namespace_project_import_path(@project.namespace, @project) - return - end - - limit = (params[:limit] || 20).to_i - - @show_star = !(current_user && current_user.starred?(@project)) - - respond_to do |format| - format.html do - if @project.repository_exists? - if @project.empty_repo? - render 'projects/empty', layout: user_layout - else - @last_push = current_user.recent_push(@project.id) if current_user - render :show, layout: user_layout - end - else - render 'projects/no_repo', layout: user_layout - end - end - - format.json do - @events = @project.events.recent - @events = event_filter.apply_filter(@events).with_associations - @events = @events.limit(limit).offset(params[:offset] || 0) - pager_json('events/_events', @events.count) - end - end - end - - def destroy - return access_denied! unless can?(current_user, :remove_project, @project) - - ::Projects::DestroyService.new(@project, current_user, {}).execute - - respond_to do |format| - format.html do - flash[:alert] = 'Project deleted.' - - if request.referer.include?('/admin') - redirect_to admin_namespaces_projects_path - else - redirect_to dashboard_path - end - end - end - end - - def autocomplete_sources - note_type = params['type'] - note_id = params['type_id'] - autocomplete = ::Projects::AutocompleteService.new(@project) - participants = ::Projects::ParticipantsService.new(@project, current_user).execute(note_type, note_id) - - @suggestions = { - emojis: autocomplete_emojis, - issues: autocomplete.issues, - mergerequests: autocomplete.merge_requests, - members: participants - } - - respond_to do |format| - format.json { render json: @suggestions } - end - end - - def archive - return access_denied! unless can?(current_user, :archive_project, @project) - @project.archive! - - respond_to do |format| - format.html { redirect_to project_path(@project) } - end - end - - def unarchive - return access_denied! unless can?(current_user, :archive_project, @project) - @project.unarchive! - - respond_to do |format| - format.html { redirect_to project_path(@project) } - end - end - - def toggle_star - current_user.toggle_star(@project) - @project.reload - render json: { star_count: @project.star_count } - end - - def markdown_preview - render text: view_context.markdown(params[:md_text]) - end - - private - - def set_title - @title = 'New Project' - end - - def user_layout - current_user ? 'projects' : 'public_projects' - end - - def project_params - params.require(:project).permit( - :name, :path, :description, :issues_tracker, :tag_list, - :issues_enabled, :merge_requests_enabled, :snippets_enabled, :issues_tracker_id, :default_branch, - :wiki_enabled, :visibility_level, :import_url, :last_activity_at, :namespace_id, :avatar - ) - end - - def autocomplete_emojis - Rails.cache.fetch("autocomplete-emoji-#{Gemojione::VERSION}") do - Emoji.emojis.map do |name, emoji| - { - name: name, - path: view_context.image_url("emoji/#{emoji["unicode"]}.png") - } - end - end - end - - def render_go_import - return unless params["go-get"] == "1" - - @namespace = params[:namespace_id] - @id = params[:project_id] || params[:id] - @id = @id.gsub(/\.git\Z/, "") - - render "go_import", layout: false - end -end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb deleted file mode 100644 index 38d116a4ee3..00000000000 --- a/app/controllers/registrations_controller.rb +++ /dev/null @@ -1,41 +0,0 @@ -class RegistrationsController < Devise::RegistrationsController - before_filter :signup_enabled? - - def new - redirect_to(new_user_session_path) - end - - def destroy - current_user.destroy - - respond_to do |format| - format.html { redirect_to new_user_session_path, notice: "Account successfully removed." } - end - end - - protected - - def build_resource(hash=nil) - super - end - - def after_sign_up_path_for(_resource) - new_user_session_path - end - - def after_inactive_sign_up_path_for(_resource) - new_user_session_path - end - - private - - def signup_enabled? - unless current_application_settings.signup_enabled? - redirect_to(new_user_session_path) - end - end - - def sign_up_params - params.require(:user).permit(:username, :email, :name, :password, :password_confirmation) - end -end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb deleted file mode 100644 index c5828d0b2df..00000000000 --- a/app/controllers/search_controller.rb +++ /dev/null @@ -1,55 +0,0 @@ -class SearchController < ApplicationController - include SearchHelper - - def show - return if params[:search].nil? || params[:search].blank? - - if params[:project_id].present? - @project = Project.find_by(id: params[:project_id]) - @project = nil unless can?(current_user, :download_code, @project) - end - - if params[:group_id].present? - @group = Group.find_by(id: params[:group_id]) - @group = nil unless can?(current_user, :read_group, @group) - end - - @scope = params[:scope] - @show_snippets = params[:snippets].eql? 'true' - - @search_results = - if @project - unless %w(blobs notes issues merge_requests wiki_blobs). - include?(@scope) - @scope = 'blobs' - end - - Search::ProjectService.new(@project, current_user, params).execute - elsif @show_snippets - unless %w(snippet_blobs snippet_titles).include?(@scope) - @scope = 'snippet_blobs' - end - - Search::SnippetService.new(current_user, params).execute - else - unless %w(projects issues merge_requests).include?(@scope) - @scope = 'projects' - end - Search::GlobalService.new(current_user, params).execute - end - @objects = @search_results.objects(@scope, params[:page]) - end - - def autocomplete - term = params[:term] - - if params[:project_id].present? - @project = Project.find_by(id: params[:project_id]) - @project = nil unless can?(current_user, :read_project, @project) - end - - @ref = params[:project_ref] if params[:project_ref].present? - - render json: search_autocomplete_opts(term).to_json - end -end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb deleted file mode 100644 index 3f11d7afe6f..00000000000 --- a/app/controllers/sessions_controller.rb +++ /dev/null @@ -1,37 +0,0 @@ -class SessionsController < Devise::SessionsController - def new - redirect_path = - if request.referer.present? && (params['redirect_to_referer'] == 'yes') - referer_uri = URI(request.referer) - if referer_uri.host == Gitlab.config.gitlab.host - referer_uri.path - else - request.fullpath - end - else - request.fullpath - end - - # Prevent a 'you are already signed in' message directly after signing: - # we should never redirect to '/users/sign_in' after signing in successfully. - unless redirect_path == '/users/sign_in' - store_location_for(:redirect, redirect_path) - end - - if Gitlab.config.ldap.enabled - @ldap_servers = Gitlab::LDAP::Config.servers - end - - super - end - - def create - super do |resource| - # User has successfully signed in, so clear any unused reset tokens - if resource.reset_password_token.present? - resource.update_attributes(reset_password_token: nil, - reset_password_sent_at: nil) - end - end - end -end diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb deleted file mode 100644 index cd52556b203..00000000000 --- a/app/controllers/snippets_controller.rb +++ /dev/null @@ -1,113 +0,0 @@ -class SnippetsController < ApplicationController - before_filter :snippet, only: [:show, :edit, :destroy, :update, :raw] - - # Allow modify snippet - before_filter :authorize_modify_snippet!, only: [:edit, :update] - - # Allow destroy snippet - before_filter :authorize_admin_snippet!, only: [:destroy] - - before_filter :set_title - - skip_before_filter :authenticate_user!, only: [:index, :user_index, :show, :raw] - - respond_to :html - - layout :determine_layout - - def index - @snippets = SnippetsFinder.new.execute(current_user, filter: :all).page(params[:page]).per(PER_PAGE) - end - - def user_index - @user = User.find_by(username: params[:username]) - - render_404 and return unless @user - - @snippets = SnippetsFinder.new.execute(current_user, { - filter: :by_user, - user: @user, - scope: params[:scope] }). - page(params[:page]).per(PER_PAGE) - - if @user == current_user - render 'current_user_index' - else - render 'user_index' - end - end - - def new - @snippet = PersonalSnippet.new - end - - def create - @snippet = CreateSnippetService.new(nil, current_user, - snippet_params).execute - - respond_with @snippet.becomes(Snippet) - end - - def edit - end - - def update - UpdateSnippetService.new(nil, current_user, @snippet, - snippet_params).execute - respond_with @snippet.becomes(Snippet) - end - - def show - end - - def destroy - return access_denied! unless can?(current_user, :admin_personal_snippet, @snippet) - - @snippet.destroy - - redirect_to snippets_path - end - - def raw - send_data( - @snippet.content, - type: 'text/plain; charset=utf-8', - disposition: 'inline', - filename: @snippet.sanitized_file_name - ) - end - - protected - - def snippet - @snippet ||= if current_user - PersonalSnippet.where("author_id = ? OR visibility_level IN (?)", - current_user.id, - [Snippet::PUBLIC, Snippet::INTERNAL]). - find(params[:id]) - else - PersonalSnippet.are_public.find(params[:id]) - end - end - - def authorize_modify_snippet! - return render_404 unless can?(current_user, :modify_personal_snippet, @snippet) - end - - def authorize_admin_snippet! - return render_404 unless can?(current_user, :admin_personal_snippet, @snippet) - end - - def set_title - @title = 'Snippets' - @title_url = snippets_path - end - - def snippet_params - params.require(:personal_snippet).permit(:title, :content, :file_name, :private, :visibility_level) - end - - def determine_layout - current_user ? 'navless' : 'public_users' - end -end diff --git a/app/controllers/uploads_controller.rb b/app/controllers/uploads_controller.rb deleted file mode 100644 index c5f3da54ea2..00000000000 --- a/app/controllers/uploads_controller.rb +++ /dev/null @@ -1,71 +0,0 @@ -class UploadsController < ApplicationController - skip_before_filter :authenticate_user! - before_filter :find_model, :authorize_access! - - def show - uploader = @model.send(upload_mount) - - unless uploader.file_storage? - return redirect_to uploader.url - end - - unless uploader.file && uploader.file.exists? - return not_found! - end - - disposition = uploader.image? ? 'inline' : 'attachment' - send_file uploader.file.path, disposition: disposition - end - - private - - def find_model - unless upload_model && upload_mount - return not_found! - end - - @model = upload_model.find(params[:id]) - end - - def authorize_access! - authorized = - case @model - when Project - can?(current_user, :read_project, @model) - when Group - can?(current_user, :read_group, @model) - when Note - can?(current_user, :read_project, @model.project) - else - # No authentication required for user avatars. - true - end - - return if authorized - - if current_user - not_found! - else - authenticate_user! - end - end - - def upload_model - upload_models = { - user: User, - project: Project, - note: Note, - group: Group - } - - upload_models[params[:model].to_sym] - end - - def upload_mount - upload_mounts = %w(avatar attachment file) - - if upload_mounts.include?(params[:mounted_as]) - params[:mounted_as] - end - end -end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb deleted file mode 100644 index 679d6897ce9..00000000000 --- a/app/controllers/users_controller.rb +++ /dev/null @@ -1,97 +0,0 @@ -class UsersController < ApplicationController - skip_before_filter :authenticate_user! - before_filter :set_user - layout :determine_layout - - def show - @contributed_projects = contributed_projects.joined(@user). - reject(&:forked?) - - @projects = @user.personal_projects. - where(id: authorized_projects_ids).includes(:namespace) - - # Collect only groups common for both users - @groups = @user.groups & GroupsFinder.new.execute(current_user) - - @title = @user.name - @title_url = user_path(@user) - - respond_to do |format| - format.html - - format.atom do - load_events - render layout: false - end - - format.json do - load_events - pager_json("events/_events", @events.count) - end - end - end - - def calendar - calendar = contributions_calendar - @timestamps = calendar.timestamps - @starting_year = calendar.starting_year - @starting_month = calendar.starting_month - - render 'calendar', layout: false - end - - def calendar_activities - @calendar_date = Date.parse(params[:date]) rescue nil - @events = [] - - if @calendar_date - @events = contributions_calendar.events_by_date(@calendar_date) - end - - render 'calendar_activities', layout: false - end - - def determine_layout - if current_user - 'navless' - else - 'public_users' - end - end - - private - - 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 - # Projects user can view - @authorized_projects_ids ||= - ProjectsFinder.new.execute(current_user).pluck(:id) - end - - def contributed_projects - @contributed_projects = Project. - where(id: authorized_projects_ids & @user.contributed_projects_ids). - includes(:namespace) - end - - def contributions_calendar - @contributions_calendar ||= Gitlab::ContributionsCalendar. - new(contributed_projects.reject(&:forked?), @user) - end - - def load_events - # Get user activity feed for projects common for both users - @events = @user.recent_events. - where(project_id: authorized_projects_ids). - with_associations - - @events = @events.limit(20).offset(params[:offset] || 0) - end -end diff --git a/app/finders/README.md b/app/finders/README.md deleted file mode 100644 index 1f46518d230..00000000000 --- a/app/finders/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Finders - -This type of classes responsible for collection items based on different conditions. -To prevent lookup methods in models like this: - -```ruby -class Project - def issues_for_user_filtered_by(user, filter) - # A lot of logic not related to project model itself - end -end - -issues = project.issues_for_user_filtered_by(user, params) -``` - -Better use this: - -```ruby -issues = IssuesFinder.new.execute(project, user, filter) -``` - -It will help keep models thiner. diff --git a/app/finders/groups_finder.rb b/app/finders/groups_finder.rb deleted file mode 100644 index d3597ef0901..00000000000 --- a/app/finders/groups_finder.rb +++ /dev/null @@ -1,38 +0,0 @@ -class GroupsFinder - def execute(current_user, options = {}) - all_groups(current_user) - end - - private - - def all_groups(current_user) - if current_user - if current_user.authorized_groups.any? - # User has access to groups - # - # Return only: - # groups with public projects - # groups with internal projects - # groups with joined projects - # - group_ids = Project.public_and_internal_only.pluck(:namespace_id) + - current_user.authorized_groups.pluck(:id) - Group.where(id: group_ids) - else - # User has no group membership - # - # Return only: - # groups with public projects - # groups with internal projects - # - Group.where(id: Project.public_and_internal_only.pluck(:namespace_id)) - end - else - # Not authenticated - # - # Return only: - # groups with public projects - Group.where(id: Project.public_only.pluck(:namespace_id)) - end - end -end diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb deleted file mode 100644 index 2c0702073d4..00000000000 --- a/app/finders/issuable_finder.rb +++ /dev/null @@ -1,160 +0,0 @@ -# IssuableFinder -# -# Used to filter Issues and MergeRequests collections by set of params -# -# Arguments: -# klass - actual class like Issue or MergeRequest -# current_user - which user use -# params: -# scope: 'created-by-me' or 'assigned-to-me' or 'all' -# state: 'open' or 'closed' or 'all' -# group_id: integer -# project_id: integer -# milestone_id: integer -# assignee_id: integer -# search: string -# label_name: string -# sort: string -# -require_relative 'projects_finder' - -class IssuableFinder - NONE = '0' - - attr_accessor :current_user, :params - - def execute(current_user, params) - @current_user = current_user - @params = params - - items = init_collection - items = by_scope(items) - items = by_state(items) - items = by_group(items) - items = by_project(items) - items = by_search(items) - items = by_milestone(items) - items = by_assignee(items) - items = by_author(items) - items = by_label(items) - items = sort(items) - end - - private - - def init_collection - table_name = klass.table_name - - if project - if Ability.abilities.allowed?(current_user, :read_project, project) - project.send(table_name) - else - [] - end - elsif current_user && params[:authorized_only].presence && !current_user_related? - klass.of_projects(current_user.authorized_projects).references(:project) - else - klass.of_projects(ProjectsFinder.new.execute(current_user)).references(:project) - end - end - - def by_scope(items) - case params[:scope] - when 'created-by-me', 'authored' then - items.where(author_id: current_user.id) - when 'all' then - items - when 'assigned-to-me' then - items.where(assignee_id: current_user.id) - else - raise 'You must specify default scope' - end - end - - def by_state(items) - case params[:state] - when 'closed' - items.closed - when 'all' - items - when 'opened' - items.opened - else - raise 'You must specify default state' - end - end - - def by_group(items) - if params[:group_id].present? - items = items.of_group(Group.find(params[:group_id])) - end - - items - end - - def by_project(items) - if params[:project_id].present? - items = items.of_projects(params[:project_id]) - end - - items - end - - def by_search(items) - if params[:search].present? - items = items.search(params[:search]) - end - - items - end - - def sort(items) - items.sort(params[:sort]) - end - - def by_milestone(items) - if params[:milestone_id].present? - items = items.where(milestone_id: (params[:milestone_id] == NONE ? nil : params[:milestone_id])) - end - - items - end - - def by_assignee(items) - if params[:assignee_id].present? - items = items.where(assignee_id: (params[:assignee_id] == NONE ? nil : params[:assignee_id])) - end - - items - end - - def by_author(items) - if params[:author_id].present? - items = items.where(author_id: (params[:author_id] == NONE ? nil : params[:author_id])) - end - - items - end - - def by_label(items) - if params[:label_name].present? - label_names = params[:label_name].split(",") - - item_ids = LabelLink.joins(:label). - where('labels.title in (?)', label_names). - where(target_type: klass.name).pluck(:target_id) - - items = items.where(id: item_ids) - end - - items - end - - def project - Project.where(id: params[:project_id]).first if params[:project_id].present? - end - - def current_user_related? - params[:scope] == 'created-by-me' || params[:scope] == 'authored' || params[:scope] == 'assigned-to-me' - end -end diff --git a/app/finders/issues_finder.rb b/app/finders/issues_finder.rb deleted file mode 100644 index 20a2b0ce8f0..00000000000 --- a/app/finders/issues_finder.rb +++ /dev/null @@ -1,22 +0,0 @@ -# Finders::Issues class -# -# Used to filter Issues collections by set of params -# -# Arguments: -# current_user - which user use -# params: -# scope: 'created-by-me' or 'assigned-to-me' or 'all' -# state: 'open' or 'closed' or 'all' -# group_id: integer -# project_id: integer -# milestone_id: integer -# assignee_id: integer -# search: string -# label_name: string -# sort: string -# -class IssuesFinder < IssuableFinder - def klass - Issue - end -end diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb deleted file mode 100644 index b258216d0d4..00000000000 --- a/app/finders/merge_requests_finder.rb +++ /dev/null @@ -1,22 +0,0 @@ -# Finders::MergeRequest class -# -# Used to filter MergeRequests collections by set of params -# -# Arguments: -# current_user - which user use -# params: -# scope: 'created-by-me' or 'assigned-to-me' or 'all' -# state: 'open' or 'closed' or 'all' -# group_id: integer -# project_id: integer -# milestone_id: integer -# assignee_id: integer -# search: string -# label_name: string -# sort: string -# -class MergeRequestsFinder < IssuableFinder - def klass - MergeRequest - end -end diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb deleted file mode 100644 index ab252821b52..00000000000 --- a/app/finders/notes_finder.rb +++ /dev/null @@ -1,27 +0,0 @@ -class NotesFinder - FETCH_OVERLAP = 5.seconds - - def execute(project, current_user, params) - target_type = params[:target_type] - target_id = params[:target_id] - # Default to 0 to remain compatible with old clients - last_fetched_at = Time.at(params.fetch(:last_fetched_at, 0).to_i) - - notes = - case target_type - when "commit" - project.notes.for_commit_id(target_id).not_inline - when "issue" - project.issues.find(target_id).notes.inc_author - when "merge_request" - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author - when "snippet", "project_snippet" - project.snippets.find(target_id).notes - else - raise 'invalid target_type' - end - - # Use overlapping intervals to avoid worrying about race conditions - notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP).fresh - end -end diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb deleted file mode 100644 index c81bb51583a..00000000000 --- a/app/finders/projects_finder.rb +++ /dev/null @@ -1,89 +0,0 @@ -class ProjectsFinder - def execute(current_user, options = {}) - group = options[:group] - - if group - group_projects(current_user, group) - else - all_projects(current_user) - end - end - - private - - def group_projects(current_user, group) - if current_user - if group.users.include?(current_user) - # User is group member - # - # Return ALL group projects - group.projects - else - projects_members = ProjectMember.in_projects(group.projects). - with_user(current_user) - - if projects_members.any? - # User is a project member - # - # Return only: - # public projects - # internal projects - # joined projects - # - group.projects.where( - "projects.id IN (?) OR projects.visibility_level IN (?)", - projects_members.pluck(:source_id), - Project.public_and_internal_levels - ) - else - # User has no access to group or group projects - # - # Return only: - # public projects - # internal projects - # - group.projects.public_and_internal_only - end - end - else - # Not authenticated - # - # Return only: - # public projects - group.projects.public_only - end - end - - def all_projects(current_user) - if current_user - if current_user.authorized_projects.any? - # User has access to private projects - # - # Return only: - # public projects - # internal projects - # joined projects - # - Project.where( - "projects.id IN (?) OR projects.visibility_level IN (?)", - current_user.authorized_projects.pluck(:id), - Project.public_and_internal_levels - ) - else - # User has no access to private projects - # - # Return only: - # public projects - # internal projects - # - Project.public_and_internal_only - end - else - # Not authenticated - # - # Return only: - # public projects - Project.public_only - end - end -end diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb deleted file mode 100644 index 07b5759443b..00000000000 --- a/app/finders/snippets_finder.rb +++ /dev/null @@ -1,63 +0,0 @@ -class SnippetsFinder - def execute(current_user, params = {}) - filter = params[:filter] - - case filter - when :all then - snippets(current_user).fresh.non_expired - when :by_user then - by_user(current_user, params[:user], params[:scope]) - when :by_project - by_project(current_user, params[:project]) - end - end - - private - - def snippets(current_user) - if current_user - Snippet.public_and_internal - else - # Not authenticated - # - # Return only: - # public snippets - Snippet.are_public - end - end - - def by_user(current_user, user, scope) - snippets = user.snippets.fresh.non_expired - - return snippets.are_public unless current_user - - if user == current_user - case scope - when 'are_internal' then - snippets.are_internal - when 'are_private' then - snippets.are_private - when 'are_public' then - snippets.are_public - else - snippets - end - else - snippets.public_and_internal - end - end - - def by_project(current_user, project) - snippets = project.snippets.fresh.non_expired - - if current_user - if project.team.member?(current_user.id) - snippets - else - snippets.public_and_internal - end - else - snippets.are_public - end - end -end diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb deleted file mode 100644 index a79bd47d986..00000000000 --- a/app/finders/trending_projects_finder.rb +++ /dev/null @@ -1,19 +0,0 @@ -class TrendingProjectsFinder - def execute(current_user, start_date = nil) - start_date ||= Date.today - 1.month - - projects = projects_for(current_user) - - # 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") - end - - private - - def projects_for(current_user) - ProjectsFinder.new.execute(current_user) - end -end diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb deleted file mode 100644 index bb8d5683807..00000000000 --- a/app/helpers/appearances_helper.rb +++ /dev/null @@ -1,21 +0,0 @@ -module AppearancesHelper - def brand_item - nil - end - - def brand_title - 'GitLab Community Edition' - end - - def brand_image - nil - end - - def brand_text - nil - end - - def brand_header_logo - image_tag 'logo-white.png' - end -end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb deleted file mode 100644 index 20457572a08..00000000000 --- a/app/helpers/application_helper.rb +++ /dev/null @@ -1,325 +0,0 @@ -require 'digest/md5' -require 'uri' - -module ApplicationHelper - 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 - - # Check if a particular controller is the current one - # - # args - One or more controller names to check - # - # Examples - # - # # On TreeController - # current_controller?(:tree) # => true - # current_controller?(:commits) # => false - # current_controller?(:commits, :tree) # => true - def current_controller?(*args) - args.any? { |v| v.to_s.downcase == controller.controller_name } - end - - # Check if a particular action is the current one - # - # args - One or more action names to check - # - # Examples - # - # # On Projects#new - # current_action?(:new) # => true - # current_action?(:create) # => false - # current_action?(:new, :create) # => true - def current_action?(*args) - args.any? { |v| v.to_s.downcase == action_name } - end - - def project_icon(project_id, options = {}) - project = - if project_id.is_a?(Project) - project = project_id - else - Project.find_with_namespace(project_id) - end - - if project.avatar_url - image_tag project.avatar_url, options - else # generated icon - project_identicon(project, options) - end - end - - def project_identicon(project, options = {}) - allowed_colors = { - red: 'FFEBEE', - purple: 'F3E5F5', - indigo: 'E8EAF6', - blue: 'E3F2FD', - teal: 'E0F2F1', - orange: 'FBE9E7', - gray: 'EEEEEE' - } - - options[:class] ||= '' - options[:class] << ' identicon' - bg_key = project.id % 7 - style = "background-color: ##{ allowed_colors.values[bg_key] }; color: #555" - - content_tag(:div, class: options[:class], style: style) do - project.name[0, 1].upcase - end - end - - def avatar_icon(user_email = '', size = nil) - user = User.find_by(email: user_email) - - if user - user.avatar_url(size) || default_avatar - else - gravatar_icon(user_email, size) - end - end - - def gravatar_icon(user_email = '', size = nil) - GravatarService.new.execute(user_email, size) || - default_avatar - end - - def default_avatar - image_path('no_avatar.png') - end - - def last_commit(project) - if project.repo_exists? - time_ago_with_tooltip(project.repository.commit.committed_date) - else - 'Never' - end - rescue - 'Never' - end - - def grouped_options_refs - repository = @project.repository - - options = [ - ['Branches', repository.branch_names], - ['Tags', VersionSorter.rsort(repository.tag_names)] - ] - - # If reference is commit id - we should add it to branch/tag selectbox - if(@ref && !options.flatten.include?(@ref) && - @ref =~ /\A[0-9a-zA-Z]{6,52}\z/) - options << ['Commit', [@ref]] - end - - grouped_options_for_select(options, @ref || @project.default_branch) - end - - def emoji_autocomplete_source - # should be an array of strings - # so to_s can be called, because it is sufficient and to_json is too slow - Emoji.names.to_s - end - - def app_theme - Gitlab::Theme.css_class_by_id(current_user.try(:theme_id)) - end - - def theme_type - Gitlab::Theme.type_css_class_by_id(current_user.try(:theme_id)) - end - - def user_color_scheme_class - COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user) - end - - # Define whenever show last push event - # with suggestion to create MR - def show_last_push_widget?(event) - # Skip if event is not about added or modified non-master branch - return false unless event && event.last_push_to_non_root? && !event.rm_ref? - - project = event.project - - # Skip if project repo is empty or MR disabled - return false unless project && !project.empty_repo? && project.merge_requests_enabled - - # Skip if user already created appropriate MR - return false if project.merge_requests.where(source_branch: event.branch_name).opened.any? - - # Skip if user removed branch right after that - return false unless project.repository.branch_names.include?(event.branch_name) - - true - end - - def hexdigest(string) - Digest::SHA1.hexdigest string - end - - def simple_sanitize(str) - sanitize(str, tags: %w(a span)) - end - - def body_data_page - path = controller.controller_path.split('/') - namespace = path.first if path.second - - [namespace, controller.controller_name, controller.action_name].compact.join(':') - end - - # shortcut for gitlab config - def gitlab_config - Gitlab.config.gitlab - end - - # shortcut for gitlab extra config - def extra_config - Gitlab.config.extra - end - - def search_placeholder - if @project && @project.persisted? - 'Search in this project' - elsif @snippet || @snippets || @show_snippets - 'Search snippets' - elsif @group && @group.persisted? - 'Search in this group' - else - 'Search' - end - end - - def broadcast_message - BroadcastMessage.current - end - - def time_ago_with_tooltip(date, placement = 'top', html_class = 'time_ago') - capture_haml do - haml_tag :time, date.to_s, - class: html_class, datetime: date.getutc.iso8601, title: date.stamp('Aug 21, 2011 9:23pm'), - data: { toggle: 'tooltip', placement: placement } - - haml_tag :script, "$('." + html_class + "').timeago().tooltip()" - end.html_safe - end - - def render_markup(file_name, file_content) - GitHub::Markup.render(file_name, file_content). - force_encoding(file_content.encoding).html_safe - rescue RuntimeError - simple_format(file_content) - end - - def markup?(filename) - Gitlab::MarkdownHelper.markup?(filename) - end - - def gitlab_markdown?(filename) - Gitlab::MarkdownHelper.gitlab_markdown?(filename) - end - - # Overrides ActionView::Helpers::UrlHelper#link_to to add `rel="nofollow"` to - # external links - def link_to(name = nil, options = nil, html_options = {}) - if options.kind_of?(String) - if !options.start_with?('#', '/') - html_options = add_nofollow(options, html_options) - end - end - - super - end - - # Add `"rel=nofollow"` to external links - # - # link - String link to check - # html_options - Hash of `html_options` passed to `link_to` - # - # Returns `html_options`, adding `rel: nofollow` for external links - def add_nofollow(link, html_options = {}) - uri = URI(link) - - if uri && uri.absolute? && uri.host != Gitlab.config.gitlab.host - rel = html_options.fetch(:rel, '') - html_options[:rel] = (rel + ' nofollow').strip - end - - html_options - end - - def escaped_autolink(text) - auto_link ERB::Util.html_escape(text), link: :urls - end - - def promo_host - 'about.gitlab.com' - end - - def promo_url - 'https://' + promo_host - end - - def page_filter_path(options = {}) - without = options.delete(:without) - - exist_opts = { - state: params[:state], - scope: params[:scope], - label_name: params[:label_name], - milestone_id: params[:milestone_id], - assignee_id: params[:assignee_id], - author_id: params[:author_id], - sort: params[:sort], - } - - options = exist_opts.merge(options) - - if without.present? - without.each do |key| - options.delete(key) - end - end - - path = request.path - path << "?#{options.to_param}" - path - end - - def outdated_browser? - browser.ie? && browser.version.to_i < 10 - end - - def path_to_key(key, admin = false) - if admin - admin_user_key_path(@user, key) - else - profile_key_path(key) - end - end - - def nav_sidebar_class - if nav_menu_collapsed? - "page-sidebar-collapsed" - else - "page-sidebar-expanded" - end - end -end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb deleted file mode 100644 index 241d6075c9f..00000000000 --- a/app/helpers/application_settings_helper.rb +++ /dev/null @@ -1,38 +0,0 @@ -module ApplicationSettingsHelper - def gravatar_enabled? - current_application_settings.gravatar_enabled? - end - - def twitter_sharing_enabled? - current_application_settings.twitter_sharing_enabled? - end - - def signup_enabled? - current_application_settings.signup_enabled? - end - - def signin_enabled? - current_application_settings.signin_enabled? - end - - def extra_sign_in_text - current_application_settings.sign_in_text - end - - # Return a group of checkboxes that use Bootstrap's button plugin for a - # toggle button effect. - def restricted_level_checkboxes(help_block_id) - Gitlab::VisibilityLevel.options.map do |name, level| - checked = restricted_visibility_levels(true).include?(level) - css_class = 'btn btn-primary' - css_class += ' active' if checked - checkbox_name = 'application_setting[restricted_visibility_levels][]' - - label_tag(checkbox_name, class: css_class) do - check_box_tag(checkbox_name, level, checked, - autocomplete: 'off', - 'aria-describedby' => help_block_id) + name - end - end - end -end diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb deleted file mode 100644 index 4ea838ca447..00000000000 --- a/app/helpers/blob_helper.rb +++ /dev/null @@ -1,72 +0,0 @@ -module BlobHelper - def highlight(blob_name, blob_content, nowrap = false) - formatter = Rugments::Formatters::HTML.new( - nowrap: nowrap, - cssclass: 'code highlight', - lineanchors: true, - lineanchorsid: 'LC' - ) - - begin - lexer = Rugments::Lexer.guess(filename: blob_name, source: blob_content) - rescue Rugments::Lexer::AmbiguousGuess - lexer = Rugments::Lexers::PlainText - end - - formatter.format(lexer.lex(blob_content)).html_safe - end - - def no_highlight_files - %w(credits changelog news copying copyright license authors) - end - - def edit_blob_link(project, ref, path, options = {}) - blob = - begin - project.repository.blob_at(ref, path) - rescue - nil - end - - if blob && blob.text? - text = 'Edit' - after = options[:after] || '' - from_mr = options[:from_merge_request_id] - link_opts = {} - link_opts[:from_merge_request_id] = from_mr if from_mr - cls = 'btn btn-small' - if allowed_tree_edit?(project, ref) - link_to(text, - namespace_project_edit_blob_path(project.namespace, project, - tree_join(ref, path), - link_opts), - class: cls - ) - else - content_tag :span, text, class: cls + ' disabled' - end + after.html_safe - else - '' - end - end - - def leave_edit_message - "Leave edit mode?\nAll unsaved changes will be lost." - end - - def editing_preview_title(filename) - if Gitlab::MarkdownHelper.previewable?(filename) - 'Preview' - else - 'Preview changes' - end - end - - # Return an image icon depending on the file mode and extension - # - # mode - File unix mode - # mode - File name - def blob_icon(mode, name) - icon("#{file_type_icon_class('file', mode, name)} fw") - end -end diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb deleted file mode 100644 index d6eaa7d57bc..00000000000 --- a/app/helpers/branches_helper.rb +++ /dev/null @@ -1,17 +0,0 @@ -module BranchesHelper - def can_remove_branch?(project, branch_name) - if project.protected_branch? branch_name - false - elsif branch_name == project.repository.root_ref - false - else - can?(current_user, :push_code, project) - end - end - - def can_push_branch?(project, branch_name) - return false unless project.repository.branch_names.include?(branch_name) - - ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(branch_name) - end -end diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb deleted file mode 100644 index 29ff47663da..00000000000 --- a/app/helpers/broadcast_messages_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -module BroadcastMessagesHelper - def broadcast_styling(broadcast_message) - if(broadcast_message.color || broadcast_message.font) - "background-color:#{broadcast_message.color};color:#{broadcast_message.font}" - else - "" - end - end -end diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb deleted file mode 100644 index d13d80be293..00000000000 --- a/app/helpers/commits_helper.rb +++ /dev/null @@ -1,183 +0,0 @@ -# encoding: utf-8 -module CommitsHelper - # Returns a link to the commit author. If the author has a matching user and - # is a member of the current @project it will link to the team member page. - # Otherwise it will link to the author email as specified in the commit. - # - # options: - # avatar: true will prepend the avatar image - # size: size of the avatar image in px - def commit_author_link(commit, options = {}) - commit_person_link(commit, options.merge(source: :author)) - end - - # Just like #author_link but for the committer. - def commit_committer_link(commit, options = {}) - commit_person_link(commit, options.merge(source: :committer)) - end - - def image_diff_class(diff) - if diff.deleted_file - "deleted" - elsif diff.new_file - "added" - else - nil - end - end - - def commit_to_html(commit, project, inline = true) - template = inline ? "inline_commit" : "commit" - escape_javascript(render "projects/commits/#{template}", commit: commit, project: project) unless commit.nil? - end - - # Breadcrumb links for a Project and, if applicable, a tree path - def commits_breadcrumbs - return unless @project && @ref - - # Add the root project link and the arrow icon - crumbs = content_tag(:li) do - link_to( - @project.path, - namespace_project_commits_path(@project.namespace, @project, @ref) - ) - end - - if @path - parts = @path.split('/') - - parts.each_with_index do |part, i| - crumbs << content_tag(:li) do - # The text is just the individual part, but the link needs all the parts before it - link_to( - part, - namespace_project_commits_path( - @project.namespace, - @project, - tree_join(@ref, parts[0..i].join('/')) - ) - ) - end - end - end - - crumbs.html_safe - end - - # Return Project default branch, if it present in array - # Else - first branch in array (mb last actual branch) - def commit_default_branch(project, branches) - branches.include?(project.default_branch) ? branches.delete(project.default_branch) : branches.pop - end - - # Returns the sorted alphabetically links to branches, separated by a comma - def commit_branches_links(project, branches) - branches.sort.map do |branch| - link_to( - namespace_project_tree_path(project.namespace, project, branch) - ) do - content_tag :span, class: 'label label-gray' do - icon('code-fork') + ' ' + branch - end - end - end.join(" ").html_safe - end - - # Returns the sorted links to tags, separated by a comma - def commit_tags_links(project, tags) - sorted = VersionSorter.rsort(tags) - sorted.map do |tag| - link_to( - namespace_project_commits_path(project.namespace, project, - project.repository.find_tag(tag).name) - ) do - content_tag :span, class: 'label label-gray' do - icon('tag') + ' ' + tag - end - end - end.join(" ").html_safe - end - - def link_to_browse_code(project, commit) - if current_controller?(:projects, :commits) - if @repo.blob_at(commit.id, @path) - return link_to( - "Browse File »", - namespace_project_blob_path(project.namespace, project, - tree_join(commit.id, @path)), - class: "pull-right" - ) - elsif @path.present? - return link_to( - "Browse Dir »", - namespace_project_tree_path(project.namespace, project, - tree_join(commit.id, @path)), - class: "pull-right" - ) - end - end - link_to( - "Browse Code »", - namespace_project_tree_path(project.namespace, project, commit), - class: "pull-right" - ) - end - - protected - - # Private: Returns a link to a person. If the person has a matching user and - # is a member of the current @project it will link to the team member page. - # Otherwise it will link to the person email as specified in the commit. - # - # options: - # source: one of :author or :committer - # avatar: true will prepend the avatar image - # size: size of the avatar image in px - def commit_person_link(commit, options = {}) - user = commit.send(options[:source]) - - source_name = clean(commit.send "#{options[:source]}_name".to_sym) - source_email = clean(commit.send "#{options[:source]}_email".to_sym) - - person_name = user.try(:name) || source_name - person_email = user.try(:email) || source_email - - text = - if options[:avatar] - avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") - %Q{#{avatar} #{person_name}} - else - person_name - end - - options = { - class: "commit-#{options[:source]}-link has_tooltip", - data: { :'original-title' => sanitize(source_email) } - } - - if user.nil? - mail_to(source_email, text.html_safe, options) - else - link_to(text.html_safe, user_path(user), options) - end - end - - def view_file_btn(commit_sha, diff, project) - link_to( - namespace_project_blob_path(project.namespace, project, - tree_join(commit_sha, diff.new_path)), - class: 'btn btn-small view-file js-view-file' - ) do - raw('View file @') + content_tag(:span, commit_sha[0..6], - class: 'commit-short-id') - end - end - - def truncate_sha(sha) - Commit.truncate_sha(sha) - end - - def clean(string) - Sanitize.clean(string, remove_contents: true) - end -end diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb deleted file mode 100644 index 01847c6b807..00000000000 --- a/app/helpers/compare_helper.rb +++ /dev/null @@ -1,22 +0,0 @@ -module CompareHelper - def compare_to_mr_button? - @project.merge_requests_enabled && - params[:from].present? && - params[:to].present? && - @repository.branch_names.include?(params[:from]) && - @repository.branch_names.include?(params[:to]) && - params[:from] != params[:to] && - !@refs_are_same - end - - def compare_mr_path - new_namespace_project_merge_request_path( - @project.namespace, - @project, - merge_request: { - source_branch: params[:to], - target_branch: params[:from] - } - ) - end -end diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb deleted file mode 100644 index c25b54eadc6..00000000000 --- a/app/helpers/dashboard_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -module DashboardHelper - def assigned_issues_dashboard_path - issues_dashboard_path(assignee_id: current_user.id) - end - - def assigned_mrs_dashboard_path - merge_requests_dashboard_path(assignee_id: current_user.id) - end -end diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb deleted file mode 100644 index 4f42972a4dd..00000000000 --- a/app/helpers/diff_helper.rb +++ /dev/null @@ -1,157 +0,0 @@ -module DiffHelper - def allowed_diff_size - if diff_hard_limit_enabled? - Commit::DIFF_HARD_LIMIT_FILES - else - Commit::DIFF_SAFE_FILES - end - end - - def safe_diff_files(diffs) - diffs.first(allowed_diff_size).map do |diff| - Gitlab::Diff::File.new(diff) - end - end - - def show_diff_size_warning?(diffs) - diffs.size > allowed_diff_size - end - - def diff_hard_limit_enabled? - # Enabling hard limit allows user to see more diff information - if params[:force_show_diff].present? - true - else - false - end - end - - def generate_line_code(file_path, line) - Gitlab::Diff::LineCode.generate(file_path, line.new_pos, line.old_pos) - end - - def parallel_diff(diff_file, index) - lines = [] - skip_next = false - - # Building array of lines - # - # [ - # left_type, left_line_number, left_line_content, left_line_code, - # right_line_type, right_line_number, right_line_content, right_line_code - # ] - # - diff_file.diff_lines.each do |line| - - full_line = line.text - type = line.type - line_code = generate_line_code(diff_file.file_path, line) - line_new = line.new_pos - line_old = line.old_pos - - next_line = diff_file.next_line(line.index) - - if next_line - next_line_code = generate_line_code(diff_file.file_path, next_line) - next_type = next_line.type - next_line = next_line.text - end - - if type == 'match' || type.nil? - # line in the right panel is the same as in the left one - line = [type, line_old, full_line, line_code, type, line_new, full_line, line_code] - lines.push(line) - elsif type == 'old' - if next_type == 'new' - # Left side has text removed, right side has text added - line = [type, line_old, full_line, line_code, next_type, line_new, next_line, next_line_code] - lines.push(line) - skip_next = true - elsif next_type == 'old' || next_type.nil? - # Left side has text removed, right side doesn't have any change - # No next line code, no new line number, no new line text - line = [type, line_old, full_line, line_code, next_type, nil, " ", nil] - lines.push(line) - end - elsif type == 'new' - if skip_next - # Change has been already included in previous line so no need to do it again - skip_next = false - next - else - # Change is only on the right side, left side has no change - line = [nil, nil, " ", line_code, type, line_new, full_line, line_code] - lines.push(line) - end - end - end - lines - end - - def unfold_bottom_class(bottom) - (bottom) ? 'js-unfold-bottom' : '' - end - - def diff_line_content(line) - if line.blank? - "  " - else - line - end - end - - def line_comments - @line_comments ||= @line_notes.select(&:active?).group_by(&:line_code) - end - - def organize_comments(type_left, type_right, line_code_left, line_code_right) - comments_left = comments_right = nil - - unless type_left.nil? && type_right == 'new' - comments_left = line_comments[line_code_left] - end - - unless type_left.nil? && type_right.nil? - comments_right = line_comments[line_code_right] - end - - [comments_left, comments_right] - end - - def inline_diff_btn - params_copy = params.dup - params_copy[:view] = 'inline' - # 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 - 'Inline' - end - end - - def parallel_diff_btn - params_copy = params.dup - params_copy[:view] = 'parallel' - # 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 - 'Side-by-side' - end - end - - def submodule_link(blob, ref) - tree, commit = submodule_links(blob, ref) - commit_id = if commit.nil? - blob.id[0..10] - else - link_to "#{blob.id[0..10]}", commit - end - - [ - content_tag(:span, link_to(truncate(blob.name, length: 40), tree)), - '@', - content_tag(:span, commit_id, class: 'monospace'), - ].join(' ').html_safe - end -end diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb deleted file mode 100644 index 0df3ecc90b7..00000000000 --- a/app/helpers/emails_helper.rb +++ /dev/null @@ -1,38 +0,0 @@ -module EmailsHelper - - # Google Actions - # https://developers.google.com/gmail/markup/reference/go-to-action - def email_action(url) - name = action_title(url) - if name - data = { - "@context" => "http://schema.org", - "@type" => "EmailMessage", - "action" => { - "@type" => "ViewAction", - "name" => name, - "url" => url, - } - } - - content_tag :script, type: 'application/ld+json' do - data.to_json.html_safe - end - end - end - - def action_title(url) - return unless url - ["merge_requests", "issues", "commit"].each do |action| - if url.split("/").include?(action) - return "View #{action.humanize.singularize}" - end - end - end - - def color_email_diff(diffcontent) - formatter = Rugments::Formatters::HTML.new(cssclass: "highlight", inline_theme: :github) - lexer = Rugments::Lexers::Diff.new - raw formatter.format(lexer.lex(diffcontent)) - end -end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb deleted file mode 100644 index c9fd0f0362b..00000000000 --- a/app/helpers/events_helper.rb +++ /dev/null @@ -1,199 +0,0 @@ -module EventsHelper - def link_to_author(event) - author = event.author - - if author - link_to author.name, user_path(author.username) - else - event.author_name - end - end - - def event_action_name(event) - target = if event.target_type - if event.note? - event.note_target_type - else - event.target_type.titleize.downcase - end - else - 'project' - end - - [event.action_name, target].join(" ") - end - - def event_filter_link(key, tooltip) - key = key.to_s - active = if @event_filter.active? key - 'active' - end - - content_tag :li, class: "filter_icon #{active}" do - link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => 'Filter by ' + tooltip.downcase do - icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) - end - end - end - - def icon_for_event - { - EventFilter.push => 'upload', - EventFilter.merged => 'check-square-o', - EventFilter.comments => 'comments', - EventFilter.team => 'user', - } - end - - def event_feed_title(event) - words = [] - words << event.author_name - words << event_action_name(event) - - if event.push? - words << event.ref_type - words << event.ref_name - words << "at" - elsif event.commented? - if event.note_commit? - words << event.note_short_commit_id - else - words << "##{truncate event.note_target_iid}" - end - words << "at" - elsif event.target - words << "##{event.target_iid}:" - words << event.target.title if event.target.respond_to?(:title) - words << "at" - end - - words << event.project_name - - words.join(" ") - end - - def event_feed_url(event) - if event.issue? - namespace_project_issue_url(event.project.namespace, event.project, - event.issue) - elsif event.merge_request? - namespace_project_merge_request_url(event.project.namespace, - event.project, event.merge_request) - elsif event.note? && event.note_commit? - namespace_project_commit_url(event.project.namespace, event.project, - event.note_target) - elsif event.note? - if event.note_target - if event.note_commit? - namespace_project_commit_path(event.project.namespace, event.project, - event.note_commit_id, - anchor: dom_id(event.target)) - elsif event.note_project_snippet? - namespace_project_snippet_path(event.project.namespace, - event.project, event.note_target) - else - event_note_target_path(event) - end - end - elsif event.push? - if event.push_with_commits? && event.md_ref? - if event.commits_count > 1 - namespace_project_compare_url(event.project.namespace, event.project, - from: event.commit_from, to: - event.commit_to) - else - namespace_project_commit_url(event.project.namespace, event.project, - id: event.commit_to) - end - else - namespace_project_commits_url(event.project.namespace, event.project, - event.ref_name) - end - end - end - - def event_feed_summary(event) - if event.issue? - render "events/event_issue", issue: event.issue - elsif event.push? - render "events/event_push", event: event - elsif event.merge_request? - render "events/event_merge_request", merge_request: event.merge_request - elsif event.note? - render "events/event_note", note: event.note - end - end - - def event_note_target_path(event) - if event.note? && event.note_commit? - namespace_project_commit_path(event.project.namespace, event.project, - event.note_target) - else - polymorphic_path([event.project.namespace.becomes(Namespace), - event.project, event.note_target], - anchor: dom_id(event.target)) - end - end - - def event_note_title_html(event) - if event.note_target - if event.note_commit? - link_to( - namespace_project_commit_path(event.project.namespace, event.project, - event.note_commit_id, - anchor: dom_id(event.target)), - class: "commit_short_id" - ) do - "#{event.note_target_type} #{event.note_short_commit_id}" - end - elsif event.note_project_snippet? - link_to(namespace_project_snippet_path(event.project.namespace, - event.project, - event.note_target)) do - "#{event.note_target_type} ##{truncate event.note_target_id}" - end - else - link_to event_note_target_path(event) do - "#{event.note_target_type} ##{truncate event.note_target_iid}" - end - end - else - content_tag :strong do - "(deleted)" - end - end - end - - def event_note(text) - text = first_line_in_markdown(text, 150) - sanitize(text, tags: %w(a img b pre code p span)) - end - - def event_commit_title(message) - escape_once(truncate(message.split("\n").first, length: 70)) - rescue - "--broken encoding" - end - - def event_to_atom(xml, event) - if event.proper? - xml.entry do - event_link = event_feed_url(event) - event_title = event_feed_title(event) - event_summary = event_feed_summary(event) - - xml.id "tag:#{request.host},#{event.created_at.strftime("%Y-%m-%d")}:#{event.id}" - xml.link href: event_link - xml.title truncate(event_title, length: 80) - xml.updated event.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(event.author_email) - xml.author do |author| - xml.name event.author_name - xml.email event.author_email - end - - xml.summary(type: "xhtml") { |x| x << event_summary unless event_summary.nil? } - end - end - end -end diff --git a/app/helpers/explore_helper.rb b/app/helpers/explore_helper.rb deleted file mode 100644 index 7616fe6bad8..00000000000 --- a/app/helpers/explore_helper.rb +++ /dev/null @@ -1,17 +0,0 @@ -module ExploreHelper - def explore_projects_filter_path(options={}) - exist_opts = { - sort: params[:sort], - scope: params[:scope], - group: params[:group], - tag: params[:tag], - visibility_level: params[:visibility_level], - } - - options = exist_opts.merge(options) - - path = request.path - path << "?#{options.to_param}" - path - end -end diff --git a/app/helpers/external_wiki_helper.rb b/app/helpers/external_wiki_helper.rb deleted file mode 100644 index 838b85afdfe..00000000000 --- a/app/helpers/external_wiki_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -module ExternalWikiHelper - def get_project_wiki_path(project) - external_wiki_service = project.services. - select { |service| service.to_param == 'external_wiki' }.first - if external_wiki_service.present? && external_wiki_service.active? - external_wiki_service.properties['external_wiki_url'] - else - namespace_project_wiki_path(project.namespace, project, :home) - end - end -end diff --git a/app/helpers/git_helper.rb b/app/helpers/git_helper.rb deleted file mode 100644 index 09684955233..00000000000 --- a/app/helpers/git_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -module GitHelper - def strip_gpg_signature(text) - text.gsub(/-----BEGIN PGP SIGNATURE-----(.*)-----END PGP SIGNATURE-----/m, "") - end -end diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb deleted file mode 100644 index aa1de2f50ef..00000000000 --- a/app/helpers/gitlab_markdown_helper.rb +++ /dev/null @@ -1,275 +0,0 @@ -module GitlabMarkdownHelper - include Gitlab::Markdown - - # Use this in places where you would normally use link_to(gfm(...), ...). - # - # It solves a problem occurring with nested links (i.e. - # "outer text gfm ref more outer text"). This will not be - # interpreted as intended. Browsers will parse something like - # "outer text gfm ref more outer text" (notice the last part is - # not linked any more). link_to_gfm corrects that. It wraps all parts to - # explicitly produce the correct linking behavior (i.e. - # "outer text gfm ref more outer text"). - def link_to_gfm(body, url, html_options = {}) - return "" if body.blank? - - escaped_body = if body =~ /\A\.*?}m) do |match| - "#{match}#{link_to("", url, html_options)[0..-5]}" # "".length +1 - end - - link_to(gfm_body.html_safe, url, html_options) - end - - def markdown(text, options={}) - unless @markdown && options == @options - @options = options - - # 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, { - with_toc_data: true, - safe_links_only: true, - # Handled further down the line by HTML::Pipeline::SanitizationFilter - escape_html: false - }.merge(options)) - - # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use - @markdown = Redcarpet::Markdown.new(rend, - no_intra_emphasis: true, - tables: true, - fenced_code_blocks: true, - autolink: true, - strikethrough: true, - lax_spacing: true, - space_after_headers: true, - superscript: true - ) - end - - @markdown.render(text).html_safe - end - - # Return the first line of +text+, up to +max_chars+, after parsing the line - # as Markdown. HTML tags in the parsed output are not counted toward the - # +max_chars+ limit. If the length limit falls within a tag's contents, then - # the tag contents are truncated without removing the closing tag. - def first_line_in_markdown(text, max_chars = nil) - md = markdown(text).strip - - truncate_visible(md, max_chars || md.length) if md.present? - end - - def render_wiki_content(wiki_page) - if wiki_page.format == :markdown - markdown(wiki_page.content) - else - wiki_page.formatted_content.html_safe - end - end - - def create_relative_links(text) - paths = extract_paths(text) - - paths.uniq.each do |file_path| - # If project does not have repository - # its nothing to rebuild - # - # TODO: pass project variable to markdown helper instead of using - # instance variable. Right now it generates invalid path for pages out - # of project scope. Example: search results where can be rendered markdown - # from different projects - if @repository && @repository.exists? && !@repository.empty? - new_path = rebuild_path(file_path) - # Finds quoted path so we don't replace other mentions of the string - # eg. "doc/api" will be replaced and "/home/doc/api/text" won't - text.gsub!("\"#{file_path}\"", "\"/#{new_path}\"") - end - end - - text - end - - def extract_paths(text) - links = substitute_links(text) - image_links = substitute_image_links(text) - links + image_links - end - - def substitute_links(text) - links = text.scan(//) - relative_links = links.flatten.reject{ |link| link_to_ignore? link } - relative_links - end - - def substitute_image_links(text) - links = text.scan(/ - true - else - ignored_protocols.map{ |protocol| link.include?(protocol) }.any? - end - end - - def ignored_protocols - ["http://","https://", "ftp://", "mailto:", "smb://"] - end - - def rebuild_path(file_path) - file_path = file_path.dup - file_path.gsub!(/(#.*)/, "") - id = $1 || "" - file_path = relative_file_path(file_path) - file_path = sanitize_slashes(file_path) - - [ - Gitlab.config.gitlab.relative_url_root, - @project.path_with_namespace, - path_with_ref(file_path), - file_path - ].compact.join("/").gsub(/\A\/*|\/*\z/, '') + id - end - - def sanitize_slashes(path) - path[0] = "" if path.start_with?("/") - path.chop if path.end_with?("/") - path - end - - def relative_file_path(path) - requested_path = @path - nested_path = build_nested_path(path, requested_path) - return nested_path if file_exists?(nested_path) - path - end - - # Covering a special case, when the link is referencing file in the same directory eg: - # If we are at doc/api/README.md and the README.md contains relative links like [Users](users.md) - # this takes the request path(doc/api/README.md), and replaces the README.md with users.md so the path looks like doc/api/users.md - # If we are at doc/api and the README.md shown in below the tree view - # this takes the request path(doc/api) and adds users.md so the path looks like doc/api/users.md - def build_nested_path(path, request_path) - return request_path if path == "" - return path unless request_path - if local_path(request_path) == "tree" - base = request_path.split("/").push(path) - base.join("/") - else - base = request_path.split("/") - base.pop - base.push(path).join("/") - end - end - - # Checks if the path exists in the repo - # eg. checks if doc/README.md exists, if not then link to blob - def path_with_ref(path) - if file_exists?(path) - "#{local_path(path)}/#{correct_ref}" - else - "blob/#{correct_ref}" - end - end - - def file_exists?(path) - return false if path.nil? - @repository.blob_at(current_sha, path).present? || @repository.tree(current_sha, path).entries.any? - end - - # Check if the path is pointing to a directory(tree) or a file(blob) - # eg. doc/api is directory and doc/README.md is file - def local_path(path) - return "tree" if @repository.tree(current_sha, path).entries.any? - return "raw" if @repository.blob_at(current_sha, path).image? - "blob" - end - - def current_sha - if @commit - @commit.id - elsif @repository && !@repository.empty? - if @ref - @repository.commit(@ref).try(:sha) - else - @repository.head_commit.sha - end - end - end - - # We will assume that if no ref exists we can point to master - def correct_ref - @ref ? @ref : "master" - end - - private - - # Return +text+, truncated to +max_chars+ characters, excluding any HTML - # tags. - def truncate_visible(text, max_chars) - doc = Nokogiri::HTML.fragment(text) - content_length = 0 - truncated = false - - doc.traverse do |node| - if node.text? || node.content.empty? - if truncated - node.remove - next - end - - # Handle line breaks within a node - if node.content.strip.lines.length > 1 - node.content = "#{node.content.lines.first.chomp}..." - truncated = true - end - - num_remaining = max_chars - content_length - if node.content.length > num_remaining - node.content = node.content.truncate(num_remaining) - truncated = true - end - content_length += node.content.length - end - - truncated = truncate_if_block(node, truncated) - end - - doc.to_html - end - - # Used by #truncate_visible. If +node+ is the first block element, and the - # text hasn't already been truncated, then append "..." to the node contents - # and return true. Otherwise return false. - def truncate_if_block(node, truncated) - if node.element? && node.description.block? && !truncated - node.content = "#{node.content}..." if node.next_sibling - true - else - truncated - end - end - - def cross_project_reference(project, entity) - path = project.path_with_namespace - - if entity.kind_of?(Issue) - [path, entity.iid].join('#') - elsif entity.kind_of?(MergeRequest) - [path, entity.iid].join('!') - else - raise 'Not supported type' - end - end -end diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb deleted file mode 100644 index 9703c8d9e9c..00000000000 --- a/app/helpers/gitlab_routing_helper.rb +++ /dev/null @@ -1,55 +0,0 @@ -# Shorter routing method for project and project items -# Since update to rails 4.1.9 we are now allowed to use `/` in project routing -# so we use nested routing for project resources which include project and -# project namespace. To avoid writing long methods every time we define shortcuts for -# some of routing. -# -# For example instead of this: -# -# namespace_project_merge_request_path(merge_request.project.namespace, merge_request.projects, merge_request) -# -# We can simply use shortcut: -# -# merge_request_path(merge_request) -# -module GitlabRoutingHelper - def project_path(project, *args) - namespace_project_path(project.namespace, project, *args) - end - - def edit_project_path(project, *args) - edit_namespace_project_path(project.namespace, project, *args) - end - - def issue_path(entity, *args) - namespace_project_issue_path(entity.project.namespace, entity.project, entity, *args) - end - - def merge_request_path(entity, *args) - namespace_project_merge_request_path(entity.project.namespace, entity.project, entity, *args) - end - - def milestone_path(entity, *args) - namespace_project_milestone_path(entity.project.namespace, entity.project, entity, *args) - end - - def project_url(project, *args) - namespace_project_url(project.namespace, project, *args) - end - - def edit_project_url(project, *args) - edit_namespace_project_url(project.namespace, project, *args) - end - - def issue_url(entity, *args) - namespace_project_issue_url(entity.project.namespace, entity.project, entity, *args) - end - - def merge_request_url(entity, *args) - namespace_project_merge_request_url(entity.project.namespace, entity.project, entity, *args) - end - - def project_snippet_url(entity, *args) - namespace_project_snippet_url(entity.project.namespace, entity.project, entity, *args) - end -end diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb deleted file mode 100644 index e1dda20de85..00000000000 --- a/app/helpers/graph_helper.rb +++ /dev/null @@ -1,16 +0,0 @@ -module GraphHelper - def get_refs(repo, commit) - refs = "" - refs << commit.ref_names(repo).join(' ') - - # append note count - refs << "[#{@graph.notes[commit.id]}]" if @graph.notes[commit.id] > 0 - - refs - end - - def parents_zip_spaces(parents, parent_spaces) - ids = parents.map { |p| p.id } - ids.zip(parent_spaces) - end -end diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb deleted file mode 100644 index add0a776a63..00000000000 --- a/app/helpers/groups_helper.rb +++ /dev/null @@ -1,59 +0,0 @@ -module GroupsHelper - def remove_user_from_group_message(group, member) - if member.user - "Are you sure you want to remove \"#{member.user.name}\" from \"#{group.name}\"?" - else - "Are you sure you want to revoke the invitation for \"#{member.invite_email}\" to join \"#{group.name}\"?" - end - end - - def leave_group_message(group) - "Are you sure you want to leave \"#{group}\" group?" - end - - def should_user_see_group_roles?(user, group) - if user - user.is_admin? || group.members.exists?(user_id: user.id) - else - false - end - end - - def group_head_title - title = @group.name - - title = if current_action?(:issues) - "Issues - " + title - elsif current_action?(:merge_requests) - "Merge requests - " + title - elsif current_action?(:members) - "Members - " + title - elsif current_action?(:edit) - "Settings - " + title - else - title - end - - title - end - - def group_settings_page? - if current_controller?('groups') - current_action?('edit') || current_action?('projects') - else - false - end - end - - def group_icon(group) - if group.is_a?(String) - group = Group.find_by(path: group) - end - - if group && group.avatar.present? - group.avatar.url - else - image_path('no_group_avatar.png') - end - end -end diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb deleted file mode 100644 index a9030729b48..00000000000 --- a/app/helpers/icons_helper.rb +++ /dev/null @@ -1,83 +0,0 @@ -module IconsHelper - # Creates an icon tag given icon name(s) and possible icon modifiers. - # - # Right now this method simply delegates directly to `fa_icon` from the - # font-awesome-rails gem, but should we ever use a different icon pack in the - # future we won't have to change hundreds of method calls. - def icon(names, options = {}) - fa_icon(names, options) - end - - def spinner(text = nil, visible = false) - css_class = 'loading' - css_class << ' hide' unless visible - - content_tag :div, class: css_class do - icon('spinner spin') + text - end - end - - def boolean_to_icon(value) - if value.to_s == "true" - icon('circle', class: 'cgreen') - else - icon('power-off', class: 'clgray') - end - end - - def public_icon - icon('globe') - end - - def internal_icon - icon('shield') - end - - def private_icon - icon('lock') - end - - def file_type_icon_class(type, mode, name) - if type == 'folder' - icon_class = 'folder' - elsif mode == '120000' - icon_class = 'share' - else - # Guess which icon to choose based on file extension. - # If you think a file extension is missing, feel free to add it on PR - - case File.extname(name).downcase - when '.pdf' - icon_class = 'file-pdf-o' - when '.jpg', '.jpeg', '.jif', '.jfif', - '.jp2', '.jpx', '.j2k', '.j2c', - '.png', '.gif', '.tif', '.tiff', - '.svg', '.ico', '.bmp' - icon_class = 'file-image-o' - when '.zip', '.zipx', '.tar', '.gz', '.bz', '.bzip', - '.xz', '.rar', '.7z' - icon_class = 'file-archive-o' - when '.mp3', '.wma', '.ogg', '.oga', '.wav', '.flac', '.aac' - icon_class = 'file-audio-o' - when '.mp4', '.m4p', '.m4v', - '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv', - '.mpg', '.mpeg', '.m2v', - '.avi', '.mkv', '.flv', '.ogv', '.mov', - '.3gp', '.3g2' - icon_class = 'file-video-o' - when '.doc', '.dot', '.docx', '.docm', '.dotx', '.dotm', '.docb' - icon_class = 'file-word-o' - when '.xls', '.xlt', '.xlm', '.xlsx', '.xlsm', '.xltx', '.xltm', - '.xlsb', '.xla', '.xlam', '.xll', '.xlw' - icon_class = 'file-excel-o' - when '.ppt', '.pot', '.pps', '.pptx', '.pptm', '.potx', '.potm', - '.ppam', '.ppsx', '.ppsm', '.sldx', '.sldm' - icon_class = 'file-powerpoint-o' - else - icon_class = 'file-text-o' - end - end - - icon_class - end -end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb deleted file mode 100644 index ad4a7612724..00000000000 --- a/app/helpers/issues_helper.rb +++ /dev/null @@ -1,111 +0,0 @@ -module IssuesHelper - def issue_css_classes(issue) - classes = "issue" - classes << " closed" if issue.closed? - classes << " today" if issue.today? - classes - end - - # Returns an OpenStruct object suitable for use by options_from_collection_for_select - # to allow filtering issues by an unassigned User or Milestone - def unassigned_filter - # Milestone uses :title, Issue uses :name - OpenStruct.new(id: 0, title: 'None (backlog)', name: 'Unassigned') - end - - def url_for_project_issues(project = @project, options = {}) - return '' if project.nil? - - if options[:only_path] - project.issues_tracker.project_path - else - project.issues_tracker.project_url - end - end - - def url_for_new_issue(project = @project, options = {}) - return '' if project.nil? - - if options[:only_path] - project.issues_tracker.new_issue_path - else - project.issues_tracker.new_issue_url - end - end - - def url_for_issue(issue_iid, project = @project, options = {}) - return '' if project.nil? - - if options[:only_path] - project.issues_tracker.issue_path(issue_iid) - else - project.issues_tracker.issue_url(issue_iid) - end - end - - def title_for_issue(issue_iid, project = @project) - return '' if project.nil? - - if project.default_issues_tracker? - issue = project.issues.where(iid: issue_iid).first - return issue.title if issue - end - - '' - end - - def issue_timestamp(issue) - # Shows the created at time and the updated at time if different - ts = "#{time_ago_with_tooltip(issue.created_at, 'bottom', 'note_created_ago')}" - if issue.updated_at != issue.created_at - ts << capture_haml do - haml_tag :span do - haml_concat '·' - haml_concat icon('edit', title: 'edited') - haml_concat time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago') - end - end - end - ts.html_safe - end - - def bulk_update_milestone_options - options_for_select([['None (backlog)', -1]]) + - options_from_collection_for_select(project_active_milestones, 'id', - 'title', params[:milestone_id]) - end - - def milestone_options(object) - options_from_collection_for_select(object.project.milestones.active, - 'id', 'title', object.milestone_id) - end - - def issue_box_class(item) - if item.respond_to?(:expired?) && item.expired? - 'issue-box-expired' - elsif item.respond_to?(:merged?) && item.merged? - 'issue-box-merged' - elsif item.closed? - 'issue-box-closed' - else - 'issue-box-open' - end - end - - def issue_to_atom(xml, issue) - xml.entry do - xml.id namespace_project_issue_url(issue.project.namespace, - issue.project, issue) - xml.link href: namespace_project_issue_url(issue.project.namespace, - issue.project, issue) - xml.title truncate(issue.title, length: 80) - xml.updated issue.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, width: "40", height: "40", url: avatar_icon(issue.author_email) - xml.author do |author| - xml.name issue.author_name - xml.email issue.author_email - end - xml.summary issue.title - end - end -end diff --git a/app/helpers/labels_helper.rb b/app/helpers/labels_helper.rb deleted file mode 100644 index 32ef2e7ca84..00000000000 --- a/app/helpers/labels_helper.rb +++ /dev/null @@ -1,54 +0,0 @@ -module LabelsHelper - def project_label_names - @project.labels.pluck(:title) - end - - def render_colored_label(label) - label_color = label.color || Label::DEFAULT_COLOR - text_color = text_color_for_bg(label_color) - - content_tag :span, class: 'label color-label', style: "background-color:#{label_color};color:#{text_color}" do - label.name - end - end - - def suggested_colors - [ - '#0033CC', - '#428BCA', - '#44AD8E', - '#A8D695', - '#5CB85C', - '#69D100', - '#004E00', - '#34495E', - '#7F8C8D', - '#A295D6', - '#5843AD', - '#8E44AD', - '#FFECDB', - '#AD4363', - '#D10069', - '#CC0033', - '#FF0000', - '#D9534F', - '#D1D100', - '#F0AD4E', - '#AD8D43' - ] - end - - def text_color_for_bg(bg_color) - r, g, b = bg_color.slice(1,7).scan(/.{2}/).map(&:hex) - - if (r + g + b) > 500 - "#333" - else - "#FFF" - end - end - - def project_labels_options(project) - options_from_collection_for_select(project.labels, 'name', 'name', params[:label_name]) - end -end diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb deleted file mode 100644 index 54462fd00e3..00000000000 --- a/app/helpers/merge_requests_helper.rb +++ /dev/null @@ -1,52 +0,0 @@ -module MergeRequestsHelper - def new_mr_path_from_push_event(event) - target_project = event.project.forked_from_project || event.project - new_namespace_project_merge_request_path( - event.project.namespace, - event.project, - new_mr_from_push_event(event, target_project) - ) - end - - def new_mr_path_for_fork_from_push_event(event) - new_namespace_project_merge_request_path( - event.project.namespace, - event.project, - new_mr_from_push_event(event, event.project.forked_from_project) - ) - end - - def new_mr_from_push_event(event, target_project) - { - merge_request: { - source_project_id: event.project.id, - target_project_id: target_project.id, - source_branch: event.branch_name, - target_branch: target_project.repository.root_ref - } - } - end - - def mr_css_classes(mr) - classes = "merge-request" - classes << " closed" if mr.closed? - classes << " merged" if mr.merged? - classes - end - - def ci_build_details_path(merge_request) - merge_request.source_project.ci_service.build_page(merge_request.last_commit.sha, merge_request.source_branch) - end - - def merge_path_description(merge_request, separator) - if merge_request.for_fork? - "Project:Branches: #{@merge_request.source_project_path}:#{@merge_request.source_branch} #{separator} #{@merge_request.target_project.path_with_namespace}:#{@merge_request.target_branch}" - else - "Branches: #{@merge_request.source_branch} #{separator} #{@merge_request.target_branch}" - end - end - - def issues_sentence(issues) - issues.map { |i| "##{i.iid}" }.to_sentence - end -end diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb deleted file mode 100644 index 282bdf744d2..00000000000 --- a/app/helpers/milestones_helper.rb +++ /dev/null @@ -1,33 +0,0 @@ -module MilestonesHelper - def milestones_filter_path(opts = {}) - if @project - namespace_project_milestones_path(@project.namespace, @project, opts) - elsif @group - group_milestones_path(@group, opts) - else - dashboard_milestones_path(opts) - end - end - - def milestone_progress_bar(milestone) - options = { - class: 'progress-bar progress-bar-success', - style: "width: #{milestone.percent_complete}%;" - } - - content_tag :div, class: 'progress' do - content_tag :div, nil, options - end - end - - def projects_milestones_options - milestones = - if @project - @project.milestones - else - Milestone.where(project_id: @projects) - end.active - - options_from_collection_for_select(milestones, 'id', 'title', params[:milestone_id]) - end -end diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb deleted file mode 100644 index b3132a1f3ba..00000000000 --- a/app/helpers/namespaces_helper.rb +++ /dev/null @@ -1,36 +0,0 @@ -module NamespacesHelper - def namespaces_options(selected = :current_user, scope = :default) - groups = current_user.owned_groups + current_user.masters_groups - users = [current_user.namespace] - - group_opts = ["Groups", groups.sort_by(&:human_name).map {|g| [g.human_name, g.id]} ] - users_opts = [ "Users", users.sort_by(&:human_name).map {|u| [u.human_name, u.id]} ] - - options = [] - options << group_opts - options << users_opts - - if selected == :current_user && current_user.namespace - selected = current_user.namespace.id - end - - grouped_options_for_select(options, selected) - end - - def namespace_select_tag(id, opts = {}) - css_class = "ajax-namespace-select " - css_class << "multiselect " if opts[:multiple] - css_class << (opts[:class] || '') - value = opts[:selected] || '' - - hidden_field_tag(id, value, class: css_class) - end - - def namespace_icon(namespace, size = 40) - if namespace.kind_of?(Group) - group_icon(namespace) - else - avatar_icon(namespace.owner.email, size) - end - end -end diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb deleted file mode 100644 index 2b03269800e..00000000000 --- a/app/helpers/nav_helper.rb +++ /dev/null @@ -1,5 +0,0 @@ -module NavHelper - def nav_menu_collapsed? - cookies[:collapsed_nav] == 'true' - end -end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb deleted file mode 100644 index ab44fa6ee43..00000000000 --- a/app/helpers/notes_helper.rb +++ /dev/null @@ -1,85 +0,0 @@ -module NotesHelper - # Helps to distinguish e.g. commit notes in mr notes list - def note_for_main_target?(note) - (@noteable.class.name == note.noteable_type && !note.for_diff_line?) - end - - def note_target_fields(note) - hidden_field_tag(:target_type, note.noteable.class.name.underscore) + - hidden_field_tag(:target_id, note.noteable.id) - end - - def link_to_commit_diff_line_note(note) - if note.for_commit_diff_line? - link_to( - "#{note.diff_file_name}:L#{note.diff_new_line}", - namespace_project_commit_path(@project.namespace, @project, - note.noteable, anchor: note.line_code) - ) - end - end - - def note_timestamp(note) - # Shows the created at time and the updated at time if different - ts = "#{time_ago_with_tooltip(note.created_at, 'bottom', 'note_created_ago')}" - if note.updated_at != note.created_at - ts << capture_haml do - haml_tag :span do - haml_concat '·' - haml_concat icon('edit', title: 'edited') - haml_concat time_ago_with_tooltip(note.updated_at, 'bottom', 'note_edited_ago') - end - end - end - ts.html_safe - end - - def noteable_json(noteable) - { - id: noteable.id, - class: noteable.class.name, - resources: noteable.class.table_name, - project_id: noteable.project.id, - }.to_json - end - - def link_to_new_diff_note(line_code) - discussion_id = Note.build_discussion_id( - @comments_target[:noteable_type], - @comments_target[:noteable_id] || @comments_target[:commit_id], - line_code - ) - - data = { - noteable_type: @comments_target[:noteable_type], - noteable_id: @comments_target[:noteable_id], - commit_id: @comments_target[:commit_id], - line_code: line_code, - discussion_id: discussion_id - } - - button_tag(class: 'btn add-diff-note js-add-diff-note-button', - data: data, - title: 'Add a comment to this line') do - icon('comment-o') - end - end - - def link_to_reply_diff(note) - return unless current_user - - data = { - noteable_type: note.noteable_type, - noteable_id: note.noteable_id, - commit_id: note.commit_id, - line_code: note.line_code, - discussion_id: note.discussion_id - } - - button_tag class: 'btn reply-btn js-discussion-reply-button', - data: data, title: 'Add a reply' do - link_text = icon('comment') - link_text << ' Reply' - end - end -end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb deleted file mode 100644 index f771fe761ef..00000000000 --- a/app/helpers/notifications_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -module NotificationsHelper - def notification_icon(notification) - if notification.disabled? - icon('volume-off', class: 'ns-mute') - elsif notification.participating? - icon('volume-down', class: 'ns-part') - elsif notification.watch? - icon('volume-up', class: 'ns-watch') - else - icon('circle-o', class: 'ns-default') - end - end -end diff --git a/app/helpers/oauth_helper.rb b/app/helpers/oauth_helper.rb deleted file mode 100644 index 997b91de077..00000000000 --- a/app/helpers/oauth_helper.rb +++ /dev/null @@ -1,34 +0,0 @@ -module OauthHelper - def ldap_enabled? - Gitlab.config.ldap.enabled - end - - def default_providers - [:twitter, :github, :gitlab, :bitbucket, :google_oauth2, :ldap] - end - - def enabled_oauth_providers - Devise.omniauth_providers - end - - def enabled_social_providers - enabled_oauth_providers.select do |name| - [:twitter, :gitlab, :github, :bitbucket, :google_oauth2].include?(name.to_sym) - end - end - - def additional_providers - enabled_oauth_providers.reject{|provider| provider.to_s.starts_with?('ldap')} - end - - def oauth_image_tag(provider, size = 64) - file_name = "#{provider.to_s.split('_').first}_#{size}.png" - image_tag(image_path("authbuttons/#{file_name}"), alt: "Sign in with #{provider.to_s.titleize}") - end - - def oauth_active?(provider) - current_user.identities.exists?(provider: provider.to_s) - end - - extend self -end diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb deleted file mode 100644 index 780c7cd5133..00000000000 --- a/app/helpers/profile_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -module ProfileHelper - def show_profile_username_tab? - current_user.can_change_username? - end - - def show_profile_social_tab? - enabled_social_providers.any? - end - - def show_profile_remove_tab? - signup_enabled? - end -end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb deleted file mode 100644 index c2a7732e6f0..00000000000 --- a/app/helpers/projects_helper.rb +++ /dev/null @@ -1,329 +0,0 @@ -module ProjectsHelper - def remove_from_project_team_message(project, member) - if member.user - "You are going to remove #{member.user.name} from #{project.name} project team. Are you sure?" - else - "You are going to revoke the invitation for #{member.invite_email} to join #{project.name} project team. Are you sure?" - end - end - - def link_to_project(project) - link_to [project.namespace.becomes(Namespace), project] do - title = content_tag(:span, project.name, class: 'project-name') - - if project.namespace - namespace = content_tag(:span, "#{project.namespace.human_name} / ", class: 'namespace-name') - title = namespace + title - end - - title - end - end - - def link_to_member(project, author, opts = {}) - default_opts = { avatar: true, name: true, size: 16 } - opts = default_opts.merge(opts) - - return "(deleted)" unless author - - author_html = "" - - # Build avatar image tag - author_html << image_tag(avatar_icon(author.try(:email), opts[:size]), width: opts[:size], class: "avatar avatar-inline #{"s#{opts[:size]}" if opts[:size]}", alt:'') if opts[:avatar] - - # Build name span tag - author_html << content_tag(:span, sanitize(author.name), class: 'author') if opts[:name] - - author_html = author_html.html_safe - - if opts[:name] - link_to(author_html, user_path(author), class: "author_link").html_safe - else - link_to(author_html, user_path(author), class: "author_link has_tooltip", data: { :'original-title' => sanitize(author.name) } ).html_safe - 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)) - end - end - end - - def remove_project_message(project) - "You are going to remove #{project.name_with_namespace}.\n Removed project CANNOT be restored!\n Are you ABSOLUTELY sure?" - end - - def transfer_project_message(project) - "You are going to transfer #{project.name_with_namespace} to another owner. Are you ABSOLUTELY sure?" - end - - def project_nav_tabs - @nav_tabs ||= get_project_nav_tabs(@project, current_user) - end - - def project_nav_tab?(name) - project_nav_tabs.include? name - end - - def project_active_milestones - @project.milestones.active.order("due_date, title ASC") - end - - def link_to_toggle_star(title, starred) - cls = 'star-btn btn btn-sm btn-default' - - toggle_text = - if starred - ' Unstar' - else - ' Star' - end - - toggle_html = content_tag('span', class: 'toggle') do - icon('star') + toggle_text - end - - count_html = content_tag('span', class: 'count') do - @project.star_count.to_s - end - - link_opts = { - title: title, - class: cls, - method: :post, - remote: true, - data: { type: 'json' } - } - - path = toggle_star_namespace_project_path(@project.namespace, @project) - - content_tag 'span', class: starred ? 'turn-on' : 'turn-off' do - link_to(path, link_opts) do - toggle_html + ' ' + count_html - end - end - end - - def link_to_toggle_fork - html = content_tag('span') do - icon('code-fork') + ' Fork' - end - - count_html = content_tag(:span, class: 'count') do - @project.forks_count.to_s - end - - html + count_html - end - - def project_for_deploy_key(deploy_key) - if deploy_key.projects.include?(@project) - @project - else - deploy_key.projects.find { |project| can?(current_user, :read_project, project) } - end - end - - private - - def get_project_nav_tabs(project, current_user) - nav_tabs = [:home] - - if !project.empty_repo? && can?(current_user, :download_code, project) - nav_tabs << [:files, :commits, :network, :graphs] - end - - if project.repo_exists? && project.merge_requests_enabled - nav_tabs << :merge_requests - end - - if can?(current_user, :admin_project, project) - nav_tabs << :settings - end - - [:issues, :wiki, :snippets].each do |feature| - nav_tabs << feature if project.send :"#{feature}_enabled" - end - - if project.issues_enabled || project.merge_requests_enabled - nav_tabs << [:milestones, :labels] - end - - nav_tabs.flatten - end - - def git_user_name - if current_user - current_user.name - else - "Your name" - end - end - - def git_user_email - if current_user - current_user.email - else - "your@email.com" - end - end - - def repository_size(project = nil) - "#{(project || @project).repository_size} MB" - rescue - # In order to prevent 500 error - # when application cannot allocate memory - # to calculate repo size - just show 'Unknown' - 'unknown' - end - - def project_head_title - title = @project.name_with_namespace - - title = if current_controller?(:tree) - "#{@project.path}\/#{@path} at #{@ref} - " + title - elsif current_controller?(:issues) - if current_action?(:show) - "Issue ##{@issue.iid} - #{@issue.title} - " + title - else - "Issues - " + title - end - elsif current_controller?(:blob) - if current_action?(:new) || current_action?(:create) - "New file at #{@ref}" - elsif current_action?(:show) - "#{@blob.path} at #{@ref}" - elsif @blob - "Edit file #{@blob.path} at #{@ref}" - end - elsif current_controller?(:commits) - "Commits at #{@ref} - " + title - elsif current_controller?(:merge_requests) - if current_action?(:show) - "Merge request ##{@merge_request.iid} - " + title - else - "Merge requests - " + title - end - elsif current_controller?(:wikis) - "Wiki - " + title - elsif current_controller?(:network) - "Network graph - " + title - elsif current_controller?(:graphs) - "Graphs - " + title - else - title - end - - title - end - - def default_url_to_repo(project = nil) - project = project || @project - current_user ? project.url_to_repo : project.http_url_to_repo - end - - def default_clone_protocol - current_user ? "ssh" : "http" - end - - def project_last_activity(project) - if project.last_activity_at - time_ago_with_tooltip(project.last_activity_at, 'bottom', 'last_activity_time_ago') - else - "Never" - end - end - - def contribution_guide_url(project) - if project && contribution_guide = project.repository.contribution_guide - namespace_project_blob_path( - project.namespace, - project, - tree_join(project.default_branch, - contribution_guide.name) - ) - end - end - - def changelog_url(project) - if project && changelog = project.repository.changelog - namespace_project_blob_path( - project.namespace, - project, - tree_join(project.default_branch, - changelog.name) - ) - end - end - - def license_url(project) - if project && license = project.repository.license - namespace_project_blob_path( - project.namespace, - project, - tree_join(project.default_branch, - license.name) - ) - end - end - - def version_url(project) - if project && version = project.repository.version - namespace_project_blob_path( - project.namespace, - project, - tree_join(project.default_branch, - version.name) - ) - end - end - - def hidden_pass_url(original_url) - result = URI(original_url) - result.password = '*****' unless result.password.nil? - result - rescue - original_url - end - - def project_wiki_path_with_version(proj, page, version, is_newest) - url_params = is_newest ? {} : { version_id: version } - namespace_project_wiki_path(proj.namespace, proj, page, url_params) - end - - def project_status_css_class(status) - case status - when "started" - "active" - when "failed" - "danger" - when "finished" - "success" - end - end - - def service_field_value(type, value) - return value unless type == 'password' - - if value.present? - "***********" - else - nil - end - end -end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb deleted file mode 100644 index c31a556ff7b..00000000000 --- a/app/helpers/search_helper.rb +++ /dev/null @@ -1,112 +0,0 @@ -module SearchHelper - def search_autocomplete_opts(term) - return unless current_user - - resources_results = [ - groups_autocomplete(term), - projects_autocomplete(term) - ].flatten - - generic_results = project_autocomplete + default_autocomplete + help_autocomplete - generic_results.select! { |result| result[:label] =~ Regexp.new(term, "i") } - - [ - resources_results, - generic_results - ].flatten.uniq do |item| - item[:label] - end - end - - private - - # Autocomplete results for various settings pages - def default_autocomplete - [ - { label: "Profile settings", url: profile_path }, - { label: "SSH Keys", url: profile_keys_path }, - { label: "Dashboard", url: root_path }, - { label: "Admin Section", url: admin_root_path }, - ] - end - - # Autocomplete results for internal help pages - def help_autocomplete - [ - { label: "help: API Help", url: help_page_path("api", "README") }, - { label: "help: Markdown Help", url: help_page_path("markdown", "markdown") }, - { label: "help: Permissions Help", url: help_page_path("permissions", "permissions") }, - { label: "help: Public Access Help", url: help_page_path("public_access", "public_access") }, - { label: "help: Rake Tasks Help", url: help_page_path("raketasks", "README") }, - { label: "help: SSH Keys Help", url: help_page_path("ssh", "README") }, - { label: "help: System Hooks Help", url: help_page_path("system_hooks", "system_hooks") }, - { label: "help: Web Hooks Help", url: help_page_path("web_hooks", "web_hooks") }, - { label: "help: Workflow Help", url: help_page_path("workflow", "README") }, - ] - end - - # Autocomplete results for the current project, if it's defined - def project_autocomplete - if @project && @project.repository.exists? && @project.repository.root_ref - prefix = search_result_sanitize(@project.name_with_namespace) - ref = @ref || @project.repository.root_ref - - [ - { label: "#{prefix} - Files", url: namespace_project_tree_path(@project.namespace, @project, ref) }, - { label: "#{prefix} - Commits", url: namespace_project_commits_path(@project.namespace, @project, ref) }, - { label: "#{prefix} - Network", url: namespace_project_network_path(@project.namespace, @project, ref) }, - { label: "#{prefix} - Graph", url: namespace_project_graph_path(@project.namespace, @project, ref) }, - { label: "#{prefix} - Issues", url: namespace_project_issues_path(@project.namespace, @project) }, - { label: "#{prefix} - Merge Requests", url: namespace_project_merge_requests_path(@project.namespace, @project) }, - { label: "#{prefix} - Milestones", url: namespace_project_milestones_path(@project.namespace, @project) }, - { label: "#{prefix} - Snippets", url: namespace_project_snippets_path(@project.namespace, @project) }, - { label: "#{prefix} - Members", url: namespace_project_project_members_path(@project.namespace, @project) }, - { label: "#{prefix} - Wiki", url: namespace_project_wikis_path(@project.namespace, @project) }, - ] - else - [] - end - end - - # Autocomplete results for the current user's groups - def groups_autocomplete(term, limit = 5) - current_user.authorized_groups.search(term).limit(limit).map do |group| - { - label: "group: #{search_result_sanitize(group.name)}", - url: group_path(group) - } - end - end - - # Autocomplete results for the current user's projects - def projects_autocomplete(term, limit = 5) - ProjectsFinder.new.execute(current_user).search_by_title(term). - sorted_by_stars.non_archived.limit(limit).map do |p| - { - label: "project: #{search_result_sanitize(p.name_with_namespace)}", - url: namespace_project_path(p.namespace, p) - } - end - end - - def search_result_sanitize(str) - Sanitize.clean(str) - end - - def search_filter_path(options={}) - exist_opts = { - search: params[:search], - project_id: params[:project_id], - group_id: params[:group_id], - scope: params[:scope] - } - - options = exist_opts.merge(options) - search_path(options) - end - - # Sanitize html generated after parsing markdown from issue description or comment - def search_md_sanitize(html) - sanitize(html, tags: %w(a p ol ul li pre code)) - end -end diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb deleted file mode 100644 index bec8f2f1aa7..00000000000 --- a/app/helpers/selects_helper.rb +++ /dev/null @@ -1,42 +0,0 @@ -module SelectsHelper - def users_select_tag(id, opts = {}) - css_class = "ajax-users-select " - css_class << "multiselect " if opts[:multiple] - css_class << (opts[:class] || '') - value = opts[:selected] || '' - placeholder = opts[:placeholder] || 'Search for a user' - - null_user = opts[:null_user] || false - any_user = opts[:any_user] || false - email_user = opts[:email_user] || false - first_user = opts[:first_user] && current_user ? current_user.username : false - - html = { - class: css_class, - 'data-placeholder' => placeholder, - 'data-null-user' => null_user, - 'data-any-user' => any_user, - 'data-email-user' => email_user, - 'data-first-user' => first_user - } - - unless opts[:scope] == :all - if @project - html['data-project-id'] = @project.id - elsif @group - html['data-group-id'] = @group.id - end - end - - hidden_field_tag(id, value, html) - end - - def groups_select_tag(id, opts = {}) - css_class = "ajax-groups-select " - css_class << "multiselect " if opts[:multiple] - css_class << (opts[:class] || '') - value = opts[:selected] || '' - - hidden_field_tag(id, value, class: css_class) - end -end diff --git a/app/helpers/snippets_helper.rb b/app/helpers/snippets_helper.rb deleted file mode 100644 index 906cb12cd48..00000000000 --- a/app/helpers/snippets_helper.rb +++ /dev/null @@ -1,20 +0,0 @@ -module SnippetsHelper - def lifetime_select_options - options = [ - ['forever', nil], - ['1 day', "#{Date.current + 1.day}"], - ['1 week', "#{Date.current + 1.week}"], - ['1 month', "#{Date.current + 1.month}"] - ] - options_for_select(options) - end - - def reliable_snippet_path(snippet) - if snippet.project_id? - namespace_project_snippet_path(snippet.project.namespace, - snippet.project, snippet) - else - snippet_path(snippet) - end - end -end diff --git a/app/helpers/sorting_helper.rb b/app/helpers/sorting_helper.rb deleted file mode 100644 index bb12d43f397..00000000000 --- a/app/helpers/sorting_helper.rb +++ /dev/null @@ -1,96 +0,0 @@ -module SortingHelper - def sort_options_hash - { - sort_value_name => sort_title_name, - sort_value_recently_updated => sort_title_recently_updated, - sort_value_oldest_updated => sort_title_oldest_updated, - sort_value_recently_created => sort_title_recently_created, - sort_value_oldest_created => sort_title_oldest_created, - sort_value_milestone_soon => sort_title_milestone_soon, - sort_value_milestone_later => sort_title_milestone_later, - sort_value_largest_repo => sort_title_largest_repo, - sort_value_recently_signin => sort_title_recently_signin, - sort_value_oldest_signin => sort_title_oldest_signin, - } - end - - def sort_title_oldest_updated - 'Oldest updated' - end - - def sort_title_recently_updated - 'Recently updated' - end - - def sort_title_oldest_created - 'Oldest created' - end - - def sort_title_recently_created - 'Recently created' - end - - def sort_title_milestone_soon - 'Milestone due soon' - end - - def sort_title_milestone_later - 'Milestone due later' - end - - def sort_title_name - 'Name' - end - - def sort_title_largest_repo - 'Largest repository' - end - - def sort_title_recently_signin - 'Recent sign in' - end - - def sort_title_oldest_signin - 'Oldest sign in' - end - - def sort_value_oldest_updated - 'updated_asc' - end - - def sort_value_recently_updated - 'updated_desc' - end - - def sort_value_oldest_created - 'created_asc' - end - - def sort_value_recently_created - 'created_desc' - end - - def sort_value_milestone_soon - 'milestone_due_asc' - end - - def sort_value_milestone_later - 'milestone_due_desc' - end - - def sort_value_name - 'name_asc' - end - - def sort_value_largest_repo - 'repository_size_desc' - end - - def sort_value_recently_signin - 'recent_sign_in' - end - - def sort_value_oldest_signin - 'oldest_sign_in' - end -end diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb deleted file mode 100644 index 9954617c762..00000000000 --- a/app/helpers/submodule_helper.rb +++ /dev/null @@ -1,74 +0,0 @@ -module SubmoduleHelper - include Gitlab::ShellAdapter - - # links to files listing for submodule if submodule is a project on this server - def submodule_links(submodule_item, ref = nil) - url = @repository.submodule_url_for(ref, submodule_item.path) - - return url, nil unless url =~ /([^\/:]+)\/([^\/]+\.git)\Z/ - - namespace = $1 - project = $2 - project.chomp!('.git') - - if self_url?(url, namespace, project) - return namespace_project_path(namespace, project), - namespace_project_tree_path(namespace, project, - submodule_item.id) - elsif relative_self_url?(url) - relative_self_links(url, submodule_item.id) - elsif github_dot_com_url?(url) - standard_links('github.com', namespace, project, submodule_item.id) - elsif gitlab_dot_com_url?(url) - standard_links('gitlab.com', namespace, project, submodule_item.id) - else - return url, nil - end - end - - protected - - def github_dot_com_url?(url) - url =~ /github\.com[\/:][^\/]+\/[^\/]+\Z/ - end - - def gitlab_dot_com_url?(url) - url =~ /gitlab\.com[\/:][^\/]+\/[^\/]+\Z/ - end - - def self_url?(url, namespace, project) - return true if url == [ Gitlab.config.gitlab.url, '/', namespace, '/', - project, '.git' ].join('') - url == gitlab_shell.url_to_repo([namespace, '/', project].join('')) - end - - def relative_self_url?(url) - # (./)?(../repo.git) || (./)?(../../project/repo.git) ) - url =~ /\A((\.\/)?(\.\.\/))(?!(\.\.)|(.*\/)).*\.git\z/ || url =~ /\A((\.\/)?(\.\.\/){2})(?!(\.\.))([^\/]*)\/(?!(\.\.)|(.*\/)).*\.git\z/ - end - - def standard_links(host, namespace, project, commit) - base = [ 'https://', host, '/', namespace, '/', project ].join('') - [base, [ base, '/tree/', commit ].join('')] - end - - def relative_self_links(url, commit) - # Map relative links to a namespace and project - # For example: - # ../bar.git -> same namespace, repo bar - # ../foo/bar.git -> namespace foo, repo bar - # ../../foo/bar/baz.git -> namespace bar, repo baz - components = url.split('/') - base = components.pop.gsub(/.git$/, '') - namespace = components.pop.gsub(/^\.\.$/, '') - - if namespace.empty? - namespace = @project.group.path - end - - [ - namespace_project_path(namespace, base), - namespace_project_tree_path(namespace, base, commit) - ] - end -end diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb deleted file mode 100644 index a1d263d9d3a..00000000000 --- a/app/helpers/tab_helper.rb +++ /dev/null @@ -1,123 +0,0 @@ -module TabHelper - # Navigation link helper - # - # Returns an `li` element with an 'active' class if the supplied - # controller(s) and/or action(s) are currently active. The content of the - # element is the value passed to the block. - # - # options - The options hash used to determine if the element is "active" (default: {}) - # :controller - One or more controller names to check (optional). - # :action - One or more action names to check (optional). - # :path - A shorthand path, such as 'dashboard#index', to check (optional). - # :html_options - Extra options to be passed to the list element (optional). - # block - An optional block that will become the contents of the returned - # `li` element. - # - # When both :controller and :action are specified, BOTH must match in order - # to be marked as active. When only one is given, either can match. - # - # Examples - # - # # Assuming we're on TreeController#show - # - # # Controller matches, but action doesn't - # nav_link(controller: [:tree, :refs], action: :edit) { "Hello" } - # # => '
  • Hello
  • ' - # - # # Controller matches - # nav_link(controller: [:tree, :refs]) { "Hello" } - # # => '
  • Hello
  • ' - # - # # Several paths - # nav_link(path: ['tree#show', 'profile#show']) { "Hello" } - # # => '
  • Hello
  • ' - # - # # Shorthand path - # nav_link(path: 'tree#show') { "Hello" } - # # => '
  • Hello
  • ' - # - # # Supplying custom options for the list element - # nav_link(controller: :tree, html_options: {class: 'home'}) { "Hello" } - # # => '
  • Hello
  • ' - # - # Returns a list item element String - def nav_link(options = {}, &block) - klass = active_nav_link?(options) ? 'active' : '' - - # Add our custom class into the html_options, which may or may not exist - # and which may or may not already have a :class key - o = options.delete(:html_options) || {} - o[:class] ||= '' - o[:class] += ' ' + klass - o[:class].strip! - - if block_given? - content_tag(:li, capture(&block), o) - else - content_tag(:li, nil, o) - end - end - - def active_nav_link?(options) - if path = options.delete(:path) - unless path.respond_to?(:each) - path = [path] - end - - path.any? do |single_path| - current_path?(single_path) - end - else - c = options.delete(:controller) - a = options.delete(:action) - - if c && a - # When given both options, make sure BOTH are true - current_controller?(*c) && current_action?(*a) - else - # Otherwise check EITHER option - current_controller?(*c) || current_action?(*a) - end - end - end - - def current_path?(path) - c, a, _ = path.split('#') - current_controller?(c) && current_action?(a) - end - - def project_tab_class - return "active" if current_page?(controller: "/projects", action: :edit, id: @project) - - if ['services', 'hooks', 'deploy_keys', 'project_members', 'protected_branches'].include? controller.controller_name - "active" - end - end - - def branches_tab_class - if current_controller?(:protected_branches) || - current_controller?(:branches) || - current_page?(namespace_project_repository_path(@project.namespace, - @project)) - 'active' - end - end - - # Use nav_tab for save controller/action but different params - def nav_tab(key, value, &block) - o = {} - o[:class] = "" - - if value.nil? - o[:class] << " active" if params[key].blank? - else - o[:class] << " active" if params[key] == value - end - - if block_given? - content_tag(:li, capture(&block), o) - else - content_tag(:li, nil, o) - end - end -end diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb deleted file mode 100644 index fb85544df2d..00000000000 --- a/app/helpers/tags_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -module TagsHelper - def tag_path(tag) - "/tags/#{tag}" - end - - def tag_list(project) - html = '' - project.tag_list.each do |tag| - html << link_to(tag, tag_path(tag)) - end - - html.html_safe - end -end diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb deleted file mode 100644 index 6dd9b6f017c..00000000000 --- a/app/helpers/tree_helper.rb +++ /dev/null @@ -1,94 +0,0 @@ -module TreeHelper - # Sorts a repository's tree so that folders are before files and renders - # their corresponding partials - # - # contents - A Grit::Tree object for the current tree - def render_tree(tree) - # Render Folders before Files/Submodules - folders, files, submodules = tree.trees, tree.blobs, tree.submodules - - tree = "" - - # Render folders if we have any - tree << render(partial: 'projects/tree/tree_item', collection: folders, - locals: { type: 'folder' }) if folders.present? - - # Render files if we have any - tree << render(partial: 'projects/tree/blob_item', collection: files, - locals: { type: 'file' }) if files.present? - - # Render submodules if we have any - tree << render(partial: 'projects/tree/submodule_item', - collection: submodules) if submodules.present? - - tree.html_safe - end - - def render_readme(readme) - if gitlab_markdown?(readme.name) - preserve(markdown(readme.data)) - elsif markup?(readme.name) - render_markup(readme.name, readme.data) - else - simple_format(readme.data) - end - end - - # Return an image icon depending on the file type and mode - # - # type - String type of the tree item; either 'folder' or 'file' - # mode - File unix mode - # name - File name - def tree_icon(type, mode, name) - icon("#{file_type_icon_class(type, mode, name)} fw") - end - - def tree_hex_class(content) - "file_#{hexdigest(content.name)}" - end - - # Simple shortcut to File.join - def tree_join(*args) - File.join(*args) - end - - def allowed_tree_edit?(project = nil, ref = nil) - project ||= @project - ref ||= @ref - return false unless project.repository.branch_names.include?(ref) - - ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(ref) - end - - def tree_breadcrumbs(tree, max_links = 2) - if @path.present? - part_path = "" - parts = @path.split('/') - - yield('..', nil) if parts.count > max_links - - parts.each do |part| - part_path = File.join(part_path, part) unless part_path.empty? - part_path = part if part_path.empty? - - next unless parts.last(2).include?(part) if parts.count > max_links - yield(part, tree_join(@ref, part_path)) - end - end - end - - def up_dir_path - file = File.join(@path, "..") - tree_join(@ref, file) - end - - # returns the relative path of the first subdir that doesn't have only one directory descendant - def flatten_tree(tree) - subtree = Gitlab::Git::Tree.where(@repository, @commit.id, tree.path) - if subtree.count == 1 && subtree.first.dir? - return tree_join(tree.name, flatten_tree(subtree.first)) - else - return tree.name - end - end -end diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb deleted file mode 100644 index 0d573e72a80..00000000000 --- a/app/helpers/visibility_level_helper.rb +++ /dev/null @@ -1,67 +0,0 @@ -module VisibilityLevelHelper - def visibility_level_color(level) - case level - when Gitlab::VisibilityLevel::PRIVATE - 'vs-private' - when Gitlab::VisibilityLevel::INTERNAL - 'vs-internal' - when Gitlab::VisibilityLevel::PUBLIC - 'vs-public' - end - end - - def visibility_level_description(level) - capture_haml do - haml_tag :span do - case level - when Gitlab::VisibilityLevel::PRIVATE - haml_concat "Project access must be granted explicitly for each user." - when Gitlab::VisibilityLevel::INTERNAL - haml_concat "The project can be cloned by" - haml_concat "any logged in user." - when Gitlab::VisibilityLevel::PUBLIC - haml_concat "The project can be cloned" - haml_concat "without any" - haml_concat "authentication." - end - end - end - end - - def snippet_visibility_level_description(level) - capture_haml do - haml_tag :span do - case level - when Gitlab::VisibilityLevel::PRIVATE - haml_concat "The snippet is visible only for me" - when Gitlab::VisibilityLevel::INTERNAL - haml_concat "The snippet is visible for any logged in user." - when Gitlab::VisibilityLevel::PUBLIC - haml_concat "The snippet can be accessed" - haml_concat "without any" - haml_concat "authentication." - end - end - end - end - - def visibility_level_icon(level) - case level - when Gitlab::VisibilityLevel::PRIVATE - private_icon - when Gitlab::VisibilityLevel::INTERNAL - internal_icon - when Gitlab::VisibilityLevel::PUBLIC - public_icon - end - end - - def visibility_level_label(level) - Project.visibility_levels.key(level) - end - - def restricted_visibility_levels(show_all = false) - return [] if current_user.is_admin? && !show_all - current_application_settings.restricted_visibility_levels || [] - end -end diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb deleted file mode 100644 index a3bc64c010e..00000000000 --- a/app/helpers/wiki_helper.rb +++ /dev/null @@ -1,22 +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 - 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/.gitkeep b/app/mailers/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/app/mailers/emails/groups.rb b/app/mailers/emails/groups.rb deleted file mode 100644 index 1c43f95dc8c..00000000000 --- a/app/mailers/emails/groups.rb +++ /dev/null @@ -1,52 +0,0 @@ -module Emails - module Groups - def group_access_granted_email(group_member_id) - @group_member = GroupMember.find(group_member_id) - @group = @group_member.group - - @target_url = group_url(@group) - @current_user = @group_member.user - - mail(to: @group_member.user.notification_email, - subject: subject("Access to group was granted")) - end - - def group_member_invited_email(group_member_id, token) - @group_member = GroupMember.find group_member_id - @group = @group_member.group - @token = token - - @target_url = group_url(@group) - @current_user = @group_member.user - - mail(to: @group_member.invite_email, - subject: "Invitation to join group #{@group.name}") - end - - def group_invite_accepted_email(group_member_id) - @group_member = GroupMember.find group_member_id - return if @group_member.created_by.nil? - - @group = @group_member.group - - @target_url = group_url(@group) - @current_user = @group_member.created_by - - mail(to: @group_member.created_by.notification_email, - subject: subject("Invitation accepted")) - end - - def group_invite_declined_email(group_id, invite_email, access_level, created_by_id) - return if created_by_id.nil? - - @group = Group.find(group_id) - @current_user = @created_by = User.find(created_by_id) - @access_level = access_level - @invite_email = invite_email - - @target_url = group_url(@group) - mail(to: @created_by.notification_email, - subject: subject("Invitation declined")) - end - end -end diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb deleted file mode 100644 index 687bac3aa31..00000000000 --- a/app/mailers/emails/issues.rb +++ /dev/null @@ -1,47 +0,0 @@ -module Emails - module Issues - def new_issue_email(recipient_id, issue_id) - @issue = Issue.find(issue_id) - @project = @issue.project - @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) - mail_new_thread(@issue, - from: sender(@issue.author_id), - to: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) - end - - def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id) - @issue = Issue.find(issue_id) - @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id - @project = @issue.project - @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) - end - - def closed_issue_email(recipient_id, issue_id, updated_by_user_id) - @issue = Issue.find issue_id - @project = @issue.project - @updated_by = User.find updated_by_user_id - @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) - end - - def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id) - @issue = Issue.find issue_id - @issue_status = status - @project = @issue.project - @updated_by = User.find updated_by_user_id - @target_url = namespace_project_issue_url(@project.namespace, @project, @issue) - mail_answer_thread(@issue, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) - end - end -end diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb deleted file mode 100644 index 512a8f7ea6b..00000000000 --- a/app/mailers/emails/merge_requests.rb +++ /dev/null @@ -1,109 +0,0 @@ -module Emails - module MergeRequests - def new_merge_request_email(recipient_id, merge_request_id) - @merge_request = MergeRequest.find(merge_request_id) - @project = @merge_request.project - @target_url = namespace_project_merge_request_url(@project.namespace, - @project, - @merge_request) - mail_new_thread(@merge_request, - from: sender(@merge_request.author_id), - to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) - end - - def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id) - @merge_request = MergeRequest.find(merge_request_id) - @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id - @project = @merge_request.project - @target_url = namespace_project_merge_request_url(@project.namespace, - @project, - @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) - end - - def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) - @merge_request = MergeRequest.find(merge_request_id) - @updated_by = User.find updated_by_user_id - @project = @merge_request.project - @target_url = namespace_project_merge_request_url(@project.namespace, - @project, - @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) - end - - def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id) - @merge_request = MergeRequest.find(merge_request_id) - @project = @merge_request.project - @target_url = namespace_project_merge_request_url(@project.namespace, - @project, - @merge_request) - mail_answer_thread(@merge_request, - from: sender(updated_by_user_id), - to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) - end - - def merge_request_status_email(recipient_id, merge_request_id, status, updated_by_user_id) - @merge_request = MergeRequest.find(merge_request_id) - @mr_status = status - @project = @merge_request.project - @updated_by = User.find updated_by_user_id - @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}")) - 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 deleted file mode 100644 index ff251209e01..00000000000 --- a/app/mailers/emails/notes.rb +++ /dev/null @@ -1,43 +0,0 @@ -module Emails - module Notes - def note_commit_email(recipient_id, note_id) - @note = Note.find(note_id) - @commit = @note.noteable - @project = @note.project - @target_url = namespace_project_commit_url(@project.namespace, @project, - @commit, anchor: - "note_#{@note.id}") - mail_answer_thread(@commit, - from: sender(@note.author_id), - to: recipient(recipient_id), - subject: subject("#{@commit.title} (#{@commit.short_id})")) - end - - def note_issue_email(recipient_id, note_id) - @note = Note.find(note_id) - @issue = @note.noteable - @project = @note.project - @target_url = namespace_project_issue_url(@project.namespace, @project, - @issue, anchor: - "note_#{@note.id}") - mail_answer_thread(@issue, - from: sender(@note.author_id), - to: recipient(recipient_id), - subject: subject("#{@issue.title} (##{@issue.iid})")) - end - - def note_merge_request_email(recipient_id, note_id) - @note = Note.find(note_id) - @merge_request = @note.noteable - @project = @note.project - @target_url = namespace_project_merge_request_url(@project.namespace, - @project, - @merge_request, anchor: - "note_#{@note.id}") - mail_answer_thread(@merge_request, - from: sender(@note.author_id), - to: recipient(recipient_id), - subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) - end - end -end diff --git a/app/mailers/emails/profile.rb b/app/mailers/emails/profile.rb deleted file mode 100644 index 3a83b083109..00000000000 --- a/app/mailers/emails/profile.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Emails - module Profile - def new_user_email(user_id, token = nil) - @current_user = @user = User.find(user_id) - @target_url = user_url(@user) - @token = token - mail(to: @user.notification_email, subject: subject("Account was created for you")) - end - - def new_email_email(email_id) - @email = Email.find(email_id) - @current_user = @user = @email.user - mail(to: @user.notification_email, subject: subject("Email was added to your account")) - end - - def new_ssh_key_email(key_id) - @key = Key.find(key_id) - @current_user = @user = @key.user - @target_url = user_url(@user) - mail(to: @user.notification_email, subject: subject("SSH key was added to your account")) - end - end -end diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb deleted file mode 100644 index 0dbb2939bb3..00000000000 --- a/app/mailers/emails/projects.rb +++ /dev/null @@ -1,141 +0,0 @@ -module Emails - module Projects - def project_access_granted_email(project_member_id) - @project_member = ProjectMember.find project_member_id - @project = @project_member.project - - @target_url = namespace_project_url(@project.namespace, @project) - @current_user = @project_member.user - - mail(to: @project_member.user.notification_email, - subject: subject("Access to project was granted")) - end - - def project_member_invited_email(project_member_id, token) - @project_member = ProjectMember.find project_member_id - @project = @project_member.project - @token = token - - @target_url = namespace_project_url(@project.namespace, @project) - @current_user = @project_member.user - - mail(to: @project_member.invite_email, - subject: "Invitation to join project #{@project.name_with_namespace}") - end - - def project_invite_accepted_email(project_member_id) - @project_member = ProjectMember.find project_member_id - return if @project_member.created_by.nil? - - @project = @project_member.project - - @target_url = namespace_project_url(@project.namespace, @project) - @current_user = @project_member.created_by - - mail(to: @project_member.created_by.notification_email, - subject: subject("Invitation accepted")) - end - - def project_invite_declined_email(project_id, invite_email, access_level, created_by_id) - return if created_by_id.nil? - - @project = Project.find(project_id) - @current_user = @created_by = User.find(created_by_id) - @access_level = access_level - @invite_email = invite_email - - @target_url = namespace_project_url(@project.namespace, @project) - - mail(to: @created_by.notification_email, - subject: subject("Invitation declined")) - end - - def project_was_moved_email(project_id, user_id) - @current_user = @user = User.find user_id - @project = Project.find project_id - @target_url = namespace_project_url(@project.namespace, @project) - mail(to: @user.notification_email, - subject: subject("Project was moved")) - end - - def repository_push_email(project_id, recipient, author_id: nil, - ref: nil, - action: nil, - compare: nil, - reverse_compare: false, - send_from_committer_email: false, - disable_diffs: false) - unless author_id && ref && action - raise ArgumentError, "missing keywords: author_id, ref, action" - end - - @project = Project.find(project_id) - @current_user = @author = User.find(author_id) - @reverse_compare = reverse_compare - @compare = compare - @ref_name = Gitlab::Git.ref_name(ref) - @ref_type = Gitlab::Git.tag_ref?(ref) ? "tag" : "branch" - @action = action - @disable_diffs = disable_diffs - - if @compare - @commits = Commit.decorate(compare.commits) - @diffs = compare.diffs - end - - @action_name = - case action - when :create - "pushed new" - when :delete - "deleted" - else - "pushed to" - end - - @subject = "[#{@project.path_with_namespace}]" - @subject << "[#{@ref_name}]" if action == :push - @subject << " " - - if action == :push - if @commits.length > 1 - @target_url = namespace_project_compare_url(@project.namespace, - @project, - from: Commit.new(@compare.base), - to: Commit.new(@compare.head)) - @subject << "Deleted " if @reverse_compare - @subject << "#{@commits.length} commits: #{@commits.first.title}" - else - @target_url = namespace_project_commit_url(@project.namespace, - @project, @commits.first) - - @subject << "Deleted 1 commit: " if @reverse_compare - @subject << @commits.first.title - end - else - unless action == :delete - @target_url = namespace_project_tree_url(@project.namespace, - @project, @ref_name) - end - - subject_action = @action_name.dup - subject_action[0] = subject_action[0].capitalize - @subject << "#{subject_action} #{@ref_type} #{@ref_name}" - end - - @disable_footer = true - - reply_to = - if send_from_committer_email && can_send_from_user_email?(@author) - @author.email - else - Gitlab.config.gitlab.email_reply_to - end - - mail(from: sender(author_id, send_from_committer_email), - reply_to: reply_to, - to: recipient, - subject: @subject) - end - end -end diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb deleted file mode 100644 index 2c0d451511f..00000000000 --- a/app/mailers/notify.rb +++ /dev/null @@ -1,167 +0,0 @@ -class Notify < ActionMailer::Base - include ActionDispatch::Routing::PolymorphicRoutes - - include Emails::Issues - include Emails::MergeRequests - include Emails::Notes - include Emails::Projects - 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_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: 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, - body: body.html_safe, - content_type: 'text/html' - ) - end - - # Splits "gitlab.corp.company.com" up into "gitlab.corp.company.com", - # "corp.company.com" and "company.com". - # Respects set tld length so "company.co.uk" won't match "somethingelse.uk" - def self.allowed_email_domains - domain_parts = Gitlab.config.gitlab.host.split(".") - allowed_domains = [] - begin - allowed_domains << domain_parts.join(".") - domain_parts.shift - end while domain_parts.length > ActionDispatch::Http::URL.tld_length - - allowed_domains - end - - 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) - end - - # Return an email address that displays the name of the sender. - # Only the displayed name changes; the actual email address is always the same. - def sender(sender_id, send_from_user_email = false) - return unless sender = User.find(sender_id) - - address = default_sender_address - address.display_name = sender.name - - if send_from_user_email && can_send_from_user_email?(sender) - address.address = sender.email - end - - address.format - end - - # Look up a User by their ID and return their email address - # - # recipient_id - User ID - # - # Returns a String containing the User's email address. - def recipient(recipient_id) - @current_user = User.find(recipient_id) - @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 - # - # Examples - # - # >> subject('Lorem ipsum') - # => "Lorem ipsum" - # - # # Automatically inserts Project name when @project is set - # >> @project = Project.last - # => # - # >> subject('Lorem ipsum') - # => "Ruby on Rails | Lorem ipsum " - # - # # Accepts multiple arguments - # >> subject('Lorem ipsum', 'Dolor sit amet') - # => "Lorem ipsum | Dolor sit amet" - def subject(*extra) - subject = "" - subject << "#{@project.name} | " if @project - subject << extra.join(' | ') if extra.present? - subject - end - - # Return a string suitable for inclusion in the 'Message-Id' mail header. - # - # The message-id is generated from the unique URL to a model object. - def message_id(model) - model_name = model.class.model_name.singular_route_key - "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>" - 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) - headers['Message-ID'] = message_id(model) - headers['X-GitLab-Project'] = "#{@project.name} | " if @project - mail(headers, &block) - end - - # Send an email that responds to an existing conversation thread, - # with headers suitable for grouping by thread in email clients. - # - # For grouping emails by thread, email clients heuristics require the answers to: - # - # * 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) - 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 - - mail(headers, &block) - end - - def can? - Ability.abilities.allowed?(user, action, subject) - end -end diff --git a/app/models/.gitkeep b/app/models/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/app/models/ability.rb b/app/models/ability.rb deleted file mode 100644 index 85a15596f8d..00000000000 --- a/app/models/ability.rb +++ /dev/null @@ -1,276 +0,0 @@ -class Ability - class << self - def allowed(user, subject) - return not_auth_abilities(user, subject) if user.nil? - return [] unless user.kind_of?(User) - return [] if user.blocked? - - case subject.class.name - when "Project" then project_abilities(user, subject) - when "Issue" then issue_abilities(user, subject) - when "Note" then note_abilities(user, subject) - when "ProjectSnippet" then project_snippet_abilities(user, subject) - when "PersonalSnippet" then personal_snippet_abilities(user, subject) - when "MergeRequest" then merge_request_abilities(user, subject) - when "Group" then group_abilities(user, subject) - when "Namespace" then namespace_abilities(user, subject) - when "GroupMember" then group_member_abilities(user, subject) - else [] - end.concat(global_abilities(user)) - end - - # List of possible abilities - # for non-authenticated user - def not_auth_abilities(user, subject) - project = if subject.kind_of?(Project) - subject - elsif subject.respond_to?(:project) - subject.project - else - nil - end - - if project && project.public? - [ - :read_project, - :read_wiki, - :read_issue, - :read_milestone, - :read_project_snippet, - :read_project_member, - :read_merge_request, - :read_note, - :download_code - ] - else - group = if subject.kind_of?(Group) - subject - elsif subject.respond_to?(:group) - subject.group - else - nil - end - - if group && group.public_profile? - [:read_group] - else - [] - end - end - end - - def global_abilities(user) - rules = [] - rules << :create_group if user.can_create_group - rules - end - - def project_abilities(user, project) - rules = [] - key = "/user/#{user.id}/project/#{project.id}" - RequestStore.store[key] ||= begin - team = project.team - - # Rules based on role in project - if team.master?(user) - rules.push(*project_master_rules) - - elsif team.developer?(user) - rules.push(*project_dev_rules) - - elsif team.reporter?(user) - rules.push(*project_report_rules) - - elsif team.guest?(user) - rules.push(*project_guest_rules) - end - - if project.public? || project.internal? - rules.push(*public_project_rules) - end - - if project.owner == user || user.admin? - rules.push(*project_admin_rules) - end - - if project.group && project.group.has_owner?(user) - rules.push(*project_admin_rules) - end - - if project.archived? - rules -= project_archived_rules - end - - rules - end - end - - def public_project_rules - project_guest_rules + [ - :download_code, - :fork_project - ] - end - - def project_guest_rules - [ - :read_project, - :read_wiki, - :read_issue, - :read_milestone, - :read_project_snippet, - :read_project_member, - :read_merge_request, - :read_note, - :write_project, - :write_issue, - :write_note - ] - end - - def project_report_rules - project_guest_rules + [ - :download_code, - :fork_project, - :write_project_snippet - ] - end - - def project_dev_rules - project_report_rules + [ - :write_merge_request, - :write_wiki, - :modify_issue, - :admin_issue, - :admin_label, - :push_code - ] - end - - def project_archived_rules - [ - :write_merge_request, - :push_code, - :push_code_to_protected_branches, - :modify_merge_request, - :admin_merge_request - ] - end - - def project_master_rules - project_dev_rules + [ - :push_code_to_protected_branches, - :modify_issue, - :modify_project_snippet, - :modify_merge_request, - :admin_issue, - :admin_milestone, - :admin_project_snippet, - :admin_project_member, - :admin_merge_request, - :admin_note, - :admin_wiki, - :admin_project - ] - end - - def project_admin_rules - project_master_rules + [ - :change_namespace, - :change_visibility_level, - :rename_project, - :remove_project, - :archive_project - ] - end - - def group_abilities(user, group) - rules = [] - - if user.admin? || group.users.include?(user) || ProjectsFinder.new.execute(user, group: group).any? - rules << :read_group - end - - # Only group masters and group owners can create new projects in group - if group.has_master?(user) || group.has_owner?(user) || user.admin? - rules.push(*[ - :create_projects, - ]) - end - - # Only group owner and administrators can admin group - if group.has_owner?(user) || user.admin? - rules.push(*[ - :admin_group, - :admin_namespace - ]) - end - - rules.flatten - end - - def namespace_abilities(user, namespace) - rules = [] - - # Only namespace owner and administrators can admin it - if namespace.owner == user || user.admin? - rules.push(*[ - :create_projects, - :admin_namespace - ]) - end - - rules.flatten - end - - [:issue, :note, :project_snippet, :personal_snippet, :merge_request].each do |name| - define_method "#{name}_abilities" do |user, subject| - if subject.author == user || user.is_admin? - rules = [ - :"read_#{name}", - :"write_#{name}", - :"modify_#{name}", - :"admin_#{name}" - ] - rules.push(:change_visibility_level) if subject.is_a?(Snippet) - rules - elsif subject.respond_to?(:assignee) && subject.assignee == user - [ - :"read_#{name}", - :"write_#{name}", - :"modify_#{name}", - ] - else - if subject.respond_to?(:project) - project_abilities(user, subject.project) - else - [] - end - end - end - end - - def group_member_abilities(user, subject) - rules = [] - target_user = subject.user - group = subject.group - can_manage = group_abilities(user, group).include?(:admin_group) - if can_manage && (user != target_user) - rules << :modify_group_member - rules << :destroy_group_member - end - if !group.last_owner?(user) && (can_manage || (user == target_user)) - rules << :destroy_group_member - end - rules - end - - def abilities - @abilities ||= begin - abilities = Six.new - abilities << self - abilities - end - end - end -end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb deleted file mode 100644 index 0d8365c4ff2..00000000000 --- a/app/models/application_setting.rb +++ /dev/null @@ -1,61 +0,0 @@ -# == Schema Information -# -# Table name: application_settings -# -# id :integer not null, primary key -# default_projects_limit :integer -# default_branch_protection :integer -# signup_enabled :boolean -# signin_enabled :boolean -# gravatar_enabled :boolean -# twitter_sharing_enabled :boolean -# sign_in_text :text -# created_at :datetime -# updated_at :datetime -# home_page_url :string(255) -# default_branch_protection :integer default(2) -# twitter_sharing_enabled :boolean default(TRUE) -# restricted_visibility_levels :text -# max_attachment_size :integer default(10) -# - -class ApplicationSetting < ActiveRecord::Base - serialize :restricted_visibility_levels - - validates :home_page_url, - allow_blank: true, - format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, - if: :home_page_url_column_exist - - validates_each :restricted_visibility_levels do |record, attr, value| - unless value.nil? - value.each do |level| - unless Gitlab::VisibilityLevel.options.has_value?(level) - record.errors.add(attr, "'#{level}' is not a valid visibility level") - end - end - end - end - - def self.current - ApplicationSetting.last - end - - def self.create_from_defaults - create( - default_projects_limit: Settings.gitlab['default_projects_limit'], - default_branch_protection: Settings.gitlab['default_branch_protection'], - signup_enabled: Settings.gitlab['signup_enabled'], - signin_enabled: Settings.gitlab['signin_enabled'], - twitter_sharing_enabled: Settings.gitlab['twitter_sharing_enabled'], - gravatar_enabled: Settings.gravatar['enabled'], - sign_in_text: Settings.extra['sign_in_text'], - restricted_visibility_levels: Settings.gitlab['restricted_visibility_levels'], - max_attachment_size: Settings.gitlab['max_attachment_size'] - ) - end - - def home_page_url_column_exist - ActiveRecord::Base.connection.column_exists?(:application_settings, :home_page_url) - end -end diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb deleted file mode 100644 index 05f5e979695..00000000000 --- a/app/models/broadcast_message.rb +++ /dev/null @@ -1,29 +0,0 @@ -# == Schema Information -# -# Table name: broadcast_messages -# -# id :integer not null, primary key -# message :text not null -# starts_at :datetime -# ends_at :datetime -# alert_type :integer -# created_at :datetime -# updated_at :datetime -# color :string(255) -# font :string(255) -# - -class BroadcastMessage < ActiveRecord::Base - include Sortable - - validates :message, presence: true - validates :starts_at, presence: true - validates :ends_at, presence: true - - validates :color, format: { with: /\A\#[0-9A-Fa-f]{3}{1,2}+\Z/ }, allow_blank: true - validates :font, format: { with: /\A\#[0-9A-Fa-f]{3}{1,2}+\Z/ }, allow_blank: true - - def self.current - where("ends_at > :now AND starts_at < :now", now: Time.zone.now).last - end -end diff --git a/app/models/commit.rb b/app/models/commit.rb deleted file mode 100644 index 006fa62c8f9..00000000000 --- a/app/models/commit.rb +++ /dev/null @@ -1,155 +0,0 @@ -class Commit - include ActiveModel::Conversion - include StaticModel - extend ActiveModel::Naming - include Mentionable - - attr_mentionable :safe_message - - # Safe amount of changes (files and lines) in one commit to render - # Used to prevent 500 error on huge commits by suppressing diff - # - # User can force display of diff above this size - DIFF_SAFE_FILES = 100 unless defined?(DIFF_SAFE_FILES) - DIFF_SAFE_LINES = 5000 unless defined?(DIFF_SAFE_LINES) - - # Commits above this size will not be rendered in HTML - DIFF_HARD_LIMIT_FILES = 1000 unless defined?(DIFF_HARD_LIMIT_FILES) - DIFF_HARD_LIMIT_LINES = 50000 unless defined?(DIFF_HARD_LIMIT_LINES) - - class << self - def decorate(commits) - commits.map do |commit| - if commit.kind_of?(Commit) - commit - else - self.new(commit) - end - end - end - - # Calculate number of lines to render for diffs - def diff_line_count(diffs) - diffs.reduce(0) { |sum, d| sum + d.diff.lines.count } - end - - # Truncate sha to 8 characters - def truncate_sha(sha) - sha[0..7] - end - end - - attr_accessor :raw - - def initialize(raw_commit) - raise "Nil as raw commit passed" unless raw_commit - - @raw = raw_commit - end - - def id - @raw.id - end - - def diff_line_count - @diff_line_count ||= Commit::diff_line_count(self.diffs) - @diff_line_count - end - - # Returns a string describing the commit for use in a link title - # - # Example - # - # "Commit: Alex Denisov - Project git clone panel" - def link_title - "Commit: #{author_name} - #{title}" - end - - # Returns the commits title. - # - # Usually, the commit title is the first line of the commit message. - # In case this first line is longer than 100 characters, it is cut off - # after 80 characters and ellipses (`&hellp;`) are appended. - def title - title = safe_message - - return no_commit_message if title.blank? - - title_end = title.index("\n") - if (!title_end && title.length > 100) || (title_end && title_end > 100) - title[0..79] << "…" - else - title.split("\n", 2).first - end - end - - # Returns the commits description - # - # cut off, ellipses (`&hellp;`) are prepended to the commit message. - def description - title_end = safe_message.index("\n") - @description ||= - if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) - "…" << safe_message[80..-1] - else - safe_message.split("\n", 2)[1].try(:chomp) - end - end - - def description? - description.present? - end - - def hook_attrs(project) - path_with_namespace = project.path_with_namespace - - { - id: id, - message: safe_message, - timestamp: committed_date.xmlschema, - url: "#{Gitlab.config.gitlab.url}/#{path_with_namespace}/commit/#{id}", - author: { - name: author_name, - email: author_email - } - } - end - - # Discover issues should be closed when this commit is pushed to a project's - # default branch. - def closes_issues(project, current_user = self.committer) - Gitlab::ClosingIssueExtractor.new(project, current_user).closed_by_message(safe_message) - end - - # Mentionable override. - def gfm_reference - "commit #{id}" - end - - def author - User.find_for_commit(author_email, author_name) - end - - def committer - User.find_for_commit(committer_email, committer_name) - end - - def method_missing(m, *args, &block) - @raw.send(m, *args, &block) - end - - def respond_to?(method) - return true if @raw.respond_to?(method) - - super - end - - # Truncate sha to 8 characters - def short_id - @raw.short_id(7) - end - - def parents - @parents ||= Commit.decorate(super) - end -end diff --git a/app/models/concerns/internal_id.rb b/app/models/concerns/internal_id.rb deleted file mode 100644 index 821ed54fb98..00000000000 --- a/app/models/concerns/internal_id.rb +++ /dev/null @@ -1,17 +0,0 @@ -module InternalId - extend ActiveSupport::Concern - - included do - validate :set_iid, on: :create - validates :iid, presence: true, numericality: true - end - - def set_iid - max_iid = project.send(self.class.name.tableize).maximum(:iid) - self.iid = max_iid.to_i + 1 - end - - def to_param - iid.to_s - end -end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb deleted file mode 100644 index 478134dff68..00000000000 --- a/app/models/concerns/issuable.rb +++ /dev/null @@ -1,189 +0,0 @@ -# == Issuable concern -# -# Contains common functionality shared between Issues and MergeRequests -# -# Used by Issue, MergeRequest -# -module Issuable - extend ActiveSupport::Concern - include Mentionable - - included do - belongs_to :author, class_name: "User" - belongs_to :assignee, class_name: "User" - belongs_to :milestone - has_many :notes, as: :noteable, dependent: :destroy - has_many :label_links, as: :target, dependent: :destroy - has_many :labels, through: :label_links - has_many :subscriptions, dependent: :destroy, as: :subscribable - - validates :author, presence: true - validates :title, presence: true, length: { within: 0..255 } - - scope :authored, ->(user) { where(author_id: user) } - scope :assigned_to, ->(u) { where(assignee_id: u.id)} - scope :recent, -> { order("created_at DESC") } - scope :assigned, -> { where("assignee_id IS NOT NULL") } - scope :unassigned, -> { where("assignee_id IS NULL") } - scope :of_projects, ->(ids) { where(project_id: ids) } - scope :opened, -> { with_state(:opened, :reopened) } - scope :only_opened, -> { with_state(:opened) } - scope :only_reopened, -> { with_state(:reopened) } - scope :closed, -> { with_state(:closed) } - scope :order_milestone_due_desc, -> { joins(:milestone).reorder('milestones.due_date DESC, milestones.id DESC') } - scope :order_milestone_due_asc, -> { joins(:milestone).reorder('milestones.due_date ASC, milestones.id ASC') } - - delegate :name, - :email, - to: :author, - prefix: true - - delegate :name, - :email, - to: :assignee, - allow_nil: true, - prefix: true - - attr_mentionable :title, :description - end - - module ClassMethods - def search(query) - where("LOWER(title) like :query", query: "%#{query.downcase}%") - end - - def full_search(query) - where("LOWER(title) like :query OR LOWER(description) like :query", query: "%#{query.downcase}%") - end - - def sort(method) - case method.to_s - when 'milestone_due_asc' then order_milestone_due_asc - when 'milestone_due_desc' then order_milestone_due_desc - else - order_by(method) - end - end - end - - def today? - Date.today == created_at.to_date - end - - def new? - today? && created_at == updated_at - end - - def is_assigned? - !!assignee_id - end - - def is_being_reassigned? - assignee_id_changed? - end - - # - # Votes - # - - # Return the number of -1 comments (downvotes) - def downvotes - filter_superceded_votes(notes.select(&:downvote?), notes).size - end - - def downvotes_in_percent - if votes_count.zero? - 0 - else - 100.0 - upvotes_in_percent - end - end - - # Return the number of +1 comments (upvotes) - def upvotes - filter_superceded_votes(notes.select(&:upvote?), notes).size - end - - def upvotes_in_percent - if votes_count.zero? - 0 - else - 100.0 / votes_count * upvotes - end - end - - # Return the total number of votes - def votes_count - upvotes + downvotes - end - - # Return all users participating on the discussion - def participants(current_user = self.author) - users = [] - users << author - users << assignee if is_assigned? - mentions = [] - mentions << self.mentioned_users(current_user) - - notes.each do |note| - users << note.author - mentions << note.mentioned_users(current_user) - end - - users.concat(mentions.reduce([], :|)).uniq - end - - def subscribed?(user) - subscription = subscriptions.find_by_user_id(user.id) - - if subscription - return subscription.subscribed - end - - participants(user).include?(user) - end - - def toggle_subscription(user) - subscriptions. - find_or_initialize_by(user_id: user.id). - update(subscribed: !subscribed?(user)) - end - - def to_hook_data(user) - { - object_kind: self.class.name.underscore, - user: user.hook_attrs, - object_attributes: hook_attrs - } - end - - def label_names - labels.order('title ASC').pluck(:title) - end - - def remove_labels - labels.delete_all - end - - def add_labels_by_names(label_names) - label_names.each do |label_name| - label = project.labels.create_with(color: Label::DEFAULT_COLOR). - find_or_create_by(title: label_name.strip) - self.labels << label - end - end - - private - - def filter_superceded_votes(votes, notes) - filteredvotes = [] + votes - - votes.each do |vote| - if vote.superceded?(notes) - filteredvotes.delete(vote) - end - end - - filteredvotes - end -end diff --git a/app/models/concerns/mentionable.rb b/app/models/concerns/mentionable.rb deleted file mode 100644 index b7882a2bb16..00000000000 --- a/app/models/concerns/mentionable.rb +++ /dev/null @@ -1,89 +0,0 @@ -# == Mentionable concern -# -# Contains functionality related to objects that can mention Users, Issues, MergeRequests, or Commits by -# GFM references. -# -# Used by Issue, Note, MergeRequest, and Commit. -# -module Mentionable - extend ActiveSupport::Concern - - module ClassMethods - # Indicate which attributes of the Mentionable to search for GFM references. - def attr_mentionable(*attrs) - mentionable_attrs.concat(attrs.map(&:to_s)) - end - - # Accessor for attributes marked mentionable. - def mentionable_attrs - @mentionable_attrs ||= [] - end - end - - # Generate a GFM back-reference that will construct a link back to this Mentionable when rendered. Must - # be overridden if this model object can be referenced directly by GFM notation. - def gfm_reference - raise NotImplementedError.new("#{self.class} does not implement #gfm_reference") - end - - # Construct a String that contains possible GFM references. - def mentionable_text - self.class.mentionable_attrs.map { |attr| send(attr) || '' }.join - end - - # The GFM reference to this Mentionable, which shouldn't be included in its #references. - def local_reference - self - end - - # Determine whether or not a cross-reference Note has already been created between this Mentionable and - # the specified target. - def has_mentioned?(target) - Note.cross_reference_exists?(target, local_reference) - end - - def mentioned_users(current_user = nil) - return [] if mentionable_text.blank? - - ext = Gitlab::ReferenceExtractor.new(self.project, current_user) - ext.analyze(mentionable_text) - ext.users.uniq - end - - # Extract GFM references to other Mentionables from this Mentionable. Always excludes its #local_reference. - def references(p = project, current_user = self.author, text = mentionable_text) - return [] if text.blank? - - ext = Gitlab::ReferenceExtractor.new(p, current_user) - ext.analyze(text) - - (ext.issues + ext.merge_requests + ext.commits).uniq - [local_reference] - end - - # Create a cross-reference Note for each GFM reference to another Mentionable found in +mentionable_text+. - def create_cross_references!(p = project, a = author, without = []) - refs = references(p) - without - refs.each do |ref| - Note.create_cross_reference_note(ref, local_reference, a, p) - end - end - - # If the mentionable_text field is about to change, locate any *added* references and create cross references for - # them. Invoke from an observer's #before_save implementation. - def notice_added_references(p = project, a = author) - ch = changed_attributes - original, mentionable_changed = "", false - self.class.mentionable_attrs.each do |attr| - if ch[attr] - original << ch[attr] - mentionable_changed = true - end - end - - # Only proceed if the saved changes actually include a chance to an attr_mentionable field. - return unless mentionable_changed - - preexisting = references(p, self.author, original) - create_cross_references!(p, a, preexisting) - end -end diff --git a/app/models/concerns/notifiable.rb b/app/models/concerns/notifiable.rb deleted file mode 100644 index d7dcd97911d..00000000000 --- a/app/models/concerns/notifiable.rb +++ /dev/null @@ -1,15 +0,0 @@ -# == Notifiable concern -# -# Contains notification functionality -# -module Notifiable - extend ActiveSupport::Concern - - included do - validates :notification_level, inclusion: { in: Notification.project_notification_levels }, presence: true - end - - def notification - @notification ||= Notification.new(self) - end -end diff --git a/app/models/concerns/sortable.rb b/app/models/concerns/sortable.rb deleted file mode 100644 index 0ad2654867d..00000000000 --- a/app/models/concerns/sortable.rb +++ /dev/null @@ -1,35 +0,0 @@ -# == Sortable concern -# -# Set default scope for ordering objects -# -module Sortable - extend ActiveSupport::Concern - - included do - # By default all models should be ordered - # by created_at field starting from newest - default_scope { order(created_at: :desc, id: :desc) } - - scope :order_created_desc, -> { reorder(created_at: :desc, id: :desc) } - scope :order_created_asc, -> { reorder(created_at: :asc, id: :asc) } - scope :order_updated_desc, -> { reorder(updated_at: :desc, id: :desc) } - scope :order_updated_asc, -> { reorder(updated_at: :asc, id: :asc) } - scope :order_name_asc, -> { reorder(name: :asc) } - scope :order_name_desc, -> { reorder(name: :desc) } - end - - module ClassMethods - def order_by(method) - case method.to_s - when 'name_asc' then order_name_asc - when 'name_desc' then order_name_desc - when 'updated_asc' then order_updated_asc - when 'updated_desc' then order_updated_desc - when 'created_asc' then order_created_asc - when 'created_desc' then order_created_desc - else - all - end - end - end -end diff --git a/app/models/concerns/taskable.rb b/app/models/concerns/taskable.rb deleted file mode 100644 index bbb3b301a9f..00000000000 --- a/app/models/concerns/taskable.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Contains functionality for objects that can have task lists in their -# descriptions. Task list items can be added with Markdown like "* [x] Fix -# bugs". -# -# Used by MergeRequest and Issue -module Taskable - TASK_PATTERN_MD = /^(? *[*-] *)\[(?[ xX])\]/.freeze - TASK_PATTERN_HTML = /^
  • (?\s*

    )?\[(?[ xX])\]/.freeze - - # Change the state of a task list item for this Taskable. Edit the object's - # description by finding the nth task item and changing its checkbox - # placeholder to "[x]" if +checked+ is true, or "[ ]" if it's false. - # Note: task numbering starts with 1 - def update_nth_task(n, checked) - index = 0 - check_char = checked ? 'x' : ' ' - - # Do this instead of using #gsub! so that ActiveRecord detects that a field - # has changed. - self.description = self.description.gsub(TASK_PATTERN_MD) do |match| - index += 1 - case index - when n then "#{$LAST_MATCH_INFO[:bullet]}[#{check_char}]" - else match - end - end - - save - end - - # Return true if this object's description has any task list items. - def tasks? - description && description.match(TASK_PATTERN_MD) - end - - # Return a string that describes the current state of this Taskable's task - # list items, e.g. "20 tasks (12 done, 8 unfinished)" - def task_status - return nil unless description - - num_tasks = 0 - num_done = 0 - - description.scan(TASK_PATTERN_MD) do - num_tasks += 1 - num_done += 1 unless $LAST_MATCH_INFO[:checked] == ' ' - end - - "#{num_tasks} tasks (#{num_done} done, #{num_tasks - num_done} unfinished)" - end -end diff --git a/app/models/concerns/token_authenticatable.rb b/app/models/concerns/token_authenticatable.rb deleted file mode 100644 index 9b88ec1cc38..00000000000 --- a/app/models/concerns/token_authenticatable.rb +++ /dev/null @@ -1,31 +0,0 @@ -module TokenAuthenticatable - extend ActiveSupport::Concern - - module ClassMethods - def find_by_authentication_token(authentication_token = nil) - if authentication_token - where(authentication_token: authentication_token).first - end - end - end - - def ensure_authentication_token - if authentication_token.blank? - self.authentication_token = generate_authentication_token - end - end - - def reset_authentication_token! - self.authentication_token = generate_authentication_token - save - end - - private - - def generate_authentication_token - loop do - token = Devise.friendly_token - break token unless self.class.unscoped.where(authentication_token: token).first - end - end -end diff --git a/app/models/deploy_key.rb b/app/models/deploy_key.rb deleted file mode 100644 index 85d52d558cd..00000000000 --- a/app/models/deploy_key.rb +++ /dev/null @@ -1,38 +0,0 @@ -# == Schema Information -# -# Table name: keys -# -# id :integer not null, primary key -# user_id :integer -# created_at :datetime -# updated_at :datetime -# key :text -# public :boolean default(FALSE) -# title :string(255) -# type :string(255) -# fingerprint :string(255) -# - -class DeployKey < Key - has_many :deploy_keys_projects, dependent: :destroy - has_many :projects, through: :deploy_keys_projects - - scope :in_projects, ->(projects) { joins(:deploy_keys_projects).where('deploy_keys_projects.project_id in (?)', projects) } - scope :are_public, -> { where(public: true) } - - def private? - !public? - end - - def orphaned? - self.deploy_keys_projects.length == 0 - end - - def almost_orphaned? - self.deploy_keys_projects.length == 1 - end - - def destroyed_when_orphaned? - self.private? - end -end diff --git a/app/models/deploy_keys_project.rb b/app/models/deploy_keys_project.rb deleted file mode 100644 index 18db521741f..00000000000 --- a/app/models/deploy_keys_project.rb +++ /dev/null @@ -1,29 +0,0 @@ -# == Schema Information -# -# Table name: deploy_keys_projects -# -# id :integer not null, primary key -# deploy_key_id :integer not null -# project_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -class DeployKeysProject < ActiveRecord::Base - belongs_to :project - belongs_to :deploy_key - - validates :deploy_key_id, presence: true - validates :deploy_key_id, uniqueness: { scope: [:project_id], message: "already exists in project" } - validates :project_id, presence: true - - after_destroy :destroy_orphaned_deploy_key - - private - - def destroy_orphaned_deploy_key - return unless self.deploy_key.destroyed_when_orphaned? && self.deploy_key.orphaned? - - self.deploy_key.destroy - end -end diff --git a/app/models/diff_line.rb b/app/models/diff_line.rb deleted file mode 100644 index ad37945874a..00000000000 --- a/app/models/diff_line.rb +++ /dev/null @@ -1,3 +0,0 @@ -class DiffLine - attr_accessor :type, :content, :num, :code -end diff --git a/app/models/email.rb b/app/models/email.rb deleted file mode 100644 index 556b0e9586e..00000000000 --- a/app/models/email.rb +++ /dev/null @@ -1,35 +0,0 @@ -# == Schema Information -# -# Table name: emails -# -# id :integer not null, primary key -# user_id :integer not null -# email :string(255) not null -# created_at :datetime -# updated_at :datetime -# - -class Email < ActiveRecord::Base - include Sortable - - belongs_to :user - - validates :user_id, presence: true - validates :email, presence: true, email: { strict_mode: true }, uniqueness: true - validate :unique_email, if: ->(email) { email.email_changed? } - - after_create :notify - before_validation :cleanup_email - - def cleanup_email - self.email = self.email.downcase.strip - end - - def unique_email - self.errors.add(:email, 'has already been taken') if User.exists?(email: self.email) - end - - def notify - NotificationService.new.new_email(self) - end -end diff --git a/app/models/event.rb b/app/models/event.rb deleted file mode 100644 index c9a88ffa8e0..00000000000 --- a/app/models/event.rb +++ /dev/null @@ -1,330 +0,0 @@ -# == Schema Information -# -# Table name: events -# -# id :integer not null, primary key -# target_type :string(255) -# target_id :integer -# title :string(255) -# data :text -# project_id :integer -# created_at :datetime -# updated_at :datetime -# action :integer -# author_id :integer -# - -class Event < ActiveRecord::Base - include Sortable - default_scope { where.not(author_id: nil) } - - CREATED = 1 - UPDATED = 2 - CLOSED = 3 - REOPENED = 4 - PUSHED = 5 - COMMENTED = 6 - MERGED = 7 - JOINED = 8 # User joined project - LEFT = 9 # User left project - - delegate :name, :email, to: :author, prefix: true, allow_nil: true - delegate :title, to: :issue, prefix: true, allow_nil: true - delegate :title, to: :merge_request, prefix: true, allow_nil: true - delegate :title, to: :note, prefix: true, allow_nil: true - - belongs_to :author, class_name: "User" - belongs_to :project - belongs_to :target, polymorphic: true - - # For Hash only - serialize :data - - # Callbacks - after_create :reset_project_activity - - # Scopes - scope :recent, -> { order("created_at DESC") } - scope :code_push, -> { where(action: PUSHED) } - scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent } - scope :with_associations, -> { includes(project: :namespace) } - - class << self - def reset_event_cache_for(target) - Event.where(target_id: target.id, target_type: target.class.to_s). - order('id DESC').limit(100). - update_all(updated_at: Time.now) - end - - def contributions - where("action = ? OR (target_type in (?) AND action in (?))", - Event::PUSHED, ["MergeRequest", "Issue"], - [Event::CREATED, Event::CLOSED, Event::MERGED]) - end - end - - def proper? - if push? - true - elsif membership_changed? - true - elsif created_project? - true - else - (issue? || merge_request? || note? || milestone?) && target - end - end - - def project_name - if project - project.name_with_namespace - else - "(deleted project)" - end - end - - def target_title - target.title if target && target.respond_to?(:title) - end - - def created? - action == CREATED - end - - def push? - action == PUSHED && valid_push? - end - - def merged? - action == MERGED - end - - def closed? - action == CLOSED - end - - def reopened? - action == REOPENED - end - - def joined? - action == JOINED - end - - def left? - action == LEFT - end - - def commented? - action == COMMENTED - end - - def membership_changed? - joined? || left? - end - - def created_project? - created? && !target - end - - def created_target? - created? && target - end - - def milestone? - target_type == "Milestone" - end - - def note? - target_type == "Note" - end - - def issue? - target_type == "Issue" - end - - def merge_request? - target_type == "MergeRequest" - end - - def milestone - target if milestone? - end - - def issue - target if issue? - end - - def merge_request - target if merge_request? - end - - def note - target if note? - end - - def action_name - if push? - if new_ref? - "pushed new" - elsif rm_ref? - "deleted" - else - "pushed to" - end - elsif closed? - "closed" - elsif merged? - "accepted" - elsif joined? - 'joined' - elsif left? - 'left' - elsif commented? - "commented on" - elsif created_project? - if project.import? - "imported" - else - "created" - end - else - "opened" - end - end - - def valid_push? - data[:ref] && ref_name.present? - rescue - false - end - - def tag? - Gitlab::Git.tag_ref?(data[:ref]) - end - - def branch? - Gitlab::Git.branch_ref?(data[:ref]) - end - - def new_ref? - Gitlab::Git.blank_ref?(commit_from) - end - - def rm_ref? - Gitlab::Git.blank_ref?(commit_to) - end - - def md_ref? - !(rm_ref? || new_ref?) - end - - def commit_from - data[:before] - end - - def commit_to - data[:after] - end - - def ref_name - if tag? - tag_name - else - branch_name - end - end - - def branch_name - @branch_name ||= Gitlab::Git.ref_name(data[:ref]) - end - - def tag_name - @tag_name ||= Gitlab::Git.ref_name(data[:ref]) - end - - # Max 20 commits from push DESC - def commits - @commits ||= (data[:commits] || []).reverse - end - - def commits_count - data[:total_commits_count] || commits.count || 0 - end - - def ref_type - tag? ? "tag" : "branch" - end - - def push_with_commits? - !commits.empty? && commit_from && commit_to - end - - def last_push_to_non_root? - branch? && project.default_branch != branch_name - end - - def note_commit_id - target.commit_id - end - - def target_iid - target.respond_to?(:iid) ? target.iid : target_id - end - - def note_short_commit_id - Commit.truncate_sha(note_commit_id) - end - - def note_commit? - target.noteable_type == "Commit" - end - - def note_project_snippet? - target.noteable_type == "Snippet" - end - - def note_target - target.noteable - end - - def note_target_id - if note_commit? - target.commit_id - else - target.noteable_id.to_s - end - end - - def note_target_iid - if note_target.respond_to?(:iid) - note_target.iid - else - note_target_id - end.to_s - end - - def note_target_type - if target.noteable_type.present? - target.noteable_type.titleize - else - "Wall" - end.downcase - end - - def body? - if push? - push_with_commits? - elsif note? - true - else - target.respond_to? :title - end - end - - def reset_project_activity - if project - project.update_column(:last_activity_at, self.created_at) - end - end -end diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb deleted file mode 100644 index 50efcb32f1b..00000000000 --- a/app/models/external_issue.rb +++ /dev/null @@ -1,25 +0,0 @@ -class ExternalIssue - def initialize(issue_identifier, project) - @issue_identifier, @project = issue_identifier, project - end - - def to_s - @issue_identifier.to_s - end - - def id - @issue_identifier.to_s - end - - def iid - @issue_identifier.to_s - end - - def ==(other) - other.is_a?(self.class) && (to_s == other.to_s) - end - - def project - @project - end -end diff --git a/app/models/forked_project_link.rb b/app/models/forked_project_link.rb deleted file mode 100644 index 9b0c6263a96..00000000000 --- a/app/models/forked_project_link.rb +++ /dev/null @@ -1,15 +0,0 @@ -# == Schema Information -# -# Table name: forked_project_links -# -# id :integer not null, primary key -# forked_to_project_id :integer not null -# forked_from_project_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -class ForkedProjectLink < ActiveRecord::Base - belongs_to :forked_to_project, class_name: Project - belongs_to :forked_from_project, class_name: Project -end diff --git a/app/models/group.rb b/app/models/group.rb deleted file mode 100644 index 1386a9eccc9..00000000000 --- a/app/models/group.rb +++ /dev/null @@ -1,100 +0,0 @@ -# == Schema Information -# -# Table name: namespaces -# -# id :integer not null, primary key -# name :string(255) not null -# path :string(255) not null -# owner_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) -# description :string(255) default(""), not null -# avatar :string(255) -# - -require 'carrierwave/orm/activerecord' -require 'file_size_validator' - -class Group < Namespace - has_many :group_members, dependent: :destroy, as: :source, class_name: 'GroupMember' - has_many :users, through: :group_members - - validate :avatar_type, if: ->(user) { user.avatar_changed? } - validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - - mount_uploader :avatar, AvatarUploader - - after_create :post_create_hook - after_destroy :post_destroy_hook - - class << self - def search(query) - where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") - end - - def sort(method) - order_by(method) - end - end - - def human_name - name - end - - def owners - @owners ||= group_members.owners.map(&:user) - end - - def add_users(user_ids, access_level, current_user = nil) - user_ids.each do |user_id| - Member.add_user(self.group_members, user_id, access_level, current_user) - end - end - - def add_user(user, access_level, current_user = nil) - add_users([user], access_level, current_user) - end - - def add_owner(user, current_user = nil) - self.add_user(user, Gitlab::Access::OWNER, current_user) - end - - def has_owner?(user) - owners.include?(user) - end - - def has_master?(user) - members.masters.where(user_id: user).any? - end - - def last_owner?(user) - has_owner?(user) && owners.size == 1 - end - - def members - group_members - end - - def avatar_type - unless self.avatar.image? - self.errors.add :avatar, "only images allowed" - end - end - - def public_profile? - projects.public_only.any? - end - - def post_create_hook - system_hook_service.execute_hooks_for(self, :create) - end - - def post_destroy_hook - system_hook_service.execute_hooks_for(self, :destroy) - end - - def system_hook_service - SystemHooksService.new - end -end diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb deleted file mode 100644 index 7e4f16ebf16..00000000000 --- a/app/models/group_milestone.rb +++ /dev/null @@ -1,95 +0,0 @@ -class GroupMilestone - - def initialize(title, milestones) - @title = title - @milestones = milestones - end - - def title - @title - end - - def safe_title - @title.parameterize - end - - def milestones - @milestones - end - - def projects - milestones.map { |milestone| milestone.project } - end - - def issue_count - milestones.map { |milestone| milestone.issues.count }.sum - end - - def merge_requests_count - milestones.map { |milestone| milestone.merge_requests.count }.sum - end - - def open_items_count - milestones.map { |milestone| milestone.open_items_count }.sum - end - - def closed_items_count - milestones.map { |milestone| milestone.closed_items_count }.sum - end - - def total_items_count - milestones.map { |milestone| milestone.total_items_count }.sum - end - - def percent_complete - ((closed_items_count * 100) / total_items_count).abs - rescue ZeroDivisionError - 100 - end - - def state - state = milestones.map { |milestone| milestone.state } - - if state.count('closed') == state.size - 'closed' - else - 'active' - end - end - - def active? - state == 'active' - end - - def closed? - state == 'closed' - end - - def issues - @group_issues ||= milestones.map(&:issues).flatten.group_by(&:state) - end - - def merge_requests - @group_merge_requests ||= milestones.map(&:merge_requests).flatten.group_by(&:state) - end - - def participants - @group_participants ||= milestones.map(&:participants).flatten.compact.uniq - end - - def opened_issues - issues.values_at("opened", "reopened").compact.flatten - end - - def closed_issues - issues['closed'] - end - - def opened_merge_requests - merge_requests.values_at("opened", "reopened").compact.flatten - end - - def closed_merge_requests - merge_requests.values_at("closed", "merged", "locked").compact.flatten - end -end diff --git a/app/models/hooks/project_hook.rb b/app/models/hooks/project_hook.rb deleted file mode 100644 index 21867a9316c..00000000000 --- a/app/models/hooks/project_hook.rb +++ /dev/null @@ -1,25 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -class ProjectHook < WebHook - belongs_to :project - - scope :push_hooks, -> { where(push_events: true) } - scope :tag_push_hooks, -> { where(tag_push_events: true) } - scope :issue_hooks, -> { where(issues_events: true) } - scope :merge_request_hooks, -> { where(merge_requests_events: true) } -end diff --git a/app/models/hooks/service_hook.rb b/app/models/hooks/service_hook.rb deleted file mode 100644 index 2e11239c40b..00000000000 --- a/app/models/hooks/service_hook.rb +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -class ServiceHook < WebHook - belongs_to :service -end diff --git a/app/models/hooks/system_hook.rb b/app/models/hooks/system_hook.rb deleted file mode 100644 index ee32b49bc66..00000000000 --- a/app/models/hooks/system_hook.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -class SystemHook < WebHook -end diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb deleted file mode 100644 index 315d96af1b9..00000000000 --- a/app/models/hooks/web_hook.rb +++ /dev/null @@ -1,60 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -class WebHook < ActiveRecord::Base - include Sortable - include HTTParty - - default_value_for :push_events, true - default_value_for :issues_events, false - default_value_for :merge_requests_events, false - default_value_for :tag_push_events, false - - # HTTParty timeout - default_timeout Gitlab.config.gitlab.webhook_timeout - - validates :url, presence: true, - format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" } - - def execute(data) - parsed_url = URI.parse(url) - if parsed_url.userinfo.blank? - 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), - } - WebHook.post(post_url, - body: data.to_json, - headers: { "Content-Type" => "application/json" }, - verify: false, - basic_auth: auth) - end - rescue SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e - logger.error("WebHook Error => #{e}") - false - end - - def async_execute(data) - Sidekiq::Client.enqueue(ProjectWebHookWorker, id, data) - end -end diff --git a/app/models/identity.rb b/app/models/identity.rb deleted file mode 100644 index 756d19adec7..00000000000 --- a/app/models/identity.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: identities -# -# id :integer not null, primary key -# extern_uid :string(255) -# provider :string(255) -# user_id :integer -# created_at :datetime -# updated_at :datetime -# - -class Identity < ActiveRecord::Base - include Sortable - belongs_to :user - - validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } - validates :user_id, uniqueness: { scope: :provider } -end diff --git a/app/models/issue.rb b/app/models/issue.rb deleted file mode 100644 index 6e102051387..00000000000 --- a/app/models/issue.rb +++ /dev/null @@ -1,78 +0,0 @@ -# == Schema Information -# -# 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 -# - -require 'carrierwave/orm/activerecord' -require 'file_size_validator' - -class Issue < ActiveRecord::Base - include Issuable - include InternalId - include Taskable - include Sortable - - ActsAsTaggableOn.strict_case_match = true - - belongs_to :project - validates :project, presence: true - - scope :of_group, ->(group) { where(project_id: group.project_ids) } - scope :cared, ->(user) { where(assignee_id: user) } - scope :open_for, ->(user) { opened.assigned_to(user) } - - state_machine :state, initial: :opened do - event :close do - transition [:reopened, :opened] => :closed - end - - event :reopen do - transition closed: :reopened - end - - state :opened - state :reopened - state :closed - end - - def hook_attrs - attributes - end - - # Mentionable overrides. - - def gfm_reference - "issue ##{iid}" - end - - # Reset issue events cache - # - # Since we do cache @event we need to reset cache in special cases: - # * when an issue is updated - # Events cache stored like events/23-20130109142513. - # The cache key includes updated_at timestamp. - # Thus it will automatically generate a new fragment - # when the event is updated because the key changes. - def reset_events_cache - Event.reset_event_cache_for(self) - end - - # To allow polymorphism with MergeRequest. - def source_project - project - end -end diff --git a/app/models/key.rb b/app/models/key.rb deleted file mode 100644 index 016eee86992..00000000000 --- a/app/models/key.rb +++ /dev/null @@ -1,86 +0,0 @@ -# == Schema Information -# -# Table name: keys -# -# id :integer not null, primary key -# user_id :integer -# created_at :datetime -# updated_at :datetime -# key :text -# title :string(255) -# type :string(255) -# fingerprint :string(255) -# - -require 'digest/md5' - -class Key < ActiveRecord::Base - include Sortable - - belongs_to :user - - before_validation :strip_white_space, :generate_fingerprint - - validates :title, presence: true, length: { within: 0..255 } - validates :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ }, uniqueness: true - validates :fingerprint, uniqueness: true, presence: { message: 'cannot be generated' } - - delegate :name, :email, to: :user, prefix: true - - after_create :add_to_shell - after_create :notify_user - after_create :post_create_hook - after_destroy :remove_from_shell - after_destroy :post_destroy_hook - - def strip_white_space - self.key = key.strip unless key.blank? - end - - # projects that has this key - def projects - user.authorized_projects - end - - def shell_id - "key-#{id}" - end - - def add_to_shell - GitlabShellWorker.perform_async( - :add_key, - shell_id, - key - ) - end - - def notify_user - NotificationService.new.new_key(self) - end - - def post_create_hook - SystemHooksService.new.execute_hooks_for(self, :create) - end - - def remove_from_shell - GitlabShellWorker.perform_async( - :remove_key, - shell_id, - key, - ) - end - - def post_destroy_hook - SystemHooksService.new.execute_hooks_for(self, :destroy) - end - - private - - def generate_fingerprint - self.fingerprint = nil - - return unless self.key.present? - - self.fingerprint = Gitlab::KeyFingerprint.new(self.key).fingerprint - end -end diff --git a/app/models/label_link.rb b/app/models/label_link.rb deleted file mode 100644 index b94c9c777af..00000000000 --- a/app/models/label_link.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: label_links -# -# id :integer not null, primary key -# label_id :integer -# target_id :integer -# target_type :string(255) -# created_at :datetime -# updated_at :datetime -# - -class LabelLink < ActiveRecord::Base - belongs_to :target, polymorphic: true - belongs_to :label - - validates :target, presence: true - validates :label, presence: true -end diff --git a/app/models/member.rb b/app/models/member.rb deleted file mode 100644 index d151c7b2390..00000000000 --- a/app/models/member.rb +++ /dev/null @@ -1,172 +0,0 @@ -# == Schema Information -# -# Table name: members -# -# id :integer not null, primary key -# access_level :integer not null -# source_id :integer not null -# source_type :string(255) not null -# user_id :integer not null -# notification_level :integer not null -# type :string(255) -# created_at :datetime -# updated_at :datetime -# created_by_id :integer -# invite_email :string -# invite_token :string -# invite_accepted_at :datetime -# - -class Member < ActiveRecord::Base - include Sortable - include Notifiable - include Gitlab::Access - - attr_accessor :raw_invite_token - - belongs_to :created_by, class_name: "User" - belongs_to :user - belongs_to :source, polymorphic: true - - validates :user, presence: true, unless: :invite? - validates :source, presence: true - validates :user_id, uniqueness: { scope: [:source_type, :source_id], - message: "already exists in source", - allow_nil: true } - validates :access_level, inclusion: { in: Gitlab::Access.all_values }, presence: true - validates :invite_email, presence: { if: :invite? }, - email: { strict_mode: true, allow_nil: true }, - uniqueness: { scope: [:source_type, :source_id], allow_nil: true } - - scope :invite, -> { where(user_id: nil) } - scope :non_invite, -> { where("user_id IS NOT NULL") } - scope :guests, -> { where(access_level: GUEST) } - scope :reporters, -> { where(access_level: REPORTER) } - scope :developers, -> { where(access_level: DEVELOPER) } - scope :masters, -> { where(access_level: MASTER) } - scope :owners, -> { where(access_level: OWNER) } - - before_validation :generate_invite_token, on: :create, if: -> (member) { member.invite_email.present? } - after_create :send_invite, if: :invite? - after_create :post_create_hook, unless: :invite? - after_update :post_update_hook, unless: :invite? - after_destroy :post_destroy_hook, unless: :invite? - - delegate :name, :username, :email, to: :user, prefix: true - - class << self - def find_by_invite_token(invite_token) - invite_token = Devise.token_generator.digest(self, :invite_token, invite_token) - find_by(invite_token: invite_token) - end - - # This method is used to find users that have been entered into the "Add members" field. - # These can be the User objects directly, their IDs, their emails, or new emails to be invited. - def user_for_id(user_id) - return user_id if user_id.is_a?(User) - - user = User.find_by(id: user_id) - user ||= User.find_by(email: user_id) - user ||= user_id - user - end - - def add_user(members, user_id, access_level, current_user = nil) - user = user_for_id(user_id) - - # `user` can be either a User object or an email to be invited - if user.is_a?(User) - member = members.find_or_initialize_by(user_id: user.id) - else - member = members.build - member.invite_email = user - end - - member.created_by ||= current_user - member.access_level = access_level - - member.save - end - end - - def invite? - self.invite_token.present? - end - - def accept_invite!(new_user) - return false unless invite? - - self.invite_token = nil - self.invite_accepted_at = Time.now.utc - - self.user = new_user - - saved = self.save - - after_accept_invite if saved - - saved - end - - def decline_invite! - return false unless invite? - - destroyed = self.destroy - - after_decline_invite if destroyed - - destroyed - end - - def generate_invite_token - raw, enc = Devise.token_generator.generate(self.class, :invite_token) - @raw_invite_token = raw - self.invite_token = enc - end - - def generate_invite_token! - generate_invite_token && save(validate: false) - end - - def resend_invite - return unless invite? - - generate_invite_token! unless @raw_invite_token - - send_invite - end - - private - - def send_invite - # override in subclass - end - - def post_create_hook - system_hook_service.execute_hooks_for(self, :create) - end - - def post_update_hook - # override in subclass - end - - def post_destroy_hook - system_hook_service.execute_hooks_for(self, :destroy) - end - - def after_accept_invite - post_create_hook - end - - def after_decline_invite - # override in subclass - end - - def system_hook_service - SystemHooksService.new - end - - def notification_service - NotificationService.new - end -end diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb deleted file mode 100644 index 84c91372b3f..00000000000 --- a/app/models/members/group_member.rb +++ /dev/null @@ -1,75 +0,0 @@ -# == Schema Information -# -# Table name: members -# -# id :integer not null, primary key -# access_level :integer not null -# source_id :integer not null -# source_type :string(255) not null -# user_id :integer not null -# notification_level :integer not null -# type :string(255) -# created_at :datetime -# updated_at :datetime -# - -class GroupMember < Member - SOURCE_TYPE = 'Namespace' - - belongs_to :group, class_name: 'Group', foreign_key: 'source_id' - - # Make sure group member points only to group as it source - default_value_for :source_type, SOURCE_TYPE - default_value_for :notification_level, Notification::N_GLOBAL - validates_format_of :source_type, with: /\ANamespace\z/ - default_scope { where(source_type: SOURCE_TYPE) } - - scope :with_group, ->(group) { where(source_id: group.id) } - scope :with_user, ->(user) { where(user_id: user.id) } - - def self.access_level_roles - Gitlab::Access.options_with_owner - end - - def group - source - end - - def access_field - access_level - end - - private - - def send_invite - notification_service.invite_group_member(self, @raw_invite_token) - - super - end - - def post_create_hook - notification_service.new_group_member(self) - - super - end - - def post_update_hook - if access_level_changed? - notification_service.update_group_member(self) - end - - super - end - - def after_accept_invite - notification_service.accept_group_invite(self) - - super - end - - def after_decline_invite - notification_service.decline_group_invite(self) - - super - end -end diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb deleted file mode 100644 index 0a3b4d2182b..00000000000 --- a/app/models/members/project_member.rb +++ /dev/null @@ -1,165 +0,0 @@ -# == Schema Information -# -# Table name: members -# -# id :integer not null, primary key -# access_level :integer not null -# source_id :integer not null -# source_type :string(255) not null -# user_id :integer not null -# notification_level :integer not null -# type :string(255) -# created_at :datetime -# updated_at :datetime -# - -class ProjectMember < Member - SOURCE_TYPE = 'Project' - - include Gitlab::ShellAdapter - - belongs_to :project, class_name: 'Project', foreign_key: 'source_id' - - - # Make sure project member points only to project as it source - default_value_for :source_type, SOURCE_TYPE - default_value_for :notification_level, Notification::N_GLOBAL - validates_format_of :source_type, with: /\AProject\z/ - default_scope { where(source_type: SOURCE_TYPE) } - - scope :in_project, ->(project) { where(source_id: project.id) } - scope :in_projects, ->(projects) { where(source_id: projects.pluck(:id)) } - scope :with_user, ->(user) { where(user_id: user.id) } - - class << self - - # Add users to project teams with passed access option - # - # access can be an integer representing a access code - # or symbol like :master representing role - # - # Ex. - # add_users_into_projects( - # project_ids, - # user_ids, - # ProjectMember::MASTER - # ) - # - # add_users_into_projects( - # project_ids, - # user_ids, - # :master - # ) - # - def add_users_into_projects(project_ids, user_ids, access, current_user = nil) - access_level = if roles_hash.has_key?(access) - roles_hash[access] - elsif roles_hash.values.include?(access.to_i) - access - else - raise "Non valid access" - end - - users = user_ids.map { |user_id| Member.user_for_id(user_id) } - - ProjectMember.transaction do - project_ids.each do |project_id| - project = Project.find(project_id) - - users.each do |user| - Member.add_user(project.project_members, user, access_level, current_user) - end - end - end - - true - rescue - false - end - - def truncate_teams(project_ids) - ProjectMember.transaction do - members = ProjectMember.where(source_id: project_ids) - - members.each do |member| - member.destroy - end - end - - true - rescue - false - end - - def truncate_team(project) - truncate_teams [project.id] - end - - def roles_hash - Gitlab::Access.sym_options - end - - def access_roles - Gitlab::Access.options - end - end - - def access_field - access_level - end - - def project - source - end - - def owner? - project.owner == user - end - - private - - def send_invite - notification_service.invite_project_member(self, @raw_invite_token) - - super - end - - def post_create_hook - unless owner? - event_service.join_project(self.project, self.user) - notification_service.new_project_member(self) - end - - super - end - - def post_update_hook - if access_level_changed? - notification_service.update_project_member(self) - end - - super - end - - def post_destroy_hook - event_service.leave_project(self.project, self.user) - - super - end - - def after_accept_invite - notification_service.accept_project_invite(self) - - super - end - - def after_decline_invite - notification_service.decline_project_invite(self) - - super - end - - def event_service - EventCreateService.new - end -end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb deleted file mode 100644 index 9c9e2762507..00000000000 --- a/app/models/merge_request.rb +++ /dev/null @@ -1,368 +0,0 @@ -# == Schema Information -# -# Table name: merge_requests -# -# id :integer not null, primary key -# target_branch :string(255) not null -# source_branch :string(255) not null -# source_project_id :integer not null -# author_id :integer -# assignee_id :integer -# title :string(255) -# created_at :datetime -# updated_at :datetime -# milestone_id :integer -# state :string(255) -# merge_status :string(255) -# target_project_id :integer not null -# iid :integer -# description :text -# position :integer default(0) -# locked_at :datetime -# - -require Rails.root.join("app/models/commit") -require Rails.root.join("lib/static_model") - -class MergeRequest < ActiveRecord::Base - include Issuable - include Taskable - include InternalId - include Sortable - - belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" - belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" - - has_one :merge_request_diff, dependent: :destroy - - after_create :create_merge_request_diff - after_update :update_merge_request_diff - - 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 - - # Temporary fields to store compare vars - # when creating new merge request - attr_accessor :can_be_created, :compare_failed, - :compare_commits, :compare_diffs - - state_machine :state, initial: :opened do - event :close do - transition [:reopened, :opened] => :closed - end - - event :merge do - transition [:reopened, :opened, :locked] => :merged - end - - event :reopen do - transition closed: :reopened - end - - event :lock_mr do - transition [:reopened, :opened] => :locked - end - - event :unlock_mr do - transition locked: :reopened - end - - after_transition any => :locked do |merge_request, transition| - merge_request.locked_at = Time.now - merge_request.save - end - - after_transition locked: (any - :locked) do |merge_request, transition| - merge_request.locked_at = nil - merge_request.save - end - - state :opened - state :reopened - state :closed - state :merged - state :locked - end - - state_machine :merge_status, initial: :unchecked do - event :mark_as_unchecked do - transition [:can_be_merged, :cannot_be_merged] => :unchecked - end - - event :mark_as_mergeable do - transition [:unchecked, :cannot_be_merged] => :can_be_merged - end - - event :mark_as_unmergeable do - transition [:unchecked, :can_be_merged] => :cannot_be_merged - end - - state :unchecked - state :can_be_merged - state :cannot_be_merged - - around_transition do |merge_request, transition, block| - merge_request.record_timestamps = false - begin - block.call - ensure - merge_request.record_timestamps = true - end - end - end - - validates :source_project, presence: true, unless: :allow_broken - validates :source_branch, presence: true - validates :target_project, presence: true - validates :target_branch, presence: true - validate :validate_branches - validate :validate_fork - - scope :of_group, ->(group) { where("source_project_id in (:group_project_ids) OR target_project_id in (:group_project_ids)", group_project_ids: group.project_ids) } - scope :merged, -> { with_state(:merged) } - scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) } - scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) } - scope :by_milestone, ->(milestone) { where(milestone_id: milestone) } - scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) } - scope :of_projects, ->(ids) { where(target_project_id: ids) } - # Closed scope for merge request should return - # both merged and closed mr's - scope :closed, -> { with_states(:closed, :merged) } - scope :declined, -> { with_states(:closed) } - - def validate_branches - if target_project == source_project && target_branch == source_branch - errors.add :branch_conflict, "You can not use same project/branch for source and target" - end - - if opened? || reopened? - similar_mrs = self.target_project.merge_requests.where(source_branch: source_branch, target_branch: target_branch, source_project_id: source_project.id).opened - similar_mrs = similar_mrs.where('id not in (?)', self.id) if self.id - if similar_mrs.any? - errors.add :validate_branches, - "Cannot Create: This merge request already exists: #{ - similar_mrs.pluck(:title) - }" - end - end - end - - def validate_fork - return true unless target_project && source_project - - if target_project == source_project - true - else - # If source and target projects are different - # we should check if source project is actually a fork of target project - if source_project.forked_from?(target_project) - true - else - errors.add :validate_fork, - 'Source project is not a fork of target project' - end - end - end - - def update_merge_request_diff - if source_branch_changed? || target_branch_changed? - reload_code - mark_as_unchecked - end - end - - def reload_code - if merge_request_diff && open? - merge_request_diff.reload_content - end - end - - def check_if_can_be_merged - if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? - mark_as_mergeable - else - mark_as_unmergeable - end - end - - def merge_event - self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last - end - - def closed_event - self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last - end - - def automerge!(current_user, commit_message = nil) - MergeRequests::AutoMergeService. - new(target_project, current_user). - execute(self, commit_message) - end - - def open? - opened? || reopened? - end - - def mr_and_commit_notes - # Fetch comments only from last 100 commits - commits_for_notes_limit = 100 - commit_ids = commits.last(commits_for_notes_limit).map(&:id) - - project.notes.where( - "(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))", - mr_id: id, - commit_ids: commit_ids - ) - end - - # Returns the raw diff for this merge request - # - # see "git diff" - def to_diff(current_user) - Gitlab::Satellite::MergeAction.new(current_user, self).diff_in_satellite - 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 - end - - def hook_attrs - attrs = { - source: source_project.hook_attrs, - target: target_project.hook_attrs, - last_commit: nil - } - - unless last_commit.nil? - attrs.merge!(last_commit: last_commit.hook_attrs(source_project)) - end - - attributes.merge!(attrs) - end - - def for_fork? - target_project != source_project - end - - def project - target_project - end - - # Return the set of issues that will be closed if this merge request is accepted. - def closes_issues(current_user = self.author) - if target_branch == project.default_branch - issues = commits.flat_map { |c| c.closes_issues(project, current_user) } - issues.push(*Gitlab::ClosingIssueExtractor.new(project, current_user). - closed_by_message(description)) - issues.uniq.sort_by(&:id) - else - [] - end - end - - # Mentionable override. - def gfm_reference - "merge request !#{iid}" - end - - def target_project_path - if target_project - target_project.path_with_namespace - else - "(removed)" - end - end - - def source_project_path - if source_project - source_project.path_with_namespace - else - "(removed)" - end - end - - def source_project_namespace - if source_project && source_project.namespace - source_project.namespace.path - else - "(removed)" - end - end - - def target_project_namespace - if target_project && target_project.namespace - target_project.namespace.path - else - "(removed)" - end - end - - def source_branch_exists? - return false unless self.source_project - - self.source_project.repository.branch_names.include?(self.source_branch) - end - - def target_branch_exists? - return false unless self.target_project - - self.target_project.repository.branch_names.include?(self.target_branch) - end - - # Reset merge request events cache - # - # Since we do cache @event we need to reset cache in special cases: - # * when a merge request is updated - # Events cache stored like events/23-20130109142513. - # The cache key includes updated_at timestamp. - # Thus it will automatically generate a new fragment - # when the event is updated because the key changes. - def reset_events_cache - Event.reset_event_cache_for(self) - end - - def merge_commit_message - message = "Merge branch '#{source_branch}' into '#{target_branch}'" - message << "\n\n" - message << title.to_s - message << "\n\n" - message << description.to_s - message << "\n\n" - message << "See merge request !#{iid}" - message - end - - # Return array of possible target branches - # depends on target project of MR - def target_branches - if target_project.nil? - [] - else - target_project.repository.branch_names - end - end - - # Return array of possible source branches - # depends on source project of MR - def source_branches - if source_project.nil? - [] - else - source_project.repository.branch_names - end - end - - def locked_long_ago? - return false unless locked? - - locked_at.nil? || locked_at < (Time.now - 1.day) - end -end diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb deleted file mode 100644 index acac1ca4cf7..00000000000 --- a/app/models/merge_request_diff.rb +++ /dev/null @@ -1,171 +0,0 @@ -# == Schema Information -# -# Table name: merge_request_diffs -# -# id :integer not null, primary key -# state :string(255) -# st_commits :text -# st_diffs :text -# merge_request_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -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 - - attr_reader :commits, :diffs - - belongs_to :merge_request - - delegate :target_branch, :source_branch, to: :merge_request, prefix: nil - - state_machine :state, initial: :empty do - state :collected - state :timeout - state :overflow_commits_safe_size - state :overflow_diff_files_limit - state :overflow_diff_lines_limit - end - - serialize :st_commits - serialize :st_diffs - - after_create :reload_content - - def reload_content - reload_commits - reload_diffs - end - - def diffs - @diffs ||= (load_diffs(st_diffs) || []) - end - - def commits - @commits ||= load_commits(st_commits || []) - end - - def last_commit - commits.first - end - - def last_commit_short_sha - @last_commit_short_sha ||= last_commit.short_id - end - - private - - def dump_commits(commits) - commits.map(&:to_hash) - end - - def load_commits(array) - array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) } - end - - def dump_diffs(diffs) - if diffs.respond_to?(:map) - diffs.map(&:to_hash) - end - end - - def load_diffs(raw) - if raw.respond_to?(:map) - raw.map { |hash| Gitlab::Git::Diff.new(hash) } - end - end - - # Collect array of Git::Commit objects - # between target and source branches - def unmerged_commits - commits = compare_result.commits - - if commits.present? - commits = Commit.decorate(commits). - sort_by(&:created_at). - reverse - end - - commits - end - - # Reload all commits related to current merge request from repo - # and save it as array of hashes in st_commits db field - def reload_commits - commit_objects = unmerged_commits - - if commit_objects.present? - self.st_commits = dump_commits(commit_objects) - end - - save - end - - # Reload diffs between branches related to current merge request from repo - # and save it as array of hashes in st_diffs db field - def reload_diffs - new_diffs = [] - - if commits.size.zero? - self.state = :empty - elsif commits.size > COMMITS_SAFE_SIZE - self.state = :overflow_commits_safe_size - else - new_diffs = unmerged_diffs - end - - if new_diffs.any? - if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES - self.state = :overflow_diff_files_limit - new_diffs = [] - end - - if new_diffs.sum { |diff| diff.diff.lines.count } > Commit::DIFF_HARD_LIMIT_LINES - self.state = :overflow_diff_lines_limit - new_diffs = [] - end - end - - if new_diffs.present? - new_diffs = dump_commits(new_diffs) - self.state = :collected - end - - self.st_diffs = new_diffs - self.save - end - - # Collect array of Git::Diff objects - # between target and source branches - def unmerged_diffs - diffs = compare_result.diffs - diffs ||= [] - diffs - rescue Gitlab::Git::Diff::TimeoutError => ex - self.state = :timeout - diffs = [] - end - - def repository - merge_request.target_project.repository - end - - 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, - ) - end -end diff --git a/app/models/milestone.rb b/app/models/milestone.rb deleted file mode 100644 index 9bbb2bafb98..00000000000 --- a/app/models/milestone.rb +++ /dev/null @@ -1,93 +0,0 @@ -# == Schema Information -# -# Table name: milestones -# -# id :integer not null, primary key -# title :string(255) not null -# project_id :integer not null -# description :text -# due_date :date -# created_at :datetime -# updated_at :datetime -# state :string(255) -# iid :integer -# - -class Milestone < ActiveRecord::Base - include InternalId - include Sortable - - belongs_to :project - has_many :issues - has_many :merge_requests - has_many :participants, through: :issues, source: :assignee - - scope :active, -> { with_state(:active) } - scope :closed, -> { with_state(:closed) } - scope :of_projects, ->(ids) { where(project_id: ids) } - - validates :title, presence: true - validates :project, presence: true - - state_machine :state, initial: :active do - event :close do - transition active: :closed - end - - event :activate do - transition closed: :active - end - - state :closed - - state :active - end - - def expired? - if due_date - due_date.past? - else - false - end - end - - def open_items_count - self.issues.opened.count + self.merge_requests.opened.count - end - - def closed_items_count - self.issues.closed.count + self.merge_requests.closed.count - end - - def total_items_count - self.issues.count + self.merge_requests.count - end - - def percent_complete - ((closed_items_count * 100) / total_items_count).abs - rescue ZeroDivisionError - 100 - end - - def expires_at - if due_date - if due_date.past? - "expired at #{due_date.stamp("Aug 21, 2011")}" - else - "expires at #{due_date.stamp("Aug 21, 2011")}" - end - end - end - - def can_be_closed? - active? && issues.opened.count.zero? - end - - def is_empty? - total_items_count.zero? - end - - def author_id - nil - end -end diff --git a/app/models/network/commit.rb b/app/models/network/commit.rb deleted file mode 100644 index 8417f200e36..00000000000 --- a/app/models/network/commit.rb +++ /dev/null @@ -1,35 +0,0 @@ -module Network - class Commit - include ActionView::Helpers::TagHelper - - attr_accessor :time, :spaces, :parent_spaces - - def initialize(raw_commit) - @commit = raw_commit - @time = -1 - @spaces = [] - @parent_spaces = [] - end - - def method_missing(m, *args, &block) - @commit.send(m, *args, &block) - end - - def space - if @spaces.size > 0 - @spaces.first - else - 0 - end - end - - def parents(map) - @commit.parents.map do |p| - if map.include?(p.id) - map[p.id] - end - end - .compact - end - end -end diff --git a/app/models/network/graph.rb b/app/models/network/graph.rb deleted file mode 100644 index f4e90125373..00000000000 --- a/app/models/network/graph.rb +++ /dev/null @@ -1,267 +0,0 @@ -module Network - class Graph - attr_reader :days, :commits, :map, :notes, :repo - - def self.max_count - @max_count ||= 650 - end - - def initialize(project, ref, commit, filter_ref) - @project = project - @ref = ref - @commit = commit - @filter_ref = filter_ref - @repo = project.repository - - @commits = collect_commits - @days = index_commits - @notes = collect_notes - end - - protected - - def collect_notes - h = Hash.new(0) - @project.notes.where('noteable_type = ?' ,"Commit").group('notes.commit_id').select('notes.commit_id, count(notes.id) as note_count').each do |item| - h[item.commit_id] = item.note_count.to_i - end - h - end - - # Get commits from repository - # - def collect_commits - find_commits(count_to_display_commit_in_center).map do |commit| - # Decorate with app/model/network/commit.rb - Network::Commit.new(commit) - end - end - - # Method is adding time and space on the - # list of commits. As well as returns date list - # correlated with time set on commits. - # - # @return [Array] list of commit dates correlated with time on commits - def index_commits - days = [] - @map = {} - @reserved = {} - - @commits.each_with_index do |c,i| - c.time = i - days[i] = c.committed_date - @map[c.id] = c - @reserved[i] = [] - end - - commits_sort_by_ref.each do |commit| - place_chain(commit) - end - - # find parent spaces for not overlap lines - @commits.each do |c| - c.parent_spaces.concat(find_free_parent_spaces(c)) - end - - days - end - - # Skip count that the target commit is displayed in center. - def count_to_display_commit_in_center - offset = -1 - skip = 0 - while offset == -1 - tmp_commits = find_commits(skip) - if tmp_commits.size > 0 - index = tmp_commits.index do |c| - c.id == @commit.id - end - - if index - # Find the target commit - offset = index + skip - else - skip += self.class.max_count - end - else - # Can't find the target commit in the repo. - offset = 0 - end - end - - if self.class.max_count / 2 < offset then - # get max index that commit is displayed in the center. - offset - self.class.max_count / 2 - else - 0 - end - end - - def find_commits(skip = 0) - opts = { - max_count: self.class.max_count, - skip: skip - } - - opts[:ref] = @commit.id if @filter_ref - - @repo.find_commits(opts) - end - - def commits_sort_by_ref - @commits.sort do |a,b| - if include_ref?(a) - -1 - elsif include_ref?(b) - 1 - else - b.committed_date <=> a.committed_date - end - end - end - - def include_ref?(commit) - commit.ref_names(@repo).include?(@ref) - end - - def find_free_parent_spaces(commit) - spaces = [] - - commit.parents(@map).each do |parent| - range = commit.time..parent.time - - space = if commit.space >= parent.space then - find_free_parent_space(range, parent.space, -1, commit.space) - else - find_free_parent_space(range, commit.space, -1, parent.space) - end - - mark_reserved(range, space) - spaces << space - end - - spaces - end - - def find_free_parent_space(range, space_base, space_step, space_default) - if is_overlap?(range, space_default) then - find_free_space(range, space_step, space_base, space_default) - else - space_default - end - end - - def is_overlap?(range, overlap_space) - range.each do |i| - if i != range.first && - i != range.last && - @commits[i].spaces.include?(overlap_space) then - - return true; - end - end - - false - end - - # Add space mark on commit and its parents - # - # @param [::Commit] the commit object. - def place_chain(commit, parent_time = nil) - leaves = take_left_leaves(commit) - if leaves.empty? - return - end - - time_range = leaves.first.time..leaves.last.time - space_base = get_space_base(leaves) - space = find_free_space(time_range, 2, space_base) - leaves.each do |l| - l.spaces << space - end - - # and mark it as reserved - if parent_time.nil? - min_time = leaves.first.time - else - min_time = parent_time + 1 - end - - max_time = leaves.last.time - leaves.last.parents(@map).each do |parent| - if max_time < parent.time - max_time = parent.time - end - end - mark_reserved(min_time..max_time, space) - - # Visit branching chains - leaves.each do |l| - parents = l.parents(@map).select{|p| p.space.zero?} - for p in parents - place_chain(p, l.time) - end - end - end - - def get_space_base(leaves) - space_base = 1 - parents = leaves.last.parents(@map) - if parents.size > 0 - if parents.first.space > 0 - space_base = parents.first.space - end - end - space_base - end - - def mark_reserved(time_range, space) - for day in time_range - @reserved[day].push(space) - end - end - - def find_free_space(time_range, space_step, space_base = 1, space_default = nil) - space_default ||= space_base - - reserved = [] - for day in time_range - reserved.push(*@reserved[day]) - end - reserved.uniq! - - space = space_default - while reserved.include?(space) do - space += space_step - if space < space_base then - space_step *= -1 - space = space_base + space_step - end - end - - space - end - - # Takes most left subtree branch of commits - # which don't have space mark yet. - # - # @param [::Commit] the commit object. - # - # @return [Array] list of branch commits - def take_left_leaves(raw_commit) - commit = @map[raw_commit.id] - leaves = [] - leaves.push(commit) if commit.space.zero? - - while true - return leaves if commit.parents(@map).count.zero? - - commit = commit.parents(@map).first - - return leaves unless commit.space.zero? - - leaves.push(commit) - end - end - end -end diff --git a/app/models/note.rb b/app/models/note.rb deleted file mode 100644 index 2cf3fac2def..00000000000 --- a/app/models/note.rb +++ /dev/null @@ -1,609 +0,0 @@ -# == Schema Information -# -# Table name: notes -# -# id :integer not null, primary key -# note :text -# noteable_type :string(255) -# author_id :integer -# created_at :datetime -# updated_at :datetime -# project_id :integer -# attachment :string(255) -# line_code :string(255) -# commit_id :string(255) -# noteable_id :integer -# system :boolean default(FALSE), not null -# st_diff :text -# - -require 'carrierwave/orm/activerecord' -require 'file_size_validator' - -class Note < ActiveRecord::Base - include Mentionable - include Gitlab::CurrentSettings - - default_value_for :system, false - - attr_mentionable :note - - belongs_to :project - belongs_to :noteable, polymorphic: true - belongs_to :author, class_name: "User" - - delegate :name, to: :project, prefix: true - delegate :name, :email, to: :author, prefix: true - - validates :note, :project, presence: true - validates :line_code, format: { with: /\A[a-z0-9]+_\d+_\d+\Z/ }, allow_blank: true - # Attachments are deprecated and are handled by Markdown uploader - validates :attachment, file_size: { maximum: :max_attachment_size } - - validates :noteable_id, presence: true, if: ->(n) { n.noteable_type.present? && n.noteable_type != 'Commit' } - validates :commit_id, presence: true, if: ->(n) { n.noteable_type == 'Commit' } - - mount_uploader :attachment, AttachmentUploader - - # Scopes - scope :for_commit_id, ->(commit_id) { where(noteable_type: "Commit", commit_id: commit_id) } - scope :inline, ->{ where("line_code IS NOT NULL") } - scope :not_inline, ->{ where(line_code: [nil, '']) } - scope :system, ->{ where(system: true) } - scope :user, ->{ where(system: false) } - scope :common, ->{ where(noteable_type: ["", nil]) } - scope :fresh, ->{ order(created_at: :asc, id: :asc) } - scope :inc_author_project, ->{ includes(:project, :author) } - scope :inc_author, ->{ includes(:author) } - - serialize :st_diff - before_create :set_diff, if: ->(n) { n.line_code.present? } - after_update :set_references - - class << self - def create_status_change_note(noteable, project, author, status, source) - body = "Status changed to #{status}#{' by ' + source.gfm_reference if source}" - - create( - noteable: noteable, - project: project, - author: author, - note: body, - system: true - ) - end - - # +noteable+ was referenced from +mentioner+, by including GFM in either - # +mentioner+'s description or an associated Note. - # Create a system Note associated with +noteable+ with a GFM back-reference - # to +mentioner+. - def create_cross_reference_note(noteable, mentioner, author, project) - gfm_reference = mentioner_gfm_ref(noteable, mentioner, project) - - note_options = { - project: project, - author: author, - note: cross_reference_note_content(gfm_reference), - system: true - } - - if noteable.kind_of?(Commit) - note_options.merge!(noteable_type: 'Commit', commit_id: noteable.id) - else - note_options.merge!(noteable: noteable) - end - - create(note_options) unless cross_reference_disallowed?(noteable, mentioner) - end - - def create_milestone_change_note(noteable, project, author, milestone) - body = if milestone.nil? - 'Milestone removed' - else - "Milestone changed to #{milestone.title}" - end - - create( - noteable: noteable, - project: project, - author: author, - note: body, - system: true - ) - end - - def create_assignee_change_note(noteable, project, author, assignee) - body = assignee.nil? ? 'Assignee removed' : "Reassigned to @#{assignee.username}" - - create({ - noteable: noteable, - project: project, - author: author, - note: body, - system: true - }) - end - - def create_labels_change_note(noteable, project, author, added_labels, removed_labels) - labels_count = added_labels.count + removed_labels.count - added_labels = added_labels.map{ |label| "~#{label.id}" }.join(' ') - removed_labels = removed_labels.map{ |label| "~#{label.id}" }.join(' ') - message = '' - - if added_labels.present? - message << "added #{added_labels}" - end - - if added_labels.present? && removed_labels.present? - message << ' and ' - end - - if removed_labels.present? - message << "removed #{removed_labels}" - end - - message << ' ' << 'label'.pluralize(labels_count) - body = "#{message.capitalize}" - - create( - noteable: noteable, - project: project, - author: author, - note: body, - system: true - ) - end - - def create_new_commits_note(merge_request, project, author, new_commits, existing_commits = [], oldrev = nil) - total_count = new_commits.length + existing_commits.length - commits_text = ActionController::Base.helpers.pluralize(total_count, 'commit') - body = "Added #{commits_text}:\n\n" - - if existing_commits.length > 0 - commit_ids = - if existing_commits.length == 1 - existing_commits.first.short_id - else - if oldrev - "#{Commit.truncate_sha(oldrev)}...#{existing_commits.last.short_id}" - else - "#{existing_commits.first.short_id}..#{existing_commits.last.short_id}" - end - end - - commits_text = ActionController::Base.helpers.pluralize(existing_commits.length, 'commit') - - branch = - if merge_request.for_fork? - "#{merge_request.target_project_namespace}:#{merge_request.target_branch}" - else - merge_request.target_branch - end - - message = "* #{commit_ids} - #{commits_text} from branch `#{branch}`" - body << message - body << "\n" - end - - new_commits.each do |commit| - message = "* #{commit.short_id} - #{commit.title}" - body << message - body << "\n" - end - - create( - noteable: merge_request, - project: project, - author: author, - note: body, - system: true - ) - end - - def discussions_from_notes(notes) - discussion_ids = [] - discussions = [] - - notes.each do |note| - next if discussion_ids.include?(note.discussion_id) - - # don't group notes for the main target - if !note.for_diff_line? && note.noteable_type == "MergeRequest" - discussions << [note] - else - discussions << notes.select do |other_note| - note.discussion_id == other_note.discussion_id - end - discussion_ids << note.discussion_id - end - end - - discussions - end - - def build_discussion_id(type, id, line_code) - [:discussion, type.try(:underscore), id, line_code].join("-").to_sym - end - - # Determine if cross reference note should be created. - # eg. mentioning a commit in MR comments which exists inside a MR - # should not create "mentioned in" note. - def cross_reference_disallowed?(noteable, mentioner) - if mentioner.kind_of?(MergeRequest) - mentioner.commits.map(&:id).include? noteable.id - end - end - - # Determine whether or not a cross-reference note already exists. - def cross_reference_exists?(noteable, mentioner) - gfm_reference = mentioner_gfm_ref(noteable, mentioner) - notes = if noteable.is_a?(Commit) - where(commit_id: noteable.id) - else - where(noteable_id: noteable.id) - end - - notes.where('note like ?', cross_reference_note_pattern(gfm_reference)). - system.any? - end - - def search(query) - where("note like :query", query: "%#{query}%") - end - - def cross_reference_note_prefix - 'mentioned in ' - end - - private - - def cross_reference_note_content(gfm_reference) - cross_reference_note_prefix + "#{gfm_reference}" - end - - def cross_reference_note_pattern(gfm_reference) - # Older cross reference notes contained underscores for emphasis - "%" + cross_reference_note_content(gfm_reference) + "%" - end - - # Prepend the mentioner's namespaced project path to the GFM reference for - # cross-project references. For same-project references, return the - # unmodified GFM reference. - def mentioner_gfm_ref(noteable, mentioner, project = nil) - if mentioner.is_a?(Commit) - if project.nil? - return mentioner.gfm_reference.sub('commit ', 'commit %') - else - mentioning_project = project - end - else - mentioning_project = mentioner.project - end - - noteable_project_id = noteable_project_id(noteable, mentioning_project) - - full_gfm_reference(mentioning_project, noteable_project_id, mentioner) - end - - # Return the ID of the project that +noteable+ belongs to, or nil if - # +noteable+ is a commit and is not part of the project that owns - # +mentioner+. - def noteable_project_id(noteable, mentioning_project) - if noteable.is_a?(Commit) - if mentioning_project.repository.commit(noteable.id) - # The noteable commit belongs to the mentioner's project - mentioning_project.id - else - nil - end - else - noteable.project.id - end - end - - # Return the +mentioner+ GFM reference. If the mentioner and noteable - # projects are not the same, add the mentioning project's path to the - # returned value. - def full_gfm_reference(mentioning_project, noteable_project_id, mentioner) - if mentioning_project.id == noteable_project_id - mentioner.gfm_reference - else - if mentioner.is_a?(Commit) - mentioner.gfm_reference.sub( - /(commit )/, - "\\1#{mentioning_project.path_with_namespace}@" - ) - else - mentioner.gfm_reference.sub( - /(issue |merge request )/, - "\\1#{mentioning_project.path_with_namespace}" - ) - end - end - end - end - - def max_attachment_size - current_application_settings.max_attachment_size.megabytes.to_i - end - - def commit_author - @commit_author ||= - project.team.users.find_by(email: noteable.author_email) || - project.team.users.find_by(name: noteable.author_name) - rescue - nil - end - - def cross_reference? - note.start_with?(self.class.cross_reference_note_prefix) - end - - def find_diff - return nil unless noteable && noteable.diffs.present? - - @diff ||= noteable.diffs.find do |d| - Digest::SHA1.hexdigest(d.new_path) == diff_file_index if d.new_path - end - end - - def hook_attrs - attributes - end - - def set_diff - # First lets find notes with same diff - # before iterating over all mr diffs - diff = diff_for_line_code unless for_merge_request? - diff ||= find_diff - - self.st_diff = diff.to_hash if diff - end - - def diff - @diff ||= Gitlab::Git::Diff.new(st_diff) if st_diff.respond_to?(:map) - end - - def diff_for_line_code - Note.where(noteable_id: noteable_id, noteable_type: noteable_type, line_code: line_code).last.try(:diff) - end - - # Check if such line of code exists in merge request diff - # If exists - its active discussion - # If not - its outdated diff - def active? - return true unless self.diff - return false unless noteable - - noteable.diffs.each do |mr_diff| - next unless mr_diff.new_path == self.diff.new_path - - lines = Gitlab::Diff::Parser.new.parse(mr_diff.diff.lines.to_a) - - lines.each do |line| - if line.text == diff_line - return true - end - end - end - - false - end - - def outdated? - !active? - end - - def diff_file_index - line_code.split('_')[0] if line_code - end - - def diff_file_name - diff.new_path if diff - end - - def file_path - if diff.new_path.present? - diff.new_path - elsif diff.old_path.present? - diff.old_path - end - end - - def diff_old_line - line_code.split('_')[1].to_i if line_code - end - - def diff_new_line - line_code.split('_')[2].to_i if line_code - end - - def generate_line_code(line) - Gitlab::Diff::LineCode.generate(file_path, line.new_pos, line.old_pos) - end - - def diff_line - return @diff_line if @diff_line - - if diff - diff_lines.each do |line| - if generate_line_code(line) == self.line_code - @diff_line = line.text - end - end - end - - @diff_line - end - - def diff_line_type - return @diff_line_type if @diff_line_type - - if diff - diff_lines.each do |line| - if generate_line_code(line) == self.line_code - @diff_line_type = line.type - end - end - end - - @diff_line_type - end - - def truncated_diff_lines - max_number_of_lines = 16 - prev_match_line = nil - prev_lines = [] - - diff_lines.each do |line| - if line.type == "match" - prev_lines.clear - prev_match_line = line - else - prev_lines << line - - break if generate_line_code(line) == self.line_code - - prev_lines.shift if prev_lines.length >= max_number_of_lines - end - end - - prev_lines - end - - def diff_lines - @diff_lines ||= Gitlab::Diff::Parser.new.parse(diff.diff.lines.to_a) - end - - def discussion_id - @discussion_id ||= Note.build_discussion_id(noteable_type, noteable_id || commit_id, line_code) - end - - # Returns true if this is a downvote note, - # otherwise false is returned - def downvote? - votable? && (note.start_with?('-1') || - note.start_with?(':-1:') || - note.start_with?(':thumbsdown:') || - note.start_with?(':thumbs_down_sign:') - ) - end - - def for_commit? - noteable_type == "Commit" - end - - def for_commit_diff_line? - for_commit? && for_diff_line? - end - - def for_diff_line? - line_code.present? - end - - def for_issue? - noteable_type == "Issue" - end - - def for_merge_request? - noteable_type == "MergeRequest" - end - - def for_merge_request_diff_line? - for_merge_request? && for_diff_line? - end - - def for_project_snippet? - noteable_type == "Snippet" - end - - # override to return commits, which are not active record - def noteable - if for_commit? - project.repository.commit(commit_id) - else - super - end - # Temp fix to prevent app crash - # if note commit id doesn't exist - rescue - nil - end - - # Returns true if this is an upvote note, - # otherwise false is returned - def upvote? - votable? && (note.start_with?('+1') || - note.start_with?(':+1:') || - note.start_with?(':thumbsup:') || - note.start_with?(':thumbs_up_sign:') - ) - end - - def superceded?(notes) - return false unless vote? - - notes.each do |note| - next if note == self - - if note.vote? && - self[:author_id] == note[:author_id] && - self[:created_at] <= note[:created_at] - return true - end - end - - false - end - - def vote? - upvote? || downvote? - end - - def votable? - for_issue? || (for_merge_request? && !for_diff_line?) - end - - # Mentionable override. - def gfm_reference - noteable.gfm_reference - end - - # Mentionable override. - def local_reference - noteable - end - - def noteable_type_name - if noteable_type.present? - noteable_type.downcase - end - end - - # FIXME: Hack for polymorphic associations with STI - # For more information visit http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Polymorphic+Associations - def noteable_type=(sType) - super(sType.to_s.classify.constantize.base_class.to_s) - end - - # Reset notes events cache - # - # Since we do cache @event we need to reset cache in special cases: - # * when a note is updated - # * when a note is removed - # Events cache stored like events/23-20130109142513. - # The cache key includes updated_at timestamp. - # Thus it will automatically generate a new fragment - # when the event is updated because the key changes. - def reset_events_cache - Event.reset_event_cache_for(self) - end - - def set_references - notice_added_references(project, author) - end - - def editable? - !read_attribute(:system) - end -end diff --git a/app/models/notification.rb b/app/models/notification.rb deleted file mode 100644 index 1395274173d..00000000000 --- a/app/models/notification.rb +++ /dev/null @@ -1,60 +0,0 @@ -class Notification - # - # Notification levels - # - N_DISABLED = 0 - N_PARTICIPATING = 1 - N_WATCH = 2 - N_GLOBAL = 3 - N_MENTION = 4 - - attr_accessor :target - - class << self - def notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH, N_MENTION] - end - - def options_with_labels - { - disabled: N_DISABLED, - participating: N_PARTICIPATING, - watch: N_WATCH, - mention: N_MENTION, - global: N_GLOBAL - } - end - - def project_notification_levels - [N_DISABLED, N_PARTICIPATING, N_WATCH, N_GLOBAL, N_MENTION] - end - end - - def initialize(target) - @target = target - end - - def disabled? - target.notification_level == N_DISABLED - end - - def participating? - target.notification_level == N_PARTICIPATING - end - - def watch? - target.notification_level == N_WATCH - end - - def global? - target.notification_level == N_GLOBAL - end - - def mention? - target.notification_level == N_MENTION - end - - def level - target.notification_level - end -end diff --git a/app/models/personal_snippet.rb b/app/models/personal_snippet.rb deleted file mode 100644 index 9cee3b70cb3..00000000000 --- a/app/models/personal_snippet.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: snippets -# -# id :integer not null, primary key -# title :string(255) -# content :text -# author_id :integer not null -# project_id :integer -# created_at :datetime -# updated_at :datetime -# file_name :string(255) -# expires_at :datetime -# type :string(255) -# visibility_level :integer default(0), not null -# - -class PersonalSnippet < Snippet -end diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb deleted file mode 100644 index e6e16058d41..00000000000 --- a/app/models/project_services/asana_service.rb +++ /dev/null @@ -1,127 +0,0 @@ -# == 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 -# -require 'asana' - -class AsanaService < Service - prop_accessor :api_key, :restrict_to_branch - validates :api_key, presence: true, if: :activated? - - def title - 'Asana' - end - - def description - 'Asana - Teamwork without email' - end - - def help - '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' - end - - def to_param - 'asana' - end - - def fields - [ - { - type: 'text', - name: 'api_key', - placeholder: 'User API token. User must have access to task, -all comments will be attributed to this user.' - }, - { - type: 'text', - name: 'restrict_to_branch', - placeholder: 'Comma-separated list of branches which will be -automatically inspected. Leave blank to include all branches.' - } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - Asana.configure do |client| - client.api_key = api_key - end - - user = data[:user_name] - branch = Gitlab::Git.ref_name(data[:ref]) - - branch_restriction = restrict_to_branch.to_s - - # check the branch restriction is poplulated and branch is not included - if branch_restriction.length > 0 && branch_restriction.index(branch).nil? - return - end - - project_name = project.name_with_namespace - push_msg = user + ' pushed to branch ' + branch + ' of ' + project_name - - data[:commits].each do |commit| - check_commit(' ( ' + commit[:url] + ' ): ' + commit[:message], push_msg) - end - end - - def check_commit(message, push_msg) - task_list = [] - close_list = [] - - message.split("\n").each do |line| - # look for a task ID or a full Asana url - task_list.concat(line.scan(/#(\d+)/)) - task_list.concat(line.scan(/https:\/\/app\.asana\.com\/\d+\/\d+\/(\d+)/)) - # look for a word starting with 'fix' followed by a task ID - close_list.concat(line.scan(/(fix\w*)\W*#(\d+)/i)) - end - - # post commit to every taskid found - task_list.each do |taskid| - task = Asana::Task.find(taskid[0]) - - if task - task.create_story(text: push_msg + ' ' + message) - end - end - - # close all tasks that had 'fix(ed/es/ing) #:id' in them - close_list.each do |taskid| - task = Asana::Task.find(taskid.last) - - if task - task.modify(completed: true) - end - end - end -end diff --git a/app/models/project_services/assembla_service.rb b/app/models/project_services/assembla_service.rb deleted file mode 100644 index fb7e0c0fb0d..00000000000 --- a/app/models/project_services/assembla_service.rb +++ /dev/null @@ -1,56 +0,0 @@ -# == 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 AssemblaService < Service - include HTTParty - - prop_accessor :token, :subdomain - validates :token, presence: true, if: :activated? - - def title - 'Assembla' - end - - def description - 'Project Management Software (Source Commits Endpoint)' - end - - def to_param - 'assembla' - end - - def fields - [ - { type: 'text', name: 'token', placeholder: '' }, - { type: 'text', name: 'subdomain', placeholder: '' } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - url = "https://atlas.assembla.com/spaces/#{subdomain}/github_tool?secret_key=#{token}" - AssemblaService.post(url, body: { payload: data }.to_json, headers: { 'Content-Type' => 'application/json' }) - end -end diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb deleted file mode 100644 index d8aedbd2ab4..00000000000 --- a/app/models/project_services/bamboo_service.rb +++ /dev/null @@ -1,137 +0,0 @@ -# == 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 BambooService < CiService - include HTTParty - - prop_accessor :bamboo_url, :build_key, :username, :password - - validates :bamboo_url, - presence: true, - format: { with: /\A#{URI.regexp}\z/ }, - if: :activated? - validates :build_key, presence: true, if: :activated? - validates :username, - presence: true, - if: ->(service) { service.password? }, - if: :activated? - validates :password, - presence: true, - if: ->(service) { service.username? }, - if: :activated? - - attr_accessor :response - - after_save :compose_service_hook, if: :activated? - - def compose_service_hook - hook = service_hook || build_service_hook - hook.save - end - - def title - 'Atlassian Bamboo CI' - end - - def description - 'A continuous integration and build server' - end - - def help - 'You must set up automatic revision labeling and a repository trigger in Bamboo.' - end - - def to_param - 'bamboo' - end - - def fields - [ - { type: 'text', name: 'bamboo_url', - placeholder: 'Bamboo root URL like https://bamboo.example.com' }, - { type: 'text', name: 'build_key', - placeholder: 'Bamboo build plan key like KEY' }, - { type: 'text', name: 'username', - placeholder: 'A user with API access, if applicable' }, - { type: 'password', name: 'password' }, - ] - end - - def supported_events - %w(push) - end - - def build_info(sha) - url = URI.parse("#{bamboo_url}/rest/api/latest/result?label=#{sha}") - - if username.blank? && password.blank? - @response = HTTParty.get(parsed_url.to_s, verify: false) - else - get_url = "#{url}&os_authType=basic" - auth = { - username: username, - password: password, - } - @response = HTTParty.get(get_url, verify: false, basic_auth: auth) - end - end - - def build_page(sha, ref) - build_info(sha) if @response.nil? || !@response.code - - if @response.code != 200 || @response['results']['results']['size'] == '0' - # If actual build link can't be determined, send user to build summary page. - "#{bamboo_url}/browse/#{build_key}" - else - # If actual build link is available, go to build result page. - result_key = @response['results']['results']['result']['planResultKey']['key'] - "#{bamboo_url}/browse/#{result_key}" - end - end - - def commit_status(sha, ref) - build_info(sha) if @response.nil? || !@response.code - return :error unless @response.code == 200 || @response.code == 404 - - status = if @response.code == 404 || @response['results']['results']['size'] == '0' - 'Pending' - else - @response['results']['results']['result']['buildState'] - end - - if status.include?('Success') - 'success' - elsif status.include?('Failed') - 'failed' - elsif status.include?('Pending') - 'pending' - else - :error - end - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - # Bamboo requires a GET and does not take any data. - self.class.get("#{bamboo_url}/updateAndBuild.action?buildKey=#{build_key}", - verify: false) - end -end diff --git a/app/models/project_services/buildkite_service.rb b/app/models/project_services/buildkite_service.rb deleted file mode 100644 index a714bc82246..00000000000 --- a/app/models/project_services/buildkite_service.rb +++ /dev/null @@ -1,135 +0,0 @@ -# == 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 -# - -require "addressable/uri" - -class BuildkiteService < CiService - ENDPOINT = "https://buildkite.com" - - prop_accessor :project_url, :token - - validates :project_url, presence: true, if: :activated? - validates :token, presence: true, if: :activated? - - after_save :compose_service_hook, if: :activated? - - def webhook_url - "#{buildkite_endpoint('webhook')}/deliver/#{webhook_token}" - end - - def compose_service_hook - hook = service_hook || build_service_hook - hook.url = webhook_url - hook.save - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - service_hook.execute(data) - end - - def commit_status(sha, ref) - response = HTTParty.get(commit_status_path(sha), verify: false) - - if response.code == 200 && response['status'] - response['status'] - else - :error - end - end - - def commit_status_path(sha) - "#{buildkite_endpoint('gitlab')}/status/#{status_token}.json?commit=#{sha}" - end - - def build_page(sha, ref) - "#{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 - - def description - 'Continuous integration and deployments' - end - - def to_param - 'buildkite' - end - - def fields - [ - { type: 'text', - name: 'token', - placeholder: 'Buildkite project GitLab token' }, - - { type: 'text', - name: 'project_url', - placeholder: "#{ENDPOINT}/example/project" } - ] - end - - private - - def webhook_token - token_parts.first - end - - def status_token - token_parts.second - end - - def token_parts - if token.present? - token.split(':') - else - [] - end - end - - def buildkite_endpoint(subdomain = nil) - if subdomain.present? - uri = Addressable::URI.parse(ENDPOINT) - new_endpoint = "#{uri.scheme || 'http'}://#{subdomain}.#{uri.host}" - - if uri.port.present? - "#{new_endpoint}:#{uri.port}" - else - new_endpoint - end - else - ENDPOINT - end - end -end diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb deleted file mode 100644 index e591afdda64..00000000000 --- a/app/models/project_services/campfire_service.rb +++ /dev/null @@ -1,86 +0,0 @@ -# == 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 CampfireService < Service - prop_accessor :token, :subdomain, :room - validates :token, presence: true, if: :activated? - - def title - 'Campfire' - end - - def description - 'Simple web-based real-time group chat' - end - - def to_param - 'campfire' - end - - def fields - [ - { type: 'text', name: 'token', placeholder: '' }, - { type: 'text', name: 'subdomain', placeholder: '' }, - { type: 'text', name: 'room', placeholder: '' } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - room = gate.find_room_by_name(self.room) - return true unless room - - message = build_message(data) - - room.speak(message) - end - - private - - def gate - @gate ||= Tinder::Campfire.new(subdomain, token: token) - end - - def build_message(push) - ref = Gitlab::Git.ref_name(push[:ref]) - before = push[:before] - after = push[:after] - - message = "" - message << "[#{project.name_with_namespace}] " - message << "#{push[:user_name]} " - - if Gitlab::Git.blank_ref?(before) - message << "pushed new branch #{ref} \n" - elsif Gitlab::Git.blank_ref?(after) - message << "removed branch #{ref} \n" - else - message << "pushed #{push[:total_commits_count]} commits to #{ref}. " - message << "#{project.web_url}/compare/#{before}...#{after}" - end - - message - end -end diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb deleted file mode 100644 index 1a36e439245..00000000000 --- a/app/models/project_services/ci_service.rb +++ /dev/null @@ -1,57 +0,0 @@ -# == 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) -# - -# Base class for CI services -# List methods you need to implement to get your CI service -# working with GitLab Merge Requests -class CiService < Service - def category - :ci - end - - def supported_events - %w(push) - end - - # Return complete url to build page - # - # Ex. - # http://jenkins.example.com:8888/job/test1/scm/bySHA1/12d65c - # - def build_page(sha, ref) - # implement inside child - end - - # Return string with build status or :error symbol - # - # Allowed states: 'success', 'failed', 'running', 'pending' - # - # - # Ex. - # @service.commit_status('13be4ac') - # # => 'success' - # - # @service.commit_status('2abe4ac') - # # => 'running' - # - # - def commit_status(sha, ref) - # implement inside child - end -end diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb deleted file mode 100644 index 8d25f627870..00000000000 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ /dev/null @@ -1,57 +0,0 @@ -# == 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) -# - -class CustomIssueTrackerService < IssueTrackerService - - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url - - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Custom Issue Tracker' - end - end - - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Custom issue tracker' - end - end - - def to_param - 'custom_issue_tracker' - end - - def fields - [ - { type: 'text', name: 'title', placeholder: title }, - { type: 'text', name: 'description', placeholder: description }, - { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } - ] - end - - def initialize_properties - self.properties = {} if properties.nil? - end -end diff --git a/app/models/project_services/emails_on_push_service.rb b/app/models/project_services/emails_on_push_service.rb deleted file mode 100644 index 6f6e5950aab..00000000000 --- a/app/models/project_services/emails_on_push_service.rb +++ /dev/null @@ -1,72 +0,0 @@ -# == 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) -# - -class EmailsOnPushService < Service - prop_accessor :send_from_committer_email - prop_accessor :disable_diffs - prop_accessor :recipients - validates :recipients, presence: true, if: :activated? - - def title - 'Emails on push' - end - - def description - 'Email the commits and diff of each push to a list of recipients.' - end - - def to_param - 'emails_on_push' - end - - def supported_events - %w(push tag_push) - end - - def execute(push_data) - return unless supported_events.include?(push_data[:object_kind]) - - EmailsOnPushWorker.perform_async( - project_id, - recipients, - push_data, - send_from_committer_email: send_from_committer_email?, - disable_diffs: disable_diffs? - ) - end - - def send_from_committer_email? - self.send_from_committer_email == "1" - end - - def disable_diffs? - self.disable_diffs == "1" - end - - def fields - domains = Notify.allowed_email_domains.map { |domain| "user@#{domain}" }.join(", ") - [ - { type: 'checkbox', name: 'send_from_committer_email', title: "Send from committer", - help: "Send notifications from the committer's email address if the domain is part of the domain GitLab is running on (e.g. #{domains})." }, - { type: 'checkbox', name: 'disable_diffs', title: "Disable code diffs", - help: "Don't include possibly sensitive code diffs in notification body." }, - { type: 'textarea', name: 'recipients', placeholder: 'Emails separated by whitespace' }, - ] - end -end diff --git a/app/models/project_services/external_wiki_service.rb b/app/models/project_services/external_wiki_service.rb deleted file mode 100644 index a199d0e86f2..00000000000 --- a/app/models/project_services/external_wiki_service.rb +++ /dev/null @@ -1,48 +0,0 @@ -# == 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 -# - -class ExternalWikiService < Service - include HTTParty - - prop_accessor :external_wiki_url - validates :external_wiki_url, - presence: true, - format: { with: /\A#{URI.regexp}\z/ }, - if: :activated? - - def title - 'External Wiki' - end - - def description - 'Replaces the link to the internal wiki with a link to an external wiki.' - end - - def to_param - 'external_wiki' - end - - def fields - [ - { type: 'text', name: 'external_wiki_url', placeholder: 'The URL of the external Wiki' }, - ] - end - - def execute(_data) - @response = HTTParty.get(properties['external_wiki_url'], verify: true) rescue nil - if @response !=200 - nil - end - end -end diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb deleted file mode 100644 index 99e361dd6ed..00000000000 --- a/app/models/project_services/flowdock_service.rb +++ /dev/null @@ -1,62 +0,0 @@ -# == 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) -# - -require "flowdock-git-hook" - -class FlowdockService < Service - prop_accessor :token - validates :token, presence: true, if: :activated? - - def title - 'Flowdock' - end - - def description - 'Flowdock is a collaboration web app for technical teams.' - end - - def to_param - 'flowdock' - end - - def fields - [ - { type: 'text', name: 'token', placeholder: '' } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - Flowdock::Git.post( - data[:ref], - data[:before], - data[:after], - token: token, - repo: project.repository.path_to_repo, - repo_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}", - commit_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/%s", - diff_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/compare/%s...%s", - ) - end -end diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb deleted file mode 100644 index 4e75bdfc953..00000000000 --- a/app/models/project_services/gemnasium_service.rb +++ /dev/null @@ -1,61 +0,0 @@ -# == 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) -# - -require "gemnasium/gitlab_service" - -class GemnasiumService < Service - prop_accessor :token, :api_key - validates :token, :api_key, presence: true, if: :activated? - - def title - 'Gemnasium' - end - - def description - 'Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities.' - end - - def to_param - 'gemnasium' - end - - def fields - [ - { type: 'text', name: 'api_key', placeholder: 'Your personal API KEY on gemnasium.com ' }, - { type: 'text', name: 'token', placeholder: 'The project\'s slug on gemnasium.com' } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - Gemnasium::GitlabService.execute( - ref: data[:ref], - before: data[:before], - after: data[:after], - token: token, - api_key: api_key, - repo: project.repository.path_to_repo - ) - end -end diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb deleted file mode 100644 index 0f9838a575d..00000000000 --- a/app/models/project_services/gitlab_ci_service.rb +++ /dev/null @@ -1,128 +0,0 @@ -# == 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) -# - -class GitlabCiService < CiService - API_PREFIX = "api/v1" - - prop_accessor :project_url, :token - validates :project_url, presence: true, 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 = [project_url, "/build", "?token=#{token}"].join("") - hook.save - end - - def supported_events - %w(push tag_push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - service_hook.execute(data) - end - - def commit_status_path(sha, ref) - 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 - end - end - - def fork_registration(new_project, private_token) - params = { - id: new_project.id, - name_with_namespace: new_project.name_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 - ) - end - - def commit_coverage(sha, ref) - response = get_ci_build(sha, ref) - - if response.code == 200 and response["coverage"] - response["coverage"] - end - end - - def build_page(sha, ref) - 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 - end - - def title - 'GitLab CI' - end - - def description - 'Continuous integration server from GitLab' - end - - def to_param - 'gitlab_ci' - 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 - - def fork_registration_path - project_url.sub(/projects\/\d*/, "#{API_PREFIX}/forks") - end -end diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb deleted file mode 100644 index 5f0553f3b0b..00000000000 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ /dev/null @@ -1,62 +0,0 @@ -# == 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 GitlabIssueTrackerService < IssueTrackerService - include Rails.application.routes.url_helpers - - 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 - - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url - - def default? - true - end - - def to_param - 'gitlab' - end - - def project_url - namespace_project_issues_url(project.namespace, project) - end - - def new_issue_url - new_namespace_project_issue_url(namespace_id: project.namespace, project_id: project) - end - - def issue_url(iid) - namespace_project_issue_url(namespace_id: project.namespace, project_id: project, id: iid) - end - - def project_path - namespace_project_issues_path(project.namespace, project) - end - - def new_issue_path - new_namespace_project_issue_path(namespace_id: project.namespace, project_id: project) - end - - def issue_path(iid) - namespace_project_issue_path(namespace_id: project.namespace, project_id: project, id: iid) - end -end diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb deleted file mode 100644 index d264a56ebdf..00000000000 --- a/app/models/project_services/hipchat_service.rb +++ /dev/null @@ -1,238 +0,0 @@ -# == 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) -# - -class HipchatService < Service - MAX_COMMITS = 3 - - prop_accessor :token, :room, :server - validates :token, presence: true, if: :activated? - - def title - 'HipChat' - end - - def description - 'Private group chat and IM' - end - - def to_param - 'hipchat' - end - - def fields - [ - { type: 'text', name: 'token', placeholder: 'Room token' }, - { type: 'text', name: 'room', placeholder: 'Room name or ID' }, - { type: 'text', name: 'server', - placeholder: 'Leave blank for default. https://hipchat.example.com' } - ] - end - - def supported_events - %w(push issue merge_request note tag_push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - gate[room].send('GitLab', create_message(data)) - end - - private - - def gate - options = { api_version: 'v2' } - options[:server_url] = server unless server.blank? - @gate ||= HipChat::Client.new(token, options) - end - - def create_message(data) - object_kind = data[:object_kind] - - message = \ - case object_kind - when "push", "tag_push" - create_push_message(data) - when "issue" - create_issue_message(data) unless is_update?(data) - when "merge_request" - create_merge_request_message(data) unless is_update?(data) - when "note" - create_note_message(data) - end - end - - def create_push_message(push) - ref_type = Gitlab::Git.tag_ref?(push[:ref]) ? 'tag' : 'branch' - ref = Gitlab::Git.ref_name(push[:ref]) - - before = push[:before] - after = push[:after] - - message = "" - message << "#{push[:user_name]} " - if Gitlab::Git.blank_ref?(before) - message << "pushed new #{ref_type} #{ref}"\ - " to #{project_link}\n" - elsif Gitlab::Git.blank_ref?(after) - message << "removed #{ref_type} #{ref} from #{project_name} \n" - else - message << "pushed to #{ref_type} #{ref} " - message << "of #{project.name_with_namespace.gsub!(/\s/,'')} " - message << "(Compare changes)" - - push[:commits].take(MAX_COMMITS).each do |commit| - message << "
    - #{commit[:message].lines.first} (#{commit[:id][0..5]})" - end - - if push[:commits].count > MAX_COMMITS - message << "
    ... #{push[:commits].count - MAX_COMMITS} more commits" - end - end - - message - end - - def format_body(body) - if body - body = body.truncate(200, separator: ' ', omission: '...') - end - - "

    #{body}
    " - end - - def create_issue_message(data) - user_name = data[:user][:name] - - obj_attr = data[:object_attributes] - obj_attr = HashWithIndifferentAccess.new(obj_attr) - title = obj_attr[:title] - state = obj_attr[:state] - issue_iid = obj_attr[:iid] - issue_url = obj_attr[:url] - description = obj_attr[:description] - - issue_link = "issue ##{issue_iid}" - message = "#{user_name} #{state} #{issue_link} in #{project_link}: #{title}" - - if description - description = format_body(description) - message << description - end - - message - end - - def create_merge_request_message(data) - user_name = data[:user][:name] - - obj_attr = data[:object_attributes] - obj_attr = HashWithIndifferentAccess.new(obj_attr) - merge_request_id = obj_attr[:iid] - source_branch = obj_attr[:source_branch] - target_branch = obj_attr[:target_branch] - state = obj_attr[:state] - description = obj_attr[:description] - title = obj_attr[:title] - - merge_request_url = "#{project_url}/merge_requests/#{merge_request_id}" - merge_request_link = "merge request ##{merge_request_id}" - message = "#{user_name} #{state} #{merge_request_link} in " \ - "#{project_link}: #{title}" - - if description - description = format_body(description) - message << description - end - - message - end - - def format_title(title) - "" + title.lines.first.chomp + "" - end - - def create_note_message(data) - data = HashWithIndifferentAccess.new(data) - user_name = data[:user][:name] - - repo_attr = HashWithIndifferentAccess.new(data[:repository]) - - obj_attr = HashWithIndifferentAccess.new(data[:object_attributes]) - note = obj_attr[:note] - note_url = obj_attr[:url] - noteable_type = obj_attr[:noteable_type] - - case noteable_type - when "Commit" - commit_attr = HashWithIndifferentAccess.new(data[:commit]) - subject_desc = commit_attr[:id] - subject_desc = Commit.truncate_sha(subject_desc) - subject_type = "commit" - title = format_title(commit_attr[:message]) - when "Issue" - subj_attr = HashWithIndifferentAccess.new(data[:issue]) - subject_id = subj_attr[:iid] - subject_desc = "##{subject_id}" - subject_type = "issue" - title = format_title(subj_attr[:title]) - when "MergeRequest" - subj_attr = HashWithIndifferentAccess.new(data[:merge_request]) - subject_id = subj_attr[:iid] - subject_desc = "##{subject_id}" - subject_type = "merge request" - title = format_title(subj_attr[:title]) - when "Snippet" - subj_attr = HashWithIndifferentAccess.new(data[:snippet]) - subject_id = subj_attr[:id] - subject_desc = "##{subject_id}" - subject_type = "snippet" - title = format_title(subj_attr[:title]) - end - - subject_html = "#{subject_type} #{subject_desc}" - message = "#{user_name} commented on #{subject_html} in #{project_link}: " - message << title - - if note - note = format_body(note) - message << note - end - - message - end - - def project_name - project.name_with_namespace.gsub(/\s/, '') - end - - def project_url - project.web_url - end - - def project_link - "#{project_name}" - end - - def is_update?(data) - data[:object_attributes][:action] == 'update' - end -end diff --git a/app/models/project_services/irker_service.rb b/app/models/project_services/irker_service.rb deleted file mode 100644 index e9e1e276e7d..00000000000 --- a/app/models/project_services/irker_service.rb +++ /dev/null @@ -1,163 +0,0 @@ -# == 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) -# - -require 'uri' - -class IrkerService < Service - prop_accessor :colorize_messages, :recipients, :channels - validates :recipients, presence: true, if: :activated? - validate :check_recipients_count, if: :activated? - - before_validation :get_channels - after_initialize :initialize_settings - - # Writer for RSpec tests - attr_writer :settings - - def initialize_settings - # See the documentation (doc/project_services/irker.md) for possible values - # here - @settings ||= { - server_ip: 'localhost', - server_port: 6659, - max_channels: 3, - default_irc_uri: nil - } - end - - def title - 'Irker (IRC gateway)' - end - - def description - 'Send IRC messages, on update, to a list of recipients through an Irker '\ - 'gateway.' - end - - def help - msg = 'Recipients have to be specified with a full URI: '\ - 'irc[s]://irc.network.net[:port]/#channel. Special cases: if you want '\ - 'the channel to be a nickname instead, append ",isnick" to the channel '\ - 'name; if the channel is protected by a secret password, append '\ - '"?key=secretpassword" to the URI.' - - unless @settings[:default_irc].nil? - msg += ' Note that a default IRC URI is provided by this service\'s '\ - "administrator: #{default_irc}. You can thus just give a channel name." - end - msg - end - - def to_param - 'irker' - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - IrkerWorker.perform_async(project_id, channels, - colorize_messages, data, @settings) - end - - def fields - [ - { type: 'textarea', name: 'recipients', - placeholder: 'Recipients/channels separated by whitespaces' }, - { type: 'checkbox', name: 'colorize_messages' }, - ] - end - - private - - def check_recipients_count - return true if recipients.nil? || recipients.empty? - - if recipients.split(/\s+/).count > max_chans - errors.add(:recipients, "are limited to #{max_chans}") - end - end - - def max_chans - @settings[:max_channels] - end - - def get_channels - return true unless :activated? - return true if recipients.nil? || recipients.empty? - - map_recipients - - errors.add(:recipients, 'are all invalid') if channels.empty? - true - end - - def map_recipients - self.channels = recipients.split(/\s+/).map do |recipient| - format_channel default_irc_uri, recipient - end - channels.reject! &:nil? - end - - def default_irc_uri - default_irc = @settings[:default_irc_uri] - if !(default_irc.nil? || default_irc[-1] == '/') - default_irc += '/' - end - default_irc - end - - def format_channel(default_irc, recipient) - cnt = 0 - url = nil - - # Try to parse the chan as a full URI - begin - uri = URI.parse(recipient) - raise URI::InvalidURIError if uri.scheme.nil? && cnt == 0 - rescue URI::InvalidURIError - unless default_irc.nil? - cnt += 1 - recipient = "#{default_irc}#{recipient}" - retry if cnt == 1 - end - else - url = consider_uri uri - end - url - end - - def consider_uri(uri) - # Authorize both irc://domain.com/#chan and irc://domain.com/chan - if uri.is_a?(URI) && uri.scheme[/^ircs?\z/] && !uri.path.nil? - # Do not authorize irc://domain.com/ - if uri.fragment.nil? && uri.path.length > 1 - uri.to_s - else - # Authorize irc://domain.com/smthg#chan - # The irker daemon will deal with it by concatenating smthg and - # chan, thus sending messages on #smthgchan - uri.to_s - end - end - end -end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb deleted file mode 100644 index c8ab9d63b74..00000000000 --- a/app/models/project_services/issue_tracker_service.rb +++ /dev/null @@ -1,125 +0,0 @@ -# == 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 IssueTrackerService < Service - - validates :project_url, :issues_url, :new_issue_url, presence: true, if: :activated? - - def category - :issue_tracker - end - - def default? - false - end - - def issue_url(iid) - self.issues_url.gsub(':id', iid.to_s) - end - - def project_path - project_url - end - - def new_issue_path - new_issue_url - end - - def issue_path(iid) - issue_url(iid) - end - - def fields - [ - { type: 'text', name: 'description', placeholder: description }, - { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } - ] - end - - def initialize_properties - if properties.nil? - if enabled_in_gitlab_config - self.properties = { - title: issues_tracker['title'], - project_url: add_issues_tracker_id(issues_tracker['project_url']), - issues_url: add_issues_tracker_id(issues_tracker['issues_url']), - new_issue_url: add_issues_tracker_id(issues_tracker['new_issue_url']) - } - else - self.properties = {} - end - end - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - message = "#{self.type} was unable to reach #{self.project_url}. Check the url and try again." - result = false - - begin - url = URI.parse(self.project_url) - - if url.host && url.port - http = Net::HTTP.start(url.host, url.port, { open_timeout: 5, read_timeout: 5 }) - response = http.head("/") - - if response - message = "#{self.type} received response #{response.code} when attempting to connect to #{self.project_url}" - result = true - end - end - rescue Timeout::Error, SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED => error - message = "#{self.type} had an error when trying to connect to #{self.project_url}: #{error.message}" - end - Rails.logger.info(message) - result - end - - private - - def enabled_in_gitlab_config - Gitlab.config.issues_tracker && - Gitlab.config.issues_tracker.values.any? && - issues_tracker - end - - def issues_tracker - Gitlab.config.issues_tracker[to_param] - end - - def add_issues_tracker_id(url) - if self.project - id = self.project.issues_tracker_id - - if id - url = url.gsub(":issues_tracker_id", id) - end - end - - url - end -end diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb deleted file mode 100644 index fcd9dc2f336..00000000000 --- a/app/models/project_services/jira_service.rb +++ /dev/null @@ -1,58 +0,0 @@ -# == 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 JiraService < IssueTrackerService - include Rails.application.routes.url_helpers - - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url - - def help - issue_tracker_link = help_page_path("integration", "external-issue-tracker") - - line1 = "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](#{issue_tracker_link}) for details." - - line2 = '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)' - - [line1, line2].join("\n\n") - end - - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'JIRA' - end - end - - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Jira issue tracker' - end - end - - def to_param - 'jira' - end -end diff --git a/app/models/project_services/pivotaltracker_service.rb b/app/models/project_services/pivotaltracker_service.rb deleted file mode 100644 index ade9ee97873..00000000000 --- a/app/models/project_services/pivotaltracker_service.rb +++ /dev/null @@ -1,72 +0,0 @@ -# == 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 PivotaltrackerService < Service - include HTTParty - - prop_accessor :token - validates :token, presence: true, if: :activated? - - def title - 'PivotalTracker' - end - - def description - 'Project Management Software (Source Commits Endpoint)' - end - - def to_param - 'pivotaltracker' - end - - def fields - [ - { type: 'text', name: 'token', placeholder: '' } - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - url = 'https://www.pivotaltracker.com/services/v5/source_commits' - data[:commits].each do |commit| - message = { - 'source_commit' => { - 'commit_id' => commit[:id], - 'author' => commit[:author][:name], - 'url' => commit[:url], - 'message' => commit[:message] - } - } - PivotaltrackerService.post( - url, - body: message.to_json, - headers: { - 'Content-Type' => 'application/json', - 'X-TrackerToken' => token - } - ) - end - end -end diff --git a/app/models/project_services/pushover_service.rb b/app/models/project_services/pushover_service.rb deleted file mode 100644 index 53edf522e9a..00000000000 --- a/app/models/project_services/pushover_service.rb +++ /dev/null @@ -1,125 +0,0 @@ -# == 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 PushoverService < Service - include HTTParty - base_uri 'https://api.pushover.net/1' - - prop_accessor :api_key, :user_key, :device, :priority, :sound - validates :api_key, :user_key, :priority, presence: true, if: :activated? - - def title - 'Pushover' - end - - def description - 'Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop.' - end - - def to_param - 'pushover' - end - - def fields - [ - { type: 'text', name: 'api_key', placeholder: 'Your application key' }, - { type: 'text', name: 'user_key', placeholder: 'Your user key' }, - { type: 'text', name: 'device', placeholder: 'Leave blank for all active devices' }, - { type: 'select', name: 'priority', choices: - [ - ['Lowest Priority', -2], - ['Low Priority', -1], - ['Normal Priority', 0], - ['High Priority', 1] - ], - default_choice: 0 - }, - { type: 'select', name: 'sound', choices: - [ - ['Device default sound', nil], - ['Pushover (default)', 'pushover'], - ['Bike', 'bike'], - ['Bugle', 'bugle'], - ['Cash Register', 'cashregister'], - ['Classical', 'classical'], - ['Cosmic', 'cosmic'], - ['Falling', 'falling'], - ['Gamelan', 'gamelan'], - ['Incoming', 'incoming'], - ['Intermission', 'intermission'], - ['Magic', 'magic'], - ['Mechanical', 'mechanical'], - ['Piano Bar', 'pianobar'], - ['Siren', 'siren'], - ['Space Alarm', 'spacealarm'], - ['Tug Boat', 'tugboat'], - ['Alien Alarm (long)', 'alien'], - ['Climb (long)', 'climb'], - ['Persistent (long)', 'persistent'], - ['Pushover Echo (long)', 'echo'], - ['Up Down (long)', 'updown'], - ['None (silent)', 'none'] - ] - }, - ] - end - - def supported_events - %w(push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - ref = Gitlab::Git.ref_name(data[:ref]) - before = data[:before] - after = data[:after] - - if Gitlab::Git.blank_ref?(before) - message = "#{data[:user_name]} pushed new branch \"#{ref}\"." - elsif Gitlab::Git.blank_ref?(after) - message = "#{data[:user_name]} deleted branch \"#{ref}\"." - else - message = "#{data[:user_name]} push to branch \"#{ref}\"." - end - - if data[:total_commits_count] > 0 - message << "\nTotal commits count: #{data[:total_commits_count]}" - end - - pushover_data = { - token: api_key, - user: user_key, - device: device, - priority: priority, - title: "#{project.name_with_namespace}", - message: message, - url: data[:repository][:homepage], - url_title: "See project #{project.name_with_namespace}" - } - - # Sound parameter MUST NOT be sent to API if not selected - if sound - pushover_data.merge!(sound: sound) - end - - PushoverService.post('/messages.json', body: pushover_data) - end -end diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb deleted file mode 100644 index dd9ba97ee1f..00000000000 --- a/app/models/project_services/redmine_service.rb +++ /dev/null @@ -1,44 +0,0 @@ -# == 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 RedmineService < IssueTrackerService - - prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url - - def title - if self.properties && self.properties['title'].present? - self.properties['title'] - else - 'Redmine' - end - end - - def description - if self.properties && self.properties['description'].present? - self.properties['description'] - else - 'Redmine issue tracker' - end - end - - def to_param - 'redmine' - end -end diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb deleted file mode 100644 index 36d9874edd3..00000000000 --- a/app/models/project_services/slack_service.rb +++ /dev/null @@ -1,105 +0,0 @@ -# == 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 SlackService < Service - prop_accessor :webhook, :username, :channel - validates :webhook, presence: true, if: :activated? - - def title - 'Slack' - end - - def description - 'A team communication tool for the 21st century' - end - - def to_param - 'slack' - end - - def fields - [ - { type: 'text', name: 'webhook', - placeholder: 'https://hooks.slack.com/services/...' }, - { type: 'text', name: 'username', placeholder: 'username' }, - { type: 'text', name: 'channel', placeholder: '#channel' } - ] - end - - def supported_events - %w(push issue merge_request note tag_push) - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - return unless webhook.present? - - object_kind = data[:object_kind] - - data = data.merge( - project_url: project_url, - project_name: project_name - ) - - # WebHook events often have an 'update' event that follows a 'open' or - # 'close' action. Ignore update events for now to prevent duplicate - # messages from arriving. - - message = \ - case object_kind - when "push", "tag_push" - PushMessage.new(data) - when "issue" - IssueMessage.new(data) unless is_update?(data) - when "merge_request" - MergeMessage.new(data) unless is_update?(data) - when "note" - NoteMessage.new(data) - end - - opt = {} - opt[:channel] = channel if channel - opt[:username] = username if username - - if message - notifier = Slack::Notifier.new(webhook, opt) - notifier.ping(message.pretext, attachments: message.attachments) - end - end - - private - - def project_name - project.name_with_namespace.gsub(/\s/, '') - end - - def project_url - project.web_url - end - - def is_update?(data) - data[:object_attributes][:action] == 'update' - end -end - -require "slack_service/issue_message" -require "slack_service/push_message" -require "slack_service/merge_message" -require "slack_service/note_message" diff --git a/app/models/project_services/slack_service/base_message.rb b/app/models/project_services/slack_service/base_message.rb deleted file mode 100644 index aa00d6061a1..00000000000 --- a/app/models/project_services/slack_service/base_message.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'slack-notifier' - -class SlackService - class BaseMessage - def initialize(params) - raise NotImplementedError - end - - def pretext - format(message) - end - - def attachments - raise NotImplementedError - end - - private - - def message - raise NotImplementedError - end - - def format(string) - Slack::Notifier::LinkFormatter.format(string) - end - - def attachment_color - '#345' - end - end -end diff --git a/app/models/project_services/slack_service/issue_message.rb b/app/models/project_services/slack_service/issue_message.rb deleted file mode 100644 index 5af24a80609..00000000000 --- a/app/models/project_services/slack_service/issue_message.rb +++ /dev/null @@ -1,56 +0,0 @@ -class SlackService - class IssueMessage < BaseMessage - attr_reader :user_name - attr_reader :title - attr_reader :project_name - attr_reader :project_url - attr_reader :issue_iid - attr_reader :issue_url - attr_reader :action - attr_reader :state - attr_reader :description - - def initialize(params) - @user_name = params[:user][:name] - @project_name = params[:project_name] - @project_url = params[:project_url] - - obj_attr = params[:object_attributes] - obj_attr = HashWithIndifferentAccess.new(obj_attr) - @title = obj_attr[:title] - @issue_iid = obj_attr[:iid] - @issue_url = obj_attr[:url] - @action = obj_attr[:action] - @state = obj_attr[:state] - @description = obj_attr[:description] - end - - def attachments - return [] unless opened_issue? - - description_message - end - - private - - def message - "#{user_name} #{state} #{issue_link} in #{project_link}: *#{title}*" - end - - def opened_issue? - action == "open" - end - - def description_message - [{ text: format(description), color: attachment_color }] - end - - def project_link - "[#{project_name}](#{project_url})" - end - - def issue_link - "[issue ##{issue_iid}](#{issue_url})" - end - end -end diff --git a/app/models/project_services/slack_service/merge_message.rb b/app/models/project_services/slack_service/merge_message.rb deleted file mode 100644 index e792c258f73..00000000000 --- a/app/models/project_services/slack_service/merge_message.rb +++ /dev/null @@ -1,60 +0,0 @@ -class SlackService - class MergeMessage < BaseMessage - attr_reader :user_name - attr_reader :project_name - attr_reader :project_url - attr_reader :merge_request_id - attr_reader :source_branch - attr_reader :target_branch - attr_reader :state - attr_reader :title - - def initialize(params) - @user_name = params[:user][:name] - @project_name = params[:project_name] - @project_url = params[:project_url] - - obj_attr = params[:object_attributes] - obj_attr = HashWithIndifferentAccess.new(obj_attr) - @merge_request_id = obj_attr[:iid] - @source_branch = obj_attr[:source_branch] - @target_branch = obj_attr[:target_branch] - @state = obj_attr[:state] - @title = format_title(obj_attr[:title]) - end - - def pretext - format(message) - end - - def attachments - [] - end - - private - - def format_title(title) - '*' + title.lines.first.chomp + '*' - end - - def message - merge_request_message - end - - def project_link - "[#{project_name}](#{project_url})" - end - - def merge_request_message - "#{user_name} #{state} #{merge_request_link} in #{project_link}: #{title}" - end - - def merge_request_link - "[merge request ##{merge_request_id}](#{merge_request_url})" - end - - def merge_request_url - "#{project_url}/merge_requests/#{merge_request_id}" - end - end -end diff --git a/app/models/project_services/slack_service/note_message.rb b/app/models/project_services/slack_service/note_message.rb deleted file mode 100644 index 074478b292d..00000000000 --- a/app/models/project_services/slack_service/note_message.rb +++ /dev/null @@ -1,82 +0,0 @@ -class SlackService - class NoteMessage < BaseMessage - attr_reader :message - attr_reader :user_name - attr_reader :project_name - attr_reader :project_link - attr_reader :note - attr_reader :note_url - attr_reader :title - - def initialize(params) - params = HashWithIndifferentAccess.new(params) - @user_name = params[:user][:name] - @project_name = params[:project_name] - @project_url = params[:project_url] - - obj_attr = params[:object_attributes] - obj_attr = HashWithIndifferentAccess.new(obj_attr) - @note = obj_attr[:note] - @note_url = obj_attr[:url] - noteable_type = obj_attr[:noteable_type] - - case noteable_type - when "Commit" - create_commit_note(HashWithIndifferentAccess.new(params[:commit])) - when "Issue" - create_issue_note(HashWithIndifferentAccess.new(params[:issue])) - when "MergeRequest" - create_merge_note(HashWithIndifferentAccess.new(params[:merge_request])) - when "Snippet" - create_snippet_note(HashWithIndifferentAccess.new(params[:snippet])) - end - end - - def attachments - description_message - end - - private - - def format_title(title) - title.lines.first.chomp - end - - def create_commit_note(commit) - commit_sha = commit[:id] - commit_sha = Commit.truncate_sha(commit_sha) - commit_link = "[commit #{commit_sha}](#{@note_url})" - title = format_title(commit[:message]) - @message = "#{@user_name} commented on #{commit_link} in #{project_link}: *#{title}*" - end - - def create_issue_note(issue) - issue_iid = issue[:iid] - note_link = "[issue ##{issue_iid}](#{@note_url})" - title = format_title(issue[:title]) - @message = "#{@user_name} commented on #{note_link} in #{project_link}: *#{title}*" - end - - def create_merge_note(merge_request) - merge_request_id = merge_request[:iid] - merge_request_link = "[merge request ##{merge_request_id}](#{@note_url})" - title = format_title(merge_request[:title]) - @message = "#{@user_name} commented on #{merge_request_link} in #{project_link}: *#{title}*" - end - - def create_snippet_note(snippet) - snippet_id = snippet[:id] - snippet_link = "[snippet ##{snippet_id}](#{@note_url})" - title = format_title(snippet[:title]) - @message = "#{@user_name} commented on #{snippet_link} in #{project_link}: *#{title}*" - end - - def description_message - [{ text: format(@note), color: attachment_color }] - end - - def project_link - "[#{@project_name}](#{@project_url})" - end - end -end diff --git a/app/models/project_services/slack_service/push_message.rb b/app/models/project_services/slack_service/push_message.rb deleted file mode 100644 index b26f3e9ddce..00000000000 --- a/app/models/project_services/slack_service/push_message.rb +++ /dev/null @@ -1,110 +0,0 @@ -class SlackService - class PushMessage < BaseMessage - attr_reader :after - attr_reader :before - attr_reader :commits - attr_reader :project_name - attr_reader :project_url - attr_reader :ref - attr_reader :ref_type - attr_reader :user_name - - def initialize(params) - @after = params[:after] - @before = params[:before] - @commits = params.fetch(:commits, []) - @project_name = params[:project_name] - @project_url = params[:project_url] - @ref_type = Gitlab::Git.tag_ref?(params[:ref]) ? 'tag' : 'branch' - @ref = Gitlab::Git.ref_name(params[:ref]) - @user_name = params[:user_name] - end - - def pretext - format(message) - end - - def attachments - return [] if new_branch? || removed_branch? - - commit_message_attachments - end - - private - - def message - if new_branch? - new_branch_message - elsif removed_branch? - removed_branch_message - else - push_message - end - end - - def format(string) - Slack::Notifier::LinkFormatter.format(string) - end - - def new_branch_message - "#{user_name} pushed new #{ref_type} #{branch_link} to #{project_link}" - end - - def removed_branch_message - "#{user_name} removed #{ref_type} #{ref} from #{project_link}" - end - - def push_message - "#{user_name} pushed to #{ref_type} #{branch_link} of #{project_link} (#{compare_link})" - end - - def commit_messages - commits.map { |commit| compose_commit_message(commit) }.join("\n") - end - - def commit_message_attachments - [{ text: format(commit_messages), color: attachment_color }] - end - - def compose_commit_message(commit) - author = commit[:author][:name] - id = Commit.truncate_sha(commit[:id]) - message = commit[:message] - url = commit[:url] - - "[#{id}](#{url}): #{message} - #{author}" - end - - def new_branch? - Gitlab::Git.blank_ref?(before) - end - - def removed_branch? - Gitlab::Git.blank_ref?(after) - end - - def branch_url - "#{project_url}/commits/#{ref}" - end - - def compare_url - "#{project_url}/compare/#{before}...#{after}" - end - - def branch_link - "[#{ref}](#{branch_url})" - end - - def project_link - "[#{project_name}](#{project_url})" - end - - def compare_link - "[Compare changes](#{compare_url})" - end - - def attachment_color - '#345' - end - end -end diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb deleted file mode 100644 index 3c002a1634b..00000000000 --- a/app/models/project_services/teamcity_service.rb +++ /dev/null @@ -1,145 +0,0 @@ -# == 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 TeamcityService < CiService - include HTTParty - - prop_accessor :teamcity_url, :build_type, :username, :password - - validates :teamcity_url, - presence: true, - format: { with: /\A#{URI.regexp}\z/ }, if: :activated? - validates :build_type, presence: true, if: :activated? - validates :username, - presence: true, - if: ->(service) { service.password? }, if: :activated? - validates :password, - presence: true, - if: ->(service) { service.username? }, if: :activated? - - attr_accessor :response - - after_save :compose_service_hook, if: :activated? - - def compose_service_hook - hook = service_hook || build_service_hook - hook.save - end - - def title - 'JetBrains TeamCity CI' - end - - def description - 'A continuous integration and build server' - end - - def help - '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.' - end - - def to_param - 'teamcity' - end - - def supported_events - %w(push) - end - - def fields - [ - { type: 'text', name: 'teamcity_url', - placeholder: 'TeamCity root URL like https://teamcity.example.com' }, - { type: 'text', name: 'build_type', - placeholder: 'Build configuration ID' }, - { type: 'text', name: 'username', - placeholder: 'A user with permissions to trigger a manual build' }, - { type: 'password', name: 'password' }, - ] - end - - def build_info(sha) - url = URI.parse("#{teamcity_url}/httpAuth/app/rest/builds/"\ - "branch:unspecified:any,number:#{sha}") - auth = { - username: username, - password: password, - } - @response = HTTParty.get("#{url}", verify: false, basic_auth: auth) - end - - def build_page(sha, ref) - build_info(sha) if @response.nil? || !@response.code - - if @response.code != 200 - # If actual build link can't be determined, - # send user to build summary page. - "#{teamcity_url}/viewLog.html?buildTypeId=#{build_type}" - else - # If actual build link is available, go to build result page. - built_id = @response['build']['id'] - "#{teamcity_url}/viewLog.html?buildId=#{built_id}"\ - "&buildTypeId=#{build_type}" - end - end - - def commit_status(sha, ref) - build_info(sha) if @response.nil? || !@response.code - return :error unless @response.code == 200 || @response.code == 404 - - status = if @response.code == 404 - 'Pending' - else - @response['build']['status'] - end - - if status.include?('SUCCESS') - 'success' - elsif status.include?('FAILURE') - 'failed' - elsif status.include?('Pending') - 'pending' - else - :error - end - end - - def execute(data) - return unless supported_events.include?(data[:object_kind]) - - auth = { - username: username, - password: password, - } - - branch = Gitlab::Git.ref_name(data[:ref]) - - self.class.post("#{teamcity_url}/httpAuth/app/rest/buildQueue", - body: ""\ - ""\ - '', - headers: { 'Content-type' => 'application/xml' }, - basic_auth: auth - ) - end -end diff --git a/app/models/project_snippet.rb b/app/models/project_snippet.rb deleted file mode 100644 index 9e2c1b0e18e..00000000000 --- a/app/models/project_snippet.rb +++ /dev/null @@ -1,28 +0,0 @@ -# == Schema Information -# -# Table name: snippets -# -# id :integer not null, primary key -# title :string(255) -# content :text -# author_id :integer not null -# project_id :integer -# created_at :datetime -# updated_at :datetime -# file_name :string(255) -# expires_at :datetime -# type :string(255) -# visibility_level :integer default(0), not null -# - -class ProjectSnippet < Snippet - belongs_to :project - belongs_to :author, class_name: "User" - - validates :project, presence: true - - # Scopes - scope :fresh, -> { order("created_at DESC") } - scope :non_expired, -> { where(["expires_at IS NULL OR expires_at > ?", Time.current]) } - scope :expired, -> { where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) } -end diff --git a/app/models/project_team.rb b/app/models/project_team.rb deleted file mode 100644 index 56e49af2324..00000000000 --- a/app/models/project_team.rb +++ /dev/null @@ -1,169 +0,0 @@ -class ProjectTeam - attr_accessor :project - - def initialize(project) - @project = project - end - - # Shortcut to add users - # - # Use: - # @team << [@user, :master] - # @team << [@users, :master] - # - def <<(args) - users, access, current_user = *args - - if users.respond_to?(:each) - add_users(users, access, current_user) - else - add_user(users, access, current_user) - end - end - - def find(user_id) - user = project.users.find_by(id: user_id) - - if group - user ||= group.users.find_by(id: user_id) - end - - user - end - - def find_member(user_id) - member = project.project_members.find_by(user_id: user_id) - - # If user is not in project members - # we should check for group membership - if group && !member - member = group.group_members.find_by(user_id: user_id) - end - - member - end - - def add_users(users, access, current_user = nil) - ProjectMember.add_users_into_projects( - [project.id], - users, - access, - current_user - ) - end - - def add_user(user, access, current_user = nil) - add_users([user], access, current_user) - end - - # Remove all users from project team - def truncate - ProjectMember.truncate_team(project) - end - - def users - members - end - - def members - @members ||= fetch_members - end - - def guests - @guests ||= fetch_members(:guests) - end - - def reporters - @reporters ||= fetch_members(:reporters) - end - - def developers - @developers ||= fetch_members(:developers) - end - - def masters - @masters ||= fetch_members(:masters) - end - - def import(source_project, current_user = nil) - target_project = project - - source_members = source_project.project_members.to_a - target_user_ids = target_project.project_members.pluck(:user_id) - - source_members.reject! do |member| - # Skip if user already present in team - !member.invite? && target_user_ids.include?(member.user_id) - end - - source_members.map! do |member| - new_member = member.dup - new_member.id = nil - new_member.source = target_project - new_member.created_by = current_user - new_member - end - - ProjectMember.transaction do - source_members.each do |member| - member.save - end - end - - true - rescue - false - end - - def guest?(user) - max_member_access(user.id) == Gitlab::Access::GUEST - end - - def reporter?(user) - max_member_access(user.id) == Gitlab::Access::REPORTER - end - - def developer?(user) - max_member_access(user.id) == Gitlab::Access::DEVELOPER - end - - def master?(user) - max_member_access(user.id) == Gitlab::Access::MASTER - end - - def member?(user_id) - !!find_member(user_id) - end - - def max_member_access(user_id) - access = [] - access << project.project_members.find_by(user_id: user_id).try(:access_field) - - if group - access << group.group_members.find_by(user_id: user_id).try(:access_field) - end - - access.compact.max - end - - private - - def fetch_members(level = nil) - project_members = project.project_members - group_members = group ? group.group_members : [] - - if level - project_members = project_members.send(level) - group_members = group_members.send(level) if group - end - - user_ids = project_members.pluck(:user_id) - user_ids.push(*group_members.pluck(:user_id)) if group - - User.where(id: user_ids) - end - - def group - project.group - end -end diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb deleted file mode 100644 index 772c868d9cd..00000000000 --- a/app/models/project_wiki.rb +++ /dev/null @@ -1,149 +0,0 @@ -class ProjectWiki - include Gitlab::ShellAdapter - - MARKUPS = { - 'Markdown' => :markdown, - 'RDoc' => :rdoc, - 'AsciiDoc' => :asciidoc - } unless defined?(MARKUPS) - - class CouldNotCreateWikiError < StandardError; end - - # Returns a string describing what went wrong after - # an operation fails. - attr_reader :error_message - - def initialize(project, user = nil) - @project = project - @user = user - end - - def path - @project.path + '.wiki' - end - - def path_with_namespace - @project.path_with_namespace + ".wiki" - end - - def url_to_repo - gitlab_shell.url_to_repo(path_with_namespace) - end - - def ssh_url_to_repo - url_to_repo - end - - def http_url_to_repo - [Gitlab.config.gitlab.url, "/", path_with_namespace, ".git"].join('') - end - - # Returns the Gollum::Wiki object. - def wiki - @wiki ||= begin - Gollum::Wiki.new(path_to_repo) - rescue Gollum::NoSuchPathError - create_repo! - end - end - - def empty? - pages.empty? - end - - # Returns an Array of Gitlab WikiPage instances or an - # empty Array if this Wiki has no pages. - def pages - wiki.pages.map { |page| WikiPage.new(self, page, true) } - end - - # Finds a page within the repository based on a tile - # or slug. - # - # title - The human readable or parameterized title of - # the page. - # - # Returns an initialized WikiPage instance or nil - def find_page(title, version = nil) - page_title, page_dir = page_title_and_dir(title) - if page = wiki.page(page_title, version, page_dir) - WikiPage.new(self, page, true) - else - nil - end - end - - def find_file(name, version = nil, try_on_disk = true) - version = wiki.ref if version.nil? # Gollum::Wiki#file ? - if wiki_file = wiki.file(name, version, try_on_disk) - wiki_file - else - nil - end - end - - def create_page(title, content, format = :markdown, message = nil) - commit = commit_details(:created, message, title) - - wiki.write_page(title, format, content, commit) - rescue Gollum::DuplicatePageError => e - @error_message = "Duplicate page: #{e.message}" - return false - end - - def update_page(page, content, format = :markdown, message = nil) - commit = commit_details(:updated, message, page.title) - - wiki.update_page(page, page.name, format, content, commit) - end - - def delete_page(page, message = nil) - wiki.delete_page(page, commit_details(:deleted, message, page.title)) - end - - def page_title_and_dir(title) - title_array = title.split("/") - title = title_array.pop - [title, title_array.join("/")] - end - - def search_files(query) - repository.search_files(query, default_branch) - end - - def repository - Repository.new(path_with_namespace, default_branch) - end - - def default_branch - wiki.class.default_ref - end - - private - - def create_repo! - if init_repo(path_with_namespace) - Gollum::Wiki.new(path_to_repo) - else - raise CouldNotCreateWikiError - end - end - - def init_repo(path_with_namespace) - gitlab_shell.add_repository(path_with_namespace) - end - - def commit_details(action, message = nil, title = nil) - commit_message = message || default_message(action, title) - - { email: @user.email, name: @user.name, message: commit_message } - end - - def default_message(action, title) - "#{@user.username} #{action} page: #{title}" - end - - def path_to_repo - @path_to_repo ||= File.join(Gitlab.config.gitlab_shell.repos_path, "#{path_with_namespace}.git") - end -end diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb deleted file mode 100644 index 97207ba1272..00000000000 --- a/app/models/protected_branch.rb +++ /dev/null @@ -1,23 +0,0 @@ -# == Schema Information -# -# Table name: protected_branches -# -# id :integer not null, primary key -# project_id :integer not null -# name :string(255) not null -# created_at :datetime -# updated_at :datetime -# developers_can_push :boolean default(FALSE), not null -# - -class ProtectedBranch < ActiveRecord::Base - include Gitlab::ShellAdapter - - belongs_to :project - validates :name, presence: true - validates :project, presence: true - - def commit - project.repository.commit(self.name) - end -end diff --git a/app/models/repository.rb b/app/models/repository.rb deleted file mode 100644 index 263a436d521..00000000000 --- a/app/models/repository.rb +++ /dev/null @@ -1,377 +0,0 @@ -class Repository - include Gitlab::ShellAdapter - - attr_accessor :raw_repository, :path_with_namespace - - def initialize(path_with_namespace, default_branch = nil) - @path_with_namespace = path_with_namespace - @raw_repository = Gitlab::Git::Repository.new(path_to_repo) if path_with_namespace - rescue Gitlab::Git::Repository::NoRepository - nil - end - - # Return absolute path to repository - def path_to_repo - @path_to_repo ||= File.expand_path( - File.join(Gitlab.config.gitlab_shell.repos_path, path_with_namespace + ".git") - ) - end - - def exists? - raw_repository - end - - def empty? - raw_repository.empty? - end - - def commit(id = 'HEAD') - return nil unless raw_repository - commit = Gitlab::Git::Commit.find(raw_repository, id) - commit = Commit.new(commit) if commit - commit - rescue Rugged::OdbError - nil - end - - def commits(ref, path = nil, limit = nil, offset = nil, skip_merges = false) - commits = Gitlab::Git::Commit.where( - repo: raw_repository, - ref: ref, - path: path, - limit: limit, - offset: offset, - ) - commits = Commit.decorate(commits) if commits.present? - commits - end - - def commits_between(from, to) - commits = Gitlab::Git::Commit.between(raw_repository, from, to) - commits = Commit.decorate(commits) if commits.present? - commits - end - - def find_branch(name) - branches.find { |branch| branch.name == name } - end - - def find_tag(name) - tags.find { |tag| tag.name == name } - end - - def add_branch(branch_name, ref) - cache.expire(:branch_names) - @branches = nil - - gitlab_shell.add_branch(path_with_namespace, branch_name, ref) - end - - def add_tag(tag_name, ref, message = nil) - cache.expire(:tag_names) - @tags = nil - - gitlab_shell.add_tag(path_with_namespace, tag_name, ref, message) - end - - def rm_branch(branch_name) - cache.expire(:branch_names) - @branches = nil - - gitlab_shell.rm_branch(path_with_namespace, branch_name) - end - - def rm_tag(tag_name) - cache.expire(:tag_names) - @tags = nil - - gitlab_shell.rm_tag(path_with_namespace, tag_name) - end - - def round_commit_count - if commit_count > 10000 - '10000+' - elsif commit_count > 5000 - '5000+' - elsif commit_count > 1000 - '1000+' - else - commit_count - end - end - - def branch_names - cache.fetch(:branch_names) { raw_repository.branch_names } - end - - def tag_names - cache.fetch(:tag_names) { raw_repository.tag_names } - end - - def commit_count - cache.fetch(:commit_count) do - begin - raw_repository.commit_count(self.root_ref) - rescue - 0 - end - end - end - - # Return repo size in megabytes - # Cached in redis - def size - cache.fetch(:size) { raw_repository.size } - end - - def expire_cache - %i(size branch_names tag_names commit_count graph_log - readme version contribution_guide changelog license).each do |key| - cache.expire(key) - end - end - - def graph_log - cache.fetch(:graph_log) do - commits = raw_repository.log(limit: 6000, skip_merges: true, - ref: root_ref) - - commits.map do |rugged_commit| - commit = Gitlab::Git::Commit.new(rugged_commit) - - { - author_name: commit.author_name, - author_email: commit.author_email, - additions: commit.stats.additions, - deletions: commit.stats.deletions, - } - end - end - end - - def lookup_cache - @lookup_cache ||= {} - end - - def method_missing(m, *args, &block) - if m == :lookup && !block_given? - lookup_cache[m] ||= {} - lookup_cache[m][args.join(":")] ||= raw_repository.send(m, *args, &block) - else - raw_repository.send(m, *args, &block) - end - end - - def respond_to?(method) - return true if raw_repository.respond_to?(method) - - super - end - - def blob_at(sha, path) - Gitlab::Git::Blob.find(self, sha, path) - end - - def blob_by_oid(oid) - Gitlab::Git::Blob.raw(self, oid) - end - - def readme - cache.fetch(:readme) { tree(:head).readme } - end - - def version - cache.fetch(:version) do - tree(:head).blobs.find do |file| - file.name.downcase == 'version' - end - end - end - - def contribution_guide - cache.fetch(:contribution_guide) do - tree(:head).blobs.find do |file| - file.contributing? - end - end - end - - def changelog - cache.fetch(:changelog) do - tree(:head).blobs.find do |file| - file.name =~ /\A(changelog|history)/i - end - end - end - - def license - cache.fetch(:license) do - tree(:head).blobs.find do |file| - file.name =~ /\Alicense/i - end - end - end - - def head_commit - @head_commit ||= commit(self.root_ref) - end - - def head_tree - @head_tree ||= Tree.new(self, head_commit.sha, nil) - end - - def tree(sha = :head, path = nil) - if sha == :head - if path.nil? - return head_tree - else - sha = head_commit.sha - end - end - - Tree.new(self, sha, path) - end - - def blob_at_branch(branch_name, path) - last_commit = commit(branch_name) - - if last_commit - blob_at(last_commit.sha, path) - else - nil - end - end - - # Returns url for submodule - # - # Ex. - # @repository.submodule_url_for('master', 'rack') - # # => git@localhost:rack.git - # - def submodule_url_for(ref, path) - if submodules(ref).any? - submodule = submodules(ref)[path] - - if submodule - submodule['url'] - end - end - end - - def last_commit_for_path(sha, path) - args = %W(git rev-list --max-count=1 #{sha} -- #{path}) - sha = Gitlab::Popen.popen(args, path_to_repo).first.strip - commit(sha) - end - - # Remove archives older than 2 hours - def clean_old_archives - repository_downloads_path = Gitlab.config.gitlab.repository_downloads_path - - return unless File.directory?(repository_downloads_path) - - Gitlab::Popen.popen(%W(find #{repository_downloads_path} -not -path #{repository_downloads_path} -mmin +120 -delete)) - end - - def branches_sorted_by(value) - case value - when 'recently_updated' - branches.sort do |a, b| - commit(b.target).committed_date <=> commit(a.target).committed_date - end - when 'last_updated' - branches.sort do |a, b| - commit(a.target).committed_date <=> commit(b.target).committed_date - end - else - branches - end - end - - def contributors - commits = self.commits(nil, nil, 2000, 0, true) - - commits.group_by(&:author_email).map do |email, commits| - contributor = Gitlab::Contributor.new - contributor.email = email - - commits.each do |commit| - if contributor.name.blank? - contributor.name = commit.author_name - end - - contributor.commits += 1 - end - - contributor - end - end - - def blob_for_diff(commit, diff) - file = blob_at(commit.id, diff.new_path) - - unless file - file = prev_blob_for_diff(commit, diff) - end - - file - end - - def prev_blob_for_diff(commit, diff) - if commit.parent_id - blob_at(commit.parent_id, diff.old_path) - end - end - - def branch_names_contains(sha) - args = %W(git branch --contains #{sha}) - names = Gitlab::Popen.popen(args, path_to_repo).first - - if names.respond_to?(:split) - names = names.split("\n").map(&:strip) - - names.each do |name| - name.slice! '* ' - end - - names - else - [] - end - end - - def tag_names_contains(sha) - args = %W(git tag --contains #{sha}) - names = Gitlab::Popen.popen(args, path_to_repo).first - - if names.respond_to?(:split) - names = names.split("\n").map(&:strip) - - names.each do |name| - name.slice! '* ' - end - - names - else - [] - end - end - - def branches - @branches ||= raw_repository.branches - end - - def tags - @tags ||= raw_repository.tags - end - - def root_ref - @root_ref ||= raw_repository.root_ref - end - - private - - def cache - @cache ||= RepositoryCache.new(path_with_namespace) - end -end diff --git a/app/models/service.rb b/app/models/service.rb deleted file mode 100644 index 393cf55a69f..00000000000 --- a/app/models/service.rb +++ /dev/null @@ -1,153 +0,0 @@ -# == 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) -# - -# To add new service you should build a class inherited from Service -# and implement a set of methods -class Service < ActiveRecord::Base - include Sortable - serialize :properties, JSON - - default_value_for :active, false - default_value_for :push_events, true - default_value_for :issues_events, true - default_value_for :merge_requests_events, true - default_value_for :tag_push_events, true - default_value_for :note_events, true - - after_initialize :initialize_properties - - belongs_to :project - has_one :service_hook - - validates :project_id, presence: true, unless: Proc.new { |service| service.template? } - - scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') } - - scope :push_hooks, -> { where(push_events: true, active: true) } - scope :tag_push_hooks, -> { where(tag_push_events: true, active: true) } - scope :issue_hooks, -> { where(issues_events: true, active: true) } - scope :merge_request_hooks, -> { where(merge_requests_events: true, active: true) } - scope :note_hooks, -> { where(note_events: true, active: true) } - - def activated? - active - end - - def template? - template - 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 supported_events - %w(push tag_push issue merge_request) - end - - def execute - # implement inside child - end - - def can_test? - !project.empty_repo? - 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['#{arg}'] = value - end - } - end - end - - def async_execute(data) - return unless supported_events.include?(data[:object_kind]) - - Sidekiq::Client.enqueue(ProjectServiceWorker, id, data) - end - - def issue_tracker? - self.category == :issue_tracker - end - - def self.available_services_names - %w( - asana - assembla - bamboo - buildkite - campfire - custom_issue_tracker - emails_on_push - external_wiki - flowdock - gemnasium - gitlab_ci - hipchat - irker - jira - pivotaltracker - pushover - redmine - slack - teamcity - ) - end - - def self.create_from_template(project_id, template) - service = template.dup - service.template = false - service.project_id = project_id - service if service.save - end -end diff --git a/app/models/snippet.rb b/app/models/snippet.rb deleted file mode 100644 index b35e72c4bdb..00000000000 --- a/app/models/snippet.rb +++ /dev/null @@ -1,103 +0,0 @@ -# == Schema Information -# -# Table name: snippets -# -# id :integer not null, primary key -# title :string(255) -# content :text -# author_id :integer not null -# project_id :integer -# created_at :datetime -# updated_at :datetime -# file_name :string(255) -# expires_at :datetime -# type :string(255) -# visibility_level :integer default(0), not null -# - -class Snippet < ActiveRecord::Base - include Sortable - include Linguist::BlobHelper - include Gitlab::VisibilityLevel - - default_value_for :visibility_level, Snippet::PRIVATE - - belongs_to :author, class_name: "User" - - has_many :notes, as: :noteable, dependent: :destroy - - delegate :name, :email, to: :author, prefix: true, allow_nil: true - - validates :author, presence: true - validates :title, presence: true, length: { within: 0..255 } - validates :file_name, - presence: true, - length: { within: 0..255 }, - format: { with: Gitlab::Regex.file_name_regex, - message: Gitlab::Regex.file_name_regex_message } - validates :content, presence: true - validates :visibility_level, inclusion: { in: Gitlab::VisibilityLevel.values } - - # Scopes - scope :are_internal, -> { where(visibility_level: Snippet::INTERNAL) } - scope :are_private, -> { where(visibility_level: Snippet::PRIVATE) } - scope :are_public, -> { where(visibility_level: Snippet::PUBLIC) } - scope :public_and_internal, -> { where(visibility_level: [Snippet::PUBLIC, Snippet::INTERNAL]) } - scope :fresh, -> { order("created_at DESC") } - scope :expired, -> { where(["expires_at IS NOT NULL AND expires_at < ?", Time.current]) } - scope :non_expired, -> { where(["expires_at IS NULL OR expires_at > ?", Time.current]) } - - def self.content_types - [ - ".rb", ".py", ".pl", ".scala", ".c", ".cpp", ".java", - ".haml", ".html", ".sass", ".scss", ".xml", ".php", ".erb", - ".js", ".sh", ".coffee", ".yml", ".md" - ] - end - - def data - content - end - - def hook_attrs - attributes - end - - def size - 0 - end - - def name - file_name - end - - def sanitized_file_name - file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '') - end - - def mode - nil - end - - def expired? - expires_at && expires_at < Time.current - end - - def visibility_level_field - visibility_level - end - - class << self - def search(query) - where('(title LIKE :query OR file_name LIKE :query)', query: "%#{query}%") - end - - def search_code(query) - where('(content LIKE :query)', query: "%#{query}%") - end - - def accessible_to(user) - where('visibility_level IN (?) OR author_id = ?', [Snippet::INTERNAL, Snippet::PUBLIC], user) - end - end -end diff --git a/app/models/subscription.rb b/app/models/subscription.rb deleted file mode 100644 index dd75d3ab8ba..00000000000 --- a/app/models/subscription.rb +++ /dev/null @@ -1,21 +0,0 @@ -# == Schema Information -# -# Table name: subscriptions -# -# id :integer not null, primary key -# user_id :integer -# subscribable_id :integer -# subscribable_type :string(255) -# subscribed :boolean -# created_at :datetime -# updated_at :datetime -# - -class Subscription < ActiveRecord::Base - belongs_to :user - belongs_to :subscribable, polymorphic: true - - validates :user_id, - uniqueness: { scope: [:subscribable_id, :subscribable_type] }, - presence: true -end diff --git a/app/models/tree.rb b/app/models/tree.rb deleted file mode 100644 index f279e896cda..00000000000 --- a/app/models/tree.rb +++ /dev/null @@ -1,53 +0,0 @@ -class Tree - include Gitlab::MarkdownHelper - - attr_accessor :repository, :sha, :path, :entries - - def initialize(repository, sha, path = '/') - path = '/' if path.blank? - - @repository = repository - @sha = sha - @path = path - - git_repo = @repository.raw_repository - @entries = Gitlab::Git::Tree.where(git_repo, @sha, @path) - end - - def readme - return @readme if defined?(@readme) - - available_readmes = blobs.select(&:readme?) - - if available_readmes.count == 0 - return @readme = nil - end - - # Take the first previewable readme, or the first available readme, if we - # can't preview any of them - readme_tree = available_readmes.find do |readme| - previewable?(readme.name) - end || available_readmes.first - - readme_path = path == '/' ? readme_tree.name : File.join(path, readme_tree.name) - - git_repo = repository.raw_repository - @readme = Gitlab::Git::Blob.find(git_repo, sha, readme_path) - end - - def trees - @entries.select(&:dir?) - end - - def blobs - @entries.select(&:file?) - end - - def submodules - @entries.select(&:submodule?) - end - - def sorted_entries - trees + blobs + submodules - end -end diff --git a/app/models/user.rb b/app/models/user.rb deleted file mode 100644 index d6b93afe739..00000000000 --- a/app/models/user.rb +++ /dev/null @@ -1,614 +0,0 @@ -# == Schema Information -# -# 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) -# public_email :string(255) default(""), not null -# - -require 'carrierwave/orm/activerecord' -require 'file_size_validator' - -class User < ActiveRecord::Base - include Sortable - include Gitlab::ConfigHelper - include TokenAuthenticatable - extend Gitlab::ConfigHelper - include Gitlab::CurrentSettings - - default_value_for :admin, false - default_value_for :can_create_group, gitlab_config.default_can_create_group - default_value_for :can_create_team, false - default_value_for :hide_no_ssh_key, false - default_value_for :hide_no_password, false - default_value_for :theme_id, gitlab_config.default_theme - - devise :database_authenticatable, :lockable, :async, - :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :confirmable, :registerable - - attr_accessor :force_random_password - - # Virtual attribute for authenticating by either username or email - attr_accessor :login - - # - # Relations - # - - # Namespace for personal projects - has_one :namespace, -> { where type: nil }, dependent: :destroy, foreign_key: :owner_id, class_name: "Namespace" - - # Profile - has_many :keys, dependent: :destroy - has_many :emails, dependent: :destroy - has_many :identities, dependent: :destroy - - # Groups - has_many :members, dependent: :destroy - has_many :project_members, source: 'ProjectMember' - has_many :group_members, source: 'GroupMember' - has_many :groups, through: :group_members - has_many :owned_groups, -> { where members: { access_level: Gitlab::Access::OWNER } }, through: :group_members, source: :group - has_many :masters_groups, -> { where members: { access_level: Gitlab::Access::MASTER } }, through: :group_members, source: :group - - # Projects - has_many :groups_projects, through: :groups, source: :projects - has_many :personal_projects, through: :namespace, source: :projects - has_many :projects, through: :project_members - has_many :created_projects, foreign_key: :creator_id, class_name: 'Project' - has_many :users_star_projects, dependent: :destroy - has_many :starred_projects, through: :users_star_projects, source: :project - - has_many :snippets, dependent: :destroy, foreign_key: :author_id, class_name: "Snippet" - has_many :project_members, dependent: :destroy, class_name: 'ProjectMember' - has_many :issues, dependent: :destroy, foreign_key: :author_id - has_many :notes, dependent: :destroy, foreign_key: :author_id - has_many :merge_requests, dependent: :destroy, foreign_key: :author_id - has_many :events, dependent: :destroy, foreign_key: :author_id, class_name: "Event" - has_many :subscriptions, dependent: :destroy - has_many :recent_events, -> { order "id DESC" }, foreign_key: :author_id, class_name: "Event" - has_many :assigned_issues, dependent: :destroy, foreign_key: :assignee_id, class_name: "Issue" - has_many :assigned_merge_requests, dependent: :destroy, foreign_key: :assignee_id, class_name: "MergeRequest" - has_many :oauth_applications, class_name: 'Doorkeeper::Application', as: :owner, dependent: :destroy - - - # - # Validations - # - validates :name, presence: true - validates :email, presence: true, email: { strict_mode: true }, uniqueness: true - validates :notification_email, presence: true, email: { strict_mode: true } - validates :public_email, presence: true, email: { strict_mode: true }, allow_blank: true, uniqueness: true - validates :bio, length: { maximum: 255 }, allow_blank: true - validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } - validates :username, - presence: true, - uniqueness: { case_sensitive: false }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.namespace_regex, - message: Gitlab::Regex.namespace_regex_message } - - validates :notification_level, inclusion: { in: Notification.notification_levels }, presence: true - validate :namespace_uniq, if: ->(user) { user.username_changed? } - validate :avatar_type, if: ->(user) { user.avatar_changed? } - validate :unique_email, if: ->(user) { user.email_changed? } - validate :owns_notification_email, if: ->(user) { user.notification_email_changed? } - validates :avatar, file_size: { maximum: 200.kilobytes.to_i } - - before_validation :generate_password, on: :create - before_validation :sanitize_attrs - before_validation :set_notification_email, if: ->(user) { user.email_changed? } - before_validation :set_public_email, if: ->(user) { user.public_email_changed? } - - before_save :ensure_authentication_token - after_save :ensure_namespace_correct - after_initialize :set_projects_limit - after_create :post_create_hook - after_destroy :post_destroy_hook - - - alias_attribute :private_token, :authentication_token - - delegate :path, to: :namespace, allow_nil: true, prefix: true - - state_machine :state, initial: :active do - event :block do - transition active: :blocked - end - - event :activate do - transition blocked: :active - end - end - - mount_uploader :avatar, AvatarUploader - - # Scopes - scope :admins, -> { where(admin: true) } - scope :blocked, -> { with_state(:blocked) } - scope :active, -> { with_state(:active) } - scope :not_in_project, ->(project) { project.users.present? ? where("id not in (:ids)", ids: project.users.map(&:id) ) : all } - scope :without_projects, -> { where('id NOT IN (SELECT DISTINCT(user_id) FROM members)') } - - # - # Class methods - # - class << self - # Devise method overridden to allow sign in with email or username - def find_for_database_authentication(warden_conditions) - conditions = warden_conditions.dup - if login = conditions.delete(:login) - where(conditions).where(["lower(username) = :value OR lower(email) = :value", { value: login.downcase }]).first - else - where(conditions).first - end - end - - def sort(method) - case method.to_s - when 'recent_sign_in' then reorder(last_sign_in_at: :desc) - when 'oldest_sign_in' then reorder(last_sign_in_at: :asc) - else - order_by(method) - end - end - - def find_for_commit(email, name) - # Prefer email match over name match - User.where(email: email).first || - User.joins(:emails).where(emails: { email: email }).first || - User.where(name: name).first - end - - def filter(filter_name) - case filter_name - when "admins"; self.admins - when "blocked"; self.blocked - when "wop"; self.without_projects - else - self.active - end - end - - def search(query) - where("lower(name) LIKE :query OR lower(email) LIKE :query OR lower(username) LIKE :query", query: "%#{query.downcase}%") - end - - def by_login(login) - where('lower(username) = :value OR lower(email) = :value', - value: login.to_s.downcase).first - end - - def by_username_or_id(name_or_id) - where('users.username = ? OR users.id = ?', name_or_id.to_s, name_or_id.to_i).first - end - - def build_user(attrs = {}) - User.new(attrs) - end - end - - # - # Instance methods - # - - def to_param - username - end - - def notification - @notification ||= Notification.new(self) - end - - def generate_password - if self.force_random_password - self.password = self.password_confirmation = Devise.friendly_token.first(8) - end - end - - def generate_reset_token - @reset_token, enc = Devise.token_generator.generate(self.class, :reset_password_token) - - self.reset_password_token = enc - self.reset_password_sent_at = Time.now.utc - - @reset_token - end - - def namespace_uniq - namespace_name = self.username - existing_namespace = Namespace.by_path(namespace_name) - if existing_namespace && existing_namespace != self.namespace - self.errors.add :username, "already exists" - end - end - - def avatar_type - unless self.avatar.image? - self.errors.add :avatar, "only images allowed" - end - end - - def unique_email - self.errors.add(:email, 'has already been taken') if Email.exists?(email: self.email) - end - - def owns_notification_email - self.errors.add(:notification_email, "is not an email you own") unless self.all_emails.include?(self.notification_email) - end - - # Groups user has access to - def authorized_groups - @authorized_groups ||= begin - group_ids = (groups.pluck(:id) + authorized_projects.pluck(:namespace_id)) - Group.where(id: group_ids) - end - end - - - # Projects user has access to - def authorized_projects - @authorized_projects ||= begin - project_ids = personal_projects.pluck(:id) - project_ids.push(*groups_projects.pluck(:id)) - project_ids.push(*projects.pluck(:id).uniq) - Project.where(id: project_ids) - end - end - - def owned_projects - @owned_projects ||= begin - Project.where(namespace_id: owned_groups.pluck(:id).push(namespace.id)).joins(:namespace) - end - end - - # Team membership in authorized projects - def tm_in_authorized_projects - ProjectMember.where(source_id: authorized_projects.map(&:id), user_id: self.id) - end - - def is_admin? - admin - end - - def require_ssh_key? - keys.count == 0 - end - - def require_password? - password_automatically_set? && !ldap_user? - end - - def can_change_username? - gitlab_config.username_changing_enabled - end - - def can_create_project? - projects_limit_left > 0 - end - - def can_create_group? - can?(:create_group, nil) - end - - def abilities - Ability.abilities - end - - def can_select_namespace? - several_namespaces? || admin - end - - def can?(action, subject) - abilities.allowed?(self, action, subject) - end - - def first_name - name.split.first unless name.blank? - end - - def cared_merge_requests - MergeRequest.cared(self) - end - - def projects_limit_left - projects_limit - personal_projects.count - end - - def projects_limit_percent - return 100 if projects_limit.zero? - (personal_projects.count.to_f / projects_limit) * 100 - end - - def recent_push(project_id = nil) - # Get push events not earlier than 2 hours ago - 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 - end - - def projects_sorted_by_activity - authorized_projects.sorted_by_activity - end - - def several_namespaces? - owned_groups.any? || masters_groups.any? - end - - def namespace_id - namespace.try :id - end - - def name_with_username - "#{name} (#{username})" - end - - def tm_of(project) - project.project_member_by_id(self.id) - end - - def already_forked?(project) - !!fork_of(project) - end - - def fork_of(project) - links = ForkedProjectLink.where(forked_from_project_id: project, forked_to_project_id: personal_projects) - - if links.any? - links.first.forked_to_project - else - nil - end - end - - def ldap_user? - identities.exists?(["provider LIKE ? AND extern_uid IS NOT NULL", "ldap%"]) - end - - def ldap_identity - @ldap_identity ||= identities.find_by(["provider LIKE ?", "ldap%"]) - end - - def project_deploy_keys - DeployKey.in_projects(self.authorized_projects.pluck(:id)) - end - - def accessible_deploy_keys - @accessible_deploy_keys ||= begin - key_ids = project_deploy_keys.pluck(:id) - key_ids.push(*DeployKey.are_public.pluck(:id)) - DeployKey.where(id: key_ids) - end - end - - def created_by - User.find_by(id: created_by_id) if created_by_id - end - - def sanitize_attrs - %w(name username skype linkedin twitter bio).each do |attr| - value = self.send(attr) - self.send("#{attr}=", Sanitize.clean(value)) if value.present? - end - end - - def set_notification_email - if self.notification_email.blank? || !self.all_emails.include?(self.notification_email) - self.notification_email = self.email - end - end - - def set_public_email - if self.public_email.blank? || !self.all_emails.include?(self.public_email) - self.public_email = '' - end - end - - def set_projects_limit - connection_default_value_defined = new_record? && !projects_limit_changed? - return unless self.projects_limit.nil? || connection_default_value_defined - - self.projects_limit = current_application_settings.default_projects_limit - end - - def requires_ldap_check? - if !Gitlab.config.ldap.enabled - false - elsif ldap_user? - !last_credential_check_at || (last_credential_check_at + 1.hour) < Time.now - else - false - end - end - - def solo_owned_groups - @solo_owned_groups ||= owned_groups.select do |group| - group.owners == [self] - end - end - - def with_defaults - User.defaults.each do |k, v| - self.send("#{k}=", v) - end - - self - end - - def can_leave_project?(project) - project.namespace != namespace && - project.project_member(self) - end - - # Reset project events cache related to this user - # - # Since we do cache @event we need to reset cache in special cases: - # * when the user changes their avatar - # Events cache stored like events/23-20130109142513. - # The cache key includes updated_at timestamp. - # Thus it will automatically generate a new fragment - # when the event is updated because the key changes. - def reset_events_cache - Event.where(author_id: self.id). - order('id DESC').limit(1000). - update_all(updated_at: Time.now) - end - - def full_website_url - return "http://#{website_url}" if website_url !~ /\Ahttps?:\/\// - - website_url - end - - def short_website_url - website_url.sub(/\Ahttps?:\/\//, '') - end - - def all_ssh_keys - keys.map(&:key) - end - - def temp_oauth_email? - 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 - else - GravatarService.new.execute(email, size) - end - end - - def all_emails - [self.email, *self.emails.map(&:email)] - end - - def hook_attrs - { - name: name, - username: username, - avatar_url: avatar_url - } - end - - def ensure_namespace_correct - # Ensure user has namespace - self.create_namespace!(path: self.username, name: self.username) unless self.namespace - - if self.username_changed? - self.namespace.update_attributes(path: self.username, name: self.username) - end - end - - def post_create_hook - log_info("User \"#{self.name}\" (#{self.email}) was created") - notification_service.new_user(self, @reset_token) if self.created_by_id - system_hook_service.execute_hooks_for(self, :create) - end - - def post_destroy_hook - log_info("User \"#{self.name}\" (#{self.email}) was removed") - system_hook_service.execute_hooks_for(self, :destroy) - end - - def notification_service - NotificationService.new - end - - def log_info(message) - Gitlab::AppLogger.info message - end - - def system_hook_service - SystemHooksService.new - end - - def starred?(project) - starred_projects.exists?(project) - end - - def toggle_star(project) - user_star_project = users_star_projects. - where(project: project, user: self).take - if user_star_project - user_star_project.destroy - else - UsersStarProject.create!(project: project, user: self) - end - end - - def manageable_namespaces - @manageable_namespaces ||= - begin - namespaces = [] - namespaces << namespace - namespaces += owned_groups - namespaces += masters_groups - end - end - - def oauth_authorized_tokens - Doorkeeper::AccessToken.where(resource_owner_id: self.id, revoked_at: nil) - end - - def contributed_projects_ids - Event.contributions.where(author_id: self). - where("created_at > ?", Time.now - 1.year). - reorder(project_id: :desc). - select(:project_id). - uniq.map(&:project_id) - end -end diff --git a/app/models/users_star_project.rb b/app/models/users_star_project.rb deleted file mode 100644 index 3d49cb05949..00000000000 --- a/app/models/users_star_project.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: users_star_projects -# -# id :integer not null, primary key -# project_id :integer not null -# user_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -class UsersStarProject < ActiveRecord::Base - belongs_to :project, counter_cache: :star_count - belongs_to :user - - validates :user, presence: true - validates :user_id, uniqueness: { scope: [:project_id] } - validates :project, presence: true -end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb deleted file mode 100644 index e9413c34bae..00000000000 --- a/app/models/wiki_page.rb +++ /dev/null @@ -1,201 +0,0 @@ -class WikiPage - include ActiveModel::Validations - include ActiveModel::Conversion - include StaticModel - extend ActiveModel::Naming - - def self.primary_key - 'slug' - end - - def self.model_name - ActiveModel::Name.new(self, nil, 'wiki') - end - - def to_key - [:slug] - end - - validates :title, presence: true - validates :content, presence: true - - # The Gitlab ProjectWiki instance. - attr_reader :wiki - - # The raw Gollum::Page instance. - attr_reader :page - - # The attributes Hash used for storing and validating - # new Page values before writing to the Gollum repository. - attr_accessor :attributes - - def initialize(wiki, page = nil, persisted = false) - @wiki = wiki - @page = page - @persisted = persisted - @attributes = {}.with_indifferent_access - - set_attributes if persisted? - end - - # The escaped URL path of this page. - def slug - @attributes[:slug] - end - - alias_method :to_param, :slug - - # The formatted title of this page. - def title - if @attributes[:title] - @attributes[:title].gsub(/-+/, ' ') - else - "" - end - end - - # Sets the title of this page. - def title=(new_title) - @attributes[:title] = new_title - end - - # The raw content of this page. - def content - @attributes[:content] ||= if @page - @page.raw_data - end - end - - # The processed/formatted content of this page. - def formatted_content - @attributes[:formatted_content] ||= if @page - @page.formatted_data - end - end - - # The markup format for the page. - def format - @attributes[:format] || :markdown - end - - # The commit message for this page version. - def message - version.try(:message) - end - - # The Gitlab Commit instance for this page. - def version - return nil unless persisted? - - @version ||= @page.version - end - - # Returns an array of Gitlab Commit instances. - def versions - return [] unless persisted? - - @page.versions - end - - def commit - versions.first - end - - # Returns the Date that this latest version was - # created on. - def created_at - @page.version.date - end - - # Returns boolean True or False if this instance - # is an old version of the page. - def historical? - @page.historical? - end - - # Returns boolean True or False if this instance - # has been fully saved to disk or not. - def persisted? - @persisted == true - end - - # Creates a new Wiki Page. - # - # attr - Hash of attributes to set on the new page. - # :title - The title for the new page. - # :content - The raw markup content. - # :format - Optional symbol representing the - # content format. Can be any type - # listed in the ProjectWiki::MARKUPS - # Hash. - # :message - Optional commit message to set on - # the new page. - # - # Returns the String SHA1 of the newly created page - # or False if the save was unsuccessful. - def create(attr = {}) - @attributes.merge!(attr) - - save :create_page, title, content, format, message - end - - # Updates an existing Wiki Page, creating a new version. - # - # new_content - The raw markup content to replace the existing. - # format - Optional symbol representing the content format. - # See ProjectWiki::MARKUPS Hash for available formats. - # message - Optional commit message to set on the new version. - # - # Returns the String SHA1 of the newly created page - # or False if the save was unsuccessful. - def update(new_content = "", format = :markdown, message = nil) - @attributes[:content] = new_content - @attributes[:format] = format - - save :update_page, @page, content, format, message - end - - # Destroys the Wiki Page. - # - # Returns boolean True or False. - def delete - if wiki.delete_page(@page) - true - else - false - end - end - - private - - def set_attributes - attributes[:slug] = @page.escaped_url_path - attributes[:title] = @page.title - attributes[:format] = @page.format - end - - def save(method, *args) - project_wiki = wiki - if valid? && project_wiki.send(method, *args) - - page_details = if method == :update_page - # Use url_path instead of path to omit format extension - @page.url_path - else - title - end - - page_title, page_dir = project_wiki.page_title_and_dir(page_details) - gollum_wiki = project_wiki.wiki - @page = gollum_wiki.paged(page_title, page_dir) - - set_attributes - - @persisted = true - else - errors.add(:base, project_wiki.error_message) if project_wiki.error_message - @persisted = false - end - @persisted - end -end diff --git a/app/services/archive_repository_service.rb b/app/services/archive_repository_service.rb deleted file mode 100644 index e1b41527d8d..00000000000 --- a/app/services/archive_repository_service.rb +++ /dev/null @@ -1,62 +0,0 @@ -class ArchiveRepositoryService - attr_reader :project, :ref, :format - - def initialize(project, ref, format) - format ||= 'tar.gz' - @project, @ref, @format = project, ref, format.downcase - end - - def execute(options = {}) - project.repository.clean_old_archives - - raise "No archive file path" unless file_path - - return file_path if archived? - - unless archiving? - RepositoryArchiveWorker.perform_async(project.id, ref, format) - end - - archived = wait_until_archived(options[:timeout] || 5.0) - - file_path if archived - end - - private - - def storage_path - Gitlab.config.gitlab.repository_downloads_path - end - - def file_path - @file_path ||= project.repository.archive_file_path(ref, storage_path, format) - end - - def pid_file_path - @pid_file_path ||= project.repository.archive_pid_file_path(ref, storage_path, format) - end - - def archived? - File.exist?(file_path) - end - - def archiving? - File.exist?(pid_file_path) - end - - def wait_until_archived(timeout = 5.0) - return archived? if timeout == 0.0 - - t1 = Time.now - - begin - sleep 0.1 - - success = archived? - - t2 = Time.now - end until success || t2 - t1 >= timeout - - success - end -end diff --git a/app/services/base_service.rb b/app/services/base_service.rb deleted file mode 100644 index 6d9ed345914..00000000000 --- a/app/services/base_service.rb +++ /dev/null @@ -1,66 +0,0 @@ -class BaseService - include Gitlab::CurrentSettings - - attr_accessor :project, :current_user, :params - - def initialize(project, user, params = {}) - @project, @current_user, @params = project, user, params.dup - end - - def abilities - Ability.abilities - end - - def can?(object, action, subject) - abilities.allowed?(object, action, subject) - end - - def notification_service - NotificationService.new - end - - def event_service - EventCreateService.new - end - - def log_info(message) - Gitlab::AppLogger.info message - end - - def system_hook_service - SystemHooksService.new - 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 - - level_name = 'Unknown' - Gitlab::VisibilityLevel.options.each do |name, level| - level_name = name if level == denied_visibility_level - end - - model.errors.add( - :visibility_level, - "#{level_name} visibility has been restricted by your GitLab administrator" - ) - end - - private - - def error(message, http_status = nil) - result = { - message: message, - status: :error - } - - result[:http_status] = http_status if http_status - result - end - - def success - { - status: :success - } - end -end diff --git a/app/services/compare_service.rb b/app/services/compare_service.rb deleted file mode 100644 index 6aa9df4b194..00000000000 --- a/app/services/compare_service.rb +++ /dev/null @@ -1,27 +0,0 @@ -# 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, - ) - ) - else - Gitlab::Satellite::CompareAction.new( - current_user, - target_project, - target_branch, - source_project, - source_branch - ).result - end - end -end diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb deleted file mode 100644 index cf7ae4345f3..00000000000 --- a/app/services/create_branch_service.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_relative 'base_service' - -class CreateBranchService < BaseService - def execute(branch_name, ref) - valid_branch = Gitlab::GitRefValidator.validate(branch_name) - if valid_branch == false - return error('Branch name invalid') - end - - repository = project.repository - existing_branch = repository.find_branch(branch_name) - if existing_branch - return error('Branch already exists') - end - - repository.add_branch(branch_name, ref) - new_branch = repository.find_branch(branch_name) - - if new_branch - push_data = build_push_data(project, current_user, new_branch) - - EventCreateService.new.push(project, current_user, push_data) - project.execute_hooks(push_data.dup, :push_hooks) - project.execute_services(push_data.dup, :push_hooks) - - success(new_branch) - else - error('Invalid reference name') - end - end - - def success(branch) - out = super() - out[:branch] = branch - out - end - - def build_push_data(project, user, branch) - Gitlab::PushDataBuilder. - build(project, user, Gitlab::Git::BLANK_SHA, branch.target, "#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}", []) - end -end diff --git a/app/services/create_snippet_service.rb b/app/services/create_snippet_service.rb deleted file mode 100644 index 101a3df5eee..00000000000 --- a/app/services/create_snippet_service.rb +++ /dev/null @@ -1,20 +0,0 @@ -class CreateSnippetService < BaseService - def execute - if project.nil? - snippet = PersonalSnippet.new(params) - else - snippet = project.snippets.build(params) - end - - unless Gitlab::VisibilityLevel.allowed_for?(current_user, - params[:visibility_level]) - deny_visibility_level(snippet) - return snippet - end - - snippet.author = current_user - - snippet.save - snippet - end -end diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb deleted file mode 100644 index 25f9e203246..00000000000 --- a/app/services/create_tag_service.rb +++ /dev/null @@ -1,45 +0,0 @@ -require_relative 'base_service' - -class CreateTagService < BaseService - def execute(tag_name, ref, message) - valid_tag = Gitlab::GitRefValidator.validate(tag_name) - if valid_tag == false - return error('Tag name invalid') - end - - repository = project.repository - existing_tag = repository.find_tag(tag_name) - if existing_tag - return error('Tag already exists') - end - - message.strip! if message - - repository.add_tag(tag_name, ref, message) - new_tag = repository.find_tag(tag_name) - - if new_tag - push_data = create_push_data(project, current_user, new_tag) - - EventCreateService.new.push(project, current_user, push_data) - project.execute_hooks(push_data.dup, :tag_push_hooks) - project.execute_services(push_data.dup, :tag_push_hooks) - - success(new_tag) - else - error('Invalid reference name') - end - end - - def success(branch) - out = super() - out[:tag] = branch - out - end - - def create_push_data(project, user, tag) - commits = [project.repository.commit(tag.target)].compact - Gitlab::PushDataBuilder. - build(project, user, Gitlab::Git::BLANK_SHA, tag.target, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", commits, tag.message) - end -end diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb deleted file mode 100644 index b19b112a0c4..00000000000 --- a/app/services/delete_branch_service.rb +++ /dev/null @@ -1,56 +0,0 @@ -require_relative 'base_service' - -class DeleteBranchService < BaseService - def execute(branch_name) - repository = project.repository - branch = repository.find_branch(branch_name) - - # No such branch - unless branch - return error('No such branch', 404) - end - - if branch_name == repository.root_ref - return error('Cannot remove HEAD branch', 405) - end - - # Dont allow remove of protected branch - if project.protected_branch?(branch_name) - return error('Protected branch cant be removed', 405) - end - - # Dont allow user to remove branch if he is not allowed to push - unless current_user.can?(:push_code, project) - return error('You dont have push access to repo', 405) - end - - if repository.rm_branch(branch_name) - push_data = build_push_data(branch) - - EventCreateService.new.push(project, current_user, push_data) - project.execute_hooks(push_data.dup, :push_hooks) - project.execute_services(push_data.dup, :push_hooks) - - success('Branch was removed') - else - error('Failed to remove branch') - end - end - - def error(message, return_code = 400) - out = super(message) - out[:return_code] = return_code - out - end - - def success(message) - out = super() - out[:message] = message - out - end - - def build_push_data(branch) - Gitlab::PushDataBuilder - .build(project, current_user, branch.target, Gitlab::Git::BLANK_SHA, "#{Gitlab::Git::BRANCH_REF_PREFIX}#{branch.name}", []) - end -end diff --git a/app/services/delete_tag_service.rb b/app/services/delete_tag_service.rb deleted file mode 100644 index 0c836401136..00000000000 --- a/app/services/delete_tag_service.rb +++ /dev/null @@ -1,42 +0,0 @@ -require_relative 'base_service' - -class DeleteTagService < BaseService - def execute(tag_name) - repository = project.repository - tag = repository.find_tag(tag_name) - - # No such tag - unless tag - return error('No such tag', 404) - end - - if repository.rm_tag(tag_name) - push_data = build_push_data(tag) - - EventCreateService.new.push(project, current_user, push_data) - project.execute_hooks(push_data.dup, :tag_push_hooks) - project.execute_services(push_data.dup, :tag_push_hooks) - - success('Tag was removed') - else - error('Failed to remove tag') - end - end - - def error(message, return_code = 400) - out = super(message) - out[:return_code] = return_code - out - end - - def success(message) - out = super() - out[:message] = message - out - end - - def build_push_data(tag) - Gitlab::PushDataBuilder - .build(project, current_user, tag.target, Gitlab::Git::BLANK_SHA, "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", []) - end -end diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb deleted file mode 100644 index 103d6b0a08b..00000000000 --- a/app/services/event_create_service.rb +++ /dev/null @@ -1,84 +0,0 @@ -# EventCreateService class -# -# Used for creating events feed on dashboard after certain user action -# -# Ex. -# EventCreateService.new.new_issue(issue, current_user) -# -class EventCreateService - def open_issue(issue, current_user) - create_record_event(issue, current_user, Event::CREATED) - end - - def close_issue(issue, current_user) - create_record_event(issue, current_user, Event::CLOSED) - end - - def reopen_issue(issue, current_user) - create_record_event(issue, current_user, Event::REOPENED) - end - - def open_mr(merge_request, current_user) - create_record_event(merge_request, current_user, Event::CREATED) - end - - def close_mr(merge_request, current_user) - create_record_event(merge_request, current_user, Event::CLOSED) - end - - def reopen_mr(merge_request, current_user) - create_record_event(merge_request, current_user, Event::REOPENED) - end - - def merge_mr(merge_request, current_user) - create_record_event(merge_request, current_user, Event::MERGED) - end - - def open_milestone(milestone, current_user) - create_record_event(milestone, current_user, Event::CREATED) - end - - def close_milestone(milestone, current_user) - create_record_event(milestone, current_user, Event::CLOSED) - end - - def reopen_milestone(milestone, current_user) - create_record_event(milestone, current_user, Event::REOPENED) - end - - def leave_note(note, current_user) - create_record_event(note, current_user, Event::COMMENTED) - end - - def join_project(project, current_user) - create_event(project, current_user, Event::JOINED) - end - - def leave_project(project, current_user) - create_event(project, current_user, Event::LEFT) - end - - def create_project(project, current_user) - create_event(project, current_user, Event::CREATED) - end - - def push(project, current_user, push_data) - create_event(project, current_user, Event::PUSHED, data: push_data) - end - - private - - def create_record_event(record, current_user, status) - create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name) - end - - def create_event(project, current_user, status, attributes = {}) - attributes.reverse_merge!( - project: project, - action: status, - author_id: current_user.id - ) - - Event.create(attributes) - end -end diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb deleted file mode 100644 index bd245100955..00000000000 --- a/app/services/files/base_service.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Files - class BaseService < ::BaseService - attr_reader :ref, :path - - def initialize(project, user, params, ref, path = nil) - @project, @current_user, @params = project, user, params.dup - @ref = ref - @path = path - end - - private - - def repository - project.repository - end - end -end diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb deleted file mode 100644 index 23833aa78ec..00000000000 --- a/app/services/files/create_service.rb +++ /dev/null @@ -1,52 +0,0 @@ -require_relative "base_service" - -module Files - class CreateService < BaseService - def execute - allowed = Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(ref) - - unless allowed - return error("You are not allowed to create file in this branch") - end - - file_name = File.basename(path) - file_path = path - - unless file_name =~ Gitlab::Regex.file_name_regex - return 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 - - blob = repository.blob_at_branch(ref, file_path) - - if blob - return error("Your changes could not be committed, because file with such name 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 deleted file mode 100644 index 1497a0f883b..00000000000 --- a/app/services/files/delete_service.rb +++ /dev/null @@ -1,36 +0,0 @@ -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 - end - end -end diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb deleted file mode 100644 index 0724d3ae634..00000000000 --- a/app/services/files/update_service.rb +++ /dev/null @@ -1,39 +0,0 @@ -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) - end - end -end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb deleted file mode 100644 index 31e0167d247..00000000000 --- a/app/services/git_push_service.rb +++ /dev/null @@ -1,132 +0,0 @@ -class GitPushService - attr_accessor :project, :user, :push_data, :push_commits - include Gitlab::CurrentSettings - include Gitlab::Access - - # This method will be called after each git update - # and only if the provided user and project is present in GitLab. - # - # All callbacks for post receive action should be placed here. - # - # 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 - # - def execute(project, user, oldrev, newrev, ref) - @project, @user = project, user - - project.ensure_satellite_exists - project.repository.expire_cache - project.update_repository_size - - if push_remove_branch?(ref, newrev) - @push_commits = [] - elsif push_to_new_branch?(ref, oldrev) - # Re-find the pushed commits. - if is_default_branch?(ref) - # Initial push to the default branch. Take the full history of that branch as "newly pushed". - @push_commits = project.repository.commits(newrev) - - # Set protection on the default branch if configured - if (current_application_settings.default_branch_protection != PROTECTION_NONE) - developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false - project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push }) - end - else - # Use the pushed commits that aren't reachable by the default branch - # as a heuristic. This may include more commits than are actually pushed, but - # that shouldn't matter because we check for existing cross-references later. - @push_commits = project.repository.commits_between(project.default_branch, newrev) - - # don't process commits for the initial push to the default branch - process_commit_messages(ref) - end - elsif push_to_existing_branch?(ref, oldrev) - # Collect data for this git push - @push_commits = project.repository.commits_between(oldrev, newrev) - project.update_merge_requests(oldrev, newrev, ref, @user) - process_commit_messages(ref) - end - - @push_data = build_push_data(oldrev, newrev, ref) - - EventCreateService.new.push(project, user, @push_data) - project.execute_hooks(@push_data.dup, :push_hooks) - project.execute_services(@push_data.dup, :push_hooks) - end - - protected - - # Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched, - # close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables. - def process_commit_messages(ref) - is_default_branch = is_default_branch?(ref) - - @push_commits.each do |commit| - # Close issues if these commits were pushed to the project's default branch and the commit message matches the - # closing regex. Exclude any mentioned Issues from cross-referencing even if the commits are being pushed to - # a different branch. - issues_to_close = commit.closes_issues(project, user) - - # Load commit author only if needed. - # For push with 1k commits it prevents 900+ requests in database - author = nil - - if issues_to_close.present? && is_default_branch - author ||= commit_user(commit) - - issues_to_close.each do |issue| - Issues::CloseService.new(project, author, {}).execute(issue, commit) - end - end - - # 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). - refs = commit.references(project, user) - issues_to_close - refs.reject! { |r| commit.has_mentioned?(r) } - - if refs.present? - author ||= commit_user(commit) - - refs.each do |r| - Note.create_cross_reference_note(r, commit, author, project) - end - end - end - end - - def build_push_data(oldrev, newrev, ref) - Gitlab::PushDataBuilder. - build(project, user, oldrev, newrev, ref, push_commits) - end - - def push_to_existing_branch?(ref, oldrev) - # Return if this is not a push to a branch (e.g. new commits) - Gitlab::Git.branch_ref?(ref) && !Gitlab::Git.blank_ref?(oldrev) - end - - def push_to_new_branch?(ref, oldrev) - Gitlab::Git.branch_ref?(ref) && Gitlab::Git.blank_ref?(oldrev) - end - - def push_remove_branch?(ref, newrev) - Gitlab::Git.branch_ref?(ref) && Gitlab::Git.blank_ref?(newrev) - end - - def push_to_branch?(ref) - Gitlab::Git.branch_ref?(ref) - end - - def is_default_branch?(ref) - Gitlab::Git.branch_ref?(ref) && Gitlab::Git.ref_name(ref) == project.default_branch - end - - def commit_user(commit) - commit.author || user - end -end diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb deleted file mode 100644 index bf203bbd692..00000000000 --- a/app/services/git_tag_push_service.rb +++ /dev/null @@ -1,37 +0,0 @@ -class GitTagPushService - attr_accessor :project, :user, :push_data - - def execute(project, user, oldrev, newrev, ref) - @project, @user = project, user - - @push_data = build_push_data(oldrev, newrev, ref) - - EventCreateService.new.push(project, user, @push_data) - project.execute_hooks(@push_data.dup, :tag_push_hooks) - project.execute_services(@push_data.dup, :tag_push_hooks) - - project.repository.expire_cache - - true - end - - private - - def build_push_data(oldrev, newrev, ref) - commits = [] - message = nil - - if !Gitlab::Git.blank_ref?(newrev) - tag_name = Gitlab::Git.ref_name(ref) - tag = project.repository.find_tag(tag_name) - if tag && tag.target == newrev - commit = project.repository.commit(tag.target) - commits = [commit].compact - message = tag.message - end - end - - Gitlab::PushDataBuilder. - build(project, user, oldrev, newrev, ref, commits, message) - end -end diff --git a/app/services/gravatar_service.rb b/app/services/gravatar_service.rb deleted file mode 100644 index 4bee0c26a68..00000000000 --- a/app/services/gravatar_service.rb +++ /dev/null @@ -1,30 +0,0 @@ -class GravatarService - include Gitlab::CurrentSettings - - def execute(email, size = nil) - if current_application_settings.gravatar_enabled? && email.present? - size = 40 if size.nil? || size <= 0 - - sprintf gravatar_url, - hash: Digest::MD5.hexdigest(email.strip.downcase), - size: size, - email: email.strip - end - end - - def gitlab_config - Gitlab.config.gitlab - end - - def gravatar_config - Gitlab.config.gravatar - end - - def gravatar_url - if gitlab_config.https - gravatar_config.ssl_url - else - gravatar_config.plain_url - end - end -end diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb deleted file mode 100644 index 5e1906ad2ae..00000000000 --- a/app/services/issuable_base_service.rb +++ /dev/null @@ -1,18 +0,0 @@ -class IssuableBaseService < BaseService - private - - def create_assignee_note(issuable) - Note.create_assignee_change_note( - issuable, issuable.project, current_user, issuable.assignee) - end - - def create_milestone_note(issuable) - Note.create_milestone_change_note( - issuable, issuable.project, current_user, issuable.milestone) - end - - def create_labels_note(issuable, added_labels, removed_labels) - Note.create_labels_change_note( - issuable, issuable.project, current_user, added_labels, removed_labels) - end -end diff --git a/app/services/issues/base_service.rb b/app/services/issues/base_service.rb deleted file mode 100644 index c3ca04a4343..00000000000 --- a/app/services/issues/base_service.rb +++ /dev/null @@ -1,19 +0,0 @@ -module Issues - class BaseService < ::IssuableBaseService - - def hook_data(issue, action) - issue_data = issue.to_hook_data(current_user) - issue_url = Gitlab::UrlBuilder.new(:issue).build(issue.id) - issue_data[:object_attributes].merge!(url: issue_url, action: action) - issue_data - end - - private - - def execute_hooks(issue, action = 'open') - issue_data = hook_data(issue, action) - issue.project.execute_hooks(issue_data, :issue_hooks) - issue.project.execute_services(issue_data, :issue_hooks) - end - end -end diff --git a/app/services/issues/bulk_update_service.rb b/app/services/issues/bulk_update_service.rb deleted file mode 100644 index eb07413ee94..00000000000 --- a/app/services/issues/bulk_update_service.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Issues - class BulkUpdateService < BaseService - def execute - issues_ids = params.delete(:issues_ids).split(",") - issue_params = params - - issue_params.delete(:state_event) unless issue_params[:state_event].present? - issue_params.delete(:milestone_id) unless issue_params[:milestone_id].present? - issue_params.delete(:assignee_id) unless issue_params[:assignee_id].present? - - issues = Issue.where(id: issues_ids) - issues.each do |issue| - next unless can?(current_user, :modify_issue, issue) - - Issues::UpdateService.new(issue.project, current_user, issue_params).execute(issue) - end - - { - count: issues.count, - success: !issues.count.zero? - } - end - end -end diff --git a/app/services/issues/close_service.rb b/app/services/issues/close_service.rb deleted file mode 100644 index f670019cc63..00000000000 --- a/app/services/issues/close_service.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Issues - class CloseService < Issues::BaseService - def execute(issue, commit = nil) - if issue.close - event_service.close_issue(issue, current_user) - create_note(issue, commit) - notification_service.close_issue(issue, current_user) - execute_hooks(issue, 'close') - end - - issue - end - - private - - def create_note(issue, current_commit) - Note.create_status_change_note(issue, issue.project, current_user, issue.state, current_commit) - end - end -end diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb deleted file mode 100644 index d5c17906a55..00000000000 --- a/app/services/issues/create_service.rb +++ /dev/null @@ -1,19 +0,0 @@ -module Issues - class CreateService < Issues::BaseService - def execute - label_params = params[:label_ids] - issue = project.issues.new(params.except(:label_ids)) - issue.author = current_user - - if issue.save - issue.update_attributes(label_ids: label_params) - notification_service.new_issue(issue, current_user) - event_service.open_issue(issue, current_user) - issue.create_cross_references!(issue.project, current_user) - execute_hooks(issue, 'open') - end - - issue - end - end -end diff --git a/app/services/issues/reopen_service.rb b/app/services/issues/reopen_service.rb deleted file mode 100644 index 1e5c398516d..00000000000 --- a/app/services/issues/reopen_service.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Issues - class ReopenService < Issues::BaseService - def execute(issue) - if issue.reopen - event_service.reopen_issue(issue, current_user) - create_note(issue) - notification_service.reopen_issue(issue, current_user) - execute_hooks(issue, 'reopen') - end - - issue - end - - private - - def create_note(issue) - Note.create_status_change_note(issue, issue.project, current_user, issue.state, nil) - end - end -end diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb deleted file mode 100644 index 8f04a69287a..00000000000 --- a/app/services/issues/update_service.rb +++ /dev/null @@ -1,47 +0,0 @@ -module Issues - class UpdateService < Issues::BaseService - def execute(issue) - state = params[:state_event] - - case state - when 'reopen' - Issues::ReopenService.new(project, current_user, {}).execute(issue) - when 'close' - Issues::CloseService.new(project, current_user, {}).execute(issue) - when 'task_check' - issue.update_nth_task(params[:task_num].to_i, true) - when 'task_uncheck' - issue.update_nth_task(params[:task_num].to_i, false) - end - - params[:assignee_id] = "" if params[:assignee_id] == IssuableFinder::NONE - params[:milestone_id] = "" if params[:milestone_id] == IssuableFinder::NONE - - old_labels = issue.labels.to_a - - if params.present? && issue.update_attributes(params.except(:state_event, - :task_num)) - issue.reset_events_cache - - if issue.labels != old_labels - create_labels_note( - issue, issue.labels - old_labels, old_labels - issue.labels) - end - - if issue.previous_changes.include?('milestone_id') - create_milestone_note(issue) - end - - if issue.previous_changes.include?('assignee_id') - create_assignee_note(issue) - notification_service.reassigned_issue(issue, current_user) - end - - issue.notice_added_references(issue.project, current_user) - execute_hooks(issue, 'update') - end - - issue - end - end -end 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 378b39bb9d6..00000000000 --- 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) - - 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 9579573adf9..00000000000 --- 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/base_service.rb b/app/services/merge_requests/base_service.rb deleted file mode 100644 index f6e1ae6f283..00000000000 --- a/app/services/merge_requests/base_service.rb +++ /dev/null @@ -1,24 +0,0 @@ -module MergeRequests - class BaseService < ::IssuableBaseService - - def create_note(merge_request) - Note.create_status_change_note(merge_request, merge_request.target_project, current_user, merge_request.state, nil) - end - - def hook_data(merge_request, action) - hook_data = merge_request.to_hook_data(current_user) - merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id) - hook_data[:object_attributes][:url] = merge_request_url - hook_data[:object_attributes][:action] = action - hook_data - end - - def execute_hooks(merge_request, action = 'open') - if merge_request.project - merge_data = hook_data(merge_request, action) - merge_request.project.execute_hooks(merge_data, :merge_request_hooks) - merge_request.project.execute_services(merge_data, :merge_request_hooks) - end - end - end -end diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb deleted file mode 100644 index a44b91166e8..00000000000 --- a/app/services/merge_requests/build_service.rb +++ /dev/null @@ -1,74 +0,0 @@ -module MergeRequests - class BuildService < MergeRequests::BaseService - def execute - merge_request = MergeRequest.new(params) - - # Set MR attributes - merge_request.can_be_created = false - merge_request.compare_failed = false - merge_request.compare_commits = [] - merge_request.compare_diffs = [] - merge_request.source_project = project unless merge_request.source_project - 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) - end - - compare_result = CompareService.new.execute( - current_user, - merge_request.source_project, - merge_request.source_branch, - merge_request.target_project, - merge_request.target_branch, - ) - - commits = compare_result.commits - - # At this point we decide if merge request can be created - # If we have at least one commit to merge -> creation allowed - if commits.present? - merge_request.compare_commits = Commit.decorate(commits) - merge_request.can_be_created = true - merge_request.compare_failed = false - - # Try to collect diff for merge request. - diffs = compare_result.diffs - - if diffs.present? - merge_request.compare_diffs = diffs - - elsif diffs == false - # satellite timeout return false - merge_request.can_be_created = false - merge_request.compare_failed = true - end - else - merge_request.can_be_created = false - merge_request.compare_failed = false - end - - commits = merge_request.compare_commits - if commits && commits.count == 1 - commit = commits.first - merge_request.title = commit.title - merge_request.description = commit.description.try(:strip) - else - merge_request.title = merge_request.source_branch.titleize.humanize - 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) - merge_request.errors.add(:base, message) unless message.nil? - merge_request.compare_commits = [] - merge_request.can_be_created = false - merge_request - end - end -end diff --git a/app/services/merge_requests/close_service.rb b/app/services/merge_requests/close_service.rb deleted file mode 100644 index 47454f9f0c2..00000000000 --- a/app/services/merge_requests/close_service.rb +++ /dev/null @@ -1,18 +0,0 @@ -module MergeRequests - class CloseService < MergeRequests::BaseService - def execute(merge_request, commit = nil) - # If we close MergeRequest we want to ignore validation - # so we can close broken one (Ex. fork project removed) - merge_request.allow_broken = true - - if merge_request.close - event_service.close_mr(merge_request, current_user) - create_note(merge_request) - notification_service.close_mr(merge_request, current_user) - execute_hooks(merge_request, 'close') - end - - merge_request - end - end -end diff --git a/app/services/merge_requests/create_service.rb b/app/services/merge_requests/create_service.rb deleted file mode 100644 index ca8d80f6c0c..00000000000 --- a/app/services/merge_requests/create_service.rb +++ /dev/null @@ -1,21 +0,0 @@ -module MergeRequests - class CreateService < MergeRequests::BaseService - def execute - label_params = params[:label_ids] - merge_request = MergeRequest.new(params.except(:label_ids)) - merge_request.source_project = project - merge_request.target_project ||= project - merge_request.author = current_user - - if merge_request.save - merge_request.update_attributes(label_ids: label_params) - event_service.open_mr(merge_request, current_user) - notification_service.new_merge_request(merge_request, current_user) - merge_request.create_cross_references!(merge_request.project, current_user) - execute_hooks(merge_request) - end - - merge_request - end - end -end diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb deleted file mode 100644 index 327ead4ff3f..00000000000 --- a/app/services/merge_requests/merge_service.rb +++ /dev/null @@ -1,22 +0,0 @@ -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 - def execute(merge_request, 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 - rescue - false - end - end -end diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb deleted file mode 100644 index e9b526d1fb7..00000000000 --- a/app/services/merge_requests/refresh_service.rb +++ /dev/null @@ -1,94 +0,0 @@ -module MergeRequests - class RefreshService < MergeRequests::BaseService - def execute(oldrev, newrev, ref) - return true unless Gitlab::Git.branch_ref?(ref) - - @oldrev, @newrev = oldrev, newrev - @branch_name = Gitlab::Git.ref_name(ref) - @fork_merge_requests = @project.fork_merge_requests.opened - @commits = @project.repository.commits_between(oldrev, newrev) - - close_merge_requests - reload_merge_requests - comment_mr_with_commits - - true - end - - private - - # Collect open merge requests that target same branch we push into - # and close if push to master include last commit from merge request - # We need this to close(as merged) merge requests that were merged into - # target branch manually - def close_merge_requests - commit_ids = @commits.map(&:id) - merge_requests = @project.merge_requests.opened.where(target_branch: @branch_name).to_a - merge_requests = merge_requests.select(&:last_commit) - - merge_requests = merge_requests.select do |merge_request| - commit_ids.include?(merge_request.last_commit.id) - end - - - merge_requests.uniq.select(&:source_project).each do |merge_request| - MergeRequests::MergeService. - new(merge_request.target_project, @current_user). - execute(merge_request, nil) - end - end - - def force_push? - Gitlab::ForcePushCheck.force_push?(@project, @oldrev, @newrev) - end - - # Refresh merge request diff if we push to source or target branch of merge request - # Note: we should update merge requests from forks too - def reload_merge_requests - merge_requests = @project.merge_requests.opened.by_branch(@branch_name).to_a - merge_requests += @fork_merge_requests.by_branch(@branch_name).to_a - merge_requests = filter_merge_requests(merge_requests) - - merge_requests.each do |merge_request| - - if merge_request.source_branch == @branch_name || force_push? - merge_request.reload_code - merge_request.mark_as_unchecked - else - mr_commit_ids = merge_request.commits.map(&:id) - push_commit_ids = @commits.map(&:id) - matches = mr_commit_ids & push_commit_ids - - if matches.any? - merge_request.reload_code - merge_request.mark_as_unchecked - else - merge_request.mark_as_unchecked - end - end - end - end - - # Add comment about pushing new commits to merge requests - def comment_mr_with_commits - merge_requests = @project.origin_merge_requests.opened.where(source_branch: @branch_name).to_a - merge_requests += @fork_merge_requests.where(source_branch: @branch_name).to_a - merge_requests = filter_merge_requests(merge_requests) - - merge_requests.each do |merge_request| - mr_commit_ids = Set.new(merge_request.commits.map(&:id)) - - new_commits, existing_commits = @commits.partition do |commit| - mr_commit_ids.include?(commit.id) - end - - Note.create_new_commits_note(merge_request, merge_request.project, - @current_user, new_commits, existing_commits, @oldrev) - end - end - - def filter_merge_requests(merge_requests) - merge_requests.uniq.select(&:source_project) - end - end -end diff --git a/app/services/merge_requests/reopen_service.rb b/app/services/merge_requests/reopen_service.rb deleted file mode 100644 index 8279ad2001b..00000000000 --- a/app/services/merge_requests/reopen_service.rb +++ /dev/null @@ -1,16 +0,0 @@ -module MergeRequests - class ReopenService < MergeRequests::BaseService - def execute(merge_request) - if merge_request.reopen - event_service.reopen_mr(merge_request, current_user) - create_note(merge_request) - notification_service.reopen_mr(merge_request, current_user) - execute_hooks(merge_request, 'reopen') - merge_request.reload_code - merge_request.mark_as_unchecked - end - - merge_request - end - end -end diff --git a/app/services/merge_requests/update_service.rb b/app/services/merge_requests/update_service.rb deleted file mode 100644 index 23af2656c37..00000000000 --- a/app/services/merge_requests/update_service.rb +++ /dev/null @@ -1,60 +0,0 @@ -require_relative 'base_service' -require_relative 'reopen_service' -require_relative 'close_service' - -module MergeRequests - class UpdateService < MergeRequests::BaseService - def execute(merge_request) - # We dont allow change of source/target projects - # after merge request was created - params.except!(:source_project_id) - params.except!(:target_project_id) - - state = params[:state_event] - - case state - when 'reopen' - MergeRequests::ReopenService.new(project, current_user, {}).execute(merge_request) - when 'close' - MergeRequests::CloseService.new(project, current_user, {}).execute(merge_request) - when 'task_check' - merge_request.update_nth_task(params[:task_num].to_i, true) - when 'task_uncheck' - merge_request.update_nth_task(params[:task_num].to_i, false) - end - - params[:assignee_id] = "" if params[:assignee_id] == IssuableFinder::NONE - params[:milestone_id] = "" if params[:milestone_id] == IssuableFinder::NONE - - old_labels = merge_request.labels.to_a - - if params.present? && merge_request.update_attributes( - params.except(:state_event, :task_num) - ) - merge_request.reset_events_cache - - if merge_request.labels != old_labels - create_labels_note( - merge_request, - merge_request.labels - old_labels, - old_labels - merge_request.labels - ) - end - - if merge_request.previous_changes.include?('milestone_id') - create_milestone_note(merge_request) - end - - if merge_request.previous_changes.include?('assignee_id') - create_assignee_note(merge_request) - notification_service.reassigned_merge_request(merge_request, current_user) - end - - merge_request.notice_added_references(merge_request.project, current_user) - execute_hooks(merge_request, 'update') - end - - merge_request - end - end -end diff --git a/app/services/milestones/base_service.rb b/app/services/milestones/base_service.rb deleted file mode 100644 index 176ab9f1ab5..00000000000 --- a/app/services/milestones/base_service.rb +++ /dev/null @@ -1,4 +0,0 @@ -module Milestones - class BaseService < ::BaseService - end -end diff --git a/app/services/milestones/close_service.rb b/app/services/milestones/close_service.rb deleted file mode 100644 index 608fc49d766..00000000000 --- a/app/services/milestones/close_service.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Milestones - class CloseService < Milestones::BaseService - def execute(milestone) - if milestone.close - event_service.close_milestone(milestone, current_user) - end - - milestone - end - end -end diff --git a/app/services/milestones/create_service.rb b/app/services/milestones/create_service.rb deleted file mode 100644 index b8e08c9f1eb..00000000000 --- a/app/services/milestones/create_service.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Milestones - class CreateService < Milestones::BaseService - def execute - milestone = project.milestones.new(params) - - if milestone.save - event_service.open_milestone(milestone, current_user) - end - - milestone - end - end -end diff --git a/app/services/milestones/group_service.rb b/app/services/milestones/group_service.rb deleted file mode 100644 index 11d702f1e7b..00000000000 --- a/app/services/milestones/group_service.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Milestones - class GroupService < Milestones::BaseService - def initialize(project_milestones) - @project_milestones = project_milestones.group_by(&:title) - end - - def execute - build(@project_milestones) - end - - def milestone(title) - if title - group_milestone = @project_milestones[title].group_by(&:title) - build(group_milestone).first - else - nil - end - end - - private - - def build(milestone) - milestone.map{ |title, milestones| GroupMilestone.new(title, milestones) } - end - end -end diff --git a/app/services/milestones/reopen_service.rb b/app/services/milestones/reopen_service.rb deleted file mode 100644 index 573f9ee5c21..00000000000 --- a/app/services/milestones/reopen_service.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Milestones - class ReopenService < Milestones::BaseService - def execute(milestone) - if milestone.activate - event_service.reopen_milestone(milestone, current_user) - end - - milestone - end - end -end diff --git a/app/services/milestones/update_service.rb b/app/services/milestones/update_service.rb deleted file mode 100644 index ed64847f429..00000000000 --- a/app/services/milestones/update_service.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Milestones - class UpdateService < Milestones::BaseService - def execute(milestone) - state = params[:state_event] - - case state - when 'activate' - Milestones::ReopenService.new(project, current_user, {}).execute(milestone) - when 'close' - Milestones::CloseService.new(project, current_user, {}).execute(milestone) - end - - if params.present? - milestone.update_attributes(params.except(:state_event)) - end - - milestone - end - end -end diff --git a/app/services/notes/create_service.rb b/app/services/notes/create_service.rb deleted file mode 100644 index e969061f229..00000000000 --- a/app/services/notes/create_service.rb +++ /dev/null @@ -1,38 +0,0 @@ -module Notes - class CreateService < BaseService - def execute - note = project.notes.new(params) - note.author = current_user - note.system = false - - if note.save - notification_service.new_note(note) - - # Skip system notes, like status changes and cross-references. - unless note.system - event_service.leave_note(note, note.author) - - # Create a cross-reference note if this Note contains GFM that names an - # issue, merge request, or commit. - note.references.each do |mentioned| - Note.create_cross_reference_note(mentioned, note.noteable, note.author, note.project) - end - - execute_hooks(note) - end - end - - note - end - - def hook_data(note) - Gitlab::NoteDataBuilder.build(note, current_user) - end - - def execute_hooks(note) - note_data = hook_data(note) - # TODO: Support Webhooks - note.project.execute_services(note_data, :note_hooks) - end - end -end diff --git a/app/services/notes/update_service.rb b/app/services/notes/update_service.rb deleted file mode 100644 index 63431b82471..00000000000 --- a/app/services/notes/update_service.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Notes - class UpdateService < BaseService - def execute - note = project.notes.find(params[:note_id]) - note.note = params[:note] - if note.save - notification_service.new_note(note) - - # Skip system notes, like status changes and cross-references. - unless note.system - event_service.leave_note(note, note.author) - - # Create a cross-reference note if this Note contains GFM that - # names an issue, merge request, or commit. - note.references.each do |mentioned| - Note.create_cross_reference_note(mentioned, note.noteable, - note.author, note.project) - end - end - end - - note - end - end -end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb deleted file mode 100644 index cfed7964c37..00000000000 --- a/app/services/notification_service.rb +++ /dev/null @@ -1,432 +0,0 @@ -# NotificationService class -# -# Used for notifying users with emails about different events -# -# Ex. -# NotificationService.new.new_issue(issue, current_user) -# -class NotificationService - # Always notify user about ssh key added - # only if ssh key is not deploy key - # - # This is security email so it will be sent - # even if user disabled notifications - def new_key(key) - if key.user - mailer.new_ssh_key_email(key.id) - end - end - - # Always notify user about email added to profile - def new_email(email) - if email.user - mailer.new_email_email(email.id) - end - end - - # When create an issue we should send next emails: - # - # * issue assignee if their notification level is not Disabled - # * project team members with notification level higher then Participating - # - def new_issue(issue, current_user) - new_resource_email(issue, issue.project, 'new_issue_email') - end - - # When we close an issue we should send next emails: - # - # * issue author if their notification level is not Disabled - # * issue assignee if their notification level is not Disabled - # * project team members with notification level higher then Participating - # - def close_issue(issue, current_user) - close_resource_email(issue, issue.project, current_user, 'closed_issue_email') - end - - # When we reassign an issue we should send next emails: - # - # * issue old assignee if their notification level is not Disabled - # * issue new assignee if their notification level is not Disabled - # - def reassigned_issue(issue, current_user) - reassign_resource_email(issue, issue.project, current_user, 'reassigned_issue_email') - end - - - # When create a merge request we should send next emails: - # - # * mr assignee if their notification level is not Disabled - # - def new_merge_request(merge_request, current_user) - new_resource_email(merge_request, merge_request.target_project, 'new_merge_request_email') - end - - # When we reassign a merge_request we should send next emails: - # - # * merge_request old assignee if their notification level is not Disabled - # * merge_request assignee if their notification level is not Disabled - # - def reassigned_merge_request(merge_request, current_user) - reassign_resource_email(merge_request, merge_request.target_project, current_user, 'reassigned_merge_request_email') - end - - # When we close a merge request we should send next emails: - # - # * merge_request author if their notification level is not Disabled - # * merge_request assignee if their notification level is not Disabled - # * project team members with notification level higher then Participating - # - def close_mr(merge_request, current_user) - close_resource_email(merge_request, merge_request.target_project, current_user, 'closed_merge_request_email') - end - - def reopen_issue(issue, current_user) - reopen_resource_email(issue, issue.project, current_user, 'issue_status_changed_email', 'reopened') - end - - # When we merge a merge request we should send next emails: - # - # * merge_request author if their notification level is not Disabled - # * merge_request assignee if their notification level is not Disabled - # * project team members with notification level higher then Participating - # - def merge_mr(merge_request, current_user) - recipients = reject_muted_users([merge_request.author, merge_request.assignee], merge_request.target_project) - recipients = add_subscribed_users(recipients, merge_request) - recipients = reject_unsubscribed_users(recipients, merge_request) - recipients = recipients.concat(project_watchers(merge_request.target_project)).uniq - recipients.delete(current_user) - - recipients.each do |recipient| - mailer.merged_merge_request_email(recipient.id, merge_request.id, current_user.id) - end - end - - def reopen_mr(merge_request, current_user) - reopen_resource_email(merge_request, merge_request.target_project, current_user, 'merge_request_status_email', 'reopened') - end - - # Notify new user with email after creation - def new_user(user, token = nil) - # Don't email omniauth created users - mailer.new_user_email(user.id, token) unless user.identities.any? - end - - # Notify users on new note in system - # - # TODO: split on methods and refactor - # - def new_note(note) - return true unless note.noteable_type.present? - - # ignore gitlab service messages - return true if note.note.start_with?('Status changed to closed') - return true if note.cross_reference? && note.system == true - - target = note.noteable - - recipients = [] - - if note.commit_id.present? - recipients << note.commit_author - end - - # Add all users participating in the thread (author, assignee, comment authors) - participants = - if target.respond_to?(:participants) - target.participants - elsif target.is_a?(Commit) - author_ids = Note.for_commit_id(target.id).pluck(:author_id).uniq - User.where(id: author_ids) - else - note.mentioned_users - end - recipients = recipients.concat(participants) - - # Merge project watchers - recipients = recipients.concat(project_watchers(note.project)).compact.uniq - - # 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 - - # Reject mutes users - recipients = reject_muted_users(recipients, note.project) - - recipients = add_subscribed_users(recipients, note.noteable) - - recipients = reject_unsubscribed_users(recipients, note.noteable) - - # Reject author - recipients.delete(note.author) - - # build notify method like 'note_commit_email' - notify_method = "note_#{note.noteable_type.underscore}_email".to_sym - - recipients.each do |recipient| - mailer.send(notify_method, recipient.id, note.id) - end - end - - def invite_project_member(project_member, token) - mailer.project_member_invited_email(project_member.id, token) - end - - def accept_project_invite(project_member) - mailer.project_invite_accepted_email(project_member.id) - end - - def decline_project_invite(project_member) - mailer.project_invite_declined_email(project_member.project.id, project_member.invite_email, project_member.access_level, project_member.created_by_id) - end - - def new_project_member(project_member) - mailer.project_access_granted_email(project_member.id) - end - - def update_project_member(project_member) - mailer.project_access_granted_email(project_member.id) - end - - def invite_group_member(group_member, token) - mailer.group_member_invited_email(group_member.id, token) - end - - def accept_group_invite(group_member) - mailer.group_invite_accepted_email(group_member.id) - end - - def decline_group_invite(group_member) - mailer.group_invite_declined_email(group_member.group.id, group_member.invite_email, group_member.access_level, group_member.created_by_id) - end - - def new_group_member(group_member) - mailer.group_access_granted_email(group_member.id) - end - - def update_group_member(group_member) - mailer.group_access_granted_email(group_member.id) - end - - def project_was_moved(project) - recipients = project.team.members - recipients = reject_muted_users(recipients, project) - - recipients.each do |recipient| - mailer.project_was_moved_email(project.id, recipient.id) - end - end - - protected - - # Get project users with WATCH notification level - def project_watchers(project) - project_members = project_member_notification(project) - - users_with_project_level_global = project_member_notification(project, Notification::N_GLOBAL) - users_with_group_level_global = group_member_notification(project, Notification::N_GLOBAL) - users = users_with_global_level_watch([users_with_project_level_global, users_with_group_level_global].flatten.uniq) - - users_with_project_setting = select_project_member_setting(project, users_with_project_level_global, users) - users_with_group_setting = select_group_member_setting(project, project_members, users_with_group_level_global, users) - - User.where(id: users_with_project_setting.concat(users_with_group_setting).uniq).to_a - end - - def project_member_notification(project, notification_level=nil) - project_members = project.project_members - - if notification_level - project_members.where(notification_level: notification_level).pluck(:user_id) - else - project_members.pluck(:user_id) - end - end - - def group_member_notification(project, notification_level) - if project.group - project.group.group_members.where(notification_level: notification_level).pluck(:user_id) - else - [] - end - end - - def users_with_global_level_watch(ids) - User.where( - id: ids, - notification_level: Notification::N_WATCH - ).pluck(:id) - end - - # Build a list of users based on project notifcation settings - def select_project_member_setting(project, global_setting, users_global_level_watch) - users = project_member_notification(project, Notification::N_WATCH) - - # If project setting is global, add to watch list if global setting is watch - global_setting.each do |user_id| - if users_global_level_watch.include?(user_id) - users << user_id - end - end - - users - end - - # Build a list of users based on group notification settings - def select_group_member_setting(project, project_members, global_setting, users_global_level_watch) - uids = group_member_notification(project, Notification::N_WATCH) - - # Group setting is watch, add to users list if user is not project member - users = [] - uids.each do |user_id| - if project_members.exclude?(user_id) - users << user_id - end - end - - # Group setting is global, add to users list if global setting is watch - global_setting.each do |user_id| - if project_members.exclude?(user_id) && users_global_level_watch.include?(user_id) - users << user_id - end - end - - users - end - - # Remove users with disabled notifications from array - # Also remove duplications and nil recipients - def reject_muted_users(users, project = nil) - users = users.to_a.compact.uniq - users = users.reject(&:blocked?) - - users.reject do |user| - next user.notification.disabled? unless project - - member = project.project_members.find_by(user_id: user.id) - - if !member && project.group - member = project.group.group_members.find_by(user_id: user.id) - end - - # reject users who globally disabled notification and has no membership - next user.notification.disabled? unless member - - # reject users who disabled notification in project - next true if member.notification.disabled? - - # reject users who have N_GLOBAL in project and disabled in global settings - member.notification.global? && user.notification.disabled? - end - end - - # Remove users with notification level 'Mentioned' - def reject_mention_users(users, project = nil) - users = users.to_a.compact.uniq - - users.reject do |user| - next user.notification.mention? unless project - - member = project.project_members.find_by(user_id: user.id) - - if !member && project.group - member = project.group.group_members.find_by(user_id: user.id) - end - - # reject users who globally set mention notification and has no membership - next user.notification.mention? unless member - - # reject users who set mention notification in project - next true if member.notification.mention? - - # reject users who have N_MENTION in project and disabled in global settings - member.notification.global? && user.notification.mention? - end - end - - def reject_unsubscribed_users(recipients, target) - return recipients unless target.respond_to? :subscriptions - - recipients.reject do |user| - subscription = target.subscriptions.find_by_user_id(user.id) - subscription && !subscription.subscribed - end - end - - def add_subscribed_users(recipients, target) - return recipients unless target.respond_to? :subscriptions - - subscriptions = target.subscriptions - - if subscriptions.any? - recipients + subscriptions.where(subscribed: true).map(&:user) - else - recipients - end - end - - def new_resource_email(target, project, method) - recipients = build_recipients(target, project) - recipients.delete(target.author) - - recipients.each do |recipient| - mailer.send(method, recipient.id, target.id) - end - end - - def close_resource_email(target, project, current_user, method) - recipients = build_recipients(target, project) - recipients.delete(current_user) - - recipients.each do |recipient| - mailer.send(method, recipient.id, target.id, current_user.id) - end - end - - def reassign_resource_email(target, project, current_user, method) - assignee_id_was = previous_record(target, "assignee_id") - recipients = build_recipients(target, project) - recipients.delete(current_user) - - recipients.each do |recipient| - mailer.send(method, recipient.id, target.id, assignee_id_was, current_user.id) - end - end - - def reopen_resource_email(target, project, current_user, method, status) - recipients = build_recipients(target, project) - recipients.delete(current_user) - - recipients.each do |recipient| - mailer.send(method, recipient.id, target.id, status, current_user.id) - end - end - - def build_recipients(target, project) - recipients = - if target.respond_to?(:participants) - target.participants - else - [target.author, target.assignee] - end - - recipients = reject_muted_users(recipients, project) - recipients = reject_mention_users(recipients, project) - recipients = add_subscribed_users(recipients, target) - recipients = recipients.concat(project_watchers(project)).uniq - recipients = reject_unsubscribed_users(recipients, target) - recipients - end - - def mailer - Notify.delay - end - - def previous_record(object, attribute) - if object && attribute - if object.previous_changes.include?(attribute) - object.previous_changes[attribute].first - end - end - end -end diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb deleted file mode 100644 index 6194f6ce91e..00000000000 --- a/app/services/oauth2/access_token_validation_service.rb +++ /dev/null @@ -1,41 +0,0 @@ -module Oauth2::AccessTokenValidationService - # Results: - VALID = :valid - EXPIRED = :expired - REVOKED = :revoked - INSUFFICIENT_SCOPE = :insufficient_scope - - class << self - def validate(token, scopes: []) - if token.expired? - return EXPIRED - - elsif token.revoked? - return REVOKED - - elsif !self.sufficient_scope?(token, scopes) - return INSUFFICIENT_SCOPE - - else - return VALID - end - end - - protected - # True if the token's scope is a superset of required scopes, - # or the required scopes is empty. - def sufficient_scope?(token, scopes) - if scopes.blank? - # if no any scopes required, the scopes of token is sufficient. - return true - else - # If there are scopes required, then check whether - # the set of authorized scopes is a superset of the set of required scopes - required_scopes = Set.new(scopes) - authorized_scopes = Set.new(token.scopes) - - return authorized_scopes >= required_scopes - end - end - end -end diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb deleted file mode 100644 index 7408e09ed1e..00000000000 --- a/app/services/projects/autocomplete_service.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Projects - class AutocompleteService < BaseService - def initialize(project) - @project = project - end - - def issues - @project.issues.opened.select([:iid, :title]) - end - - def merge_requests - @project.merge_requests.opened.select([:iid, :title]) - end - end -end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb deleted file mode 100644 index a7afcf8f64b..00000000000 --- a/app/services/projects/create_service.rb +++ /dev/null @@ -1,96 +0,0 @@ -module Projects - class CreateService < BaseService - def initialize(user, params) - @current_user, @params = user, params.dup - end - - def execute - @project = Project.new(params) - - # Make sure that the user is allowed to use the specified visibility - # level - unless Gitlab::VisibilityLevel.allowed_for?(current_user, - params[:visibility_level]) - deny_visibility_level(@project) - return @project - end - - # Set project name from path - if @project.name.present? && @project.path.present? - # if both name and path set - everything is ok - elsif @project.path.present? - # Set project name from path - @project.name = @project.path.dup - elsif @project.name.present? - # For compatibility - set path from name - # TODO: remove this in 8.0 - @project.path = @project.name.dup.parameterize - end - - # get namespace id - namespace_id = params[:namespace_id] - - if namespace_id - # Find matching namespace and check if it allowed - # for current user if namespace_id passed. - unless allowed_namespace?(current_user, namespace_id) - @project.namespace_id = nil - deny_namespace - return @project - end - else - # Set current user namespace if namespace_id is nil - @project.namespace_id = current_user.namespace_id - end - - @project.creator = current_user - - Project.transaction do - @project.save - - unless @project.import? - unless @project.create_repository - raise 'Failed to create repository' - end - end - end - - after_create_actions if @project.persisted? - - @project - rescue => ex - @project.errors.add(:base, "Can't save project. Please try again later") - @project - end - - protected - - def deny_namespace - @project.errors.add(:namespace, "is not valid") - end - - def allowed_namespace?(user, namespace_id) - namespace = Namespace.find_by(id: namespace_id) - current_user.can?(:create_projects, namespace) - end - - def after_create_actions - log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") - - @project.create_wiki if @project.wiki_enabled? - - event_service.create_project(@project, current_user) - system_hook_service.execute_hooks_for(@project, :create) - - unless @project.group - @project.team << [current_user, :master, current_user] - end - - @project.update_column(:last_activity_at, @project.created_at) - - if @project.import? - @project.import_start - end - end - end -end diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb deleted file mode 100644 index 7e1d753b021..00000000000 --- a/app/services/projects/destroy_service.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Projects - class DestroyService < BaseService - def execute - return false unless can?(current_user, :remove_project, project) - - project.team.truncate - project.repository.expire_cache unless project.empty_repo? - - if project.destroy - GitlabShellWorker.perform_async( - :remove_repository, - project.path_with_namespace - ) - - GitlabShellWorker.perform_async( - :remove_repository, - project.path_with_namespace + ".wiki" - ) - - project.satellite.destroy - - log_info("Project \"#{project.name}\" was removed") - system_hook_service.execute_hooks_for(project, :destroy) - true - end - end - end -end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb deleted file mode 100644 index 1e4deb6ed39..00000000000 --- a/app/services/projects/fork_service.rb +++ /dev/null @@ -1,66 +0,0 @@ -module Projects - class ForkService < BaseService - include Gitlab::ShellAdapter - - def execute - @from_project = @project - - project_params = { - visibility_level: @from_project.visibility_level, - description: @from_project.description, - } - - project = Project.new(project_params) - project.name = @from_project.name - project.path = @from_project.path - project.creator = @current_user - if @from_project.avatar.present? && @from_project.avatar.image? - project.avatar = @from_project.avatar - end - - if namespace = @params[:namespace] - project.namespace = namespace - else - project.namespace = @current_user.namespace - end - - unless @current_user.can?(:create_projects, project.namespace) - project.errors.add(:namespace, 'insufficient access rights') - return project - end - - # If the project cannot save, we do not want to trigger the project destroy - # as this can have the side effect of deleting a repo attached to an existing - # project with the same name and namespace - if project.valid? - begin - Project.transaction do - #First save the DB entries as they can be rolled back if the repo fork fails - project.build_forked_project_link(forked_to_project_id: project.id, forked_from_project_id: @from_project.id) - if project.save - project.team << [@current_user, :master, @current_user] - end - - #Now fork the repo - unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) - raise 'forking failed in gitlab-shell' - end - - project.ensure_satellite_exists - end - - if @from_project.gitlab_ci? - ForkRegistrationWorker.perform_async(@from_project.id, project.id, @current_user.private_token) - end - rescue => ex - project.errors.add(:base, 'Fork transaction failed.') - project.destroy - end - else - project.errors.add(:base, 'Invalid fork destination') - end - - project - end - end -end diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb deleted file mode 100644 index ae6260bcdab..00000000000 --- a/app/services/projects/participants_service.rb +++ /dev/null @@ -1,50 +0,0 @@ -module Projects - class ParticipantsService < BaseService - def execute(note_type, note_id) - participating = - if note_type && note_id - participants_in(note_type, note_id) - else - [] - end - project_members = sorted(project.team.members) - participants = all_members + groups + project_members + participating - participants.uniq - end - - def participants_in(type, id) - users = case type - when "Issue" - issue = project.issues.find_by_iid(id) - issue ? issue.participants(current_user) : [] - when "MergeRequest" - merge_request = project.merge_requests.find_by_iid(id) - merge_request ? merge_request.participants(current_user) : [] - when "Commit" - author_ids = Note.for_commit_id(id).pluck(:author_id).uniq - User.where(id: author_ids) - else - [] - end - sorted(users) - end - - def sorted(users) - users.uniq.to_a.compact.sort_by(&:username).map do |user| - { username: user.username, name: user.name } - end - end - - def groups - current_user.authorized_groups.sort_by(&:path).map do |group| - count = group.users.count - { username: group.path, name: "#{group.name} (#{count})" } - end - end - - def all_members - count = project.team.members.flatten.count - [{ username: "all", name: "All Project and Group Members (#{count})" }] - end - end -end diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb deleted file mode 100644 index 489e03bd5ef..00000000000 --- a/app/services/projects/transfer_service.rb +++ /dev/null @@ -1,74 +0,0 @@ -# Projects::TransferService class -# -# Used for transfer project to another namespace -# -# Ex. -# # Move projects to namespace with ID 17 by user -# Projects::TransferService.new(project, user, namespace_id: 17).execute -# -module Projects - class TransferService < BaseService - include Gitlab::ShellAdapter - class TransferError < StandardError; end - - def execute - namespace_id = params[:new_namespace_id] - namespace = Namespace.find_by(id: namespace_id) - - if allowed_transfer?(current_user, project, namespace) - transfer(project, namespace) - else - project.errors.add(:namespace, 'is invalid') - false - end - rescue Projects::TransferService::TransferError => ex - project.reload - project.errors.add(:namespace_id, ex.message) - false - end - - def transfer(project, new_namespace) - Project.transaction do - old_path = project.path_with_namespace - new_path = File.join(new_namespace.try(:path) || '', project.path) - - if Project.where(path: project.path, namespace_id: new_namespace.try(:id)).present? - 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! - - # Notifications - project.send_move_instructions - - # Move main repository - unless gitlab_shell.mv_repository(old_path, new_path) - raise TransferError.new('Cannot move project') - end - - # 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 - - true - end - end - - def allowed_transfer?(current_user, project, namespace) - namespace && - can?(current_user, :change_namespace, project) && - namespace.id != project.namespace_id && - current_user.can?(:create_projects, namespace) - end - end -end diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb deleted file mode 100644 index 69bdd045ddf..00000000000 --- a/app/services/projects/update_service.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Projects - class UpdateService < BaseService - def execute - # check that user is allowed to set specified visibility_level - new_visibility = params[:visibility_level] - if new_visibility && new_visibility.to_i != project.visibility_level - unless can?(current_user, :change_visibility_level, project) && - Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility) - deny_visibility_level(project, new_visibility) - return project - end - end - - new_branch = params[:default_branch] - - if project.repository.exists? && new_branch && new_branch != project.default_branch - project.change_head(new_branch) - end - - if project.update_attributes(params.except(:default_branch)) - if project.previous_changes.include?('path') - project.rename_repo - end - end - end - end -end diff --git a/app/services/projects/upload_service.rb b/app/services/projects/upload_service.rb deleted file mode 100644 index 992a7a7a1dc..00000000000 --- a/app/services/projects/upload_service.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Projects - class UploadService < BaseService - def initialize(project, file) - @project, @file = project, file - end - - def execute - return nil unless @file and @file.size <= max_attachment_size - - uploader = FileUploader.new(@project) - uploader.store!(@file) - - filename = uploader.image? ? uploader.file.basename : uploader.file.filename - - { - 'alt' => filename, - 'url' => uploader.secure_url, - 'is_image' => uploader.image? - } - end - - private - - def max_attachment_size - current_application_settings.max_attachment_size.megabytes.to_i - end - end -end diff --git a/app/services/search/global_service.rb b/app/services/search/global_service.rb deleted file mode 100644 index 0bcc50c81a7..00000000000 --- a/app/services/search/global_service.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Search - class GlobalService - attr_accessor :current_user, :params - - def initialize(user, params) - @current_user, @params = user, params.dup - end - - def execute - group = Group.find_by(id: params[:group_id]) if params[:group_id].present? - projects = ProjectsFinder.new.execute(current_user) - projects = projects.where(namespace_id: group.id) if group - project_ids = projects.pluck(:id) - - Gitlab::SearchResults.new(project_ids, params[:search]) - end - end -end diff --git a/app/services/search/project_service.rb b/app/services/search/project_service.rb deleted file mode 100644 index f630c0a3790..00000000000 --- a/app/services/search/project_service.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Search - class ProjectService - attr_accessor :project, :current_user, :params - - def initialize(project, user, params) - @project, @current_user, @params = project, user, params.dup - end - - def execute - Gitlab::ProjectSearchResults.new(project.id, - params[:search], - params[:repository_ref]) - end - end -end diff --git a/app/services/search/snippet_service.rb b/app/services/search/snippet_service.rb deleted file mode 100644 index 8ca0877321d..00000000000 --- a/app/services/search/snippet_service.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Search - class SnippetService - attr_accessor :current_user, :params - - def initialize(user, params) - @current_user, @params = user, params.dup - end - - def execute - snippet_ids = Snippet.accessible_to(current_user).pluck(:id) - Gitlab::SnippetSearchResults.new(snippet_ids, params[:search]) - end - end -end diff --git a/app/services/system_hooks_service.rb b/app/services/system_hooks_service.rb deleted file mode 100644 index c5d0b08845b..00000000000 --- a/app/services/system_hooks_service.rb +++ /dev/null @@ -1,98 +0,0 @@ -class SystemHooksService - def execute_hooks_for(model, event) - execute_hooks(build_event_data(model, event)) - end - - private - - def execute_hooks(data) - SystemHook.all.each do |sh| - async_execute_hook sh, data - end - end - - def async_execute_hook(hook, data) - Sidekiq::Client.enqueue(SystemHookWorker, hook.id, data) - end - - def build_event_data(model, event) - data = { - event_name: build_event_name(model, event), - created_at: model.created_at.xmlschema - } - - case model - when Key - data.merge!( - key: model.key, - id: model.id - ) - if model.user - data.merge!( - username: model.user.username - ) - end - when Project - owner = model.owner - - data.merge!({ - name: model.name, - path: model.path, - path_with_namespace: model.path_with_namespace, - project_id: model.id, - owner_name: owner.name, - owner_email: owner.respond_to?(:email) ? owner.email : "", - project_visibility: Project.visibility_levels.key(model.visibility_level_field).downcase - }) - when User - data.merge!({ - name: model.name, - email: model.email, - user_id: model.id - }) - when ProjectMember - data.merge!({ - project_name: model.project.name, - project_path: model.project.path, - project_id: model.project.id, - user_name: model.user.name, - user_email: model.user.email, - access_level: model.human_access, - project_visibility: Project.visibility_levels.key(model.project.visibility_level_field).downcase - }) - when Group - owner = model.owner - - data.merge!( - name: model.name, - path: model.path, - group_id: model.id, - owner_name: owner.respond_to?(:name) ? owner.name : nil, - owner_email: owner.respond_to?(:email) ? owner.email : nil, - ) - when GroupMember - data.merge!( - group_name: model.group.name, - group_path: model.group.path, - group_id: model.group.id, - user_name: model.user.name, - user_email: model.user.email, - user_id: model.user.id, - group_access: model.human_access, - ) - end - end - - def build_event_name(model, event) - case model - when ProjectMember - return "user_add_to_team" if event == :create - return "user_remove_from_team" if event == :destroy - when GroupMember - return 'user_add_to_group' if event == :create - return 'user_remove_from_group' if event == :destroy - else - "#{model.class.name.downcase}_#{event.to_s}" - end - end -end diff --git a/app/services/test_hook_service.rb b/app/services/test_hook_service.rb deleted file mode 100644 index 21ec2c01cb8..00000000000 --- a/app/services/test_hook_service.rb +++ /dev/null @@ -1,6 +0,0 @@ -class TestHookService - def execute(hook, current_user) - data = Gitlab::PushDataBuilder.build_sample(hook.project, current_user) - hook.execute(data) - end -end diff --git a/app/services/update_snippet_service.rb b/app/services/update_snippet_service.rb deleted file mode 100644 index 9d181c2d2ab..00000000000 --- a/app/services/update_snippet_service.rb +++ /dev/null @@ -1,22 +0,0 @@ -class UpdateSnippetService < BaseService - attr_accessor :snippet - - def initialize(project, user, snippet, params) - super(project, user, params) - @snippet = snippet - end - - def execute - # check that user is allowed to set specified visibility_level - new_visibility = params[:visibility_level] - if new_visibility && new_visibility.to_i != snippet.visibility_level - unless can?(current_user, :change_visibility_level, snippet) && - Gitlab::VisibilityLevel.allowed_for?(current_user, new_visibility) - deny_visibility_level(snippet, new_visibility) - return snippet - end - end - - snippet.update_attributes(params) - end -end diff --git a/app/uploaders/attachment_uploader.rb b/app/uploaders/attachment_uploader.rb deleted file mode 100644 index a9691bee46e..00000000000 --- a/app/uploaders/attachment_uploader.rb +++ /dev/null @@ -1,26 +0,0 @@ -# encoding: utf-8 - -class AttachmentUploader < CarrierWave::Uploader::Base - storage :file - - def store_dir - "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" - end - - def image? - img_ext = %w(png jpg jpeg gif bmp tiff) - if file.respond_to?(:extension) - img_ext.include?(file.extension.downcase) - else - # Not all CarrierWave storages respond to :extension - ext = file.path.split('.').last.downcase - img_ext.include?(ext) - end - rescue - false - end - - def file_storage? - self.class.storage == CarrierWave::Storage::File - end -end diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb deleted file mode 100644 index 7cad044555b..00000000000 --- a/app/uploaders/avatar_uploader.rb +++ /dev/null @@ -1,32 +0,0 @@ -# encoding: utf-8 - -class AvatarUploader < CarrierWave::Uploader::Base - storage :file - - after :store, :reset_events_cache - - def store_dir - "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" - end - - def image? - img_ext = %w(png jpg jpeg gif bmp tiff) - if file.respond_to?(:extension) - img_ext.include?(file.extension.downcase) - else - # Not all CarrierWave storages respond to :extension - ext = file.path.split('.').last.downcase - img_ext.include?(ext) - end - rescue - false - end - - def file_storage? - self.class.storage == CarrierWave::Storage::File - end - - def reset_events_cache(file) - model.reset_events_cache if model.is_a?(User) - end -end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb deleted file mode 100644 index f9673abbfe8..00000000000 --- a/app/uploaders/file_uploader.rb +++ /dev/null @@ -1,48 +0,0 @@ -# encoding: utf-8 -class FileUploader < CarrierWave::Uploader::Base - storage :file - - attr_accessor :project, :secret - - def initialize(project, secret = self.class.generate_secret) - @project = project - @secret = secret - end - - def base_dir - "uploads" - end - - def store_dir - File.join(base_dir, @project.path_with_namespace, @secret) - end - - def cache_dir - File.join(base_dir, 'tmp', @project.path_with_namespace, @secret) - end - - def self.generate_secret - SecureRandom.hex - end - - def secure_url - File.join(Gitlab.config.gitlab.url, @project.path_with_namespace, "uploads", @secret, file.filename) - end - - def file_storage? - self.class.storage == CarrierWave::Storage::File - end - - def image? - img_ext = %w(png jpg jpeg gif bmp tiff) - if file.respond_to?(:extension) - img_ext.include?(file.extension.downcase) - else - # Not all CarrierWave storages respond to :extension - ext = file.path.split('.').last.downcase - img_ext.include?(ext) - end - rescue - false - end -end diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml deleted file mode 100644 index 4f3565c67eb..00000000000 --- a/app/views/admin/application_settings/_form.html.haml +++ /dev/null @@ -1,69 +0,0 @@ -= form_for @application_setting, url: 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 Features - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - = f.label :signup_enabled do - = f.check_box :signup_enabled - Signup enabled - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - = f.label :signin_enabled do - = f.check_box :signin_enabled - Signin enabled - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - = f.label :gravatar_enabled do - = f.check_box :gravatar_enabled - Gravatar enabled - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - = f.label :twitter_sharing_enabled do - = f.check_box :twitter_sharing_enabled, :'aria-describedby' => 'twitter_help_block' - %strong Twitter enabled - %span.help-block#twitter_help_block Show users a button to share their newly created public or internal projects on twitter - %fieldset - %legend Misc - .form-group - = f.label :default_projects_limit, class: 'control-label col-sm-2' - .col-sm-10 - = f.number_field :default_projects_limit, class: 'form-control' - .form-group - = f.label :default_branch_protection, class: 'control-label col-sm-2' - .col-sm-10 - = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control' - .form-group - = f.label :restricted_visibility_levels, class: 'control-label col-sm-2' - .col-sm-10 - - data_attrs = { toggle: 'buttons' } - .btn-group{ data: data_attrs } - - 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 :home_page_url, class: 'control-label col-sm-2' - .col-sm-10 - = f.text_field :home_page_url, class: 'form-control', placeholder: 'http://company.example.com', :'aria-describedby' => 'home_help_block' - %span.help-block#home_help_block We will redirect non-logged in users to this page - .form-group - = f.label :sign_in_text, class: 'control-label col-sm-2' - .col-sm-10 - = f.text_area :sign_in_text, class: 'form-control', rows: 4 - .help-block Markdown enabled - .form-group - = f.label :max_attachment_size, 'Maximum attachment size (MB)', class: 'control-label col-sm-2' - .col-sm-10 - = f.number_field :max_attachment_size, class: 'form-control' - - .form-actions - = f.submit 'Save', class: 'btn btn-primary' diff --git a/app/views/admin/application_settings/show.html.haml b/app/views/admin/application_settings/show.html.haml deleted file mode 100644 index 39b66647a5a..00000000000 --- a/app/views/admin/application_settings/show.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title Application settings -%hr -= render 'form' diff --git a/app/views/admin/applications/_delete_form.html.haml b/app/views/admin/applications/_delete_form.html.haml deleted file mode 100644 index 3147cbd659f..00000000000 --- a/app/views/admin/applications/_delete_form.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- submit_btn_css ||= 'btn btn-link btn-remove btn-sm' -= form_tag admin_application_path(application) do - %input{:name => "_method", :type => "hidden", :value => "delete"}/ - = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css \ No newline at end of file diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml deleted file mode 100644 index fa4e6335c73..00000000000 --- a/app/views/admin/applications/_form.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -= form_for [:admin, @application], url: @url, html: {class: 'form-horizontal', role: 'form'} do |f| - - if application.errors.any? - .alert.alert-danger - %button{ type: "button", class: "close", "data-dismiss" => "alert"} × - - application.errors.full_messages.each do |msg| - %p= msg - = content_tag :div, class: 'form-group' do - = f.label :name, class: 'col-sm-2 control-label' - .col-sm-10 - = f.text_field :name, class: 'form-control' - = doorkeeper_errors_for application, :name - = content_tag :div, class: 'form-group' do - = f.label :redirect_uri, class: 'col-sm-2 control-label' - .col-sm-10 - = f.text_area :redirect_uri, class: 'form-control' - = doorkeeper_errors_for application, :redirect_uri - %span.help-block - Use one line per URI - - if Doorkeeper.configuration.native_redirect_uri - %span.help-block - Use - %code= Doorkeeper.configuration.native_redirect_uri - for local tests - .form-actions - = f.submit 'Submit', class: "btn btn-primary wide" - = link_to "Cancel", admin_applications_path, class: "btn btn-default" diff --git a/app/views/admin/applications/edit.html.haml b/app/views/admin/applications/edit.html.haml deleted file mode 100644 index e408ae2f29d..00000000000 --- a/app/views/admin/applications/edit.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title Edit application -- @url = admin_application_path(@application) -= render 'form', application: @application \ No newline at end of file diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml deleted file mode 100644 index d550278710e..00000000000 --- a/app/views/admin/applications/index.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h3.page-title - System OAuth applications -%p.light - System OAuth application does not belong to certain user and can be managed only by admins -%hr -%p= link_to 'New Application', new_admin_application_path, class: 'btn btn-success' -%table.table.table-striped - %thead - %tr - %th Name - %th Callback URL - %th Clients - %th - %th - %tbody.oauth-applications - - @applications.each do |application| - %tr{:id => "application_#{application.id}"} - %td= link_to application.name, admin_application_path(application) - %td= application.redirect_uri - %td= application.access_tokens.map(&:resource_owner_id).uniq.count - %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link' - %td= render 'delete_form', application: application diff --git a/app/views/admin/applications/new.html.haml b/app/views/admin/applications/new.html.haml deleted file mode 100644 index 7c62425f19c..00000000000 --- a/app/views/admin/applications/new.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title New application -- @url = admin_applications_path -= render 'form', application: @application \ No newline at end of file diff --git a/app/views/admin/applications/show.html.haml b/app/views/admin/applications/show.html.haml deleted file mode 100644 index 2abe390ce13..00000000000 --- a/app/views/admin/applications/show.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -%h3.page-title - Application: #{@application.name} - - -%table.table - %tr - %td - Application Id - %td - %code#application_id= @application.uid - %tr - %td - Secret: - %td - %code#secret= @application.secret - - %tr - %td - Callback url - %td - - @application.redirect_uri.split.each do |uri| - %div - %span.monospace= uri -.form-actions - = link_to 'Edit', edit_admin_application_path(@application), class: 'btn btn-primary wide pull-left' - = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' diff --git a/app/views/admin/background_jobs/show.html.haml b/app/views/admin/background_jobs/show.html.haml deleted file mode 100644 index 4ef8e878a7f..00000000000 --- a/app/views/admin/background_jobs/show.html.haml +++ /dev/null @@ -1,44 +0,0 @@ -%h3.page-title Background Jobs -%p.light GitLab uses #{link_to "sidekiq", "http://sidekiq.org/"} library for async job processing - -%hr - -.panel.panel-default - .panel-heading Sidekiq running processes - .panel-body - - if @sidekiq_processes.empty? - %h4.cred - %i.fa.fa-exclamation-triangle - There are no running sidekiq processes. Please restart GitLab - - else - %table.table - %thead - %th USER - %th PID - %th CPU - %th MEM - %th STATE - %th START - %th COMMAND - %tbody - - @sidekiq_processes.each do |process| - - next unless process.match(/(sidekiq \d+\.\d+\.\d+.+$)/) - - data = process.strip.split(' ') - %tr - %td= gitlab_config.user - - 5.times do - %td= data.shift - %td= data.join(' ') - - .clearfix - %p - %i.fa.fa-exclamation-circle - If '[25 of 25 busy]' is shown, restart GitLab with 'sudo service gitlab reload'. - %p - %i.fa.fa-exclamation-circle - If more than one sidekiq process is listed, stop GitLab, kill the remaining sidekiq processes (sudo pkill -u #{gitlab_config.user} -f sidekiq) and restart GitLab. - - - -.panel.panel-default - %iframe{src: sidekiq_path, width: '100%', height: 970, style: "border: none"} diff --git a/app/views/admin/broadcast_messages/index.html.haml b/app/views/admin/broadcast_messages/index.html.haml deleted file mode 100644 index 7e29311bf42..00000000000 --- a/app/views/admin/broadcast_messages/index.html.haml +++ /dev/null @@ -1,59 +0,0 @@ -%h3.page-title - Broadcast Messages -%p.light - Broadcast messages are displayed for every user and can be used to notify users about scheduled maintenance, recent upgrades and more. -.broadcast-message-preview - %i.fa.fa-bullhorn - %span Your message here - -= form_for [:admin, @broadcast_message], html: { class: 'broadcast-message-form form-horizontal'} do |f| - -if @broadcast_message.errors.any? - .alert.alert-danger - - @broadcast_message.errors.full_messages.each do |msg| - %p= msg - .form-group - = f.label :message, class: 'control-label' - .col-sm-10 - = f.text_area :message, class: "form-control", rows: 2, required: true - %div - = link_to '#', class: 'js-toggle-colors-link' do - Customize colors - .form-group.js-toggle-colors-container.hide - = f.label :color, "Background Color", class: 'control-label' - .col-sm-10 - = f.color_field :color, value: "#AA33EE", class: "form-control" - .form-group.js-toggle-colors-container.hide - = f.label :font, "Font Color", class: 'control-label' - .col-sm-10 - = f.color_field :font, value: "#224466", class: "form-control" - .form-group - = f.label :starts_at, class: 'control-label' - .col-sm-10.datetime-controls - = f.datetime_select :starts_at - .form-group - = f.label :ends_at, class: 'control-label' - .col-sm-10.datetime-controls - = f.datetime_select :ends_at - .form-actions - = f.submit "Add broadcast message", class: "btn btn-create" - --if @broadcast_messages.any? - %ul.bordered-list.broadcast-messages - - @broadcast_messages.each do |broadcast_message| - %li - .pull-right - - if broadcast_message.starts_at - %strong - #{broadcast_message.starts_at.to_s(:short)} - \... - - if broadcast_message.ends_at - %strong - #{broadcast_message.ends_at.to_s(:short)} -   - = link_to [:admin, broadcast_message], method: :delete, remote: true, class: 'remove-row btn btn-xs' do - %i.fa.fa-times.cred - - .message= broadcast_message.message - - - = paginate @broadcast_messages diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml deleted file mode 100644 index d1c586328a2..00000000000 --- a/app/views/admin/dashboard/index.html.haml +++ /dev/null @@ -1,137 +0,0 @@ -.admin-dashboard - .row - .col-md-4 - %h4 Statistics - %hr - %p - Forks - %span.light.pull-right - = ForkedProjectLink.count - %p - Issues - %span.light.pull-right - = Issue.count - %p - Merge Requests - %span.light.pull-right - = MergeRequest.count - %p - Notes - %span.light.pull-right - = Note.count - %p - Snippets - %span.light.pull-right - = Snippet.count - %p - SSH Keys - %span.light.pull-right - = Key.count - %p - Milestones - %span.light.pull-right - = Milestone.count - %p - Active Users - %span.light.pull-right - = User.active.count - .col-md-4 - %h4 - Features - %hr - %p - Sign up - %span.light.pull-right - = boolean_to_icon signup_enabled? - %p - LDAP - %span.light.pull-right - = boolean_to_icon Gitlab.config.ldap.enabled - %p - Gravatar - %span.light.pull-right - = boolean_to_icon gravatar_enabled? - %p - OmniAuth - %span.light.pull-right - = boolean_to_icon Gitlab.config.omniauth.enabled - .col-md-4 - %h4 Components - %hr - %p - GitLab - %span.pull-right - = Gitlab::VERSION - %p - GitLab Shell - %span.pull-right - = Gitlab::Shell.new.version - %p - GitLab API - %span.pull-right - = API::API::version - %p - Ruby - %span.pull-right - #{RUBY_VERSION}p#{RUBY_PATCHLEVEL} - - %p - Rails - %span.pull-right - #{Rails::VERSION::STRING} - %hr - .row - .col-sm-4 - .light-well - %h4 Projects - .data - = link_to admin_namespaces_projects_path do - %h1= Project.count - %hr - = link_to('New Project', new_project_path, class: "btn btn-new") - .col-sm-4 - .light-well - %h4 Users - .data - = link_to admin_users_path do - %h1= User.count - %hr - = link_to 'New User', new_admin_user_path, class: "btn btn-new" - .col-sm-4 - .light-well - %h4 Groups - .data - = link_to admin_groups_path do - %h1= Group.count - %hr - = link_to 'New Group', new_admin_group_path, class: "btn btn-new" - - .row.prepend-top-10 - .col-md-4 - %h4 Latest projects - %hr - - @projects.each do |project| - %p - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project], class: 'str-truncated' - %span.light.pull-right - #{time_ago_with_tooltip(project.created_at)} - - .col-md-4 - %h4 Latest users - %hr - - @users.each do |user| - %p - = link_to [:admin, user], class: 'str-truncated' do - = user.name - %span.light.pull-right - #{time_ago_with_tooltip(user.created_at)} - - .col-md-4 - %h4 Latest groups - %hr - - @groups.each do |group| - %p - = link_to [:admin, group], class: 'str-truncated' do - = group.name - %span.light.pull-right - #{time_ago_with_tooltip(group.created_at)} diff --git a/app/views/admin/deploy_keys/index.html.haml b/app/views/admin/deploy_keys/index.html.haml deleted file mode 100644 index 2ae83ab95f7..00000000000 --- a/app/views/admin/deploy_keys/index.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -.panel.panel-default - .panel-heading - Public deploy keys (#{@deploy_keys.count}) - .panel-head-actions - = link_to 'New Deploy Key', new_admin_deploy_key_path, class: "btn btn-new btn-sm" - - if @deploy_keys.any? - %table.table - %thead.panel-heading - %tr - %th Title - %th Fingerprint - %th Added at - %th - %tbody - - @deploy_keys.each do |deploy_key| - %tr - %td - = link_to admin_deploy_key_path(deploy_key) do - %strong= deploy_key.title - %td - %span - (#{deploy_key.fingerprint}) - %td - %span.cgray - added #{time_ago_with_tooltip(deploy_key.created_at)} - %td - = link_to 'Remove', admin_deploy_key_path(deploy_key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-sm btn-remove delete-key pull-right" diff --git a/app/views/admin/deploy_keys/new.html.haml b/app/views/admin/deploy_keys/new.html.haml deleted file mode 100644 index c00049424c5..00000000000 --- a/app/views/admin/deploy_keys/new.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -%h3.page-title New public deploy key -%hr - -%div - = form_for [:admin, @deploy_key], html: { class: 'deploy-key-form form-horizontal' } do |f| - -if @deploy_key.errors.any? - .alert.alert-danger - %ul - - @deploy_key.errors.full_messages.each do |msg| - %li= msg - - .form-group - = f.label :title, class: "control-label" - .col-sm-10= f.text_field :title, class: 'form-control' - .form-group - = f.label :key, class: "control-label" - .col-sm-10 - %p.light - Paste a machine public key here. Read more about how to generate it - = link_to "here", help_page_path("ssh", "README") - = f.text_area :key, class: "form-control thin_area", rows: 5 - - .form-actions - = f.submit 'Create', class: "btn-create btn" - = link_to "Cancel", admin_deploy_keys_path, class: "btn btn-cancel" - diff --git a/app/views/admin/deploy_keys/show.html.haml b/app/views/admin/deploy_keys/show.html.haml deleted file mode 100644 index cfa2adf92ee..00000000000 --- a/app/views/admin/deploy_keys/show.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -.row - .col-md-4 - .panel.panel-default - .panel-heading - Deploy Key - %ul.well-list - %li - %span.light Title: - %strong= @deploy_key.title - %li - %span.light Created on: - %strong= @deploy_key.created_at.stamp("Aug 21, 2011") - - .panel.panel-default - .panel-heading Projects (#{@deploy_key.deploy_keys_projects.count}) - - if @deploy_key.deploy_keys_projects.any? - %ul.well-list - - @deploy_key.projects.each do |project| - %li - %span - %strong - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] - .pull-right - = link_to disable_namespace_project_deploy_key_path(project.namespace, project, @deploy_key), data: { confirm: "Are you sure?" }, method: :put, class: "btn-xs btn btn-remove", title: 'Remove deploy key from project' do - %i.fa.fa-times.fa-inverse - - .col-md-8 - %p - %span.light Fingerprint: - %strong= @deploy_key.fingerprint - %pre.well-pre - = @deploy_key.key - .pull-right - = link_to 'Remove', admin_deploy_key_path(@deploy_key), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml deleted file mode 100644 index 9e7751830a4..00000000000 --- a/app/views/admin/groups/_form.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -= form_for [:admin, @group], html: { class: "form-horizontal" } do |f| - - if @group.errors.any? - .alert.alert-danger - %span= @group.errors.full_messages.first - - = render 'shared/group_form', f: f - - .form-group.group-description-holder - = f.label :avatar, "Group avatar", class: 'control-label' - .col-sm-10 - = render 'shared/choose_group_avatar_button', f: f - - - if @group.new_record? - .form-group - .col-sm-2 - .col-sm-10 - .alert.alert-info - = render 'shared/group_tips' - .form-actions - = f.submit 'Create group', class: "btn btn-create" - = link_to 'Cancel', admin_groups_path, class: "btn btn-cancel" - - - else - .form-actions - = f.submit 'Save changes', class: "btn btn-primary" - = link_to 'Cancel', admin_group_path(@group), class: "btn btn-cancel" - diff --git a/app/views/admin/groups/edit.html.haml b/app/views/admin/groups/edit.html.haml deleted file mode 100644 index 824e51c1cf1..00000000000 --- a/app/views/admin/groups/edit.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title Edit group: #{@group.name} -%hr -= render 'form' diff --git a/app/views/admin/groups/index.html.haml b/app/views/admin/groups/index.html.haml deleted file mode 100644 index 4c53ff55708..00000000000 --- a/app/views/admin/groups/index.html.haml +++ /dev/null @@ -1,62 +0,0 @@ -%h3.page-title - Groups (#{@groups.total_count}) - = link_to 'New Group', new_admin_group_path, class: "btn btn-new pull-right" - -%p.light - Group allows you to keep projects organized. - Use groups for uniting related projects. - -%hr -= form_tag admin_groups_path, method: :get, class: 'form-inline' do - = hidden_field_tag :sort, @sort - .form-group - = text_field_tag :name, params[:name], class: "form-control input-mn-300" - = button_tag "Search", class: "btn submit btn-primary" - - .pull-right - .dropdown.inline - %a.dropdown-toggle.btn{href: '#', "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 admin_groups_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to admin_groups_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to admin_groups_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to admin_groups_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated - -%hr - -%ul.bordered-list - - @groups.each do |group| - %li - .clearfix - .pull-right.prepend-top-10 - = link_to 'Edit', edit_admin_group_path(group), id: "edit_#{dom_id(group)}", class: "btn btn-sm" - = link_to 'Destroy', [:admin, group], data: {confirm: "REMOVE #{group.name}? Are you sure?"}, method: :delete, class: "btn btn-sm btn-remove" - - %h4 - = link_to [:admin, group] do - %i.fa.fa-folder - = group.name - - → - %span.monospace - %strong #{group.path}/ - .clearfix - %p - = truncate group.description, length: 150 - .clearfix - %p.light - #{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')} - - -= paginate @groups, theme: "gitlab" diff --git a/app/views/admin/groups/new.html.haml b/app/views/admin/groups/new.html.haml deleted file mode 100644 index f46f45c5514..00000000000 --- a/app/views/admin/groups/new.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title New group -%hr -= render 'form' diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml deleted file mode 100644 index 14996dcd6a2..00000000000 --- a/app/views/admin/groups/show.html.haml +++ /dev/null @@ -1,91 +0,0 @@ -%h3.page-title - Group: #{@group.name} - - = link_to edit_admin_group_path(@group), class: "btn pull-right" do - %i.fa.fa-pencil-square-o - Edit -%hr -.row - .col-md-6 - .panel.panel-default - .panel-heading - Group info: - %ul.well-list - %li - = image_tag group_icon(@group), class: "avatar s60" - %li - %span.light Name: - %strong= @group.name - %li - %span.light Path: - %strong - = @group.path - - %li - %span.light Description: - %strong - = @group.description - - %li - %span.light Created on: - %strong - = @group.created_at.stamp("March 1, 1999") - - .panel.panel-default - .panel-heading - %h3.panel-title - Projects - %span.badge - #{@group.projects.count} - %ul.well-list - - @projects.each do |project| - %li - %strong - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] - %span.label.label-gray - = repository_size(project) - %span.pull-right.light - %span.monospace= project.path_with_namespace + ".git" - .panel-footer - = paginate @projects, param_name: 'projects_page', theme: 'gitlab' - - .col-md-6 - .panel.panel-default - .panel-heading - Add user(s) to the group: - .panel-body.form-holder - %p.light - Read more about project permissions - %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" - - = form_tag members_update_admin_group_path(@group), id: "new_project_member", class: "bulk_import", method: :put do - %div - = users_select_tag(:user_ids, multiple: true, email_user: true) - %div.prepend-top-10 - = select_tag :access_level, options_for_select(GroupMember.access_level_roles), class: "project-access-select select2" - %hr - = button_tag 'Add users to group', class: "btn btn-create" - .panel.panel-default - .panel-heading - %h3.panel-title - Members - %span.badge - #{@group.group_members.count} - %ul.well-list.group-users-list - - @members.each do |member| - - user = member.user - %li{class: dom_class(member), id: (dom_id(user) if user)} - .list-item-name - - if user - %strong - = link_to user.name, admin_user_path(user) - - else - %strong - = member.invite_email - (invited) - %span.pull-right.light - = member.human_access - = link_to group_group_member_path(@group, member), data: { confirm: remove_user_from_group_message(@group, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do - %i.fa.fa-minus.fa-inverse - .panel-footer - = paginate @members, param_name: 'members_page', theme: 'gitlab' diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml deleted file mode 100644 index 7a9dc113f2a..00000000000 --- a/app/views/admin/hooks/index.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -%h3.page-title - System hooks - -%p.light - #{link_to "System hooks ", help_page_path("system_hooks", "system_hooks"), class: "vlink"} can be - used for binding events when GitLab creates a User or Project. - -%hr - - -= form_for @hook, as: :hook, url: admin_hooks_path, html: { class: 'form-horizontal' } do |f| - -if @hook.errors.any? - .alert.alert-danger - - @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" - .form-actions - = f.submit "Add System Hook", class: "btn btn-create" -%hr - --if @hooks.any? - .panel.panel-default - .panel-heading - System hooks (#{@hooks.count}) - %ul.well-list - - @hooks.each do |hook| - %li - .list-item-name - = link_to admin_hook_path(hook) do - %strong= hook.url - - .pull-right - = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn btn-sm" - = link_to 'Remove', admin_hook_path(hook), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-remove btn-sm" diff --git a/app/views/admin/keys/show.html.haml b/app/views/admin/keys/show.html.haml deleted file mode 100644 index 5b23027b3ab..00000000000 --- a/app/views/admin/keys/show.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "profiles/keys/key_details", admin: true diff --git a/app/views/admin/logs/show.html.haml b/app/views/admin/logs/show.html.haml deleted file mode 100644 index 384c6ee9af5..00000000000 --- a/app/views/admin/logs/show.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -- loggers = [Gitlab::GitLogger, Gitlab::AppLogger, - Gitlab::ProductionLogger, Gitlab::SidekiqLogger] -%ul.nav.nav-tabs.log-tabs - - loggers.each do |klass| - %li{ class: (klass == Gitlab::GitLogger ? 'active' : '') } - = link_to klass::file_name, "##{klass::file_name_noext}", - 'data-toggle' => 'tab' -%p.light To prevent performance issues admin logs output the last 2000 lines -.tab-content - - loggers.each do |klass| - .tab-pane{ class: (klass == Gitlab::GitLogger ? 'active' : ''), - id: klass::file_name_noext } - .file-holder#README - .file-title - %i.fa.fa-file - = klass::file_name - .pull-right - = link_to '#', class: 'log-bottom' do - %i.fa.fa-arrow-down - Scroll down - .file-content.logs - %ol - - klass.read_latest.each do |line| - %li - %p= line diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml deleted file mode 100644 index 3bbe10bc270..00000000000 --- a/app/views/admin/projects/index.html.haml +++ /dev/null @@ -1,81 +0,0 @@ -.row - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - %aside.col-md-3 - .admin-filter - = form_tag admin_namespaces_projects_path, method: :get, class: '' do - .form-group - = label_tag :name, 'Name:' - = text_field_tag :name, params[:name], class: "form-control" - - .form-group - = label_tag :namespace_id, "Namespace" - = namespace_select_tag :namespace_id, selected: params[:namespace_id], class: 'input-large' - - .form-group - %strong Activity - .checkbox - = label_tag :with_push do - = check_box_tag :with_push, 1, params[:with_push] - %span Projects with push events - .checkbox - = label_tag :abandoned do - = check_box_tag :abandoned, 1, params[:abandoned] - %span No activity over 6 month - - %fieldset - %strong Visibility level: - .visibility-levels - - Project.visibility_levels.each do |label, level| - .checkbox - %label - = check_box_tag 'visibility_levels[]', level, params[:visibility_levels].present? && params[:visibility_levels].include?(level.to_s) - %span.descr - = visibility_level_icon(level) - = label - %hr - = hidden_field_tag :sort, params[:sort] - = button_tag "Search", class: "btn submit btn-primary" - = link_to "Reset", admin_namespaces_projects_path, class: "btn btn-cancel" - - %section.col-md-9 - .panel.panel-default - .panel-heading - Projects (#{@projects.total_count}) - .panel-head-actions - .dropdown.inline - %button.dropdown-toggle.btn.btn-sm{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 admin_namespaces_projects_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to admin_namespaces_projects_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to admin_namespaces_projects_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to admin_namespaces_projects_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated - = link_to admin_namespaces_projects_path(sort: sort_value_largest_repo) do - = sort_title_largest_repo - = link_to 'New Project', new_project_path, class: "btn btn-sm btn-success" - %ul.well-list - - @projects.each do |project| - %li - .list-item-name - %span{ class: visibility_level_color(project.visibility_level) } - = visibility_level_icon(project.visibility_level) - = link_to project.name_with_namespace, [:admin, project.namespace.becomes(Namespace), project] - .pull-right - %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" - = link_to 'Destroy', [project.namespace.becomes(Namespace), project], data: { confirm: remove_project_message(project) }, method: :delete, class: "btn btn-sm btn-remove" - - if @projects.blank? - .nothing-here-block 0 projects matches - = paginate @projects, theme: "gitlab" diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml deleted file mode 100644 index 78684c692c7..00000000000 --- a/app/views/admin/projects/show.html.haml +++ /dev/null @@ -1,142 +0,0 @@ -%h3.page-title - Project: #{@project.name_with_namespace} - = link_to edit_project_path(@project), class: "btn pull-right" do - %i.fa.fa-pencil-square-o - Edit -%hr -.row - .col-md-6 - .panel.panel-default - .panel-heading - Project info: - %ul.well-list - %li - %span.light Name: - %strong - = link_to @project.name, project_path(@project) - %li - %span.light Namespace: - %strong - - if @project.namespace - = link_to @project.namespace.human_name, [:admin, @project.group || @project.owner] - - else - Global - %li - %span.light Owned by: - %strong - - if @project.owner - = link_to @project.owner_name, [:admin, @project.owner] - - else - (deleted) - - %li - %span.light Created by: - %strong - = @project.creator.try(:name) || '(deleted)' - - %li - %span.light Created on: - %strong - = @project.created_at.stamp("March 1, 1999") - - %li - %span.light http: - %strong - = link_to @project.http_url_to_repo, project_path(@project) - %li - %span.light ssh: - %strong - = link_to @project.ssh_url_to_repo, project_path(@project) - - if @project.repository.exists? - %li - %span.light fs: - %strong - = @repository.path_to_repo - - %li - %span.light Size - %strong - = repository_size(@project) - - %li - %span.light last commit: - %strong - = last_commit(@project) - - else - %li - %span.light repository: - %strong.cred - does not exist - - - if @project.archived? - %li - %span.light archived: - %strong repository is read-only - - %li - %span.light access: - %strong - %span{ class: visibility_level_color(@project.visibility_level) } - = visibility_level_icon(@project.visibility_level) - = visibility_level_label(@project.visibility_level) - - .panel.panel-default - .panel-heading - Transfer project - .panel-body - = form_for @project, url: transfer_admin_namespace_project_path(@project.namespace, @project), method: :put, html: { class: 'form-horizontal' } do |f| - .form-group - = f.label :new_namespace_id, "Namespace", class: 'control-label' - .col-sm-10 - = namespace_select_tag :new_namespace_id, selected: params[:namespace_id], class: 'input-large' - - .form-group - .col-sm-2 - .col-sm-10 - = f.submit 'Transfer', class: 'btn btn-primary' - - .col-md-6 - - if @group - .panel.panel-default - .panel-heading - %strong #{@group.name} - group members (#{@group.group_members.count}) - .pull-right - = link_to admin_group_path(@group), class: 'btn btn-xs' do - %i.fa.fa-pencil-square-o - %ul.well-list - - @group_members.each do |member| - = render 'groups/group_members/group_member', member: member, show_controls: false - .panel-footer - = paginate @group_members, param_name: 'group_members_page', theme: 'gitlab' - - .panel.panel-default - .panel-heading - Project members - %small - (#{@project.users.count}) - .pull-right - = link_to namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-xs" do - %i.fa.fa-pencil-square-o - Manage Access - %ul.well-list.project_members - - @project_members.each do |project_member| - - user = project_member.user - %li.project_member - .list-item-name - - if user - %strong - = link_to user.name, admin_user_path(user) - - else - %strong - = project_member.invite_email - (invited) - .pull-right - - if project_member.owner? - %span.light Owner - - else - %span.light= project_member.human_access - = link_to namespace_project_project_member_path(@project.namespace, @project, project_member), data: { confirm: remove_from_project_team_message(@project, project_member)}, method: :delete, remote: true, class: "btn btn-sm btn-remove" do - %i.fa.fa-times - .panel-footer - = paginate @project_members, param_name: 'project_members_page', theme: 'gitlab' diff --git a/app/views/admin/services/_form.html.haml b/app/views/admin/services/_form.html.haml deleted file mode 100644 index eb7a099bfe2..00000000000 --- a/app/views/admin/services/_form.html.haml +++ /dev/null @@ -1,94 +0,0 @@ -%h3.page-title - = @service.title - -%p #{@service.description} template - -= form_for :service, url: admin_application_settings_service_path, method: :put, html: { class: 'form-horizontal fieldset-form' } do |f| - - if @service.errors.any? - #error_explanation - .alert.alert-danger - - @service.errors.full_messages.each do |msg| - %p= msg - - if @service.help.present? - .well - = preserve do - = markdown @service.help - - .form-group - = f.label :active, "Active", class: "control-label" - .col-sm-10 - = f.check_box :active - - - if @service.supported_events.length > 1 - .form-group - = f.label :url, "Trigger", class: 'control-label' - .col-sm-10 - - if @service.supported_events.include?("push") - %div - = f.check_box :push_events, class: 'pull-left' - .prepend-left-20 - = f.label :push_events, class: 'list-label' do - %strong Push events - %p.light - This url will be triggered by a push to the repository - - if @service.supported_events.include?("tag_push") - %div - = f.check_box :tag_push_events, class: 'pull-left' - .prepend-left-20 - = f.label :tag_push_events, class: 'list-label' do - %strong Tag push events - %p.light - This url will be triggered when a new tag is pushed to the repository - - if @service.supported_events.include?("note") - %div - = f.check_box :note_events, class: 'pull-left' - .prepend-left-20 - = f.label :note_events, class: 'list-label' do - %strong Comments - %p.light - This url will be triggered when someone adds a comment - - if @service.supported_events.include?("issue") - %div - = f.check_box :issues_events, class: 'pull-left' - .prepend-left-20 - = f.label :issues_events, class: 'list-label' do - %strong Issues events - %p.light - This url will be triggered when an issue is created - - if @service.supported_events.include?("merge_request") - %div - = f.check_box :merge_requests_events, class: 'pull-left' - .prepend-left-20 - = f.label :merge_requests_events, class: 'list-label' do - %strong Merge Request events - %p.light - This url will be triggered when a merge request is created - - - @service.fields.each do |field| - - name = field[:name] - - title = field[:title] || name.humanize - - value = @service.send(name) unless field[:type] == 'password' - - type = field[:type] - - placeholder = field[:placeholder] - - choices = field[:choices] - - default_choice = field[:default_choice] - - help = field[:help] - - .form-group - = f.label name, title, 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" } - - elsif type == 'password' - = f.password_field name, class: 'form-control' - - if help - %span.help-block= help - - .form-actions - = f.submit 'Save', class: 'btn btn-save' diff --git a/app/views/admin/services/edit.html.haml b/app/views/admin/services/edit.html.haml deleted file mode 100644 index bcc5832792f..00000000000 --- a/app/views/admin/services/edit.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render 'form' diff --git a/app/views/admin/services/index.html.haml b/app/views/admin/services/index.html.haml deleted file mode 100644 index 0093fb97765..00000000000 --- a/app/views/admin/services/index.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h3.page-title Service templates -%p.light Service template allows you to set default values for project services - -%table.table - %thead - %tr - %th - %th Service - %th Description - %th Last edit - - @services.sort_by(&:title).each do |service| - %tr - %td - = icon("copy", class: 'clgray') - %td - = link_to edit_admin_application_settings_service_path(service.id) do - %strong= service.title - %td - = service.description - %td.light - = time_ago_in_words service.updated_at - ago diff --git a/app/views/admin/users/_form.html.haml b/app/views/admin/users/_form.html.haml deleted file mode 100644 index e18dd9bc905..00000000000 --- a/app/views/admin/users/_form.html.haml +++ /dev/null @@ -1,90 +0,0 @@ -.user_new - = form_for [:admin, @user], html: { class: 'form-horizontal fieldset-form' } do |f| - -if @user.errors.any? - #error_explanation - .alert.alert-danger - - @user.errors.full_messages.each do |msg| - %p= msg - - %fieldset - %legend Account - .form-group - = f.label :name, class: 'control-label' - .col-sm-10 - = f.text_field :name, required: true, autocomplete: "off", class: 'form-control' - %span.help-inline * required - .form-group - = f.label :username, class: 'control-label' - .col-sm-10 - = f.text_field :username, required: true, autocomplete: "off", class: 'form-control' - %span.help-inline * required - .form-group - = f.label :email, class: 'control-label' - .col-sm-10 - = f.text_field :email, required: true, autocomplete: "off", class: 'form-control' - %span.help-inline * required - - - if @user.new_record? - %fieldset - %legend Password - .form-group - = f.label :password, class: 'control-label' - .col-sm-10 - %strong - Reset link will be generated and sent to the user. - %br - User will be forced to set the password on first sign in. - - else - %fieldset - %legend Password - .form-group - = f.label :password, class: 'control-label' - .col-sm-10= f.password_field :password, disabled: f.object.force_random_password, class: 'form-control' - .form-group - = f.label :password_confirmation, class: 'control-label' - .col-sm-10= f.password_field :password_confirmation, disabled: f.object.force_random_password, class: 'form-control' - - %fieldset - %legend Access - .form-group - = f.label :projects_limit, class: 'control-label' - .col-sm-10= f.number_field :projects_limit, class: 'form-control' - - .form-group - = f.label :can_create_group, class: 'control-label' - .col-sm-10= f.check_box :can_create_group - - .form-group - = f.label :admin, class: 'control-label' - - if current_user == @user - .col-sm-10= f.check_box :admin, disabled: true - .col-sm-10 You cannot remove your own admin rights - - else - .col-sm-10= f.check_box :admin - %fieldset - %legend Profile - .form-group - = f.label :avatar, class: 'control-label' - .col-sm-10 - = f.file_field :avatar - - .form-group - = f.label :skype, class: 'control-label' - .col-sm-10= f.text_field :skype, class: 'form-control' - .form-group - = f.label :linkedin, class: 'control-label' - .col-sm-10= f.text_field :linkedin, class: 'form-control' - .form-group - = f.label :twitter, class: 'control-label' - .col-sm-10= f.text_field :twitter, class: 'form-control' - .form-group - = f.label :website_url, 'Website', class: 'control-label' - .col-sm-10= f.text_field :website_url, class: 'form-control' - - .form-actions - - if @user.new_record? - = f.submit 'Create user', class: "btn btn-create" - = link_to 'Cancel', admin_users_path, class: "btn btn-cancel" - - else - = f.submit 'Save changes', class: "btn btn-save" - = link_to 'Cancel', admin_user_path(@user), class: "btn btn-cancel" diff --git a/app/views/admin/users/edit.html.haml b/app/views/admin/users/edit.html.haml deleted file mode 100644 index d71d8189c51..00000000000 --- a/app/views/admin/users/edit.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%h3.page-title - Edit user: #{@user.name} -.back-link - = link_to admin_user_path(@user) do - ← Back to user page -%hr -= render 'form' diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml deleted file mode 100644 index 25c1730ef70..00000000000 --- a/app/views/admin/users/index.html.haml +++ /dev/null @@ -1,88 +0,0 @@ -.row - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - %aside.col-md-3 - .admin-filter - %ul.nav.nav-pills.nav-stacked - %li{class: "#{'active' unless params[:filter]}"} - = link_to admin_users_path do - Active - %small.pull-right= User.active.count - %li{class: "#{'active' if params[:filter] == "admins"}"} - = link_to admin_users_path(filter: "admins") do - Admins - %small.pull-right= User.admins.count - %li{class: "#{'active' if params[:filter] == "blocked"}"} - = link_to admin_users_path(filter: "blocked") do - Blocked - %small.pull-right= User.blocked.count - %li{class: "#{'active' if params[:filter] == "wop"}"} - = link_to admin_users_path(filter: "wop") do - Without projects - %small.pull-right= User.without_projects.count - %hr - = form_tag admin_users_path, method: :get, class: 'form-inline' do - .form-group - = search_field_tag :name, params[:name], placeholder: 'Name, email or username', class: 'form-control' - = button_tag class: 'btn btn-primary' do - %i.fa.fa-search - %hr - = link_to 'Reset', admin_users_path, class: "btn btn-cancel" - - %section.col-md-9 - .panel.panel-default - .panel-heading - Users (#{@users.total_count}) - .panel-head-actions - .dropdown.inline - %a.dropdown-toggle.btn.btn-sm{href: '#', "data-toggle" => "dropdown"} - %span.light sort: - - if @sort.present? - = sort_options_hash[@sort] - - else - = sort_title_name - %b.caret - %ul.dropdown-menu - %li - = link_to admin_users_path(sort: sort_value_name) do - = sort_title_name - = link_to admin_users_path(sort: sort_value_recently_signin) do - = sort_title_recently_signin - = link_to admin_users_path(sort: sort_value_oldest_signin) do - = sort_title_oldest_signin - = link_to admin_users_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to admin_users_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to admin_users_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to admin_users_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated - - = link_to 'New User', new_admin_user_path, class: "btn btn-new btn-sm" - %ul.well-list - - @users.each do |user| - %li - .list-item-name - - if user.blocked? - %i.fa.fa-lock.cred - - else - %i.fa.fa-user.cgreen - = link_to user.name, [:admin, user] - - if user.admin? - %strong.cred (Admin) - - if user == current_user - %span.cred It's you! - .pull-right - %span.light - %i.fa.fa-envelope - = mail_to user.email, user.email, class: 'light' -   - = link_to 'Edit', edit_admin_user_path(user), id: "edit_#{dom_id(user)}", class: "btn btn-sm" - - unless user == current_user - - if user.blocked? - = link_to 'Unblock', unblock_admin_user_path(user), method: :put, class: "btn btn-sm success" - - else - = link_to 'Block', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-sm btn-remove" - = 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-sm btn-remove" - = paginate @users, theme: "gitlab" diff --git a/app/views/admin/users/new.html.haml b/app/views/admin/users/new.html.haml deleted file mode 100644 index 8fbb757f424..00000000000 --- a/app/views/admin/users/new.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - New user -%hr -= render 'form' diff --git a/app/views/admin/users/show.html.haml b/app/views/admin/users/show.html.haml deleted file mode 100644 index 3524f04c5ed..00000000000 --- a/app/views/admin/users/show.html.haml +++ /dev/null @@ -1,227 +0,0 @@ -%h3.page-title - User: - = @user.name - - if @user.blocked? - %span.cred (Blocked) - - if @user.admin - %span.cred (Admin) - - .pull-right - = link_to edit_admin_user_path(@user), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit -%hr -%ul.nav.nav-tabs - %li.active - %a{"data-toggle" => "tab", href: "#account"} Account - %li - %a{"data-toggle" => "tab", href: "#profile"} Profile - %li - %a{"data-toggle" => "tab", href: "#groups"} Groups - %li - %a{"data-toggle" => "tab", href: "#projects"} Projects - %li - %a{"data-toggle" => "tab", href: "#ssh-keys"} SSH keys - -.tab-content - #account.tab-pane.active - .row - .col-md-6 - .panel.panel-default - .panel-heading - Account: - %ul.well-list - %li - %span.light Name: - %strong= @user.name - %li - %span.light Username: - %strong - = @user.username - %li - %span.light Email: - %strong - = mail_to @user.email - - @user.emails.each do |email| - %li - %span.light Secondary email: - %strong= email.email - = link_to remove_email_admin_user_path(@user, email), data: { confirm: "Are you sure you want to remove #{email.email}?" }, method: :delete, class: "btn-xs btn btn-remove pull-right", title: 'Remove secondary email', id: "remove_email_#{email.id}" do - %i.fa.fa-times - - %li - %span.light Can create groups: - %strong - = @user.can_create_group ? "Yes" : "No" - %li - %span.light Personal projects limit: - %strong - = @user.projects_limit - %li - %span.light Member since: - %strong - = @user.created_at.stamp("Nov 12, 2031") - - if @user.confirmed_at - %li - %span.light Confirmed at: - %strong - = @user.confirmed_at.stamp("Nov 12, 2031") - - else - %li - %span.light Confirmed: - %strong.cred - No - - %li - %span.light Current sign-in at: - %strong - - if @user.current_sign_in_at - = @user.current_sign_in_at.stamp("Nov 12, 2031") - - else - never - - %li - %span.light Last sign-in at: - %strong - - if @user.last_sign_in_at - = @user.last_sign_in_at.stamp("Nov 12, 2031") - - else - never - - %li - %span.light Sign-in count: - %strong - = @user.sign_in_count - - - if @user.ldap_user? - %li - %span.light LDAP uid: - %strong - = @user.ldap_identity.extern_uid - - - if @user.created_by - %li - %span.light Created by: - %strong - = link_to @user.created_by.name, [:admin, @user.created_by] - - .col-md-6 - - unless @user == current_user - - if @user.blocked? - .panel.panel-info - .panel-heading - This user is blocked - .panel-body - %p Blocking user has the following effects: - %ul - %li User will not be able to login - %li User will not be able to access git repositories - %li Personal projects will be left - %li Owned groups will be left - %br - = link_to 'Unblock user', unblock_admin_user_path(@user), method: :put, class: "btn btn-info", data: { confirm: 'Are you sure?' } - - else - .panel.panel-warning - .panel-heading - Block this user - .panel-body - %p Blocking user has the following effects: - %ul - %li User will not be able to login - %li User will not be able to access git repositories - %li User will be removed from joined projects and groups - %li Personal projects will be left - %li Owned groups will be left - %br - = link_to 'Block user', block_admin_user_path(@user), data: { confirm: 'USER WILL BE BLOCKED! Are you sure?' }, method: :put, class: "btn btn-warning" - - .panel.panel-danger - .panel-heading - Remove user - .panel-body - %p Deleting a user has the following effects: - %ul - %li All user content like authored issues, snippets, comments will be removed - - rp = @user.personal_projects.count - - unless rp.zero? - %li #{pluralize rp, 'personal project'} will be removed and cannot be restored - - if @user.solo_owned_groups.present? - %li - Next groups with all content will be removed: - %strong #{@user.solo_owned_groups.map(&:name).join(', ')} - %br - = link_to 'Remove user', [:admin, @user], data: { confirm: "USER #{@user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-remove" - - #profile.tab-pane - .row - .col-md-6 - .panel.panel-default - .panel-heading - = @user.name - %ul.well-list - %li - = image_tag avatar_icon(@user.email, 60), class: "avatar s60" - %li - %span.light Profile page: - %strong - = link_to user_path(@user) do - = @user.username - .col-md-6 - = render 'users/profile', user: @user - - #groups.tab-pane - - if @user.group_members.present? - .panel.panel-default - .panel-heading Groups: - %ul.well-list - - @user.group_members.each do |group_member| - - group = group_member.group - %li.group_member - %span{class: ("list-item-name" unless group_member.owner?)} - %strong= link_to group.name, admin_group_path(group) - .pull-right - %span.light= group_member.human_access - - unless group_member.owner? - = link_to group_group_member_path(group, group_member), data: { confirm: remove_user_from_group_message(group, group_member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do - %i.fa.fa-times.fa-inverse - - else - .nothing-here-block This user has no groups. - - #projects.tab-pane - - if @user.groups.any? - .panel.panel-default - .panel-heading Group projects - %ul.well-list - - @user.groups.each do |group| - %li - %strong= group.name - – access to - #{pluralize(group.projects.count, 'project')} - - .row - .col-md-6 - = render 'users/projects', projects: @personal_projects - - .col-md-6 - .panel.panel-default - .panel-heading Joined projects (#{@joined_projects.count}) - %ul.well-list - - @joined_projects.sort_by(&:name_with_namespace).each do |project| - - member = project.team.find_member(@user.id) - %li.project_member - .list-item-name - = link_to admin_namespace_project_path(project.namespace, project), class: dom_class(project) do - = project.name_with_namespace - - - if member - .pull-right - - if member.owner? - %span.light Owner - - else - %span.light= member.human_access - - - if member.respond_to? :project - = link_to namespace_project_project_member_path(project.namespace, project, member), data: { confirm: remove_from_project_team_message(project, member) }, remote: true, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from project' do - %i.fa.fa-times - #ssh-keys.tab-pane - = render 'profiles/keys/key_table', admin: true diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml deleted file mode 100644 index c1fc1602d0a..00000000000 --- a/app/views/dashboard/_activities.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -= render "events/event_last_push", event: @last_push -= render 'shared/event_filter' -.content_list -= spinner diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml deleted file mode 100644 index d676576067c..00000000000 --- a/app/views/dashboard/_projects.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -.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 diff --git a/app/views/dashboard/_sidebar.html.haml b/app/views/dashboard/_sidebar.html.haml deleted file mode 100644 index 78f695be916..00000000000 --- a/app/views/dashboard/_sidebar.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -= render "dashboard/projects", projects: @projects -.prepend-top-20 - = render 'shared/promo' diff --git a/app/views/dashboard/_zero_authorized_projects.html.haml b/app/views/dashboard/_zero_authorized_projects.html.haml deleted file mode 100644 index 4e7d6639727..00000000000 --- a/app/views/dashboard/_zero_authorized_projects.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -- publicish_project_count = Project.publicish(current_user).count -%h3.page-title Welcome to GitLab! -%p.light Self hosted Git management application. -%hr -%div - .dashboard-intro-icon - %i.fa.fa-bookmark-o - .dashboard-intro-text - %p.slead - You don't have access to any projects right now. - %br - - if current_user.can_create_project? - You can create up to - %strong= pluralize(current_user.projects_limit, "project") + "." - - else - If you are added to a project, it will be displayed here. - - - if current_user.can_create_project? - .link_holder - = link_to new_project_path, class: "btn btn-new" do - %i.fa.fa-plus - New Project - -- if current_user.can_create_group? - %hr - %div - .dashboard-intro-icon - %i.fa.fa-users - .dashboard-intro-text - %p.slead - You can create a group for several dependent projects. - %br - Groups are the best way to manage projects and members. - .link_holder - = link_to new_group_path, class: "btn btn-new" do - %i.fa.fa-plus - New Group - --if publicish_project_count > 0 - %hr - %div - .dashboard-intro-icon - %i.fa.fa-globe - .dashboard-intro-text - %p.slead - There are - %strong= publicish_project_count - public projects on this server. - %br - Public projects are an easy way to allow everyone to have read-only access. - .link_holder - = link_to trending_explore_projects_path, class: "btn btn-new" do - Browse public projects diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml deleted file mode 100644 index 0cb7f764fab..00000000000 --- a/app/views/dashboard/groups/index.html.haml +++ /dev/null @@ -1,40 +0,0 @@ -%h3.page-title - Group Membership - - if current_user.can_create_group? - %span.pull-right - = link_to new_group_path, class: "btn btn-new" do - %i.fa.fa-plus - New Group -%p.light - 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 - - 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 - - - if can?(current_user, :destroy_group_member, group_member) - = link_to leave_group_group_members_path(group), data: { confirm: leave_group_message(group.name) }, method: :delete, class: "btn-sm btn btn-grouped", title: 'Remove user from group' do - %i.fa.fa-sign-out - Leave - - = image_tag group_icon(group), class: "avatar s40 avatar-tile" - = 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")} - -= paginate @group_members diff --git a/app/views/dashboard/issues.atom.builder b/app/views/dashboard/issues.atom.builder deleted file mode 100644 index 72e9e361dc3..00000000000 --- a/app/views/dashboard/issues.atom.builder +++ /dev/null @@ -1,13 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "#{current_user.name} issues" - xml.link href: issues_dashboard_url(:atom, private_token: current_user.private_token), rel: "self", type: "application/atom+xml" - xml.link href: issues_dashboard_url(private_token: current_user.private_token), rel: "alternate", type: "text/html" - xml.id issues_dashboard_url(private_token: current_user.private_token) - xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? - - @issues.each do |issue| - issue_to_atom(xml, issue) - end -end - diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml deleted file mode 100644 index db19a46cb26..00000000000 --- a/app/views/dashboard/issues.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%h3.page-title - Issues - -%p.light - List all issues from all projects you have access to. -%hr - -.append-bottom-20 - = render 'shared/issuable_filter' -= render 'shared/issues' diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml deleted file mode 100644 index 97a42461b4e..00000000000 --- a/app/views/dashboard/merge_requests.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%h3.page-title - Merge Requests - - -%p.light - List all merge requests from all projects you have access to. -%hr -.append-bottom-20 - = render 'shared/issuable_filter' -= render 'shared/merge_requests' diff --git a/app/views/dashboard/milestones/_issue.html.haml b/app/views/dashboard/milestones/_issue.html.haml deleted file mode 100644 index f689b9698eb..00000000000 --- a/app/views/dashboard/milestones/_issue.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid } - %span.milestone-row - - project = issue.project - %strong #{project.name_with_namespace} · - = link_to [project.namespace.becomes(Namespace), project, issue] do - %span.cgray ##{issue.iid} - = link_to_gfm issue.title, [project.namespace.becomes(Namespace), project, issue], title: issue.title - .pull-right.assignee-icon - - if issue.assignee - = image_tag avatar_icon(issue.assignee.email, 16), class: "avatar s16" diff --git a/app/views/dashboard/milestones/_issues.html.haml b/app/views/dashboard/milestones/_issues.html.haml deleted file mode 100644 index 9f350b772bd..00000000000 --- a/app/views/dashboard/milestones/_issues.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list issues-sortable-list" } - - if issues - - issues.each do |issue| - = render 'issue', issue: issue diff --git a/app/views/dashboard/milestones/_merge_request.html.haml b/app/views/dashboard/milestones/_merge_request.html.haml deleted file mode 100644 index 8f5c4cce529..00000000000 --- a/app/views/dashboard/milestones/_merge_request.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid } - %span.milestone-row - - project = merge_request.project - %strong #{project.name_with_namespace} · - = link_to [project.namespace.becomes(Namespace), project, merge_request] do - %span.cgray ##{merge_request.iid} - = link_to_gfm merge_request.title, [project.namespace.becomes(Namespace), project, merge_request], title: merge_request.title - .pull-right.assignee-icon - - if merge_request.assignee - = image_tag avatar_icon(merge_request.assignee.email, 16), class: "avatar s16" diff --git a/app/views/dashboard/milestones/_merge_requests.html.haml b/app/views/dashboard/milestones/_merge_requests.html.haml deleted file mode 100644 index 50057e2c636..00000000000 --- a/app/views/dashboard/milestones/_merge_requests.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list merge_requests-sortable-list" } - - if merge_requests - - merge_requests.each do |merge_request| - = render 'merge_request', merge_request: merge_request diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml deleted file mode 100644 index 21e730bb7ff..00000000000 --- a/app/views/dashboard/milestones/_milestone.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -%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 - = link_to dashboard_milestone_path(milestone.safe_title, title: milestone.title) do - = pluralize milestone.issue_count, 'Issue' -   - = link_to dashboard_milestone_path(milestone.safe_title, 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 diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml deleted file mode 100644 index 9944c0df815..00000000000 --- a/app/views/dashboard/milestones/index.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -%h3.page-title - Milestones - %span.pull-right #{@dashboard_milestones.count} milestones - -%p.light - List all milestones from all projects you have access to. - -%hr - -= render 'shared/milestones_filter' -.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 - = paginate @dashboard_milestones, theme: "gitlab" diff --git a/app/views/dashboard/milestones/show.html.haml b/app/views/dashboard/milestones/show.html.haml deleted file mode 100644 index 57cce9ab749..00000000000 --- a/app/views/dashboard/milestones/show.html.haml +++ /dev/null @@ -1,81 +0,0 @@ -%h4.page-title - .issue-box{ class: "issue-box-#{@dashboard_milestone.closed? ? 'closed' : 'open'}" } - - if @dashboard_milestone.closed? - Closed - - else - Open - Milestone #{@dashboard_milestone.title} - -%hr -- if (@dashboard_milestone.total_items_count == @dashboard_milestone.closed_items_count) && @dashboard_milestone.active? - .alert.alert-success - %span All issues for this milestone are closed. You may close the milestone now. - -.description -%table.table - %thead - %tr - %th Project - %th Open issues - %th State - %th Due date - - @dashboard_milestone.milestones.each do |milestone| - %tr - %td - = link_to "#{milestone.project.name_with_namespace}", namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - %td - = milestone.issues.opened.count - %td - - if milestone.closed? - Closed - - else - Open - %td - = milestone.expires_at - -.context - %p.lead - Progress: - #{@dashboard_milestone.closed_items_count} closed - – - #{@dashboard_milestone.open_items_count} open - = milestone_progress_bar(@dashboard_milestone) - -%ul.nav.nav-tabs - %li.active - = link_to '#tab-issues', 'data-toggle' => 'tab' do - Issues - %span.badge= @dashboard_milestone.issue_count - %li - = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do - Merge Requests - %span.badge= @dashboard_milestone.merge_requests_count - %li - = link_to '#tab-participants', 'data-toggle' => 'tab' do - Participants - %span.badge= @dashboard_milestone.participants.count - -.tab-content - .tab-pane.active#tab-issues - .row - .col-md-6 - = render 'issues', title: "Open", issues: @dashboard_milestone.opened_issues - .col-md-6 - = render 'issues', title: "Closed", issues: @dashboard_milestone.closed_issues - - .tab-pane#tab-merge-requests - .row - .col-md-6 - = render 'merge_requests', title: "Open", merge_requests: @dashboard_milestone.opened_merge_requests - .col-md-6 - = render 'merge_requests', title: "Closed", merge_requests: @dashboard_milestone.closed_merge_requests - - .tab-pane#tab-participants - %ul.bordered-list - - @dashboard_milestone.participants.each do |user| - %li - = link_to user, title: user.name, class: "darken" do - = image_tag avatar_icon(user.email, 32), class: "avatar s32" - %strong= truncate(user.name, lenght: 40) - %br - %small.cgray= user.username diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml deleted file mode 100644 index f4ad2b294b3..00000000000 --- a/app/views/dashboard/projects/starred.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -- if @projects.any? - .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 - - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - -- 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.atom.builder b/app/views/dashboard/show.atom.builder deleted file mode 100644 index da631ecb33e..00000000000 --- a/app/views/dashboard/show.atom.builder +++ /dev/null @@ -1,12 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "Dashboard feed#{" - #{current_user.name}" if current_user.name.present?}" - xml.link href: dashboard_url(:atom), rel: "self", type: "application/atom+xml" - xml.link href: dashboard_url, rel: "alternate", type: "text/html" - xml.id projects_url - xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? - - @events.each do |event| - event_to_atom(xml, event) - end -end diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml deleted file mode 100644 index fa8946011b7..00000000000 --- a/app/views/dashboard/show.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -- if @projects.any? - .dashboard.row - %section.activities.col-md-8 - = render 'activities' - %aside.col-md-4 - = render 'sidebar' - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - -- else - = render "zero_authorized_projects" diff --git a/app/views/devise/confirmations/new.html.haml b/app/views/devise/confirmations/new.html.haml deleted file mode 100644 index 970ba147111..00000000000 --- a/app/views/devise/confirmations/new.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.login-box - .login-heading - %h3 Resend confirmation instructions - .login-body - = form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| - .devise-errors - = devise_error_messages! - .clearfix.append-bottom-20 - = f.email_field :email, placeholder: 'Email', class: "form-control", required: true - .clearfix - = f.submit "Resend confirmation instructions", class: 'btn btn-success' - -.clearfix.prepend-top-20 - = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/mailer/confirmation_instructions.html.erb b/app/views/devise/mailer/confirmation_instructions.html.erb deleted file mode 100644 index c6fa8f0ee36..00000000000 --- a/app/views/devise/mailer/confirmation_instructions.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -

    Welcome <%= @resource.name %>!

    - -<% if @resource.unconfirmed_email.present? %> -

    You can confirm your email (<%= @resource.unconfirmed_email %>) through the link below:

    -<% else %> -

    You can confirm your account through the link below:

    -<% end %> - -

    <%= link_to 'Confirm your account', confirmation_url(@resource, confirmation_token: @token) %>

    diff --git a/app/views/devise/mailer/reset_password_instructions.html.erb b/app/views/devise/mailer/reset_password_instructions.html.erb deleted file mode 100644 index 23b31da92d8..00000000000 --- a/app/views/devise/mailer/reset_password_instructions.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -

    Hello <%= @resource.email %>!

    - -

    Someone has requested a link to change your password, and you can do this through the link below.

    - -

    <%= link_to 'Change your password', edit_password_url(@resource, reset_password_token: @token) %>

    - -

    If you didn't request this, please ignore this email.

    -

    Your password won't change until you access the link above and create a new one.

    diff --git a/app/views/devise/mailer/unlock_instructions.html.erb b/app/views/devise/mailer/unlock_instructions.html.erb deleted file mode 100644 index 79d6c761d8f..00000000000 --- a/app/views/devise/mailer/unlock_instructions.html.erb +++ /dev/null @@ -1,7 +0,0 @@ -

    Hello <%= @resource.email %>!

    - -

    Your account has been locked due to an excessive amount of unsuccessful sign in attempts.

    - -

    Click the link below to unlock your account:

    - -

    <%= link_to 'Unlock your account', unlock_url(@resource, unlock_token: @token) %>

    diff --git a/app/views/devise/passwords/edit.html.haml b/app/views/devise/passwords/edit.html.haml deleted file mode 100644 index 56048e99c17..00000000000 --- a/app/views/devise/passwords/edit.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -.login-box - .login-heading - %h3 Change your password - .login-body - = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| - .devise-errors - = devise_error_messages! - = f.hidden_field :reset_password_token - %div - = f.password_field :password, class: "form-control top", placeholder: "New password", required: true - %div - = f.password_field :password_confirmation, class: "form-control bottom", placeholder: "Confirm new password", required: true - .clearfix - = f.submit "Change your password", class: "btn btn-primary" - -.clearfix.prepend-top-20 - %p - = link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) - = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml deleted file mode 100644 index e8820daf58f..00000000000 --- a/app/views/devise/passwords/new.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.login-box - .login-heading - %h3 Reset password - .login-body - = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| - .devise-errors - = devise_error_messages! - .clearfix.append-bottom-20 - = f.email_field :email, placeholder: "Email", class: "form-control", required: true - .clearfix - = f.submit "Reset password", class: "btn-primary btn" - -.clearfix.prepend-top-20 - = render 'devise/shared/sign_in_link' diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb deleted file mode 100644 index f379e71ae5b..00000000000 --- a/app/views/devise/registrations/edit.html.erb +++ /dev/null @@ -1,28 +0,0 @@ -

    Edit <%= resource_name.to_s.humanize %>

    - -<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> - <%= devise_error_messages! %> - -
    <%= f.label :email %>
    - <%= f.email_field :email %>
    - -
    <%= f.label :name %>
    - <%= f.text_field :name %>
    - -
    <%= f.label :password %> (leave blank if you don't want to change it)
    - <%= f.password_field :password %>
    - -
    <%= f.label :password_confirmation %>
    - <%= f.password_field :password_confirmation %>
    - -
    <%= f.label :current_password %> (we need your current password to confirm your changes)
    - <%= f.password_field :current_password %>
    - -
    <%= f.submit "Update", class: "input_button" %>
    -<% end %> - -

    Cancel your account

    - -

    Unhappy? <%= link_to "Cancel your account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %>.

    - -<%= link_to "Back", :back %> diff --git a/app/views/devise/registrations/new.html.haml b/app/views/devise/registrations/new.html.haml deleted file mode 100644 index d3e37f7494c..00000000000 --- a/app/views/devise/registrations/new.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -= render 'devise/shared/signup_box' - -= render 'devise/shared/sign_in_link' \ No newline at end of file diff --git a/app/views/devise/sessions/_new_base.html.haml b/app/views/devise/sessions/_new_base.html.haml deleted file mode 100644 index 54a39726771..00000000000 --- a/app/views/devise/sessions/_new_base.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| - = f.text_field :login, class: "form-control top", placeholder: "Username or Email", autofocus: "autofocus" - = f.password_field :password, class: "form-control bottom", placeholder: "Password" - - if devise_mapping.rememberable? - .remember-me.checkbox - %label{for: "user_remember_me"} - = f.check_box :remember_me - %span Remember me - .pull-right - = link_to "Forgot your password?", new_password_path(resource_name) - %div - = f.submit "Sign in", class: "btn btn-save" diff --git a/app/views/devise/sessions/_new_ldap.html.haml b/app/views/devise/sessions/_new_ldap.html.haml deleted file mode 100644 index 812e22373a7..00000000000 --- a/app/views/devise/sessions/_new_ldap.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -= form_tag(user_omniauth_callback_path(server['provider_name']), id: 'new_ldap_user' ) do - = text_field_tag :username, nil, {class: "form-control top", placeholder: "#{server['label']} Login", autofocus: "autofocus"} - = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} - = button_tag "#{server['label']} Sign in", class: "btn-save btn" diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml deleted file mode 100644 index 89e4e229ac0..00000000000 --- a/app/views/devise/sessions/new.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -%div - - if signin_enabled? || ldap_enabled? - = render 'devise/shared/signin_box' - - -# Omniauth fits between signin/ldap signin and signup and does not have a surrounding box - - if Gitlab.config.omniauth.enabled && devise_mapping.omniauthable? - .clearfix.prepend-top-20 - = render 'devise/shared/omniauth_box' - - -# Signup only makes sense if you can also sign-in - - if signin_enabled? && signup_enabled? - .prepend-top-20 - = render 'devise/shared/signup_box' - - -# Show a message if none of the mechanisms above are enabled - - if !signin_enabled? && !ldap_enabled? && !(Gitlab.config.omniauth.enabled && devise_mapping.omniauthable?) - %div - No authentication methods configured. diff --git a/app/views/devise/shared/_links.erb b/app/views/devise/shared/_links.erb deleted file mode 100644 index 49e99e25c1d..00000000000 --- a/app/views/devise/shared/_links.erb +++ /dev/null @@ -1,19 +0,0 @@ -<%- if controller_name != 'sessions' %> - <%= link_to "Sign in", new_session_path(resource_name), class: "btn" %>
    -<% end -%> - -<%- if devise_mapping.registerable? && controller_name != 'registrations' && gitlab_config.signup_enabled %> - <%= link_to "Sign up", new_registration_path(resource_name) %>
    -<% end -%> - -<%- if devise_mapping.recoverable? && controller_name != 'passwords' %> -<%= link_to "Forgot your password?", new_password_path(resource_name), class: "btn" %>
    -<% end -%> - -<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %> - <%= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name) %>
    -<% end -%> - -<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %> - <%= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name) %>
    -<% end -%> diff --git a/app/views/devise/shared/_omniauth_box.html.haml b/app/views/devise/shared/_omniauth_box.html.haml deleted file mode 100644 index b647b906b71..00000000000 --- a/app/views/devise/shared/_omniauth_box.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%p - %span.light - Sign in with   - - providers = additional_providers - - providers.each do |provider| - %span.light - - if default_providers.include?(provider) - = link_to oauth_image_tag(provider), omniauth_authorize_path(resource_name, provider), class: 'oauth-image-link' - - else - = link_to provider.to_s.titleize, omniauth_authorize_path(resource_name, provider), class: "btn" diff --git a/app/views/devise/shared/_sign_in_link.html.haml b/app/views/devise/shared/_sign_in_link.html.haml deleted file mode 100644 index fafc4b82f53..00000000000 --- a/app/views/devise/shared/_sign_in_link.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%p - %span.light - Already have login and password? - %strong - = link_to "Sign in", new_session_path(resource_name) diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml deleted file mode 100644 index c76574db457..00000000000 --- a/app/views/devise/shared/_signin_box.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -.login-box - - if signup_enabled? - .login-heading - %h3 Existing user? Sign in - - else - .login-heading - %h3 Sign in - .login-body - - if ldap_enabled? - %ul.nav.nav-tabs - - @ldap_servers.each_with_index do |server, i| - %li{class: (:active if i.zero?)} - = 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 - - @ldap_servers.each_with_index do |server, i| - %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} - = render 'devise/sessions/new_ldap', server: server - - if signin_enabled? - %div#tab-signin.tab-pane - = render 'devise/sessions/new_base' - - - elsif signin_enabled? - = render 'devise/sessions/new_base' diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml deleted file mode 100644 index 9dc6aeffd59..00000000000 --- a/app/views/devise/shared/_signup_box.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -.login-box - - if signin_enabled? - .login-heading - %h3 New user? Create an account - - else - .login-heading - %h3 Create an account - .login-body - = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| - .devise-errors - = devise_error_messages! - %div - = f.text_field :name, class: "form-control top", placeholder: "Name", required: true - %div - = f.text_field :username, class: "form-control middle", placeholder: "Username", required: true - %div - = f.email_field :email, class: "form-control middle", placeholder: "Email", required: true - .form-group.append-bottom-20#password-strength - = f.password_field :password, class: "form-control bottom", id: "user_password_sign_up", placeholder: "Password", required: true - %div - = f.submit "Sign up", class: "btn-create btn" - -.clearfix.prepend-top-20 - %p - %span.light Didn't receive a confirmation email? - = succeed '.' do - = link_to "Request a new one", new_confirmation_path(resource_name) diff --git a/app/views/devise/unlocks/new.html.erb b/app/views/devise/unlocks/new.html.erb deleted file mode 100644 index f9277d1673f..00000000000 --- a/app/views/devise/unlocks/new.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -

    Resend unlock instructions

    - -<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %> - <%= devise_error_messages! %> - -
    <%= f.label :email %>
    - <%= f.email_field :email %>
    - -
    <%= f.submit "Resend unlock instructions" %>
    -<% end %> - -<%= render partial: "devise/shared/links" %> diff --git a/app/views/doorkeeper/applications/_delete_form.html.haml b/app/views/doorkeeper/applications/_delete_form.html.haml deleted file mode 100644 index 6a5c917049d..00000000000 --- a/app/views/doorkeeper/applications/_delete_form.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- submit_btn_css ||= 'btn btn-link btn-remove btn-sm' -= form_tag oauth_application_path(application) do - %input{:name => "_method", :type => "hidden", :value => "delete"}/ - = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css \ No newline at end of file diff --git a/app/views/doorkeeper/applications/_form.html.haml b/app/views/doorkeeper/applications/_form.html.haml deleted file mode 100644 index a5fec2fabdb..00000000000 --- a/app/views/doorkeeper/applications/_form.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -= form_for application, url: doorkeeper_submit_path(application), html: {class: 'form-horizontal', role: 'form'} do |f| - - if application.errors.any? - .alert.alert-danger{"data-alert" => ""} - %p Whoops! Check your form for possible errors - = content_tag :div, class: "form-group#{' has-error' if application.errors[:name].present?}" do - = f.label :name, class: 'col-sm-2 control-label' - .col-sm-10 - = f.text_field :name, class: 'form-control' - = doorkeeper_errors_for application, :name - = content_tag :div, class: "form-group#{' has-error' if application.errors[:redirect_uri].present?}" do - = f.label :redirect_uri, class: 'col-sm-2 control-label' - .col-sm-10 - = f.text_area :redirect_uri, class: 'form-control' - = doorkeeper_errors_for application, :redirect_uri - %span.help-block - Use one line per URI - - if Doorkeeper.configuration.native_redirect_uri - %span.help-block - Use - %code= Doorkeeper.configuration.native_redirect_uri - for local tests - .form-actions - = f.submit 'Submit', class: "btn btn-primary wide" - = link_to "Cancel", applications_profile_path, class: "btn btn-default" diff --git a/app/views/doorkeeper/applications/edit.html.haml b/app/views/doorkeeper/applications/edit.html.haml deleted file mode 100644 index 61584eb9c49..00000000000 --- a/app/views/doorkeeper/applications/edit.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%h3.page-title Edit application -= render 'form', application: @application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/index.html.haml b/app/views/doorkeeper/applications/index.html.haml deleted file mode 100644 index e5be4b4bcac..00000000000 --- a/app/views/doorkeeper/applications/index.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -%h3.page-title Your applications -%p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' -%table.table.table-striped - %thead - %tr - %th Name - %th Callback URL - %th - %th - %tbody - - @applications.each do |application| - %tr{:id => "application_#{application.id}"} - %td= link_to application.name, oauth_application_path(application) - %td= application.redirect_uri - %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link' - %td= render 'delete_form', application: application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/new.html.haml b/app/views/doorkeeper/applications/new.html.haml deleted file mode 100644 index 655845e4af5..00000000000 --- a/app/views/doorkeeper/applications/new.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%h3.page-title New application -= render 'form', application: @application \ No newline at end of file diff --git a/app/views/doorkeeper/applications/show.html.haml b/app/views/doorkeeper/applications/show.html.haml deleted file mode 100644 index 82e78b4af13..00000000000 --- a/app/views/doorkeeper/applications/show.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -%h3.page-title - Application: #{@application.name} - - -%table.table - %tr - %td - Application Id - %td - %code#application_id= @application.uid - %tr - %td - Secret: - %td - %code#secret= @application.secret - - %tr - %td - Callback url - %td - - @application.redirect_uri.split.each do |uri| - %div - %span.monospace= uri -.form-actions - = link_to 'Edit', edit_oauth_application_path(@application), class: 'btn btn-primary wide pull-left' - = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10' diff --git a/app/views/doorkeeper/authorizations/error.html.haml b/app/views/doorkeeper/authorizations/error.html.haml deleted file mode 100644 index 7561ec85ed9..00000000000 --- a/app/views/doorkeeper/authorizations/error.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title An error has occurred -%main{:role => "main"} - %pre= @pre_auth.error_response.body[:error_description] \ No newline at end of file diff --git a/app/views/doorkeeper/authorizations/new.html.haml b/app/views/doorkeeper/authorizations/new.html.haml deleted file mode 100644 index 15f9ee266c1..00000000000 --- a/app/views/doorkeeper/authorizations/new.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -%h3.page-title Authorize required -%main{:role => "main"} - %p.h4 - Authorize - %strong.text-info= @pre_auth.client.name - to use your account? - - if @pre_auth.scopes - #oauth-permissions - %p This application will be able to: - %ul.text-info - - @pre_auth.scopes.each do |scope| - %li= t scope, scope: [:doorkeeper, :scopes] - %hr/ - .actions - = form_tag oauth_authorization_path, method: :post do - = hidden_field_tag :client_id, @pre_auth.client.uid - = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri - = hidden_field_tag :state, @pre_auth.state - = hidden_field_tag :response_type, @pre_auth.response_type - = hidden_field_tag :scope, @pre_auth.scope - = submit_tag "Authorize", class: "btn btn-success wide pull-left" - = form_tag oauth_authorization_path, method: :delete do - = hidden_field_tag :client_id, @pre_auth.client.uid - = hidden_field_tag :redirect_uri, @pre_auth.redirect_uri - = hidden_field_tag :state, @pre_auth.state - = hidden_field_tag :response_type, @pre_auth.response_type - = hidden_field_tag :scope, @pre_auth.scope - = submit_tag "Deny", class: "btn btn-danger prepend-left-10" \ No newline at end of file diff --git a/app/views/doorkeeper/authorizations/show.html.haml b/app/views/doorkeeper/authorizations/show.html.haml deleted file mode 100644 index 9a402007194..00000000000 --- a/app/views/doorkeeper/authorizations/show.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%h3.page-title Authorization code: -%main{:role => "main"} - %code#authorization_code= params[:code] \ No newline at end of file diff --git a/app/views/doorkeeper/authorized_applications/_delete_form.html.haml b/app/views/doorkeeper/authorized_applications/_delete_form.html.haml deleted file mode 100644 index 4bba72167e3..00000000000 --- a/app/views/doorkeeper/authorized_applications/_delete_form.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- submit_btn_css ||= 'btn btn-link btn-remove' -= form_tag oauth_authorized_application_path(application) do - %input{:name => "_method", :type => "hidden", :value => "delete"}/ - = submit_tag 'Revoke', onclick: "return confirm('Are you sure?')", class: 'btn btn-link btn-remove btn-sm' \ No newline at end of file diff --git a/app/views/doorkeeper/authorized_applications/index.html.haml b/app/views/doorkeeper/authorized_applications/index.html.haml deleted file mode 100644 index 814cdc987ef..00000000000 --- a/app/views/doorkeeper/authorized_applications/index.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -%header.page-header - %h1 Your authorized applications -%main{:role => "main"} - %table.table.table-striped - %thead - %tr - %th Application - %th Created At - %th - %th - %tbody - - @applications.each do |application| - %tr - %td= application.name - %td= application.created_at.strftime('%Y-%m-%d %H:%M:%S') - %td= render 'delete_form', application: application \ No newline at end of file diff --git a/app/views/errors/access_denied.html.haml b/app/views/errors/access_denied.html.haml deleted file mode 100644 index a1d8664c4ce..00000000000 --- a/app/views/errors/access_denied.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%h1 403 -%h3 Access Denied -%hr -%p You are not allowed to access this page. -%p Read more about project permissions #{link_to "here", help_page_path("permissions", "permissions"), class: "vlink"} diff --git a/app/views/errors/encoding.html.haml b/app/views/errors/encoding.html.haml deleted file mode 100644 index 64c7451a8da..00000000000 --- a/app/views/errors/encoding.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h1 500 -%h3 Encoding Error -%hr -%p Page can't be loaded because of an encoding error. diff --git a/app/views/errors/git_not_found.html.haml b/app/views/errors/git_not_found.html.haml deleted file mode 100644 index 189e53bca55..00000000000 --- a/app/views/errors/git_not_found.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%h1 404 -%h3 Git Resource Not found -%hr -%p - Application can't get access to some branch or commit in your repository. It - may have been moved. diff --git a/app/views/errors/not_found.html.haml b/app/views/errors/not_found.html.haml deleted file mode 100644 index 7bf88f592cf..00000000000 --- a/app/views/errors/not_found.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h1 404 -%h3 The resource you were looking for doesn't exist. -%hr -%p You may have mistyped the address or the page may have moved. diff --git a/app/views/errors/omniauth_error.html.haml b/app/views/errors/omniauth_error.html.haml deleted file mode 100644 index f3c8221a9d9..00000000000 --- a/app/views/errors/omniauth_error.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -%h1 422 -%h3 Sign-in using #{@provider} auth failed -%hr -%p Sign-in failed because #{@error}. -%p There are couple of steps you can take: - -%ul - %li Try logging in using your email - %li Try logging in using your username - %li If you have forgotten your password, try recovering it using #{ link_to "Password recovery", new_password_path(resource_name) } - -%p If none of the options work, try contacting the GitLab administrator. diff --git a/app/views/events/_commit.html.haml b/app/views/events/_commit.html.haml deleted file mode 100644 index c86ce9ae651..00000000000 --- a/app/views/events/_commit.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%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 diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml deleted file mode 100644 index 02b1dec753c..00000000000 --- a/app/views/events/_event.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- if event.proper? - .event-item{class: "#{event.body? ? "event-block" : "event-inline" }"} - .event-item-timestamp - #{time_ago_with_tooltip(event.created_at)} - - = cache [event, current_user] do - = image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:'' - - - if event.push? - = render "events/event/push", event: event - - elsif event.commented? - = render "events/event/note", event: event - - elsif event.created_project? - = render "events/event/created_project", event: event - - else - = render "events/event/common", event: event \ No newline at end of file diff --git a/app/views/events/_event_issue.atom.haml b/app/views/events/_event_issue.atom.haml deleted file mode 100644 index 0edb61ea246..00000000000 --- a/app/views/events/_event_issue.atom.haml +++ /dev/null @@ -1,3 +0,0 @@ -%div{xmlns: "http://www.w3.org/1999/xhtml"} - - if issue.description.present? - = markdown(issue.description, xhtml: true) diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml deleted file mode 100644 index d2f0005142a..00000000000 --- a/app/views/events/_event_last_push.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -- 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 - 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 diff --git a/app/views/events/_event_merge_request.atom.haml b/app/views/events/_event_merge_request.atom.haml deleted file mode 100644 index 1a8b62abeab..00000000000 --- a/app/views/events/_event_merge_request.atom.haml +++ /dev/null @@ -1,3 +0,0 @@ -%div{xmlns: "http://www.w3.org/1999/xhtml"} - - if merge_request.description.present? - = markdown(merge_request.description, xhtml: true) diff --git a/app/views/events/_event_note.atom.haml b/app/views/events/_event_note.atom.haml deleted file mode 100644 index b49c331ccf2..00000000000 --- a/app/views/events/_event_note.atom.haml +++ /dev/null @@ -1,2 +0,0 @@ -%div{xmlns: "http://www.w3.org/1999/xhtml"} - = markdown(note.note, xhtml: true) diff --git a/app/views/events/_event_push.atom.haml b/app/views/events/_event_push.atom.haml deleted file mode 100644 index 5d14def8f75..00000000000 --- a/app/views/events/_event_push.atom.haml +++ /dev/null @@ -1,14 +0,0 @@ -%div{xmlns: "http://www.w3.org/1999/xhtml"} - - event.commits.first(15).each do |commit| - %p - %strong= commit[:author][:name] - = link_to "(##{truncate_sha(commit[:id])})", namespace_project_commit_path(event.project.namespace, event.project, id: commit[:id]) - %i - at - = commit[:timestamp].to_time.to_s(:short) - %blockquote= markdown(escape_once(commit[:message]), xhtml: true) - - if event.commits_count > 15 - %p - %i - \... and - = pluralize(event.commits_count - 15, "more commit") diff --git a/app/views/events/_events.html.haml b/app/views/events/_events.html.haml deleted file mode 100644 index 68c19df092d..00000000000 --- a/app/views/events/_events.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'events/event', collection: @events diff --git a/app/views/events/event/_common.html.haml b/app/views/events/event/_common.html.haml deleted file mode 100644 index a39e62e9dac..00000000000 --- a/app/views/events/event/_common.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -.event-title - %span.author_name= link_to_author event - %span.event_label{class: event.action_name} - = event_action_name(event) - - - if event.target - %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] - at - - - if event.project - = link_to_project event.project - - else - = event.project_name - -- if event.target.respond_to?(:title) - .event-body - .event-note - = event.target.title diff --git a/app/views/events/event/_created_project.html.haml b/app/views/events/event/_created_project.html.haml deleted file mode 100644 index 552525f4a07..00000000000 --- a/app/views/events/event/_created_project.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -.event-title - %span.author_name= link_to_author event - %span.event_label{class: event.action_name} - = event_action_name(event) - - - if event.project - = link_to_project event.project - - else - = event.project_name - -- if current_user == event.author && !event.project.private? && twitter_sharing_enabled? - .event-body - .event-note - .md - %p - Congratulations! Why not share your accomplishment with the world? - - %a.twitter-share-button{ | - href: "https://twitter.com/share", | - "data-url" => event.project.web_url, | - "data-text" => "I just #{event.project.imported? ? "imported" : "created"} a new project in GitLab! GitLab is version control on your server.", | - "data-size" => "medium", | - "data-related" => "gitlab", | - "data-hashtags" => "gitlab", | - "data-count" => "none"} - Tweet - %script{src: "//platform.twitter.com/widgets.js"} diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml deleted file mode 100644 index 4ef18c09060..00000000000 --- a/app/views/events/event/_note.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -.event-title - %span.author_name= link_to_author event - %span.event_label - = event.action_name - = event_note_title_html(event) - at - - - if event.project - = link_to_project event.project - - else - = event.project_name - -.event-body - .event-note - .md - %i.fa.fa-comment-o.event-note-icon - = event_note(event.target.note) - - note = event.target - - if note.attachment.url - - if note.attachment.image? - = link_to note.attachment.url, target: '_blank' do - = image_tag note.attachment.url, class: 'note-image-attach' - - else - = link_to note.attachment.url, target: "_blank", class: 'note-file-attach' do - %i.fa.fa-paperclip - = note.attachment_identifier diff --git a/app/views/events/event/_push.html.haml b/app/views/events/event/_push.html.haml deleted file mode 100644 index 60d7978b13f..00000000000 --- a/app/views/events/event/_push.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -.event-title - %span.author_name= link_to_author event - %span.event_label.pushed #{event.action_name} #{event.ref_type} - - if event.rm_ref? - %strong= event.ref_name - - else - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - at - = link_to_project event.project - -- if event.push_with_commits? - - project = event.project - .event-body - %ul.well-list.event_commits - - few_commits = event.commits[0...2] - - few_commits.each do |commit| - = render "events/commit", commit: commit, project: project - - - if event.commits_count > 1 - %li.commits-stat - - if event.commits_count > 2 - %span ... and #{event.commits_count - 2} more commits. - - if event.md_ref? - - from = event.commit_from - - from_label = truncate_sha(from) - - else - - from = event.project.default_branch - - from_label = from - = link_to namespace_project_compare_path(event.project.namespace, event.project, from: from, to: event.commit_to) do - %strong Compare → #{from_label}...#{truncate_sha(event.commit_to)} diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml deleted file mode 100644 index 2ea6cb18655..00000000000 --- a/app/views/explore/groups/index.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -.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 input-mn-300", id: "groups_search" - .form-group - = button_tag 'Search', class: "btn btn-primary wide" - - .pull-right - .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_groups_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to explore_groups_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to explore_groups_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to explore_groups_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated - -%hr - -%ul.bordered-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')} - - unless @groups.present? - .nothing-here-block No public groups - - -= paginate @groups, theme: "gitlab" diff --git a/app/views/explore/projects/_filter.html.haml b/app/views/explore/projects/_filter.html.haml deleted file mode 100644 index b3963a9d901..00000000000 --- a/app/views/explore/projects/_filter.html.haml +++ /dev/null @@ -1,67 +0,0 @@ -.pull-left - = form_tag explore_projects_filter_path, method: :get, class: 'form-inline form-tiny' do |f| - .form-group - = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input input-mn-300", id: "projects_search" - .form-group - = button_tag 'Search', class: "btn btn-primary wide" - -.pull-right.hidden-sm.hidden-xs - - if current_user - .dropdown.inline.append-right-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-globe - %span.light Visibility: - - if params[:visibility_level].present? - = visibility_level_label(params[:visibility_level].to_i) - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to explore_projects_filter_path(visibility_level: nil) do - Any - - Gitlab::VisibilityLevel.values.each do |level| - %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } - = link_to explore_projects_filter_path(visibility_level: level) do - = visibility_level_icon(level) - = visibility_level_label(level) - - - if @tags.present? - .dropdown.inline.append-right-10 - %a.dropdown-toggle.btn{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-tags - %span.light Tags: - - if params[:tag].present? - = params[:tag] - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to explore_projects_filter_path(tag: nil) do - Any - - - @tags.each do |tag| - %li{ class: (tag.name == params[:tag]) ? 'active' : 'light' } - = 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 diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml deleted file mode 100644 index d65fb529373..00000000000 --- 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? - %p.project-description.str-truncated - = project.description - - .repo-info - - unless project.empty_repo? - = link_to pluralize(project.repository.round_commit_count, '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/index.html.haml b/app/views/explore/projects/index.html.haml deleted file mode 100644 index 5086b58cd03..00000000000 --- a/app/views/explore/projects/index.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.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" diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml deleted file mode 100644 index 420f0693756..00000000000 --- a/app/views/explore/projects/starred.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -.explore-trending-block - %p.lead - %i.fa.fa-star - See most starred projects - %hr - .public-projects - %ul.bordered-list - = render @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 deleted file mode 100644 index 9cad9238933..00000000000 --- a/app/views/explore/projects/trending.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.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 - - .center - = link_to 'Show all projects', explore_projects_path, class: 'btn btn-primary' diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml deleted file mode 100644 index 4f8aec1c67e..00000000000 --- a/app/views/groups/_projects.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -.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 can? current_user, :create_projects, @group - %span.input-group-btn - = 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 diff --git a/app/views/groups/_settings_nav.html.haml b/app/views/groups/_settings_nav.html.haml deleted file mode 100644 index e6aee22e529..00000000000 --- a/app/views/groups/_settings_nav.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -%ul.sidebar-subnav - = nav_link(path: 'groups#edit') do - = link_to edit_group_path(@group), title: 'Group' do - %i.fa.fa-pencil-square-o - %span - Group - = nav_link(path: 'groups#projects') do - = link_to projects_group_path(@group), title: 'Projects' do - %i.fa.fa-folder - %span - Projects diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml deleted file mode 100644 index 49e7180bf98..00000000000 --- a/app/views/groups/edit.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -.panel.panel-default - .panel-heading - %strong= @group.name - group settings: - .panel-body - = form_for @group, html: { multipart: true, class: "form-horizontal" }, authenticity_token: true do |f| - - if @group.errors.any? - .alert.alert-danger - %span= @group.errors.full_messages.first - = render 'shared/group_form', f: f - - .form-group - .col-sm-2 - .col-sm-10 - = image_tag group_icon(@group), alt: '', class: 'avatar group-avatar s160' - %p.light - - if @group.avatar? - You can change your group avatar here - - else - You can upload a group avatar here - = render 'shared/choose_group_avatar_button', f: f - - if @group.avatar? - %hr - = link_to 'Remove avatar', group_avatar_path(@group.to_param), data: { confirm: "Group avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" - - .form-actions - = f.submit 'Save group', class: "btn btn-save" - -.panel.panel-danger - .panel-heading Remove group - .panel-body - %p - Removing group will cause all child projects and resources to be removed. - %br - %strong Removed group can not be restored! - - = link_to 'Remove Group', @group, data: {confirm: 'Removed group can not be restored! Are you sure?'}, method: :delete, class: "btn btn-remove" diff --git a/app/views/groups/group_members/_group_member.html.haml b/app/views/groups/group_members/_group_member.html.haml deleted file mode 100644 index 56b1948a474..00000000000 --- a/app/views/groups/group_members/_group_member.html.haml +++ /dev/null @@ -1,54 +0,0 @@ -- user = member.user -- return unless user || member.invite? -- show_roles = true if show_roles.nil? - -%li{class: "#{dom_class(member)} js-toggle-container", id: dom_id(member)} - %span{class: ("list-item-name" if show_controls)} - - if member.user - = image_tag avatar_icon(user.email, 16), class: "avatar s16", alt: '' - %strong= user.name - %span.cgray= user.username - - if user == current_user - %span.label.label-success It's you - - if user.blocked? - %label.label.label-danger - %strong Blocked - - else - = image_tag avatar_icon(member.invite_email, 16), class: "avatar s16", alt: '' - %strong - = member.invite_email - %span.cgray - invited - - if member.created_by - by - = link_to member.created_by.name, user_path(member.created_by) - = time_ago_with_tooltip(member.created_at) - - - if show_controls && can?(current_user, :admin_group, @group) - = link_to resend_invite_group_group_member_path(@group, member), method: :post, class: "btn-xs btn", title: 'Resend invite' do - Resend invite - - - if show_roles - %span.pull-right - %strong= member.human_access - - if show_controls - - if can?(current_user, :modify_group_member, member) - = button_tag class: "btn-xs btn js-toggle-button", - title: 'Edit access level', type: 'button' do - %i.fa.fa-pencil-square-o - - if can?(current_user, :destroy_group_member, member) -   - - if current_user == user - = link_to leave_group_group_members_path(@group), data: { confirm: leave_group_message(@group.name)}, method: :delete, class: "btn-xs btn btn-remove", title: 'Remove user from group' do - %i.fa.fa-minus.fa-inverse - - else - = link_to group_group_member_path(@group, member), data: { confirm: remove_user_from_group_message(@group, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from group' do - %i.fa.fa-minus.fa-inverse - - .edit-member.hide.js-toggle-content - %br - = form_for [@group, member], remote: true do |f| - .prepend-top-10 - = f.select :access_level, options_for_select(GroupMember.access_level_roles, member.access_level), {}, class: 'form-control' - .prepend-top-10 - = f.submit 'Save', class: 'btn btn-save btn-sm' diff --git a/app/views/groups/group_members/_new_group_member.html.haml b/app/views/groups/group_members/_new_group_member.html.haml deleted file mode 100644 index 3361d7e2a8d..00000000000 --- a/app/views/groups/group_members/_new_group_member.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -= form_for @group_member, url: group_group_members_path(@group), html: { class: 'form-horizontal users-group-form' } do |f| - .form-group - = f.label :user_ids, "People", class: 'control-label' - .col-sm-10 - = users_select_tag(:user_ids, multiple: true, class: 'input-large', scope: :all, email_user: true) - .help-block - Search for existing users or invite new ones using their email address. - - .form-group - = f.label :access_level, "Group Access", class: 'control-label' - .col-sm-10 - = select_tag :access_level, options_for_select(GroupMember.access_level_roles, @group_member.access_level), class: "project-access-select select2" - .help-block - Read more about role permissions - %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" - - .form-actions - = f.submit 'Add users to group', class: "btn btn-create" diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml deleted file mode 100644 index c0c9cd170ad..00000000000 --- a/app/views/groups/group_members/index.html.haml +++ /dev/null @@ -1,43 +0,0 @@ -- 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 - .form-group - = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input input-mn-300' } - = button_tag 'Search', class: 'btn' - - - if current_user && current_user.can?(:admin_group, @group) - .pull-right - = button_tag class: 'btn btn-new js-toggle-button', type: 'button' do - Add members - %i.fa.fa-chevron-down - - .js-toggle-content.hide.new-group-member-holder - = render "new_group_member" - -.panel.panel-default.prepend-top-20 - .panel-heading - %strong #{@group.name} - group members - %small - (#{@members.total_count}) - %ul.well-list - - @members.each do |member| - = render 'groups/group_members/group_member', member: member, show_roles: show_roles, show_controls: true - -= paginate @members, theme: 'gitlab' - -:coffeescript - $('form.member-search-form').on 'submit', (event) -> - event.preventDefault() - Turbolinks.visit @.action + '?' + $(@).serialize() diff --git a/app/views/groups/group_members/update.js.haml b/app/views/groups/group_members/update.js.haml deleted file mode 100644 index 5bad48abafd..00000000000 --- a/app/views/groups/group_members/update.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $("##{dom_id(@member)}").replaceWith('#{escape_javascript(render(@member, member: @member, show_controls: true))}'); diff --git a/app/views/groups/issues.atom.builder b/app/views/groups/issues.atom.builder deleted file mode 100644 index 240001967f3..00000000000 --- a/app/views/groups/issues.atom.builder +++ /dev/null @@ -1,13 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "#{@user.name} issues" - xml.link :href => issues_dashboard_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml" - xml.link :href => issues_dashboard_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html" - xml.id issues_dashboard_url(:private_token => @user.private_token) - xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? - - @issues.each do |issue| - issue_to_atom(xml, issue) - end -end - diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml deleted file mode 100644 index 6c0d89c4e7c..00000000000 --- a/app/views/groups/issues.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%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' -= render 'shared/issues' diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml deleted file mode 100644 index 1ad74905636..00000000000 --- a/app/views/groups/merge_requests.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%h3.page-title - Merge Requests - -%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' -= render 'shared/merge_requests' diff --git a/app/views/groups/milestones/_issue.html.haml b/app/views/groups/milestones/_issue.html.haml deleted file mode 100644 index 09f9b4b8969..00000000000 --- a/app/views/groups/milestones/_issue.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid } - %span.milestone-row - - project = issue.project - %strong #{project.name} · - = link_to [project.namespace.becomes(Namespace), project, issue] do - %span.cgray ##{issue.iid} - = link_to_gfm issue.title, [project.namespace.becomes(Namespace), project, issue], title: issue.title - .pull-right.assignee-icon - - if issue.assignee - = image_tag avatar_icon(issue.assignee.email, 16), class: "avatar s16", alt: '' diff --git a/app/views/groups/milestones/_issues.html.haml b/app/views/groups/milestones/_issues.html.haml deleted file mode 100644 index 9f350b772bd..00000000000 --- a/app/views/groups/milestones/_issues.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list issues-sortable-list" } - - if issues - - issues.each do |issue| - = render 'issue', issue: issue diff --git a/app/views/groups/milestones/_merge_request.html.haml b/app/views/groups/milestones/_merge_request.html.haml deleted file mode 100644 index d0d1426762b..00000000000 --- a/app/views/groups/milestones/_merge_request.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid } - %span.milestone-row - - project = merge_request.project - %strong #{project.name} · - = link_to [project.namespace.becomes(Namespace), project, merge_request] do - %span.cgray ##{merge_request.iid} - = link_to_gfm merge_request.title, [project.namespace.becomes(Namespace), project, merge_request], title: merge_request.title - .pull-right.assignee-icon - - if merge_request.assignee - = image_tag avatar_icon(merge_request.assignee.email, 16), class: "avatar s16", alt: '' diff --git a/app/views/groups/milestones/_merge_requests.html.haml b/app/views/groups/milestones/_merge_requests.html.haml deleted file mode 100644 index 50057e2c636..00000000000 --- a/app/views/groups/milestones/_merge_requests.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list merge_requests-sortable-list" } - - if merge_requests - - merge_requests.each do |merge_request| - = render 'merge_request', merge_request: merge_request diff --git a/app/views/groups/milestones/_milestone.html.haml b/app/views/groups/milestones/_milestone.html.haml deleted file mode 100644 index 30093d2d05d..00000000000 --- a/app/views/groups/milestones/_milestone.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -%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 - = link_to group_milestone_path(@group, milestone.safe_title, title: milestone.title) do - = pluralize milestone.issue_count, 'Issue' -   - = link_to group_milestone_path(@group, milestone.safe_title, 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 diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml deleted file mode 100644 index 008d5a6bd22..00000000000 --- a/app/views/groups/milestones/index.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h3.page-title - Milestones - %span.pull-right #{@group_milestones.count} milestones - -%p.light - 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 - = paginate @group_milestones, theme: "gitlab" diff --git a/app/views/groups/milestones/show.html.haml b/app/views/groups/milestones/show.html.haml deleted file mode 100644 index fb32f2caa4c..00000000000 --- a/app/views/groups/milestones/show.html.haml +++ /dev/null @@ -1,87 +0,0 @@ -%h4.page-title - .issue-box{ class: "issue-box-#{@group_milestone.closed? ? 'closed' : 'open'}" } - - if @group_milestone.closed? - Closed - - else - Open - Milestone #{@group_milestone.title} - .pull-right - - if can?(current_user, :admin_group, @group) - - if @group_milestone.active? - = link_to 'Close Milestone', group_milestone_path(@group, @group_milestone.safe_title, title: @group_milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-sm btn-close" - - else - = link_to 'Reopen Milestone', group_milestone_path(@group, @group_milestone.safe_title, title: @group_milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" - -%hr -- if (@group_milestone.total_items_count == @group_milestone.closed_items_count) && @group_milestone.active? - .alert.alert-success - %span All issues for this milestone are closed. You may close the milestone now. - -.description -%table.table - %thead - %tr - %th Project - %th Open issues - %th State - %th Due date - - @group_milestone.milestones.each do |milestone| - %tr - %td - = link_to "#{milestone.project.name}", namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - %td - = milestone.issues.opened.count - %td - - if milestone.closed? - Closed - - else - Open - %td - = milestone.expires_at - -.context - %p.lead - Progress: - #{@group_milestone.closed_items_count} closed - – - #{@group_milestone.open_items_count} open - = milestone_progress_bar(@group_milestone) - -%ul.nav.nav-tabs - %li.active - = link_to '#tab-issues', 'data-toggle' => 'tab' do - Issues - %span.badge= @group_milestone.issue_count - %li - = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do - Merge Requests - %span.badge= @group_milestone.merge_requests_count - %li - = link_to '#tab-participants', 'data-toggle' => 'tab' do - Participants - %span.badge= @group_milestone.participants.count - -.tab-content - .tab-pane.active#tab-issues - .row - .col-md-6 - = render 'issues', title: "Open", issues: @group_milestone.opened_issues - .col-md-6 - = render 'issues', title: "Closed", issues: @group_milestone.closed_issues - - .tab-pane#tab-merge-requests - .row - .col-md-6 - = render 'merge_requests', title: "Open", merge_requests: @group_milestone.opened_merge_requests - .col-md-6 - = render 'merge_requests', title: "Closed", merge_requests: @group_milestone.closed_merge_requests - - .tab-pane#tab-participants - %ul.bordered-list - - @group_milestone.participants.each do |user| - %li - = link_to user, title: user.name, class: "darken" do - = image_tag avatar_icon(user.email, 32), class: "avatar s32" - %strong= truncate(user.name, lenght: 40) - %br - %small.cgray= user.username diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml deleted file mode 100644 index 6e17cdaef6f..00000000000 --- a/app/views/groups/new.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -= form_for @group, html: { class: 'group-form form-horizontal' } do |f| - - if @group.errors.any? - .alert.alert-danger - %span= @group.errors.full_messages.first - - = render 'shared/group_form', f: f, autofocus: true - - .form-group.group-description-holder - = f.label :avatar, "Group avatar", class: 'control-label' - .col-sm-10 - = render 'shared/choose_group_avatar_button', f: f - - .form-group - .col-sm-2 - .col-sm-10 - = render 'shared/group_tips' - - .form-actions - = f.submit 'Create group', class: "btn btn-create", tabindex: 3 diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml deleted file mode 100644 index 0d547984cc9..00000000000 --- a/app/views/groups/projects.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -.panel.panel-default - .panel-heading - %strong= @group.name - projects: - - if can? current_user, :admin_group, @group - .panel-head-actions - = link_to new_project_path(namespace_id: @group.id), class: "btn btn-sm btn-success" do - %i.fa.fa-plus - New Project - %ul.well-list - - @projects.each do |project| - %li - .list-item-name - = visibility_level_icon(project.visibility_level) - %strong= link_to project.name_with_namespace, project - %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" - - if @projects.blank? - .nothing-here-block This group has no projects yet - -= paginate @projects, theme: "gitlab" diff --git a/app/views/groups/show.atom.builder b/app/views/groups/show.atom.builder deleted file mode 100644 index c78bd1bd263..00000000000 --- a/app/views/groups/show.atom.builder +++ /dev/null @@ -1,12 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "Group feed - #{@group.name}" - xml.link href: group_path(@group, :atom), rel: "self", type: "application/atom+xml" - xml.link href: group_path(@group), rel: "alternate", type: "text/html" - xml.id projects_url - xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? - - @events.each do |event| - event_to_atom(xml, event) - end -end diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml deleted file mode 100644 index 8df9366ecbe..00000000000 --- a/app/views/groups/show.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -.dashboard - .header-with-avatar.clearfix - = image_tag group_icon(@group), class: "avatar group-avatar s90" - %h3 - = @group.name - .username - @#{@group.path} - - if @group.description.present? - .description - = escaped_autolink(@group.description) - %hr - .row - %section.activities.col-md-8 - - if current_user - = render "events/event_last_push", event: @last_push - = render 'shared/event_filter' - .content_list - = spinner - %aside.side.col-md-4 - = render "projects", projects: @projects - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml deleted file mode 100644 index 7b21ca30d8c..00000000000 --- a/app/views/help/_shortcuts.html.haml +++ /dev/null @@ -1,209 +0,0 @@ -#modal-shortcuts.modal.hide{tabindex: -1} - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h4 - Keyboard Shortcuts - %small - = link_to '(Show all)', '#', class: 'js-more-help-button' - .modal-body.shortcuts-cheatsheet - .col-lg-4 - %table.shortcut-mappings - %tbody - %tr - %th - %th Global Shortcuts - %tr - %td.shortcut - .key s - %td Focus Search - %tr - %td.shortcut - .key ? - %td Show this dialog - %tbody - %tr - %th - %th Project Files browsing - %tr - %td.shortcut - .key - %i.fa.fa-arrow-up - %td Move selection up - %tr - %td.shortcut - .key - %i.fa.fa-arrow-down - %td Move selection down - %tr - %td.shortcut - .key enter - %td Open Selection - - .col-lg-4 - %table.shortcut-mappings - %tbody{ class: 'hidden-shortcut project', style: 'display:none' } - %tr - %th - %th Global Dashboard - %tr - %td.shortcut - .key g - .key a - %td - Go to the activity feed - %tr - %td.shortcut - .key g - .key p - %td - Go to projects - %tr - %td.shortcut - .key g - .key i - %td - Go to issues - %tr - %td.shortcut - .key g - .key m - %td - Go to merge requests - %tbody - %tr - %th - %th Project - %tr - %td.shortcut - .key g - .key p - %td - Go to the project's activity feed - %tr - %td.shortcut - .key g - .key f - %td - Go to files - %tr - %td.shortcut - .key g - .key c - %td - Go to commits - %tr - %td.shortcut - .key g - .key n - %td - Go to network graph - %tr - %td.shortcut - .key g - .key g - %td - Go to graphs - %tr - %td.shortcut - .key g - .key i - %td - Go to issues - %tr - %td.shortcut - .key g - .key m - %td - Go to merge requests - %tr - %td.shortcut - .key g - .key s - %td - Go to snippets - .col-lg-4 - %table.shortcut-mappings - %tbody{ class: 'hidden-shortcut network', style: 'display:none' } - %tr - %th - %th Network Graph - %tr - %td.shortcut - .key - %i.fa.fa-arrow-left - \/ - .key h - %td Scroll left - %tr - %td.shortcut - .key - %i.fa.fa-arrow-right - \/ - .key l - %td Scroll right - %tr - %td.shortcut - .key - %i.fa.fa-arrow-up - \/ - .key k - %td Scroll up - %tr - %td.shortcut - .key - %i.fa.fa-arrow-down - \/ - .key j - %td Scroll down - %tr - %td.shortcut - .key - shift - %i.fa.fa-arrow-up - \/ - .key - shift k - %td Scroll to top - %tr - %td.shortcut - .key - shift - %i.fa.fa-arrow-down - \/ - .key - shift j - %td Scroll to bottom - %tbody{ class: 'hidden-shortcut issues', style: 'display:none' } - %tr - %th - %th Issues - %tr - %td.shortcut - .key a - %td Change assignee - %tr - %td.shortcut - .key m - %td Change milestone - %tbody{ class: 'hidden-shortcut merge_reuests', style: 'display:none' } - %tr - %th - %th Merge Requests - %tr - %td.shortcut - .key a - %td Change assignee - %tr - %td.shortcut - .key m - %td Change milestone - - -:javascript - $('.js-more-help-button').click(function(e){ - $(this).remove() - $('.hidden-shortcut').show() - e.preventDefault() - }); diff --git a/app/views/help/index.html.haml b/app/views/help/index.html.haml deleted file mode 100644 index af39dfeac5b..00000000000 --- a/app/views/help/index.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -%div - %h1 - GitLab - %span= Gitlab::VERSION - %small= Gitlab::REVISION - %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. - %br - Perform code reviews and enhance collaboration with merge requests. - %br - Each project can also have an issue tracker and a wiki. - %br - 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'}. - -%hr - -.row - .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 - - .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 diff --git a/app/views/help/shortcuts.js.haml b/app/views/help/shortcuts.js.haml deleted file mode 100644 index 99ed042ea3b..00000000000 --- a/app/views/help/shortcuts.js.haml +++ /dev/null @@ -1,3 +0,0 @@ -:plain - $("body").append("#{escape_javascript(render('shortcuts'))}"); - $("#modal-shortcuts").modal(); diff --git a/app/views/help/ui.html.haml b/app/views/help/ui.html.haml deleted file mode 100644 index 246a6c1bdfd..00000000000 --- a/app/views/help/ui.html.haml +++ /dev/null @@ -1,227 +0,0 @@ -- lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed fermentum nisi sapien, non consequat lectus aliquam ultrices. Suspendisse sodales est euismod nunc condimentum, a consectetur diam ornare." - -.gitlab-ui-dev-kit - %h1 GitLab UI development kit - %p.light - Use page inspector in your browser to check element classes and structure - of examples below. - %hr - %ul - %li - = link_to 'Blocks', '#blocks' - %li - = link_to 'Lists', '#lists' - %li - = link_to 'Tables', '#tables' - %li - = link_to 'Buttons', '#buttons' - %li - = link_to 'Panels', '#panels' - %li - = link_to 'Alerts', '#alerts' - %li - = link_to 'Forms', '#forms' - %li - = link_to 'Files', '#file' - %li - = link_to 'Markdown', '#markdown' - - %h2#blocks Blocks - - %h3 - %code .well - - - .well - %h4 Something - = lorem - - - %h2#lists Lists - - %h3 - %code .well-list - %ul.well-list - %li - One item - %li - One item - %li - One item - - %h3 - %code .panel .well-list - - .panel.panel-default - .panel-heading Your list - %ul.well-list - %li - One item - %li - One item - %li - One item - - %h3 - %code .bordered-list - %ul.bordered-list - %li - One item - %li - One item - %li - One item - - - - %h2#tables Tables - - .example - %table.table - %thead - %tr - %th # - %th First Name - %th Last Name - %th Username - %tbody - %tr - %td 1 - %td Mark - %td Otto - %td @mdo - %tr - %td 2 - %td Jacob - %td Thornton - %td @fat - %tr - %td 3 - %td Larry - %td the Bird - %td @twitter - - - %h2#buttons Buttons - - .example - %button.btn.btn-default{:type => "button"} Default - %button.btn.btn-primary{:type => "button"} Primary - %button.btn.btn-success{:type => "button"} Success - %button.btn.btn-info{:type => "button"} Info - %button.btn.btn-warning{:type => "button"} Warning - %button.btn.btn-danger{:type => "button"} Danger - %button.btn.btn-link{:type => "button"} Link - - %h2#panels Panels - - .row - .col-md-6 - .panel.panel-success - .panel-heading Success - .panel-body - = lorem - .panel.panel-primary - .panel-heading Primary - .panel-body - = lorem - .panel.panel-info - .panel-heading Info - .panel-body - = lorem - .col-md-6 - .panel.panel-warning - .panel-heading Warning - .panel-body - = lorem - .panel.panel-danger - .panel-heading Danger - .panel-body - = lorem - - %h2#alert Alerts - - .row - .col-md-6 - .alert.alert-success - = lorem - .alert.alert-primary - = lorem - .alert.alert-info - = lorem - .col-md-6 - .alert.alert-warning - = lorem - .alert.alert-danger - = lorem - - %h2#forms Forms - - %h3 - %code form.horizontal-form - - %form.form-horizontal - .form-group - %label.col-sm-2.control-label{:for => "inputEmail3"} Email - .col-sm-10 - %input#inputEmail3.form-control{:placeholder => "Email", :type => "email"}/ - .form-group - %label.col-sm-2.control-label{:for => "inputPassword3"} Password - .col-sm-10 - %input#inputPassword3.form-control{:placeholder => "Password", :type => "password"}/ - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - %label - %input{:type => "checkbox"}/ - Remember me - .form-group - .col-sm-offset-2.col-sm-10 - %button.btn.btn-default{:type => "submit"} Sign in - - %h3 - %code form - - %form - .form-group - %label{:for => "exampleInputEmail1"} Email address - %input#exampleInputEmail1.form-control{:placeholder => "Enter email", :type => "email"}/ - .form-group - %label{:for => "exampleInputPassword1"} Password - %input#exampleInputPassword1.form-control{:placeholder => "Password", :type => "password"}/ - .checkbox - %label - %input{:type => "checkbox"}/ - Remember me - %button.btn.btn-default{:type => "submit"} Sign in - - %h2#file File - %h3 - %code .file-holder - - - blob = Snippet.new(content: "Wow\nSuch\nFile") - .example - .file-holder - .file-title - Awesome file - .file-actions - .btn-group - %a.btn Edit - %a.btn Remove - .file-contenta.code - = render 'shared/file_highlight', blob: blob - - - %h2#markdown Markdown - %h3 - %code .md or .wiki and others - - Markdown rendering has a bit different css and presented in next UI elements: - - %ul - %li comment - %li issue, merge request description - %li wiki page - %li help page - - You can check how markdown rendered at #{link_to 'Markdown help page', help_page_path("markdown", "markdown")}. diff --git a/app/views/import/base/create.js.haml b/app/views/import/base/create.js.haml deleted file mode 100644 index 90a6f5f9d2d..00000000000 --- a/app/views/import/base/create.js.haml +++ /dev/null @@ -1,25 +0,0 @@ -- if @already_been_taken - :plain - target_field = $("tr#repo_#{@repo_id} .import-target") - origin_target = target_field.text() - project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace}" - target_field.empty() - target_field.append("

    This namespace already been taken! Please choose another one

    ") - target_field.append("") - target_field.append("/" + project_name) - target_field.data("project_name", project_name) - target_field.find('input').prop("value", origin_namespace) -- elsif @access_denied - :plain - job = $("tr#repo_#{@repo_id}") - job.find(".import-actions").html("

    Access denied! Please verify you can add deploy keys to this repository.

    ") -- else - :plain - job = $("tr#repo_#{@repo_id}") - job.attr("id", "project_#{@project.id}") - target_field = job.find(".import-target") - target_field.empty() - target_field.append('#{link_to @project.path_with_namespace, [@project.namespace.becomes(Namespace), @project]}') - $("table.import-jobs tbody").prepend(job) - job.addClass("active").find(".import-actions").html(" started") diff --git a/app/views/import/bitbucket/status.html.haml b/app/views/import/bitbucket/status.html.haml deleted file mode 100644 index 4e49bbbc7fa..00000000000 --- a/app/views/import/bitbucket/status.html.haml +++ /dev/null @@ -1,45 +0,0 @@ -%h3.page-title - %i.fa.fa-bitbucket - Import projects from Bitbucket - -%p.light - Select projects you want to import. -%hr -%p - = button_tag 'Import all projects', class: "btn btn-success js-import-all" - -%table.table.import-jobs - %thead - %tr - %th From Bitbucket - %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 - = link_to project.import_source, "https://bitbucket.org/#{project.import_source}", target: "_blank" - %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["owner"]}___#{repo["slug"]}"} - %td - = link_to "#{repo["owner"]}/#{repo["slug"]}", "https://bitbucket.org/#{repo["owner"]}/#{repo["slug"]}", target: "_blank" - %td.import-target - = "#{repo["owner"]}/#{repo["slug"]}" - %td.import-actions.job-status - = button_tag "Import", class: "btn js-add-to-import" - -:coffeescript - new ImporterStatus("#{jobs_import_bitbucket_path}", "#{import_bitbucket_path}") diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml deleted file mode 100644 index f0bc3e6b1ac..00000000000 --- a/app/views/import/github/status.html.haml +++ /dev/null @@ -1,45 +0,0 @@ -%h3.page-title - %i.fa.fa-github - Import projects from GitHub - -%p.light - Select projects you want to import. -%hr -%p - = button_tag 'Import all projects', class: "btn btn-success js-import-all" - -%table.table.import-jobs - %thead - %tr - %th From GitHub - %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 - = link_to project.import_source, "https://github.com/#{project.import_source}", target: "_blank" - %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 - = link_to repo.full_name, "https://github.com/#{repo.full_name}", target: "_blank" - %td.import-target - = repo.full_name - %td.import-actions.job-status - = button_tag "Import", class: "btn js-add-to-import" - -:coffeescript - new ImporterStatus("#{jobs_import_github_path}", "#{import_github_path}") diff --git a/app/views/import/gitlab/status.html.haml b/app/views/import/gitlab/status.html.haml deleted file mode 100644 index 33b0a21acf3..00000000000 --- a/app/views/import/gitlab/status.html.haml +++ /dev/null @@ -1,45 +0,0 @@ -%h3.page-title - %i.fa.fa-heart - Import projects from GitLab.com - -%p.light - Select projects you want to import. -%hr -%p - = button_tag 'Import all projects', class: "btn btn-success js-import-all" - -%table.table.import-jobs - %thead - %tr - %th From GitLab.com - %th To this GitLab instance - %th Status - %tbody - - @already_added_projects.each do |project| - %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} - %td - = link_to project.import_source, "https://gitlab.com/#{project.import_source}", target: "_blank" - %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 - = link_to repo["path_with_namespace"], "https://gitlab.com/#{repo["path_with_namespace"]}", target: "_blank" - %td.import-target - = repo["path_with_namespace"] - %td.import-actions.job-status - = button_tag "Import", class: "btn js-add-to-import" - -:coffeescript - new ImporterStatus("#{jobs_import_gitlab_path}", "#{import_gitlab_path}") diff --git a/app/views/import/gitorious/status.html.haml b/app/views/import/gitorious/status.html.haml deleted file mode 100644 index 78c5e957be0..00000000000 --- a/app/views/import/gitorious/status.html.haml +++ /dev/null @@ -1,45 +0,0 @@ -%h3.page-title - %i.icon-gitorious.icon-gitorious-big - Import projects from Gitorious.org - -%p.light - Select projects you want to import. -%hr -%p - = button_tag 'Import all projects', class: "btn btn-success js-import-all" - -%table.table.import-jobs - %thead - %tr - %th From Gitorious.org - %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 - = link_to project.import_source, "https://gitorious.org/#{project.import_source}", target: "_blank" - %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 - = link_to repo.full_name, "https://gitorious.org/#{repo.full_name}", target: "_blank" - %td.import-target - = repo.full_name - %td.import-actions.job-status - = button_tag "Import", class: "btn js-add-to-import" - -:coffeescript - new ImporterStatus("#{jobs_import_gitorious_path}", "#{import_gitorious_path}") diff --git a/app/views/import/google_code/new.html.haml b/app/views/import/google_code/new.html.haml deleted file mode 100644 index ce78fec205f..00000000000 --- a/app/views/import/google_code/new.html.haml +++ /dev/null @@ -1,60 +0,0 @@ -%h3.page-title - %i.fa.fa-google - Import projects from Google Code -%hr - -= form_tag callback_import_google_code_path, class: 'form-horizontal', multipart: true do - %p - Follow the steps below to export your Google Code project data. - In the next step, you'll be able to select the projects you want to import. - %ol - %li - %p - Go to - #{link_to "Google Takeout", "https://www.google.com/settings/takeout", target: "_blank"}. - %li - %p - Make sure you're logged into the account that owns the projects you'd like to import. - %li - %p - Click the Select none button on the right, since we only need "Google Code Project Hosting". - %li - %p - Scroll down to Google Code Project Hosting and enable the switch on the right. - %li - %p - Choose Next at the bottom of the page. - %li - %p - Leave the "File type" and "Delivery method" options on their default values. - %li - %p - Choose Create archive and wait for archiving to complete. - %li - %p - Click the Download button and wait for downloading to complete. - %li - %p - Find the downloaded ZIP file and decompress it. - %li - %p - Find the newly extracted Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json file. - %li - %p - Upload GoogleCodeProjectHosting.json here: - %p - %input{type: "file", name: "dump_file", id: "dump_file"} - %li - %p - Do you want to customize how Google Code email addresses and usernames are imported into GitLab? - %p - = label_tag :create_user_map_0 do - = radio_button_tag :create_user_map, 0, true - No, directly import the existing email addresses and usernames. - %p - = label_tag :create_user_map_1 do - = radio_button_tag :create_user_map, 1, false - Yes, let me map Google Code users to full names or GitLab users. - %li - %p - = submit_tag 'Continue to the next step', class: "btn btn-create" diff --git a/app/views/import/google_code/status.html.haml b/app/views/import/google_code/status.html.haml deleted file mode 100644 index 2013b8c03c6..00000000000 --- a/app/views/import/google_code/status.html.haml +++ /dev/null @@ -1,49 +0,0 @@ -%h3.page-title - %i.fa.fa-google - Import projects from Google Code - -%p.light - Select projects you want to import. -%p.light - Optionally, you can - = link_to "customize", new_user_map_import_google_code_path - how Google Code 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 Google Code - %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 - = link_to project.import_source, "https://code.google.com/p/#{project.import_source}", target: "_blank" - %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 - = link_to repo.name, "https://code.google.com/p/#{repo.name}", target: "_blank" - %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_google_code_path}", "#{import_google_code_path}") diff --git a/app/views/invites/show.html.haml b/app/views/invites/show.html.haml deleted file mode 100644 index ab0ecffe4d2..00000000000 --- a/app/views/invites/show.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -%h3.page-title Invitation - -%p - You have been invited - - if inviter = @member.created_by - by - = link_to inviter.name, user_url(inviter) - to join - - case @member.source - - when Project - - project = @member.source - project - %strong - = link_to project.name_with_namespace, namespace_project_url(project.namespace, project) - - when Group - - group = @member.source - group - %strong - = link_to group.name, group_url(group) - as #{@member.human_access}. - -- if @member.source.users.include?(current_user) - %p - However, you are already a member of this #{@member.source.is_a?(Group) ? "group" : "project"}. - Sign in using a different account to accept the invitation. -- else - .actions - = link_to "Accept invitation", accept_invite_url(@token), method: :post, class: "btn btn-success" - = link_to "Decline", decline_invite_url(@token), method: :post, class: "btn btn-danger prepend-left-10" diff --git a/app/views/kaminari/gitlab/_first_page.html.haml b/app/views/kaminari/gitlab/_first_page.html.haml deleted file mode 100644 index 41c9c0b3af6..00000000000 --- a/app/views/kaminari/gitlab/_first_page.html.haml +++ /dev/null @@ -1,9 +0,0 @@ --# Link to the "First" page --# available local variables --# url: url to the first page --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%span.first - = link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, remote: remote diff --git a/app/views/kaminari/gitlab/_gap.html.haml b/app/views/kaminari/gitlab/_gap.html.haml deleted file mode 100644 index 3ffd12f8587..00000000000 --- a/app/views/kaminari/gitlab/_gap.html.haml +++ /dev/null @@ -1,9 +0,0 @@ --# Non-link tag that stands for skipped pages... --# available local variables --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%li{class: "page"} - %span.page.gap - = raw(t 'views.pagination.truncate') diff --git a/app/views/kaminari/gitlab/_last_page.html.haml b/app/views/kaminari/gitlab/_last_page.html.haml deleted file mode 100644 index b03a206224c..00000000000 --- a/app/views/kaminari/gitlab/_last_page.html.haml +++ /dev/null @@ -1,9 +0,0 @@ --# Link to the "Last" page --# available local variables --# url: url to the last page --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%span.last - = link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {remote: remote} diff --git a/app/views/kaminari/gitlab/_next_page.html.haml b/app/views/kaminari/gitlab/_next_page.html.haml deleted file mode 100644 index 00c5f0b6f4e..00000000000 --- a/app/views/kaminari/gitlab/_next_page.html.haml +++ /dev/null @@ -1,9 +0,0 @@ --# Link to the "Next" page --# available local variables --# url: url to the next page --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%li.next - = link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, rel: 'next', remote: remote diff --git a/app/views/kaminari/gitlab/_page.html.haml b/app/views/kaminari/gitlab/_page.html.haml deleted file mode 100644 index a52d883b9a8..00000000000 --- a/app/views/kaminari/gitlab/_page.html.haml +++ /dev/null @@ -1,10 +0,0 @@ --# Link showing page number --# available local variables --# page: a page object for "this" page --# url: url to this page --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%li{class: "page#{' active' if page.current?}"} - = link_to page, url, {remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil} diff --git a/app/views/kaminari/gitlab/_paginator.html.haml b/app/views/kaminari/gitlab/_paginator.html.haml deleted file mode 100644 index 4f7996e4996..00000000000 --- a/app/views/kaminari/gitlab/_paginator.html.haml +++ /dev/null @@ -1,17 +0,0 @@ --# The container tag --# available local variables --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote --# paginator: the paginator that renders the pagination tags inside -= paginator.render do - %div.gl-pagination - %ul.pagination - = prev_page_tag unless current_page.first? - - each_page do |page| - - if page.left_outer? || page.right_outer? || page.inside_window? - = page_tag page - - elsif !page.was_truncated? - = gap_tag - = next_page_tag unless current_page.last? diff --git a/app/views/kaminari/gitlab/_prev_page.html.haml b/app/views/kaminari/gitlab/_prev_page.html.haml deleted file mode 100644 index f673abdb3ae..00000000000 --- a/app/views/kaminari/gitlab/_prev_page.html.haml +++ /dev/null @@ -1,9 +0,0 @@ --# Link to the "Previous" page --# available local variables --# url: url to the previous page --# current_page: a page object for the currently displayed page --# num_pages: total number of pages --# per_page: number of items to fetch per page --# remote: data-remote -%li{class: "prev" } - = link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, rel: 'prev', remote: remote diff --git a/app/views/layouts/_broadcast.html.haml b/app/views/layouts/_broadcast.html.haml deleted file mode 100644 index e7d477c225e..00000000000 --- a/app/views/layouts/_broadcast.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- if broadcast_message.present? - .broadcast-message{ style: broadcast_styling(broadcast_message) } - %i.fa.fa-bullhorn - = broadcast_message.message diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml deleted file mode 100644 index 2ed51d87ca1..00000000000 --- a/app/views/layouts/_collapse_button.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- if nav_menu_collapsed? - = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse', title: "Open/Close" -- else - = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse', title: "Open/Close" diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml deleted file mode 100644 index cc8ea066cb9..00000000000 --- a/app/views/layouts/_flash.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -.flash-container - - if alert - .flash-alert - = alert - - - elsif notice - .flash-notice - = notice diff --git a/app/views/layouts/_google_analytics.html.haml b/app/views/layouts/_google_analytics.html.haml deleted file mode 100644 index 81e03c7eff2..00000000000 --- a/app/views/layouts/_google_analytics.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -:javascript - var _gaq = _gaq || []; - _gaq.push(['_setAccount', '#{extra_config.google_analytics_id}']); - _gaq.push(['_trackPageview']); - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml deleted file mode 100644 index d12145651af..00000000000 --- a/app/views/layouts/_head.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -%head - %meta{charset: "utf-8"} - %meta{content: "GitLab Community Edition", name: "description"} - - %title - = "#{title} | " if defined?(title) - GitLab - = favicon_link_tag 'favicon.ico' - = stylesheet_link_tag "application", :media => "all" - = stylesheet_link_tag "print", :media => "print" - = javascript_include_tag "application" - = csrf_meta_tags - = include_gon - %meta{name: 'viewport', content: 'width=device-width, initial-scale=1, maximum-scale=1'} - %meta{name: 'theme-color', content: '#474D57'} - - = render 'layouts/google_analytics' if extra_config.has_key?('google_analytics_id') - = render 'layouts/piwik' if extra_config.has_key?('piwik_url') && extra_config.has_key?('piwik_site_id') - - -# Atom feed - - if current_user - - if controller_name == 'projects' && action_name == 'index' - = auto_discovery_link_tag :atom, projects_url(:atom, private_token: current_user.private_token), title: "Dashboard feed" - - if @project && !@project.new_record? - - if current_controller?(:tree, :commits) - = auto_discovery_link_tag(:atom, namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom, private_token: current_user.private_token), title: "Recent commits to #{@project.name}:#{@ref}") - - if current_controller?(:issues) - = auto_discovery_link_tag(:atom, namespace_project_issues_url(@project.namespace, @project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") diff --git a/app/views/layouts/_head_panel.html.haml b/app/views/layouts/_head_panel.html.haml deleted file mode 100644 index d58582c107a..00000000000 --- a/app/views/layouts/_head_panel.html.haml +++ /dev/null @@ -1,48 +0,0 @@ -%header.navbar.navbar-fixed-top.navbar-gitlab - .navbar-inner - .container - %div.app_logo - = link_to root_path, class: "home has_bottom_tooltip", title: "Dashboard" do - = brand_header_logo - %h1.title= title - - %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} - %span.sr-only Toggle navigation - %i.fa.fa-bars - - .navbar-collapse.collapse - %ul.nav.navbar-nav - %li.hidden-sm.hidden-xs - = render "layouts/search" - %li.visible-sm.visible-xs - = link_to search_path, title: "Search", class: 'has_bottom_tooltip', 'data-original-title' => 'Search area' do - %i.fa.fa-search - %li - = link_to help_path, title: 'Help', class: 'has_bottom_tooltip', - 'data-original-title' => 'Help' do - %i.fa.fa-question-circle - %li - = link_to explore_root_path, title: "Explore", class: 'has_bottom_tooltip', 'data-original-title' => 'Public area' do - %i.fa.fa-globe - %li - = link_to user_snippets_path(current_user), title: "Your snippets", class: 'has_bottom_tooltip', 'data-original-title' => 'Your snippets' do - %i.fa.fa-clipboard - - if current_user.is_admin? - %li - = link_to admin_root_path, title: "Admin area", class: 'has_bottom_tooltip', 'data-original-title' => 'Admin area' do - %i.fa.fa-cogs - - if current_user.can_create_project? - %li - = link_to new_project_path, title: "New project", class: 'has_bottom_tooltip', 'data-original-title' => 'New project' do - %i.fa.fa-plus - %li - = link_to profile_path, title: "Profile settings", class: 'has_bottom_tooltip', 'data-original-title' => 'Profile settings"' do - %i.fa.fa-user - %li - = link_to destroy_user_session_path, class: "logout", method: :delete, title: "Sign out", class: 'has_bottom_tooltip', 'data-original-title' => 'Sign out' do - %i.fa.fa-sign-out - %li.hidden-xs - = link_to current_user, class: "profile-pic has_bottom_tooltip", id: 'profile-pic', 'data-original-title' => 'Your profile' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity' - -= render 'shared/outdated_browser' diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml deleted file mode 100644 index 3c58f10e759..00000000000 --- a/app/views/layouts/_init_auto_complete.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -:javascript - GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_namespace_project_path(@project.namespace, @project, type: @noteable.class, type_id: params[:id])}" - GitLab.GfmAutoComplete.setup(); diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml deleted file mode 100644 index 422966cdc55..00000000000 --- a/app/views/layouts/_page.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -- if defined?(sidebar) - .page-with-sidebar{ class: nav_sidebar_class } - = render "layouts/broadcast" - .sidebar-wrapper - = render(sidebar) - .collapse-nav - = render partial: 'layouts/collapse_button' - .content-wrapper - .container-fluid - .content - = render "layouts/flash" - .clearfix - = yield -- else - .container.navless-container - .content - = yield - -= yield :embedded_scripts - -:coffeescript - $('.page-sidebar-collapsed .nav-sidebar a').tooltip placement: "right" - diff --git a/app/views/layouts/_page_title.html.haml b/app/views/layouts/_page_title.html.haml deleted file mode 100644 index 54da5074763..00000000000 --- a/app/views/layouts/_page_title.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -- if content_for?(:page-title) - = yield :page-title diff --git a/app/views/layouts/_piwik.html.haml b/app/views/layouts/_piwik.html.haml deleted file mode 100644 index 135e8daca26..00000000000 --- a/app/views/layouts/_piwik.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -:javascript - var _paq = _paq || []; - _paq.push(["trackPageView"]); - _paq.push(["enableLinkTracking"]); - - (function() { - var u=(("https:" == document.location.protocol) ? "https" : "http") + "://#{extra_config.piwik_url}/"; - _paq.push(["setTrackerUrl", u+"piwik.php"]); - _paq.push(["setSiteId", "#{extra_config.piwik_site_id}"]); - var d=document, g=d.createElement("script"), s=d.getElementsByTagName("script")[0]; g.type="text/javascript"; - g.defer=true; g.async=true; g.src=u+"piwik.js"; s.parentNode.insertBefore(g,s); - })(); diff --git a/app/views/layouts/_public_head_panel.html.haml b/app/views/layouts/_public_head_panel.html.haml deleted file mode 100644 index 3d6d2bfc00a..00000000000 --- a/app/views/layouts/_public_head_panel.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%header.navbar.navbar-fixed-top.navbar-gitlab - .navbar-inner - .container - %div.app_logo - = link_to explore_root_path, class: "home" do - = brand_header_logo - %h1.title= title - - %button.navbar-toggle{"data-target" => ".navbar-collapse", "data-toggle" => "collapse", type: "button"} - %span.sr-only Toggle navigation - %i.fa.fa-bars - - - unless current_controller?('sessions') - .pull-right.hidden-xs - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-new append-right-10' - - .navbar-collapse.collapse - %ul.nav.navbar-nav - %li.visible-xs - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes') - -= render 'shared/outdated_browser' diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml deleted file mode 100644 index 04f79846858..00000000000 --- a/app/views/layouts/_search.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -.search - = form_tag search_path, method: :get, class: 'navbar-form pull-left' do |f| - = search_field_tag "search", nil, placeholder: search_placeholder, class: "search-input" - = hidden_field_tag :group_id, @group.try(:id) - - if @project && @project.persisted? - = hidden_field_tag :project_id, @project.id - - - if current_controller?(:issues) - = hidden_field_tag :scope, 'issues' - - elsif current_controller?(:merge_requests) - = hidden_field_tag :scope, 'merge_requests' - - elsif current_controller?(:wikis) - = hidden_field_tag :scope, 'wiki_blobs' - - else - = hidden_field_tag :search_code, true - - - if @snippet || @snippets - = hidden_field_tag :snippets, true - = hidden_field_tag :repository_ref, @ref - = button_tag 'Go' if ENV['RAILS_ENV'] == 'test' - .search-autocomplete-opts.hide{:'data-autocomplete-path' => search_autocomplete_path, :'data-autocomplete-project-id' => @project.try(:id), :'data-autocomplete-project-ref' => @ref } - -:javascript - $('.search-input').on('keyup', function(e) { - if (e.keyCode == 27) { - $('.search-input').blur() - } - }) diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml deleted file mode 100644 index ab84e87c300..00000000000 --- a/app/views/layouts/admin.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: "Admin area" - %body{class: "#{app_theme} admin", :'data-page' => body_data_page} - = render "layouts/head_panel", title: link_to("Admin area", admin_root_path) - = render 'layouts/page', sidebar: 'layouts/nav/admin' diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml deleted file mode 100644 index 6bd8ac4adb8..00000000000 --- a/app/views/layouts/application.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: "Dashboard" - %body{class: "#{app_theme} application", :'data-page' => body_data_page } - = render "layouts/head_panel", title: link_to("Dashboard", root_path) - = render 'layouts/page', sidebar: 'layouts/nav/dashboard' diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml deleted file mode 100644 index 6f805f1c9d1..00000000000 --- a/app/views/layouts/devise.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head" - %body.ui_mars.login-page.application - = render "layouts/broadcast" - = render "layouts/public_head_panel", title: '' - .container.navless-container - .content - = render "layouts/flash" - .row.prepend-top-20 - .col-sm-5.pull-right - = yield - .col-sm-7.brand-holder.pull-left - %h1 - = brand_title - - if brand_item - = brand_image - = brand_text - - else - %h3 Open source software to collaborate on code - - %p - Manage git repositories with fine grained access controls that keep your code secure. - Perform code reviews and enhance collaboration with merge requests. - Each project can also have an issue tracker and a wiki. - - - if extra_sign_in_text.present? - = markdown(extra_sign_in_text) - - %hr - .container - .footer-links - = link_to "Explore", explore_root_path - = link_to "Documentation", "http://doc.gitlab.com/" - = link_to "About GitLab", "https://about.gitlab.com/" diff --git a/app/views/layouts/errors.html.haml b/app/views/layouts/errors.html.haml deleted file mode 100644 index e51fd4cb820..00000000000 --- a/app/views/layouts/errors.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: "Error" - %body{class: "#{app_theme} application"} - = render "layouts/head_panel", title: "" if current_user - .container.navless-container - = render "layouts/flash" - .error-page - = yield diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml deleted file mode 100644 index 2bd0b8d85c9..00000000000 --- a/app/views/layouts/explore.html.haml +++ /dev/null @@ -1,30 +0,0 @@ -- page_title = 'Explore' -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: page_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/broadcast" - - if current_user - = render "layouts/head_panel", title: link_to(page_title, explore_root_path) - - else - = render "layouts/public_head_panel", title: link_to(page_title, explore_root_path) - .container.navless-container - .content - .explore-title - %h3 - Explore GitLab - %p.lead - Discover projects and groups. Share your projects with others - - - %ul.nav.nav-tabs - = nav_link(path: 'projects#trending') do - = link_to 'Trending Projects', explore_root_path - = nav_link(path: 'projects#starred') do - = link_to 'Most Starred Projects', starred_explore_projects_path - = nav_link(path: 'projects#index') do - = link_to 'All Projects', explore_projects_path - = nav_link(controller: :groups) do - = link_to 'All Groups', explore_groups_path - - = yield diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml deleted file mode 100644 index f4a6bee15f6..00000000000 --- a/app/views/layouts/group.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/head_panel", title: link_to(@group.name, group_path(@group)) - = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml deleted file mode 100644 index 34efceb37d1..00000000000 --- a/app/views/layouts/nav/_admin.html.haml +++ /dev/null @@ -1,65 +0,0 @@ -%ul.nav.nav-sidebar - = nav_link(controller: :dashboard, html_options: {class: 'home'}) do - = link_to admin_root_path, title: "Stats" do - %i.fa.fa-dashboard - %span - Overview - = nav_link(controller: :projects) do - = link_to admin_namespaces_projects_path, title: 'Projects' do - %i.fa.fa-cube - %span - Projects - = nav_link(controller: :users) do - = link_to admin_users_path, title: 'Users' do - %i.fa.fa-user - %span - Users - = nav_link(controller: :groups) do - = link_to admin_groups_path, title: 'Groups' do - %i.fa.fa-group - %span - Groups - = nav_link(controller: :deploy_keys) do - = link_to admin_deploy_keys_path, title: 'Deploy Keys' do - %i.fa.fa-key - %span - Deploy Keys - = nav_link(controller: :logs) do - = link_to admin_logs_path, title: 'Logs' do - %i.fa.fa-file-text - %span - Logs - = nav_link(controller: :broadcast_messages) do - = link_to admin_broadcast_messages_path, title: 'Broadcast Messages' do - %i.fa.fa-bullhorn - %span - Messages - = nav_link(controller: :hooks) do - = link_to admin_hooks_path, title: 'Hooks' do - %i.fa.fa-external-link - %span - Hooks - = nav_link(controller: :background_jobs) do - = link_to admin_background_jobs_path, title: 'Background Jobs' do - %i.fa.fa-cog - %span - Background Jobs - - = nav_link(controller: :applications) do - = link_to admin_applications_path, title: 'Applications' do - %i.fa.fa-cloud - %span - Applications - - = nav_link(controller: :services) do - = link_to admin_application_settings_services_path, title: 'Service Templates' do - %i.fa.fa-copy - %span - Service Templates - - = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do - = link_to admin_application_settings_path, title: 'Settings' do - %i.fa.fa-cogs - %span - Settings - diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml deleted file mode 100644 index e4f630c6a18..00000000000 --- a/app/views/layouts/nav/_dashboard.html.haml +++ /dev/null @@ -1,38 +0,0 @@ -%ul.nav.nav-sidebar - = nav_link(path: 'dashboard#show', html_options: {class: 'home'}) do - = link_to root_path, title: 'Home', class: 'shortcuts-activity' do - %i.fa.fa-dashboard - %span - Your Projects - = nav_link(path: 'projects#starred') do - = link_to starred_dashboard_projects_path, title: 'Starred Projects' do - %i.fa.fa-star - %span - Starred Projects - = nav_link(controller: :groups) do - = link_to dashboard_groups_path, title: 'Groups' do - %i.fa.fa-group - %span - Groups - = nav_link(controller: :milestones) do - = link_to dashboard_milestones_path, title: 'Milestones' do - %i.fa.fa-clock-o - %span - Milestones - = nav_link(path: 'dashboard#issues') do - = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues' do - %i.fa.fa-exclamation-circle - %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' do - %i.fa.fa-tasks - %span - Merge Requests - %span.count= current_user.assigned_merge_requests.opened.count - = nav_link(controller: :help) do - = link_to help_path, title: 'Help' do - %i.fa.fa-question-circle - %span - Help diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml deleted file mode 100644 index f0d92b7a12c..00000000000 --- a/app/views/layouts/nav/_group.html.haml +++ /dev/null @@ -1,42 +0,0 @@ -%ul.nav.nav-sidebar - = nav_link(path: 'groups#show', html_options: {class: 'home'}) do - = link_to group_path(@group), title: "Home" do - %i.fa.fa-dashboard - %span - Activity - - if current_user - = nav_link(controller: [:group, :milestones]) do - = link_to group_milestones_path(@group), title: 'Milestones' do - %i.fa.fa-clock-o - %span - Milestones - = nav_link(path: 'groups#issues') do - = link_to issues_group_path(@group), title: 'Issues' do - %i.fa.fa-exclamation-circle - %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' do - %i.fa.fa-tasks - %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' do - %i.fa.fa-users - %span - Members - - - if can?(current_user, :admin_group, @group) - = nav_link(html_options: { class: "#{"active" if group_settings_page?} separate-item" }) do - = link_to edit_group_path(@group), title: 'Settings', class: "tab no-highlight" do - %i.fa.fa-cogs - %span - Settings - %i.fa.fa-angle-down - - - if group_settings_page? - = render 'groups/settings_nav' diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml deleted file mode 100644 index d88e862829d..00000000000 --- a/app/views/layouts/nav/_profile.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -%ul.nav.nav-sidebar - = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do - = link_to profile_path, title: "Profile" do - %i.fa.fa-user - %span - Profile - = nav_link(controller: :accounts) do - = link_to profile_account_path, title: 'Account' do - %i.fa.fa-gear - %span - Account - = nav_link(path: ['profiles#applications', 'applications#edit', 'applications#show', 'applications#new']) do - = link_to applications_profile_path, title: 'Applications' do - %i.fa.fa-cloud - %span - Applications - = nav_link(controller: :emails) do - = link_to profile_emails_path, title: 'Emails' do - %i.fa.fa-envelope-o - %span - Emails - %span.count= current_user.emails.count + 1 - - unless current_user.ldap_user? - = nav_link(controller: :passwords) do - = link_to edit_profile_password_path, title: 'Password' do - %i.fa.fa-lock - %span - Password - = nav_link(controller: :notifications) do - = link_to profile_notifications_path, title: 'Notifications' do - %i.fa.fa-inbox - %span - Notifications - - = nav_link(controller: :keys) do - = link_to profile_keys_path, title: 'SSH Keys' do - %i.fa.fa-key - %span - SSH Keys - %span.count= current_user.keys.count - = nav_link(path: 'profiles#design') do - = link_to design_profile_path, title: 'Design' do - %i.fa.fa-image - %span - Design - = nav_link(path: 'profiles#history') do - = link_to history_profile_path, title: 'History' do - %i.fa.fa-history - %span - History diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml deleted file mode 100644 index 6c13f30f627..00000000000 --- a/app/views/layouts/nav/_project.html.haml +++ /dev/null @@ -1,97 +0,0 @@ -%ul.project-navigation.nav.nav-sidebar - - if @project_settings_nav - = nav_link do - = link_to project_path(@project), title: 'Back to project', class: "" do - %i.fa.fa-caret-square-o-left - %span - Back to project - - %li.separate-item - - = render 'projects/settings_nav' - - - else - = nav_link(path: 'projects#show', html_options: {class: "home"}) do - = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do - %i.fa.fa-dashboard - %span - Project - - 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' do - %i.fa.fa-files-o - %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' do - %i.fa.fa-history - %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' do - %i.fa.fa-code-fork - %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' do - %i.fa.fa-area-chart - %span - Graphs - - - if project_nav_tab? :milestones - = nav_link(controller: :milestones) do - = link_to namespace_project_milestones_path(@project.namespace, @project), title: 'Milestones' do - %i.fa.fa-clock-o - %span - Milestones - - - if project_nav_tab? :issues - = nav_link(controller: :issues) do - = link_to url_for_project_issues(@project, only_path: true), title: 'Issues', class: 'shortcuts-issues' do - %i.fa.fa-exclamation-circle - %span - Issues - - if @project.default_issues_tracker? - %span.count.issue_counter= @project.issues.opened.count - - - if project_nav_tab? :merge_requests - = nav_link(controller: :merge_requests) do - = link_to namespace_project_merge_requests_path(@project.namespace, @project), title: 'Merge Requests', class: 'shortcuts-merge_requests' do - %i.fa.fa-tasks - %span - Merge Requests - %span.count.merge_counter= @project.merge_requests.opened.count - - - if project_nav_tab? :labels - = nav_link(controller: :labels) do - = link_to namespace_project_labels_path(@project.namespace, @project), title: 'Labels' do - %i.fa.fa-tags - %span - Labels - - - if project_nav_tab? :wiki - = nav_link(controller: :wikis) do - = link_to get_project_wiki_path(@project), title: 'Wiki', class: 'shortcuts-wiki' do - %i.fa.fa-book - %span - Wiki - - - if project_nav_tab? :snippets - = nav_link(controller: :snippets) do - = link_to namespace_project_snippets_path(@project.namespace, @project), title: 'Snippets', class: 'shortcuts-snippets' do - %i.fa.fa-file-text-o - %span - Snippets - - - if project_nav_tab? :settings - = nav_link(html_options: {class: "#{project_tab_class} separate-item"}) do - = link_to edit_project_path(@project), title: 'Settings', class: "stat-tab tab no-highlight" do - %i.fa.fa-cogs - %span - Settings diff --git a/app/views/layouts/navless.html.haml b/app/views/layouts/navless.html.haml deleted file mode 100644 index 4d0278251a6..00000000000 --- a/app/views/layouts/navless.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/broadcast" - = render "layouts/head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title - .container.navless-container - .content - = render "layouts/flash" - = yield diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml deleted file mode 100644 index 00c7cedce40..00000000000 --- a/app/views/layouts/notify.html.haml +++ /dev/null @@ -1,42 +0,0 @@ -%html{lang: "en"} - %head - %meta{content: "text/html; charset=utf-8", "http-equiv" => "Content-Type"} - %title - GitLab - :css - img { - max-width: 100%; - height: auto; - } - p.details { - font-style:italic; - color:#777 - } - .footer p { - font-size:small; - color:#777 - } - pre.commit-message { - white-space: pre-wrap; - } - .file-stats a { - text-decoration: none; - } - .file-stats .new-file { - color: #090; - } - .file-stats .deleted-file { - color: #B00; - }} - %body - %div.content - = yield - %div.footer{style: "margin-top: 10px;"} - %p - \— - %br - - if @target_url - #{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 deleted file mode 100644 index 2b5be7fc372..00000000000 --- a/app/views/layouts/profile.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: "Profile" - %body{class: "#{app_theme} profile", :'data-page' => body_data_page} - = render "layouts/head_panel", title: link_to("Profile", profile_path) - = render 'layouts/page', sidebar: 'layouts/nav/profile' diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml deleted file mode 100644 index 0a0039dec16..00000000000 --- a/app/views/layouts/project_settings.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } - = render "layouts/head_panel", title: project_title(@project) - = render "layouts/init_auto_complete" - - @project_settings_nav = true - = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/projects.html.haml b/app/views/layouts/projects.html.haml deleted file mode 100644 index dde0964f47f..00000000000 --- a/app/views/layouts/projects.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: project_head_title - %body{class: "#{app_theme} project", :'data-page' => body_data_page, :'data-project-id' => @project.id } - = render "layouts/head_panel", title: project_title(@project) - = render "layouts/init_auto_complete" - = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_group.html.haml b/app/views/layouts/public_group.html.haml deleted file mode 100644 index b9b1d03e08e..00000000000 --- a/app/views/layouts/public_group.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: group_head_title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/public_head_panel", title: link_to(@group.name, group_path(@group)) - = render 'layouts/page', sidebar: 'layouts/nav/group' diff --git a/app/views/layouts/public_projects.html.haml b/app/views/layouts/public_projects.html.haml deleted file mode 100644 index 04fa7c84e73..00000000000 --- a/app/views/layouts/public_projects.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: @project.name_with_namespace - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/public_head_panel", title: project_title(@project) - = render 'layouts/page', sidebar: 'layouts/nav/project' diff --git a/app/views/layouts/public_users.html.haml b/app/views/layouts/public_users.html.haml deleted file mode 100644 index 71c16bd1684..00000000000 --- a/app/views/layouts/public_users.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: @title - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/public_head_panel", title: defined?(@title_url) ? link_to(@title, @title_url) : @title - = render 'layouts/page' diff --git a/app/views/layouts/search.html.haml b/app/views/layouts/search.html.haml deleted file mode 100644 index f9d8db06e10..00000000000 --- a/app/views/layouts/search.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -!!! 5 -%html{ lang: "en"} - = render "layouts/head", title: "Search" - %body{class: "#{app_theme} application", :'data-page' => body_data_page} - = render "layouts/broadcast" - = render "layouts/head_panel", title: link_to("Search", search_path) - .container.navless-container - .content - = render "layouts/flash" - = yield diff --git a/app/views/notify/_note_message.html.haml b/app/views/notify/_note_message.html.haml deleted file mode 100644 index 3fd4b04ac84..00000000000 --- a/app/views/notify/_note_message.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%div - = markdown(@note.note, reference_only_path: false) diff --git a/app/views/notify/_reassigned_issuable_email.html.haml b/app/views/notify/_reassigned_issuable_email.html.haml deleted file mode 100644 index 56d81b2ed2e..00000000000 --- a/app/views/notify/_reassigned_issuable_email.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%p - Assignee changed - - if @previous_assignee - from - %strong #{@previous_assignee.name} - to - - if issuable.assignee_id - %strong #{issuable.assignee_name} - - else - %strong Unassigned diff --git a/app/views/notify/_reassigned_issuable_email.text.erb b/app/views/notify/_reassigned_issuable_email.text.erb deleted file mode 100644 index 855d37429d9..00000000000 --- a/app/views/notify/_reassigned_issuable_email.text.erb +++ /dev/null @@ -1,6 +0,0 @@ -Reassigned <%= issuable.class.model_name.human.titleize %> <%= issuable.iid %> - -<%= url_for([issuable.project.namespace.becomes(Namespace), issuable.project, issuable, {only_path: false}]) %> - -Assignee changed <%= "from #{@previous_assignee.name}" if @previous_assignee -%> - to <%= "#{issuable.assignee_id ? issuable.assignee_name : 'Unassigned'}" %> diff --git a/app/views/notify/closed_issue_email.html.haml b/app/views/notify/closed_issue_email.html.haml deleted file mode 100644 index 56c18cd83cd..00000000000 --- a/app/views/notify/closed_issue_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p - = "Issue was closed by #{@updated_by.name}" diff --git a/app/views/notify/closed_issue_email.text.haml b/app/views/notify/closed_issue_email.text.haml deleted file mode 100644 index ac703b31edd..00000000000 --- a/app/views/notify/closed_issue_email.text.haml +++ /dev/null @@ -1,3 +0,0 @@ -= "Issue was closed by #{@updated_by.name}" - -Issue ##{@issue.iid}: #{namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)} diff --git a/app/views/notify/closed_merge_request_email.html.haml b/app/views/notify/closed_merge_request_email.html.haml deleted file mode 100644 index 574e8bfef24..00000000000 --- a/app/views/notify/closed_merge_request_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p - = "Merge Request ##{@merge_request.iid} was closed by #{@updated_by.name}" diff --git a/app/views/notify/closed_merge_request_email.text.haml b/app/views/notify/closed_merge_request_email.text.haml deleted file mode 100644 index 59db86b08bc..00000000000 --- a/app/views/notify/closed_merge_request_email.text.haml +++ /dev/null @@ -1,8 +0,0 @@ -= "Merge Request ##{@merge_request.iid} was closed by #{@updated_by.name}" - -Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} - -= merge_path_description(@merge_request, 'to') - -Author: #{@merge_request.author_name} -Assignee: #{@merge_request.assignee_name} diff --git a/app/views/notify/group_access_granted_email.html.haml b/app/views/notify/group_access_granted_email.html.haml deleted file mode 100644 index f1916d624b6..00000000000 --- a/app/views/notify/group_access_granted_email.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%p - = "You have been granted #{@group_member.human_access} access to group" - = link_to group_url(@group) do - = @group.name diff --git a/app/views/notify/group_access_granted_email.text.erb b/app/views/notify/group_access_granted_email.text.erb deleted file mode 100644 index ef9617bfc16..00000000000 --- a/app/views/notify/group_access_granted_email.text.erb +++ /dev/null @@ -1,4 +0,0 @@ - -You have been granted <%= @group_member.human_access %> access to group <%= @group.name %> - -<%= url_for(group_url(@group)) %> diff --git a/app/views/notify/group_invite_accepted_email.html.haml b/app/views/notify/group_invite_accepted_email.html.haml deleted file mode 100644 index 55efad384a7..00000000000 --- a/app/views/notify/group_invite_accepted_email.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%p - #{@group_member.invite_email}, now known as - #{link_to @group_member.user.name, user_url(@group_member.user)}, - has accepted your invitation to join group - #{link_to @group.name, group_url(@group)}. - diff --git a/app/views/notify/group_invite_accepted_email.text.erb b/app/views/notify/group_invite_accepted_email.text.erb deleted file mode 100644 index f8b70f7a5a6..00000000000 --- a/app/views/notify/group_invite_accepted_email.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= @group_member.invite_email %>, now known as <%= @group_member.user.name %>, has accepted your invitation to join group <%= @group.name %>. - -<%= group_url(@group) %> diff --git a/app/views/notify/group_invite_declined_email.html.haml b/app/views/notify/group_invite_declined_email.html.haml deleted file mode 100644 index f9525d84fac..00000000000 --- a/app/views/notify/group_invite_declined_email.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%p - #{@invite_email} - has declined your invitation to join group - #{link_to @group.name, group_url(@group)}. - diff --git a/app/views/notify/group_invite_declined_email.text.erb b/app/views/notify/group_invite_declined_email.text.erb deleted file mode 100644 index 6c19a288d15..00000000000 --- a/app/views/notify/group_invite_declined_email.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= @invite_email %> has declined your invitation to join group <%= @group.name %>. - -<%= group_url(@group) %> diff --git a/app/views/notify/group_member_invited_email.html.haml b/app/views/notify/group_member_invited_email.html.haml deleted file mode 100644 index 163e88bfea3..00000000000 --- a/app/views/notify/group_member_invited_email.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%p - You have been invited - - if inviter = @group_member.created_by - by - = link_to inviter.name, user_url(inviter) - to join group - = link_to @group.name, group_url(@group) - as #{@group_member.human_access}. - -%p - = link_to 'Accept invitation', invite_url(@token) - or - = link_to 'decline', decline_invite_url(@token) - diff --git a/app/views/notify/group_member_invited_email.text.erb b/app/views/notify/group_member_invited_email.text.erb deleted file mode 100644 index 28ce4819b14..00000000000 --- a/app/views/notify/group_member_invited_email.text.erb +++ /dev/null @@ -1,4 +0,0 @@ -You have been invited <%= "by #{@group_member.created_by.name} " if @group_member.created_by %>to join group <%= @group.name %> as <%= @group_member.human_access %>. - -Accept invitation: <%= invite_url(@token) %> -Decline invitation: <%= decline_invite_url(@token) %> diff --git a/app/views/notify/issue_status_changed_email.html.haml b/app/views/notify/issue_status_changed_email.html.haml deleted file mode 100644 index 482c884a9db..00000000000 --- a/app/views/notify/issue_status_changed_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p - = "Issue was #{@issue_status} by #{@updated_by.name}" diff --git a/app/views/notify/issue_status_changed_email.text.erb b/app/views/notify/issue_status_changed_email.text.erb deleted file mode 100644 index e6ab3fcde77..00000000000 --- a/app/views/notify/issue_status_changed_email.text.erb +++ /dev/null @@ -1,4 +0,0 @@ -Issue was <%= @issue_status %> by <%= @updated_by.name %> - -Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> - diff --git a/app/views/notify/merge_request_status_email.html.haml b/app/views/notify/merge_request_status_email.html.haml deleted file mode 100644 index c9bf04f514e..00000000000 --- a/app/views/notify/merge_request_status_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p - = "Merge Request ##{@merge_request.iid} was #{@mr_status} by #{@updated_by.name}" diff --git a/app/views/notify/merge_request_status_email.text.haml b/app/views/notify/merge_request_status_email.text.haml deleted file mode 100644 index b96dd0fd8ab..00000000000 --- a/app/views/notify/merge_request_status_email.text.haml +++ /dev/null @@ -1,8 +0,0 @@ -= "Merge Request ##{@merge_request.iid} was #{@mr_status} by #{@updated_by.name}" - -Merge Request url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} - -= merge_path_description(@merge_request, 'to') - -Author: #{@merge_request.author_name} -Assignee: #{@merge_request.assignee_name} diff --git a/app/views/notify/merged_merge_request_email.html.haml b/app/views/notify/merged_merge_request_email.html.haml deleted file mode 100644 index 6762fae7f64..00000000000 --- a/app/views/notify/merged_merge_request_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -%p - = "Merge Request ##{@merge_request.iid} was merged" diff --git a/app/views/notify/merged_merge_request_email.text.haml b/app/views/notify/merged_merge_request_email.text.haml deleted file mode 100644 index 9db75bdb19e..00000000000 --- a/app/views/notify/merged_merge_request_email.text.haml +++ /dev/null @@ -1,8 +0,0 @@ -= "Merge Request ##{@merge_request.iid} was merged" - -Merge Request Url: #{namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)} - -= merge_path_description(@merge_request, 'to') - -Author: #{@merge_request.author_name} -Assignee: #{@merge_request.assignee_name} diff --git a/app/views/notify/new_email_email.html.haml b/app/views/notify/new_email_email.html.haml deleted file mode 100644 index 4a0448a573c..00000000000 --- a/app/views/notify/new_email_email.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%p - Hi #{@user.name}! -%p - A new email was added to your account: -%p - email: - %code= @email.email -%p - If this email was added in error, you can remove it here: - = link_to "Emails", profile_emails_url diff --git a/app/views/notify/new_email_email.text.erb b/app/views/notify/new_email_email.text.erb deleted file mode 100644 index 51cba99ad0d..00000000000 --- a/app/views/notify/new_email_email.text.erb +++ /dev/null @@ -1,7 +0,0 @@ -Hi <%= @user.name %>! - -A new email was added to your account: - -email.................. <%= @email.email %> - -If this email was added in error, you can remove it here: <%= profile_emails_url %> diff --git a/app/views/notify/new_issue_email.html.haml b/app/views/notify/new_issue_email.html.haml deleted file mode 100644 index 53a068be52e..00000000000 --- a/app/views/notify/new_issue_email.html.haml +++ /dev/null @@ -1,6 +0,0 @@ --if @issue.description - = markdown(@issue.description, reference_only_path: false) - -- if @issue.assignee_id.present? - %p - Assignee: #{@issue.assignee_name} diff --git a/app/views/notify/new_issue_email.text.erb b/app/views/notify/new_issue_email.text.erb deleted file mode 100644 index 0cc62935498..00000000000 --- a/app/views/notify/new_issue_email.text.erb +++ /dev/null @@ -1,5 +0,0 @@ -New Issue was created. - -Issue <%= @issue.iid %>: <%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue)) %> -Author: <%= @issue.author_name %> -Asignee: <%= @issue.assignee_name %> diff --git a/app/views/notify/new_merge_request_email.html.haml b/app/views/notify/new_merge_request_email.html.haml deleted file mode 100644 index 5b7dd117c16..00000000000 --- a/app/views/notify/new_merge_request_email.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -%p.details - != merge_path_description(@merge_request, '→') - -- if @merge_request.assignee_id.present? - %p - Assignee: #{@merge_request.author_name} → #{@merge_request.assignee_name} - --if @merge_request.description - = markdown(@merge_request.description, reference_only_path: false) diff --git a/app/views/notify/new_merge_request_email.text.erb b/app/views/notify/new_merge_request_email.text.erb deleted file mode 100644 index f08039ad045..00000000000 --- a/app/views/notify/new_merge_request_email.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -New Merge Request #<%= @merge_request.iid %> - -<%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request)) %> - -<%= merge_path_description(@merge_request, 'to') %> -Author: <%= @merge_request.author_name %> -Asignee: <%= @merge_request.assignee_name %> - diff --git a/app/views/notify/new_ssh_key_email.html.haml b/app/views/notify/new_ssh_key_email.html.haml deleted file mode 100644 index 63b0cbbd205..00000000000 --- a/app/views/notify/new_ssh_key_email.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%p - Hi #{@user.name}! -%p - A new public key was added to your account: -%p - title: - %code= @key.title -%p - If this key was added in error, you can remove it under - = link_to "SSH Keys", profile_keys_url diff --git a/app/views/notify/new_ssh_key_email.text.erb b/app/views/notify/new_ssh_key_email.text.erb deleted file mode 100644 index 05b551c89a0..00000000000 --- a/app/views/notify/new_ssh_key_email.text.erb +++ /dev/null @@ -1,7 +0,0 @@ -Hi <%= @user.name %>! - -A new public key was added to your account: - -Title: <%= @key.title %> - -If this key was added in error, you can remove it at <%= profile_keys_url %> diff --git a/app/views/notify/new_user_email.html.haml b/app/views/notify/new_user_email.html.haml deleted file mode 100644 index ebbe98dd472..00000000000 --- a/app/views/notify/new_user_email.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%p - Hi #{@user['name']}! -%p - - if Gitlab.config.gitlab.signup_enabled - Your account has been created successfully. - - else - The Administrator created an account for you. Now you are a member of the company GitLab application. -%p - login.......................................... - %code= @user['email'] - -- if @user.created_by_id - %p - = link_to "Click here to set your password", edit_password_url(@user, :reset_password_token => @token) diff --git a/app/views/notify/new_user_email.text.erb b/app/views/notify/new_user_email.text.erb deleted file mode 100644 index 96b26879a77..00000000000 --- a/app/views/notify/new_user_email.text.erb +++ /dev/null @@ -1,8 +0,0 @@ -Hi <%= @user.name %>! - -The Administrator created an account for you. Now you are a member of the company GitLab application. - -login.................. <%= @user.email %> -<% if @user.created_by_id %> - <%= link_to "Click here to set your password", edit_password_url(@user, :reset_password_token => @token) %> -<% end %> diff --git a/app/views/notify/note_commit_email.html.haml b/app/views/notify/note_commit_email.html.haml deleted file mode 100644 index 1d961e4424c..00000000000 --- a/app/views/notify/note_commit_email.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -= render 'note_message' - diff --git a/app/views/notify/note_commit_email.text.erb b/app/views/notify/note_commit_email.text.erb deleted file mode 100644 index aaeaf5fdf73..00000000000 --- a/app/views/notify/note_commit_email.text.erb +++ /dev/null @@ -1,9 +0,0 @@ -New comment for Commit <%= @commit.short_id %> - -<%= url_for(namespace_project_commit_url(@note.project.namespace, @note.project, id: @commit.id, anchor: "note_#{@note.id}")) %> - - -Author: <%= @note.author_name %> - -<%= @note.note %> - diff --git a/app/views/notify/note_issue_email.html.haml b/app/views/notify/note_issue_email.html.haml deleted file mode 100644 index 2fa2f784661..00000000000 --- a/app/views/notify/note_issue_email.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render 'note_message' diff --git a/app/views/notify/note_issue_email.text.erb b/app/views/notify/note_issue_email.text.erb deleted file mode 100644 index e33cbcd70f2..00000000000 --- a/app/views/notify/note_issue_email.text.erb +++ /dev/null @@ -1,9 +0,0 @@ -New comment for Issue <%= @issue.iid %> - -<%= url_for(namespace_project_issue_url(@issue.project.namespace, @issue.project, @issue, anchor: "note_#{@note.id}")) %> - - -Author: <%= @note.author_name %> - -<%= @note.note %> - diff --git a/app/views/notify/note_merge_request_email.html.haml b/app/views/notify/note_merge_request_email.html.haml deleted file mode 100644 index 65f0e4c4068..00000000000 --- a/app/views/notify/note_merge_request_email.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -- if @note.diff_file_name - %p.details - New comment on diff for - = link_to @note.diff_file_name, @target_url - \: - -= render 'note_message' diff --git a/app/views/notify/note_merge_request_email.text.erb b/app/views/notify/note_merge_request_email.text.erb deleted file mode 100644 index 1d1411992a6..00000000000 --- a/app/views/notify/note_merge_request_email.text.erb +++ /dev/null @@ -1,9 +0,0 @@ -New comment for Merge Request <%= @merge_request.iid %> - -<%= url_for(namespace_project_merge_request_url(@merge_request.target_project.namespace, @merge_request.target_project, @merge_request, anchor: "note_#{@note.id}")) %> - - -<%= @note.author_name %> - -<%= @note.note %> - diff --git a/app/views/notify/project_access_granted_email.html.haml b/app/views/notify/project_access_granted_email.html.haml deleted file mode 100644 index dfc30a2d360..00000000000 --- a/app/views/notify/project_access_granted_email.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%p - = "You have been granted #{@project_member.human_access} access to project" -%p - = link_to namespace_project_url(@project.namespace, @project) do - = @project.name_with_namespace diff --git a/app/views/notify/project_access_granted_email.text.erb b/app/views/notify/project_access_granted_email.text.erb deleted file mode 100644 index 68eb1611ba7..00000000000 --- a/app/views/notify/project_access_granted_email.text.erb +++ /dev/null @@ -1,4 +0,0 @@ - -You have been granted <%= @project_member.human_access %> access to project <%= @project.name_with_namespace %> - -<%= url_for(namespace_project_url(@project.namespace, @project)) %> diff --git a/app/views/notify/project_invite_accepted_email.html.haml b/app/views/notify/project_invite_accepted_email.html.haml deleted file mode 100644 index 7e58d30b10a..00000000000 --- a/app/views/notify/project_invite_accepted_email.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%p - #{@project_member.invite_email}, now known as - #{link_to @project_member.user.name, user_url(@project_member.user)}, - has accepted your invitation to join project - #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)}. - diff --git a/app/views/notify/project_invite_accepted_email.text.erb b/app/views/notify/project_invite_accepted_email.text.erb deleted file mode 100644 index fcbe752114d..00000000000 --- a/app/views/notify/project_invite_accepted_email.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= @project_member.invite_email %>, now known as <%= @project_member.user.name %>, has accepted your invitation to join project <%= @project.name_with_namespace %>. - -<%= namespace_project_url(@project.namespace, @project) %> diff --git a/app/views/notify/project_invite_declined_email.html.haml b/app/views/notify/project_invite_declined_email.html.haml deleted file mode 100644 index c2d7e6f6e3a..00000000000 --- a/app/views/notify/project_invite_declined_email.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%p - #{@invite_email} - has declined your invitation to join project - #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)}. - diff --git a/app/views/notify/project_invite_declined_email.text.erb b/app/views/notify/project_invite_declined_email.text.erb deleted file mode 100644 index 484687fa51c..00000000000 --- a/app/views/notify/project_invite_declined_email.text.erb +++ /dev/null @@ -1,3 +0,0 @@ -<%= @invite_email %> has declined your invitation to join project <%= @project.name_with_namespace %>. - -<%= namespace_project_url(@project.namespace, @project) %> diff --git a/app/views/notify/project_member_invited_email.html.haml b/app/views/notify/project_member_invited_email.html.haml deleted file mode 100644 index 79eb89616de..00000000000 --- a/app/views/notify/project_member_invited_email.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%p - You have been invited - - if inviter = @project_member.created_by - by - = link_to inviter.name, user_url(inviter) - to join project - = link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project) - as #{@project_member.human_access}. - -%p - = link_to 'Accept invitation', invite_url(@token) - or - = link_to 'decline', decline_invite_url(@token) diff --git a/app/views/notify/project_member_invited_email.text.erb b/app/views/notify/project_member_invited_email.text.erb deleted file mode 100644 index e0706272115..00000000000 --- a/app/views/notify/project_member_invited_email.text.erb +++ /dev/null @@ -1,4 +0,0 @@ -You have been invited <%= "by #{@project_member.created_by.name} " if @project_member.created_by %>to join project <%= @project.name_with_namespace %> as <%= @project_member.human_access %>. - -Accept invitation: <%= invite_url(@token) %> -Decline invitation: <%= decline_invite_url(@token) %> diff --git a/app/views/notify/project_was_moved_email.html.haml b/app/views/notify/project_was_moved_email.html.haml deleted file mode 100644 index 3cd759f1f57..00000000000 --- a/app/views/notify/project_was_moved_email.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -%p - Project was moved to another location -%p - The project is now located under - = link_to namespace_project_url(@project.namespace, @project) do - = @project.name_with_namespace -%p - To update the remote url in your local repository run (for ssh): -%p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } - git remote set-url origin #{@project.ssh_url_to_repo} -%p - or for http(s): -%p{ style: "background: #f5f5f5; padding:10px; border:1px solid #ddd" } - git remote set-url origin #{@project.http_url_to_repo} -%br diff --git a/app/views/notify/project_was_moved_email.text.erb b/app/views/notify/project_was_moved_email.text.erb deleted file mode 100644 index b3f18b35a4d..00000000000 --- a/app/views/notify/project_was_moved_email.text.erb +++ /dev/null @@ -1,10 +0,0 @@ -Project was moved to another location - -The project is now located under -<%= namespace_project_url(@project.namespace, @project) %> - - -To update the remote url in your local repository run (for ssh): - git remote set-url origin <%= @project.ssh_url_to_repo %> -or for http(s): - git remote set-url origin <%= @project.http_url_to_repo %> diff --git a/app/views/notify/reassigned_issue_email.html.haml b/app/views/notify/reassigned_issue_email.html.haml deleted file mode 100644 index 498ba8b8365..00000000000 --- a/app/views/notify/reassigned_issue_email.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render 'reassigned_issuable_email', issuable: @issue diff --git a/app/views/notify/reassigned_issue_email.text.erb b/app/views/notify/reassigned_issue_email.text.erb deleted file mode 100644 index 710253be984..00000000000 --- a/app/views/notify/reassigned_issue_email.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render 'reassigned_issuable_email', issuable: @issue %> diff --git a/app/views/notify/reassigned_merge_request_email.html.haml b/app/views/notify/reassigned_merge_request_email.html.haml deleted file mode 100644 index 2a650130f59..00000000000 --- a/app/views/notify/reassigned_merge_request_email.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render 'reassigned_issuable_email', issuable: @merge_request diff --git a/app/views/notify/reassigned_merge_request_email.text.erb b/app/views/notify/reassigned_merge_request_email.text.erb deleted file mode 100644 index b5b4f1ff99a..00000000000 --- a/app/views/notify/reassigned_merge_request_email.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= render 'reassigned_issuable_email', issuable: @merge_request %> diff --git a/app/views/notify/repository_push_email.html.haml b/app/views/notify/repository_push_email.html.haml deleted file mode 100644 index a374a662333..00000000000 --- a/app/views/notify/repository_push_email.html.haml +++ /dev/null @@ -1,66 +0,0 @@ -%h3 #{@author.name} #{@action_name} #{@ref_type} #{@ref_name} at #{link_to @project.name_with_namespace, namespace_project_url(@project.namespace, @project)} - -- if @compare - - if @reverse_compare - %p - %strong WARNING: - The push did not contain any new commits, but force pushed to delete the commits and changes below. - - %h4 - = @reverse_compare ? "Deleted commits:" : "Commits:" - - %ul - - @commits.each do |commit| - %li - %strong #{link_to commit.short_id, namespace_project_commit_url(@project.namespace, @project, commit)} - %div - %span by #{commit.author_name} - %i at #{commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ")} - %pre.commit-message - = commit.safe_message - - %h4 #{pluralize @diffs.count, "changed file"}: - - %ul - - @diffs.each_with_index do |diff, i| - %li.file-stats - %a{href: "#{@target_url if @disable_diffs}#diff-#{i}" } - - if diff.deleted_file - %span.deleted-file - − - = diff.old_path - - elsif diff.renamed_file - = diff.old_path - → - = diff.new_path - - elsif diff.new_file - %span.new-file - + - = diff.new_path - - else - = diff.new_path - - - unless @disable_diffs - %h4 Changes: - - @diffs.each_with_index do |diff, i| - %li{id: "diff-#{i}"} - %a{href: @target_url + "#diff-#{i}"} - - if diff.deleted_file - %strong - = diff.old_path - deleted - - elsif diff.renamed_file - %strong - = diff.old_path - → - %strong - = diff.new_path - - else - %strong - = diff.new_path - %hr - = color_email_diff(diff.diff) - %br - - - if @compare.timeout - %h5 Huge diff. To prevent performance issues changes are hidden diff --git a/app/views/notify/repository_push_email.text.haml b/app/views/notify/repository_push_email.text.haml deleted file mode 100644 index 97a176ed2a3..00000000000 --- a/app/views/notify/repository_push_email.text.haml +++ /dev/null @@ -1,49 +0,0 @@ -#{@author.name} #{@action_name} #{@ref_type} #{@ref_name} at #{@project.name_with_namespace} -- if @compare - \ - \ - - if @reverse_compare - WARNING: The push did not contain any new commits, but force pushed to delete the commits and changes below. - \ - \ - = @reverse_compare ? "Deleted commits:" : "Commits:" - - @commits.each do |commit| - #{commit.short_id} by #{commit.author_name} at #{commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ")} - #{commit.safe_message} - \- - - - - - \ - \ - #{pluralize @diffs.count, "changed file"}: - \ - - @diffs.each do |diff| - - if diff.deleted_file - \- − #{diff.old_path} - - elsif diff.renamed_file - \- #{diff.old_path} → #{diff.new_path} - - elsif diff.new_file - \- + #{diff.new_path} - - else - \- #{diff.new_path} - - unless @disable_diffs - \ - \ - Changes: - - @diffs.each do |diff| - \ - \===================================== - - if diff.deleted_file - #{diff.old_path} deleted - - elsif diff.renamed_file - #{diff.old_path} → #{diff.new_path} - - else - = diff.new_path - \===================================== - != diff.diff - - if @compare.timeout - \ - \ - Huge diff. To prevent performance issues it was hidden - - if @target_url - \ - \ - View it on GitLab: #{@target_url} diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml deleted file mode 100644 index 5bffb4acc1d..00000000000 --- a/app/views/profiles/accounts/show.html.haml +++ /dev/null @@ -1,77 +0,0 @@ -- if current_user.ldap_user? - .alert.alert-info - Some options are unavailable for LDAP accounts - -.account-page - %fieldset.update-token - %legend - Reset Private token - %div - = form_for @user, url: reset_private_token_profile_path, method: :put do |f| - .data - %p - Your private token is used to access application resources without authentication. - %br - It can be used for atom feeds or the API. - %span.cred - Keep it secret! - - %p.cgray - - if current_user.private_token - = text_field_tag "token", current_user.private_token, class: "form-control" - %div - = f.submit 'Reset private token', data: { confirm: "Are you sure?" }, class: "btn btn-primary btn-build-token" - - else - %span You don`t have one yet. Click generate to fix it. - = f.submit 'Generate', class: "btn success btn-build-token" - - - - if show_profile_social_tab? - %fieldset - %legend Connected Accounts - .oauth-buttons.append-bottom-10 - %p Click on icon to activate signin with one of the following services - - enabled_social_providers.each do |provider| - .btn-group - = link_to oauth_image_tag(provider), omniauth_authorize_path(User, provider), - class: "btn btn-lg #{'active' if oauth_active?(provider)}" - - if oauth_active?(provider) - = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do - %i.fa.fa-close - - - if show_profile_username_tab? - %fieldset.update-username - %legend - Change Username - = form_for @user, url: update_username_profile_path, method: :put, remote: true do |f| - %p - Changing your username will change path to all personal projects! - %div - = f.text_field :username, required: true, class: 'form-control' -   - .loading-gif.hide - %p - %i.fa.fa-spinner.fa-spin - Saving new username - %p.light - = user_url(@user) - %div - = f.submit 'Save username', class: "btn btn-warning" - - - if show_profile_remove_tab? - %fieldset.remove-account - %legend - Remove account - %div - %p Deleting an account has the following effects: - %ul - %li All user content like authored issues, snippets, comments will be removed - - rp = current_user.personal_projects.count - - unless rp.zero? - %li #{pluralize rp, 'personal project'} will be removed and cannot be restored - - if current_user.solo_owned_groups.present? - %li - The following groups will be abandoned. You should transfer or remove them: - %strong #{current_user.solo_owned_groups.map(&:name).join(', ')} - = link_to 'Delete account', user_registration_path, data: { confirm: "REMOVE #{current_user.name}? Are you sure?" }, method: :delete, class: "btn btn-remove" - diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml deleted file mode 100644 index 97e98948f36..00000000000 --- a/app/views/profiles/applications.html.haml +++ /dev/null @@ -1,49 +0,0 @@ -%h3.page-title - Application Settings -%p.light - OAuth2 protocol settings below. - -%fieldset.oauth-applications - %legend Your applications - %p= link_to 'New Application', new_oauth_application_path, class: 'btn btn-success' - - if @applications.any? - %table.table.table-striped - %thead - %tr - %th Name - %th Callback URL - %th Clients - %th - %th - %tbody - - @applications.each do |application| - %tr{:id => "application_#{application.id}"} - %td= link_to application.name, oauth_application_path(application) - %td - - application.redirect_uri.split.each do |uri| - %div= uri - %td= application.access_tokens.count - %td= link_to 'Edit', edit_oauth_application_path(application), class: 'btn btn-link btn-sm' - %td= render 'doorkeeper/applications/delete_form', application: application - -%fieldset.oauth-authorized-applications.prepend-top-20 - %legend Authorized applications - - - if @authorized_tokens.any? - %table.table.table-striped - %thead - %tr - %th Name - %th Authorized At - %th Scope - %th - %tbody - - @authorized_apps.each do |app| - - token = app.authorized_tokens.order('created_at desc').first - %tr{:id => "application_#{app.id}"} - %td= app.name - %td= token.created_at - %td= token.scopes - %td= render 'doorkeeper/authorized_applications/delete_form', application: app - - else - %p.light You dont have any authorized applications diff --git a/app/views/profiles/design.html.haml b/app/views/profiles/design.html.haml deleted file mode 100644 index cc00d08d03b..00000000000 --- a/app/views/profiles/design.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -%h3.page-title - Design Settings -%p.light - Appearance settings will be saved to your profile and made available across all devices. -%hr - -= form_for @user, url: profile_path, remote: true, method: :put do |f| - %fieldset.application-theme - %legend - Application theme - .themes_opts - = label_tag do - .prev.default - = f.radio_button :theme_id, 1 - Default - - = label_tag do - .prev.classic - = f.radio_button :theme_id, 2 - Classic - - = label_tag do - .prev.modern - = f.radio_button :theme_id, 3 - Modern - - = label_tag do - .prev.gray - = f.radio_button :theme_id, 4 - Gray - - = label_tag do - .prev.violet - = f.radio_button :theme_id, 5 - Violet - - = label_tag do - .prev.blue - = f.radio_button :theme_id, 6 - Blue - %br - .clearfix - - %fieldset.code-preview-theme - %legend - Code preview theme - .code_highlight_opts - - color_schemes.each do |color_scheme_id, color_scheme| - = label_tag do - .prev - = image_tag "#{color_scheme}-scheme-preview.png" - = f.radio_button :color_scheme_id, color_scheme_id - = color_scheme.gsub(/[-_]+/, ' ').humanize diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml deleted file mode 100644 index 09f290429ea..00000000000 --- a/app/views/profiles/emails/index.html.haml +++ /dev/null @@ -1,41 +0,0 @@ -%h3.page-title - Email Settings -%p.light - Your - %b Primary Email - will be used for avatar detection and web based operations, such as edits and merges. - %br - Your - %b Notification Email - will be used for account notifications. - %br - All email addresses will be used to identify your commits. - -%hr - -.panel.panel-default - .panel-heading - Emails (#{@emails.count + 1}) - %ul.well-list#emails-table - %li - %strong= @primary - %span.label.label-success Primary Email - - if @primary === @public_email - %span.label.label-info Public Email - - @emails.each do |email| - %li - %strong= email.email - - if email.email === @public_email - %span.label.label-info Public Email - %span.cgray - added #{time_ago_with_tooltip(email.created_at)} - = link_to 'Remove', profile_email_path(email), data: { confirm: 'Are you sure?'}, method: :delete, class: 'btn btn-sm btn-remove pull-right' - -%h4 Add email address -= form_for 'email', url: profile_emails_path, html: { class: 'form-horizontal' } do |f| - .form-group - = f.label :email, class: 'control-label' - .col-sm-10 - = f.text_field :email, class: 'form-control' - .form-actions - = f.submit 'Add email address', class: 'btn btn-create' diff --git a/app/views/profiles/history.html.haml b/app/views/profiles/history.html.haml deleted file mode 100644 index b1ab433f48f..00000000000 --- a/app/views/profiles/history.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%h3.page-title - Your Account History -%p.light - All events created by your account are listed below. -%hr -.profile_history - = render @events -%hr -= paginate @events, theme: "gitlab" - diff --git a/app/views/profiles/keys/_form.html.haml b/app/views/profiles/keys/_form.html.haml deleted file mode 100644 index f905417f0e2..00000000000 --- a/app/views/profiles/keys/_form.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -%div - = form_for [:profile, @key], html: { class: 'form-horizontal' } do |f| - - if @key.errors.any? - .alert.alert-danger - %ul - - @key.errors.full_messages.each do |msg| - %li= msg - - .form-group - = f.label :title, class: 'control-label' - .col-sm-10= f.text_field :title, class: "form-control" - .form-group - = f.label :key, class: 'control-label' - .col-sm-10 - = f.text_area :key, class: "form-control", rows: 8 - - - .form-actions - = f.submit 'Add key', class: "btn btn-create" - = link_to "Cancel", profile_keys_path, class: "btn btn-cancel" - diff --git a/app/views/profiles/keys/_key.html.haml b/app/views/profiles/keys/_key.html.haml deleted file mode 100644 index fe5770f45c3..00000000000 --- a/app/views/profiles/keys/_key.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -%tr - %td - = link_to path_to_key(key, is_admin) do - %strong= key.title - %td - %span - (#{key.fingerprint}) - %td - %span.cgray - added #{time_ago_with_tooltip(key.created_at)} - %td - = link_to 'Remove', path_to_key(key, is_admin), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-sm btn-remove delete-key pull-right" diff --git a/app/views/profiles/keys/_key_details.html.haml b/app/views/profiles/keys/_key_details.html.haml deleted file mode 100644 index 8bac22a2e1a..00000000000 --- a/app/views/profiles/keys/_key_details.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -- is_admin = defined?(admin) ? true : false -.row - .col-md-4 - .panel.panel-default - .panel-heading - SSH Key - %ul.well-list - %li - %span.light Title: - %strong= @key.title - %li - %span.light Created on: - %strong= @key.created_at.stamp("Aug 21, 2011") - - .col-md-8 - %p - %span.light Fingerprint: - %strong= @key.fingerprint - %pre.well-pre - = @key.key - .pull-right - = link_to 'Remove', path_to_key(@key, is_admin), data: {confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove delete-key" diff --git a/app/views/profiles/keys/_key_table.html.haml b/app/views/profiles/keys/_key_table.html.haml deleted file mode 100644 index ef0075aad3b..00000000000 --- a/app/views/profiles/keys/_key_table.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- is_admin = defined?(admin) ? true : false -.panel.panel-default - - if @keys.any? - %table.table - %thead.panel-heading - %tr - %th Title - %th Fingerprint - %th Added at - %th - %tbody - - @keys.each do |key| - = render 'profiles/keys/key', key: key, is_admin: is_admin - - else - .nothing-here-block - - if is_admin - User has no ssh keys - - else - There are no SSH keys with access to your account. diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml deleted file mode 100644 index 0904c50c88b..00000000000 --- a/app/views/profiles/keys/index.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%h3.page-title - SSH Keys Settings - .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 - -= render 'key_table' diff --git a/app/views/profiles/keys/new.html.haml b/app/views/profiles/keys/new.html.haml deleted file mode 100644 index ccec716d0c6..00000000000 --- a/app/views/profiles/keys/new.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -%h3.page-title Add an SSH Key -%p.light - Paste your public key here. Read more about how to generate a key on #{link_to "the SSH help page", help_page_path("ssh", "README")}. -%hr -= render 'form' - -:javascript - $('#key_key').on('focusout', function(){ - var title = $('#key_title'), - val = $('#key_key').val(), - comment = val.match(/^\S+ \S+ (.+)$/); - - if( comment && comment.length > 1 && title.val() == '' ){ - $('#key_title').val( comment[1] ); - } - }); diff --git a/app/views/profiles/keys/show.html.haml b/app/views/profiles/keys/show.html.haml deleted file mode 100644 index cfd53298962..00000000000 --- a/app/views/profiles/keys/show.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "key_details" diff --git a/app/views/profiles/notifications/_settings.html.haml b/app/views/profiles/notifications/_settings.html.haml deleted file mode 100644 index 2c85d2a9b2b..00000000000 --- a/app/views/profiles/notifications/_settings.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -%li - %span.notification.fa.fa-holder - - if notification.global? - = notification_icon(@notification) - - else - = notification_icon(notification) - - %span.str-truncated - - if membership.kind_of? GroupMember - = link_to membership.group.name, membership.group - - else - = link_to_project(membership.project) - .pull-right - = form_tag profile_notifications_path, method: :put, remote: true, class: 'update-notifications' do - = hidden_field_tag :notification_type, type, id: dom_id(membership, 'notification_type') - = hidden_field_tag :notification_id, membership.id, id: dom_id(membership, 'notification_id') - = select_tag :notification_level, options_for_select(Notification.options_with_labels, notification.level), class: 'trigger-submit' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml deleted file mode 100644 index 273e72f8a4d..00000000000 --- a/app/views/profiles/notifications/show.html.haml +++ /dev/null @@ -1,78 +0,0 @@ -%h3.page-title - Notifications Settings -%p.light - These are your global notification settings. -%hr - -= 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 - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - - = hidden_field_tag :notification_type, 'global' - - .form-group - = f.label :notification_email, class: "control-label" - .col-sm-10 - = f.select :notification_email, @user.all_emails, { include_blank: false }, class: "form-control" - - .form-group - = f.label :notification_level, class: 'control-label' - .col-sm-10 - .radio - = f.label :notification_level, value: Notification::N_DISABLED do - = f.radio_button :notification_level, Notification::N_DISABLED - .level-title - Disabled - %p You will not get any notifications via email - - .radio - = f.label :notification_level, value: Notification::N_MENTION do - = f.radio_button :notification_level, Notification::N_MENTION - .level-title - Mention - %p You will receive notifications only for comments in which you were @mentioned - - .radio - = f.label :notification_level, value: Notification::N_PARTICIPATING do - = f.radio_button :notification_level, Notification::N_PARTICIPATING - .level-title - Participating - %p You will only receive notifications from related resources (e.g. from your commits or assigned issues) - - .radio - = f.label :notification_level, value: Notification::N_WATCH do - = f.radio_button :notification_level, Notification::N_WATCH - .level-title - Watch - %p You will receive all notifications from projects in which you participate - - .form-actions - = f.submit 'Save changes', class: "btn btn-create" - -.clearfix - %hr -.row.all-notifications - .col-md-6 - %p - You can also specify notification level per group or per project. - %br - By default, all projects and groups will use the notification level set above. - %h4 Groups: - %ul.bordered-list - - @group_members.each do |group_member| - - notification = Notification.new(group_member) - = render 'settings', type: 'group', membership: group_member, notification: notification - - .col-md-6 - %p - To specify the notification level per project of a group you belong to, - %br - you need to be a member of the project itself, not only its group. - %h4 Projects: - %ul.bordered-list - - @project_members.each do |project_member| - - notification = Notification.new(project_member) - = render 'settings', type: 'project', membership: project_member, notification: notification diff --git a/app/views/profiles/notifications/update.js.haml b/app/views/profiles/notifications/update.js.haml deleted file mode 100644 index 84c6ab25599..00000000000 --- a/app/views/profiles/notifications/update.js.haml +++ /dev/null @@ -1,6 +0,0 @@ -- if @saved - :plain - new Flash("Notification settings saved", "notice") -- else - :plain - new Flash("Failed to save new settings", "alert") diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml deleted file mode 100644 index 4b04b113e89..00000000000 --- a/app/views/profiles/passwords/edit.html.haml +++ /dev/null @@ -1,38 +0,0 @@ -%h3.page-title Password Settings -%p.light - - if @user.password_automatically_set? - Set your password. - - else - Change your password or recover your current one. -%hr -.update-password - = form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f| - %div - %p.slead - - unless @user.password_automatically_set? - You must provide current password in order to change it. - %br - After a successful password update, you will be redirected to the login page where you can log in with your new password. - -if @user.errors.any? - .alert.alert-danger - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - - unless @user.password_automatically_set? - .form-group - = f.label :current_password, class: 'control-label' - .col-sm-10 - = f.password_field :current_password, required: true, class: 'form-control' - %div - = link_to "Forgot your password?", reset_profile_password_path, method: :put - - .form-group - = f.label :password, 'New password', class: 'control-label' - .col-sm-10 - = f.password_field :password, required: true, class: 'form-control' - .form-group - = f.label :password_confirmation, class: 'control-label' - .col-sm-10 - = f.password_field :password_confirmation, required: true, class: 'form-control' - .form-actions - = f.submit 'Save password', class: "btn btn-create" diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml deleted file mode 100644 index 8bed6e0dbee..00000000000 --- a/app/views/profiles/passwords/new.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -%h3.page-title Setup new password -%hr -= form_for @user, url: profile_password_path, method: :post, html: { class: 'form-horizontal '} do |f| - %p.slead - Please set a new password before proceeding. - %br - After a successful password update you will be redirected to login screen. - -if @user.errors.any? - .alert.alert-danger - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - - - unless @user.password_automatically_set? - .form-group - = f.label :current_password, class: 'control-label' - .col-sm-10= f.password_field :current_password, required: true, class: 'form-control' - .form-group - = f.label :password, class: 'control-label' - .col-sm-10= f.password_field :password, required: true, class: 'form-control' - .form-group - = f.label :password_confirmation, class: 'control-label' - .col-sm-10 - = f.password_field :password_confirmation, required: true, class: 'form-control' - .form-actions - = f.submit 'Set new password', class: "btn btn-create" diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml deleted file mode 100644 index 6c745e69e40..00000000000 --- a/app/views/profiles/show.html.haml +++ /dev/null @@ -1,110 +0,0 @@ -%h3.page-title - Profile Settings -%p.light - This information will appear on your profile. - - if current_user.ldap_user? - Some options are unavailable for LDAP accounts -%hr - - - -= 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 - %ul - - @user.errors.full_messages.each do |msg| - %li= msg - .row - .col-md-7 - .form-group - = f.label :name, class: "control-label" - .col-sm-10 - = f.text_field :name, class: "form-control", required: true - %span.help-block Enter your name, so people you know can recognize you. - - .form-group - = f.label :email, class: "control-label" - .col-sm-10 - - if @user.ldap_user? - = f.text_field :email, class: "form-control", required: true, readonly: true - %span.help-block.light - Email is read-only for LDAP user - - else - - if @user.temp_oauth_email? - = f.text_field :email, class: "form-control", required: true, value: nil - - else - = f.text_field :email, class: "form-control", required: true - - if @user.unconfirmed_email.present? - %span.help-block - Please click the link in the confirmation email before continuing, it was sent to - %strong #{@user.unconfirmed_email} - - - else - %span.help-block We also use email for avatar detection if no avatar is uploaded. - .form-group - = f.label :public_email, class: "control-label" - .col-sm-10 - = f.select :public_email, options_for_select(@user.all_emails, selected: @user.public_email), {include_blank: 'Do not show in profile'}, class: "form-control" - %span.help-block This email will be displayed on your public profile. - .form-group - = f.label :skype, class: "control-label" - .col-sm-10= f.text_field :skype, class: "form-control" - .form-group - = f.label :linkedin, class: "control-label" - .col-sm-10= f.text_field :linkedin, class: "form-control" - .form-group - = f.label :twitter, class: "control-label" - .col-sm-10= f.text_field :twitter, class: "form-control" - .form-group - = f.label :website_url, 'Website', class: "control-label" - .col-sm-10= f.text_field :website_url, class: "form-control" - .form-group - = f.label :location, 'Location', class: "control-label" - .col-sm-10= f.text_field :location, class: "form-control" - .form-group - = f.label :bio, class: "control-label" - .col-sm-10 - = f.text_area :bio, rows: 4, class: "form-control", maxlength: 250 - %span.help-block Tell us about yourself in fewer than 250 characters. - - .col-md-5 - .light-well - = image_tag avatar_icon(@user.email, 160), alt: '', class: 'avatar s160' - - .clearfix - .profile-avatar-form-option - %p.light - - if @user.avatar? - You can change your avatar here - - if Gitlab.config.gravatar.enabled - %br - or remove the current avatar to revert to #{link_to "gravatar.com", "http://gravatar.com"} - - else - You can upload an avatar here - - if Gitlab.config.gravatar.enabled - %br - or change it at #{link_to "gravatar.com", "http://gravatar.com"} - %hr - %a.choose-btn.btn.btn-sm.js-choose-user-avatar-button - %i.fa.fa-paperclip - %span Choose File ... -   - %span.file_name.js-avatar-filename File name... - = f.file_field :avatar, class: "js-user-avatar-input hidden" - .light The maximum file size allowed is 200KB. - - if @user.avatar? - %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 - .form-group - .col-sm-2   - .col-sm-10 - = f.submit 'Save changes', class: "btn btn-success" diff --git a/app/views/profiles/update.js.erb b/app/views/profiles/update.js.erb deleted file mode 100644 index e664ac2a52a..00000000000 --- a/app/views/profiles/update.js.erb +++ /dev/null @@ -1,9 +0,0 @@ -// Remove body class for any previous theme, re-add current one -$('body').removeClass('ui_basic ui_mars ui_modern ui_gray ui_color light_theme dark_theme') -$('body').addClass('<%= app_theme %> <%= theme_type %>') - -// Re-render the header to reflect the new theme -$('header').html('<%= escape_javascript(render("layouts/head_panel", title: "Profile")) %>') - -// Re-initialize header tooltips -$('.has_bottom_tooltip').tooltip({placement: 'bottom'}) diff --git a/app/views/profiles/update_username.js.haml b/app/views/profiles/update_username.js.haml deleted file mode 100644 index 249680bcab6..00000000000 --- a/app/views/profiles/update_username.js.haml +++ /dev/null @@ -1,6 +0,0 @@ -- if @user.valid? - :plain - new Flash("Username sucessfully changed", "notice") -- else - :plain - new Flash("Username change failed - #{@user.errors.full_messages.first}", "alert") diff --git a/app/views/projects/_bitbucket_import_modal.html.haml b/app/views/projects/_bitbucket_import_modal.html.haml deleted file mode 100644 index 07d4d602769..00000000000 --- a/app/views/projects/_bitbucket_import_modal.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%div#bitbucket_import_modal.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 Import projects from Bitbucket - .modal-body - To enable importing projects from Bitbucket, - - if current_user.admin? - you need to - - else - your GitLab administrator needs to - == #{link_to 'setup OAuth integration', 'https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/integration/bitbucket.md'}. diff --git a/app/views/projects/_commit_button.html.haml b/app/views/projects/_commit_button.html.haml deleted file mode 100644 index 35f7e7bb34b..00000000000 --- a/app/views/projects/_commit_button.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.form-actions - .commit-button-annotation - = button_tag 'Commit Changes', - class: 'btn commit-btn js-commit-button btn-create' - = link_to 'Cancel', cancel_path, - class: 'btn btn-cancel', data: {confirm: leave_edit_message} diff --git a/app/views/projects/_dropdown.html.haml b/app/views/projects/_dropdown.html.haml deleted file mode 100644 index 3036f11bb2d..00000000000 --- a/app/views/projects/_dropdown.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -- if current_user - .dropdown.pull-right - %a.dropdown-toggle.btn.btn-new{href: '#', "data-toggle" => "dropdown"} - %i.fa.fa-bars - %ul.dropdown-menu - - if @project.issues_enabled && can?(current_user, :write_issue, @project) - %li - = link_to url_for_new_issue(@project, only_path: true), title: "New Issue" do - %i.fa.fa-fw.fa-exclamation-circle - New issue - - if @project.merge_requests_enabled && can?(current_user, :write_merge_request, @project) - %li - = link_to new_namespace_project_merge_request_path(@project.namespace, @project), title: "New Merge Request" do - %i.fa.fa-fw.fa-tasks - New merge request - - if @project.snippets_enabled && can?(current_user, :write_snippet, @project) - %li - = link_to new_namespace_project_snippet_path(@project.namespace, @project), title: "New Snippet" do - %i.fa.fa-fw.fa-file-text-o - New snippet - - if can?(current_user, :admin_project_member, @project) - %li - = link_to namespace_project_project_members_path(@project.namespace, @project), title: "New project member" do - %i.fa.fa-fw.fa-users - New project member - - if can? current_user, :push_code, @project - %li.divider - %li - = link_to new_namespace_project_branch_path(@project.namespace, @project) do - %i.fa.fa-fw.fa-code-fork - New branch - %li - = link_to new_namespace_project_tag_path(@project.namespace, @project) do - %i.fa.fa-fw.fa-tag - New tag - - diff --git a/app/views/projects/_errors.html.haml b/app/views/projects/_errors.html.haml deleted file mode 100644 index 7c8bb33ed7e..00000000000 --- a/app/views/projects/_errors.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- if @project.errors.any? - .alert.alert-danger - %button{ type: "button", class: "close", "data-dismiss" => "alert"} × - = @project.errors.full_messages.first diff --git a/app/views/projects/_github_import_modal.html.haml b/app/views/projects/_github_import_modal.html.haml deleted file mode 100644 index e88a0f7d689..00000000000 --- a/app/views/projects/_github_import_modal.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%div#github_import_modal.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 Import projects from GitHub - .modal-body - To enable importing projects from GitHub, - - if current_user.admin? - you need to - - 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 diff --git a/app/views/projects/_gitlab_import_modal.html.haml b/app/views/projects/_gitlab_import_modal.html.haml deleted file mode 100644 index 52212b6ae02..00000000000 --- a/app/views/projects/_gitlab_import_modal.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%div#gitlab_import_modal.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 Import projects from GitLab.com - .modal-body - To enable importing projects from GitLab.com, - - if current_user.admin? - you need to - - 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 diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml deleted file mode 100644 index 5689bdee1c6..00000000000 --- a/app/views/projects/_home_panel.html.haml +++ /dev/null @@ -1,43 +0,0 @@ -- empty_repo = @project.empty_repo? -.project-home-panel{:class => ("empty-project" if empty_repo)} - .project-identicon-holder - = project_icon(@project, alt: '', class: 'avatar project-avatar') - .project-home-row.project-home-row-top - .project-home-desc - - if @project.description.present? - = escaped_autolink(@project.description) - - if can?(current_user, :admin_project, @project) - – - = link_to 'Edit', edit_namespace_project_path - - elsif !@project.empty_repo? && @repository.readme - - readme = @repository.readme - – - = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)) do - = readme.name - .project-repo-buttons - .inline.star.js-toggler-container{class: @show_star ? 'on' : ''} - - if current_user - = link_to_toggle_star('Star this project.', false) - = link_to_toggle_star('Unstar this project.', true) - - else - = link_to new_user_session_path, class: 'btn star-btn has_tooltip', title: 'You must sign in to star a project' do - %span - = icon('star') - Star - %span.count - = @project.star_count - - unless @project.empty_repo? - - if current_user && can?(current_user, :fork_project, @project) && @project.namespace != current_user.namespace - .inline.fork-buttons.prepend-left-10 - - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 - = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn btn-sm btn-default' do - = link_to_toggle_fork - - else - = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn btn-sm btn-default' do - = link_to_toggle_fork - - .project-home-row.hidden-xs - - if current_user && !empty_repo - .project-home-dropdown - = render "dropdown" - = render "shared/clone_panel" diff --git a/app/views/projects/_issuable_form.html.haml b/app/views/projects/_issuable_form.html.haml deleted file mode 100644 index e321a84974e..00000000000 --- a/app/views/projects/_issuable_form.html.haml +++ /dev/null @@ -1,87 +0,0 @@ -- if issuable.errors.any? - .row - .col-sm-10.col-sm-offset-2 - .alert.alert-danger - - issuable.errors.full_messages.each do |msg| - %span= msg - %br -.form-group - = f.label :title, class: 'control-label' do - %strong= 'Title *' - .col-sm-10 - = f.text_field :title, maxlength: 255, autofocus: true, - class: 'form-control pad js-gfm-input', required: true -.form-group.issuable-description - = f.label :description, 'Description', class: 'control-label' - .col-sm-10 - - = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do - = render 'projects/zen', f: f, attr: :description, - classes: 'description form-control' - .col-sm-12.hint - .pull-left - Parsed with - #{link_to 'GitLab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. - .pull-right - Attach files by dragging & dropping - or #{link_to 'selecting them', '#', class: 'markdown-selector' }. - - .clearfix - .error-alert -%hr -.form-group - .issue-assignee - = f.label :assignee_id, class: 'control-label' do - %i.fa.fa-user - Assign to - .col-sm-10 - = users_select_tag("#{issuable.class.model_name.param_key}[assignee_id]", - placeholder: 'Select a user', class: 'custom-form-control', null_user: true, - selected: issuable.assignee_id) -   - = link_to 'Assign to me', '#', class: 'btn assign-to-me-link' -.form-group - .issue-milestone - = f.label :milestone_id, class: 'control-label' do - %i.fa.fa-clock-o - Milestone - .col-sm-10 - - if milestone_options(issuable).present? - = f.select(:milestone_id, milestone_options(issuable), - { include_blank: 'Select milestone' }, { class: 'select2' }) - - else - .prepend-top-10 - %span.light No open milestones available. -   - - if can? current_user, :admin_milestone, issuable.project - = link_to 'Create new milestone', new_namespace_project_milestone_path(issuable.project.namespace, issuable.project), target: :blank -.form-group - = f.label :label_ids, class: 'control-label' do - %i.fa.fa-tag - Labels - .col-sm-10 - - if issuable.project.labels.any? - = f.collection_select :label_ids, issuable.project.labels.all, :id, :name, - { selected: issuable.label_ids }, multiple: true, class: 'select2' - - else - .prepend-top-10 - %span.light No labels yet. -   - - if can? current_user, :admin_label, issuable.project - = link_to 'Create new label', new_namespace_project_label_path(issuable.project.namespace, issuable.project), target: :blank - -.form-actions - - if !issuable.project.empty_repo? && (guide_url = contribution_guide_url(issuable.project)) && !issuable.persisted? - %p - Please review the - %strong #{link_to 'guidelines for contribution', guide_url} - to this repository. - - if issuable.new_record? - = f.submit "Submit new #{issuable.class.model_name.human.downcase}", class: 'btn btn-create' - - else - = f.submit 'Save changes', class: 'btn btn-save' - - if issuable.new_record? - - cancel_project = issuable.source_project - - else - - cancel_project = issuable.project - = link_to 'Cancel', [cancel_project.namespace.becomes(Namespace), cancel_project, issuable], class: 'btn btn-cancel' diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml deleted file mode 100644 index f356a25dbfa..00000000000 --- a/app/views/projects/_md_preview.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%ul.nav.nav-tabs - %li.active - = link_to '#md-write-holder', class: 'js-md-write-button' do - Write - %li - = link_to '#md-preview-holder', class: 'js-md-preview-button', - data: { url: markdown_preview_namespace_project_path(@project.namespace, @project) } do - Preview -%div - .md-write-holder - = yield - .md-preview-holder.hide - .js-md-preview{class: (preview_class if defined?(preview_class))} diff --git a/app/views/projects/_settings_nav.html.haml b/app/views/projects/_settings_nav.html.haml deleted file mode 100644 index 281a84a3d3c..00000000000 --- a/app/views/projects/_settings_nav.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -%ul.project-settings-nav.sidebar-subnav - = nav_link(path: 'projects#edit') do - = link_to edit_project_path(@project), title: 'Project', class: "stat-tab tab " do - %i.fa.fa-pencil-square-o - %span - Project - = nav_link(controller: [:project_members, :teams]) do - = link_to namespace_project_project_members_path(@project.namespace, @project), title: 'Members', class: "team-tab tab" do - %i.fa.fa-users - %span - Members - = nav_link(controller: :deploy_keys) do - = link_to namespace_project_deploy_keys_path(@project.namespace, @project), title: 'Deploy Keys' do - %i.fa.fa-key - %span - Deploy Keys - = nav_link(controller: :hooks) do - = link_to namespace_project_hooks_path(@project.namespace, @project), title: 'Web Hooks' do - %i.fa.fa-link - %span - Web Hooks - = nav_link(controller: :services) do - = link_to namespace_project_services_path(@project.namespace, @project), title: 'Services' do - %i.fa.fa-cogs - %span - Services - = nav_link(controller: :protected_branches) do - = link_to namespace_project_protected_branches_path(@project.namespace, @project), title: 'Protected Branches' do - %i.fa.fa-lock - %span - Protected branches diff --git a/app/views/projects/_visibility_level.html.haml b/app/views/projects/_visibility_level.html.haml deleted file mode 100644 index 42c8e685224..00000000000 --- a/app/views/projects/_visibility_level.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -.form-group.project-visibility-level-holder - = f.label :visibility_level, class: 'control-label' do - Visibility Level - = link_to "(?)", help_page_path("public_access", "public_access") - .col-sm-10 - - if can_change_visibility_level - - Gitlab::VisibilityLevel.values.each do |level| - .radio - - restricted = restricted_visibility_levels.include?(level) - = label :project_visibility_level, level do - = f.radio_button :visibility_level, level, checked: (visibility_level == level), disabled: restricted - = visibility_level_icon(level) - .option-title - = visibility_level_label(level) - .option-descr - = visibility_level_description(level) - - unless restricted_visibility_levels.empty? - .col-sm-10 - %span.info - Some visibility level settings have been restricted by the administrator. - - else - .col-sm-10 - %span.info - = visibility_level_icon(visibility_level) - %strong - = visibility_level_label(visibility_level) - .light= visibility_level_description(visibility_level) diff --git a/app/views/projects/_zen.html.haml b/app/views/projects/_zen.html.haml deleted file mode 100644 index cf1c55ecca6..00000000000 --- a/app/views/projects/_zen.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -.zennable - %input#zen-toggle-comment.zen-toggle-comment{ tabindex: '-1', type: 'checkbox' } - .zen-backdrop - - classes << ' js-gfm-input markdown-area' - = f.text_area attr, class: classes, placeholder: 'Leave a comment' - = link_to nil, class: 'zen-enter-link', tabindex: '-1' do - %i.fa.fa-expand - Edit in fullscreen - = link_to nil, class: 'zen-leave-link' do - %i.fa.fa-compress diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml deleted file mode 100644 index e6a859fea8f..00000000000 --- a/app/views/projects/blame/show.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -%h3.page-title Blame view - -#tree-holder.tree-holder - .file-holder - .file-title - %i.fa.fa-file - %strong - = @path - %small= number_to_human_size @blob.size - .file-actions - = render "projects/blob/actions" - .file-content.blame.highlight - %table - - @blame.each do |commit, lines, since| - - commit = Commit.new(commit) - %tr - %td.blame-commit - %span.commit - = link_to commit.short_id, namespace_project_commit_path(@project.namespace, @project, commit), class: "commit_short_id" -   - = commit_author_link(commit, avatar: true, size: 16) -   - = link_to_gfm truncate(commit.title, length: 20), namespace_project_commit_path(@project.namespace, @project, commit.id), class: "row_title" - %td.lines.blame-numbers - %pre - - (since...(since + lines.count)).each do |i| - = i - \ - %td.lines - %pre{class: 'code highlight white'} - %code - :erb - <% lines.each do |line| %> - <%= highlight(@blob.name, line, true).html_safe %> - <% end %> diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml deleted file mode 100644 index 13f8271b979..00000000000 --- a/app/views/projects/blob/_actions.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -.btn-group.tree-btn-group - = edit_blob_link(@project, @ref, @path) - = link_to 'Raw', namespace_project_raw_path(@project.namespace, @project, @id), - class: 'btn btn-sm', target: '_blank' - -# only show normal/blame view links for text files - - if @blob.text? - - if current_page? namespace_project_blame_path(@project.namespace, @project, @id) - = link_to 'Normal View', namespace_project_blob_path(@project.namespace, @project, @id), - class: 'btn btn-sm' - - else - = link_to 'Blame', namespace_project_blame_path(@project.namespace, @project, @id), - class: 'btn btn-sm' unless @blob.empty? - = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), - class: 'btn btn-sm' - - if @ref != @commit.sha - = link_to 'Permalink', namespace_project_blob_path(@project.namespace, @project, - 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 diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml deleted file mode 100644 index 65c3ab10e02..00000000000 --- a/app/views/projects/blob/_blob.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -%ul.breadcrumb.repo-breadcrumb - %li - %i.fa.fa-angle-right - = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do - = @project.path - - tree_breadcrumbs(@tree, 6) do |title, path| - %li - - if path - - if path.end_with?(@path) - = link_to namespace_project_blob_path(@project.namespace, @project, path) do - %strong - = truncate(title, length: 40) - - else - = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - - else - = link_to title, '#' - -%ul.blob-commit-info.well.hidden-xs - - blob_commit = @repository.last_commit_for_path(@commit.id, blob.path) - = render blob_commit, project: @project - -%div#tree-content-holder.tree-content-holder - %article.file-holder - .file-title - = blob_icon blob.mode, blob.name - %strong - = blob.name - %small - = number_to_human_size(blob.size) - .file-actions.hidden-xs - = render "actions" - - if blob.text? - = render "text", blob: blob - - elsif blob.image? - = render "image", blob: blob - - else - = render "download", blob: blob diff --git a/app/views/projects/blob/_download.html.haml b/app/views/projects/blob/_download.html.haml deleted file mode 100644 index f2c5e95ecf4..00000000000 --- a/app/views/projects/blob/_download.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -.file-content.blob_file.blob-no-preview - .center - = link_to namespace_project_raw_path(@project.namespace, @project, @id) do - %h1.light - %i.fa.fa-download - %h4 - Download (#{number_to_human_size blob.size}) diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml deleted file mode 100644 index 96f188e4aa7..00000000000 --- a/app/views/projects/blob/_editor.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -.file-holder.file - .file-title - .editor-ref - %i.fa.fa-code-fork - = ref - %span.editor-file-name - - if @path - %span.monospace - = @path - - - if current_action?(:new) || current_action?(:create) - \/ - = 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' - - .file-content.code - %pre.js-edit-mode-pane#editor - = params[:content] || local_assigns[:blob_data] - - if local_assigns[:path] - .js-edit-mode-pane#preview.hide - .center - %h2 - %i.icon-spinner.icon-spin diff --git a/app/views/projects/blob/_image.html.haml b/app/views/projects/blob/_image.html.haml deleted file mode 100644 index c090f690d1d..00000000000 --- a/app/views/projects/blob/_image.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -.file-content.image_file - %img{ src: "data:#{blob.mime_type};base64,#{Base64.encode64(blob.data)}"} diff --git a/app/views/projects/blob/_remove.html.haml b/app/views/projects/blob/_remove.html.haml deleted file mode 100644 index 09559a4967b..00000000000 --- a/app/views/projects/blob/_remove.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -#modal-remove-blob.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3.page-title Remove #{@blob.name} - %p.light - From branch - %strong= @ref - - .modal-body - = form_tag namespace_project_blob_path(@project.namespace, @project, @id), method: :delete, class: 'form-horizontal' do - = render 'shared/commit_message_container', params: params, - placeholder: 'Removed this file because...' - .form-group - .col-sm-2 - .col-sm-10 - = button_tag 'Remove file', class: 'btn btn-remove btn-remove-file' - = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" - -:javascript - disableButtonIfEmptyField('#commit_message', '.btn-remove-file') diff --git a/app/views/projects/blob/_text.html.haml b/app/views/projects/blob/_text.html.haml deleted file mode 100644 index f6bd62f239b..00000000000 --- a/app/views/projects/blob/_text.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -- if gitlab_markdown?(blob.name) - .file-content.wiki - = preserve do - = markdown(blob.data) -- elsif markup?(blob.name) - .file-content.wiki - = render_markup(blob.name, blob.data) -- else - .file-content.code - - unless blob.empty? - = render 'shared/file_highlight', blob: blob - - else - .nothing-here-block Empty file diff --git a/app/views/projects/blob/diff.html.haml b/app/views/projects/blob/diff.html.haml deleted file mode 100644 index 5c79d0ef11f..00000000000 --- a/app/views/projects/blob/diff.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- if @lines.present? - - if @form.unfold? && @form.since != 1 && !@form.bottom? - %tr.line_holder{ id: @form.since } - = render "projects/diffs/match_line", {line: @match_line, - line_old: @form.since, line_new: @form.since, bottom: false} - - - @lines.each_with_index do |line, index| - - line_new = index + @form.since - - line_old = line_new - @form.offset - %tr.line_holder - %td.old_line.diff-line-num{data: {linenumber: line_old}} - = link_to raw(line_old), "#" - %td.new_line= link_to raw(line_new) , "#" - %td.line_content.noteable_line= line - - - if @form.unfold? && @form.bottom? && @form.to < @blob.loc - %tr.line_holder{ id: @form.to } - = render "projects/diffs/match_line", {line: @match_line, - line_old: @form.to, line_new: @form.to, bottom: true} diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml deleted file mode 100644 index 1f61a0b940c..00000000000 --- a/app/views/projects/blob/edit.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -.file-editor - %ul.nav.nav-tabs.js-edit-mode - %li.active - = link_to '#editor' do - %i.fa.fa-edit - Edit file - - %li - = link_to '#preview', 'data-preview-url' => namespace_project_preview_blob_path(@project.namespace, @project, @id) do - %i.fa.fa-eye - = editing_preview_title(@blob.name) - - = form_tag(namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: "form-horizontal") do - = render 'projects/blob/editor', ref: @ref, path: @path, blob_data: @blob.data - = render 'shared/commit_message_container', params: params, - placeholder: "Update #{@blob.name}" - - .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 'last_commit', @last_commit - = hidden_field_tag 'content', '', id: "file-content" - = hidden_field_tag 'from_merge_request_id', params[:from_merge_request_id] - = render 'projects/commit_button', ref: @ref, - cancel_path: @after_edit_path - -:javascript - blob = new EditBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", "#{@blob.language.try(:ace_mode)}") diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml deleted file mode 100644 index d78a01f6422..00000000000 --- a/app/views/projects/blob/new.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -%h3.page-title New file -.file-editor - = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file') 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" - - = hidden_field_tag 'content', '', id: 'file-content' - = render 'projects/commit_button', ref: @ref, - cancel_path: namespace_project_tree_path(@project.namespace, @project, @id) - -:javascript - blob = new NewBlob(gon.relative_url_root + "#{Gitlab::Application.config.assets.prefix}", null) diff --git a/app/views/projects/blob/preview.html.haml b/app/views/projects/blob/preview.html.haml deleted file mode 100644 index e7c3460ad78..00000000000 --- a/app/views/projects/blob/preview.html.haml +++ /dev/null @@ -1,25 +0,0 @@ -.diff-file - .diff-content - - if gitlab_markdown?(@blob.name) - .file-content.wiki - = preserve do - = markdown(@content) - - elsif markup?(@blob.name) - .file-content.wiki - = raw render_markup(@blob.name, @content) - - else - .file-content.code - - unless @diff_lines.empty? - %table.text-file - - @diff_lines.each do |line| - %tr.line_holder{ class: "#{line.type}" } - - if line.type == "match" - %td.old_line= "..." - %td.new_line= "..." - %td.line_content.matched= line.text - - else - %td.old_line - %td.new_line - %td.line_content{class: "#{line.type}"}= raw diff_line_content(line.text) - - else - .nothing-here-block No changes. diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml deleted file mode 100644 index 69167654c39..00000000000 --- a/app/views/projects/blob/show.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%div.tree-ref-holder - = render 'shared/ref_switcher', destination: 'blob', path: @path - -%div#tree-holder.tree-holder - = render 'blob', blob: @blob - -- if allowed_tree_edit? - = render 'projects/blob/remove' diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml deleted file mode 100644 index 4e7415be4aa..00000000000 --- a/app/views/projects/branches/_branch.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -- commit = @repository.commit(branch.target) -%li(class="js-branch-#{branch.name}") - %h4 - = 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 - - if @project.protected_branch? branch.name - %span.label.label-success - %i.fa.fa-lock - protected - .pull-right - - if can?(current_user, :download_code, @project) - = render 'projects/repositories/download_archive', ref: branch.name, btn_class: 'btn-grouped btn-group-xs' - - if branch.name != @repository.root_ref - = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: branch.name), class: 'btn btn-grouped btn-xs', method: :post, title: "Compare" do - %i.fa.fa-files-o - Compare - - - if can_remove_branch?(@project, branch.name) - = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), class: 'btn btn-grouped btn-xs btn-remove remove-row', method: :delete, data: { confirm: 'Removed branch cannot be restored. Are you sure?'}, remote: true do - %i.fa.fa-trash-o - - - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project - - else - %p - Cant find HEAD commit for this branch diff --git a/app/views/projects/branches/destroy.js.haml b/app/views/projects/branches/destroy.js.haml deleted file mode 100644 index 882a4d0c5e2..00000000000 --- a/app/views/projects/branches/destroy.js.haml +++ /dev/null @@ -1 +0,0 @@ -$('.js-totalbranch-count').html("#{@repository.branches.size}") diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml deleted file mode 100644 index a313ffcf272..00000000000 --- a/app/views/projects/branches/index.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -= render "projects/commits/head" -%h3.page-title - Branches - .pull-right - - if can? current_user, :push_code, @project - = link_to new_namespace_project_branch_path(@project.namespace, @project), class: 'btn btn-create' do - %i.fa.fa-add-sign - New branch -   - .dropdown.inline - %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} - %span.light sort: - - if @sort.present? - = @sort.humanize - - else - Name - %b.caret - %ul.dropdown-menu - %li - = link_to namespace_project_branches_path(sort: nil) do - Name - = link_to namespace_project_branches_path(sort: 'recently_updated') do - = sort_title_recently_updated - = link_to namespace_project_branches_path(sort: 'last_updated') do - = sort_title_oldest_updated -%hr -- unless @branches.empty? - %ul.bordered-list.top-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 deleted file mode 100644 index e5fcb98c68c..00000000000 --- a/app/views/projects/branches/new.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -- if @error - .alert.alert-danger - %button{ type: "button", class: "close", "data-dismiss" => "alert"} × - = @error -%h3.page-title - %i.fa.fa-code-fork - New branch -= form_tag namespace_project_branches_path, method: :post, id: "new-branch-form", class: "form-horizontal" do - .form-group - = label_tag :branch_name, 'Name for new branch', class: 'control-label' - .col-sm-10 - = text_field_tag :branch_name, params[:branch_name], placeholder: 'enter new branch name', required: true, tabindex: 1, class: 'form-control' - .form-group - = label_tag :ref, 'Create from', class: 'control-label' - .col-sm-10 - = text_field_tag :ref, params[:ref], placeholder: 'existing branch name, tag or commit SHA', required: true, tabindex: 2, class: 'form-control' - .form-actions - = button_tag 'Create branch', class: 'btn btn-create', tabindex: 3 - = link_to 'Cancel', namespace_project_branches_path(@project.namespace, @project), class: 'btn btn-cancel' - -:javascript - disableButtonIfAnyEmptyField($("#new-branch-form"), ".form-control", ".btn-create"); - var availableTags = #{@project.repository.ref_names.to_json}; - - $("#ref").autocomplete({ - source: availableTags, - minLength: 1 - }); diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml deleted file mode 100644 index 3f645b81397..00000000000 --- a/app/views/projects/commit/_commit_box.html.haml +++ /dev/null @@ -1,52 +0,0 @@ -.pull-right - %div - - if @notes_count > 0 - %span.btn.disabled.btn-grouped - %i.fa.fa-comment - = @notes_count - .pull-left.btn-group - %a.btn.btn-grouped.dropdown-toggle{ data: {toggle: :dropdown} } - %i.fa.fa-download - Download as - %span.caret - %ul.dropdown-menu - - unless @commit.parents.length > 1 - %li= link_to "Email Patches", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch) - %li= link_to "Plain Diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff) - = link_to namespace_project_tree_path(@project.namespace, @project, @commit), class: "btn btn-primary btn-grouped" do - %span Browse Code » - %div - -%p - %span.light Commit - = link_to @commit.id, namespace_project_commit_path(@project.namespace, @project, @commit) -.commit-info-row - %span.light Authored by - %strong - = commit_author_link(@commit, avatar: true, size: 24) - #{time_ago_with_tooltip(@commit.authored_date)} - -- if @commit.different_committer? - .commit-info-row - %span.light Committed by - %strong - = commit_committer_link(@commit, avatar: true, size: 24) - #{time_ago_with_tooltip(@commit.committed_date)} - -.commit-info-row - %span.cgray= pluralize(@commit.parents.count, "parent") - - @commit.parents.each do |parent| - = link_to parent.short_id, namespace_project_commit_path(@project.namespace, @project, parent) - -.commit-info-row.branches - %i.fa.fa-spinner.fa-spin - -.commit-box - %h3.commit-title - = gfm escape_once(@commit.title) - - if @commit.description.present? - %pre.commit-description - = preserve(gfm(escape_once(@commit.description))) - -:coffeescript - $(".commit-info-row.branches").load("#{branches_namespace_project_commit_path(@project.namespace, @project, @commit.id)}") diff --git a/app/views/projects/commit/branches.html.haml b/app/views/projects/commit/branches.html.haml deleted file mode 100644 index 82aac1fbd15..00000000000 --- a/app/views/projects/commit/branches.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -- if @branches.any? - %span - - branch = commit_default_branch(@project, @branches) - = link_to(namespace_project_tree_path(@project.namespace, @project, branch)) do - %span.label.label-gray - %i.fa.fa-code-fork - = branch - - if @branches.any? || @tags.any? - = link_to("#", class: "js-details-expand") do - %span.label.label-gray - \... - %span.js-details-content.hide - - if @branches.any? - = commit_branches_links(@project, @branches) - - if @tags.any? - = commit_tags_links(@project, @tags) diff --git a/app/views/projects/commit/show.html.haml b/app/views/projects/commit/show.html.haml deleted file mode 100644 index fc721067ed4..00000000000 --- a/app/views/projects/commit/show.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -= render "commit_box" -= render "projects/diffs/diffs", diffs: @diffs, project: @project -= render "projects/notes/notes_with_form" diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml deleted file mode 100644 index c6026f96804..00000000000 --- a/app/views/projects/commits/_commit.html.haml +++ /dev/null @@ -1,33 +0,0 @@ -%li.commit.js-toggle-container - .commit-row-title - %strong.str-truncated - = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" - - if commit.description? - %a.text-expander.js-toggle-button ... - - .pull-right - = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" - - .notes_count - - if @note_counts - - note_count = @note_counts.fetch(commit.id, 0) - - else - - notes = project.notes.for_commit_id(commit.id) - - note_count = notes.user.count - - - if note_count > 0 - %span.light - %i.fa.fa-comments - = note_count - - - if commit.description? - .commit-row-description.js-toggle-content - %pre - = preserve(gfm(escape_once(commit.description))) - - .commit-row-info - = commit_author_link(commit, avatar: true, size: 24) - authored - .committed_ago - #{time_ago_with_tooltip(commit.committed_date)}   - = link_to_browse_code(project, commit) diff --git a/app/views/projects/commits/_commit_list.html.haml b/app/views/projects/commits/_commit_list.html.haml deleted file mode 100644 index 2ee7d73bd20..00000000000 --- a/app/views/projects/commits/_commit_list.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -%div.panel.panel-default - .panel-heading - Commits (#{@commits.count}) - - if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE - %ul.well-list - - Commit.decorate(@commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE)).each do |commit| - = render "projects/commits/inline_commit", commit: commit, project: @project - %li.warning-row.unstyled - other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden to prevent performance issues. - - else - %ul.well-list= render Commit.decorate(@commits), project: @project diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml deleted file mode 100644 index 0cd9ce1f371..00000000000 --- a/app/views/projects/commits/_commits.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -- unless defined?(project) - - project = @project - -- @commits.group_by { |c| c.committed_date.to_date }.sort.reverse.each do |day, commits| - .row.commits-row - .col-md-2.hidden-xs.hidden-sm - %h5.commits-row-date - %i.fa.fa-calendar - %span= day.stamp("28 Aug, 2010") - .light - = pluralize(commits.count, 'commit') - .col-md-10.col-sm-12 - %ul.bordered-list - = render commits, project: project - %hr.lists-separator diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml deleted file mode 100644 index a714f5f79e0..00000000000 --- a/app/views/projects/commits/_head.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -%ul.nav.nav-tabs - = nav_link(controller: [:commit, :commits]) do - = link_to namespace_project_commits_path(@project.namespace, @project, @repository.root_ref) do - Commits - %span.badge= number_with_precision(@repository.commit_count, precision: 0, delimiter: ',') - = nav_link(controller: :compare) do - = link_to 'Compare', namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref) - - = nav_link(html_options: {class: branches_tab_class}) do - = link_to namespace_project_branches_path(@project.namespace, @project) do - Branches - %span.badge.js-totalbranch-count= @repository.branches.size - - = nav_link(controller: :tags) do - = link_to namespace_project_tags_path(@project.namespace, @project) do - Tags - %span.badge.js-totaltags-count= @repository.tags.length diff --git a/app/views/projects/commits/_inline_commit.html.haml b/app/views/projects/commits/_inline_commit.html.haml deleted file mode 100644 index c03bc3f9df9..00000000000 --- a/app/views/projects/commits/_inline_commit.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%li.commit.inline-commit - .commit-row-title - = 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" - .pull-right - #{time_ago_with_tooltip(commit.committed_date)} diff --git a/app/views/projects/commits/show.atom.builder b/app/views/projects/commits/show.atom.builder deleted file mode 100644 index 9211de72b1b..00000000000 --- a/app/views/projects/commits/show.atom.builder +++ /dev/null @@ -1,23 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "Recent commits to #{@project.name}:#{@ref}" - xml.link :href => namespace_project_commits_url(@project.namespace, @project, @ref, format: :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => namespace_project_commits_url(@project.namespace, @project, @ref), :rel => "alternate", :type => "text/html" - xml.id namespace_project_commits_url(@project.namespace, @project, @ref) - xml.updated @commits.first.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ") if @commits.any? - - @commits.each do |commit| - xml.entry do - xml.id namespace_project_commit_url(@project.namespace, @project, :id => commit.id) - xml.link :href => namespace_project_commit_url(@project.namespace, @project, :id => commit.id) - xml.title truncate(commit.title, :length => 80) - xml.updated commit.committed_date.strftime("%Y-%m-%dT%H:%M:%SZ") - xml.media :thumbnail, :width => "40", :height => "40", :url => avatar_icon(commit.author_email) - xml.author do |author| - xml.name commit.author_name - xml.email commit.author_email - end - xml.summary gfm(commit.description) - end - end -end diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml deleted file mode 100644 index 7ea855e1a4e..00000000000 --- a/app/views/projects/commits/show.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -= render "head" - -.tree-ref-holder - = render 'shared/ref_switcher', destination: 'commits' - -- if current_user && current_user.private_token - .commits-feed-holder.hidden-xs.hidden-sm - = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Feed", class: 'btn' do - %i.fa.fa-rss - Commits feed - -%ul.breadcrumb.repo-breadcrumb - = commits_breadcrumbs - -%div{id: dom_id(@project)} - #commits-list= render "commits", project: @project -.clear -= spinner - -- if @commits.count == @limit - :javascript - CommitsList.init("#{@ref}", #{@limit}); - diff --git a/app/views/projects/compare/_form.html.haml b/app/views/projects/compare/_form.html.haml deleted file mode 100644 index dfb1dded9ea..00000000000 --- a/app/views/projects/compare/_form.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -= form_tag namespace_project_compare_index_path(@project.namespace, @project), method: :post, class: 'form-inline' do - .clearfix.append-bottom-20 - - 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 - .input-group.inline-input-group - %span.input-group-addon from - = text_field_tag :from, params[:from], class: "form-control" - = "..." - .form-group - .input-group.inline-input-group - %span.input-group-addon to - = text_field_tag :to, params[:to], class: "form-control" -   - = button_tag "Compare", class: "btn btn-create commits-compare-btn" - - if compare_to_mr_button? - = link_to compare_mr_path, class: 'prepend-left-10 btn' do - %strong Make a merge request - - -:javascript - var availableTags = #{@project.repository.ref_names.to_json}; - - $("#from, #to").autocomplete({ - source: availableTags, - minLength: 1 - }); - - disableButtonIfEmptyField('#to', '.commits-compare-btn'); diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml deleted file mode 100644 index 4745bfbeaaf..00000000000 --- a/app/views/projects/compare/index.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -= render "projects/commits/head" - -%h3.page-title - Compare View -%p.slead - Compare branches, tags or commit ranges. - %br - Fill input field with commit id like - %code.label-branch 4eedf23 - or branch/tag name like - %code.label-branch master - and press compare button for the commits list and a code diff. - %br - Changes are shown from the version in the first field to the version in the second field. - -= render "form" diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml deleted file mode 100644 index 214b5bd337b..00000000000 --- a/app/views/projects/compare/show.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -= render "projects/commits/head" - -%h3.page-title - Compare View - -= render "form" - -- if @commits.present? - = render "projects/commits/commit_list" - = render "projects/diffs/diffs", diffs: @diffs, project: @project -- else - .light-well - .center - %h4 - There isn't anything to compare. - %p.slead - - if params[:to] == params[:from] - %span.label-branch #{params[:from]} - and - %span.label-branch #{params[:to]} - are the same. - - else - You'll need to use different branch names to get a valid comparison. diff --git a/app/views/projects/deploy_keys/_deploy_key.html.haml b/app/views/projects/deploy_keys/_deploy_key.html.haml deleted file mode 100644 index c577dfa8d55..00000000000 --- a/app/views/projects/deploy_keys/_deploy_key.html.haml +++ /dev/null @@ -1,36 +0,0 @@ -%li - .pull-right - - if @available_keys.include?(deploy_key) - = link_to enable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-sm', method: :put do - %i.fa.fa-plus - Enable - - else - - if deploy_key.destroyed_when_orphaned? && deploy_key.almost_orphaned? - = link_to 'Remove', disable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), data: { confirm: 'You are going to remove deploy key. Are you sure?'}, method: :put, class: "btn btn-remove delete-key btn-sm pull-right" - - else - = link_to disable_namespace_project_deploy_key_path(@project.namespace, @project, deploy_key), class: 'btn btn-sm', method: :put do - %i.fa.fa-power-off - Disable - - - if project = project_for_deploy_key(deploy_key) - = link_to namespace_project_deploy_key_path(project.namespace, project, deploy_key) do - %i.fa.fa-key - %strong= deploy_key.title - - else - %i.fa.fa-key - %strong= deploy_key.title - - - %p.light.prepend-top-10 - - if deploy_key.public? - %span.label.label-info.deploy-project-label - Public deploy key - - - deploy_key.projects.each do |project| - - if can?(current_user, :read_project, project) - %span.label.label-gray.deploy-project-label - = link_to namespace_project_path(project.namespace, project) do - = project.name_with_namespace - - %small.pull-right - Created #{time_ago_with_tooltip(deploy_key.created_at)} diff --git a/app/views/projects/deploy_keys/_form.html.haml b/app/views/projects/deploy_keys/_form.html.haml deleted file mode 100644 index 91675b3738e..00000000000 --- a/app/views/projects/deploy_keys/_form.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -%div - = form_for [@project.namespace.becomes(Namespace), @project, @key], url: namespace_project_deploy_keys_path, html: { class: 'deploy-key-form form-horizontal' } do |f| - -if @key.errors.any? - .alert.alert-danger - %ul - - @key.errors.full_messages.each do |msg| - %li= msg - - .form-group - = f.label :title, class: "control-label" - .col-sm-10= f.text_field :title, class: 'form-control' - .form-group - = f.label :key, class: "control-label" - .col-sm-10 - %p.light - Paste a machine public key here. Read more about how to generate it - = link_to "here", help_page_path("ssh", "README") - = f.text_area :key, class: "form-control thin_area", rows: 5 - - .form-actions - = f.submit 'Create', class: "btn-create btn" - = link_to "Cancel", namespace_project_deploy_keys_path(@project.namespace, @project), class: "btn btn-cancel" - diff --git a/app/views/projects/deploy_keys/index.html.haml b/app/views/projects/deploy_keys/index.html.haml deleted file mode 100644 index 472a13a8524..00000000000 --- a/app/views/projects/deploy_keys/index.html.haml +++ /dev/null @@ -1,41 +0,0 @@ -%h3.page-title - Deploy keys allow read-only access to the repository - - = link_to new_namespace_project_deploy_key_path(@project.namespace, @project), class: "btn btn-new pull-right", title: "New Deploy Key" do - %i.fa.fa-plus - New Deploy Key - -%p.light - Deploy keys can be used for CI, staging or production servers. - You can create a deploy key or add an existing one - -%hr.clearfix - -.row - .col-md-6.enabled-keys - %h5 - %strong.cgreen Enabled deploy keys - for this project - %ul.bordered-list - = render @enabled_keys - - if @enabled_keys.blank? - .light-well - .nothing-here-block Create a #{link_to 'new deploy key', new_namespace_project_deploy_key_path(@project.namespace, @project)} or add an existing one - .col-md-6.available-keys - - # If there are available public deploy keys but no available project deploy keys, only public deploy keys are shown. - - if @available_project_keys.any? || @available_public_keys.blank? - %h5 - %strong Deploy keys - from projects you have access to - %ul.bordered-list - = render @available_project_keys - - if @available_project_keys.blank? - .light-well - .nothing-here-block Deploy keys from projects you have access to will be displayed here - - - if @available_public_keys.any? - %h5 - %strong Public deploy keys - available to any project - %ul.bordered-list - = render @available_public_keys diff --git a/app/views/projects/deploy_keys/new.html.haml b/app/views/projects/deploy_keys/new.html.haml deleted file mode 100644 index 186d6b58972..00000000000 --- a/app/views/projects/deploy_keys/new.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title New Deploy key -%hr - -= render 'form' diff --git a/app/views/projects/deploy_keys/show.html.haml b/app/views/projects/deploy_keys/show.html.haml deleted file mode 100644 index 405b5bcd0d3..00000000000 --- a/app/views/projects/deploy_keys/show.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%h3.page-title - Deploy key: - = @key.title - %small - created on - = @key.created_at.stamp("Aug 21, 2011") -.back-link - = link_to namespace_project_deploy_keys_path(@project.namespace, @project) do - ← To keys list -%hr -%pre= @key.key -.pull-right - = link_to 'Remove', namespace_project_deploy_key_path(@project.namespace, @project, @key), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn-remove btn delete-key" diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml deleted file mode 100644 index b49aee504fe..00000000000 --- a/app/views/projects/diffs/_diffs.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -.prepend-top-20.append-bottom-20 - .pull-right - .btn-group - = inline_diff_btn - = parallel_diff_btn - = render 'projects/diffs/stats', diffs: diffs - -- if show_diff_size_warning?(diffs) - = render 'projects/diffs/warning', diffs: diffs - -.files - - safe_diff_files(diffs).each_with_index do |diff_file, index| - = render 'projects/diffs/file', diff_file: diff_file, i: index, project: project - -- if @diff_timeout - .alert.alert-danger - %h4 - Failed to collect changes - %p - Maybe diff is really big and operation failed with timeout. Try to get diff locally - -:coffeescript - $('.files .diff-header').stick_in_parent(offset_top: $('.navbar').height()) diff --git a/app/views/projects/diffs/_file.html.haml b/app/views/projects/diffs/_file.html.haml deleted file mode 100644 index 672a6635321..00000000000 --- a/app/views/projects/diffs/_file.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -- blob = project.repository.blob_for_diff(@commit, diff_file.diff) -- return unless blob -- blob_diff_path = namespace_project_blob_diff_path(project.namespace, project, tree_join(@commit.id, diff_file.file_path)) -.diff-file{id: "diff-#{i}", data: {blob_diff_path: blob_diff_path }} - .diff-header{id: "file-path-#{hexdigest(diff_file.new_path || diff_file.old_path)}"} - - if diff_file.deleted_file - %span="#{diff_file.old_path} deleted" - - .diff-btn-group - - if @commit.parent_ids.present? - = view_file_btn(@commit.parent_id, diff_file, project) - - elsif diff_file.diff.submodule? - - submodule_item = project.repository.blob_at(@commit.id, diff_file.file_path) - = submodule_link(submodule_item, @commit.id) - - else - %span - - if diff_file.renamed_file - = "#{diff_file.old_path} renamed to #{diff_file.new_path}" - - else - = diff_file.new_path - - if diff_file.mode_changed? - %span.file-mode= "#{diff_file.diff.a_mode} → #{diff_file.diff.b_mode}" - - .diff-btn-group - - if blob.text? - = link_to '#', class: 'js-toggle-diff-comments btn btn-sm active has_tooltip', title: "Toggle comments for this file" do - %i.fa.fa-comments -   - - - if @merge_request && @merge_request.source_project - = edit_blob_link(@merge_request.source_project, - @merge_request.source_branch, diff_file.new_path, - after: ' ', from_merge_request_id: @merge_request.id) - - = view_file_btn(@commit.id, diff_file, project) - - .diff-content.diff-wrap-lines - -# Skipp all non non-supported blobs - - return unless blob.respond_to?('text?') - - if blob.text? - - if params[:view] == 'parallel' - = render "projects/diffs/parallel_view", diff_file: diff_file, project: project, blob: blob, index: i - - else - = render "projects/diffs/text_file", diff_file: diff_file, index: i - - elsif blob.image? - - old_file = project.repository.prev_blob_for_diff(@commit, diff_file) - = render "projects/diffs/image", diff_file: diff_file, old_file: old_file, file: blob, index: i - - else - .nothing-here-block No preview for this file type - diff --git a/app/views/projects/diffs/_image.html.haml b/app/views/projects/diffs/_image.html.haml deleted file mode 100644 index 058b71b21f5..00000000000 --- a/app/views/projects/diffs/_image.html.haml +++ /dev/null @@ -1,64 +0,0 @@ -- diff = diff_file.diff -- if diff.renamed_file || diff.new_file || diff.deleted_file - .image - %span.wrap - .frame{class: image_diff_class(diff)} - %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} - %p.image-info= "#{number_to_human_size file.size}" -- else - .image - %div.two-up.view - %span.wrap - .frame.deleted - %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.parent_id, diff.old_path))} - %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"} - %p.image-info.hide - %span.meta-filesize= "#{number_to_human_size old_file.size}" - | - %b W: - %span.meta-width - | - %b H: - %span.meta-height - %span.wrap - .frame.added - %a{href: namespace_project_blob_path(@project.namespace, @project, tree_join(@commit.id, diff.new_path))} - %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} - %p.image-info.hide - %span.meta-filesize= "#{number_to_human_size file.size}" - | - %b W: - %span.meta-width - | - %b H: - %span.meta-height - - %div.swipe.view.hide - .swipe-frame - .frame.deleted - %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"} - .swipe-wrap - .frame.added - %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} - %span.swipe-bar - %span.top-handle - %span.bottom-handle - - %div.onion-skin.view.hide - .onion-skin-frame - .frame.deleted - %img{src: "data:#{old_file.mime_type};base64,#{Base64.encode64(old_file.data)}"} - .frame.added - %img{src: "data:#{file.mime_type};base64,#{Base64.encode64(file.data)}"} - .controls - .transparent - .drag-track - .dragger{:style => "left: 0px;"} - .opaque - - - .view-modes.hide - %ul.view-modes-menu - %li.two-up{data: {mode: 'two-up'}} 2-up - %li.swipe{data: {mode: 'swipe'}} Swipe - %li.onion-skin{data: {mode: 'onion-skin'}} Onion skin diff --git a/app/views/projects/diffs/_match_line.html.haml b/app/views/projects/diffs/_match_line.html.haml deleted file mode 100644 index 4ebe3379733..00000000000 --- a/app/views/projects/diffs/_match_line.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%td.old_line.diff-line-num.unfold.js-unfold{data: {linenumber: line_old}, - class: unfold_bottom_class(bottom)} - \... -%td.new_line.diff-line-num.unfold.js-unfold{data: {linenumber: line_new}, - class: unfold_bottom_class(bottom)} - \... -%td.line_content.matched= line diff --git a/app/views/projects/diffs/_match_line_parallel.html.haml b/app/views/projects/diffs/_match_line_parallel.html.haml deleted file mode 100644 index 815df16aa4a..00000000000 --- a/app/views/projects/diffs/_match_line_parallel.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%td.old_line - %td.line_content.parallel.matched= line -%td.new_line - %td.line_content.parallel.matched= line diff --git a/app/views/projects/diffs/_parallel_view.html.haml b/app/views/projects/diffs/_parallel_view.html.haml deleted file mode 100644 index 75f3a80f0d7..00000000000 --- a/app/views/projects/diffs/_parallel_view.html.haml +++ /dev/null @@ -1,41 +0,0 @@ -/ Side-by-side diff view -%div.text-file.diff-wrap-lines - %table - - parallel_diff(diff_file, index).each do |line| - - type_left = line[0] - - line_number_left = line[1] - - line_content_left = line[2] - - line_code_left = line[3] - - type_right = line[4] - - line_number_right = line[5] - - line_content_right = line[6] - - line_code_right = line[7] - - %tr.line_holder.parallel - - if type_left == 'match' - = render "projects/diffs/match_line_parallel", { line: line_content_left, - line_old: line_number_left, line_new: line_number_right } - - elsif type_left == 'old' || type_left.nil? - %td.old_line{id: line_code_left, class: "#{type_left}"} - = link_to raw(line_number_left), "##{line_code_left}", id: line_code_left - %td.line_content{class: "parallel noteable_line #{type_left} #{line_code_left}", "line_code" => line_code_left }= raw line_content_left - - - if type_right == 'new' - - new_line_class = 'new' - - new_line_code = line_code_right - - else - - new_line_class = nil - - new_line_code = line_code_left - - %td.new_line{id: new_line_code, class: "#{new_line_class}", data: { linenumber: line_number_right }} - = link_to raw(line_number_right), "##{new_line_code}", id: new_line_code - %td.line_content.parallel{class: "noteable_line #{new_line_class} #{new_line_code}", "line_code" => new_line_code}= raw line_content_right - - - if @reply_allowed - - comments_left, comments_right = organize_comments(type_left, type_right, line_code_left, line_code_right) - - if comments_left.present? || comments_right.present? - = render "projects/notes/diff_notes_with_reply_parallel", notes1: comments_left, notes2: comments_right - -- if diff_file.diff.diff.blank? && diff_file.mode_changed? - .file-mode-changed - File mode changed diff --git a/app/views/projects/diffs/_stats.html.haml b/app/views/projects/diffs/_stats.html.haml deleted file mode 100644 index 1625930615a..00000000000 --- a/app/views/projects/diffs/_stats.html.haml +++ /dev/null @@ -1,38 +0,0 @@ -.js-toggle-container - .commit-stat-summary - Showing - = link_to '#', class: 'js-toggle-button' do - %strong #{pluralize(diffs.count, "changed file")} - - if current_controller?(:commit) - - unless @commit.has_zero_stats? - with - %strong.cgreen #{@commit.stats.additions} additions - and - %strong.cred #{@commit.stats.deletions} deletions - .file-stats.js-toggle-content.hide - %ul.bordered-list - - diffs.each_with_index do |diff, i| - %li - - if diff.deleted_file - %span.deleted-file - %a{href: "#diff-#{i}"} - %i.fa.fa-minus - = diff.old_path - - elsif diff.renamed_file - %span.renamed-file - %a{href: "#diff-#{i}"} - %i.fa.fa-minus - = diff.old_path - → - = diff.new_path - - elsif diff.new_file - %span.new-file - %a{href: "#diff-#{i}"} - %i.fa.fa-plus - = diff.new_path - - else - %span.edit-file - %a{href: "#diff-#{i}"} - %i.fa.fa-adjust - = diff.new_path - diff --git a/app/views/projects/diffs/_text_file.html.haml b/app/views/projects/diffs/_text_file.html.haml deleted file mode 100644 index e6dfbfd6511..00000000000 --- a/app/views/projects/diffs/_text_file.html.haml +++ /dev/null @@ -1,36 +0,0 @@ -- too_big = diff_file.diff_lines.count > Commit::DIFF_SAFE_LINES -- if too_big - %a.supp_diff_link Changes suppressed. Click to show - -%table.text-file{class: "#{'hide' if too_big}"} - - last_line = 0 - - diff_file.diff_lines.each_with_index do |line, index| - - type = line.type - - last_line = line.new_pos - - line_code = generate_line_code(diff_file.file_path, line) - - line_old = line.old_pos - %tr.line_holder{ id: line_code, class: "#{type}" } - - if type == "match" - = render "projects/diffs/match_line", {line: line.text, - line_old: line_old, line_new: line.new_pos, bottom: false} - - else - %td.old_line - = link_to raw(type == "new" ? " " : line_old), "##{line_code}", id: line_code - - if @comments_allowed && can?(current_user, :write_note, @project) - = link_to_new_diff_note(line_code) - %td.new_line{data: {linenumber: line.new_pos}} - = link_to raw(type == "old" ? " " : line.new_pos) , "##{line_code}", id: line_code - %td.line_content{class: "noteable_line #{type} #{line_code}", "line_code" => line_code}= raw diff_line_content(line.text) - - - if @reply_allowed - - comments = @line_notes.select { |n| n.line_code == line_code && n.active? }.sort_by(&:created_at) - - unless comments.empty? - = render "projects/notes/diff_notes_with_reply", notes: comments, line: line.text - - - if last_line > 0 - = render "projects/diffs/match_line", {line: "", - line_old: last_line, line_new: last_line, bottom: true} - -- if diff_file.diff.blank? && diff_file.mode_changed? - .file-mode-changed - File mode changed diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml deleted file mode 100644 index 47abbba2eb2..00000000000 --- a/app/views/projects/diffs/_warning.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -.alert.alert-warning - %h4 - Too many changes. - .pull-right - - unless diff_hard_limit_enabled? - = link_to "Reload with full diff", url_for(params.merge(force_show_diff: true)), class: "btn btn-sm btn-warning" - - - if current_controller?(:commit) or current_controller?(:merge_requests) - - if current_controller?(:commit) - = link_to "Plain diff", namespace_project_commit_path(@project.namespace, @project, @commit, format: :diff), class: "btn btn-warning btn-sm" - = link_to "Email patch", namespace_project_commit_path(@project.namespace, @project, @commit, format: :patch), class: "btn btn-warning btn-sm" - - elsif @merge_request && @merge_request.persisted? - = link_to "Plain diff", merge_request_path(@merge_request, format: :diff), class: "btn btn-warning btn-sm" - = link_to "Email patch", merge_request_path(@merge_request, format: :patch), class: "btn btn-warning btn-sm" - %p - To preserve performance only - %strong #{allowed_diff_size} of #{diffs.size} - files are displayed. - diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml deleted file mode 100644 index fbf04847e48..00000000000 --- a/app/views/projects/edit.html.haml +++ /dev/null @@ -1,206 +0,0 @@ -.project-edit-container - .project-edit-errors - .project-edit-content - %div - %h3.page-title - Project settings - %hr - .panel-body - = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| - - %fieldset - .form-group.project_name_holder - = f.label :name, class: 'control-label' do - Project name - .col-sm-10 - = f.text_field :name, placeholder: "Example Project", class: "form-control", id: "project_name_edit" - - - .form-group - = f.label :description, class: 'control-label' do - Project description - %span.light (optional) - .col-sm-10 - = f.text_area :description, placeholder: "Awesome project", class: "form-control", rows: 3, maxlength: 250 - - - if @project.repository.exists? && @project.repository.branch_names.any? - .form-group - = f.label :default_branch, "Default Branch", class: 'control-label' - .col-sm-10= f.select(:default_branch, @repository.branch_names, {}, {class: 'select2 select-wide'}) - - - = render "visibility_level", f: f, visibility_level: @project.visibility_level, can_change_visibility_level: can?(current_user, :change_visibility_level, @project) - - .form-group - = f.label :tag_list, "Tags", class: 'control-label' - .col-sm-10 - = f.text_field :tag_list, maxlength: 2000, class: "form-control" - %p.help-block Separate tags with commas. - - %fieldset.features - %legend - Features: - .form-group - = f.label :issues_enabled, "Issues", class: 'control-label' - .col-sm-10 - .checkbox - = f.check_box :issues_enabled - %span.descr Lightweight issue tracking system for this project - - .form-group - = f.label :merge_requests_enabled, "Merge Requests", class: 'control-label' - .col-sm-10 - .checkbox - = f.check_box :merge_requests_enabled - %span.descr Submit changes to be merged upstream. - - .form-group - = f.label :wiki_enabled, "Wiki", class: 'control-label' - .col-sm-10 - .checkbox - = f.check_box :wiki_enabled - %span.descr Pages for project documentation - - .form-group - = f.label :snippets_enabled, "Snippets", class: 'control-label' - .col-sm-10 - .checkbox - = f.check_box :snippets_enabled - %span.descr Share code pastes with others out of git repository - - %fieldset.features - %legend - Project avatar: - .form-group - .col-sm-2 - .col-sm-10 - - if @project.avatar? - = project_icon("#{@project.namespace.to_param}/#{@project.to_param}", alt: '', class: 'avatar project-avatar s160') - %p.light - - if @project.avatar_in_git - Project avatar in repository: #{ @project.avatar_in_git } - %p.light - - if @project.avatar? - You can change your project avatar here - - else - You can upload a project avatar here - %a.choose-btn.btn.btn-sm.js-choose-project-avatar-button - %i.icon-paper-clip - %span Choose File ... -   - %span.file_name.js-avatar-filename File name... - = f.file_field :avatar, class: "js-project-avatar-input hidden" - .light The maximum file size allowed is 200KB. - - if @project.avatar? - %hr - = link_to 'Remove avatar', namespace_project_avatar_path(@project.namespace, @project), data: { confirm: "Project avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar" - - .form-actions - = f.submit 'Save changes', class: "btn btn-save" - - - - .danger-settings - - if can? current_user, :archive_project, @project - - if @project.archived? - .panel.panel-success - .panel-heading - Unarchive project - .panel-body - %p - Unarchiving the project will mark its repository as active. - %br - The project can be committed to. - %br - %strong Once active this project shows up in the search and on the dashboard. - = link_to 'Unarchive', unarchive_namespace_project_path(@project.namespace, @project), - data: { confirm: "Are you sure that you want to unarchive this project?\nWhen this project is unarchived it is active and can be committed to again." }, - method: :post, class: "btn btn-success" - - else - .panel.panel-warning - .panel-heading - Archive project - .panel-body - %p - Archiving the project will mark its repository as read-only. - %br - It is hidden from the dashboard and doesn't show up in searches. - %br - %strong Archived projects cannot be committed to! - = link_to 'Archive', archive_namespace_project_path(@project.namespace, @project), - data: { confirm: "Are you sure that you want to archive this project?\nAn archived project cannot be committed to." }, - method: :post, class: "btn btn-warning" - - else - .nothing-here-block Only the project owner can archive a project - - .panel.panel-default.panel.panel-warning - .panel-heading Rename repository - .errors-holder - .panel-body - = form_for([@project.namespace.becomes(Namespace), @project], html: { class: 'form-horizontal' }) do |f| - .form-group.project_name_holder - = f.label :name, class: 'control-label' do - Project name - .col-sm-9 - .form-group - = f.text_field :name, placeholder: "Example Project", class: "form-control" - .form-group - = f.label :path, class: 'control-label' do - %span Path - .col-sm-9 - .form-group - .input-group - .input-group-addon - #{URI.join(root_url, @project.namespace.path)}/ - = f.text_field :path, class: 'form-control' - %span.input-group-addon .git - %ul - %li Be careful. Renaming a project's repository can have unintended side effects. - %li You will need to update your local repositories to point to the new location. - .form-actions - = f.submit 'Rename', class: "btn btn-warning" - - - if can?(current_user, :change_namespace, @project) - .panel.panel-default.panel.panel-danger - .panel-heading Transfer project - .errors-holder - .panel-body - = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_namespace_project_path(@project.namespace, @project), method: :put, remote: true, html: { class: 'transfer-project form-horizontal' }) do |f| - .form-group - = label_tag :new_namespace_id, nil, class: 'control-label' do - %span Namespace - .col-sm-10 - .form-group - = select_tag :new_namespace_id, namespaces_options(@project.namespace_id), { prompt: 'Choose a project namespace', class: 'select2' } - %ul - %li Be careful. Changing the project's namespace can have unintended side effects. - %li You can only transfer the project to namespaces you manage. - %li You will need to update your local repositories to point to the new location. - .form-actions - = f.submit 'Transfer', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => transfer_project_message(@project) } - - else - .nothing-here-block Only the project owner can transfer a project - - - if can?(current_user, :remove_project, @project) - .panel.panel-default.panel.panel-danger - .panel-heading Remove project - .panel-body - = form_tag(namespace_project_path(@project.namespace, @project), method: :delete, html: { class: 'form-horizontal'}) do - %p - Removing the project will delete its repository and all related resources including issues, merge requests etc. - %br - %strong Removed projects cannot be restored! - - = link_to 'Remove project', '#', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => remove_project_message(@project) } - - else - .nothing-here-block Only project owner can remove a project - -.save-project-loader.hide - .center - %h2 - %i.fa.fa-spinner.fa-spin - Saving project. - %p Please wait a moment, this page will automatically refresh when ready. - - -= render 'shared/confirm_modal', phrase: @project.path diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml deleted file mode 100644 index 49806ceaa96..00000000000 --- a/app/views/projects/empty.html.haml +++ /dev/null @@ -1,49 +0,0 @@ -- if current_user && can?(current_user, :download_code, @project) - = render 'shared/no_ssh' - = render 'shared/no_password' - -= render "home_panel" - -.center.well - %h3 - The repository for this project is empty - %h4 - You can - = link_to namespace_project_new_blob_path(@project.namespace, @project, 'master'), class: 'btn btn-new btn-lg' do - add a file -  or do a push via the command line. - -%h4 - %strong Command line instructions -%div.git-empty - %fieldset - %legend Git global setup - %pre.dark - :preserve - git config --global user.name "#{git_user_name}" - git config --global user.email "#{git_user_email}" - - %fieldset - %legend Create a new repository - %pre.dark - :preserve - mkdir #{@project.path} - cd #{@project.path} - git init - touch README.md - git add README.md - git commit -m "first commit" - git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'clone')} - git push -u origin master - - %fieldset - %legend Push an existing Git repository - %pre.dark - :preserve - cd existing_git_repo - git remote add origin #{ content_tag(:span, default_url_to_repo, class: 'clone')} - git push -u origin master - -- if can? current_user, :remove_project, @project - .prepend-top-20 - = link_to 'Remove project', [@project.namespace.becomes(Namespace), @project], data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" diff --git a/app/views/projects/forks/error.html.haml b/app/views/projects/forks/error.html.haml deleted file mode 100644 index 8eb4f795971..00000000000 --- a/app/views/projects/forks/error.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -- if @forked_project && !@forked_project.saved? - .alert.alert-danger.alert-block - %h4 - %i.fa.fa-code-fork - Fork Error! - %p - You tried to fork - = link_to_project @project - but it failed for the following reason: - - - - if @forked_project && @forked_project.errors.any? - %p - – - = @forked_project.errors.full_messages.first - - %p - = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork", class: "btn" do - %i.fa.fa-code-fork - Try to Fork again diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml deleted file mode 100644 index 5a6c46f3208..00000000000 --- a/app/views/projects/forks/new.html.haml +++ /dev/null @@ -1,39 +0,0 @@ -%h3.page-title Fork project -%p.lead - Click to fork the project to a user or group -%hr - -.fork-namespaces - - @namespaces.in_groups_of(6, false) do |group| - .row - - group.each do |namespace| - .col-md-2.col-sm-3 - - if fork = namespace.find_fork_of(@project) - .thumbnail.fork-exists-thumbnail - = link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do - = image_tag namespace_icon(namespace, 200) - .caption - %h4=namespace.human_name - %p - = namespace.path - - else - .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) - .caption - %h4=namespace.human_name - %p - = namespace.path - - %p.light - Fork is a copy of a project repository. - %br - Forking a repository allows you to do changes without affecting the original project. - -.save-project-loader.hide - .center - %h2 - %i.fa.fa-spinner.fa-spin - Forking repository - %p Please wait a moment, this page will automatically refresh when ready. - diff --git a/app/views/projects/go_import.html.haml b/app/views/projects/go_import.html.haml deleted file mode 100644 index 87ac75a350f..00000000000 --- a/app/views/projects/go_import.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -!!! 5 -%html - %head - - web_url = [Gitlab.config.gitlab.url, @namespace, @id].join('/') - %meta{name: "go-import", content: "#{web_url.split('://')[1]} git #{web_url}.git"} diff --git a/app/views/projects/graphs/_head.html.haml b/app/views/projects/graphs/_head.html.haml deleted file mode 100644 index 9383df13305..00000000000 --- a/app/views/projects/graphs/_head.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%ul.nav.nav-tabs - = nav_link(action: :show) do - = link_to 'Contributors', namespace_project_graph_path - = nav_link(action: :commits) do - = link_to 'Commits', commits_namespace_project_graph_path diff --git a/app/views/projects/graphs/commits.html.haml b/app/views/projects/graphs/commits.html.haml deleted file mode 100644 index 78b4c1923dd..00000000000 --- a/app/views/projects/graphs/commits.html.haml +++ /dev/null @@ -1,85 +0,0 @@ -= render 'head' - -%p.lead - Commit statistics for - %strong #{@repository.root_ref} - #{@commits_graph.start_date.strftime('%b %d')} - #{@commits_graph.end_date.strftime('%b %d')} - -.row - .col-md-6 - %ul - %li - %p.lead - %strong #{@commits_graph.commits.size} - commits during - %strong #{@commits_graph.duration} - days - %li - %p.lead - Average - %strong #{@commits_graph.commit_per_day} - commits per day - %li - %p.lead - Contributed by - %strong #{@commits_graph.authors} - authors - .col-md-6 - %div - %p.slead - Commits per day of month - %canvas#month-chart{width: 800, height: 400} -.row - .col-md-6 - %div - %p.slead - Commits per day hour (UTC) - %canvas#hour-chart{width: 800, height: 400} - .col-md-6 - %div - %p.slead - Commits per weekday - %canvas#weekday-chart{width: 800, height: 400} - -: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} - }] - } - - ctx = $("#hour-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) - - 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} - }] - } - - 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}) diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml deleted file mode 100644 index e3d5094ddc5..00000000000 --- a/app/views/projects/graphs/show.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -= render 'head' -.loading-graph - .center - %h3.page-title - %i.fa.fa-spinner.fa-spin - Building repository graph. - %p.slead Please wait a moment, this page will automatically refresh when ready. - -.stat-graph.hide - .header.clearfix - %h3#date_header.page-title - %p.light - Commits to #{@project.default_branch}, excluding merge commits. Limited by 6,000 commits - %input#brush_change{:type => "hidden"} - .graphs - #contributors-master - #contributors.clearfix - %ol.contributors-list.clearfix - - - -:coffeescript - $.ajax - type: "GET", - url: location.href, - success: (data) -> - graph = new ContributorsStatGraph() - graph.init(data) - - $("#brush_change").change -> - graph.change_date_header() - graph.redraw_authors() - - $(".stat-graph").fadeIn(); - $(".loading-graph").hide(); - dataType: "json" - diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml deleted file mode 100644 index bbaddba31b9..00000000000 --- a/app/views/projects/hooks/index.html.haml +++ /dev/null @@ -1,68 +0,0 @@ -%h3.page-title - Web hooks - -%p.light - #{link_to "Web hooks ", help_page_path("web_hooks", "web_hooks"), class: "vlink"} can be - used for binding events when something is happening within the project. - -%hr.clearfix - -= form_for [@project.namespace.becomes(Namespace), @project, @hook], as: :hook, url: namespace_project_hooks_path(@project.namespace, @project), html: { class: 'form-horizontal' } do |f| - -if @hook.errors.any? - .alert.alert-danger - - @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-group - = f.label :url, "Trigger", class: 'control-label' - .col-sm-10 - %div - = f.check_box :push_events, class: 'pull-left' - .prepend-left-20 - = f.label :push_events, class: 'list-label' do - %strong Push events - %p.light - This url will be triggered by a push to the repository - %div - = f.check_box :tag_push_events, class: 'pull-left' - .prepend-left-20 - = f.label :tag_push_events, class: 'list-label' do - %strong Tag push events - %p.light - This url will be triggered when a new tag is pushed to the repository - %div - = f.check_box :issues_events, class: 'pull-left' - .prepend-left-20 - = f.label :issues_events, class: 'list-label' do - %strong Issues events - %p.light - This url will be triggered when an issue is created - %div - = f.check_box :merge_requests_events, class: 'pull-left' - .prepend-left-20 - = f.label :merge_requests_events, class: 'list-label' do - %strong Merge Request events - %p.light - This url will be triggered when a merge request is created - .form-actions - = f.submit "Add Web Hook", class: "btn btn-create" - --if @hooks.any? - .panel.panel-default - .panel-heading - Web hooks (#{@hooks.count}) - %ul.well-list - - @hooks.each do |hook| - %li - .pull-right - = link_to 'Test Hook', test_namespace_project_hook_path(@project.namespace, @project, hook), class: "btn btn-sm btn-grouped" - = link_to 'Remove', namespace_project_hook_path(@project.namespace, @project, hook), data: { confirm: 'Are you sure?'}, method: :delete, class: "btn btn-remove btn-sm btn-grouped" - .clearfix - %span.monospace= hook.url - %p - - %w(push_events tag_push_events issues_events merge_requests_events).each do |trigger| - - if hook.send(trigger) - %span.label.label-gray= trigger.titleize diff --git a/app/views/projects/imports/new.html.haml b/app/views/projects/imports/new.html.haml deleted file mode 100644 index 934b6b8c017..00000000000 --- a/app/views/projects/imports/new.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -%h3.page-title - - if @project.import_failed? - Import failed. Retry? - - else - Import repository - -%hr - -= form_for @project, url: namespace_project_import_path(@project.namespace, @project), method: :post, html: { class: 'form-horizontal' } do |f| - .form-group.import-url-data - = f.label :import_url, class: 'control-label' do - %span Import existing git repo - .col-sm-10 - = f.text_field :import_url, class: 'form-control', placeholder: 'https://github.com/randx/six.git' - .well.prepend-top-20 - This URL must be publicly accessible or you can add a username and password like this: https://username:password@gitlab.com/company/project.git. - %br - The import will time out after 4 minutes. For big repositories, use a clone/push combination. - For SVN repositories, check #{link_to "this migrating from SVN doc.", "http://doc.gitlab.com/ce/workflow/migrating_from_svn.html"} - .form-actions - = f.submit 'Start import', class: "btn btn-create", tabindex: 4 diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml deleted file mode 100644 index 2d1fdafed24..00000000000 --- a/app/views/projects/imports/show.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.save-project-loader - .center - %h2 - %i.fa.fa-spinner.fa-spin - Import in progress. - %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 deleted file mode 100644 index 288b48f4583..00000000000 --- a/app/views/projects/issues/_discussion.html.haml +++ /dev/null @@ -1,33 +0,0 @@ -- content_for :note_actions do - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen Issue', issue_path(@issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen js-note-target-reopen", title: 'Reopen Issue' - - else - = link_to 'Close Issue', issue_path(@issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close js-note-target-close", title: "Close Issue" -.row - %section.col-md-9 - .votes-holder.pull-right - #votes= render 'votes/votes_block', votable: @issue - .participants - %span= pluralize(@issue.participants(current_user).count, 'participant') - - @issue.participants(current_user).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{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @issue) - %hr - .context - = render partial: 'issue_context', locals: { issue: @issue } - - - if @issue.labels.any? - .issuable-context-title - %label Labels - .issue-show-labels - - @issue.labels.each do |label| - = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do - = render_colored_label(label) - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml deleted file mode 100644 index 7d7217eb2a8..00000000000 --- a/app/views/projects/issues/_form.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%div.issue-form-holder - %h3.page-title= @issue.new_record? ? "Create Issue" : "Edit Issue ##{@issue.iid}" - %hr - - = form_for [@project.namespace.becomes(Namespace), @project, @issue], html: { class: 'form-horizontal issue-form gfm-form' } do |f| - = render 'projects/issuable_form', f: f, issuable: @issue - -:javascript - $('.assign-to-me-link').on('click', function(e){ - $('#issue_assignee_id').val("#{current_user.id}").trigger("change"); - e.preventDefault(); - }); - - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml deleted file mode 100644 index 998e74d12cf..00000000000 --- a/app/views/projects/issues/_issue.html.haml +++ /dev/null @@ -1,52 +0,0 @@ -%li{ id: dom_id(issue), class: issue_css_classes(issue), url: issue_path(issue) } - - if controller.controller_name == 'issues' - .issue-check - = check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue", disabled: !can?(current_user, :modify_issue, issue) - - .issue-title - %span.str-truncated - = link_to_gfm issue.title, issue_path(issue), class: "row_title" - .pull-right.light - - if issue.closed? - %span - CLOSED - - note_count = issue.notes.user.count - - if note_count > 0 -   - %span - %i.fa.fa-comments - = note_count - - .issue-info - = link_to "##{issue.iid}", issue_path(issue), class: "light" - - if issue.assignee - assigned to #{link_to_member(@project, issue.assignee)} - - if issue.votes_count > 0 - = render 'votes/votes_inline', votable: issue - - if issue.milestone - %span - %i.fa.fa-clock-o - = issue.milestone.title - - if issue.tasks? - %span.task-status - = issue.task_status - - .pull-right.issue-updated-at - %small updated #{time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_update_ago')} - - .issue-labels - - issue.labels.each do |label| - = link_to namespace_project_issues_path(issue.project.namespace, issue.project, label_name: label.name) do - = render_colored_label(label) - - .issue-actions - - if can? current_user, :modify_issue, issue - - if issue.closed? - = link_to 'Reopen', issue_path(issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-sm btn-grouped reopen_issue btn-reopen", remote: true - - else - = link_to 'Close', issue_path(issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-sm btn-grouped close_issue btn-close", remote: true - = link_to edit_namespace_project_issue_path(issue.project.namespace, issue.project, issue), class: "btn btn-sm edit-issue-link btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - - diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml deleted file mode 100644 index 9228074d833..00000000000 --- a/app/views/projects/issues/_issue_context.html.haml +++ /dev/null @@ -1,46 +0,0 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @issue], remote: true, html: {class: 'edit-issue inline-update'} do |f| - %div.prepend-top-20 - .issuable-context-title - %label - Assignee: - - if issue.assignee - %strong= link_to_member(@project, @issue.assignee, size: 24) - - else - none - - if can?(current_user, :modify_issue, @issue) - = users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id, null_user: true, first_user: true) - - %div.prepend-top-20.clearfix - .issuable-context-title - %label - Milestone: - - if issue.milestone - %span.back-to-milestone - = link_to namespace_project_milestone_path(@project.namespace, @project, @issue.milestone) do - %strong - %i.fa.fa-clock-o - = @issue.milestone.title - - else - none - - if can?(current_user, :modify_issue, @issue) - = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) - = hidden_field_tag :issue_context - = f.submit class: 'btn' - - - if current_user - %div.prepend-top-20.clearfix - .issuable-context-title - %label - Subscription: - %button.btn.btn-block.subscribe-button - %i.fa.fa-eye - %span= @issue.subscribed?(current_user) ? "Unsubscribe" : "Subscribe" - - subscribtion_status = @issue.subscribed?(current_user) ? "subscribed" : "unsubscribed" - .subscription-status{"data-status" => subscribtion_status} - .description-block.unsubscribed{class: ( "hidden" if @issue.subscribed?(current_user) )} - You're not receiving notifications from this thread. - .description-block.subscribed{class: ( "hidden" unless @issue.subscribed?(current_user) )} - You're receiving notifications because you're subscribed to this thread. - -:coffeescript - new Subscription("#{toggle_subscription_namespace_project_issue_path(@issue.project.namespace, @project, @issue)}") diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml deleted file mode 100644 index 5d243adb5fe..00000000000 --- a/app/views/projects/issues/_issues.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -.panel.panel-default - %ul.well-list.issues-list - = render @issues - - if @issues.blank? - %li - .nothing-here-block No issues to show - -- if @issues.present? - .pull-right - %span.issue_counter #{@issues.total_count} - issues for this filter - - = paginate @issues, theme: "gitlab" diff --git a/app/views/projects/issues/edit.html.haml b/app/views/projects/issues/edit.html.haml deleted file mode 100644 index b1bc3ba0eba..00000000000 --- a/app/views/projects/issues/edit.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "form" diff --git a/app/views/projects/issues/index.atom.builder b/app/views/projects/issues/index.atom.builder deleted file mode 100644 index 126f2c07faa..00000000000 --- a/app/views/projects/issues/index.atom.builder +++ /dev/null @@ -1,12 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "#{@project.name} issues" - xml.link :href => namespace_project_issues_url(@project.namespace, @project, :atom), :rel => "self", :type => "application/atom+xml" - xml.link :href => namespace_project_issues_url(@project.namespace, @project), :rel => "alternate", :type => "text/html" - xml.id namespace_project_issues_url(@project.namespace, @project) - xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any? - - @issues.each do |issue| - issue_to_atom(xml, issue) - end -end diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml deleted file mode 100644 index d3c7ae24a75..00000000000 --- a/app/views/projects/issues/index.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -.append-bottom-10 - .pull-right - .pull-left - - if current_user - .hidden-xs.pull-left - = link_to namespace_project_issues_path(@project.namespace, @project, :atom, { private_token: current_user.private_token }), class: 'btn append-right-10' do - %i.fa.fa-rss - - = render 'shared/issuable_search_form', path: namespace_project_issues_path(@project.namespace, @project) - - - if can? current_user, :write_issue, @project - = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { assignee_id: params[:assignee_id], milestone_id: params[:milestone_id]}), class: "btn btn-new pull-left", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - = render 'shared/issuable_filter' - -.issues-holder - = render "issues" diff --git a/app/views/projects/issues/new.html.haml b/app/views/projects/issues/new.html.haml deleted file mode 100644 index b1bc3ba0eba..00000000000 --- a/app/views/projects/issues/new.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "form" diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml deleted file mode 100644 index bd28d8a1db2..00000000000 --- a/app/views/projects/issues/show.html.haml +++ /dev/null @@ -1,40 +0,0 @@ -.issue - .issue-details - %h4.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)} #{issue_timestamp(@issue)} - - .pull-right - - if can?(current_user, :write_issue, @project) - = link_to new_namespace_project_issue_path(@project.namespace, @project), class: "btn btn-grouped new-issue-link", title: "New Issue", id: "new_issue_link" do - %i.fa.fa-plus - New Issue - - if can?(current_user, :modify_issue, @issue) - - if @issue.closed? - = link_to 'Reopen', issue_path(@issue, issue: {state_event: :reopen }, status_only: true), method: :put, class: "btn btn-grouped btn-reopen" - - else - = link_to 'Close', issue_path(@issue, issue: {state_event: :close }, status_only: true), method: :put, class: "btn btn-grouped btn-close", title: "Close Issue" - - = link_to edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: "btn btn-grouped issuable-edit" do - %i.fa.fa-pencil-square-o - Edit - - %hr - %h2.issue-title - = gfm escape_once(@issue.title) - %div - - if @issue.description.present? - .description - .wiki - = preserve do - = markdown(@issue.description, parse_tasks: true) - - %hr - .issue-discussion - = render "projects/issues/discussion" diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml deleted file mode 100644 index 1d38662bff8..00000000000 --- a/app/views/projects/issues/update.js.haml +++ /dev/null @@ -1,17 +0,0 @@ -- if params[:status_only] - - if @issue.valid? - :plain - $("##{dom_id(@issue)}").fadeOut(); -- elsif params[:issue_context] - $('.context').html("#{escape_javascript(render partial: 'issue_context', locals: { issue: @issue })}"); - $('.context').effect('highlight'); - - if @issue.milestone - $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, namespace_project_milestone_path(@issue.project.namespace, @issue.project, @issue.milestone))}") - - else - $('.milestone-nav-link').html('') - - -$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}) -$('.edit-issue.inline-update input[type="submit"]').hide(); -new UsersSelect() -new Issue(); diff --git a/app/views/projects/labels/_label.html.haml b/app/views/projects/labels/_label.html.haml deleted file mode 100644 index 82829452862..00000000000 --- a/app/views/projects/labels/_label.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%li{id: dom_id(label)} - = render_colored_label(label) - .pull-right - %strong.append-right-20 - = link_to namespace_project_issues_path(@project.namespace, @project, label_name: label.name) do - = pluralize label.open_issues_count, 'open issue' - - - if can? current_user, :admin_label, @project - = link_to 'Edit', edit_namespace_project_label_path(@project.namespace, @project, label), class: 'btn' - = link_to 'Remove', namespace_project_label_path(@project.namespace, @project, label), class: 'btn btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} diff --git a/app/views/projects/labels/destroy.js.haml b/app/views/projects/labels/destroy.js.haml deleted file mode 100644 index 1b4c83ab097..00000000000 --- a/app/views/projects/labels/destroy.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -- if @project.labels.size == 0 - $('.labels').load(document.URL + ' .light-well').hide().fadeIn(1000) diff --git a/app/views/projects/labels/edit.html.haml b/app/views/projects/labels/edit.html.haml deleted file mode 100644 index e003d1dfe7f..00000000000 --- a/app/views/projects/labels/edit.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%h3 - Edit label - %span.light #{@label.name} -.back-link - = link_to namespace_project_labels_path(@project.namespace, @project) do - ← To labels list -%hr -= render 'form' diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml deleted file mode 100644 index 0700e72d39c..00000000000 --- a/app/views/projects/labels/index.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -- 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 - -.labels - - if @labels.present? - %ul.bordered-list.manage-labels-list - = render @labels - = paginate @labels, theme: 'gitlab' - - else - .light-well - .nothing-here-block Create first label or #{link_to 'generate', generate_namespace_project_labels_path(@project.namespace, @project), method: :post} default set of labels diff --git a/app/views/projects/labels/new.html.haml b/app/views/projects/labels/new.html.haml deleted file mode 100644 index 0683ed5d4fb..00000000000 --- a/app/views/projects/labels/new.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%h3 New label -.back-link - = link_to namespace_project_labels_path(@project.namespace, @project) do - ← To labels list -%hr -= render 'form' diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml deleted file mode 100644 index eb72eaabd8b..00000000000 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -- content_for :note_actions do - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - = link_to 'Close', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request" - - if @merge_request.closed? - = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen 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 partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } - - - if @merge_request.labels.any? - .issuable-context-title - %label Labels - .merge-request-show-labels - - @merge_request.labels.each do |label| - = link_to namespace_project_merge_requests_path(@project.namespace, @project, label_name: label.name) do - = render_colored_label(label) - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml deleted file mode 100644 index 1c7160bce5f..00000000000 --- a/app/views/projects/merge_requests/_form.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: 'merge-request-form form-horizontal gfm-form' } do |f| - .merge-request-form-info - = render 'projects/issuable_form', f: f, issuable: @merge_request - -:javascript - disableButtonIfEmptyField("#merge_request_title", ".btn-save"); - $('.assign-to-me-link').on('click', function(e){ - $('#merge_request_assignee_id').val("#{current_user.id}").trigger("change"); - e.preventDefault(); - }); - - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; diff --git a/app/views/projects/merge_requests/_head.html.haml b/app/views/projects/merge_requests/_head.html.haml deleted file mode 100644 index 19e4dab874b..00000000000 --- a/app/views/projects/merge_requests/_head.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -.top-tabs - = link_to namespace_project_merge_requests_path(@project.namespace, @project), class: "tab #{'active' if current_page?(namespace_project_merge_requests_path(@project.namespace, @project)) }" do - %span - Merge Requests - diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml deleted file mode 100644 index 4f30d1e69f7..00000000000 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ /dev/null @@ -1,48 +0,0 @@ -%li{ class: mr_css_classes(merge_request) } - .merge-request-title - %span.str-truncated - = link_to_gfm merge_request.title, merge_request_path(merge_request), class: "row_title" - .pull-right.light - - if merge_request.merged? - %span - %i.fa.fa-check - MERGED - - elsif merge_request.closed? - %span - %i.fa.fa-close - 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 note_count > 0 -   - %span - %i.fa.fa-comments - = note_count - .merge-request-info - = link_to "##{merge_request.iid}", merge_request_path(merge_request), class: "light" - - if merge_request.assignee - assigned to #{link_to_member(merge_request.source_project, merge_request.assignee)} - - else - Unassigned - - if merge_request.votes_count > 0 - = render 'votes/votes_inline', votable: merge_request - - if merge_request.milestone_id? - %span - %i.fa.fa-clock-o - = merge_request.milestone.title - - if merge_request.tasks? - %span.task-status - = merge_request.task_status - - - .pull-right.hidden-xs - %small updated #{time_ago_with_tooltip(merge_request.updated_at, 'bottom', 'merge_request_updated_ago')} - - .merge-request-labels - - merge_request.labels.each do |label| - = link_to namespace_project_merge_requests_path(merge_request.project.namespace, merge_request.project, label_name: label.name) do - = render_colored_label(label) diff --git a/app/views/projects/merge_requests/_merge_requests.html.haml b/app/views/projects/merge_requests/_merge_requests.html.haml deleted file mode 100644 index b8a0ca9a42f..00000000000 --- a/app/views/projects/merge_requests/_merge_requests.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -.panel.panel-default - %ul.well-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 - %span.cgray.pull-right #{@merge_requests.total_count} merge requests for this filter - - = paginate @merge_requests, theme: "gitlab" - diff --git a/app/views/projects/merge_requests/_new_compare.html.haml b/app/views/projects/merge_requests/_new_compare.html.haml deleted file mode 100644 index 17e76059fdb..00000000000 --- a/app/views/projects/merge_requests/_new_compare.html.haml +++ /dev/null @@ -1,89 +0,0 @@ -%h3.page-title Compare branches for new Merge Request -%hr - -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: new_namespace_project_merge_request_path(@project.namespace, @project), method: :get, html: { class: "merge-request-form form-inline" } do |f| - .hide.alert.alert-danger.mr-compare-errors - .merge-request-branches.row - .col-md-6 - .panel.panel-default - .panel-heading - %strong Source branch - .panel-body - = f.select(:source_project_id, [[@merge_request.source_project_path,@merge_request.source_project.id]] , {}, { class: 'source_project select2 span3', disabled: @merge_request.persisted? }) -   - = f.select(:source_branch, @merge_request.source_branches, { include_blank: "Select branch" }, {class: 'source_branch select2 span2'}) - .panel-footer - .mr_source_commit - - .col-md-6 - .panel.panel-default - .panel-heading - %strong Target branch - .panel-body - - projects = @project.forked_from_project.nil? ? [@project] : [@project, @project.forked_from_project] - = f.select(:target_project_id, options_from_collection_for_select(projects, 'id', 'path_with_namespace', f.object.target_project_id), {}, { class: 'target_project select2 span3', disabled: @merge_request.persisted? }) -   - = f.select(:target_branch, @merge_request.target_branches, { include_blank: "Select branch" }, {class: 'target_branch select2 span2'}) - .panel-footer - .mr_target_commit - - - if @merge_request.errors.any? - .alert.alert-danger - - @merge_request.errors.full_messages.each do |msg| - %div= msg - - - elsif @merge_request.source_branch.present? && @merge_request.target_branch.present? - - 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. - - else - .light-well - .center - %h4 - There isn't anything to merge. - %p.slead - - if @merge_request.source_branch == @merge_request.target_branch - You'll need to use different branch names to get a valid comparison. - - else - %span.label-branch #{@merge_request.source_branch} - and - %span.label-branch #{@merge_request.target_branch} - are the same. - - - %hr - = f.submit 'Compare branches', class: "btn btn-primary mr-compare-btn" - -:javascript - var source_branch = $("#merge_request_source_branch") - , target_branch = $("#merge_request_target_branch") - , target_project = $("#merge_request_target_project_id"); - - $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: source_branch.val() }); - $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: target_branch.val() }); - - target_project.on("change", function() { - $.get("#{update_branches_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: $(this).val() }); - }); - source_branch.on("change", function() { - $.get("#{branch_from_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {ref: $(this).val() }); - $(".mr-compare-errors").fadeOut(); - $(".mr-compare-btn").enable(); - }); - target_branch.on("change", function() { - $.get("#{branch_to_namespace_project_merge_requests_path(@source_project.namespace, @source_project)}", {target_project_id: target_project.val(),ref: $(this).val() }); - $(".mr-compare-errors").fadeOut(); - $(".mr-compare-btn").enable(); - }); - - -:coffeescript - - $(".merge-request-form").on 'submit', -> - if $("#merge_request_source_branch").val() is "" or $('#merge_request_target_branch').val() is "" - $(".mr-compare-errors").html("You must select source and target branch to proceed") - $(".mr-compare-errors").fadeIn() - event.preventDefault() - return - diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml deleted file mode 100644 index d986ce67c0c..00000000000 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ /dev/null @@ -1,123 +0,0 @@ -%h3.page-title - New merge request -%p.slead - From - %strong.label-branch #{@merge_request.source_project_namespace}:#{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} - - %span.pull-right - = link_to 'Change branches', new_namespace_project_merge_request_path(@project.namespace, @project) - -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: "merge-request-form form-horizontal gfm-form" } do |f| - .merge-request-form-info - .form-group - = f.label :title, class: 'control-label' do - %strong Title * - .col-sm-10 - = f.text_field :title, maxlength: 255, autofocus: true, class: 'form-control pad js-gfm-input', required: true - .form-group.issuable-description - = f.label :description, 'Description', class: 'control-label' - .col-sm-10 - = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } do - = render 'projects/zen', f: f, attr: :description, classes: 'description form-control' - - .col-sm-12-hint - .pull-left - Parsed with - #{link_to 'Gitlab Flavored Markdown', help_page_path('markdown', 'markdown'), target: '_blank'}. - .pull-right - Attach files by dragging & dropping - or #{link_to 'selecting them', '#', class: 'markdown-selector'}. - - .clearfix - .error-alert - %hr - .form-group - .issue-assignee - = f.label :assignee_id, class: 'control-label' do - %i.fa.fa-user - Assign to - .col-sm-10 - = users_select_tag('merge_request[assignee_id]', placeholder: 'Select a user', class: 'custom-form-control', selected: @merge_request.assignee_id, project_id: @merge_request.target_project_id) -   - = link_to 'Assign to me', '#', class: 'btn assign-to-me-link' - .form-group - .issue-milestone - = f.label :milestone_id, class: 'control-label' do - %i.fa.fa-clock-o - Milestone - .col-sm-10 - - if milestone_options(@merge_request).present? - = f.select(:milestone_id, milestone_options(@merge_request), {include_blank: 'Select milestone'}, {class: 'select2'}) - - else - %span.light No open milestones available. -   - - if can? current_user, :admin_milestone, @merge_request.target_project - = link_to 'Create new milestone', new_namespace_project_milestone_path(@merge_request.target_project.namespace, @merge_request.target_project), target: :blank - .form-group - = f.label :label_ids, class: 'control-label' do - %i.fa.fa-tag - Labels - .col-sm-10 - - if @merge_request.target_project.labels.any? - = f.collection_select :label_ids, @merge_request.target_project.labels.all, :id, :name, {selected: @merge_request.label_ids}, multiple: true, class: 'select2' - - else - %span.light No labels yet. -   - - if can? current_user, :admin_label, @merge_request.target_project - = link_to 'Create new label', new_namespace_project_label_path(@merge_request.target_project.namespace, @merge_request.target_project), target: :blank - - .form-actions - - if guide_url = contribution_guide_url(@target_project) - %p - Please review the - %strong #{link_to 'guidelines for contribution', guide_url} - to this repository. - = f.hidden_field :source_project_id - = f.hidden_field :source_branch - = f.hidden_field :target_project_id - = f.hidden_field :target_branch - = f.submit 'Submit merge request', class: 'btn btn-create' - -.mr-compare.merge-request - %ul.nav.nav-tabs.merge-request-tabs - %li.commits-tab{data: {action: 'commits'}} - = link_to url_for(params) do - %i.fa.fa-history - Commits - %span.badge= @commits.size - %li.diffs-tab{data: {action: 'diffs'}} - = link_to url_for(params) do - %i.fa.fa-list-alt - Changes - %span.badge= @diffs.size - - .commits.tab-content - = render "projects/commits/commits", project: @project - .diffs.tab-content - - if @diffs.present? - = render "projects/diffs/diffs", diffs: @diffs, project: @project - - elsif @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE - .alert.alert-danger - %h4 This comparison includes more than #{MergeRequestDiff::COMMITS_SAFE_SIZE} commits. - %p To preserve performance the line changes are not shown. - - else - .alert.alert-danger - %h4 This comparison includes a huge diff. - %p To preserve performance the line changes are not shown. - -:javascript - $('.assign-to-me-link').on('click', function(e){ - $('#merge_request_assignee_id').val("#{current_user.id}").trigger("change"); - e.preventDefault(); - }); - - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; - -:javascript - var merge_request - merge_request = new MergeRequest({ - action: 'commits' - }); - diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml deleted file mode 100644 index a74aede4e6b..00000000000 --- a/app/views/projects/merge_requests/_show.html.haml +++ /dev/null @@ -1,77 +0,0 @@ -.merge-request{'data-url' => merge_request_path(@merge_request)} - .merge-request-details - = render "projects/merge_requests/show/mr_title" - %hr - = render "projects/merge_requests/show/mr_box" - %hr - .append-bottom-20 - .slead - %span From - - if @merge_request.for_fork? - %strong.label-branch< - - if @merge_request.source_project - = link_to @merge_request.source_project_namespace, namespace_project_path(@merge_request.source_project.namespace, @merge_request.source_project) - - else - \ #{@merge_request.source_project_namespace} - \:#{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_project_namespace}:#{@merge_request.target_branch} - - else - %strong.label-branch #{@merge_request.source_branch} - %span into - %strong.label-branch #{@merge_request.target_branch} - - if @merge_request.open? - %span.pull-right - .btn-group - %a.btn.dropdown-toggle{ data: {toggle: :dropdown} } - %i.fa.fa-download - Download as - %span.caret - %ul.dropdown-menu - %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) - %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) - - = render "projects/merge_requests/show/how_to_merge" - = render "projects/merge_requests/show/state_widget" - - - if @commits.present? - %ul.nav.nav-tabs.merge-request-tabs - %li.notes-tab{data: {action: 'notes'}} - = link_to merge_request_path(@merge_request) do - %i.fa.fa-comments - Discussion - %span.badge= @merge_request.mr_and_commit_notes.user.count - %li.commits-tab{data: {action: 'commits'}} - = link_to merge_request_path(@merge_request), title: 'Commits' do - %i.fa.fa-history - Commits - %span.badge= @commits.size - %li.diffs-tab{data: {action: 'diffs'}} - = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) do - %i.fa.fa-list-alt - Changes - %span.badge= @merge_request.diffs.size - - .notes.tab-content.voting_notes#notes{ class: (controller.action_name == 'show') ? "" : "hide" } - = render "projects/merge_requests/discussion" - .commits.tab-content - = render "projects/merge_requests/show/commits" - .diffs.tab-content - - if current_page?(action: 'diffs') - = render "projects/merge_requests/show/diffs" - - .mr-loading-status - = spinner - - -:javascript - var merge_request; - - merge_request = new MergeRequest({ - url_to_automerge_check: "#{automerge_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.merge_status_name}", - action: "#{controller.action_name}" - }); diff --git a/app/views/projects/merge_requests/automerge.js.haml b/app/views/projects/merge_requests/automerge.js.haml deleted file mode 100644 index a53cbb150a4..00000000000 --- a/app/views/projects/merge_requests/automerge.js.haml +++ /dev/null @@ -1,6 +0,0 @@ --if @status - :plain - merge_request.mergeInProgress(); --else - :plain - merge_request.alreadyOrCannotBeMerged() diff --git a/app/views/projects/merge_requests/branch_from.js.haml b/app/views/projects/merge_requests/branch_from.js.haml deleted file mode 100644 index 8372afa61b5..00000000000 --- a/app/views/projects/merge_requests/branch_from.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $(".mr_source_commit").html("#{commit_to_html(@commit, @source_project, false)}"); diff --git a/app/views/projects/merge_requests/branch_to.js.haml b/app/views/projects/merge_requests/branch_to.js.haml deleted file mode 100644 index f7ede0ded53..00000000000 --- a/app/views/projects/merge_requests/branch_to.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $(".mr_target_commit").html("#{commit_to_html(@commit, @target_project, false)}"); diff --git a/app/views/projects/merge_requests/diffs.html.haml b/app/views/projects/merge_requests/diffs.html.haml deleted file mode 100644 index 2a5b8b1441e..00000000000 --- a/app/views/projects/merge_requests/diffs.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "show" diff --git a/app/views/projects/merge_requests/edit.html.haml b/app/views/projects/merge_requests/edit.html.haml deleted file mode 100644 index 839c63986ab..00000000000 --- a/app/views/projects/merge_requests/edit.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - = "Edit merge request ##{@merge_request.iid}" -%hr -= render 'form' diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml deleted file mode 100644 index d7992bdd19e..00000000000 --- a/app/views/projects/merge_requests/index.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.append-bottom-10 - .pull-right - = render 'shared/issuable_search_form', path: namespace_project_merge_requests_path(@project.namespace, @project) - - - if can? current_user, :write_merge_request, @project - = link_to new_namespace_project_merge_request_path(@project.namespace, @project), class: "btn btn-new pull-left", title: "New Merge Request" do - %i.fa.fa-plus - New Merge Request - = render 'shared/issuable_filter' -.merge-requests-holder - = render 'merge_requests' diff --git a/app/views/projects/merge_requests/invalid.html.haml b/app/views/projects/merge_requests/invalid.html.haml deleted file mode 100644 index b9c466657de..00000000000 --- a/app/views/projects/merge_requests/invalid.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -.merge-request - = render "projects/merge_requests/show/mr_title" - = render "projects/merge_requests/show/mr_box" - - .alert.alert-danger - %p - We cannot render this merge request properly because - - if @merge_request.for_fork? && !@merge_request.source_project - fork project was removed - - elsif !@merge_request.source_branch_exists? - %span.label.label-inverse= @merge_request.source_branch - does not exist in - %span.label.label-info= @merge_request.source_project_path - - elsif !@merge_request.target_branch_exists? - %span.label.label-inverse= @merge_request.target_branch - does not exist in - %span.label.label-info= @merge_request.target_project_path - - else - of internal error - - %strong - Please close Merge Request or change branches with existing one - diff --git a/app/views/projects/merge_requests/new.html.haml b/app/views/projects/merge_requests/new.html.haml deleted file mode 100644 index 4756903d0e0..00000000000 --- a/app/views/projects/merge_requests/new.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- if @merge_request.can_be_created - = render 'new_submit' -- else - = render 'new_compare' diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml deleted file mode 100644 index 2a5b8b1441e..00000000000 --- a/app/views/projects/merge_requests/show.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "show" diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml deleted file mode 100644 index 3b7f283daf0..00000000000 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "projects/commits/commits", project: @merge_request.source_project diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml deleted file mode 100644 index 105562fb05e..00000000000 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ /dev/null @@ -1,48 +0,0 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], remote: true, html: {class: 'edit-merge_request inline-update'} do |f| - %div.prepend-top-20 - .issuable-context-title - %label - Assignee: - - if @merge_request.assignee - %strong= link_to_member(@project, @merge_request.assignee, size: 24) - - else - none - .issuable-context-selectbox - - if can?(current_user, :modify_merge_request, @merge_request) - = users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id, null_user: true) - - %div.prepend-top-20.clearfix - .issuable-context-title - %label - Milestone: - - if @merge_request.milestone - %span.back-to-milestone - = link_to namespace_project_milestone_path(@project.namespace, @project, @merge_request.milestone) do - %strong - %i.fa.fa-clock-o - = @merge_request.milestone.title - - else - none - .issuable-context-selectbox - - if can?(current_user, :modify_merge_request, @merge_request) - = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) - = hidden_field_tag :merge_request_context - = f.submit class: 'btn' - - - if current_user - %div.prepend-top-20.clearfix - .issuable-context-title - %label - Subscription: - %button.btn.btn-block.subscribe-button - %i.fa.fa-eye - %span= @merge_request.subscribed?(current_user) ? "Unsubscribe" : "Subscribe" - - subscribtion_status = @merge_request.subscribed?(current_user) ? "subscribed" : "unsubscribed" - .subscription-status{"data-status" => subscribtion_status} - .description-block.unsubscribed{class: ( "hidden" if @merge_request.subscribed?(current_user) )} - You're not receiving notifications from this thread. - .description-block.subscribed{class: ( "hidden" unless @merge_request.subscribed?(current_user) )} - You're receiving notifications because you're subscribed to this thread. - -:coffeescript - new Subscription("#{toggle_subscription_namespace_project_merge_request_path(@merge_request.project.namespace, @project, @merge_request)}") diff --git a/app/views/projects/merge_requests/show/_diffs.html.haml b/app/views/projects/merge_requests/show/_diffs.html.haml deleted file mode 100644 index 786b5f39063..00000000000 --- a/app/views/projects/merge_requests/show/_diffs.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -- if @merge_request_diff.collected? - = render "projects/diffs/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project -- elsif @merge_request_diff.empty? - .nothing-here-block Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch} -- else - .alert.alert-warning - %h4 - Changes view for this comparison is extremely large. - %p - You can - = link_to "download it", merge_request_path(@merge_request, format: :diff), class: "vlink" - instead. diff --git a/app/views/projects/merge_requests/show/_how_to_merge.html.haml b/app/views/projects/merge_requests/show/_how_to_merge.html.haml deleted file mode 100644 index 63db4b30968..00000000000 --- a/app/views/projects/merge_requests/show/_how_to_merge.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -%div#modal_merge_info.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3 How to merge - .modal-body - - if @merge_request.for_fork? - - source_remote = @merge_request.source_project.namespace.nil? ? "source" :@merge_request.source_project.namespace.path - - target_remote = @merge_request.target_project.namespace.nil? ? "target" :@merge_request.target_project.namespace.path - %p - %strong Step 1. - Fetch the code and create a new branch pointing to it - %pre.dark - :preserve - git fetch #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch} - git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} FETCH_HEAD - %p - %strong Step 2. - Merge the branch and push the changes to GitLab - %pre.dark - :preserve - git checkout #{@merge_request.target_branch} - git merge --no-ff #{@merge_request.source_project_path}-#{@merge_request.source_branch} - git push origin #{@merge_request.target_branch} - - else - %p - %strong Step 1. - Update the repo and checkout the branch we are going to merge - %pre.dark - :preserve - git fetch origin - git checkout -b #{@merge_request.source_branch} origin/#{@merge_request.source_branch} - %p - %strong Step 2. - Merge the branch and push the changes to GitLab - %pre.dark - :preserve - git checkout #{@merge_request.target_branch} - git merge --no-ff #{@merge_request.source_branch} - git push origin #{@merge_request.target_branch} - - -:javascript - $(function(){ - var modal = $('#modal_merge_info').modal({modal: true, show:false}); - $('.how_to_merge_link').bind("click", function(){ - modal.show(); - }); - $('.modal-header .close').bind("click", function(){ - modal.hide(); - }) - }) diff --git a/app/views/projects/merge_requests/show/_mr_accept.html.haml b/app/views/projects/merge_requests/show/_mr_accept.html.haml deleted file mode 100644 index 9f51f84d400..00000000000 --- a/app/views/projects/merge_requests/show/_mr_accept.html.haml +++ /dev/null @@ -1,74 +0,0 @@ -- unless @allowed_to_merge - - if @project.archived? - %p - %strong Archived projects cannot be committed to! - - else - .automerge_widget.cannot_be_merged.hide - %strong This can't be merged automatically, even if it could be merged you don't have the permission to do so. - .automerge_widget.can_be_merged.hide - %strong This can be merged automatically but you don't have the permission to do so. - - -- if @show_merge_controls - .automerge_widget.can_be_merged.hide - .clearfix - = form_for [:automerge, @project.namespace.becomes(Namespace), @project, @merge_request], remote: true, method: :post do |f| - .accept-merge-holder.clearfix.js-toggle-container - .accept-action - = f.submit "Accept Merge Request", class: "btn btn-create accept_merge_request" - - if can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && !@merge_request.for_fork? - .accept-control.checkbox - = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do - = check_box_tag :should_remove_source_branch - Remove source-branch - .accept-control - = link_to "#", class: "modify-merge-commit-link js-toggle-button", title: "Modify merge commit message" do - %i.fa.fa-edit - Modify commit message - .js-toggle-content.hide.prepend-top-20 - = render 'shared/commit_message_container', params: params, - text: @merge_request.merge_commit_message, - rows: 14, hint: true - - %br - .light - If you still want to merge this request manually - use - %strong - = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" - - - .automerge_widget.no_satellite.hide - %p - %span - %strong This repository does not have satellite. Ask an administrator to fix this issue - - .automerge_widget.cannot_be_merged.hide - %h4 - This request can't be merged with GitLab. - You should do it manually with - %strong - = link_to "#modal_merge_info", class: "underlined-link how_to_merge_link", title: "How To Merge", "data-toggle" => "modal" do - command line - - %p - %button.btn.disabled - %i.fa.fa-warning - Accept Merge Request -   - This usually happens when git can not resolve conflicts between branches automatically. - - .automerge_widget.unchecked - %p - %strong - %i.fa.fa-spinner.fa-spin - Checking for ability to automatically merge… - - .automerge_widget.already_cannot_be_merged.hide - %p - %strong This merge request can not be merged. Try to reload the page. - - .merge-in-progress.hide - %p - %i.fa.fa-spinner.fa-spin -   - Merge is in progress. Please wait. Page will be automatically reloaded.   diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml deleted file mode 100644 index ada9ae58b8f..00000000000 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -%h2.issue-title - = gfm escape_once(@merge_request.title) - -%div - - if @merge_request.description.present? - .description - .wiki - = preserve do - = markdown(@merge_request.description, parse_tasks: true) diff --git a/app/views/projects/merge_requests/show/_mr_ci.html.haml b/app/views/projects/merge_requests/show/_mr_ci.html.haml deleted file mode 100644 index ffa3f7b0e36..00000000000 --- a/app/views/projects/merge_requests/show/_mr_ci.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -- if @commits.any? - .ci_widget.ci-success{style: "display:none"} - %i.fa.fa-check - %span CI build passed - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - - .ci_widget.ci-failed{style: "display:none"} - %i.fa.fa-times - %span CI build failed - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - - [:running, :pending].each do |status| - .ci_widget{class: "ci-#{status}", style: "display:none"} - %i.fa.fa-clock-o - %span CI build #{status} - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - .ci_widget - %i.fa.fa-spinner - Checking for CI status for #{@merge_request.last_commit_short_sha} - - .ci_widget.ci-canceled{style: "display:none"} - %i.fa.fa-times - %span CI build canceled - for #{@merge_request.last_commit_short_sha}. - = link_to "View build page", ci_build_details_path(@merge_request), :"data-no-turbolink" => "data-no-turbolink" - - .ci_widget.ci-error{style: "display:none"} - %i.fa.fa-times - %span Cannot connect to the CI server. Please check your settings and try again. diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml deleted file mode 100644 index 46e92a9c558..00000000000 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h4.page-title - .issue-box{ class: issue_box_class(@merge_request) } - - if @merge_request.merged? - Merged - - elsif @merge_request.closed? - Closed - - else - Open - = "Merge Request ##{@merge_request.iid}" - %small.creator - · - created by #{link_to_member(@project, @merge_request.author)} #{time_ago_with_tooltip(@merge_request.created_at)} - - .issue-btn-group.pull-right - - if can?(current_user, :modify_merge_request, @merge_request) - - if @merge_request.open? - = link_to 'Close', merge_request_path(@merge_request, merge_request: { state_event: :close }), method: :put, class: "btn btn-grouped btn-close", title: "Close merge request" - = link_to edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), class: "btn btn-grouped issuable-edit", id: "edit_merge_request" do - %i.fa.fa-pencil-square-o - Edit - - if @merge_request.closed? - = link_to 'Reopen', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-grouped btn-reopen reopen-mr-link", title: "Close merge request" diff --git a/app/views/projects/merge_requests/show/_no_accept.html.haml b/app/views/projects/merge_requests/show/_no_accept.html.haml deleted file mode 100644 index 423fcd48e25..00000000000 --- a/app/views/projects/merge_requests/show/_no_accept.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%h4 - Can't be merged -%p - This merge request can not be accepted because branch - - unless @merge_request.source_branch_exists? - %span.label.label-inverse= @merge_request.source_branch - does not exist in - %span.label.label-info= @merge_request.source_project_path - - else - %span.label.label-inverse= @merge_request.target_branch - does not exist in - %span.label.label-info= @merge_request.target_project_path - %br - %strong Please close this merge request or change branches with existing one diff --git a/app/views/projects/merge_requests/show/_participants.html.haml b/app/views/projects/merge_requests/show/_participants.html.haml deleted file mode 100644 index 9c93fa55fe6..00000000000 --- a/app/views/projects/merge_requests/show/_participants.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -.participants - %span #{@merge_request.participants(current_user).count} participants - - @merge_request.participants(current_user).each do |participant| - = link_to_member(@project, participant, name: false, size: 24) diff --git a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml b/app/views/projects/merge_requests/show/_remove_source_branch.html.haml deleted file mode 100644 index 59cb85edfce..00000000000 --- a/app/views/projects/merge_requests/show/_remove_source_branch.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -- if @source_branch.blank? - Source branch has been removed - -- elsif can_remove_branch?(@merge_request.source_project, @merge_request.source_branch) && @merge_request.merged? - .remove_source_branch_widget - %p Changes merged into #{@merge_request.target_branch}. You can remove source branch now - = link_to namespace_project_branch_path(@merge_request.source_project.namespace, @merge_request.source_project, @source_branch), remote: true, method: :delete, class: "btn btn-primary btn-sm remove_source_branch" do - %i.fa.fa-times - Remove Source Branch - - .remove_source_branch_widget.failed.hide - Failed to remove source branch '#{@merge_request.source_branch}' - - .remove_source_branch_in_progress.hide - %i.fa.fa-spinner.fa-spin -   - Removing source branch '#{@merge_request.source_branch}'. Please wait. Page will be automatically reloaded.   diff --git a/app/views/projects/merge_requests/show/_state_widget.html.haml b/app/views/projects/merge_requests/show/_state_widget.html.haml deleted file mode 100644 index 44bd9347f51..00000000000 --- a/app/views/projects/merge_requests/show/_state_widget.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -.mr-state-widget - - if @merge_request.source_project.ci_service && @commits.any? - .mr-widget-heading - = render "projects/merge_requests/show/mr_ci" - .mr-widget-body - - if @merge_request.open? - - if @merge_request.source_branch_exists? && @merge_request.target_branch_exists? - = render "projects/merge_requests/show/mr_accept" - - else - = render "projects/merge_requests/show/no_accept" - - - if @merge_request.closed? - %h4 - Closed - - if @merge_request.closed_event - by #{link_to_member(@project, @merge_request.closed_event.author, avatar: false)} - #{time_ago_with_tooltip(@merge_request.closed_event.created_at)} - %p Changes were not merged into target branch - - - if @merge_request.merged? - %h4 - Merged - - if @merge_request.merge_event - by #{link_to_member(@project, @merge_request.merge_event.author, avatar: false)} - #{time_ago_with_tooltip(@merge_request.merge_event.created_at)} - = render "projects/merge_requests/show/remove_source_branch" - - - if @merge_request.locked? - %h4 - Merge in progress... - %p - Merging is in progress. While merging this request is locked and cannot be closed. - - - unless @commits.any? - %h4 Nothing to merge - %p - Nothing to merge from - %span.label-branch #{@merge_request.source_branch} - to - %span.label-branch #{@merge_request.target_branch} - %br - Try to use different branches or push new code. - - - if @closes_issues.present? && @merge_request.open? - .mr-widget-footer - %span - %i.fa.fa-check - Accepting this merge request will close #{@closes_issues.size == 1 ? 'issue' : 'issues'} - = succeed '.' do - != gfm(issues_sentence(@closes_issues)) diff --git a/app/views/projects/merge_requests/update.js.haml b/app/views/projects/merge_requests/update.js.haml deleted file mode 100644 index b4df1d20737..00000000000 --- a/app/views/projects/merge_requests/update.js.haml +++ /dev/null @@ -1,8 +0,0 @@ -- if params[:merge_request_context] - $('.context').html("#{escape_javascript(render partial: 'projects/merge_requests/show/context', locals: { issue: @issue })}"); - $('.context').effect('highlight'); - - new UsersSelect() - - $('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}); - merge_request = new MergeRequest(); diff --git a/app/views/projects/merge_requests/update_branches.js.haml b/app/views/projects/merge_requests/update_branches.js.haml deleted file mode 100644 index ca21b3bc0de..00000000000 --- a/app/views/projects/merge_requests/update_branches.js.haml +++ /dev/null @@ -1,9 +0,0 @@ -:plain - $(".target_branch").html("#{escape_javascript(options_for_select(@target_branches))}"); - - $('select.target_branch').select2({ - width: 'resolve', - dropdownAutoWidth: true - }); - - $(".mr_target_commit").html(""); diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml deleted file mode 100644 index 95b7070ce5c..00000000000 --- a/app/views/projects/milestones/_form.html.haml +++ /dev/null @@ -1,54 +0,0 @@ -%h3.page-title= @milestone.new_record? ? "New Milestone" : "Edit Milestone ##{@milestone.iid}" -.back-link - = link_to namespace_project_milestones_path(@project.namespace, @project) do - ← To milestones - -%hr - -= form_for [@project.namespace.becomes(Namespace), @project, @milestone], html: {class: 'form-horizontal milestone-form gfm-form'} do |f| - -if @milestone.errors.any? - .alert.alert-danger - %ul - - @milestone.errors.full_messages.each do |msg| - %li= msg - .row - .col-md-6 - .form-group - = f.label :title, "Title", class: "control-label" - .col-sm-10 - = f.text_field :title, maxlength: 255, class: "form-control" - %p.hint Required - .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 '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'}. - .pull-left Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. - .clearfix - .error-alert - .col-md-6 - .form-group - = f.label :due_date, "Due Date", class: "control-label" - .col-sm-10= f.hidden_field :due_date - .col-sm-10 - .datepicker - - .form-actions - - if @milestone.new_record? - = f.submit 'Create milestone', class: "btn-create btn" - = link_to "Cancel", namespace_project_milestones_path(@project.namespace, @project), class: "btn btn-cancel" - -else - = f.submit 'Save changes', class: "btn-save btn" - = link_to "Cancel", namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-cancel" - - -:javascript - disableButtonIfEmptyField("#milestone_title", ".btn-save"); - $( ".datepicker" ).datepicker({ - dateFormat: "yy-mm-dd", - onSelect: function(dateText, inst) { $("#milestone_due_date").val(dateText) } - }).datepicker("setDate", $.datepicker.parseDate('yy-mm-dd', $('#milestone_due_date').val())); - - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; diff --git a/app/views/projects/milestones/_issue.html.haml b/app/views/projects/milestones/_issue.html.haml deleted file mode 100644 index 88fccfe4981..00000000000 --- a/app/views/projects/milestones/_issue.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -%li{ id: dom_id(issue, 'sortable'), class: 'issue-row', 'data-iid' => issue.iid, 'data-url' => issue_path(issue) } - .pull-right.assignee-icon - - if issue.assignee - = image_tag avatar_icon(issue.assignee.email, 16), class: "avatar s16", alt: '' - %span - = link_to [@project.namespace.becomes(Namespace), @project, issue] do - %span.cgray ##{issue.iid} - = link_to_gfm issue.title, [@project.namespace.becomes(Namespace), @project, issue], title: issue.title - diff --git a/app/views/projects/milestones/_issues.html.haml b/app/views/projects/milestones/_issues.html.haml deleted file mode 100644 index 6e4df75a3df..00000000000 --- a/app/views/projects/milestones/_issues.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list issues-sortable-list", id: "issues-list-#{id}", "data-state" => id } - - issues.sort_by(&:position).each do |issue| - = render 'issue', issue: issue - %li.light.ui-sort-disabled Drag and drop available diff --git a/app/views/projects/milestones/_merge_request.html.haml b/app/views/projects/milestones/_merge_request.html.haml deleted file mode 100644 index 0d7a118569a..00000000000 --- a/app/views/projects/milestones/_merge_request.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%li{ id: dom_id(merge_request, 'sortable'), class: 'mr-row', 'data-iid' => merge_request.iid, 'data-url' => merge_request_path(merge_request) } - %span.str-truncated - = link_to [@project.namespace.becomes(Namespace), @project, merge_request] do - %span.cgray ##{merge_request.iid} - = link_to_gfm merge_request.title, [@project.namespace.becomes(Namespace), @project, merge_request], title: merge_request.title - .pull-right.assignee-icon - - if merge_request.assignee - = image_tag avatar_icon(merge_request.assignee.email, 16), class: "avatar s16", alt: '' diff --git a/app/views/projects/milestones/_merge_requests.html.haml b/app/views/projects/milestones/_merge_requests.html.haml deleted file mode 100644 index 00889a5eb24..00000000000 --- a/app/views/projects/milestones/_merge_requests.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -.panel.panel-default - .panel-heading= title - %ul{ class: "well-list merge_requests-sortable-list", id: "merge_requests-list-#{id}", "data-state" => id } - - merge_requests.sort_by(&:position).each do |merge_request| - = render 'merge_request', merge_request: merge_request - %li.light.ui-sort-disabled Drag and drop available diff --git a/app/views/projects/milestones/_milestone.html.haml b/app/views/projects/milestones/_milestone.html.haml deleted file mode 100644 index 62360158ff9..00000000000 --- a/app/views/projects/milestones/_milestone.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -%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" - %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 - .row - .col-sm-6 - = link_to namespace_project_issues_path(milestone.project.namespace, milestone.project, milestone_id: milestone.id) do - = pluralize milestone.issues.count, 'Issue' -   - = link_to namespace_project_merge_requests_path(milestone.project.namespace, milestone.project, milestone_id: milestone.id) do - = pluralize milestone.merge_requests.count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete - .col-sm-6 - = milestone_progress_bar(milestone) diff --git a/app/views/projects/milestones/edit.html.haml b/app/views/projects/milestones/edit.html.haml deleted file mode 100644 index b1bc3ba0eba..00000000000 --- a/app/views/projects/milestones/edit.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "form" diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml deleted file mode 100644 index d3eab8d6d75..00000000000 --- a/app/views/projects/milestones/index.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -.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 'shared/milestones_filter' - -.milestones - .panel.panel-default - %ul.well-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 deleted file mode 100644 index b1bc3ba0eba..00000000000 --- a/app/views/projects/milestones/new.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render "form" diff --git a/app/views/projects/milestones/show.html.haml b/app/views/projects/milestones/show.html.haml deleted file mode 100644 index 25cc0030965..00000000000 --- a/app/views/projects/milestones/show.html.haml +++ /dev/null @@ -1,103 +0,0 @@ -%h4.page-title - .issue-box{ class: issue_box_class(@milestone) } - - if @milestone.closed? - Closed - - elsif @milestone.expired? - Expired - - else - Open - Milestone ##{@milestone.iid} - %small.creator - = @milestone.expires_at - .pull-right - - if can?(current_user, :admin_milestone, @project) - = link_to edit_namespace_project_milestone_path(@project.namespace, @project, @milestone), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - - if @milestone.active? - = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :close }), method: :put, class: "btn btn-close btn-grouped" - - else - = link_to 'Reopen Milestone', namespace_project_milestone_path(@project.namespace, @project, @milestone, milestone: {state_event: :activate }), method: :put, class: "btn btn-reopen btn-grouped" - -%hr -- if @milestone.issues.any? && @milestone.can_be_closed? - .alert.alert-success - %span All issues for this milestone are closed. You may close milestone now. - -%h3.issue-title - = gfm escape_once(@milestone.title) -%div - - if @milestone.description.present? - .description - .wiki - = preserve do - = markdown @milestone.description - -%hr -.context - %p.lead - Progress: - #{@milestone.closed_items_count} closed - – - #{@milestone.open_items_count} open -   - %span.light #{@milestone.percent_complete}% complete - %span.pull-right= @milestone.expires_at - = milestone_progress_bar(@milestone) - - -%ul.nav.nav-tabs - %li.active - = link_to '#tab-issues', 'data-toggle' => 'tab' do - Issues - %span.badge= @issues.count - %li - = link_to '#tab-merge-requests', 'data-toggle' => 'tab' do - Merge Requests - %span.badge= @merge_requests.count - %li - = link_to '#tab-participants', 'data-toggle' => 'tab' do - Participants - %span.badge= @users.count - - - if @project.issues_enabled - .pull-right - = link_to new_namespace_project_issue_path(@project.namespace, @project, issue: { milestone_id: @milestone.id }), class: "btn btn-grouped", title: "New Issue" do - %i.fa.fa-plus - New Issue - = link_to 'Browse Issues', namespace_project_issues_path(@milestone.project.namespace, @milestone.project, milestone_id: @milestone.id), class: "btn edit-milestone-link btn-grouped" - -.tab-content - .tab-pane.active#tab-issues - .row - .col-md-4 - = render('issues', title: 'Unstarted Issues (open and unassigned)', issues: @issues.opened.unassigned, id: 'unassigned') - .col-md-4 - = render('issues', title: 'Ongoing Issues (open and assigned)', issues: @issues.opened.assigned, id: 'ongoing') - .col-md-4 - = render('issues', title: 'Completed Issues (closed)', issues: @issues.closed, id: 'closed') - - .tab-pane#tab-merge-requests - .row - .col-md-3 - = render('merge_requests', title: 'Work in progress (open and unassigned)', merge_requests: @merge_requests.opened.unassigned, id: 'unassigned') - .col-md-3 - = render('merge_requests', title: 'Waiting for merge (open and assigned)', merge_requests: @merge_requests.opened.assigned, id: 'ongoing') - .col-md-3 - = render('merge_requests', title: 'Declined (closed)', merge_requests: @merge_requests.declined, id: 'closed') - .col-md-3 - .panel.panel-primary - .panel-heading Merged - %ul.well-list - - @merge_requests.merged.each do |merge_request| - = render 'merge_request', merge_request: merge_request - - .tab-pane#tab-participants - %ul.bordered-list - - @users.each do |user| - %li - = link_to user, title: user.name, class: "darken" do - = image_tag avatar_icon(user.email, 32), class: "avatar s32" - %strong= truncate(user.name, lenght: 40) - %br - %small.cgray= user.username diff --git a/app/views/projects/milestones/update.js.haml b/app/views/projects/milestones/update.js.haml deleted file mode 100644 index 3ff84915e97..00000000000 --- a/app/views/projects/milestones/update.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - $('##{dom_id(@milestone)}').fadeOut(); diff --git a/app/views/projects/network/_head.html.haml b/app/views/projects/network/_head.html.haml deleted file mode 100644 index 415c98ec6a6..00000000000 --- a/app/views/projects/network/_head.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -.append-bottom-20 - = render partial: 'shared/ref_switcher', locals: {destination: 'graph'} - .pull-right.visible-lg.light You can move around the graph by using the arrow keys. diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml deleted file mode 100644 index c36bad1e94b..00000000000 --- a/app/views/projects/network/show.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -= render "head" -.project-network - .controls - = form_tag namespace_project_network_path(@project.namespace, @project, @id), method: :get, class: 'form-inline network-form' do |f| - = text_field_tag :extended_sha1, @options[:extended_sha1], placeholder: "Input an extended SHA1 syntax", class: 'search-input form-control input-mx-250 search-sha' - = button_tag class: 'btn btn-success btn-search-sha' do - %i.fa.fa-search - .inline.prepend-left-20 - .checkbox.light - = label_tag :filter_ref do - = check_box_tag :filter_ref, 1, @options[:filter_ref] - %span Begin with the selected commit - - .network-graph - = spinner nil, true - -:javascript - disableButtonIfEmptyField('#extended_sha1', '.btn-search-sha') - - network_graph = new Network({ - url: '#{namespace_project_network_path(@project.namespace, @project, @ref, @options.merge(format: :json))}', - commit_url: '#{namespace_project_commit_path(@project.namespace, @project, 'ae45ca32').gsub("ae45ca32", "%s")}', - ref: '#{@ref}', - commit_id: '#{@commit.id}' - }) - new ShortcutsNetwork(network_graph.branch_graph) diff --git a/app/views/projects/network/show.json.erb b/app/views/projects/network/show.json.erb deleted file mode 100644 index dc82adcb2c6..00000000000 --- a/app/views/projects/network/show.json.erb +++ /dev/null @@ -1,23 +0,0 @@ -<% self.formats = ["html"] %> - -<%= raw( - { - days: @graph.days.compact.map { |d| [d.day, d.strftime("%b")] }, - commits: @graph.commits.map do |c| - { - parents: parents_zip_spaces(c.parents(@graph.map), c.parent_spaces), - author: { - name: c.author_name, - email: c.author_email, - icon: avatar_icon(c.author_email, 20) - }, - time: c.time, - space: c.spaces.first, - refs: get_refs(@graph.repo, c), - id: c.sha, - date: c.date, - message: c.message, - } - end - }.to_json -) %> diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml deleted file mode 100644 index a06c85b4251..00000000000 --- a/app/views/projects/new.html.haml +++ /dev/null @@ -1,120 +0,0 @@ -.project-edit-container - .project-edit-errors - = render 'projects/errors' - .project-edit-content - - = form_for @project, html: { class: 'new_project form-horizontal' } do |f| - .form-group.project-name-holder - = f.label :path, class: 'control-label' do - %strong Project path - .col-sm-10 - .input-group - = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 1, autofocus: true - .input-group-addon - \.git - - - if current_user.can_select_namespace? - .form-group - = f.label :namespace_id, class: 'control-label' do - %span Namespace - .col-sm-10 - = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'select2', tabindex: 2} - - %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' 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 - .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/migrating_from_svn.html"}. - - %hr.prepend-botton-10 - - .form-group - = f.label :description, class: 'control-label' do - Description - %span.light (optional) - .col-sm-10 - = f.text_area :description, placeholder: "Awesome project", class: "form-control", rows: 3, maxlength: 250, tabindex: 3 - = render "visibility_level", f: f, visibility_level: gitlab_config.default_projects_features.visibility_level, can_change_visibility_level: true - - .form-actions - = f.submit 'Create project', class: "btn btn-create project-submit", tabindex: 4 - - - if current_user.can_create_group? - .pull-right - .light - Need a group for several dependent projects? - = link_to new_group_path, class: "btn btn-xs" do - Create a group - -.save-project-loader.hide - .center - %h2 - %i.fa.fa-spinner.fa-spin - Creating project & repository. - %p Please wait a moment, this page will automatically refresh when ready. - -:coffeescript - $('.how_to_import_link').bind 'click', (e) -> - e.preventDefault() - import_modal = $(this).next(".modal").show() - $('.modal-header .close').bind 'click', -> - $(".modal").hide() diff --git a/app/views/projects/no_repo.html.haml b/app/views/projects/no_repo.html.haml deleted file mode 100644 index 720957e8336..00000000000 --- a/app/views/projects/no_repo.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h2 - %i.fa.fa-warning - No repository - -%p.slead - The repository for this project does not exist. - %br - This means you can not push code until you create an empty repository or import existing one. -%hr - -.no-repo-actions - = link_to namespace_project_repository_path(@project.namespace, @project), method: :post, class: 'btn btn-primary' do - Create empty bare repository - - %strong.prepend-left-10.append-right-10 or - - = link_to new_namespace_project_import_path(@project.namespace, @project), class: 'btn' do - Import repository - -- if can? current_user, :remove_project, @project - .prepend-top-20 - = link_to 'Remove project', project_path(@project), data: { confirm: remove_project_message(@project)}, method: :delete, class: "btn btn-remove pull-right" diff --git a/app/views/projects/notes/_commit_discussion.html.haml b/app/views/projects/notes/_commit_discussion.html.haml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/app/views/projects/notes/_diff_notes_with_reply.html.haml b/app/views/projects/notes/_diff_notes_with_reply.html.haml deleted file mode 100644 index c731baf0a65..00000000000 --- a/app/views/projects/notes/_diff_notes_with_reply.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -- note = notes.first # example note --# Check if line want not changed since comment was left -- if !defined?(line) || line == note.diff_line - %tr.notes_holder - %td.notes_line{ colspan: 2 } - %span.discussion-notes-count - %i.fa.fa-comment - = notes.count - %td.notes_content - %ul.notes{ rel: note.discussion_id } - = render notes - .discussion-reply-holder - = link_to_reply_diff(note) diff --git a/app/views/projects/notes/_diff_notes_with_reply_parallel.html.haml b/app/views/projects/notes/_diff_notes_with_reply_parallel.html.haml deleted file mode 100644 index 789f3e19fd2..00000000000 --- a/app/views/projects/notes/_diff_notes_with_reply_parallel.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -- note1 = notes1.present? ? notes1.first : nil -- note2 = notes2.present? ? notes2.first : nil - -%tr.notes_holder - - if note1 - %td.notes_line - %span.btn.disabled - %i.fa.fa-comment - = notes1.count - %td.notes_content.parallel - %ul.notes{ rel: note1.discussion_id } - = render notes1 - - .discussion-reply-holder - = link_to_reply_diff(note1) - - else - %td= "" - %td= "" - - - if note2 - %td.notes_line - %span.btn.disabled - %i.fa.fa-comment - = notes2.count - %td.notes_content.parallel - %ul.notes{ rel: note2.discussion_id } - = render notes2 - - .discussion-reply-holder - = link_to_reply_diff(note2) - - else - %td= "" - %td= "" - diff --git a/app/views/projects/notes/_discussion.html.haml b/app/views/projects/notes/_discussion.html.haml deleted file mode 100644 index b8068835b3a..00000000000 --- a/app/views/projects/notes/_discussion.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -- note = discussion_notes.first -.timeline-entry - .timeline-entry-inner - .timeline-icon - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: "avatar s40" - .timeline-content - - if note.for_merge_request? - - (active_notes, outdated_notes) = discussion_notes.partition(&:active?) - = render "projects/notes/discussions/active", discussion_notes: active_notes if active_notes.length > 0 - = render "projects/notes/discussions/outdated", discussion_notes: outdated_notes if outdated_notes.length > 0 - - else - = render "projects/notes/discussions/commit", discussion_notes: discussion_notes diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml deleted file mode 100644 index acb3991d294..00000000000 --- a/app/views/projects/notes/_edit_form.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -.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 'projects/zen', f: f, attr: :note, - classes: 'note_text js-note-text' - - .comment-hints.clearfix - .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} - .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. - - .note-form-actions - .buttons - = f.submit 'Save Comment', class: "btn btn-primary btn-save btn-grouped js-comment-button" - = link_to 'Cancel', "#", class: "btn btn-cancel note-edit-cancel" \ No newline at end of file diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml deleted file mode 100644 index 2ada6cb6700..00000000000 --- a/app/views/projects/notes/_form.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @note], remote: true, html: { :'data-type' => 'json', multipart: true, id: nil, class: "new_note js-new-note-form common-note-form gfm-form" }, authenticity_token: true do |f| - = note_target_fields(@note) - = f.hidden_field :commit_id - = f.hidden_field :line_code - = f.hidden_field :noteable_id - = f.hidden_field :noteable_type - - = render layout: 'projects/md_preview', locals: { preview_class: "note-text" } do - = render 'projects/zen', f: f, attr: :note, - classes: 'note_text js-note-text' - - .comment-hints.clearfix - .pull-left Comments are parsed with #{link_to "GitLab Flavored Markdown", help_page_path("markdown", "markdown"),{ target: '_blank', tabindex: -1 }} - .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector', tabindex: -1 }. - .error-alert - - .note-form-actions - .buttons - = f.submit 'Add Comment', class: "btn comment-btn btn-grouped js-comment-button" - = yield(:note_actions) - %a.btn.grouped.js-close-discussion-note-form Cancel - -:javascript - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; diff --git a/app/views/projects/notes/_form_errors.html.haml b/app/views/projects/notes/_form_errors.html.haml deleted file mode 100644 index 0b68bf243f0..00000000000 --- a/app/views/projects/notes/_form_errors.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -.error-message.js-errors - - note.errors.full_messages.each do |msg| - %div= msg diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml deleted file mode 100644 index 0728f8fa42b..00000000000 --- a/app/views/projects/notes/_note.html.haml +++ /dev/null @@ -1,71 +0,0 @@ -%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.fa.fa-circle - - else - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: "avatar s40", alt: '' - .timeline-content - .note-header - .note-actions - = link_to "##{dom_id(note)}", name: dom_id(note) do - %i.fa.fa-link - Link here -   - - if can?(current_user, :admin_note, note) && note.editable? - = link_to "#", title: "Edit comment", class: "js-note-edit" do - %i.fa.fa-pencil-square-o - Edit -   - = link_to namespace_project_note_path(@project.namespace, @project, note), title: "Remove comment", method: :delete, data: { confirm: 'Are you sure you want to remove this comment?' }, remote: true, class: "danger js-note-delete" do - %i.fa.fa-trash-o.cred - Remove - - if note.system - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: "avatar s16", alt: '' - = link_to_member(@project, note.author, avatar: false) - %span.author-username - = '@' + note.author.username - %span.note-last-update - = note_timestamp(note) - - - if note.superceded?(@notes) - - if note.upvote? - %span.vote.upvote.label.label-gray.strikethrough - %i.fa.fa-thumbs-up - \+1 - - if note.downvote? - %span.vote.downvote.label.label-gray.strikethrough - %i.fa.fa-thumbs-down - \-1 - - else - - if note.upvote? - %span.vote.upvote.label.label-success - %i.fa.fa-thumbs-up - \+1 - - if note.downvote? - %span.vote.downvote.label.label-danger - %i.fa.fa-thumbs-down - \-1 - - - .note-body - .note-text - = preserve do - = markdown(note.note, {no_header_anchors: true}) - = render 'projects/notes/edit_form', note: note - - - if note.attachment.url - .note-attachment - - if note.attachment.image? - = link_to note.attachment.url, target: '_blank' do - = image_tag note.attachment.url, class: 'note-image-attach' - .attachment - = link_to note.attachment.url, target: "_blank" do - %i.fa.fa-paperclip - = note.attachment_identifier - = link_to delete_attachment_namespace_project_note_path(@project.namespace, @project, note), - title: "Delete this attachment", method: :delete, remote: true, data: { confirm: 'Are you sure you want to remove the attachment?' }, class: "danger js-note-attachment-delete" do - %i.fa.fa-trash-o.cred - .clear diff --git a/app/views/projects/notes/_notes.html.haml b/app/views/projects/notes/_notes.html.haml deleted file mode 100644 index ca60dd239b2..00000000000 --- a/app/views/projects/notes/_notes.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -- if @discussions.present? - - @discussions.each do |discussion_notes| - - note = discussion_notes.first - - if note_for_main_target?(note) - = render discussion_notes - - else - = render 'projects/notes/discussion', discussion_notes: discussion_notes -- else - - @notes.each do |note| - - next unless note.author - = render note diff --git a/app/views/projects/notes/_notes_with_form.html.haml b/app/views/projects/notes/_notes_with_form.html.haml deleted file mode 100644 index 813e37276bd..00000000000 --- a/app/views/projects/notes/_notes_with_form.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -%ul#notes-list.notes.main-notes-list.timeline - = render "projects/notes/notes" -.js-notes-busy - -.js-main-target-form -- if can? current_user, :write_note, @project - = render "projects/notes/form" - -:javascript - new Notes("#{namespace_project_notes_path(namespace_id: @project.namespace, target_id: @noteable.id, target_type: @noteable.class.name.underscore)}", #{@notes.map(&:id).to_json}, #{Time.now.to_i}) diff --git a/app/views/projects/notes/discussions/_active.html.haml b/app/views/projects/notes/discussions/_active.html.haml deleted file mode 100644 index 7c6f7243173..00000000000 --- a/app/views/projects/notes/discussions/_active.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -- note = discussion_notes.first -.discussion.js-toggle-container{ class: note.discussion_id } - .discussion-header - .discussion-actions - = link_to "#", class: "js-toggle-button" do - %i.fa.fa-chevron-up - Show/hide discussion - %div - = link_to_member(@project, note.author, avatar: false) - started a discussion - = link_to diffs_namespace_project_merge_request_path(note.project.namespace, note.project, note.noteable, anchor: note.line_code) do - %strong on the diff - .last-update.hide.js-toggle-content - - last_note = discussion_notes.last - last updated by - = link_to_member(@project, last_note.author, avatar: false) - %span.discussion-last-update - #{time_ago_with_tooltip(last_note.updated_at, 'bottom', 'discussion_updated_ago')} - .discussion-body.js-toggle-content - = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note diff --git a/app/views/projects/notes/discussions/_commit.html.haml b/app/views/projects/notes/discussions/_commit.html.haml deleted file mode 100644 index 62609cfc1c8..00000000000 --- a/app/views/projects/notes/discussions/_commit.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -- note = discussion_notes.first -.discussion.js-toggle-container{ class: note.discussion_id } - .discussion-header - .discussion-actions - = link_to "#", class: "js-toggle-button" do - %i.fa.fa-chevron-up - Show/hide discussion - %div - = link_to_member(@project, note.author, avatar: false) - started a discussion on commit - = link_to(note.noteable.short_id, namespace_project_commit_path(note.project.namespace, note.project, note.noteable), class: 'monospace') - .last-update.hide.js-toggle-content - - last_note = discussion_notes.last - last updated by - = link_to_member(@project, last_note.author, avatar: false) - %span.discussion-last-update - #{time_ago_with_tooltip(last_note.updated_at, 'bottom', 'discussion_updated_ago')} - .discussion-body.js-toggle-content - - if note.for_diff_line? - = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note - - else - .panel.panel-default - .notes{ rel: discussion_notes.first.discussion_id } - = render discussion_notes - .discussion-reply-holder - = link_to_reply_diff(discussion_notes.first) - diff --git a/app/views/projects/notes/discussions/_diff.html.haml b/app/views/projects/notes/discussions/_diff.html.haml deleted file mode 100644 index 711aa39101b..00000000000 --- a/app/views/projects/notes/discussions/_diff.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -- diff = note.diff -- if diff - .diff-file - .diff-header - %span - - if diff.deleted_file - = diff.old_path - - else - = diff.new_path - - if diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode - %span.file-mode= "#{diff.a_mode} → #{diff.b_mode}" - .diff-content - %table - - note.truncated_diff_lines.each do |line| - - line_code = generate_line_code(note.file_path, line) - %tr.line_holder{ id: line_code } - - if line.type == "match" - %td.old_line= "..." - %td.new_line= "..." - %td.line_content.matched= line.text - - else - %td.old_line{class: line.type == "new" ? "new" : "old"} - = raw(line.type == "new" ? " " : line.old_pos) - %td.new_line{class: line.type == "new" ? "new" : "old"} - = raw(line.type == "old" ? " " : line.new_pos) - %td.line_content{class: "noteable_line #{line.type} #{line_code}", "line_code" => line_code}= raw diff_line_content(line.text) - - - if line_code == note.line_code - = render "projects/notes/diff_notes_with_reply", notes: discussion_notes diff --git a/app/views/projects/notes/discussions/_outdated.html.haml b/app/views/projects/notes/discussions/_outdated.html.haml deleted file mode 100644 index 52a1d342f55..00000000000 --- a/app/views/projects/notes/discussions/_outdated.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -- note = discussion_notes.first -.discussion.js-toggle-container{ class: note.discussion_id } - .discussion-header - .discussion-actions - = link_to "#", class: "js-toggle-button" do - %i.fa.fa-chevron-down - Show/hide discussion - %div - = link_to_member(@project, note.author, avatar: false) - started a discussion on the - %strong outdated diff - %div - - last_note = discussion_notes.last - last updated by - = link_to_member(@project, last_note.author, avatar: false) - %span.discussion-last-update - #{time_ago_with_tooltip(last_note.updated_at, 'bottom', 'discussion_updated_ago')} - .discussion-body.js-toggle-content.hide - = render "projects/notes/discussions/diff", discussion_notes: discussion_notes, note: note diff --git a/app/views/projects/project_members/_group_members.html.haml b/app/views/projects/project_members/_group_members.html.haml deleted file mode 100644 index 43e92437cf5..00000000000 --- a/app/views/projects/project_members/_group_members.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -.panel.panel-default - .panel-heading - %strong #{@group.name} - group members - %small - (#{members.count}) - .panel-head-actions - = link_to group_group_members_path(@group), class: 'btn btn-sm' do - %i.fa.fa-pencil-square-o - Edit group members - %ul.well-list - - members.each do |member| - = render 'groups/group_members/group_member', member: member, show_controls: false - - if members.count > 20 - %li - and #{members.count - 20} more. For full list visit #{link_to 'group members page', group_group_members_path(@group)} diff --git a/app/views/projects/project_members/_new_project_member.html.haml b/app/views/projects/project_members/_new_project_member.html.haml deleted file mode 100644 index d708b01a114..00000000000 --- a/app/views/projects/project_members/_new_project_member.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -= form_for @project_member, as: :project_member, url: namespace_project_project_members_path(@project.namespace, @project), html: { class: 'form-horizontal users-project-form' } do |f| - .form-group - = f.label :user_ids, "People", class: 'control-label' - .col-sm-10 - = users_select_tag(:user_ids, multiple: true, class: 'input-large', scope: :all, email_user: true) - .help-block - Search for existing users or invite new ones using their email address. - - .form-group - = f.label :access_level, "Project Access", class: 'control-label' - .col-sm-10 - = select_tag :access_level, options_for_select(ProjectMember.access_roles, @project_member.access_level), class: "project-access-select select2" - .help-block - Read more about role permissions - %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" - - .form-actions - = f.submit 'Add users to project', class: "btn btn-create" diff --git a/app/views/projects/project_members/_project_member.html.haml b/app/views/projects/project_members/_project_member.html.haml deleted file mode 100644 index 635e4d70941..00000000000 --- a/app/views/projects/project_members/_project_member.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -- user = member.user -- return unless user || member.invite? - -%li{class: "#{dom_class(member)} js-toggle-container project_member_row access-#{member.human_access.downcase}", id: dom_id(member)} - %span.list-item-name - - if member.user - = image_tag avatar_icon(user.email, 16), class: "avatar s16", alt: '' - %strong - = link_to user.name, user_path(user) - %span.cgray= user.username - - if user == current_user - %span.label.label-success It's you - - if user.blocked? - %label.label.label-danger - %strong Blocked - - else - = image_tag avatar_icon(member.invite_email, 16), class: "avatar s16", alt: '' - %strong - = member.invite_email - %span.cgray - invited - - if member.created_by - by - = link_to member.created_by.name, user_path(member.created_by) - = time_ago_with_tooltip(member.created_at) - - - if current_user_can_admin_project - = link_to resend_invite_namespace_project_project_member_path(@project.namespace, @project, member), method: :post, class: "btn-xs btn", title: 'Resend invite' do - Resend invite - - - if current_user_can_admin_project - - unless @project.personal? && user == current_user - .pull-right - %strong= member.human_access - = button_tag class: "btn-xs btn js-toggle-button", - title: 'Edit access level', type: 'button' do - %i.fa.fa-pencil-square-o - -   - - if current_user == user - = link_to leave_namespace_project_project_members_path(@project.namespace, @project), data: { confirm: "Leave project?"}, method: :delete, class: "btn-xs btn btn-remove", title: 'Leave project' do - %i.fa.fa-minus.fa-inverse - - else - = link_to namespace_project_project_member_path(@project.namespace, @project, member), data: { confirm: remove_from_project_team_message(@project, member) }, method: :delete, remote: true, class: "btn-xs btn btn-remove", title: 'Remove user from team' do - %i.fa.fa-minus.fa-inverse - - .edit-member.hide.js-toggle-content - %br - = form_for member, as: :project_member, url: namespace_project_project_member_path(@project.namespace, @project, member), remote: true do |f| - .prepend-top-10 - = f.select :access_level, options_for_select(ProjectMember.access_roles, member.access_level), {}, class: 'form-control' - .prepend-top-10 - = f.submit 'Save', class: 'btn btn-save' diff --git a/app/views/projects/project_members/_team.html.haml b/app/views/projects/project_members/_team.html.haml deleted file mode 100644 index 615c425e59a..00000000000 --- a/app/views/projects/project_members/_team.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -- can_admin_project = can?(current_user, :admin_project, @project) - -.panel.panel-default.prepend-top-20 - .panel-heading - %strong #{@project.name} - project members - %small - (#{members.count}) - %ul.well-list - - members.each do |project_member| - = render 'project_member', member: project_member, current_user_can_admin_project: can_admin_project diff --git a/app/views/projects/project_members/import.html.haml b/app/views/projects/project_members/import.html.haml deleted file mode 100644 index 293754cd0c0..00000000000 --- a/app/views/projects/project_members/import.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%h3.page-title - Import members from another project -%p.light - Only project members will be imported. Group members will be skipped. -%hr -= form_tag apply_import_namespace_project_project_members_path(@project.namespace, @project), method: 'post', class: 'form-horizontal' do - .form-group - = label_tag :source_project_id, "Project", class: 'control-label' - .col-sm-10= select_tag(:source_project_id, options_from_collection_for_select(current_user.authorized_projects, :id, :name_with_namespace), prompt: "Select project", class: "select2 lg", required: true) - - .form-actions - = button_tag 'Import project members', class: "btn btn-create" - = link_to "Cancel", namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-cancel" - diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml deleted file mode 100644 index 36a6f6a1554..00000000000 --- a/app/views/projects/project_members/index.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -%h3.page-title - Users with access to this project - -%p.light - 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 input-mn-300' } - = 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 - = render "group_members", members: @group_members - -:coffeescript - $('form.member-search-form').on 'submit', (event) -> - event.preventDefault() - Turbolinks.visit @.action + '?' + $(@).serialize() diff --git a/app/views/projects/project_members/update.js.haml b/app/views/projects/project_members/update.js.haml deleted file mode 100644 index 811b1858821..00000000000 --- a/app/views/projects/project_members/update.js.haml +++ /dev/null @@ -1,3 +0,0 @@ -- can_admin_project = can?(current_user, :admin_project, @project) -:plain - $("##{dom_id(@project_member)}").replaceWith('#{escape_javascript(render("project_member", member: @project_member, current_user_can_admin_project: can_admin_project))}'); diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml deleted file mode 100644 index bb49f4de873..00000000000 --- a/app/views/projects/protected_branches/_branches_list.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -- unless @branches.empty? - %br - %h4 Already Protected: - %table.table.protected-branches-list - %thead - %tr.no-border - %th Branch - %th Developers can push - %th Last commit - %th - - %tbody - - @branches.each do |branch| - - @url = namespace_project_protected_branch_path(@project.namespace, @project, branch) - %tr - %td - = link_to namespace_project_commits_path(@project.namespace, @project, branch.name) do - %strong= branch.name - - if @project.root_ref?(branch.name) - %span.label.label-info default - %td - = check_box_tag "developers_can_push", branch.id, branch.developers_can_push, "data-url" => @url - %td - - if commit = branch.commit - = link_to namespace_project_commit_path(@project.namespace, @project, commit.id), class: 'commit_short_id' do - = commit.short_id - · - #{time_ago_with_tooltip(commit.committed_date)} - - else - (branch was removed from repository) - %td - .pull-right - - if can? current_user, :admin_project, @project - = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-remove btn-sm" diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml deleted file mode 100644 index a3464c0e5e1..00000000000 --- a/app/views/projects/protected_branches/index.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -%h3.page-title Protected branches -%p.light Keep stable branches secure and force developers to use Merge Requests -%hr - -.well.append-bottom-20 - %p Protected branches are designed to - %ul - %li prevent pushes from everybody except #{link_to "masters", help_page_path("permissions", "permissions"), class: "vlink"} - %li prevent anyone from force pushing to the branch - %li prevent anyone from deleting the branch - %p Read more about #{link_to "project permissions", help_page_path("permissions", "permissions"), class: "underlined-link"} - -- if can? current_user, :admin_project, @project - = form_for [@project.namespace.becomes(Namespace), @project, @protected_branch], html: { class: 'form-horizontal' } do |f| - -if @protected_branch.errors.any? - .alert.alert-danger - %ul - - @protected_branch.errors.full_messages.each do |msg| - %li= msg - - .form-group - = f.label :name, "Branch", class: 'control-label' - .col-sm-10 - = f.select(:name, @project.open_branches.map { |br| [br.name, br.name] } , {include_blank: "Select branch"}, {class: "select2"}) - .form-group - .col-sm-offset-2.col-sm-10 - .checkbox - = f.label :developers_can_push do - = f.check_box :developers_can_push - %strong Developers can push - .help-block Allow developers to push to this branch - .form-actions - = f.submit 'Protect', class: "btn-create btn" -= render 'branches_list' - diff --git a/app/views/projects/refs/logs_tree.js.haml b/app/views/projects/refs/logs_tree.js.haml deleted file mode 100644 index 35c15cf3a9e..00000000000 --- a/app/views/projects/refs/logs_tree.js.haml +++ /dev/null @@ -1,19 +0,0 @@ -- @logs.each do |content_data| - - file_name = content_data[:file_name] - - commit = content_data[:commit] - - next unless commit - - :plain - var row = $("table.table_#{@hex_path} tr.file_#{hexdigest(file_name)}"); - row.find("td.tree_time_ago").html('#{escape_javascript time_ago_with_tooltip(commit.committed_date)}'); - row.find("td.tree_commit").html('#{escape_javascript render("projects/tree/tree_commit_column", commit: commit)}'); - -- if @logs.present? - :plain - var current_url = location.href.replace(/\/?$/, '/'); - var log_url = '#{namespace_project_tree_url(@project.namespace, @project, tree_join(@ref, @path || '/'))}'.replace(/\/?$/, '/'); - if(current_url == log_url) { - // Load 10 more commit log for each file in tree - // if we still on the same page - ajaxGet('#{logs_file_namespace_project_ref_path(@project.namespace, @project, @ref, @path || '', offset: (@offset + @limit))}'); - } diff --git a/app/views/projects/repositories/_download_archive.html.haml b/app/views/projects/repositories/_download_archive.html.haml deleted file mode 100644 index b9486a9b492..00000000000 --- a/app/views/projects/repositories/_download_archive.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -- ref = ref || nil -- btn_class = btn_class || '' -- split_button = split_button || false -- if split_button == true - %span.btn-group{class: btn_class} - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn col-xs-10', rel: 'nofollow' do - %i.fa.fa-download - %span Download zip - %a.col-xs-2.btn.dropdown-toggle{ 'data-toggle' => 'dropdown' } - %span.caret - %span.sr-only - Select Archive Format - %ul.col-xs-10.dropdown-menu{ role: 'menu' } - %li - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), rel: 'nofollow' do - %i.fa.fa-download - %span Download zip - %li - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), rel: 'nofollow' do - %i.fa.fa-download - %span Download tar.gz - %li - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.bz2'), rel: 'nofollow' do - %i.fa.fa-download - %span Download tar.bz2 - %li - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar'), rel: 'nofollow' do - %i.fa.fa-download - %span Download tar -- else - %span.btn-group{class: btn_class} - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'zip'), class: 'btn', rel: 'nofollow' do - %i.fa.fa-download - %span zip - = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: ref, format: 'tar.gz'), class: 'btn', rel: 'nofollow' do - %i.fa.fa-download - %span tar.gz diff --git a/app/views/projects/repositories/_feed.html.haml b/app/views/projects/repositories/_feed.html.haml deleted file mode 100644 index f3526ad0747..00000000000 --- a/app/views/projects/repositories/_feed.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -- commit = update -%tr - %td - = link_to namespace_project_commits_path(@project.namespace, @project, commit.head.name) do - %strong - = commit.head.name - - if @project.root_ref?(commit.head.name) - %span.label default - - %td - %div - = link_to namespace_project_commits_path(@project.namespace, @project, commit.id) do - %code= commit.short_id - = image_tag avatar_icon(commit.author_email), class: "", width: 16, alt: '' - = gfm escape_once(truncate(commit.title, length: 40)) - %td - %span.pull-right.cgray - = time_ago_with_tooltip(commit.committed_date) diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml deleted file mode 100644 index ce6b7a0737a..00000000000 --- a/app/views/projects/services/_form.html.haml +++ /dev/null @@ -1,106 +0,0 @@ -%h3.page-title - = @service.title - = boolean_to_icon @service.activated? - -%p= @service.description - -.back-link - = link_to namespace_project_services_path(@project.namespace, @project) do - ← to services - -%hr - -= form_for(@service, as: :service, url: namespace_project_service_path(@project.namespace, @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? - .well - = preserve do - = markdown @service.help - - .form-group - = f.label :active, "Active", class: "control-label" - .col-sm-10 - = f.check_box :active - - - if @service.supported_events.length > 1 - .form-group - = f.label :url, "Trigger", class: 'control-label' - .col-sm-10 - - if @service.supported_events.include?("push") - %div - = f.check_box :push_events, class: 'pull-left' - .prepend-left-20 - = f.label :push_events, class: 'list-label' do - %strong Push events - %p.light - This url will be triggered by a push to the repository - - if @service.supported_events.include?("tag_push") - %div - = f.check_box :tag_push_events, class: 'pull-left' - .prepend-left-20 - = f.label :tag_push_events, class: 'list-label' do - %strong Tag push events - %p.light - This url will be triggered when a new tag is pushed to the repository - - if @service.supported_events.include?("note") - %div - = f.check_box :note_events, class: 'pull-left' - .prepend-left-20 - = f.label :note_events, class: 'list-label' do - %strong Comments - %p.light - This url will be triggered when someone adds a comment - - if @service.supported_events.include?("issue") - %div - = f.check_box :issues_events, class: 'pull-left' - .prepend-left-20 - = f.label :issues_events, class: 'list-label' do - %strong Issues events - %p.light - This url will be triggered when an issue is created - - if @service.supported_events.include?("merge_request") - %div - = f.check_box :merge_requests_events, class: 'pull-left' - .prepend-left-20 - = f.label :merge_requests_events, class: 'list-label' do - %strong Merge Request events - %p.light - This url will be triggered when a merge request is created - - - @service.fields.each do |field| - - name = field[:name] - - title = field[:title] || name.humanize - - value = service_field_value(field[:type], @service.send(name)) - - type = field[:type] - - placeholder = field[:placeholder] - - choices = field[:choices] - - default_choice = field[:default_choice] - - help = field[:help] - - .form-group - = f.label name, title, 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" } - - elsif type == 'password' - = f.password_field name, placeholder: value, class: 'form-control' - - if help - %span.help-block= help - - .form-actions - = f.submit 'Save', class: 'btn btn-save' -   - - if @service.valid? && @service.activated? - - disabled = @service.can_test? ? '':'disabled' - = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}" diff --git a/app/views/projects/services/edit.html.haml b/app/views/projects/services/edit.html.haml deleted file mode 100644 index bcc5832792f..00000000000 --- a/app/views/projects/services/edit.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render 'form' diff --git a/app/views/projects/services/index.html.haml b/app/views/projects/services/index.html.haml deleted file mode 100644 index 0d3ccb6bb83..00000000000 --- a/app/views/projects/services/index.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%h3.page-title Project services -%p.light Project services allow you to integrate GitLab with other applications - -%table.table - %thead - %tr - %th - %th Service - %th Description - %th Last edit - - @services.sort_by(&:title).each do |service| - %tr - %td - = boolean_to_icon service.activated? - %td - = link_to edit_namespace_project_service_path(@project.namespace, @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/projects/show.html.haml b/app/views/projects/show.html.haml deleted file mode 100644 index 4464c51744a..00000000000 --- a/app/views/projects/show.html.haml +++ /dev/null @@ -1,108 +0,0 @@ -- if current_user && can?(current_user, :download_code, @project) - = render 'shared/no_ssh' - = render 'shared/no_password' - -= render "home_panel" - -%ul.nav.nav-tabs - %li.active - = link_to '#tab-activity', 'data-toggle' => 'tab' do - Activity - - if @repository.readme - %li - = link_to '#tab-readme', 'data-toggle' => 'tab' do - Readme - - if @repository.changelog - %li - = link_to changelog_url(@project) do - Changelog - - if @repository.contribution_guide - %li - = link_to contribution_guide_url(@project) do - Contribution guide - - if @repository.license - %li - = link_to license_url(@project) do - License - - .project-home-links - - unless @project.empty_repo? - = link_to pluralize(number_with_delimiter(@repository.commit_count), 'commit'), namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) - = link_to pluralize(number_with_delimiter(@repository.branch_names.count), 'branch'), namespace_project_branches_path(@project.namespace, @project) - = link_to pluralize(number_with_delimiter(@repository.tag_names.count), 'tag'), namespace_project_tags_path(@project.namespace, @project) - %span.light.prepend-left-20= repository_size - -.tab-content - .tab-pane.active#tab-activity - .row - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - %section.col-md-9 - = render "events/event_last_push", event: @last_push - = render 'shared/event_filter' - .content_list - = spinner - %aside.col-md-3.project-side - .clearfix - - if @project.archived? - .alert.alert-warning - %h4 - %i.fa.fa-exclamation-triangle - Archived project! - %p Repository is read-only - - - if @project.forked_from_project - .well - %i.fa.fa-code-fork.project-fork-icon - Forked from: - %br - = link_to @project.forked_from_project.name_with_namespace, project_path(@project.forked_from_project) - - - unless @project.empty_repo? - = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref), class: 'btn btn-block' do - %i.fa.fa-exchange - Compare code - - - if can?(current_user, :download_code, @project) - = render 'projects/repositories/download_archive', split_button: true, btn_class: 'btn-block' - - - if version = @repository.version - - detail_url = changelog_url(@project) || version_url(@project) - = link_to detail_url, class: 'btn btn-block' do - %i.fa.fa-file-text-o - Version: - %span.count - = @repository.blob_by_oid(version.id).data - - .prepend-top-10.append-bottom-10 - %p - %span.light Created on - #{@project.created_at.stamp('Aug 22, 2013')} - %p - %span.light Owned by #{@project.group ? "the" : nil} - - if @project.group - #{link_to @project.group.name, @project.group} group - - else - #{link_to @project.owner_name, @project.owner} - - - .prepend-top-10 - - @project.ci_services.each do |ci_service| - - if ci_service.active? && ci_service.respond_to?(:builds_path) - %hr - - if ci_service.respond_to?(:status_img_path) - = link_to ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink' do - = image_tag ci_service.status_img_path, alt: "build status" - - else - %span.light CI provided by - = link_to ci_service.title, ci_service.builds_path, :'data-no-turbolink' => 'data-no-turbolink' - - - if readme = @repository.readme - .tab-pane#tab-readme - %article.readme-holder#README - = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@repository.root_ref, readme.name)) do - %h4.readme-file-title - %i.fa.fa-file - = readme.name - .wiki - = render_readme(readme) diff --git a/app/views/projects/snippets/_snippet.html.haml b/app/views/projects/snippets/_snippet.html.haml deleted file mode 100644 index b2c35edc44c..00000000000 --- 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 deleted file mode 100644 index 2d4d5d030ab..00000000000 --- a/app/views/projects/snippets/edit.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - Edit snippet -%hr -= render "shared/snippets/form", url: namespace_project_snippet_path(@project.namespace, @project, @snippet) diff --git a/app/views/projects/snippets/index.html.haml b/app/views/projects/snippets/index.html.haml deleted file mode 100644 index e2d8ec673a1..00000000000 --- a/app/views/projects/snippets/index.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -%h3.page-title - Snippets - - if can? current_user, :write_project_snippet, @project - = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: "btn btn-new pull-right", title: "New Snippet" do - Add new snippet - -%p.light - Share code pastes with others out of git repository - -%hr -%ul.bordered-list - = render partial: "projects/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 deleted file mode 100644 index bb659dba0cf..00000000000 --- a/app/views/projects/snippets/new.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - New snippet -%hr -= render "shared/snippets/form", url: namespace_project_snippets_path(@project.namespace, @project, @snippet) diff --git a/app/views/projects/snippets/show.html.haml b/app/views/projects/snippets/show.html.haml deleted file mode 100644 index d19689a1056..00000000000 --- a/app/views/projects/snippets/show.html.haml +++ /dev/null @@ -1,37 +0,0 @@ -%h3.page-title - = @snippet.title - - .pull-right - = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: "btn btn-new", title: "New Snippet" do - Add new snippet - -%hr - -.append-bottom-20 - .pull-right - = "##{@snippet.id}" - %span.light - by - = link_to user_path(@snippet.author) do - = image_tag avatar_icon(@snippet.author_email), class: "avatar avatar-inline s16" - = @snippet.author_name - - .back-link - = link_to namespace_project_snippets_path(@project.namespace, @project) do - ← project snippets - -.file-holder - .file-title - %i.fa.fa-file - %strong - = @snippet.file_name - .file-actions - .btn-group - - if can?(current_user, :modify_project_snippet, @snippet) - = link_to "edit", edit_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-sm", title: 'Edit Snippet' - = link_to "raw", raw_namespace_project_snippet_path(@project.namespace, @project, @snippet), class: "btn btn-sm", target: "_blank" - - if can?(current_user, :admin_project_snippet, @snippet) - = link_to "remove", namespace_project_snippet_path(@project.namespace, @project, @snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-remove", title: 'Delete Snippet' - = render 'shared/snippets/blob' - -%div#notes= render "projects/notes/notes_with_form" diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml deleted file mode 100644 index 28ad272322f..00000000000 --- a/app/views/projects/tags/_tag.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -- commit = @repository.commit(tag.target) -%li - %h4 - = link_to namespace_project_commits_path(@project.namespace, @project, tag.name), class: "" do - %i.fa.fa-tag - = tag.name - - if tag.message.present? -   - = strip_gpg_signature(tag.message) - .pull-right - - 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) - = link_to namespace_project_tag_path(@project.namespace, @project, tag.name), class: 'btn btn-xs btn-remove remove-row grouped', method: :delete, data: { confirm: 'Removed tag cannot be restored. Are you sure?'}, remote: true do - %i.fa.fa-trash-o - - - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project - - else - %p - Cant find HEAD commit for this tag diff --git a/app/views/projects/tags/destroy.js.haml b/app/views/projects/tags/destroy.js.haml deleted file mode 100644 index ada6710f940..00000000000 --- a/app/views/projects/tags/destroy.js.haml +++ /dev/null @@ -1,3 +0,0 @@ -$('.js-totaltags-count').html("#{@repository.tags.size}") -- if @repository.tags.size == 0 - $('.tags').load(document.URL + ' .nothing-here-block').hide().fadeIn(1000) diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml deleted file mode 100644 index f1bc2bc9a2b..00000000000 --- a/app/views/projects/tags/index.html.haml +++ /dev/null @@ -1,30 +0,0 @@ -= render "projects/commits/head" - -%h3.page-title - Git Tags - - 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 - -.tags - - unless @tags.empty? - %ul.bordered-list - - @tags.each do |tag| - = render 'tag', tag: @repository.find_tag(tag) - - = paginate @tags, theme: 'gitlab' - - - else - .nothing-here-block - Repository has no tags yet. - %br - %small - Use git tag command to add a new one: - %br - %span.monospace git tag -a v1.4 -m 'version 1.4' diff --git a/app/views/projects/tags/new.html.haml b/app/views/projects/tags/new.html.haml deleted file mode 100644 index 655044438d5..00000000000 --- a/app/views/projects/tags/new.html.haml +++ /dev/null @@ -1,34 +0,0 @@ -- if @error - .alert.alert-danger - %button{ type: "button", class: "close", "data-dismiss" => "alert"} × - = @error -%h3.page-title - %i.fa.fa-code-fork - New tag -= form_tag namespace_project_tags_path, method: :post, id: "new-tag-form", class: "form-horizontal" do - .form-group - = label_tag :tag_name, 'Name for new tag', class: 'control-label' - .col-sm-10 - = text_field_tag :tag_name, params[:tag_name], placeholder: 'v3.0.1', required: true, tabindex: 1, class: 'form-control' - .form-group - = label_tag :ref, 'Create from', class: 'control-label' - .col-sm-10 - = text_field_tag :ref, params[:ref], placeholder: 'master', required: true, tabindex: 2, class: 'form-control' - .light Branch name or commit SHA - .form-group - = label_tag :message, 'Message', class: 'control-label' - .col-sm-10 - = text_field_tag :message, nil, placeholder: 'Enter message.', required: false, tabindex: 3, class: 'form-control' - .light (Optional) Entering a message will create an annotated tag. - .form-actions - = button_tag 'Create tag', class: 'btn btn-create', tabindex: 3 - = link_to 'Cancel', namespace_project_tags_path(@project.namespace, @project), class: 'btn btn-cancel' - -:javascript - disableButtonIfAnyEmptyField($("#new-tag-form"), ".form-control", ".btn-create"); - var availableTags = #{@project.repository.ref_names.to_json}; - - $("#ref").autocomplete({ - source: availableTags, - minLength: 1 - }); diff --git a/app/views/projects/transfer.js.haml b/app/views/projects/transfer.js.haml deleted file mode 100644 index 17b9fecfeb1..00000000000 --- a/app/views/projects/transfer.js.haml +++ /dev/null @@ -1,2 +0,0 @@ -:plain - location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; diff --git a/app/views/projects/tree/_blob_item.html.haml b/app/views/projects/tree/_blob_item.html.haml deleted file mode 100644 index 02ecbade219..00000000000 --- a/app/views/projects/tree/_blob_item.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%tr{ class: "tree-item #{tree_hex_class(blob_item)}" } - %td.tree-item-file-name - = tree_icon(type, blob_item.mode, blob_item.name) - %span.str-truncated - = link_to blob_item.name, namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)) - %td.tree_time_ago.cgray - = render 'spinner' - %td.hidden-xs.tree_commit diff --git a/app/views/projects/tree/_readme.html.haml b/app/views/projects/tree/_readme.html.haml deleted file mode 100644 index f082d711865..00000000000 --- a/app/views/projects/tree/_readme.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%article.readme-holder#README - = link_to '#README' do - %h4.readme-file-title - %i.fa.fa-file - = readme.name - .wiki - = render_readme(readme) diff --git a/app/views/projects/tree/_spinner.html.haml b/app/views/projects/tree/_spinner.html.haml deleted file mode 100644 index b47ad0f41e4..00000000000 --- a/app/views/projects/tree/_spinner.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%span.log_loading.hide - %i.fa.fa-spinner.fa-spin - Loading commit data... diff --git a/app/views/projects/tree/_submodule_item.html.haml b/app/views/projects/tree/_submodule_item.html.haml deleted file mode 100644 index 2b5f671c09e..00000000000 --- a/app/views/projects/tree/_submodule_item.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%tr{ class: "tree-item" } - %td.tree-item-file-name - %i.fa.fa-archive.fa-fw - = submodule_link(submodule_item, @ref) - %td - %td.hidden-xs diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml deleted file mode 100644 index d304690d162..00000000000 --- a/app/views/projects/tree/_tree.html.haml +++ /dev/null @@ -1,53 +0,0 @@ -%ul.breadcrumb.repo-breadcrumb - %li - = link_to namespace_project_tree_path(@project.namespace, @project, @ref) do - = @project.path - - tree_breadcrumbs(tree, 6) do |title, path| - %li - - if path - = link_to truncate(title, length: 40), namespace_project_tree_path(@project.namespace, @project, path) - - else - = link_to title, '#' - - if current_user && can_push_branch?(@project, @ref) - %li - = link_to namespace_project_new_blob_path(@project.namespace, @project, @id), title: 'New file', id: 'new-file-link' do - %small - %i.fa.fa-plus - -%div#tree-content-holder.tree-content-holder - %table#tree-slider{class: "table_#{@hex_path} tree-table" } - %thead - %tr - %th Name - %th Last Update - %th.hidden-xs - .pull-left Last Commit - .last-commit.hidden-sm.pull-left -   - %i.fa.fa-angle-right -   - %small.light - = link_to @commit.short_id, namespace_project_commit_path(@project.namespace, @project, @commit) - – - = truncate(@commit.title, length: 50) - = link_to 'History', namespace_project_commits_path(@project.namespace, @project, @id), class: 'pull-right' - - - if @path.present? - %tr.tree-item - %td.tree-item-file-name - = link_to "..", namespace_project_tree_path(@project.namespace, @project, up_dir_path), class: 'prepend-left-10' - %td - %td.hidden-xs - - = render_tree(tree) - - - if tree.readme - = render "projects/tree/readme", readme: tree.readme - -%div.tree_progress - -:javascript - // Load last commit log for each file in tree - $('#tree-slider').waitForImages(function() { - ajaxGet('#{@logs_path}'); - }); diff --git a/app/views/projects/tree/_tree_commit_column.html.haml b/app/views/projects/tree/_tree_commit_column.html.haml deleted file mode 100644 index 50521264a61..00000000000 --- a/app/views/projects/tree/_tree_commit_column.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%span.str-truncated - %span.tree_author= commit_author_link(commit, avatar: true, size: 16) - = link_to_gfm commit.title, namespace_project_commit_path(@project.namespace, @project, commit.id), class: "tree-commit-link" diff --git a/app/views/projects/tree/_tree_item.html.haml b/app/views/projects/tree/_tree_item.html.haml deleted file mode 100644 index e87138bf980..00000000000 --- a/app/views/projects/tree/_tree_item.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -%tr{ class: "tree-item #{tree_hex_class(tree_item)}" } - %td.tree-item-file-name - = tree_icon(type, tree_item.mode, tree_item.name) - %span.str-truncated - - path = flatten_tree(tree_item) - = link_to path, namespace_project_tree_path(@project.namespace, @project, tree_join(@id || @commit.id, path)) - %td.tree_time_ago.cgray - = render 'spinner' - %td.hidden-xs.tree_commit diff --git a/app/views/projects/tree/show.html.haml b/app/views/projects/tree/show.html.haml deleted file mode 100644 index feca1453697..00000000000 --- a/app/views/projects/tree/show.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.tree-ref-holder - = render 'shared/ref_switcher', destination: 'tree', path: @path - -- if can? current_user, :download_code, @project - .tree-download-holder - = render 'projects/repositories/download_archive', ref: @ref, btn_class: 'btn-group-sm pull-right hidden-xs hidden-sm', split_button: true - -#tree-holder.tree-holder.clearfix - = render "tree", tree: @tree diff --git a/app/views/projects/update.js.haml b/app/views/projects/update.js.haml deleted file mode 100644 index 4f3f4cab8d5..00000000000 --- a/app/views/projects/update.js.haml +++ /dev/null @@ -1,9 +0,0 @@ -- if @project.valid? - :plain - location.href = "#{edit_namespace_project_path(@project.namespace, @project)}"; -- else - :plain - $(".project-edit-errors").html("#{escape_javascript(render('errors'))}"); - $('.save-project-loader').hide(); - $('.project-edit-container').show(); - $('.project-edit-content .btn-save').enableButton(); diff --git a/app/views/projects/wikis/_form.html.haml b/app/views/projects/wikis/_form.html.haml deleted file mode 100644 index 9fbfa0b1aeb..00000000000 --- a/app/views/projects/wikis/_form.html.haml +++ /dev/null @@ -1,46 +0,0 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @page], method: @page.persisted? ? :put : :post, html: { class: 'form-horizontal wiki-form gfm-form' } do |f| - -if @page.errors.any? - #error_explanation - .alert.alert-danger - - @page.errors.full_messages.each do |msg| - %p= msg - - = f.hidden_field :title, value: @page.title - .form-group - = f.label :format, class: 'control-label' - .col-sm-10 - = f.select :format, options_for_select(ProjectWiki::MARKUPS, {selected: @page.format}), {}, class: "form-control" - - .row - .col-sm-2 - .col-sm-10 - %p.cgray - To link to a (new) page you can just type - %code [Link Title](page-slug) - \. - - .form-group.wiki-content - = f.label :content, class: 'control-label' - .col-sm-10 - = render layout: 'projects/md_preview', locals: { preview_class: "wiki" } 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'} - .pull-right Attach files by dragging & dropping or #{link_to "selecting them", '#', class: 'markdown-selector' }. - - .clearfix - .error-alert - .form-group - = f.label :commit_message, class: 'control-label' - .col-sm-10= f.text_field :message, class: 'form-control', rows: 18 - - .form-actions - - if @page && @page.persisted? - = f.submit 'Save changes', class: "btn-save btn" - = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-cancel" - - else - = f.submit 'Create page', class: "btn-create btn" - = link_to "Cancel", namespace_project_wiki_path(@project.namespace, @project, :home), class: "btn btn-cancel" - -:javascript - window.project_uploads_path = "#{namespace_project_uploads_path @project.namespace, @project}"; diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml deleted file mode 100644 index 633214a4e86..00000000000 --- a/app/views/projects/wikis/_main_links.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -%span.pull-right - - if (@page && @page.persisted?) - = link_to history_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do - Page History - - if can?(current_user, :write_wiki, @project) - = link_to edit_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do - %i.fa.fa-pencil-square-o - Edit diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml deleted file mode 100644 index 693c3facb32..00000000000 --- a/app/views/projects/wikis/_nav.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -%ul.nav.nav-tabs - = 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) - - = nav_link(path: 'wikis#git_access') do - = link_to git_access_namespace_project_wikis_path(@project.namespace, @project) do - %i.fa.fa-download - Git Access - - - if can?(current_user, :write_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/_new.html.haml b/app/views/projects/wikis/_new.html.haml deleted file mode 100644 index 6834969de8b..00000000000 --- a/app/views/projects/wikis/_new.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -%div#modal-new-wiki.modal.hide - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3.page-title New Wiki Page - .modal-body - = label_tag :new_wiki_path do - %span Page slug - = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project) - %p.hint - Please don't use spaces. - .modal-footer - = link_to 'Build', '#', class: 'build-new-wiki btn btn-create' diff --git a/app/views/projects/wikis/edit.html.haml b/app/views/projects/wikis/edit.html.haml deleted file mode 100644 index 566850cb78d..00000000000 --- a/app/views/projects/wikis/edit.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -= render 'nav' -.pull-right - = render 'main_links' -%h3.page-title - Editing - - %span.light #{@page.title} -%hr -= render 'form' - -.pull-right - - if @page.persisted? && can?(current_user, :admin_wiki, @project) - = link_to namespace_project_wiki_path(@project.namespace, @project, @page), data: { confirm: "Are you sure you want to delete this page?"}, method: :delete, class: "btn btn-sm btn-remove" do - Delete this page diff --git a/app/views/projects/wikis/empty.html.haml b/app/views/projects/wikis/empty.html.haml deleted file mode 100644 index 48058124f97..00000000000 --- a/app/views/projects/wikis/empty.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title Empty page -%hr -.error_message - You are not allowed to create wiki pages diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml deleted file mode 100644 index 365edb524f4..00000000000 --- a/app/views/projects/wikis/git_access.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -= render 'nav' -.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 - -.git-empty - %fieldset - %legend Install Gollum: - %pre.dark - :preserve - gem install gollum - - %legend Clone Your Wiki: - %pre.dark - :preserve - git clone #{ content_tag(:span, default_url_to_repo(@project_wiki), class: 'clone')} - cd #{@project_wiki.path} - - %legend Start Gollum And Edit Locally: - %pre.dark - :preserve - gollum - == Sinatra/1.3.5 has taken the stage on 4567 for development with backup from Thin - >> Thin web server (v1.5.0 codename Knife) - >> Maximum connections set to 1024 - >> Listening on 0.0.0.0:4567, CTRL+C to stop diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml deleted file mode 100644 index 91291f753f7..00000000000 --- a/app/views/projects/wikis/history.html.haml +++ /dev/null @@ -1,30 +0,0 @@ -= render 'nav' -%h3.page-title - %span.light History for - = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) - -%table.table - %thead - %tr - %th Page version - %th Author - %th Commit Message - %th Last updated - %th Format - %tbody - - @page.versions.each_with_index do |version, index| - - commit = version - %tr - %td - = link_to project_wiki_path_with_version(@project, @page, - commit.id, index == 0) do - = truncate_sha(commit.id) - %td - = commit.author.name - %td - = commit.message - %td - #{time_ago_with_tooltip(version.authored_date)} - %td - %strong - = @page.page.wiki.page(@page.page.name, commit.id).try(:format) diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml deleted file mode 100644 index ee233d9086f..00000000000 --- a/app/views/projects/wikis/pages.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -= render 'nav' -%h3.page-title - All Pages -%ul.bordered-list - - @wiki_pages.each do |wiki_page| - %li - %h4 - = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) - %small (#{wiki_page.format}) - .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} -= paginate @wiki_pages, theme: 'gitlab' diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml deleted file mode 100644 index a6263e93f67..00000000000 --- a/app/views/projects/wikis/show.html.haml +++ /dev/null @@ -1,20 +0,0 @@ -= render 'nav' -%h3.page-title - = @page.title - = render 'main_links' -- 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)}. - -%hr - -.wiki-holder - .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)} diff --git a/app/views/search/_filter.html.haml b/app/views/search/_filter.html.haml deleted file mode 100644 index ffc145497ab..00000000000 --- a/app/views/search/_filter.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -.dropdown.inline - %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-tags - %span.light Group: - - if @group.present? - %strong= @group.name - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to search_filter_path(group_id: nil) do - Any - - current_user.authorized_groups.sort_by(&:name).each do |group| - %li - = link_to search_filter_path(group_id: group.id, project_id: nil) do - = group.name - -.dropdown.inline.prepend-left-10.project-filter - %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'} - %i.fa.fa-tags - %span.light Project: - - if @project.present? - %strong= @project.name_with_namespace - - else - Any - %b.caret - %ul.dropdown-menu - %li - = link_to search_filter_path(project_id: nil) do - Any - - current_user.authorized_projects.sort_by(&:name_with_namespace).each do |project| - %li - = link_to search_filter_path(project_id: project.id, group_id: nil) do - = project.name_with_namespace diff --git a/app/views/search/_global_filter.html.haml b/app/views/search/_global_filter.html.haml deleted file mode 100644 index 442bd84f930..00000000000 --- a/app/views/search/_global_filter.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -%ul.nav.nav-pills.nav-stacked.search-filter - %li{class: ("active" if @scope == 'projects')} - = link_to search_filter_path(scope: 'projects') do - Projects - .pull-right - = @search_results.projects_count - %li{class: ("active" if @scope == 'issues')} - = link_to search_filter_path(scope: 'issues') do - Issues - .pull-right - = @search_results.issues_count - %li{class: ("active" if @scope == 'merge_requests')} - = link_to search_filter_path(scope: 'merge_requests') do - Merge requests - .pull-right - = @search_results.merge_requests_count diff --git a/app/views/search/_project_filter.html.haml b/app/views/search/_project_filter.html.haml deleted file mode 100644 index ad933502a28..00000000000 --- a/app/views/search/_project_filter.html.haml +++ /dev/null @@ -1,32 +0,0 @@ -%ul.nav.nav-pills.nav-stacked.search-filter - %li{class: ("active" if @scope == 'blobs')} - = link_to search_filter_path(scope: 'blobs') do - %i.fa.fa-code - Code - .pull-right - = @search_results.blobs_count - %li{class: ("active" if @scope == 'issues')} - = link_to search_filter_path(scope: 'issues') do - %i.fa.fa-exclamation-circle - Issues - .pull-right - = @search_results.issues_count - %li{class: ("active" if @scope == 'merge_requests')} - = link_to search_filter_path(scope: 'merge_requests') do - %i.fa.fa-code-fork - Merge requests - .pull-right - = @search_results.merge_requests_count - %li{class: ("active" if @scope == 'notes')} - = link_to search_filter_path(scope: 'notes') do - %i.fa.fa-comments - Comments - .pull-right - = @search_results.notes_count - %li{class: ("active" if @scope == 'wiki_blobs')} - = link_to search_filter_path(scope: 'wiki_blobs') do - %i.fa.fa-book - Wiki - .pull-right - = @search_results.wiki_blobs_count - diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml deleted file mode 100644 index 796dd752a4c..00000000000 --- a/app/views/search/_results.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -%h4 - #{@search_results.total_count} results found - - unless @show_snippets - - if @project - for #{link_to @project.name_with_namespace, [@project.namespace.becomes(Namespace), @project]} - - elsif @group - for #{link_to @group.name, @group} - -%hr - -.row - .col-sm-3 - - if @project - = render "project_filter" - - elsif @show_snippets - = render 'snippet_filter' - - else - = render "global_filter" - .col-sm-9 - .search-results - - if @search_results.empty? - = render partial: "search/results/empty", locals: { message: "We couldn't find any matching results" } - - else - = render partial: "search/results/#{@scope.singularize}", collection: @objects - = paginate @objects, theme: 'gitlab' - -:javascript - $(".search-results .term").highlight("#{escape_javascript(params[:search])}"); diff --git a/app/views/search/_snippet_filter.html.haml b/app/views/search/_snippet_filter.html.haml deleted file mode 100644 index 95d23fa9f47..00000000000 --- a/app/views/search/_snippet_filter.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%ul.nav.nav-pills.nav-stacked.search-filter - %li{class: ("active" if @scope == 'snippet_blobs')} - = link_to search_filter_path(scope: 'snippet_blobs', snippets: true, group_id: nil, project_id: nil) do - %i.fa.fa-code - Snippet Contents - .pull-right - = @search_results.snippet_blobs_count - %li{class: ("active" if @scope == 'snippet_titles')} - = link_to search_filter_path(scope: 'snippet_titles', snippets: true, group_id: nil, project_id: nil) do - %i.fa.fa-book - Titles and Filenames - .pull-right - = @search_results.snippet_titles_count diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml deleted file mode 100644 index 84e9be82c44..00000000000 --- a/app/views/search/results/_blob.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.blob-result - .file-holder - .file-title - = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(blob.ref, blob.filename), :anchor => "L" + blob.startline.to_s) do - %i.fa.fa-file - %strong - = blob.filename - .file-content.code.term - = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, user_color_scheme_class: 'white' diff --git a/app/views/search/results/_empty.html.haml b/app/views/search/results/_empty.html.haml deleted file mode 100644 index 01fb8cd9b8e..00000000000 --- a/app/views/search/results/_empty.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -.search_box - .search_glyph - %span.fa.fa-search - %h4 #{message} diff --git a/app/views/search/results/_issue.html.haml b/app/views/search/results/_issue.html.haml deleted file mode 100644 index ce8ddff9556..00000000000 --- a/app/views/search/results/_issue.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.search-result-row - %h4 - = link_to [issue.project.namespace.becomes(Namespace), issue.project, issue] do - %span.term.str-truncated= issue.title - .pull-right ##{issue.iid} - - if issue.description.present? - .description.term - = preserve do - = search_md_sanitize(markdown(issue.description)) - %span.light - #{issue.project.name_with_namespace} - - if issue.closed? - .pull-right - %span.label.label-danger Closed diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml deleted file mode 100644 index 2efa616d664..00000000000 --- a/app/views/search/results/_merge_request.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -.search-result-row - %h4 - = link_to [merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request] do - %span.term.str-truncated= merge_request.title - .pull-right ##{merge_request.iid} - - if merge_request.description.present? - .description.term - = preserve do - = search_md_sanitize(markdown(merge_request.description)) - %span.light - #{merge_request.project.name_with_namespace} - .pull-right - - if merge_request.merged? - %span.label.label-primary Merged - - elsif merge_request.closed? - %span.label.label-danger Closed diff --git a/app/views/search/results/_note.html.haml b/app/views/search/results/_note.html.haml deleted file mode 100644 index 5fcba2b7e93..00000000000 --- a/app/views/search/results/_note.html.haml +++ /dev/null @@ -1,26 +0,0 @@ -- project = note.project -.search-result-row - %h5.note-search-caption.str-truncated - %i.fa.fa-comment - = link_to_member(project, note.author, avatar: false) - commented on - - - if note.for_commit? - = link_to project do - = project.name_with_namespace - · - = link_to namespace_project_commit_path(project.namespace, project, note.commit_id, anchor: dom_id(note)) do - Commit #{truncate_sha(note.commit_id)} - - else - = link_to project do - = project.name_with_namespace - · - %span #{note.noteable_type.titleize} ##{note.noteable.iid} - · - = link_to [project.namespace.becomes(Namespace), project, note.noteable, anchor: dom_id(note)] do - = note.noteable.title - - .note-search-result - .term - = preserve do - = search_md_sanitize(markdown(note.note, {no_header_anchors: true})) diff --git a/app/views/search/results/_project.html.haml b/app/views/search/results/_project.html.haml deleted file mode 100644 index 195cf06c8ea..00000000000 --- 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 deleted file mode 100644 index 8af393777f0..00000000000 --- a/app/views/search/results/_snippet_blob.html.haml +++ /dev/null @@ -1,59 +0,0 @@ -.search-result-row - %span - = snippet_blob[:snippet_object].title - by - = link_to user_snippets_path(snippet_blob[:snippet_object].author) do - = image_tag avatar_icon(snippet_blob[:snippet_object].author_email), class: "avatar avatar-inline s16", alt: '' - = snippet_blob[:snippet_object].author_name - %span.light #{time_ago_with_tooltip(snippet_blob[:snippet_object].created_at)} - %h4.snippet-title - - snippet_path = reliable_snippet_path(snippet_blob[:snippet_object]) - = link_to snippet_path do - .file-holder - .file-title - %i.fa.fa-file - %strong= snippet_blob[:snippet_object].file_name - - if gitlab_markdown?(snippet_blob[:snippet_object].file_name) - .file-content.wiki - - snippet_blob[:snippet_chunks].each do |snippet| - - unless snippet[:data].empty? - = preserve do - = markdown(snippet[:data]) - - else - .file-content.code - .nothing-here-block Empty file - - elsif markup?(snippet_blob[:snippet_object].file_name) - .file-content.wiki - - snippet_blob[:snippet_chunks].each do |snippet| - - unless snippet[:data].empty? - = render_markup(snippet_blob[:snippet_object].file_name, snippet[:data]) - - else - .file-content.code - .nothing-here-block Empty file - - else - .file-content.code - %div.highlighted-data{class: user_color_scheme_class} - .line-numbers - - snippet_blob[:snippet_chunks].each do |snippet| - - unless snippet[:data].empty? - - snippet[:data].lines.to_a.size.times do |index| - - offset = defined?(snippet[:start_line]) ? snippet[:start_line] : 1 - - i = index + offset - = link_to snippet_path+"#L#{i}", id: "L#{i}", rel: "#L#{i}" do - %i.fa.fa-link - = i - - unless snippet == snippet_blob[:snippet_chunks].last - %a - = "." - .highlight.term - %pre - %code - - snippet_blob[:snippet_chunks].each do |snippet| - - unless snippet[:data].empty? - = snippet[:data] - - unless snippet == snippet_blob[:snippet_chunks].last - %a - = "..." - - else - .file-content.code - .nothing-here-block Empty file diff --git a/app/views/search/results/_snippet_title.html.haml b/app/views/search/results/_snippet_title.html.haml deleted file mode 100644 index c414acb6a11..00000000000 --- a/app/views/search/results/_snippet_title.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -.search-result-row - %h4.snippet-title.term - = link_to reliable_snippet_path(snippet_title) do - = truncate(snippet_title.title, length: 60) - - if snippet_title.private? - %span.label.label-gray - %i.fa.fa-lock - private - %span.cgray.monospace.tiny.pull-right.term - = snippet_title.file_name - - %small.pull-right.cgray - - if snippet_title.project_id? - = link_to snippet_title.project.name_with_namespace, namespace_project_path(snippet_title.project.namespace, snippet_title.project) - - .snippet-info - = "##{snippet_title.id}" - %span - by - = link_to user_snippets_path(snippet_title.author) do - = image_tag avatar_icon(snippet_title.author_email), class: "avatar avatar-inline s16", alt: '' - = snippet_title.author_name - %span.light #{time_ago_with_tooltip(snippet_title.created_at)} diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml deleted file mode 100644 index f9c5810e3d0..00000000000 --- a/app/views/search/results/_wiki_blob.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.blob-result - .file-holder - .file-title - = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_blob.filename) do - %i.fa.fa-file - %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' diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml deleted file mode 100644 index 5b4816e4c40..00000000000 --- a/app/views/search/show.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -= form_tag search_path, method: :get, class: 'form-horizontal' do |f| - .search-holder.clearfix - .form-group - = label_tag :search, class: 'control-label' do - %span Looking for - .col-sm-6 - = search_field_tag :search, params[:search], placeholder: "issue 143", class: "form-control search-text-input", id: "dashboard_search" - .col-sm-4 - = button_tag 'Search', class: "btn btn-create" - .form-group - .col-sm-2 - - unless params[:snippets].eql? 'true' - .col-sm-10 - = render 'filter', f: 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] - - .results.prepend-top-10 - - if params[:search].present? - = render 'search/results' diff --git a/app/views/shared/_choose_group_avatar_button.html.haml b/app/views/shared/_choose_group_avatar_button.html.haml deleted file mode 100644 index 000532b1c9a..00000000000 --- a/app/views/shared/_choose_group_avatar_button.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%a.choose-btn.btn.btn-sm.js-choose-group-avatar-button - %i.fa.fa-paperclip - %span Choose File ... -  -%span.file_name.js-avatar-filename File name... -= f.file_field :avatar, class: 'js-group-avatar-input hidden' -.light The maximum file size allowed is 200KB. diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml deleted file mode 100644 index a1121750ca3..00000000000 --- a/app/views/shared/_clone_panel.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -- project = project || @project -.git-clone-holder.input-group - .input-group-btn - %button{ | - 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", - :"data-container" => "body"} - SSH - %button{ | - 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: "one_click_select 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" } - = visibility_level_icon(project.visibility_level) - = visibility_level_label(project.visibility_level).downcase diff --git a/app/views/shared/_commit_message_container.html.haml b/app/views/shared/_commit_message_container.html.haml deleted file mode 100644 index 5071ff640f1..00000000000 --- a/app/views/shared/_commit_message_container.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.form-group.commit_message-group - = label_tag 'commit_message', class: 'control-label' do - Commit message - .col-sm-10 - .commit-message-container - .max-width-marker - = text_area_tag 'commit_message', - (params[:commit_message] || local_assigns[:text]), - class: 'form-control', placeholder: local_assigns[:placeholder], - required: true, rows: (local_assigns[:rows] || 3) - - if local_assigns[:hint] - %p.hint - Try to keep the first line under 52 characters - and the others under 72. diff --git a/app/views/shared/_confirm_modal.html.haml b/app/views/shared/_confirm_modal.html.haml deleted file mode 100644 index 30ba361c860..00000000000 --- a/app/views/shared/_confirm_modal.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -#modal-confirm-danger.modal.hide{tabindex: -1} - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h4 Confirmation required - - .modal-body - %p.cred.lead.js-confirm-text - - %p - This action can lead to data loss. - To prevent accidental actions we ask you to confirm your intention. - %br - Please type - %code.js-confirm-danger-match #{phrase} - to proceed or close this modal to cancel - - .form-group - = text_field_tag 'confirm_name_input', '', class: 'form-control js-confirm-danger-input' - .form-group - = submit_tag 'Confirm', class: "btn btn-danger js-confirm-danger-submit" diff --git a/app/views/shared/_event_filter.html.haml b/app/views/shared/_event_filter.html.haml deleted file mode 100644 index d07a9e2b924..00000000000 --- a/app/views/shared/_event_filter.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -%ul.nav.nav-pills.event_filter - = event_filter_link EventFilter.push, 'Push events' - = event_filter_link EventFilter.merged, 'Merge events' - = event_filter_link EventFilter.comments, 'Comments' - = event_filter_link EventFilter.team, 'Team' - - - if current_user - - if current_controller?(:dashboard) - %li.pull-right - = link_to dashboard_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do - %i.fa.fa-rss - News Feed - - - if current_controller?(:groups) - %li.pull-right - = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do - %i.fa.fa-rss - News Feed -%hr diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml deleted file mode 100644 index fba69dd0f3f..00000000000 --- a/app/views/shared/_file_highlight.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -.file-content.code{class: user_color_scheme_class} - .line-numbers - - if blob.data.present? - - blob.data.lines.to_a.size.times do |index| - - offset = defined?(first_line_number) ? first_line_number : 1 - - i = index + offset - = link_to "#L#{i}", id: "L#{i}", rel: "#L#{i}" do - %i.fa.fa-link - = i - :preserve - #{highlight(blob.name, blob.data)} diff --git a/app/views/shared/_group_form.html.haml b/app/views/shared/_group_form.html.haml deleted file mode 100644 index c0a9923348e..00000000000 --- a/app/views/shared/_group_form.html.haml +++ /dev/null @@ -1,29 +0,0 @@ -- if @group.persisted? - .form-group - = f.label :name, class: 'control-label' do - Group name - .col-sm-10 - = f.text_field :name, placeholder: 'open-source', class: 'form-control' - -.form-group - = f.label :path, class: 'control-label' do - Group path - .col-sm-10 - .input-group - .input-group-addon - = root_url - = f.text_field :path, placeholder: 'open-source', class: 'form-control', - autofocus: local_assigns[:autofocus] || false - - if @group.persisted? - .alert.alert-warning.prepend-top-10 - %ul - %li Changing group path can have unintended side effects. - %li Renaming group path will rename directory for all related projects - %li It will change web url for access group and group projects. - %li It will change the git path to repositories under this group. - -.form-group.group-description-holder - = f.label :description, 'Details', class: 'control-label' - .col-sm-10 - = f.text_area :description, maxlength: 250, - class: 'form-control js-gfm-input', rows: 4 diff --git a/app/views/shared/_group_tips.html.haml b/app/views/shared/_group_tips.html.haml deleted file mode 100644 index e5cf783beb7..00000000000 --- a/app/views/shared/_group_tips.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%ul - %li A group is a collection of several projects - %li Groups are private by default - %li Members of a group may only view projects they have permission to access - %li Group project URLs are prefixed with the group namespace - %li Existing projects may be moved into a group diff --git a/app/views/shared/_issuable_filter.html.haml b/app/views/shared/_issuable_filter.html.haml deleted file mode 100644 index 83f5a3a8015..00000000000 --- a/app/views/shared/_issuable_filter.html.haml +++ /dev/null @@ -1,58 +0,0 @@ -.issues-filters - .issues-state-filters - %ul.nav.nav-tabs - %li{class: ("active" if params[:state] == 'opened')} - = link_to page_filter_path(state: 'opened') do - %i.fa.fa-exclamation-circle - Open - %li{class: ("active" if params[:state] == 'closed')} - = link_to page_filter_path(state: 'closed') do - %i.fa.fa-check-circle - Closed - %li{class: ("active" if params[:state] == 'all')} - = link_to page_filter_path(state: 'all') do - %i.fa.fa-compass - All - - .issues-details-filters - = form_tag page_filter_path(without: [:assignee_id, :author_id, :milestone_id, :label_name]), method: :get, class: 'filter-form' do - - if controller.controller_name == 'issues' - .check-all-holder - = check_box_tag "check_all_issues", nil, false, - class: "check_all_issues left", - disabled: !can?(current_user, :modify_issue, @project) - .issues-other-filters - .filter-item.inline - = users_select_tag(:assignee_id, selected: params[:assignee_id], - placeholder: 'Assignee', class: 'trigger-submit', any_user: true, null_user: true, first_user: true) - - .filter-item.inline - = users_select_tag(:author_id, selected: params[:author_id], - placeholder: 'Author', class: 'trigger-submit', any_user: true, first_user: true) - - .filter-item.inline.milestone-filter - = select_tag('milestone_id', projects_milestones_options, class: "select2 trigger-submit", prompt: 'Milestone') - - - if @project - .filter-item.inline.labels-filter - = select_tag('label_name', project_labels_options(@project), class: "select2 trigger-submit", prompt: 'Label') - - .pull-right - = render 'shared/sort_dropdown' - - - if controller.controller_name == 'issues' - .issues_bulk_update.hide - = form_tag bulk_update_namespace_project_issues_path(@project.namespace, @project), method: :post do - = select_tag('update[state_event]', options_for_select([['Open', 'reopen'], ['Closed', 'close']]), prompt: "Status", class: 'form-control') - = users_select_tag('update[assignee_id]', placeholder: 'Assignee', null_user: true) - = select_tag('update[milestone_id]', bulk_update_milestone_options, prompt: "Milestone") - = hidden_field_tag 'update[issues_ids]', [] - = hidden_field_tag :state_event, params[:state_event] - = button_tag "Update issues", class: "btn update_selected_issues btn-save" - -:coffeescript - new UsersSelect() - - $('form.filter-form').on 'submit', (event) -> - event.preventDefault() - Turbolinks.visit @.action + '&' + $(@).serialize() diff --git a/app/views/shared/_issuable_search_form.html.haml b/app/views/shared/_issuable_search_form.html.haml deleted file mode 100644 index 639d203dcd6..00000000000 --- a/app/views/shared/_issuable_search_form.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -= form_tag(path, method: :get, id: "issue_search_form", class: 'pull-left issue-search-form') do - .append-right-10.hidden-xs.hidden-sm - = search_field_tag :issue_search, params[:issue_search], { placeholder: 'Filter by title or description', class: 'form-control issue_search search-text-input input-mn-300' } - = hidden_field_tag :state, params['state'] - = hidden_field_tag :scope, params['scope'] - = hidden_field_tag :assignee_id, params['assignee_id'] - = hidden_field_tag :author_id, params['author_id'] - = hidden_field_tag :milestone_id, params['milestone_id'] - = hidden_field_tag :label_id, params['label_id'] diff --git a/app/views/shared/_issues.html.haml b/app/views/shared/_issues.html.haml deleted file mode 100644 index 0dbb6a04393..00000000000 --- a/app/views/shared/_issues.html.haml +++ /dev/null @@ -1,15 +0,0 @@ -- if @issues.any? - - @issues.group_by(&:project).each do |group| - .panel.panel-default.panel-small - - project = group[0] - .panel-heading - = link_to_project project - = link_to 'show all', namespace_project_issues_path(project.namespace, project), class: 'pull-right' - - %ul.well-list.issues-list - - group[1].each do |issue| - = render 'projects/issues/issue', issue: issue - = paginate @issues, theme: "gitlab" -- else - .nothing-here-block No issues to show - diff --git a/app/views/shared/_merge_requests.html.haml b/app/views/shared/_merge_requests.html.haml deleted file mode 100644 index c02c5af008a..00000000000 --- a/app/views/shared/_merge_requests.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -- if @merge_requests.any? - - @merge_requests.group_by(&:target_project).each do |group| - .panel.panel-default.panel-small - - project = group[0] - .panel-heading - = link_to_project project - = link_to 'show all', namespace_project_merge_requests_path(project.namespace, project), class: 'pull-right' - %ul.well-list.mr-list - - group[1].each do |merge_request| - = render 'projects/merge_requests/merge_request', merge_request: merge_request - = paginate @merge_requests, theme: "gitlab" - -- else - .nothing-here-block No merge requests to show diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml deleted file mode 100644 index f685ae7726c..00000000000 --- a/app/views/shared/_milestones_filter.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -.milestones-filters.append-bottom-10 - %ul.nav.nav-tabs - %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/_no_password.html.haml b/app/views/shared/_no_password.html.haml deleted file mode 100644 index a43bf33751a..00000000000 --- a/app/views/shared/_no_password.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -- if cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && current_user.require_password? - .no-password-message.alert.alert-warning.hidden-xs - You won't be able to pull or push project code via #{gitlab_config.protocol.upcase} until you #{link_to 'set a password', edit_profile_password_path} on your account - - .pull-right - = link_to "Don't show again", profile_path(user: {hide_no_password: true}), method: :put - | - = link_to 'Remind later', '#', class: 'hide-no-password-message' diff --git a/app/views/shared/_no_ssh.html.haml b/app/views/shared/_no_ssh.html.haml deleted file mode 100644 index 089179e677a..00000000000 --- a/app/views/shared/_no_ssh.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -- if cookies[:hide_no_ssh_message].blank? && !current_user.hide_no_ssh_key && current_user.require_ssh_key? - .no-ssh-key-message.alert.alert-warning.hidden-xs - You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_profile_key_path, class: 'alert-link'} to your profile - - .pull-right - = link_to "Don't show again", profile_path(user: {hide_no_ssh_key: true}), method: :put, class: 'alert-link' - | - = link_to 'Remind later', '#', class: 'hide-no-ssh-message alert-link' diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml deleted file mode 100644 index 0eba1fe075f..00000000000 --- a/app/views/shared/_outdated_browser.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -- if outdated_browser? - - link = "https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/requirements.md#supported-web-browsers" - .browser-alert - GitLab may not work properly because you are using an outdated web browser. - %br - Please install a - = link_to 'supported web browser', link - for a better experience. diff --git a/app/views/shared/_project.html.haml b/app/views/shared/_project.html.haml deleted file mode 100644 index 722a7f7ce0f..00000000000 --- a/app/views/shared/_project.html.haml +++ /dev/null @@ -1,21 +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') - .dash-project-access-icon - = visibility_level_icon(project.visibility_level) - %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 - - else - %span.arrow - %i.fa.fa-angle-right diff --git a/app/views/shared/_projects_list.html.haml b/app/views/shared/_projects_list.html.haml deleted file mode 100644 index 4c58092af44..00000000000 --- 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/_promo.html.haml b/app/views/shared/_promo.html.haml deleted file mode 100644 index 3596aabe309..00000000000 --- a/app/views/shared/_promo.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -.gitlab-promo - = link_to 'Homepage', promo_url - = link_to "Blog", promo_url + '/blog/' - = link_to "@gitlab", "https://twitter.com/gitlab" - = link_to "Requests", "http://feedback.gitlab.com/" diff --git a/app/views/shared/_ref_switcher.html.haml b/app/views/shared/_ref_switcher.html.haml deleted file mode 100644 index eb2e1919e19..00000000000 --- a/app/views/shared/_ref_switcher.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -= form_tag switch_namespace_project_refs_path(@project.namespace, @project), method: :get, class: "project-refs-form" do - = select_tag "ref", grouped_options_refs, class: "project-refs-select select2 select2-sm" - = hidden_field_tag :destination, destination - - if defined?(path) - = hidden_field_tag :path, path - - @options && @options.each do |key, value| - = hidden_field_tag key, value, id: nil diff --git a/app/views/shared/_sort_dropdown.html.haml b/app/views/shared/_sort_dropdown.html.haml deleted file mode 100644 index af3d35de325..00000000000 --- a/app/views/shared/_sort_dropdown.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -.dropdown.inline.prepend-left-10 - %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.dropdown-menu-align-right - %li - = link_to page_filter_path(sort: sort_value_recently_created) do - = sort_title_recently_created - = link_to page_filter_path(sort: sort_value_oldest_created) do - = sort_title_oldest_created - = link_to page_filter_path(sort: sort_value_recently_updated) do - = sort_title_recently_updated - = link_to page_filter_path(sort: sort_value_oldest_updated) do - = sort_title_oldest_updated - = link_to page_filter_path(sort: sort_value_milestone_soon) do - = sort_title_milestone_soon - = link_to page_filter_path(sort: sort_value_milestone_later) do - = sort_title_milestone_later diff --git a/app/views/shared/snippets/_blob.html.haml b/app/views/shared/snippets/_blob.html.haml deleted file mode 100644 index 30458793fd1..00000000000 --- a/app/views/shared/snippets/_blob.html.haml +++ /dev/null @@ -1,14 +0,0 @@ -- unless @snippet.content.empty? - - if gitlab_markdown?(@snippet.file_name) - .file-content.wiki - = preserve do - = markdown(@snippet.data) - - elsif markup?(@snippet.file_name) - .file-content.wiki - = render_markup(@snippet.file_name, @snippet.data) - - else - .file-content.code - = render 'shared/file_highlight', blob: @snippet -- else - .file-content.code - .nothing-here-block Empty file diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml deleted file mode 100644 index 4e0663ea208..00000000000 --- a/app/views/shared/snippets/_form.html.haml +++ /dev/null @@ -1,41 +0,0 @@ -.snippet-form-holder - = form_for @snippet, url: url, html: { class: "form-horizontal snippet-form" } do |f| - - if @snippet.errors.any? - .alert.alert-danger - %ul - - @snippet.errors.full_messages.each do |msg| - %li= msg - - .form-group - = f.label :title, class: 'control-label' - .col-sm-10= f.text_field :title, placeholder: "Example Snippet", class: 'form-control', required: true - - = render "shared/snippets/visibility_level", f: f, visibility_level: gitlab_config.default_projects_features.visibility_level, can_change_visibility_level: true - - .form-group - .file-editor - = f.label :file_name, "File", class: 'control-label' - .col-sm-10 - .file-holder.snippet - .file-title - = f.text_field :file_name, placeholder: "example.rb", class: 'form-control snippet-file-name', required: true - .file-content.code - %pre#editor= @snippet.content - = f.hidden_field :content, class: 'snippet-file-content' - - .form-actions - - if @snippet.new_record? - = f.submit 'Create snippet', class: "btn-create btn" - - else - = f.submit 'Save', class: "btn-save btn" - - - if @snippet.respond_to?(:project) - = link_to "Cancel", namespace_project_snippets_path(@project.namespace, @project), class: "btn btn-cancel" - - else - = link_to "Cancel", snippets_path(@project), class: "btn btn-cancel" - -:javascript - var editor = ace.edit("editor"); - $(".snippet-form-holder form").submit(function(){ - $(".snippet-file-content").val(editor.getValue()); - }); diff --git a/app/views/shared/snippets/_visibility_level.html.haml b/app/views/shared/snippets/_visibility_level.html.haml deleted file mode 100644 index 9acff18e450..00000000000 --- a/app/views/shared/snippets/_visibility_level.html.haml +++ /dev/null @@ -1,27 +0,0 @@ -.form-group.project-visibility-level-holder - = f.label :visibility_level, class: 'control-label' do - Visibility Level - = link_to "(?)", help_page_path("public_access", "public_access") - .col-sm-10 - - if can_change_visibility_level - - Gitlab::VisibilityLevel.values.each do |level| - .radio - - restricted = restricted_visibility_levels.include?(level) - = f.radio_button :visibility_level, level, disabled: restricted - = label "#{dom_class(@snippet)}_visibility_level", level do - = visibility_level_icon(level) - .option-title - = visibility_level_label(level) - .option-descr - = snippet_visibility_level_description(level) - - unless restricted_visibility_levels.empty? - .col-sm-10 - %span.info - Some visibility level settings have been restricted by the administrator. - - else - .col-sm-10 - %span.info - = visibility_level_icon(visibility_level) - %strong - = visibility_level_label(visibility_level) - .light= visibility_level_description(visibility_level) diff --git a/app/views/snippets/_snippet.html.haml b/app/views/snippets/_snippet.html.haml deleted file mode 100644 index 5bb28664349..00000000000 --- a/app/views/snippets/_snippet.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -%li - %h4.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 - = snippet.file_name - - %small.pull-right.cgray - - if snippet.project_id? - = 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)} diff --git a/app/views/snippets/_snippets.html.haml b/app/views/snippets/_snippets.html.haml deleted file mode 100644 index 40df42b6cf5..00000000000 --- a/app/views/snippets/_snippets.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%ul.bordered-list - = render partial: 'snippet', collection: @snippets - - if @snippets.empty? - %li - .nothing-here-block Nothing here. - -= paginate @snippets, theme: 'gitlab' 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 0df5ade500d..00000000000 --- a/app/views/snippets/current_user_index.html.haml +++ /dev/null @@ -1,39 +0,0 @@ -%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 - = link_to snippets_path, class: "btn btn-grouped" do - Discover snippets - -%p.light - Share code pastes with others out of git repository -%hr - -.row - .col-md-3 - %ul.nav.nav-pills.nav-stacked - = nav_tab :scope, nil do - = link_to user_snippets_path(@user) do - All - %span.pull-right - = @user.snippets.count - = nav_tab :scope, 'are_private' do - = link_to user_snippets_path(@user, scope: 'are_private') do - Private - %span.pull-right - = @user.snippets.are_private.count - = nav_tab :scope, 'are_internal' do - = link_to user_snippets_path(@user, scope: 'are_internal') do - Internal - %span.pull-right - = @user.snippets.are_internal.count - = nav_tab :scope, 'are_public' do - = link_to user_snippets_path(@user, scope: 'are_public') do - Public - %span.pull-right - = @user.snippets.are_public.count - - .col-md-9.my-snippets - = render 'snippets' - diff --git a/app/views/snippets/edit.html.haml b/app/views/snippets/edit.html.haml deleted file mode 100644 index 7042d07d5e8..00000000000 --- a/app/views/snippets/edit.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - Edit snippet -%hr -= render "shared/snippets/form", url: snippet_path(@snippet) diff --git a/app/views/snippets/index.html.haml b/app/views/snippets/index.html.haml deleted file mode 100644 index 5cd8ae26cf9..00000000000 --- a/app/views/snippets/index.html.haml +++ /dev/null @@ -1,17 +0,0 @@ -%h3.page-title - Public 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 - -%p.light - Public snippets created by you and other users are listed here - -%hr -= render 'snippets' - diff --git a/app/views/snippets/new.html.haml b/app/views/snippets/new.html.haml deleted file mode 100644 index 694d7058317..00000000000 --- a/app/views/snippets/new.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%h3.page-title - New snippet -%hr -= render "shared/snippets/form", url: snippets_path(@snippet) diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml deleted file mode 100644 index 5204fb9a907..00000000000 --- a/app/views/snippets/show.html.haml +++ /dev/null @@ -1,43 +0,0 @@ -%h3.page-title - = @snippet.title - - - if @snippet.private? - %span.label.label-success - %i.fa.fa-lock - private - - .pull-right - = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do - Add new snippet -%hr - -.append-bottom-20 - .pull-right - = "##{@snippet.id}" - %span.light - 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 - ← your snippets - - else - = link_to snippets_path do - ← discover snippets - -.file-holder - .file-title - %i.fa.fa-file - %strong - = @snippet.file_name - .file-actions - .btn-group - - if can?(current_user, :modify_personal_snippet, @snippet) - = link_to "edit", edit_snippet_path(@snippet), class: "btn btn-sm", title: 'Edit Snippet' - = link_to "raw", raw_snippet_path(@snippet), class: "btn btn-sm", target: "_blank" - - if can?(current_user, :admin_personal_snippet, @snippet) - = link_to "remove", snippet_path(@snippet), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-sm btn-remove", title: 'Delete Snippet' - = render 'shared/snippets/blob' diff --git a/app/views/snippets/user_index.html.haml b/app/views/snippets/user_index.html.haml deleted file mode 100644 index df524cd18b0..00000000000 --- a/app/views/snippets/user_index.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -%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/_groups.html.haml b/app/views/users/_groups.html.haml deleted file mode 100644 index f360fbb3d5d..00000000000 --- a/app/views/users/_groups.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -.clearfix - - groups.each do |group| - = link_to group, class: 'profile-groups-avatars inline', title: group.name do - = image_tag group_icon(group), class: 'avatar group-avatar s40' diff --git a/app/views/users/_profile.html.haml b/app/views/users/_profile.html.haml deleted file mode 100644 index 90d9980c85c..00000000000 --- a/app/views/users/_profile.html.haml +++ /dev/null @@ -1,31 +0,0 @@ -.panel.panel-default - .panel-heading - Profile - %ul.well-list - %li - %span.light Member since - %strong= user.created_at.stamp("Aug 21, 2011") - - unless user.public_email.blank? - %li - %span.light E-mail: - %strong= link_to user.public_email, "mailto:#{user.public_email}" - - unless user.skype.blank? - %li - %span.light Skype: - %strong= link_to user.skype, "skype:#{user.skype}" - - unless user.linkedin.blank? - %li - %span.light LinkedIn: - %strong= link_to user.linkedin, "http://www.linkedin.com/in/#{user.linkedin}" - - unless user.twitter.blank? - %li - %span.light Twitter: - %strong= link_to user.twitter, "http://www.twitter.com/#{user.twitter}" - - unless user.website_url.blank? - %li - %span.light Website: - %strong= link_to user.short_website_url, user.full_website_url - - unless user.location.blank? - %li - %span.light Location: - %strong= user.location diff --git a/app/views/users/_projects.html.haml b/app/views/users/_projects.html.haml deleted file mode 100644 index 297fa537394..00000000000 --- a/app/views/users/_projects.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -- if local_assigns.has_key?(:contributed_projects) && contributed_projects.present? - .panel.panel-default.contributed-projects - .panel-heading Projects contributed to - = 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', - projects: projects.sort_by(&:star_count).reverse, - projects_limit: 10, stars: true, avatar: false diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml deleted file mode 100644 index 922b0c6cebf..00000000000 --- a/app/views/users/calendar.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -%h4 - Contributions calendar - .pull-right - %small Issues, merge requests and push events -#cal-heatmap.calendar - :javascript - new Calendar( - #{@timestamps.to_json}, - #{@starting_year}, - #{@starting_month}, - '#{user_calendar_activities_path}' - ); diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml deleted file mode 100644 index 027a93a75fc..00000000000 --- a/app/views/users/calendar_activities.html.haml +++ /dev/null @@ -1,23 +0,0 @@ -%h4.prepend-top-20 - %span.light Contributions for - %strong #{@calendar_date.to_s(:short)} - -%ul.bordered-list - - @events.sort_by(&:created_at).each do |event| - %li - %span.light - %i.fa.fa-clock-o - = event.created_at.to_s(:time) - - if event.push? - #{event.action_name} #{event.ref_type} #{event.ref_name} - - else - = event_action_name(event) - - if event.target - %strong= link_to "##{event.target_iid}", [event.project.namespace.becomes(Namespace), event.project, event.target] - - at - %strong - - if event.project - = link_to_project event.project - - else - = event.project_name diff --git a/app/views/users/show.atom.builder b/app/views/users/show.atom.builder deleted file mode 100644 index 8fe30b23635..00000000000 --- a/app/views/users/show.atom.builder +++ /dev/null @@ -1,12 +0,0 @@ -xml.instruct! -xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do - xml.title "Activity feed for #{@user.name}" - xml.link href: user_url(@user, :atom), rel: "self", type: "application/atom+xml" - xml.link href: user_url(@user), rel: "alternate", type: "text/html" - xml.id projects_url - xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? - - @events.each do |event| - event_to_atom(xml, event) - end -end diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml deleted file mode 100644 index 9dd8cb0738c..00000000000 --- a/app/views/users/show.html.haml +++ /dev/null @@ -1,50 +0,0 @@ -.row - = link_to '#aside', class: 'show-aside' do - %i.fa.fa-angle-left - %section.col-md-8 - .header-with-avatar - = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: '' - %h3 - = @user.name - - if @user == current_user - .pull-right - = link_to profile_path, class: 'btn btn-sm' do - %i.fa.fa-pencil-square-o - Edit Profile settings - .username - @#{@user.username} - .description - - if @user.bio.present? - = @user.bio - - .clearfix - - - if @groups.any? - .prepend-top-20 - %h4 Groups - = render 'groups', groups: @groups - %hr - - .hidden-xs - .user-calendar - %h4.center.light - %i.fa.fa-spinner.fa-spin - .user-calendar-activities - %hr - %h4 - User Activity - - - if current_user - %span.rss-icon.pull-right - = link_to user_path(@user, :atom, { private_token: current_user.private_token }) do - %strong - %i.fa.fa-rss - - .content_list - = spinner - %aside.col-md-4 - = render 'profile', user: @user - = render 'projects', projects: @projects, contributed_projects: @contributed_projects - -:coffeescript - $(".user-calendar").load("#{user_calendar_path}") diff --git a/app/views/votes/_votes_block.html.haml b/app/views/votes/_votes_block.html.haml deleted file mode 100644 index 36ea6742064..00000000000 --- a/app/views/votes/_votes_block.html.haml +++ /dev/null @@ -1,10 +0,0 @@ -.votes.votes-block - .btn-group - - unless votable.upvotes.zero? - .btn.btn-sm.disabled.cgreen - %i.fa.fa-thumbs-up - = votable.upvotes - - unless votable.downvotes.zero? - .btn.btn-sm.disabled.cred - %i.fa.fa-thumbs-down - = votable.downvotes diff --git a/app/views/votes/_votes_inline.html.haml b/app/views/votes/_votes_inline.html.haml deleted file mode 100644 index 2cb3ae04e1a..00000000000 --- a/app/views/votes/_votes_inline.html.haml +++ /dev/null @@ -1,9 +0,0 @@ -.votes.votes-inline - - unless votable.upvotes.zero? - %span.upvotes.cgreen - + #{votable.upvotes} - - unless votable.downvotes.zero? - \/ - - unless votable.downvotes.zero? - %span.downvotes.cred - \- #{votable.downvotes} diff --git a/app/workers/auto_merge_worker.rb b/app/workers/auto_merge_worker.rb deleted file mode 100644 index a6dd73eee5f..00000000000 --- 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/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb deleted file mode 100644 index 1d21addece6..00000000000 --- a/app/workers/emails_on_push_worker.rb +++ /dev/null @@ -1,61 +0,0 @@ -class EmailsOnPushWorker - include Sidekiq::Worker - - def perform(project_id, recipients, push_data, options = {}) - options.symbolize_keys! - options.reverse_merge!( - send_from_committer_email: false, - disable_diffs: false - ) - send_from_committer_email = options[:send_from_committer_email] - disable_diffs = options[:disable_diffs] - - project = Project.find(project_id) - before_sha = push_data["before"] - after_sha = push_data["after"] - ref = push_data["ref"] - author_id = push_data["user_id"] - - action = - if Gitlab::Git.blank_ref?(before_sha) - :create - elsif Gitlab::Git.blank_ref?(after_sha) - :delete - else - :push - end - - compare = nil - reverse_compare = false - if action == :push - compare = Gitlab::Git::Compare.new(project.repository.raw_repository, before_sha, after_sha) - - return false if compare.same - - if compare.commits.empty? - compare = Gitlab::Git::Compare.new(project.repository.raw_repository, after_sha, before_sha) - - reverse_compare = true - - return false if compare.commits.empty? - end - 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 - end - ensure - compare = nil - GC.start - end -end diff --git a/app/workers/fork_registration_worker.rb b/app/workers/fork_registration_worker.rb deleted file mode 100644 index fffa8b3a659..00000000000 --- 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/gitlab_shell_worker.rb b/app/workers/gitlab_shell_worker.rb deleted file mode 100644 index cfeda88bbc5..00000000000 --- a/app/workers/gitlab_shell_worker.rb +++ /dev/null @@ -1,10 +0,0 @@ -class GitlabShellWorker - include Sidekiq::Worker - include Gitlab::ShellAdapter - - sidekiq_options queue: :gitlab_shell - - def perform(action, *arg) - gitlab_shell.send(action, *arg) - end -end diff --git a/app/workers/irker_worker.rb b/app/workers/irker_worker.rb deleted file mode 100644 index 8b50f423984..00000000000 --- a/app/workers/irker_worker.rb +++ /dev/null @@ -1,169 +0,0 @@ -require 'json' -require 'socket' - -class IrkerWorker - include Sidekiq::Worker - - def perform(project_id, chans, colors, push_data, settings) - project = Project.find(project_id) - - # Get config parameters - return false unless init_perform settings, chans, colors - - repo_name = push_data['repository']['name'] - committer = push_data['user_name'] - branch = push_data['ref'].gsub(%r'refs/[^/]*/', '') - - if @colors - repo_name = "\x0304#{repo_name}\x0f" - branch = "\x0305#{branch}\x0f" - end - - # Firsts messages are for branch creation/deletion - send_branch_updates push_data, project, repo_name, committer, branch - - # Next messages are for commits - send_commits push_data, project, repo_name, committer, branch - - close_connection - true - end - - private - - def init_perform(set, chans, colors) - @colors = colors - @channels = chans - start_connection set['server_ip'], set['server_port'] - end - - def start_connection(irker_server, irker_port) - begin - @socket = TCPSocket.new irker_server, irker_port - rescue Errno::ECONNREFUSED => e - logger.fatal "Can't connect to Irker daemon: #{e}" - return false - end - true - end - - def sendtoirker(privmsg) - to_send = { to: @channels, privmsg: privmsg } - @socket.puts JSON.dump(to_send) - end - - def close_connection - @socket.close - end - - def send_branch_updates(push_data, project, repo_name, committer, branch) - if Gitlab::Git.blank_ref?(push_data['before']) - send_new_branch project, repo_name, committer, branch - elsif Gitlab::Git.blank_ref?(push_data['after']) - send_del_branch repo_name, committer, branch - end - end - - def send_new_branch(project, repo_name, committer, branch) - repo_path = project.path_with_namespace - newbranch = "#{Gitlab.config.gitlab.url}/#{repo_path}/branches" - newbranch = "\x0302\x1f#{newbranch}\x0f" if @colors - - privmsg = "[#{repo_name}] #{committer} has created a new branch " - privmsg += "#{branch}: #{newbranch}" - sendtoirker privmsg - end - - def send_del_branch(repo_name, committer, branch) - privmsg = "[#{repo_name}] #{committer} has deleted the branch #{branch}" - sendtoirker privmsg - end - - def send_commits(push_data, project, repo_name, committer, branch) - return if push_data['total_commits_count'] == 0 - - # Next message is for number of commit pushed, if any - if Gitlab::Git.blank_ref?(push_data['before']) - # Tweak on push_data["before"] in order to have a nice compare URL - push_data['before'] = before_on_new_branch push_data, project - end - - send_commits_count(push_data, project, repo_name, committer, branch) - - # One message per commit, limited by 3 messages (same limit as the - # github irc hook) - commits = push_data['commits'].first(3) - commits.each do |hook_attrs| - send_one_commit project, hook_attrs, repo_name, branch - end - end - - def before_on_new_branch(push_data, project) - commit = commit_from_id project, push_data['commits'][0]['id'] - parents = commit.parents - # Return old value if there's no new one - return push_data['before'] if parents.empty? - # Or return the first parent-commit - parents[0].id - end - - def send_commits_count(data, project, repo, committer, branch) - url = compare_url data, project.path_with_namespace - commits = colorize_commits data['total_commits_count'] - - new_commits = 'new commit' - new_commits += 's' if data['total_commits_count'] > 1 - - sendtoirker "[#{repo}] #{committer} pushed #{commits} #{new_commits} " \ - "to #{branch}: #{url}" - end - - def compare_url(data, repo_path) - sha1 = Commit::truncate_sha(data['before']) - sha2 = Commit::truncate_sha(data['after']) - compare_url = "#{Gitlab.config.gitlab.url}/#{repo_path}/compare" - compare_url += "/#{sha1}...#{sha2}" - colorize_url compare_url - end - - def send_one_commit(project, hook_attrs, repo_name, branch) - commit = commit_from_id project, hook_attrs['id'] - sha = colorize_sha Commit::truncate_sha(hook_attrs['id']) - author = hook_attrs['author']['name'] - files = colorize_nb_files(files_count commit) - title = commit.title - - sendtoirker "#{repo_name}/#{branch} #{sha} #{author} (#{files}): #{title}" - end - - def commit_from_id(project, id) - commit = Gitlab::Git::Commit.find(project.repository, id) - Commit.new(commit) - end - - def files_count(commit) - files = "#{commit.diffs.count} file" - files += 's' if commit.diffs.count > 1 - files - end - - def colorize_sha(sha) - sha = "\x0314#{sha}\x0f" if @colors - sha - end - - def colorize_nb_files(nb_files) - nb_files = "\x0312#{nb_files}\x0f" if @colors - nb_files - end - - def colorize_url(url) - url = "\x0302\x1f#{url}\x0f" if @colors - url - end - - def colorize_commits(commits) - commits = "\x02#{commits}\x0f" if @colors - commits - end -end diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb deleted file mode 100644 index 33d8cc8861b..00000000000 --- a/app/workers/post_receive.rb +++ /dev/null @@ -1,62 +0,0 @@ -class PostReceive - include Sidekiq::Worker - include Gitlab::Identifier - - sidekiq_options queue: :post_receive - - def perform(repo_path, identifier, changes) - if repo_path.start_with?(Gitlab.config.gitlab_shell.repos_path.to_s) - repo_path.gsub!(Gitlab.config.gitlab_shell.repos_path.to_s, "") - else - log("Check gitlab.yml config for correct gitlab_shell.repos_path variable. \"#{Gitlab.config.gitlab_shell.repos_path}\" does not match \"#{repo_path}\"") - end - - repo_path.gsub!(/\.git\z/, "") - repo_path.gsub!(/\A\//, "") - - project = Project.find_with_namespace(repo_path) - - if project.nil? - log("Triggered hook for non-existing project with full path \"#{repo_path} \"") - return false - end - - changes = Base64.decode64(changes) unless changes.include?(" ") - changes = utf8_encode_changes(changes) - changes = changes.lines - - changes.each do |change| - oldrev, newrev, ref = change.strip.split(' ') - - @user ||= identify(identifier, project, newrev) - - unless @user - log("Triggered hook for non-existing user \"#{identifier} \"") - return false - end - - if Gitlab::Git.tag_ref?(ref) - GitTagPushService.new.execute(project, @user, oldrev, newrev, ref) - else - GitPushService.new.execute(project, @user, oldrev, newrev, ref) - end - end - end - - def utf8_encode_changes(changes) - changes = changes.dup - - changes.force_encoding("UTF-8") - return changes if changes.valid_encoding? - - # Convert non-UTF-8 branch/tag names to UTF-8 so they can be dumped as JSON. - detection = CharlockHolmes::EncodingDetector.detect(changes) - return changes unless detection && detection[:encoding] - - CharlockHolmes::Converter.convert(changes, detection[:encoding], 'UTF-8') - end - - def log(message) - Gitlab::GitLogger.error("POST-RECEIVE: #{message}") - end -end diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb deleted file mode 100644 index 64d39c4d3f7..00000000000 --- a/app/workers/project_service_worker.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ProjectServiceWorker - include Sidekiq::Worker - - sidekiq_options queue: :project_web_hook - - def perform(hook_id, data) - data = data.with_indifferent_access - Service.find(hook_id).execute(data) - end -end diff --git a/app/workers/project_web_hook_worker.rb b/app/workers/project_web_hook_worker.rb deleted file mode 100644 index 73085c046bd..00000000000 --- a/app/workers/project_web_hook_worker.rb +++ /dev/null @@ -1,10 +0,0 @@ -class ProjectWebHookWorker - include Sidekiq::Worker - - sidekiq_options queue: :project_web_hook - - def perform(hook_id, data) - data = data.with_indifferent_access - WebHook.find(hook_id).execute(data) - end -end diff --git a/app/workers/repository_archive_worker.rb b/app/workers/repository_archive_worker.rb deleted file mode 100644 index 021c1139568..00000000000 --- a/app/workers/repository_archive_worker.rb +++ /dev/null @@ -1,43 +0,0 @@ -class RepositoryArchiveWorker - include Sidekiq::Worker - - sidekiq_options queue: :archive_repo - - attr_accessor :project, :ref, :format - - def perform(project_id, ref, format) - @project = Project.find(project_id) - @ref, @format = ref, format.downcase - - repository = project.repository - - repository.clean_old_archives - - return unless file_path - return if archived? || archiving? - - repository.archive_repo(ref, storage_path, format) - end - - private - - def storage_path - Gitlab.config.gitlab.repository_downloads_path - end - - def file_path - @file_path ||= project.repository.archive_file_path(ref, storage_path, format) - end - - def pid_file_path - @pid_file_path ||= project.repository.archive_pid_file_path(ref, storage_path, format) - end - - def archived? - File.exist?(file_path) - end - - def archiving? - File.exist?(pid_file_path) - end -end diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb deleted file mode 100644 index e6a50afedb1..00000000000 --- a/app/workers/repository_import_worker.rb +++ /dev/null @@ -1,34 +0,0 @@ -class RepositoryImportWorker - include Sidekiq::Worker - include Gitlab::ShellAdapter - - sidekiq_options queue: :gitlab_shell - - def perform(project_id) - project = Project.find(project_id) - - import_result = gitlab_shell.send(:import_repository, - project.path_with_namespace, - project.import_url) - return project.import_fail unless import_result - - 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 - return project.import_fail unless data_import_result - - project.import_finish - project.save - project.satellite.create unless project.satellite.exists? - project.update_repository_size - Gitlab::BitbucketImport::KeyDeleter.new(project).execute if project.import_type == 'bitbucket' - end -end diff --git a/app/workers/system_hook_worker.rb b/app/workers/system_hook_worker.rb deleted file mode 100644 index 3ebc62b7e7a..00000000000 --- a/app/workers/system_hook_worker.rb +++ /dev/null @@ -1,9 +0,0 @@ -class SystemHookWorker - include Sidekiq::Worker - - sidekiq_options queue: :system_hook - - def perform(hook_id, data) - SystemHook.find(hook_id).execute data - end -end diff --git a/bin/background_jobs b/bin/background_jobs deleted file mode 100755 index a041a4b0433..00000000000 --- a/bin/background_jobs +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh - -cd $(dirname $0)/.. -app_root=$(pwd) -sidekiq_pidfile="$app_root/tmp/pids/sidekiq.pid" -sidekiq_logfile="$app_root/log/sidekiq.log" -gitlab_user=$(ls -l config.ru | awk '{print $3}') - -warn() -{ - echo "$@" 1>&2 -} - -stop() -{ - bundle exec sidekiqctl stop $sidekiq_pidfile >> $sidekiq_logfile 2>&1 -} - -killall() -{ - pkill -u $gitlab_user -f 'sidekiq [0-9]' -} - -restart() -{ - if [ -f $sidekiq_pidfile ]; then - stop - fi - killall - start_sidekiq -d -L $sidekiq_logfile -} - -start_no_deamonize() -{ - start_sidekiq -} - -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 -} - -load_ok() -{ - sidekiq_pid=$(cat $sidekiq_pidfile) - if [ -z "$sidekiq_pid" ] ; then - warn "Could not find a PID in $sidekiq_pidfile" - exit 0 - fi - - if (ps -p $sidekiq_pid -o args | grep '\([0-9]\+\) of \1 busy' 1>&2) ; then - warn "Too many busy Sidekiq workers" - exit 1 - fi - - exit 0 -} - -case "$1" in - stop) - stop - ;; - start) - restart - ;; - start_no_deamonize) - start_no_deamonize - ;; - restart) - restart - ;; - killall) - killall - ;; - load_ok) - load_ok - ;; - *) - echo "Usage: RAILS_ENV=your_env $0 {stop|start|start_no_deamonize|restart|killall|load_ok}" -esac diff --git a/bin/bundle b/bin/bundle deleted file mode 100755 index 66e9889e8b4..00000000000 --- a/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/bin/check b/bin/check deleted file mode 100755 index c907a98b5d9..00000000000 --- a/bin/check +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production diff --git a/bin/guard b/bin/guard deleted file mode 100755 index 0c1a532bd01..00000000000 --- a/bin/guard +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env ruby -# -# This file was generated by Bundler. -# -# The application 'guard' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'pathname' -ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -require 'rubygems' -require 'bundler/setup' - -load Gem.bin_path('guard', 'guard') diff --git a/bin/pkgr_before_precompile.sh b/bin/pkgr_before_precompile.sh deleted file mode 100755 index 5a2007f4ab0..00000000000 --- a/bin/pkgr_before_precompile.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -set -e - -for file in config/*.yml.example; do - cp ${file} config/$(basename ${file} .example) -done - -# Allow to override the Gitlab URL from an environment variable, as this will avoid having to change the configuration file for simple deployments. -config=$(echo '<% gitlab_url = URI(ENV["GITLAB_URL"] || "http://localhost:80") %>' | cat - config/gitlab.yml) -echo "$config" > config/gitlab.yml -sed -i "s/host: localhost/host: <%= gitlab_url.host %>/" config/gitlab.yml -sed -i "s/port: 80/port: <%= gitlab_url.port %>/" config/gitlab.yml -sed -i "s/https: false/https: <%= gitlab_url.scheme == 'https' %>/" config/gitlab.yml - -# No need for config file. Will be taken care of by REDIS_URL env variable -rm config/resque.yml - -# Set default unicorn.rb file -echo "" > config/unicorn.rb diff --git a/bin/rails b/bin/rails deleted file mode 100755 index 7feb6a30e69..00000000000 --- a/bin/rails +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -APP_PATH = File.expand_path('../../config/application', __FILE__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/bin/rake b/bin/rake deleted file mode 100755 index 8017a0271d2..00000000000 --- a/bin/rake +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/bin/rspec b/bin/rspec deleted file mode 100755 index 20060ebd79c..00000000000 --- a/bin/rspec +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -require 'bundler/setup' -load Gem.bin_path('rspec-core', 'rspec') diff --git a/bin/spinach b/bin/spinach deleted file mode 100755 index a080e286cfe..00000000000 --- a/bin/spinach +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path("../spring", __FILE__) -rescue LoadError -end -require 'bundler/setup' -load Gem.bin_path('spinach', 'spinach') diff --git a/bin/spring b/bin/spring deleted file mode 100755 index 253ec37c345..00000000000 --- a/bin/spring +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads spring without using Bundler, in order to be fast -# It gets overwritten when you run the `spring binstub` command - -unless defined?(Spring) - require "rubygems" - require "bundler" - - if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ spring \((.*?)\)$.*?^$/m) - ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR) - ENV["GEM_HOME"] = "" - Gem.paths = ENV - - gem "spring", match[1] - require "spring/binstub" - end -end diff --git a/bin/upgrade.rb b/bin/upgrade.rb deleted file mode 100644 index a5caecf8526..00000000000 --- a/bin/upgrade.rb +++ /dev/null @@ -1,3 +0,0 @@ -require_relative "../lib/gitlab/upgrader" - -Gitlab::Upgrader.new.execute diff --git a/bin/web b/bin/web deleted file mode 100755 index 67f236eb0bb..00000000000 --- a/bin/web +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -cd $(dirname $0)/.. -app_root=$(pwd) - -unicorn_pidfile="$app_root/tmp/pids/unicorn.pid" -unicorn_config="$app_root/config/unicorn.rb" - -get_unicorn_pid() -{ - local pid=$(cat $unicorn_pidfile) - if [ -z "$pid" ] ; then - echo "Could not find a PID in $unicorn_pidfile" - exit 1 - fi - unicorn_pid=$pid -} - -start() -{ - bundle exec unicorn_rails -D -c $unicorn_config -E $RAILS_ENV -} - -stop() -{ - get_unicorn_pid - kill -QUIT $unicorn_pid -} - -reload() -{ - get_unicorn_pid - kill -USR2 $unicorn_pid -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - reload) - reload - ;; - *) - echo "Usage: RAILS_ENV=your_env $0 {start|stop|reload}" - ;; -esac diff --git a/config.ru b/config.ru deleted file mode 100644 index e90863a5c21..00000000000 --- a/config.ru +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -if defined?(Unicorn) - require 'unicorn' - # Unicorn self-process killer - require 'unicorn/worker_killer' - - # Max memory size (RSS) per worker - use Unicorn::WorkerKiller::Oom, (200 * (1 << 20)), (250 * (1 << 20)) -end - -require ::File.expand_path('../config/environment', __FILE__) - -map ENV['RAILS_RELATIVE_URL_ROOT'] || "/" do - run Gitlab::Application -end diff --git a/config/application.rb b/config/application.rb deleted file mode 100644 index fa399533e52..00000000000 --- a/config/application.rb +++ /dev/null @@ -1,104 +0,0 @@ -require File.expand_path('../boot', __FILE__) - -require 'rails/all' -require 'devise' -I18n.config.enforce_available_locales = false -Bundler.require(:default, Rails.env) - -module Gitlab - class Application < Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers - # -- all .rb files in that directory are automatically loaded. - - # Custom directories with classes and modules you want to be autoloadable. - config.autoload_paths.push(*%W(#{config.root}/lib - #{config.root}/app/models/hooks - #{config.root}/app/models/concerns - #{config.root}/app/models/project_services - #{config.root}/app/models/members)) - - # Only load the plugins named here, in the order given (default is alphabetical). - # :all can be used as a placeholder for all plugins not explicitly named. - # config.plugins = [ :exception_notification, :ssl_requirement, :all ] - - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] - # config.i18n.default_locale = :de - config.i18n.enforce_available_locales = false - - # Configure the default encoding used in templates for Ruby 1.9. - config.encoding = "utf-8" - - # Configure sensitive parameters which will be filtered from the log file. - config.filter_parameters.push(:password, :password_confirmation, :private_token) - - # Enable escaping HTML in JSON. - config.active_support.escape_html_entities_in_json = true - - # Use SQL instead of Active Record's schema dumper when creating the database. - # This is necessary if your schema can't be completely dumped by the schema dumper, - # like if you have constraints or database-specific column types - # config.active_record.schema_format = :sql - - # Enable the asset pipeline - config.assets.enabled = true - config.assets.paths << Emoji.images_path - config.assets.precompile << "emoji/*.png" - config.assets.precompile << "print.css" - - # Version of your assets, change this if you want to expire all your assets - config.assets.version = '1.0' - - config.action_view.sanitized_allowed_protocols = %w(smb) - - # Relative url support - # Uncomment and customize the last line to run in a non-root path - # WARNING: We recommend creating a FQDN to host GitLab in a root path instead of this. - # Note that following settings need to be changed for this to work. - # 1) In your application.rb file: config.relative_url_root = "/gitlab" - # 2) In your gitlab.yml file: relative_url_root: /gitlab - # 3) In your unicorn.rb: ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab" - # 4) In ../gitlab-shell/config.yml: gitlab_url: "http://127.0.0.1/gitlab" - # 5) In lib/support/nginx/gitlab : do not use asset gzipping, remove block starting with "location ~ ^/(assets)/" - # - # To update the path, run: sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production - # - # config.relative_url_root = "/gitlab" - - config.middleware.use Rack::Attack - - # Allow access to GitLab API from other domains - config.middleware.use Rack::Cors do - allow do - origins '*' - resource '/api/*', - headers: :any, - methods: [:get, :post, :options, :put, :delete], - expose: ['Link'] - end - end - - # Use Redis caching across all environments - redis_config_file = Rails.root.join('config', 'resque.yml') - - redis_url_string = if File.exists?(redis_config_file) - YAML.load_file(redis_config_file)[Rails.env] - else - "redis://localhost:6379" - end - - # Redis::Store does not handle Unix sockets well, so let's do it for them - redis_config_hash = Redis::Store::Factory.extract_host_options_from_uri(redis_url_string) - redis_uri = URI.parse(redis_url_string) - if redis_uri.scheme == 'unix' - redis_config_hash[:path] = redis_uri.path - end - - redis_config_hash[:namespace] = 'cache:gitlab' - config.cache_store = :redis_store, redis_config_hash - - # This is needed for gitlab-shell - ENV['GITLAB_PATH_OUTSIDE_HOOK'] = ENV['PATH'] - end -end diff --git a/config/aws.yml.example b/config/aws.yml.example deleted file mode 100644 index 29d029b078d..00000000000 --- a/config/aws.yml.example +++ /dev/null @@ -1,19 +0,0 @@ -# See https://github.com/jnicklas/carrierwave#using-amazon-s3 -# for more options -production: - access_key_id: AKIA1111111111111UA - secret_access_key: secret - bucket: mygitlab.production.us - region: us-east-1 - -development: - access_key_id: AKIA1111111111111UA - secret_access_key: secret - bucket: mygitlab.development.us - region: us-east-1 - -test: - access_key_id: AKIA1111111111111UA - secret_access_key: secret - bucket: mygitlab.test.us - region: us-east-1 diff --git a/config/boot.rb b/config/boot.rb deleted file mode 100644 index 4489e58688c..00000000000 --- a/config/boot.rb +++ /dev/null @@ -1,6 +0,0 @@ -require 'rubygems' - -# Set up gems listed in the Gemfile. -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) - -require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) diff --git a/config/database.yml.mysql b/config/database.yml.mysql deleted file mode 100644 index a99c50706c5..00000000000 --- a/config/database.yml.mysql +++ /dev/null @@ -1,42 +0,0 @@ -# -# PRODUCTION -# -production: - adapter: mysql2 - encoding: utf8 - collation: utf8_general_ci - reconnect: false - database: gitlabhq_production - pool: 10 - username: git - password: "secure password" - # host: localhost - # socket: /tmp/mysql.sock - -# -# Development specific -# -development: - adapter: mysql2 - encoding: utf8 - collation: utf8_general_ci - reconnect: false - database: gitlabhq_development - pool: 5 - username: root - password: "secure password" - # socket: /tmp/mysql.sock - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: &test - adapter: mysql2 - encoding: utf8 - collation: utf8_general_ci - reconnect: false - database: gitlabhq_test - pool: 5 - username: root - password: - # socket: /tmp/mysql.sock diff --git a/config/database.yml.postgresql b/config/database.yml.postgresql deleted file mode 100644 index 7067e0fe402..00000000000 --- a/config/database.yml.postgresql +++ /dev/null @@ -1,45 +0,0 @@ -# -# PRODUCTION -# -production: - adapter: postgresql - encoding: unicode - database: gitlabhq_production - pool: 10 - # username: git - # password: - # host: localhost - # port: 5432 - -# -# Development specific -# -development: - adapter: postgresql - encoding: unicode - database: gitlabhq_development - pool: 5 - username: postgres - password: - -# -# Staging specific -# -staging: - adapter: postgresql - encoding: unicode - database: gitlabhq_staging - pool: 5 - username: postgres - password: - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: &test - adapter: postgresql - encoding: unicode - database: gitlabhq_test - pool: 5 - username: postgres - password: diff --git a/config/environment.rb b/config/environment.rb deleted file mode 100644 index 3b186a9d57a..00000000000 --- a/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the rails application -require File.expand_path('../application', __FILE__) - -# Initialize the rails application -Gitlab::Application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb deleted file mode 100644 index 03af7f07864..00000000000 --- a/config/environments/development.rb +++ /dev/null @@ -1,34 +0,0 @@ -Gitlab::Application.configure do - # Settings specified here will take precedence over those in config/application.rb - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Show full error reports and disable caching - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Don't care if the mailer can't send - config.action_mailer.raise_delivery_errors = false - - # Print deprecation notices to the Rails logger - config.active_support.deprecation = :log - - # Only use best-standards-support built into browsers - config.action_dispatch.best_standards_support = :builtin - - # Do not compress assets - config.assets.compress = false - - # Expands the lines which load the assets - # config.assets.debug = true - - # For having correct urls in mails - config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } - # Open sent mails in browser - config.action_mailer.delivery_method = :letter_opener - - config.eager_load = false -end diff --git a/config/environments/production.rb b/config/environments/production.rb deleted file mode 100644 index 3316ece3873..00000000000 --- a/config/environments/production.rb +++ /dev/null @@ -1,80 +0,0 @@ -Gitlab::Application.configure do - # Settings specified here will take precedence over those in config/application.rb - - # Code is not reloaded between requests - config.cache_classes = true - - # Full error reports are disabled and caching is turned on - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Disable Rails's static asset server (Apache or nginx will already do this) - config.serve_static_assets = false - - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Don't fallback to assets pipeline if a precompiled asset is missed - config.assets.compile = true - - # Generate digests for assets URLs - config.assets.digest = true - - # Defaults to nil and saved in location specified by config.assets.prefix - # config.assets.manifest = YOUR_PATH - - # Specifies the header that your server uses for sending files - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # See everything in the log (default is :info) - # config.log_level = :debug - - # Suppress 'Rendered template ...' messages in the log - # source: http://stackoverflow.com/a/16369363 - %w{render_template render_partial render_collection}.each do |event| - ActiveSupport::Notifications.unsubscribe "#{event}.action_view" - end - - # Prepend all log lines with the following tags - # config.log_tags = [ :subdomain, :uuid ] - - # Use a different logger for distributed setups - # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) - - # Enable serving of images, stylesheets, and JavaScripts from an asset server - # config.action_controller.asset_host = "http://assets.example.com" - - # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) - # config.assets.precompile += %w( search.js ) - - # Disable delivery errors, bad email addresses will be ignored - # config.action_mailer.raise_delivery_errors = false - - # Enable threaded mode - # config.threadsafe! unless $rails_rake_task - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation can not be found) - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners - config.active_support.deprecation = :notify - - config.action_mailer.delivery_method = :sendmail - # Defaults to: - # # config.action_mailer.sendmail_settings = { - # # location: '/usr/sbin/sendmail', - # # arguments: '-i -t' - # # } - config.action_mailer.perform_deliveries = true - config.action_mailer.raise_delivery_errors = true - - config.eager_load = true - - config.allow_concurrency = false -end diff --git a/config/environments/test.rb b/config/environments/test.rb deleted file mode 100644 index 2d5e7addcd3..00000000000 --- a/config/environments/test.rb +++ /dev/null @@ -1,33 +0,0 @@ -Gitlab::Application.configure do - # Settings specified here will take precedence over those in config/application.rb - - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = false - - # Configure static asset server for tests with Cache-Control for performance - config.serve_static_assets = true - config.static_cache_control = "public, max-age=3600" - - # Show full error reports and disable caching - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Raise exceptions instead of rendering exception templates - config.action_dispatch.show_exceptions = false - - # Disable request forgery protection in test environment - config.action_controller.allow_forgery_protection = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Print deprecation notices to the stderr - config.active_support.deprecation = :stderr - - config.eager_load = false -end diff --git a/config/gitlab.teatro.yml b/config/gitlab.teatro.yml deleted file mode 100644 index f0656400beb..00000000000 --- a/config/gitlab.teatro.yml +++ /dev/null @@ -1,86 +0,0 @@ - -production: &base - gitlab: - host: localhost - port: 80 - https: false - - user: root - - email_from: example@example.com - - support_email: support@example.com - - default_projects_features: - issues: true - merge_requests: true - wiki: true - wall: false - snippets: false - visibility_level: "private" # can be "private" | "internal" | "public" - - issues_tracker: - - gravatar: - enabled: true # Use user avatar image from Gravatar.com (default: true) - - ldap: - enabled: false - host: '_your_ldap_server' - port: 636 - uid: 'sAMAccountName' - method: 'ssl' # "tls" or "ssl" or "plain" - bind_dn: '_the_full_dn_of_the_user_you_will_bind_with' - password: '_the_password_of_the_bind_user' - allow_username_or_email_login: true - - base: '' - - user_filter: '' - - omniauth: - enabled: false - - satellites: - # Relative paths are relative to Rails.root (default: tmp/repo_satellites/) - path: /apps/gitlab-satellites/ - - backup: - path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/) - - gitlab_shell: - path: /apps/gitlab-shell/ - - # REPOS_PATH MUST NOT BE A SYMLINK!!! - repos_path: /apps/repositories/ - hooks_path: /apps/gitlab-shell/hooks/ - - upload_pack: true - receive_pack: true - - git: - bin_path: /usr/bin/git - max_size: 5242880 # 5.megabytes - timeout: 10 - - extra: - -development: - <<: *base - -test: - <<: *base - gravatar: - enabled: true - gitlab: - host: localhost - port: 80 - issues_tracker: - redmine: - title: "Redmine" - project_url: "http://redmine/projects/:issues_tracker_id" - issues_url: "http://redmine/:project_id/:issues_tracker_id/:id" - new_issue_url: "http://redmine/projects/:issues_tracker_id/issues/new" - -staging: - <<: *base diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example deleted file mode 100644 index ba40671b162..00000000000 --- a/config/gitlab.yml.example +++ /dev/null @@ -1,337 +0,0 @@ -# # # # # # # # # # # # # # # # # # -# GitLab application config file # -# # # # # # # # # # # # # # # # # # -# -########################### NOTE ##################################### -# This file should not receive new settings. All configuration options # -# are being moved to ApplicationSetting model! # -######################################################################## -# -# How to use: -# 1. Copy file as gitlab.yml -# 2. Update gitlab -> host with your fully qualified domain name -# 3. Update gitlab -> email_from -# 4. If you installed Git from source, change git -> bin_path to /usr/local/bin/git -# 5. Review this configuration file for other settings you may want to adjust - -production: &base - # - # 1. GitLab app settings - # ========================== - - ## GitLab settings - gitlab: - ## Web server settings (note: host is the FQDN, do not include http://) - host: localhost - port: 80 # Set to 443 if using HTTPS, see installation.md#using-https for additional HTTPS configuration details - https: false # Set to true if using HTTPS, see installation.md#using-https for additional HTTPS configuration details - - # Uncommment this line below if your ssh host is different from HTTP/HTTPS one - # (you'd obviously need to replace ssh.host_example.com with your own host). - # Otherwise, ssh host will be set to the `host:` value above - # ssh_host: ssh.host_example.com - - # WARNING: See config/application.rb under "Relative url support" for the list of - # other files that need to be changed for relative url support - # relative_url_root: /gitlab - - # Uncomment and customize if you can't use the default user to run GitLab (default: 'git') - # user: git - - ## Date & Time settings - # Uncomment and customize if you want to change the default time zone of GitLab application. - # To see all available zones, run `bundle exec rake time:zones:all RAILS_ENV=production` - # time_zone: 'UTC' - - ## Email settings - # Uncomment and set to false if you need to disable email sending from GitLab (default: true) - # email_enabled: true - # Email address used in the "From" field in mails sent by GitLab - email_from: example@example.com - email_display_name: GitLab - email_reply_to: noreply@example.com - - # Email server smtp settings are in config/initializers/smtp_settings.rb.sample - - # default_can_create_group: false # default: true - # username_changing_enabled: false # default: true - User can change her username/namespace - ## Default theme - ## BASIC = 1 - ## MARS = 2 - ## MODERN = 3 - ## GRAY = 4 - ## COLOR = 5 - # default_theme: 2 # default: 2 - - ## Automatic issue closing - # If a commit message matches this regular expression, all issues referenced from the matched text will be closed. - # This happens when the commit is pushed or merged into the default branch of a project. - # When not specified the default issue_closing_pattern as specified below will be used. - # Tip: you can test your closing pattern at http://rubular.com. - # issue_closing_pattern: '((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+)' - - ## Default project features settings - default_projects_features: - issues: true - merge_requests: true - wiki: true - snippets: false - visibility_level: "private" # can be "private" | "internal" | "public" - - ## Webhook settings - # Number of seconds to wait for HTTP response after sending webhook HTTP POST request (default: 10) - # webhook_timeout: 10 - - ## Repository downloads directory - # When a user clicks e.g. 'Download zip' on a project, a temporary zip file is created in the following directory. - # The default is 'tmp/repositories' relative to the root of the Rails app. - # repository_downloads_path: tmp/repositories - - ## Gravatar - ## For Libravatar see: http://doc.gitlab.com/ce/customization/libravatar.html - gravatar: - enabled: true # Use user avatar image from Gravatar.com (default: true) - # gravatar urls: possible placeholders: %{hash} %{size} %{email} - # plain_url: "http://..." # default: http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon - # ssl_url: "https://..." # default: https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon - - # - # 2. Auth settings - # ========================== - - ## LDAP settings - # You can inspect a sample of the LDAP users with login access by running: - # bundle exec rake gitlab:ldap:check RAILS_ENV=production - ldap: - enabled: false - servers: - ########################################################################## - # - # Since GitLab 7.4, LDAP servers get ID's (below the ID is 'main'). GitLab - # Enterprise Edition now supports connecting to multiple LDAP servers. - # - # If you are updating from the old (pre-7.4) syntax, you MUST give your - # old server the ID 'main'. - # - ########################################################################## - main: # 'main' is the GitLab 'provider ID' of this LDAP server - ## label - # - # A human-friendly name for your LDAP server. It is OK to change the label later, - # for instance if you find out it is too large to fit on the web page. - # - # Example: 'Paris' or 'Acme, Ltd.' - label: 'LDAP' - - host: '_your_ldap_server' - port: 389 - uid: 'sAMAccountName' - 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. - active_directory: true - - # If allow_username_or_email_login is enabled, GitLab will ignore everything - # after the first '@' in the LDAP username submitted by the user on login. - # - # Example: - # - the user enters 'jane.doe@example.com' and 'p@ssw0rd' as LDAP credentials; - # - GitLab queries the LDAP server with 'jane.doe' and 'p@ssw0rd'. - # - # If you are using "uid: 'userPrincipalName'" on ActiveDirectory you need to - # disable this setting, because the userPrincipalName contains an '@'. - allow_username_or_email_login: false - - # To maintain tight control over the number of active users on your GitLab installation, - # enable this setting to keep new users blocked until they have been cleared by the admin - # (default: false). - block_auto_created_users: false - - # Base where we can search for users - # - # Ex. ou=People,dc=gitlab,dc=example - # - base: '' - - # Filter LDAP users - # - # Format: RFC 4515 http://tools.ietf.org/search/rfc4515 - # Ex. (employeeType=developer) - # - # Note: GitLab does not support omniauth-ldap's custom filter syntax. - # - user_filter: '' - - # 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. - # uswest2: - # label: - # host: - # .... - - - ## OmniAuth settings - omniauth: - # Allow login via Twitter, Google, etc. using OmniAuth providers - enabled: false - - # CAUTION! - # This allows users to login without having a user account first (default: false). - # User accounts will be created automatically when authentication was successful. - allow_single_sign_on: false - # Locks down those users until they have been cleared by the admin (default: true). - block_auto_created_users: true - - ## Auth providers - # Uncomment the following lines and fill in the data of the auth provider you want to use - # If your favorite auth provider is not listed you can use others: - # see https://github.com/gitlabhq/gitlab-public-wiki/wiki/Custom-omniauth-provider-configurations - # The 'app_id' and 'app_secret' parameters are always passed as the first two - # arguments, followed by optional 'args' which can be either a hash or an array. - # Documentation for this is available at http://doc.gitlab.com/ce/integration/omniauth.html - providers: - # - { name: 'google_oauth2', app_id: 'YOUR_APP_ID', - # app_secret: 'YOUR_APP_SECRET', - # args: { access_type: 'offline', approval_prompt: '' } } - # - { name: 'twitter', app_id: 'YOUR_APP_ID', - # app_secret: 'YOUR_APP_SECRET'} - # - { name: 'github', app_id: 'YOUR_APP_ID', - # app_secret: 'YOUR_APP_SECRET', - # args: { scope: 'user:email' } } - # - { name: 'gitlab', app_id: 'YOUR_APP_ID', - # app_secret: 'YOUR_APP_SECRET', - # args: { scope: 'api' } } - # - { name: 'bitbucket', app_id: 'YOUR_APP_ID', - # app_secret: 'YOUR_APP_SECRET'} - - - - # - # 3. Advanced settings - # ========================== - - # GitLab Satellites - satellites: - # Relative paths are relative to Rails.root (default: tmp/repo_satellites/) - path: /home/git/gitlab-satellites/ - timeout: 30 - - ## Backup settings - backup: - path: "tmp/backups" # Relative paths are relative to Rails.root (default: tmp/backups/) - # keep_time: 604800 # default: 0 (forever) (in seconds) - # upload: - # # Fog storage connection settings, see http://fog.io/storage/ . - # connection: - # provider: AWS - # region: eu-west-1 - # aws_access_key_id: AKIAKIAKI - # aws_secret_access_key: 'secret123' - # # The remote 'directory' to store your backups. For S3, this would be the bucket name. - # remote_directory: 'my.s3.bucket' - - ## GitLab Shell settings - gitlab_shell: - path: /home/git/gitlab-shell/ - - # REPOS_PATH MUST NOT BE A SYMLINK!!! - repos_path: /home/git/repositories/ - hooks_path: /home/git/gitlab-shell/hooks/ - - # Git over HTTP - upload_pack: true - receive_pack: true - - # If you use non-standard ssh port you need to specify it - # ssh_port: 22 - - ## Git settings - # CAUTION! - # Use the default values unless you really know what you are doing - git: - bin_path: /usr/bin/git - # The next value is the maximum memory size grit can use - # Given in number of bytes per git object (e.g. a commit) - # This value can be increased if you have very large commits - max_size: 20971520 # 20.megabytes - # Git timeout to read a commit, in seconds - timeout: 10 - - # - # 4. Extra customization - # ========================== - - extra: - ## Google analytics. Uncomment if you want it - # google_analytics_id: '_your_tracking_id' - - ## Piwik analytics. - # piwik_url: '_your_piwik_url' - # piwik_site_id: '_your_piwik_site_id' - - rack_attack: - git_basic_auth: - # Rack Attack IP banning enabled - # enabled: true - # - # Whitelist requests from 127.0.0.1 for web proxies (NGINX/Apache) with incorrect headers - # ip_whitelist: ["127.0.0.1"] - # - # Limit the number of Git HTTP authentication attempts per IP - # maxretry: 10 - # - # Reset the auth attempt counter per IP after 60 seconds - # findtime: 60 - # - # Ban an IP for one hour (3600s) after too many auth attempts - # bantime: 3600 - -development: - <<: *base - -test: - <<: *base - gravatar: - enabled: true - gitlab: - host: localhost - port: 80 - - # When you run tests we clone and setup gitlab-shell - # In order to setup it correctly you need to specify - # your system username you use to run GitLab - # user: YOUR_USERNAME - satellites: - path: tmp/tests/gitlab-satellites/ - gitlab_shell: - path: tmp/tests/gitlab-shell/ - repos_path: tmp/tests/repositories/ - hooks_path: tmp/tests/gitlab-shell/hooks/ - issues_tracker: - redmine: - title: "Redmine" - project_url: "http://redmine/projects/:issues_tracker_id" - issues_url: "http://redmine/:project_id/:issues_tracker_id/:id" - new_issue_url: "http://redmine/projects/:issues_tracker_id/issues/new" - ldap: - enabled: false - servers: - main: - label: ldap - host: 127.0.0.1 - port: 3890 - uid: 'uid' - method: 'plain' # "tls" or "ssl" or "plain" - base: 'dc=example,dc=com' - user_filter: '' - group_base: 'ou=groups,dc=example,dc=com' - admin_group: '' - sync_ssh_keys: false - -staging: - <<: *base diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb deleted file mode 100644 index 0abd34fc3e0..00000000000 --- a/config/initializers/1_settings.rb +++ /dev/null @@ -1,206 +0,0 @@ -require 'gitlab' # Load lib/gitlab.rb as soon as possible - -class Settings < Settingslogic - source ENV.fetch('GITLAB_CONFIG') { "#{Rails.root}/config/gitlab.yml" } - namespace Rails.env - - class << self - def gitlab_on_standard_port? - gitlab.port.to_i == (gitlab.https ? 443 : 80) - end - - private - - def build_gitlab_shell_ssh_path_prefix - if gitlab_shell.ssh_port != 22 - "ssh://#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}:#{gitlab_shell.ssh_port}/" - else - if gitlab_shell.ssh_host.include? ':' - "[#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}]:" - else - "#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}:" - end - end - end - - def build_gitlab_url - custom_port = gitlab_on_standard_port? ? nil : ":#{gitlab.port}" - [ gitlab.protocol, - "://", - gitlab.host, - custom_port, - gitlab.relative_url_root - ].join('') - end - - # check that values in `current` (string or integer) is a contant in `modul`. - def verify_constant_array(modul, current, default) - values = default || [] - if !current.nil? - values = [] - current.each do |constant| - values.push(verify_constant(modul, constant, nil)) - end - values.delete_if { |value| value.nil? } - end - values - end - - # check that `current` (string or integer) is a contant in `modul`. - def verify_constant(modul, current, default) - constant = modul.constants.find{ |name| modul.const_get(name) == current } - value = constant.nil? ? default : modul.const_get(constant) - if current.is_a? String - value = modul.const_get(current.upcase) rescue default - end - value - end - end -end - - -# Default settings -Settings['ldap'] ||= Settingslogic.new({}) -Settings.ldap['enabled'] = false if Settings.ldap['enabled'].nil? - -# backwards compatibility, we only have one host -if Settings.ldap['enabled'] || Rails.env.test? - if Settings.ldap['host'].present? - # We detected old LDAP configuration syntax. Update the config to make it - # look like it was entered with the new syntax. - server = Settings.ldap.except('sync_time') - Settings.ldap['servers'] = { - 'main' => server - } - end - - Settings.ldap['servers'].each do |key, server| - server['label'] ||= 'LDAP' - 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['provider_name'] ||= "ldap#{key}".downcase - server['provider_class'] = OmniAuth::Utils.camelize(server['provider_name']) - end -end - - -Settings['omniauth'] ||= Settingslogic.new({}) -Settings.omniauth['enabled'] = false if Settings.omniauth['enabled'].nil? -Settings.omniauth['providers'] ||= [] - -Settings['issues_tracker'] ||= {} - -# -# GitLab -# -Settings['gitlab'] ||= Settingslogic.new({}) -Settings.gitlab['default_projects_limit'] ||= 10 -Settings.gitlab['default_branch_protection'] ||= 2 -Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil? -Settings.gitlab['default_theme'] = Gitlab::Theme::MARS if Settings.gitlab['default_theme'].nil? -Settings.gitlab['host'] ||= 'localhost' -Settings.gitlab['ssh_host'] ||= Settings.gitlab.host -Settings.gitlab['https'] = false if Settings.gitlab['https'].nil? -Settings.gitlab['port'] ||= Settings.gitlab.https ? 443 : 80 -Settings.gitlab['relative_url_root'] ||= ENV['RAILS_RELATIVE_URL_ROOT'] || '' -Settings.gitlab['protocol'] ||= Settings.gitlab.https ? "https" : "http" -Settings.gitlab['email_enabled'] ||= true if Settings.gitlab['email_enabled'].nil? -Settings.gitlab['email_from'] ||= "gitlab@#{Settings.gitlab.host}" -Settings.gitlab['email_display_name'] ||= "GitLab" -Settings.gitlab['email_reply_to'] ||= "noreply@#{Settings.gitlab.host}" -Settings.gitlab['url'] ||= Settings.send(:build_gitlab_url) -Settings.gitlab['user'] ||= 'git' -Settings.gitlab['user_home'] ||= begin - Etc.getpwnam(Settings.gitlab['user']).dir -rescue ArgumentError # no user configured - '/home/' + Settings.gitlab['user'] -end -Settings.gitlab['time_zone'] ||= nil -Settings.gitlab['signup_enabled'] ||= true if Settings.gitlab['signup_enabled'].nil? -Settings.gitlab['signin_enabled'] ||= true if Settings.gitlab['signin_enabled'].nil? -Settings.gitlab['twitter_sharing_enabled'] ||= true if Settings.gitlab['twitter_sharing_enabled'].nil? -Settings.gitlab['restricted_visibility_levels'] = Settings.send(:verify_constant_array, Gitlab::VisibilityLevel, Settings.gitlab['restricted_visibility_levels'], []) -Settings.gitlab['username_changing_enabled'] = true if Settings.gitlab['username_changing_enabled'].nil? -Settings.gitlab['issue_closing_pattern'] = '((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?|[Rr]esolv(?:e[sd]?|ing)) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+)' if Settings.gitlab['issue_closing_pattern'].nil? -Settings.gitlab['default_projects_features'] ||= {} -Settings.gitlab['webhook_timeout'] ||= 10 -Settings.gitlab['max_attachment_size'] ||= 10 -Settings.gitlab.default_projects_features['issues'] = true if Settings.gitlab.default_projects_features['issues'].nil? -Settings.gitlab.default_projects_features['merge_requests'] = true if Settings.gitlab.default_projects_features['merge_requests'].nil? -Settings.gitlab.default_projects_features['wiki'] = true if Settings.gitlab.default_projects_features['wiki'].nil? -Settings.gitlab.default_projects_features['snippets'] = false if Settings.gitlab.default_projects_features['snippets'].nil? -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) - -# -# Gravatar -# -Settings['gravatar'] ||= Settingslogic.new({}) -Settings.gravatar['enabled'] = true if Settings.gravatar['enabled'].nil? -Settings.gravatar['plain_url'] ||= 'http://www.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon' -Settings.gravatar['ssl_url'] ||= 'https://secure.gravatar.com/avatar/%{hash}?s=%{size}&d=identicon' - -# -# GitLab Shell -# -Settings['gitlab_shell'] ||= Settingslogic.new({}) -Settings.gitlab_shell['path'] ||= Settings.gitlab['user_home'] + '/gitlab-shell/' -Settings.gitlab_shell['hooks_path'] ||= Settings.gitlab['user_home'] + '/gitlab-shell/hooks/' -Settings.gitlab_shell['receive_pack'] = true if Settings.gitlab_shell['receive_pack'].nil? -Settings.gitlab_shell['upload_pack'] = true if Settings.gitlab_shell['upload_pack'].nil? -Settings.gitlab_shell['repos_path'] ||= Settings.gitlab['user_home'] + '/repositories/' -Settings.gitlab_shell['ssh_host'] ||= Settings.gitlab.ssh_host -Settings.gitlab_shell['ssh_port'] ||= 22 -Settings.gitlab_shell['ssh_user'] ||= Settings.gitlab.user -Settings.gitlab_shell['owner_group'] ||= Settings.gitlab.user -Settings.gitlab_shell['ssh_path_prefix'] ||= Settings.send(:build_gitlab_shell_ssh_path_prefix) - -# -# Backup -# -Settings['backup'] ||= Settingslogic.new({}) -Settings.backup['keep_time'] ||= 0 -Settings.backup['path'] = File.expand_path(Settings.backup['path'] || "tmp/backups/", Rails.root) -Settings.backup['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil }) -# Convert upload connection settings to use symbol keys, to make Fog happy -if Settings.backup['upload']['connection'] - Settings.backup['upload']['connection'] = Hash[Settings.backup['upload']['connection'].map { |k, v| [k.to_sym, v] }] -end - -# -# Git -# -Settings['git'] ||= Settingslogic.new({}) -Settings.git['max_size'] ||= 20971520 # 20.megabytes -Settings.git['bin_path'] ||= '/usr/bin/git' -Settings.git['timeout'] ||= 10 - -Settings['satellites'] ||= Settingslogic.new({}) -Settings.satellites['path'] = File.expand_path(Settings.satellites['path'] || "tmp/repo_satellites/", Rails.root) -Settings.satellites['timeout'] ||= 30 - -# -# Extra customization -# -Settings['extra'] ||= Settingslogic.new({}) - -# -# Rack::Attack settings -# -Settings['rack_attack'] ||= Settingslogic.new({}) -Settings.rack_attack['git_basic_auth'] ||= Settingslogic.new({}) -Settings.rack_attack.git_basic_auth['enabled'] = true if Settings.rack_attack.git_basic_auth['enabled'].nil? -Settings.rack_attack.git_basic_auth['ip_whitelist'] ||= %w{127.0.0.1} -Settings.rack_attack.git_basic_auth['maxretry'] ||= 10 -Settings.rack_attack.git_basic_auth['findtime'] ||= 1.minute -Settings.rack_attack.git_basic_auth['bantime'] ||= 1.hour - -# -# Testing settings -# -if Rails.env.test? - Settings.gitlab['default_projects_limit'] = 42 - Settings.gitlab['default_can_create_group'] = true - Settings.gitlab['default_can_create_team'] = false -end diff --git a/config/initializers/2_app.rb b/config/initializers/2_app.rb deleted file mode 100644 index 688cdf5f4b0..00000000000 --- a/config/initializers/2_app.rb +++ /dev/null @@ -1,8 +0,0 @@ -module Gitlab - VERSION = File.read(Rails.root.join("VERSION")).strip - REVISION = Gitlab::Popen.popen(%W(git log --pretty=format:%h -n 1)).first.chomp - - def self.config - Settings - end -end diff --git a/config/initializers/3_grit_ext.rb b/config/initializers/3_grit_ext.rb deleted file mode 100644 index 6540ac839cb..00000000000 --- 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_sidekiq.rb b/config/initializers/4_sidekiq.rb deleted file mode 100644 index e856499732e..00000000000 --- a/config/initializers/4_sidekiq.rb +++ /dev/null @@ -1,27 +0,0 @@ -# Custom Redis configuration -config_file = Rails.root.join('config', 'resque.yml') - -resque_url = if File.exists?(config_file) - YAML.load_file(config_file)[Rails.env] - else - "redis://localhost:6379" - end - -Sidekiq.configure_server do |config| - config.redis = { - url: resque_url, - namespace: 'resque:gitlab' - } - - config.server_middleware do |chain| - chain.add Gitlab::SidekiqMiddleware::ArgumentsLogger if ENV['SIDEKIQ_LOG_ARGUMENTS'] - chain.add Gitlab::SidekiqMiddleware::MemoryKiller if ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'] - end -end - -Sidekiq.configure_client do |config| - config.redis = { - url: resque_url, - namespace: 'resque:gitlab' - } -end diff --git a/config/initializers/5_backend.rb b/config/initializers/5_backend.rb deleted file mode 100644 index 80d641d73a3..00000000000 --- a/config/initializers/5_backend.rb +++ /dev/null @@ -1,15 +0,0 @@ -# GIT over HTTP -require Rails.root.join("lib", "gitlab", "backend", "grack_auth") - -# GIT over SSH -require Rails.root.join("lib", "gitlab", "backend", "shell") - -# GitLab shell adapter -require Rails.root.join("lib", "gitlab", "backend", "shell_adapter") - -required_version = Gitlab::VersionInfo.parse(Gitlab::Shell.version_required) -current_version = Gitlab::VersionInfo.parse(Gitlab::Shell.new.version) - -unless current_version.valid? && required_version <= current_version - warn "WARNING: This version of GitLab depends on gitlab-shell #{required_version}, but you're running #{current_version}. Please update gitlab-shell." -end diff --git a/config/initializers/6_rack_profiler.rb b/config/initializers/6_rack_profiler.rb deleted file mode 100644 index b6340287569..00000000000 --- a/config/initializers/6_rack_profiler.rb +++ /dev/null @@ -1,8 +0,0 @@ -if Rails.env == 'development' - require 'rack-mini-profiler' - - # initialization is skipped so trigger it - Rack::MiniProfilerRails.initialize!(Rails.application) - Rack::MiniProfiler.config.position = 'right' - Rack::MiniProfiler.config.start_hidden = true -end diff --git a/config/initializers/7_omniauth.rb b/config/initializers/7_omniauth.rb deleted file mode 100644 index 8f6c5673103..00000000000 --- a/config/initializers/7_omniauth.rb +++ /dev/null @@ -1,12 +0,0 @@ -if Gitlab::LDAP::Config.enabled? - module OmniAuth::Strategies - server = Gitlab.config.ldap.servers.values.first - klass = server['provider_class'] - const_set(klass, Class.new(LDAP)) unless klass == 'LDAP' - end - - OmniauthCallbacksController.class_eval do - server = Gitlab.config.ldap.servers.values.first - alias_method server['provider_name'], :ldap - end -end diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cdf379..00000000000 --- a/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb deleted file mode 100644 index bfb8656df55..00000000000 --- a/config/initializers/carrierwave.rb +++ /dev/null @@ -1,41 +0,0 @@ -CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/ - -aws_file = Rails.root.join('config', 'aws.yml') - -if File.exists?(aws_file) - AWS_CONFIG = YAML.load(File.read(aws_file))[Rails.env] - - CarrierWave.configure do |config| - config.fog_credentials = { - provider: 'AWS', # required - aws_access_key_id: AWS_CONFIG['access_key_id'], # required - aws_secret_access_key: AWS_CONFIG['secret_access_key'], # required - region: AWS_CONFIG['region'], # optional, defaults to 'us-east-1' - } - - # required - config.fog_directory = AWS_CONFIG['bucket'] - - # optional, defaults to true - config.fog_public = false - - # optional, defaults to {} - config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' } - - # optional time (in seconds) that authenticated urls will be valid. - # when fog_public is false and provider is AWS or Google, defaults to 600 - config.fog_authenticated_url_expiration = 1 << 29 - end - - # Mocking Fog requests, based on: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Test-Fog-based-uploaders - if Rails.env.test? - Fog.mock! - connection = ::Fog::Storage.new( - aws_access_key_id: AWS_CONFIG['access_key_id'], - aws_secret_access_key: AWS_CONFIG['secret_access_key'], - provider: 'AWS', - region: AWS_CONFIG['region'] - ) - connection.directories.create(key: AWS_CONFIG['bucket']) - end -end diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb deleted file mode 100644 index 9dce495106f..00000000000 --- a/config/initializers/devise.rb +++ /dev/null @@ -1,246 +0,0 @@ -# Use this hook to configure devise mailer, warden hooks and so forth. The first -# four configuration values can also be set straight in your models. -Devise.setup do |config| - # ==> Mailer Configuration - # Configure the e-mail address which will be shown in Devise::Mailer, - # note that it will be overwritten if you use your own mailer class with default "from" parameter. - config.mailer_sender = "GitLab <#{Gitlab.config.gitlab.email_from}>" - - - # Configure the class responsible to send e-mails. - # config.mailer = "Devise::Mailer" - - # ==> ORM configuration - # Load and configure the ORM. Supports :active_record (default) and - # :mongoid (bson_ext recommended) by default. Other ORMs may be - # available as additional gems. - require 'devise/orm/active_record' - - # ==> Configuration for any authentication mechanism - # Configure which keys are used when authenticating a user. The default is - # just :email. You can configure it to use [:username, :subdomain], so for - # authenticating a user, both parameters are required. Remember that those - # parameters are used only when authenticating and not when retrieving from - # session. If you need permissions, you should implement that in a before filter. - # You can also supply a hash where the value is a boolean determining whether - # or not authentication should be aborted when the value is not present. - config.authentication_keys = [ :login ] - - # Configure parameters from the request object used for authentication. Each entry - # given should be a request method and it will automatically be passed to the - # find_for_authentication method and considered in your model lookup. For instance, - # if you set :request_keys to [:subdomain], :subdomain will be used on authentication. - # The same considerations mentioned for authentication_keys also apply to request_keys. - # config.request_keys = [] - - # Configure which authentication keys should be case-insensitive. - # These keys will be downcased upon creating or modifying a user and when used - # to authenticate or find a user. Default is :email. - config.case_insensitive_keys = [ :email ] - - # Configure which authentication keys should have whitespace stripped. - # These keys will have whitespace before and after removed upon creating or - # modifying a user and when used to authenticate or find a user. Default is :email. - config.strip_whitespace_keys = [ :email ] - - # Tell if authentication through request.params is enabled. True by default. - # config.params_authenticatable = true - - # Tell if authentication through HTTP Basic Auth is enabled. False by default. - # config.http_authenticatable = false - - # If http headers should be returned for AJAX requests. True by default. - # config.http_authenticatable_on_xhr = true - - # The realm used in Http Basic Authentication. "Application" by default. - # config.http_authentication_realm = "Application" - - config.reconfirmable = true - - # It will change confirmation, password recovery and other workflows - # to behave the same regardless if the e-mail provided was right or wrong. - # Does not affect registerable. - # config.paranoid = true - - # ==> Configuration for :database_authenticatable - # For bcrypt, this is the cost for hashing the password and defaults to 10. If - # using other encryptors, it sets how many times you want the password re-encrypted. - # - # Limiting the stretches to just one in testing will increase the performance of - # your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use - # a value less than 10 in other environments. - config.stretches = Rails.env.test? ? 1 : 10 - - # Setup a pepper to generate the encrypted password. - # config.pepper = "2ef62d549c4ff98a5d3e0ba211e72cff592060247e3bbbb9f499af1222f876f53d39b39b823132affb32858168c79c1d7741d26499901b63c6030a42129924ef" - - # ==> Configuration for :confirmable - # The time you want to give a user to confirm their account. During this time - # they will be able to access your application without confirming. Default is 0.days - # When allow_unconfirmed_access_for is zero, the user won't be able to sign in without confirming. - # You can use this to let your user access some features of your application - # without confirming the account, but blocking it after a certain period - # (ie 2 days). - # config.allow_unconfirmed_access_for = 2.days - - # Defines which key will be used when confirming an account - # config.confirmation_keys = [ :email ] - - # ==> Configuration for :rememberable - # The time the user will be remembered without asking for credentials again. - # config.remember_for = 2.weeks - - # If true, a valid remember token can be re-used between multiple browsers. - # config.remember_across_browsers = true - - # If true, extends the user's remember period when remembered via cookie. - # config.extend_remember_period = false - - # Options to be passed to the created cookie. For instance, you can set - # secure: true in order to force SSL only cookies. - # config.cookie_options = {} - - # ==> Configuration for :validatable - # Range for password length. Default is 6..128. - config.password_length = 8..128 - - # Email regex used to validate email formats. It simply asserts that - # an one (and only one) @ exists in the given string. This is mainly - # to give user feedback and not to assert the e-mail validity. - # config.email_regexp = /\A[^@]+@[^@]+\z/ - - # ==> Configuration for :timeoutable - # The time you want to timeout the user session without activity. After this - # time the user will be asked for credentials again. Default is 30 minutes. - # config.timeout_in = 30.minutes - - # ==> Configuration for :lockable - # Defines which strategy will be used to lock an account. - # :failed_attempts = Locks an account after a number of failed attempts to sign in. - # :none = No lock strategy. You should handle locking by yourself. - config.lock_strategy = :failed_attempts - - # Defines which key will be used when locking and unlocking an account - # config.unlock_keys = [ :email ] - - # Defines which strategy will be used to unlock an account. - # :email = Sends an unlock link to the user email - # :time = Re-enables login after a certain amount of time (see :unlock_in below) - # :both = Enables both strategies - # :none = No unlock strategy. You should handle unlocking by yourself. - config.unlock_strategy = :time - - # Number of authentication tries before locking an account if lock_strategy - # is failed attempts. - config.maximum_attempts = 10 - - # Time interval to unlock the account if :time is enabled as unlock_strategy. - config.unlock_in = 10.minutes - - # ==> Configuration for :recoverable - # - # Defines which key will be used when recovering the password for an account - # config.reset_password_keys = [ :email ] - - # Time interval you can reset your password with a reset password key. - # Don't put a too small interval or your users won't have the time to - # change their passwords. - # When someone else invites you to GitLab this time is also used so it should be pretty long. - config.reset_password_within = 2.days - - # ==> Configuration for :encryptable - # Allow you to use another encryption algorithm besides bcrypt (default). You can use - # :sha1, :sha512 or encryptors from others authentication tools as :clearance_sha1, - # :authlogic_sha512 (then you should set stretches above to 20 for default behavior) - # and :restful_authentication_sha1 (then you should set stretches to 10, and copy - # REST_AUTH_SITE_KEY to pepper) - # config.encryptor = :sha512 - - # Authentication through token does not store user in session and needs - # to be supplied on each request. Useful if you are using the token as API token. - config.skip_session_storage << :token_auth - - # ==> Scopes configuration - # Turn scoped views on. Before rendering "sessions/new", it will first check for - # "users/sessions/new". It's turned off by default because it's slower if you - # are using only default views. - # config.scoped_views = false - - # Configure the default scope given to Warden. By default it's the first - # devise role declared in your routes (usually :user). - # config.default_scope = :user - - # Configure sign_out behavior. - # Sign_out action can be scoped (i.e. /users/sign_out affects only :user scope). - # The default is true, which means any logout action will sign out all active scopes. - # config.sign_out_all_scopes = true - - # ==> Navigation configuration - # Lists the formats that should be treated as navigational. Formats like - # :html, should redirect to the sign in page when the user does not have - # access, but formats like :xml or :json, should return 401. - # - # If you have any extra navigational formats, like :iphone or :mobile, you - # should add them to the navigational formats lists. - # - # The :"*/*" and "*/*" formats below is required to match Internet - # Explorer requests. - # config.navigational_formats = [:"*/*", "*/*", :html] - - # The default HTTP method used to sign out a resource. Default is :delete. - config.sign_out_via = :delete - - # ==> OmniAuth - # To configure a new OmniAuth provider copy and edit omniauth.rb.sample - # selecting the provider you require. - # Check the wiki for more information on setting up on your models - - # ==> Warden configuration - # If you want to use other strategies, that are not supported by Devise, or - # change the failure app, you can configure them inside the config.warden block. - # - # config.warden do |manager| - # manager.failure_app = AnotherApp - # manager.intercept_401 = false - # manager.default_strategies(scope: :user).unshift :some_external_strategy - # end - - if Gitlab::LDAP::Config.enabled? - Gitlab.config.ldap.servers.values.each do |server| - if server['allow_username_or_email_login'] - email_stripping_proc = ->(name) {name.gsub(/@.*\z/,'')} - else - email_stripping_proc = ->(name) {name} - end - - config.omniauth server['provider_name'], - host: server['host'], - base: server['base'], - uid: server['uid'], - port: server['port'], - method: server['method'], - bind_dn: server['bind_dn'], - password: server['password'], - name_proc: email_stripping_proc - end - end - - Gitlab.config.omniauth.providers.each do |provider| - provider_arguments = [] - - %w[app_id app_secret].each do |argument| - provider_arguments << provider[argument] if provider[argument] - end - - case provider['args'] - when Array - # An Array from the configuration will be expanded. - provider_arguments.concat provider['args'] - when Hash - # A Hash from the configuration will be passed as is. - provider_arguments << provider['args'] - end - - config.omniauth provider['name'].to_sym, *provider_arguments - end -end diff --git a/config/initializers/devise_async.rb b/config/initializers/devise_async.rb deleted file mode 100644 index 05a1852cdbd..00000000000 --- a/config/initializers/devise_async.rb +++ /dev/null @@ -1 +0,0 @@ -Devise::Async.backend = :sidekiq diff --git a/config/initializers/devise_password_length.rb.example b/config/initializers/devise_password_length.rb.example deleted file mode 100644 index 97305825e07..00000000000 --- a/config/initializers/devise_password_length.rb.example +++ /dev/null @@ -1,6 +0,0 @@ -Devise.setup do |config| - # The following line changes the password length limits for new users. In the - # example below the minimum length is 12 characters, and the maximum length - # is 128 characters. - config.password_length = 12..128 -end diff --git a/config/initializers/disable_email_interceptor.rb b/config/initializers/disable_email_interceptor.rb deleted file mode 100644 index c76a6b8b19f..00000000000 --- a/config/initializers/disable_email_interceptor.rb +++ /dev/null @@ -1,2 +0,0 @@ -# Interceptor in lib/disable_email_interceptor.rb -ActionMailer::Base.register_interceptor(DisableEmailInterceptor) unless Gitlab.config.gitlab.email_enabled diff --git a/config/initializers/gitlab_shell_secret_token.rb b/config/initializers/gitlab_shell_secret_token.rb deleted file mode 100644 index e7c9f0ba7c2..00000000000 --- a/config/initializers/gitlab_shell_secret_token.rb +++ /dev/null @@ -1,19 +0,0 @@ -# Be sure to restart your server when you modify this file. - -require 'securerandom' - -# Your secret key for verifying the gitlab_shell. - - -secret_file = Rails.root.join('.gitlab_shell_secret') -gitlab_shell_symlink = File.join(Gitlab.config.gitlab_shell.path, '.gitlab_shell_secret') - -unless File.exist? secret_file - # Generate a new token of 16 random hexadecimal characters and store it in secret_file. - token = SecureRandom.hex(16) - File.write(secret_file, token) -end - -if File.exist?(Gitlab.config.gitlab_shell.path) && !File.exist?(gitlab_shell_symlink) - FileUtils.symlink(secret_file, gitlab_shell_symlink) -end diff --git a/config/initializers/haml.rb b/config/initializers/haml.rb deleted file mode 100644 index 7e8ddb3716b..00000000000 --- a/config/initializers/haml.rb +++ /dev/null @@ -1 +0,0 @@ -Haml::Template.options[:ugly] = true diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb deleted file mode 100644 index 5d46ece1e1b..00000000000 --- a/config/initializers/inflections.rb +++ /dev/null @@ -1,31 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format -# (all these examples are active by default): -# ActiveSupport::Inflector.inflections do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# Mark "commits" as uncountable. -# -# Without this change, the routes -# -# resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} -# resources :commits, only: [:show], constraints: {id: /.+/} -# -# would generate identical route helper methods (`project_commit_path`), resulting -# in one of them not getting a helper method at all. -# -# After this change, the helper methods are: -# -# project_commit_path(@project, @project.commit) -# # => "/gitlabhq/commit/bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a -# -# project_commits_path(@project, 'stable/README.md') -# # => "/gitlabhq/commits/stable/README.md" -ActiveSupport::Inflector.inflections do |inflect| - inflect.uncountable %w(commits) -end diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb deleted file mode 100644 index 3cbe9a058d7..00000000000 --- a/config/initializers/kaminari_config.rb +++ /dev/null @@ -1,10 +0,0 @@ -Kaminari.configure do |config| - config.default_per_page = 20 - config.max_per_page = 100 - # config.window = 4 - # config.outer_window = 0 - # config.left = 0 - # config.right = 0 - # config.page_method_name = :page - # config.param_name = :page -end diff --git a/config/initializers/postgresql_limit_fix.rb b/config/initializers/postgresql_limit_fix.rb deleted file mode 100644 index 0cb3aaf4d24..00000000000 --- a/config/initializers/postgresql_limit_fix.rb +++ /dev/null @@ -1,26 +0,0 @@ -if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) - class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter - class TableDefinition - def text(*args) - options = args.extract_options! - options.delete(:limit) - column_names = args - type = :text - column_names.each { |name| column(name, type, options) } - end - end - - def add_column_with_limit_filter(table_name, column_name, type, options = {}) - options.delete(:limit) if type == :text - add_column_without_limit_filter(table_name, column_name, type, options) - end - - def change_column_with_limit_filter(table_name, column_name, type, options = {}) - options.delete(:limit) if type == :text - change_column_without_limit_filter(table_name, column_name, type, options) - end - - alias_method_chain :add_column, :limit_filter - alias_method_chain :change_column, :limit_filter - end -end diff --git a/config/initializers/public_key.rb b/config/initializers/public_key.rb deleted file mode 100644 index e4f09a2d020..00000000000 --- a/config/initializers/public_key.rb +++ /dev/null @@ -1,2 +0,0 @@ -path = File.expand_path("~/.ssh/bitbucket_rsa.pub") -Gitlab::BitbucketImport.public_key = File.read(path) if File.exist?(path) diff --git a/config/initializers/rack_attack.rb.example b/config/initializers/rack_attack.rb.example deleted file mode 100644 index 332865d2881..00000000000 --- a/config/initializers/rack_attack.rb.example +++ /dev/null @@ -1,26 +0,0 @@ -# 1. Rename this file to rack_attack.rb -# 2. Review the paths_to_be_protected and add any other path you need protecting -# - -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/" - -] - -# Create one big regular expression that matches strings starting with any of -# the paths_to_be_protected. -paths_regex = Regexp.union(paths_to_be_protected.map { |path| /\A#{Regexp.escape(path)}/ }) - -unless Rails.env.test? - Rack::Attack.throttle('protected paths', limit: 10, period: 60.seconds) do |req| - if req.post? && req.path =~ paths_regex - req.ip - end - end -end diff --git a/config/initializers/rack_attack_git_basic_auth.rb b/config/initializers/rack_attack_git_basic_auth.rb deleted file mode 100644 index bbbfed68329..00000000000 --- a/config/initializers/rack_attack_git_basic_auth.rb +++ /dev/null @@ -1,12 +0,0 @@ -unless Rails.env.test? - # Tell the Rack::Attack Rack middleware to maintain an IP blacklist. We will - # update the blacklist from Grack::Auth#authenticate_user. - Rack::Attack.blacklist('Git HTTP Basic Auth') do |req| - Rack::Attack::Allow2Ban.filter(req.ip, Gitlab.config.rack_attack.git_basic_auth) do - # This block only gets run if the IP was not already banned. - # Return false, meaning that we do not see anything wrong with the - # request at this time - false - end - end -end diff --git a/config/initializers/redis-store-fix-expiry.rb b/config/initializers/redis-store-fix-expiry.rb deleted file mode 100644 index fce0a135330..00000000000 --- a/config/initializers/redis-store-fix-expiry.rb +++ /dev/null @@ -1,44 +0,0 @@ -# Monkey-patch Redis::Store to make 'setex' and 'expire' work with namespacing - -module Gitlab - class Redis - class Store - module Namespace - # Redis::Store#setex in redis-store 1.1.4 does not respect namespaces; - # this new method does. - def setex(key, expires_in, value, options=nil) - namespace(key) { |key| super(key, expires_in, value) } - end - - # Redis::Store#expire in redis-store 1.1.4 does not respect namespaces; - # this new method does. - def expire(key, expires_in) - namespace(key) { |key| super(key, expires_in) } - end - - private - - # Our new definitions of #setex and #expire above assume that the - # #namespace method exists. Because we cannot be sure of that, we - # re-implement the #namespace method from Redis::Store::Namespace so - # that it is available for all Redis::Store instances, whether they use - # namespacing or not. - # - # Based on lib/redis/store/namespace.rb L49-51 (redis-store 1.1.4) - def namespace(key) - if @namespace - yield interpolate(key) - else - # This Redis::Store instance does not use a namespace so we should - # just pass through the key. - yield key - end - end - end - end - end -end - -Redis::Store.class_eval do - include Gitlab::Redis::Store::Namespace -end diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb deleted file mode 100644 index 62a54bc8c63..00000000000 --- a/config/initializers/secret_token.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Be sure to restart your server when you modify this file. - -require 'securerandom' - -# Your secret key for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. - -def find_secure_token - token_file = Rails.root.join('.secret') - if ENV.key?('SECRET_KEY_BASE') - ENV['SECRET_KEY_BASE'] - elsif File.exist? token_file - # Use the existing token. - File.read(token_file).chomp - else - # Generate a new token of 64 random hexadecimal characters and store it in token_file. - token = SecureRandom.hex(64) - File.write(token_file, token) - token - end -end - -Gitlab::Application.config.secret_token = find_secure_token -Gitlab::Application.config.secret_key_base = find_secure_token diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb deleted file mode 100644 index b2d59f1c4b7..00000000000 --- a/config/initializers/session_store.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Gitlab::Application.config.session_store( - :redis_store, # Using the cookie_store would enable session replay attacks. - servers: Gitlab::Application.config.cache_store[1].merge(namespace: 'session:gitlab'), # re-use the Redis config from the Rails cache store - key: '_gitlab_session', - secure: Gitlab.config.gitlab.https, - httponly: true, - expire_after: 1.week, - path: (Rails.application.config.relative_url_root.nil?) ? '/' : Rails.application.config.relative_url_root -) diff --git a/config/initializers/smtp_settings.rb.sample b/config/initializers/smtp_settings.rb.sample deleted file mode 100644 index f0fe2fdfa43..00000000000 --- a/config/initializers/smtp_settings.rb.sample +++ /dev/null @@ -1,22 +0,0 @@ -# To enable smtp email delivery for your GitLab instance do the following: -# 1. Rename this file to smtp_settings.rb -# 2. Edit settings inside this file -# 3. Restart GitLab instance -# -# For full list of options and their values see http://api.rubyonrails.org/classes/ActionMailer/Base.html -# - -if Rails.env.production? - Gitlab::Application.config.action_mailer.delivery_method = :smtp - - ActionMailer::Base.smtp_settings = { - address: "email.server.com", - port: 456, - user_name: "smtp", - password: "123456", - domain: "gitlab.company.com", - authentication: :login, - enable_starttls_auto: true, - openssl_verify_mode: 'peer' # See ActionMailer documentation for other possible options - } -end diff --git a/config/initializers/state_machine_patch.rb b/config/initializers/state_machine_patch.rb deleted file mode 100644 index 72d010fa5de..00000000000 --- a/config/initializers/state_machine_patch.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This is a patch to address the issue in https://github.com/pluginaweek/state_machine/issues/251 -# where gem 'state_machine' was not working for Rails 4.1 -module StateMachine - module Integrations - module ActiveModel - public :around_validation - end - end -end diff --git a/config/initializers/static_files.rb b/config/initializers/static_files.rb deleted file mode 100644 index d9042c652bb..00000000000 --- a/config/initializers/static_files.rb +++ /dev/null @@ -1,15 +0,0 @@ -app = Rails.application - -if app.config.serve_static_assets - # The `ActionDispatch::Static` middleware intercepts requests for static files - # by checking if they exist in the `/public` directory. - # We're replacing it with our `Gitlab::Middleware::Static` that does the same, - # except ignoring `/uploads`, letting those go through to the GitLab Rails app. - - app.config.middleware.swap( - ActionDispatch::Static, - Gitlab::Middleware::Static, - app.paths["public"].first, - app.config.static_cache_control - ) -end diff --git a/config/initializers/time_zone.rb b/config/initializers/time_zone.rb deleted file mode 100644 index ee246e67d66..00000000000 --- a/config/initializers/time_zone.rb +++ /dev/null @@ -1 +0,0 @@ -Time.zone = Gitlab.config.gitlab.time_zone || Time.zone diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb deleted file mode 100644 index 999df20181e..00000000000 --- a/config/initializers/wrap_parameters.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. -# -# This file contains settings for ActionController::ParamsWrapper which -# is enabled by default. - -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. -ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] -end - -# Disable root element in JSON by default. -ActiveSupport.on_load(:active_record) do - self.include_root_in_json = false -end diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml deleted file mode 100644 index f3db5b7476e..00000000000 --- a/config/locales/devise.en.yml +++ /dev/null @@ -1,60 +0,0 @@ -# Additional translations at http://github.com/plataformatec/devise/wiki/I18n - -en: - errors: - messages: - expired: "has expired, please request a new one" - not_found: "not found" - already_confirmed: "was already confirmed, please try signing in" - not_locked: "was not locked" - not_saved: - one: "1 error prohibited this %{resource} from being saved:" - other: "%{count} errors prohibited this %{resource} from being saved:" - - devise: - failure: - already_authenticated: 'You are already signed in.' - unauthenticated: 'You need to sign in before continuing.' - unconfirmed: 'You have to confirm your account before continuing.' - locked: 'Your account is locked.' - not_found_in_database: 'Invalid email or password.' - invalid: 'Invalid email or password.' - invalid_token: 'Invalid authentication token.' - timeout: 'Your session expired, please sign in again to continue.' - inactive: 'Your account was not activated yet.' - sessions: - signed_in: '' - signed_out: '' - users_sessions: - user: - signed_in: 'Signed in successfully.' - passwords: - 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" - 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.' - confirmed: 'Your account was successfully confirmed. You are now signed in.' - registrations: - signed_up: 'Welcome! You have signed up successfully.' - updated: 'You updated your account successfully.' - destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' - signed_up_but_unconfirmed: 'A message with a confirmation link has been sent to your email address. Please open the link to activate your account.' - signed_up_but_inactive: 'You have signed up successfully. However, we could not sign you in because your account is not yet activated.' - signed_up_but_locked: 'You have signed up successfully. However, we could not sign you in because your account is locked.' - unlocks: - send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' - unlocked: 'Your account was successfully unlocked. You are now signed in.' - send_paranoid_instructions: 'If your account exists, you will receive an email with instructions about how to unlock it in a few minutes.' - omniauth_callbacks: - success: 'Successfully authorized from %{kind} account.' - failure: 'Could not authorize you from %{kind} because "%{reason}".' - mailer: - confirmation_instructions: - subject: 'Confirmation instructions' - reset_password_instructions: - subject: 'Reset password instructions' - unlock_instructions: - subject: 'Unlock Instructions' \ No newline at end of file diff --git a/config/locales/doorkeeper.en.yml b/config/locales/doorkeeper.en.yml deleted file mode 100644 index c5b6b75e7f6..00000000000 --- a/config/locales/doorkeeper.en.yml +++ /dev/null @@ -1,73 +0,0 @@ -en: - activerecord: - errors: - models: - application: - attributes: - redirect_uri: - fragment_present: 'cannot contain a fragment.' - invalid_uri: 'must be a valid URI.' - relative_uri: 'must be an absolute URI.' - mongoid: - errors: - models: - application: - attributes: - redirect_uri: - fragment_present: 'cannot contain a fragment.' - invalid_uri: 'must be a valid URI.' - relative_uri: 'must be an absolute URI.' - mongo_mapper: - errors: - models: - application: - attributes: - redirect_uri: - fragment_present: 'cannot contain a fragment.' - invalid_uri: 'must be a valid URI.' - relative_uri: 'must be an absolute URI.' - doorkeeper: - errors: - messages: - # Common error messages - invalid_request: 'The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed.' - invalid_redirect_uri: 'The redirect uri included is not valid.' - unauthorized_client: 'The client is not authorized to perform this request using this method.' - access_denied: 'The resource owner or authorization server denied the request.' - invalid_scope: 'The requested scope is invalid, unknown, or malformed.' - server_error: 'The authorization server encountered an unexpected condition which prevented it from fulfilling the request.' - temporarily_unavailable: 'The authorization server is currently unable to handle the request due to a temporary overloading or maintenance of the server.' - - #configuration error messages - credential_flow_not_configured: 'Resource Owner Password Credentials flow failed due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured.' - resource_owner_authenticator_not_configured: 'Resource Owner find failed due to Doorkeeper.configure.resource_owner_authenticator being unconfiged.' - - # Access grant errors - unsupported_response_type: 'The authorization server does not support this response type.' - - # Access token errors - invalid_client: 'Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.' - invalid_grant: 'The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.' - unsupported_grant_type: 'The authorization grant type is not supported by the authorization server.' - - # Password Access token errors - invalid_resource_owner: 'The provided resource owner credentials are not valid, or resource owner cannot be found' - - invalid_token: - revoked: "The access token was revoked" - expired: "The access token expired" - unknown: "The access token is invalid" - scopes: - api: Access your API - - flash: - applications: - create: - notice: 'Application created.' - destroy: - notice: 'Application deleted.' - update: - notice: 'Application updated.' - authorized_applications: - destroy: - notice: 'Application revoked.' diff --git a/config/locales/en.yml b/config/locales/en.yml deleted file mode 100644 index f6cfb5efd2a..00000000000 --- a/config/locales/en.yml +++ /dev/null @@ -1,10 +0,0 @@ -# Sample localization file for English. Add more files in this directory for other locales. -# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. - -en: - hello: "Hello world" - errors: - messages: - wrong_size: "is the wrong size (should be %{file_size})" - size_too_small: "is too small (should be at least %{file_size})" - size_too_big: "is too big (should be at most %{file_size})" diff --git a/config/newrelic.yml b/config/newrelic.yml deleted file mode 100644 index 9ef922a38d9..00000000000 --- a/config/newrelic.yml +++ /dev/null @@ -1,16 +0,0 @@ -# New Relic configuration file -# -# This file is here to make sure the New Relic gem stays -# quiet by default. -# -# To enable and configure New Relic, please use -# environment variables, e.g. NEW_RELIC_ENABLED=true - -production: - enabled: false - -development: - enabled: false - -test: - enabled: false diff --git a/config/resque.yml.example b/config/resque.yml.example deleted file mode 100644 index 347f3599b20..00000000000 --- a/config/resque.yml.example +++ /dev/null @@ -1,3 +0,0 @@ -development: redis://localhost:6379 -test: redis://localhost:6379 -production: unix:/var/run/redis/redis.sock diff --git a/config/unicorn.rb.example b/config/unicorn.rb.example deleted file mode 100644 index 86a5512e761..00000000000 --- a/config/unicorn.rb.example +++ /dev/null @@ -1,123 +0,0 @@ -# Sample verbose configuration file for Unicorn (not Rack) -# -# This configuration file documents many features of Unicorn -# that may not be needed for some applications. See -# http://unicorn.bogomips.org/examples/unicorn.conf.minimal.rb -# for a much simpler configuration file. -# -# See http://unicorn.bogomips.org/Unicorn/Configurator.html for complete -# documentation. - -# WARNING: See config/application.rb under "Relative url support" for the list of -# other files that need to be changed for relative url support -# -# ENV['RAILS_RELATIVE_URL_ROOT'] = "/gitlab" - -# Read about unicorn workers here: -# http://doc.gitlab.com/ee/install/requirements.html#unicorn-workers -# -worker_processes 3 - -# Since Unicorn is never exposed to outside clients, it does not need to -# run on the standard HTTP port (80), there is no reason to start Unicorn -# as root unless it's from system init scripts. -# If running the master process as root and the workers as an unprivileged -# user, do this to switch euid/egid in the workers (also chowns logs): -# user "unprivileged_user", "unprivileged_group" - -# Help ensure your application will always spawn in the symlinked -# "current" directory that Capistrano sets up. -working_directory "/home/git/gitlab" # available in 0.94.0+ - -# Listen on both a Unix domain socket and a TCP port. -# If you are load-balancing multiple Unicorn masters, lower the backlog -# setting to e.g. 64 for faster failover. -listen "/home/git/gitlab/tmp/sockets/gitlab.socket", :backlog => 1024 -listen "127.0.0.1:8080", :tcp_nopush => true - -# nuke workers after 30 seconds instead of 60 seconds (the default) -# -# NOTICE: git push over http depends on this value. -# If you want be able to push huge amount of data to git repository over http -# you will have to increase this value too. -# -# Example of output if you try to push 1GB repo to GitLab over http. -# -> git push http://gitlab.... master -# -# error: RPC failed; result=18, HTTP code = 200 -# fatal: The remote end hung up unexpectedly -# fatal: The remote end hung up unexpectedly -# -# For more information see http://stackoverflow.com/a/21682112/752049 -# -timeout 60 - -# feel free to point this anywhere accessible on the filesystem -pid "/home/git/gitlab/tmp/pids/unicorn.pid" - -# By default, the Unicorn logger will write to stderr. -# Additionally, some applications/frameworks log to stderr or stdout, -# so prevent them from going to /dev/null when daemonized here: -stderr_path "/home/git/gitlab/log/unicorn.stderr.log" -stdout_path "/home/git/gitlab/log/unicorn.stdout.log" - -# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings -# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow -preload_app true -GC.respond_to?(:copy_on_write_friendly=) and - GC.copy_on_write_friendly = true - -# Enable this flag to have unicorn test client connections by writing the -# beginning of the HTTP headers before calling the application. This -# prevents calling the application for connections that have disconnected -# while queued. This is only guaranteed to detect clients on the same -# host unicorn runs on, and unlikely to detect disconnects even on a -# fast LAN. -check_client_connection false - -before_fork do |server, worker| - # the following is highly recomended for Rails + "preload_app true" - # as there's no need for the master process to hold a connection - defined?(ActiveRecord::Base) and - ActiveRecord::Base.connection.disconnect! - - # The following is only recommended for memory/DB-constrained - # installations. It is not needed if your system can house - # twice as many worker_processes as you have configured. - # - # This allows a new master process to incrementally - # phase out the old master process with SIGTTOU to avoid a - # thundering herd (especially in the "preload_app false" case) - # when doing a transparent upgrade. The last worker spawned - # will then kill off the old master process with a SIGQUIT. - old_pid = "#{server.config[:pid]}.oldbin" - if old_pid != server.pid - begin - sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU - Process.kill(sig, File.read(old_pid).to_i) - rescue Errno::ENOENT, Errno::ESRCH - end - end - # - # Throttle the master from forking too quickly by sleeping. Due - # to the implementation of standard Unix signal handlers, this - # helps (but does not completely) prevent identical, repeated signals - # from being lost when the receiving process is busy. - # sleep 1 -end - -after_fork do |server, worker| - # per-process listener ports for debugging/admin/migrations - # addr = "127.0.0.1:#{9293 + worker.nr}" - # server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true) - - # the following is *required* for Rails + "preload_app true", - defined?(ActiveRecord::Base) and - ActiveRecord::Base.establish_connection - - # if preload_app is true, then you may also want to check and - # restart any other shared sockets/descriptors such as Memcached, - # and Redis. TokyoCabinet file handles are safe to reuse - # between any number of forked children (assuming your kernel - # correctly implements pread()/pwrite() system calls) -end diff --git a/config/unicorn.rb.example.development b/config/unicorn.rb.example.development deleted file mode 100644 index 3cd00d53a15..00000000000 --- a/config/unicorn.rb.example.development +++ /dev/null @@ -1,2 +0,0 @@ -worker_processes 2 -timeout 60 diff --git a/db/fixtures/development/01_admin.rb b/db/fixtures/development/01_admin.rb deleted file mode 100644 index bba2fc4b186..00000000000 --- a/db/fixtures/development/01_admin.rb +++ /dev/null @@ -1,13 +0,0 @@ -Gitlab::Seeder.quiet do - User.seed do |s| - s.id = 1 - s.name = 'Administrator' - s.email = 'admin@example.com' - s.notification_email = 'admin@example.com' - s.username = 'root' - s.password = '5iveL!fe' - s.admin = true - s.projects_limit = 100 - s.confirmed_at = DateTime.now - end -end diff --git a/db/fixtures/development/04_project.rb b/db/fixtures/development/04_project.rb deleted file mode 100644 index ae4c0550a4f..00000000000 --- a/db/fixtures/development/04_project.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'sidekiq/testing' - -Sidekiq::Testing.inline! do - Gitlab::Seeder.quiet do - project_urls = [ - 'https://github.com/documentcloud/underscore.git', - 'https://gitlab.com/gitlab-org/gitlab-ce.git', - 'https://gitlab.com/gitlab-org/gitlab-ci.git', - 'https://gitlab.com/gitlab-org/gitlab-shell.git', - 'https://gitlab.com/gitlab-org/gitlab-test.git', - 'https://github.com/twitter/flight.git', - 'https://github.com/twitter/typeahead.js.git', - 'https://github.com/h5bp/html5-boilerplate.git', - ] - - project_urls.each_with_index do |url, i| - group_path, project_path = url.split('/')[-2..-1] - - group = Group.find_by(path: group_path) - - unless group - group = Group.new( - name: group_path.titleize, - path: group_path - ) - group.description = Faker::Lorem.sentence - group.save - - group.add_owner(User.first) - end - - project_path.gsub!(".git", "") - - params = { - import_url: url, - namespace_id: group.id, - name: project_path.titleize, - description: Faker::Lorem.sentence, - visibility_level: Gitlab::VisibilityLevel.values.sample - } - - project = Projects::CreateService.new(User.first, params).execute - - if project.valid? - print '.' - else - puts project.errors.full_messages - print 'F' - end - end - end -end diff --git a/db/fixtures/development/05_users.rb b/db/fixtures/development/05_users.rb deleted file mode 100644 index 24952a1f661..00000000000 --- a/db/fixtures/development/05_users.rb +++ /dev/null @@ -1,32 +0,0 @@ -Gitlab::Seeder.quiet do - (2..20).each do |i| - begin - User.create!( - username: Faker::Internet.user_name, - name: Faker::Name.name, - email: Faker::Internet.email, - confirmed_at: DateTime.now, - password: '12345678' - ) - - print '.' - rescue ActiveRecord::RecordInvalid - print 'F' - end - end - - (1..5).each do |i| - begin - User.create!( - username: "user#{i}", - name: "User #{i}", - email: "user#{i}@example.com", - confirmed_at: DateTime.now, - password: '12345678' - ) - print '.' - rescue ActiveRecord::RecordInvalid - print 'F' - end - end -end diff --git a/db/fixtures/development/06_teams.rb b/db/fixtures/development/06_teams.rb deleted file mode 100644 index 3e8cdcd67b4..00000000000 --- a/db/fixtures/development/06_teams.rb +++ /dev/null @@ -1,21 +0,0 @@ -Gitlab::Seeder.quiet do - Group.all.each do |group| - User.all.sample(4).each do |user| - if group.add_users([user.id], Gitlab::Access.values.sample) - print '.' - else - print 'F' - end - end - end - - Project.all.each do |project| - User.all.sample(4).each do |user| - if project.team << [user, Gitlab::Access.values.sample] - print '.' - else - print 'F' - end - end - end -end diff --git a/db/fixtures/development/07_milestones.rb b/db/fixtures/development/07_milestones.rb deleted file mode 100644 index 2296821e528..00000000000 --- a/db/fixtures/development/07_milestones.rb +++ /dev/null @@ -1,16 +0,0 @@ -Gitlab::Seeder.quiet do - Project.all.each do |project| - (1..5).each do |i| - milestone_params = { - title: "v#{i}.0", - description: Faker::Lorem.sentence, - state: ['opened', 'closed'].sample, - } - - milestone = Milestones::CreateService.new( - project, project.team.users.sample, milestone_params).execute - - print '.' - end - end -end diff --git a/db/fixtures/development/09_issues.rb b/db/fixtures/development/09_issues.rb deleted file mode 100644 index e8b01b46d22..00000000000 --- a/db/fixtures/development/09_issues.rb +++ /dev/null @@ -1,16 +0,0 @@ -Gitlab::Seeder.quiet do - Project.all.each do |project| - (1..10).each do |i| - issue_params = { - title: Faker::Lorem.sentence(6), - description: Faker::Lorem.sentence, - state: ['opened', 'closed'].sample, - milestone: project.milestones.sample, - assignee: project.team.users.sample - } - - Issues::CreateService.new(project, project.team.users.sample, issue_params).execute - print '.' - end - end -end diff --git a/db/fixtures/development/10_merge_requests.rb b/db/fixtures/development/10_merge_requests.rb deleted file mode 100644 index f9b2fd8b05f..00000000000 --- a/db/fixtures/development/10_merge_requests.rb +++ /dev/null @@ -1,41 +0,0 @@ -Gitlab::Seeder.quiet do - Project.all.reject(&:empty_repo?).each do |project| - branches = project.repository.branch_names - - branches.each do |branch_name| - break if branches.size < 2 - source_branch = branches.pop - target_branch = branches.pop - - params = { - source_branch: source_branch, - target_branch: target_branch, - title: Faker::Lorem.sentence(6), - description: Faker::Lorem.sentences(3).join(" "), - milestone: project.milestones.sample, - assignee: project.team.users.sample - } - - MergeRequests::CreateService.new(project, project.team.users.sample, params).execute - print '.' - end - end - - project = Project.find_with_namespace('gitlab-org/gitlab-test') - - params = { - source_branch: 'feature', - target_branch: 'master', - title: 'Can be automatically merged' - } - MergeRequests::CreateService.new(project, User.admins.first, params).execute - print '.' - - params = { - source_branch: 'feature_conflict', - target_branch: 'feature', - title: 'Cannot be automatically merged' - } - MergeRequests::CreateService.new(project, User.admins.first, params).execute - print '.' -end diff --git a/db/fixtures/development/11_keys.rb b/db/fixtures/development/11_keys.rb deleted file mode 100644 index 8b4bee384e1..00000000000 --- a/db/fixtures/development/11_keys.rb +++ /dev/null @@ -1,12 +0,0 @@ -Gitlab::Seeder.quiet do - User.first(10).each do |user| - key = "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt#{user.id + 100}6k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" - - user.keys.create( - title: "Sample key #{user.id}", - key: key - ) - - print '.' - end -end diff --git a/db/fixtures/development/12_snippets.rb b/db/fixtures/development/12_snippets.rb deleted file mode 100644 index b3a6f39c7d5..00000000000 --- a/db/fixtures/development/12_snippets.rb +++ /dev/null @@ -1,40 +0,0 @@ -Gitlab::Seeder.quiet do - content =< { where(access_level: GUEST) } - scope :reporters, -> { where(access_level: REPORTER) } - scope :developers, -> { where(access_level: DEVELOPER) } - scope :masters, -> { where(access_level: MASTER) } - scope :owners, -> { where(access_level: OWNER) } - - delegate :name, :username, :email, to: :user, prefix: true -end -eos - - (1..50).each do |i| - user = User.all.sample - - PersonalSnippet.seed(:id, [{ - id: i, - author_id: user.id, - title: Faker::Lorem.sentence(3), - file_name: Faker::Internet.domain_word + '.rb', - visibility_level: Gitlab::VisibilityLevel.values.sample, - content: content, - }]) - - print('.') - end -end - diff --git a/db/fixtures/development/13_comments.rb b/db/fixtures/development/13_comments.rb deleted file mode 100644 index d37be53c7b9..00000000000 --- a/db/fixtures/development/13_comments.rb +++ /dev/null @@ -1,31 +0,0 @@ -Gitlab::Seeder.quiet do - Issue.all.each do |issue| - project = issue.project - - project.team.users.each do |user| - note_params = { - noteable_type: 'Issue', - noteable_id: issue.id, - note: Faker::Lorem.sentence, - } - - Notes::CreateService.new(project, user, note_params).execute - print '.' - end - end - - MergeRequest.all.each do |mr| - project = mr.project - - project.team.users.each do |user| - note_params = { - noteable_type: 'MergeRequest', - noteable_id: mr.id, - note: Faker::Lorem.sentence, - } - - Notes::CreateService.new(project, user, note_params).execute - print '.' - end - end -end diff --git a/db/fixtures/production/001_admin.rb b/db/fixtures/production/001_admin.rb deleted file mode 100644 index 8b560ee09e0..00000000000 --- a/db/fixtures/production/001_admin.rb +++ /dev/null @@ -1,31 +0,0 @@ -if ENV['GITLAB_ROOT_PASSWORD'].blank? - password = '5iveL!fe' - expire_time = Time.now -else - password = ENV['GITLAB_ROOT_PASSWORD'] - expire_time = nil -end - -admin = User.create( - email: "admin@example.com", - name: "Administrator", - username: 'root', - password: password, - password_expires_at: expire_time, - theme_id: Gitlab::Theme::MARS - -) - -admin.projects_limit = 10000 -admin.admin = true -admin.save! -admin.confirm! - -if admin.valid? -puts %Q[ -Administrator account created: - -login.........root -password......#{password} -] -end diff --git a/db/fixtures/test/001_repo.rb b/db/fixtures/test/001_repo.rb deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/db/migrate/20121220064453_init_schema.rb b/db/migrate/20121220064453_init_schema.rb deleted file mode 100644 index 90f5eb08e8c..00000000000 --- a/db/migrate/20121220064453_init_schema.rb +++ /dev/null @@ -1,306 +0,0 @@ -class InitSchema < ActiveRecord::Migration - def up - - create_table "events", force: true do |t| - t.string "target_type" - t.integer "target_id" - t.string "title" - t.text "data" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "action" - t.integer "author_id" - end - - add_index "events", ["action"], name: "index_events_on_action", using: :btree - add_index "events", ["author_id"], name: "index_events_on_author_id", using: :btree - add_index "events", ["created_at"], name: "index_events_on_created_at", using: :btree - add_index "events", ["project_id"], name: "index_events_on_project_id", using: :btree - add_index "events", ["target_id"], name: "index_events_on_target_id", using: :btree - add_index "events", ["target_type"], name: "index_events_on_target_type", using: :btree - - create_table "issues", force: true do |t| - t.string "title" - t.integer "assignee_id" - t.integer "author_id" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "closed", default: false, null: false - t.integer "position", default: 0 - t.string "branch_name" - t.text "description" - t.integer "milestone_id" - end - - add_index "issues", ["assignee_id"], name: "index_issues_on_assignee_id", using: :btree - add_index "issues", ["author_id"], name: "index_issues_on_author_id", using: :btree - add_index "issues", ["closed"], name: "index_issues_on_closed", using: :btree - add_index "issues", ["created_at"], name: "index_issues_on_created_at", using: :btree - add_index "issues", ["milestone_id"], name: "index_issues_on_milestone_id", using: :btree - add_index "issues", ["project_id"], name: "index_issues_on_project_id", using: :btree - add_index "issues", ["title"], name: "index_issues_on_title", using: :btree - - create_table "keys", force: true do |t| - t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" - t.text "key" - t.string "title" - t.string "identifier" - t.integer "project_id" - end - - add_index "keys", ["identifier"], name: "index_keys_on_identifier", using: :btree - add_index "keys", ["project_id"], name: "index_keys_on_project_id", using: :btree - add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree - - create_table "merge_requests", force: true do |t| - t.string "target_branch", null: false - t.string "source_branch", null: false - t.integer "project_id", null: false - t.integer "author_id" - t.integer "assignee_id" - t.string "title" - t.boolean "closed", default: false, null: false - t.datetime "created_at" - t.datetime "updated_at" - t.text "st_commits", limit: 2147483647 - t.text "st_diffs", limit: 2147483647 - t.boolean "merged", default: false, null: false - t.integer "state", default: 1, null: false - t.integer "milestone_id" - end - - add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree - add_index "merge_requests", ["author_id"], name: "index_merge_requests_on_author_id", using: :btree - add_index "merge_requests", ["closed"], name: "index_merge_requests_on_closed", using: :btree - add_index "merge_requests", ["created_at"], name: "index_merge_requests_on_created_at", using: :btree - add_index "merge_requests", ["milestone_id"], name: "index_merge_requests_on_milestone_id", using: :btree - add_index "merge_requests", ["project_id"], name: "index_merge_requests_on_project_id", using: :btree - add_index "merge_requests", ["source_branch"], name: "index_merge_requests_on_source_branch", using: :btree - add_index "merge_requests", ["target_branch"], name: "index_merge_requests_on_target_branch", using: :btree - add_index "merge_requests", ["title"], name: "index_merge_requests_on_title", using: :btree - - create_table "milestones", force: true do |t| - t.string "title", null: false - t.integer "project_id", null: false - t.text "description" - t.date "due_date" - t.boolean "closed", default: false, null: false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "milestones", ["due_date"], name: "index_milestones_on_due_date", using: :btree - add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree - - create_table "namespaces", force: true do |t| - t.string "name", null: false - t.string "path", null: false - t.integer "owner_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "type" - end - - add_index "namespaces", ["name"], name: "index_namespaces_on_name", using: :btree - add_index "namespaces", ["owner_id"], name: "index_namespaces_on_owner_id", using: :btree - add_index "namespaces", ["path"], name: "index_namespaces_on_path", using: :btree - add_index "namespaces", ["type"], name: "index_namespaces_on_type", using: :btree - - create_table "notes", force: true do |t| - t.text "note" - t.string "noteable_type" - t.integer "author_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "project_id" - t.string "attachment" - t.string "line_code" - t.string "commit_id" - t.integer "noteable_id" - end - - add_index "notes", ["commit_id"], name: "index_notes_on_commit_id", using: :btree - add_index "notes", ["created_at"], name: "index_notes_on_created_at", using: :btree - add_index "notes", ["noteable_type"], name: "index_notes_on_noteable_type", using: :btree - add_index "notes", ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type", using: :btree - add_index "notes", ["project_id"], name: "index_notes_on_project_id", using: :btree - - create_table "projects", force: true do |t| - t.string "name" - t.string "path" - t.text "description" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "private_flag", default: true, null: false - t.integer "owner_id" - t.string "default_branch" - t.boolean "issues_enabled", default: true, null: false - t.boolean "wall_enabled", default: true, null: false - t.boolean "merge_requests_enabled", default: true, null: false - t.boolean "wiki_enabled", default: true, null: false - t.integer "namespace_id" - end - - add_index "projects", ["namespace_id"], name: "index_projects_on_namespace_id", using: :btree - add_index "projects", ["owner_id"], name: "index_projects_on_owner_id", using: :btree - - create_table "protected_branches", force: true do |t| - t.integer "project_id", null: false - t.string "name", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "services", force: true do |t| - t.string "type" - t.string "title" - t.string "token" - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "active", default: false, null: false - t.string "project_url" - end - - add_index "services", ["project_id"], name: "index_services_on_project_id", using: :btree - - create_table "snippets", force: true do |t| - t.string "title" - t.text "content" - t.integer "author_id", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "file_name" - t.datetime "expires_at" - end - - add_index "snippets", ["created_at"], name: "index_snippets_on_created_at", using: :btree - add_index "snippets", ["expires_at"], name: "index_snippets_on_expires_at", using: :btree - add_index "snippets", ["project_id"], name: "index_snippets_on_project_id", using: :btree - - create_table "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" - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree - add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree - - create_table "tags", force: true do |t| - t.string "name" - end - - create_table "user_team_project_relationships", force: true do |t| - t.integer "project_id" - t.integer "user_team_id" - t.integer "greatest_access" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "user_team_user_relationships", force: true do |t| - t.integer "user_id" - t.integer "user_team_id" - t.boolean "group_admin" - t.integer "permission" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "user_teams", force: true do |t| - t.string "name" - t.string "path" - t.integer "owner_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "users", force: true do |t| - 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.datetime "current_sign_in_at" - t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" - 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.string "authentication_token" - t.boolean "dark_scheme", default: false, null: false - t.integer "theme_id", default: 1, null: false - t.string "bio" - t.boolean "blocked", default: false, null: false - t.integer "failed_attempts", default: 0 - t.datetime "locked_at" - t.string "extern_uid" - t.string "provider" - t.string "username" - end - - add_index "users", ["admin"], name: "index_users_on_admin", using: :btree - add_index "users", ["blocked"], name: "index_users_on_blocked", using: :btree - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree - add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree - add_index "users", ["name"], name: "index_users_on_name", using: :btree - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree - add_index "users", ["username"], name: "index_users_on_username", using: :btree - - create_table "users_projects", force: true do |t| - t.integer "user_id", null: false - t.integer "project_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "project_access", default: 0, null: false - end - - add_index "users_projects", ["project_access"], name: "index_users_projects_on_project_access", using: :btree - add_index "users_projects", ["project_id"], name: "index_users_projects_on_project_id", using: :btree - add_index "users_projects", ["user_id"], name: "index_users_projects_on_user_id", using: :btree - - create_table "web_hooks", force: true do |t| - t.string "url" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "type", default: "ProjectHook" - t.integer "service_id" - end - - create_table "wikis", force: true do |t| - t.string "title" - t.text "content" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "slug" - t.integer "user_id" - end - - add_index "wikis", ["project_id"], name: "index_wikis_on_project_id", using: :btree - add_index "wikis", ["slug"], name: "index_wikis_on_slug", using: :btree - - end - - def down - raise "Can not revert initial migration" - end -end diff --git a/db/migrate/20130102143055_rename_owner_to_creator_for_project.rb b/db/migrate/20130102143055_rename_owner_to_creator_for_project.rb deleted file mode 100644 index d0fca269871..00000000000 --- a/db/migrate/20130102143055_rename_owner_to_creator_for_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RenameOwnerToCreatorForProject < ActiveRecord::Migration - def change - rename_column :projects, :owner_id, :creator_id - end -end diff --git a/db/migrate/20130110172407_add_public_to_project.rb b/db/migrate/20130110172407_add_public_to_project.rb deleted file mode 100644 index 45edba48152..00000000000 --- a/db/migrate/20130110172407_add_public_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPublicToProject < ActiveRecord::Migration - def change - add_column :projects, :public, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20130123114545_add_issues_tracker_to_project.rb b/db/migrate/20130123114545_add_issues_tracker_to_project.rb deleted file mode 100644 index 288d0f07c9a..00000000000 --- a/db/migrate/20130123114545_add_issues_tracker_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddIssuesTrackerToProject < ActiveRecord::Migration - def change - add_column :projects, :issues_tracker, :string, default: :gitlab, null: false - end -end diff --git a/db/migrate/20130125090214_add_user_permissions.rb b/db/migrate/20130125090214_add_user_permissions.rb deleted file mode 100644 index 38b5f439a2d..00000000000 --- a/db/migrate/20130125090214_add_user_permissions.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddUserPermissions < ActiveRecord::Migration - def up - add_column :users, :can_create_group, :boolean, default: true, null: false - add_column :users, :can_create_team, :boolean, default: true, null: false - end - - def down - remove_column :users, :can_create_group - remove_column :users, :can_create_team - end -end diff --git a/db/migrate/20130131070232_remove_private_flag_from_project.rb b/db/migrate/20130131070232_remove_private_flag_from_project.rb deleted file mode 100644 index 5754db11558..00000000000 --- a/db/migrate/20130131070232_remove_private_flag_from_project.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemovePrivateFlagFromProject < ActiveRecord::Migration - def up - remove_column :projects, :private_flag - end - - def down - add_column :projects, :private_flag, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20130206084024_add_description_to_namsespace.rb b/db/migrate/20130206084024_add_description_to_namsespace.rb deleted file mode 100644 index ef02e489d03..00000000000 --- a/db/migrate/20130206084024_add_description_to_namsespace.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDescriptionToNamsespace < ActiveRecord::Migration - def change - add_column :namespaces, :description, :string, default: '', null: false - end -end diff --git a/db/migrate/20130207104426_add_description_to_teams.rb b/db/migrate/20130207104426_add_description_to_teams.rb deleted file mode 100644 index 6d03777901c..00000000000 --- a/db/migrate/20130207104426_add_description_to_teams.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDescriptionToTeams < ActiveRecord::Migration - def change - add_column :user_teams, :description, :string, default: '', null: false - end -end diff --git a/db/migrate/20130211085435_add_issues_tracker_id_to_project.rb b/db/migrate/20130211085435_add_issues_tracker_id_to_project.rb deleted file mode 100644 index 71763d18aee..00000000000 --- a/db/migrate/20130211085435_add_issues_tracker_id_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddIssuesTrackerIdToProject < ActiveRecord::Migration - def change - add_column :projects, :issues_tracker_id, :string - end -end diff --git a/db/migrate/20130214154045_rename_state_to_merge_status_in_milestone.rb b/db/migrate/20130214154045_rename_state_to_merge_status_in_milestone.rb deleted file mode 100644 index 23797fe1894..00000000000 --- a/db/migrate/20130214154045_rename_state_to_merge_status_in_milestone.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RenameStateToMergeStatusInMilestone < ActiveRecord::Migration - def change - rename_column :merge_requests, :state, :merge_status - end -end diff --git a/db/migrate/20130218140952_add_state_to_issue.rb b/db/migrate/20130218140952_add_state_to_issue.rb deleted file mode 100644 index 062103d0e33..00000000000 --- a/db/migrate/20130218140952_add_state_to_issue.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStateToIssue < ActiveRecord::Migration - def change - add_column :issues, :state, :string - end -end diff --git a/db/migrate/20130218141038_add_state_to_merge_request.rb b/db/migrate/20130218141038_add_state_to_merge_request.rb deleted file mode 100644 index ac4108ee311..00000000000 --- a/db/migrate/20130218141038_add_state_to_merge_request.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStateToMergeRequest < ActiveRecord::Migration - def change - add_column :merge_requests, :state, :string - end -end diff --git a/db/migrate/20130218141117_add_state_to_milestone.rb b/db/migrate/20130218141117_add_state_to_milestone.rb deleted file mode 100644 index c84039106bd..00000000000 --- a/db/migrate/20130218141117_add_state_to_milestone.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStateToMilestone < ActiveRecord::Migration - def change - add_column :milestones, :state, :string - end -end diff --git a/db/migrate/20130218141258_convert_closed_to_state_in_issue.rb b/db/migrate/20130218141258_convert_closed_to_state_in_issue.rb deleted file mode 100644 index 9fa96203ffd..00000000000 --- a/db/migrate/20130218141258_convert_closed_to_state_in_issue.rb +++ /dev/null @@ -1,14 +0,0 @@ -class ConvertClosedToStateInIssue < ActiveRecord::Migration - def up - Issue.transaction do - Issue.where(closed: true).update_all(state: :closed) - Issue.where(closed: false).update_all(state: :opened) - end - end - - def down - Issue.transaction do - Issue.where(state: :closed).update_all(closed: true) - end - end -end diff --git a/db/migrate/20130218141327_convert_closed_to_state_in_merge_request.rb b/db/migrate/20130218141327_convert_closed_to_state_in_merge_request.rb deleted file mode 100644 index ebb7ae585e6..00000000000 --- a/db/migrate/20130218141327_convert_closed_to_state_in_merge_request.rb +++ /dev/null @@ -1,16 +0,0 @@ -class ConvertClosedToStateInMergeRequest < ActiveRecord::Migration - def up - MergeRequest.transaction do - MergeRequest.where(closed: true, merged: true).update_all(state: :merged) - MergeRequest.where(closed: true, merged: false).update_all(state: :closed) - MergeRequest.where(closed: false).update_all(state: :opened) - end - end - - def down - MergeRequest.transaction do - MergeRequest.where(state: :closed).update_all(closed: true) - MergeRequest.where(state: :merged).update_all(closed: true, merged: true) - end - end -end diff --git a/db/migrate/20130218141344_convert_closed_to_state_in_milestone.rb b/db/migrate/20130218141344_convert_closed_to_state_in_milestone.rb deleted file mode 100644 index 1978ea89153..00000000000 --- a/db/migrate/20130218141344_convert_closed_to_state_in_milestone.rb +++ /dev/null @@ -1,14 +0,0 @@ -class ConvertClosedToStateInMilestone < ActiveRecord::Migration - def up - Milestone.transaction do - Milestone.where(closed: true).update_all(state: :closed) - Milestone.where(closed: false).update_all(state: :active) - end - end - - def down - Milestone.transaction do - Milestone.where(state: :closed).update_all(closed: true) - end - end -end diff --git a/db/migrate/20130218141444_remove_merged_from_merge_request.rb b/db/migrate/20130218141444_remove_merged_from_merge_request.rb deleted file mode 100644 index a7bd82f5000..00000000000 --- a/db/migrate/20130218141444_remove_merged_from_merge_request.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveMergedFromMergeRequest < ActiveRecord::Migration - def up - remove_column :merge_requests, :merged - end - - def down - add_column :merge_requests, :merged, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20130218141507_remove_closed_from_issue.rb b/db/migrate/20130218141507_remove_closed_from_issue.rb deleted file mode 100644 index 95cc064252b..00000000000 --- a/db/migrate/20130218141507_remove_closed_from_issue.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveClosedFromIssue < ActiveRecord::Migration - def up - remove_column :issues, :closed - end - - def down - add_column :issues, :closed, :boolean - end -end diff --git a/db/migrate/20130218141536_remove_closed_from_merge_request.rb b/db/migrate/20130218141536_remove_closed_from_merge_request.rb deleted file mode 100644 index 371835938b2..00000000000 --- a/db/migrate/20130218141536_remove_closed_from_merge_request.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveClosedFromMergeRequest < ActiveRecord::Migration - def up - remove_column :merge_requests, :closed - end - - def down - add_column :merge_requests, :closed, :boolean - end -end diff --git a/db/migrate/20130218141554_remove_closed_from_milestone.rb b/db/migrate/20130218141554_remove_closed_from_milestone.rb deleted file mode 100644 index e8dae4a19b1..00000000000 --- a/db/migrate/20130218141554_remove_closed_from_milestone.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveClosedFromMilestone < ActiveRecord::Migration - def up - remove_column :milestones, :closed - end - - def down - add_column :milestones, :closed, :boolean - end -end diff --git a/db/migrate/20130220124204_add_new_merge_status_to_merge_request.rb b/db/migrate/20130220124204_add_new_merge_status_to_merge_request.rb deleted file mode 100644 index d78bd0ae923..00000000000 --- a/db/migrate/20130220124204_add_new_merge_status_to_merge_request.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNewMergeStatusToMergeRequest < ActiveRecord::Migration - def change - add_column :merge_requests, :new_merge_status, :string - end -end diff --git a/db/migrate/20130220125544_convert_merge_status_in_merge_request.rb b/db/migrate/20130220125544_convert_merge_status_in_merge_request.rb deleted file mode 100644 index b310b35e373..00000000000 --- a/db/migrate/20130220125544_convert_merge_status_in_merge_request.rb +++ /dev/null @@ -1,17 +0,0 @@ -class ConvertMergeStatusInMergeRequest < ActiveRecord::Migration - def up - MergeRequest.transaction do - MergeRequest.where(merge_status: 1).update_all("new_merge_status = 'unchecked'") - MergeRequest.where(merge_status: 2).update_all("new_merge_status = 'can_be_merged'") - MergeRequest.where(merge_status: 3).update_all("new_merge_status = 'cannot_be_merged'") - end - end - - def down - MergeRequest.transaction do - MergeRequest.where(new_merge_status: :unchecked).update_all("merge_status = 1") - MergeRequest.where(new_merge_status: :can_be_merged).update_all("merge_status = 2") - MergeRequest.where(new_merge_status: :cannot_be_merged).update_all("merge_status = 3") - end - end -end diff --git a/db/migrate/20130220125545_remove_merge_status_from_merge_request.rb b/db/migrate/20130220125545_remove_merge_status_from_merge_request.rb deleted file mode 100644 index 9083183beb0..00000000000 --- a/db/migrate/20130220125545_remove_merge_status_from_merge_request.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveMergeStatusFromMergeRequest < ActiveRecord::Migration - def up - remove_column :merge_requests, :merge_status - end - - def down - add_column :merge_requests, :merge_status, :integer - end -end diff --git a/db/migrate/20130220133245_rename_new_merge_status_to_merge_status_in_milestone.rb b/db/migrate/20130220133245_rename_new_merge_status_to_merge_status_in_milestone.rb deleted file mode 100644 index 3f8f38dc979..00000000000 --- a/db/migrate/20130220133245_rename_new_merge_status_to_merge_status_in_milestone.rb +++ /dev/null @@ -1,5 +0,0 @@ -class RenameNewMergeStatusToMergeStatusInMilestone < ActiveRecord::Migration - def change - rename_column :merge_requests, :new_merge_status, :merge_status - end -end diff --git a/db/migrate/20130304104623_add_state_to_user.rb b/db/migrate/20130304104623_add_state_to_user.rb deleted file mode 100644 index 8154c21065f..00000000000 --- a/db/migrate/20130304104623_add_state_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStateToUser < ActiveRecord::Migration - def change - add_column :users, :state, :string - end -end diff --git a/db/migrate/20130304104740_convert_blocked_to_state.rb b/db/migrate/20130304104740_convert_blocked_to_state.rb deleted file mode 100644 index e8d5257ac96..00000000000 --- a/db/migrate/20130304104740_convert_blocked_to_state.rb +++ /dev/null @@ -1,14 +0,0 @@ -class ConvertBlockedToState < ActiveRecord::Migration - def up - User.transaction do - User.where(blocked: true).update_all(state: :blocked) - User.where(blocked: false).update_all(state: :active) - end - end - - def down - User.transaction do - User.where(state: :blocked).update_all(blocked: :true) - end - end -end diff --git a/db/migrate/20130304105317_remove_blocked_from_user.rb b/db/migrate/20130304105317_remove_blocked_from_user.rb deleted file mode 100644 index e010474538c..00000000000 --- a/db/migrate/20130304105317_remove_blocked_from_user.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveBlockedFromUser < ActiveRecord::Migration - def up - remove_column :users, :blocked - end - - def down - add_column :users, :blocked, :boolean - end -end diff --git a/db/migrate/20130315124931_user_color_scheme.rb b/db/migrate/20130315124931_user_color_scheme.rb deleted file mode 100644 index fe139e32ea7..00000000000 --- a/db/migrate/20130315124931_user_color_scheme.rb +++ /dev/null @@ -1,12 +0,0 @@ -class UserColorScheme < ActiveRecord::Migration - def up - add_column :users, :color_scheme_id, :integer, null: false, default: 1 - User.where(dark_scheme: true).update_all(color_scheme_id: 2) - remove_column :users, :dark_scheme - end - - def down - add_column :users, :dark_scheme, :boolean, null: false, default: false - remove_column :users, :color_scheme_id - end -end diff --git a/db/migrate/20130318212250_add_snippets_to_features.rb b/db/migrate/20130318212250_add_snippets_to_features.rb deleted file mode 100644 index ad0b4434c43..00000000000 --- a/db/migrate/20130318212250_add_snippets_to_features.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddSnippetsToFeatures < ActiveRecord::Migration - def change - add_column :projects, :snippets_enabled, :boolean, null: false, default: true - end -end diff --git a/db/migrate/20130319214458_create_forked_project_links.rb b/db/migrate/20130319214458_create_forked_project_links.rb deleted file mode 100644 index f91afc26e77..00000000000 --- a/db/migrate/20130319214458_create_forked_project_links.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateForkedProjectLinks < ActiveRecord::Migration - def change - create_table :forked_project_links do |t| - t.integer :forked_to_project_id, null: false - t.integer :forked_from_project_id, null: false - - t.timestamps - end - add_index :forked_project_links, :forked_to_project_id, unique: true - end -end diff --git a/db/migrate/20130323174317_add_private_to_snippets.rb b/db/migrate/20130323174317_add_private_to_snippets.rb deleted file mode 100644 index 92f3a5c7011..00000000000 --- a/db/migrate/20130323174317_add_private_to_snippets.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPrivateToSnippets < ActiveRecord::Migration - def change - add_column :snippets, :private, :boolean, null: false, default: true - end -end diff --git a/db/migrate/20130324151736_add_type_to_snippets.rb b/db/migrate/20130324151736_add_type_to_snippets.rb deleted file mode 100644 index 276aab2ca15..00000000000 --- a/db/migrate/20130324151736_add_type_to_snippets.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTypeToSnippets < ActiveRecord::Migration - def change - add_column :snippets, :type, :string - end -end diff --git a/db/migrate/20130324172327_change_project_id_to_null_in_snipepts.rb b/db/migrate/20130324172327_change_project_id_to_null_in_snipepts.rb deleted file mode 100644 index 4c992bac4d1..00000000000 --- a/db/migrate/20130324172327_change_project_id_to_null_in_snipepts.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ChangeProjectIdToNullInSnipepts < ActiveRecord::Migration - def up - change_column :snippets, :project_id, :integer, :null => true - end - - def down - change_column :snippets, :project_id, :integer, :null => false - end -end diff --git a/db/migrate/20130324203535_add_type_value_for_snippets.rb b/db/migrate/20130324203535_add_type_value_for_snippets.rb deleted file mode 100644 index 8c05dd2cc71..00000000000 --- a/db/migrate/20130324203535_add_type_value_for_snippets.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddTypeValueForSnippets < ActiveRecord::Migration - def up - Snippet.where("project_id IS NOT NULL").update_all(type: 'ProjectSnippet') - end - - def down - end -end diff --git a/db/migrate/20130325173941_add_notification_level_to_user.rb b/db/migrate/20130325173941_add_notification_level_to_user.rb deleted file mode 100644 index 9f466e38c13..00000000000 --- a/db/migrate/20130325173941_add_notification_level_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNotificationLevelToUser < ActiveRecord::Migration - def change - add_column :users, :notification_level, :integer, null: false, default: 1 - end -end diff --git a/db/migrate/20130326142630_add_index_to_users_authentication_token.rb b/db/migrate/20130326142630_add_index_to_users_authentication_token.rb deleted file mode 100644 index d42ef113738..00000000000 --- a/db/migrate/20130326142630_add_index_to_users_authentication_token.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddIndexToUsersAuthenticationToken < ActiveRecord::Migration - def change - add_index :users, :authentication_token, unique: true - end -end diff --git a/db/migrate/20130403003950_add_last_activity_column_into_project.rb b/db/migrate/20130403003950_add_last_activity_column_into_project.rb deleted file mode 100644 index 2a036bd9993..00000000000 --- a/db/migrate/20130403003950_add_last_activity_column_into_project.rb +++ /dev/null @@ -1,21 +0,0 @@ -class AddLastActivityColumnIntoProject < ActiveRecord::Migration - def up - add_column :projects, :last_activity_at, :datetime - add_index :projects, :last_activity_at - - Project.find_each do |project| - last_activity_date = if project.last_activity - project.last_activity.created_at - else - project.updated_at - end - - project.update_attribute(:last_activity_at, last_activity_date) - end - end - - def down - remove_index :projects, :last_activity_at - remove_column :projects, :last_activity_at - end -end diff --git a/db/migrate/20130404164628_add_notification_level_to_user_project.rb b/db/migrate/20130404164628_add_notification_level_to_user_project.rb deleted file mode 100644 index 27de5d6bf55..00000000000 --- a/db/migrate/20130404164628_add_notification_level_to_user_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNotificationLevelToUserProject < ActiveRecord::Migration - def change - add_column :users_projects, :notification_level, :integer, null: false, default: 3 - end -end diff --git a/db/migrate/20130410175022_remove_wiki_table.rb b/db/migrate/20130410175022_remove_wiki_table.rb deleted file mode 100644 index 9077aa2473c..00000000000 --- a/db/migrate/20130410175022_remove_wiki_table.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveWikiTable < ActiveRecord::Migration - def up - drop_table :wikis - end - - def down - raise ActiveRecord::IrreversibleMigration - end -end diff --git a/db/migrate/20130419190306_allow_merges_for_forks.rb b/db/migrate/20130419190306_allow_merges_for_forks.rb deleted file mode 100644 index 56ce58a846d..00000000000 --- a/db/migrate/20130419190306_allow_merges_for_forks.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AllowMergesForForks < ActiveRecord::Migration - def self.up - add_column :merge_requests, :target_project_id, :integer, :null => true - MergeRequest.update_all("target_project_id = project_id") - change_column :merge_requests, :target_project_id, :integer, :null => false - rename_column :merge_requests, :project_id, :source_project_id - end - - def self.down - remove_column :merge_requests, :target_project_id - rename_column :merge_requests, :source_project_id,:project_id - end -end diff --git a/db/migrate/20130506085413_add_type_to_key.rb b/db/migrate/20130506085413_add_type_to_key.rb deleted file mode 100644 index 315e7ca77b3..00000000000 --- a/db/migrate/20130506085413_add_type_to_key.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTypeToKey < ActiveRecord::Migration - def change - add_column :keys, :type, :string - end -end diff --git a/db/migrate/20130506090604_create_deploy_keys_projects.rb b/db/migrate/20130506090604_create_deploy_keys_projects.rb deleted file mode 100644 index 0dc8cdeb07d..00000000000 --- a/db/migrate/20130506090604_create_deploy_keys_projects.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreateDeployKeysProjects < ActiveRecord::Migration - def change - create_table :deploy_keys_projects do |t| - t.integer :deploy_key_id, null: false - t.integer :project_id, null: false - - t.timestamps - end - end -end diff --git a/db/migrate/20130506095501_remove_project_id_from_key.rb b/db/migrate/20130506095501_remove_project_id_from_key.rb deleted file mode 100644 index 6b794cfb5c1..00000000000 --- a/db/migrate/20130506095501_remove_project_id_from_key.rb +++ /dev/null @@ -1,22 +0,0 @@ -class RemoveProjectIdFromKey < ActiveRecord::Migration - def up - puts 'Migrate deploy keys: ' - Key.where('project_id IS NOT NULL').update_all(type: 'DeployKey') - - DeployKey.all.each do |key| - project = Project.find_by(id: key.project_id) - if project - project.deploy_keys << key - print '.' - end - end - - puts 'Done' - - remove_column :keys, :project_id - end - - def down - add_column :keys, :project_id, :integer - end -end diff --git a/db/migrate/20130522141856_add_more_fields_to_service.rb b/db/migrate/20130522141856_add_more_fields_to_service.rb deleted file mode 100644 index 298e902df2f..00000000000 --- a/db/migrate/20130522141856_add_more_fields_to_service.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddMoreFieldsToService < ActiveRecord::Migration - def change - add_column :services, :subdomain, :string - add_column :services, :room, :string - end -end diff --git a/db/migrate/20130528184641_add_system_to_notes.rb b/db/migrate/20130528184641_add_system_to_notes.rb deleted file mode 100644 index 1b22a4934f9..00000000000 --- a/db/migrate/20130528184641_add_system_to_notes.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddSystemToNotes < ActiveRecord::Migration - class Note < ActiveRecord::Base - end - - def up - add_column :notes, :system, :boolean, default: false, null: false - - Note.reset_column_information - Note.update_all(system: false) - Note.where("note like '_status changed to%'").update_all(system: true) - end - - def down - remove_column :notes, :system - end -end diff --git a/db/migrate/20130611210815_increase_snippet_text_column_size.rb b/db/migrate/20130611210815_increase_snippet_text_column_size.rb deleted file mode 100644 index f7b4447e43e..00000000000 --- a/db/migrate/20130611210815_increase_snippet_text_column_size.rb +++ /dev/null @@ -1,9 +0,0 @@ -class IncreaseSnippetTextColumnSize < ActiveRecord::Migration - def up - # MYSQL LARGETEXT for snippet - change_column :snippets, :content, :text, :limit => 4294967295 - end - - def down - end -end diff --git a/db/migrate/20130613165816_add_password_expires_at_to_users.rb b/db/migrate/20130613165816_add_password_expires_at_to_users.rb deleted file mode 100644 index 3479c8e64d0..00000000000 --- a/db/migrate/20130613165816_add_password_expires_at_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPasswordExpiresAtToUsers < ActiveRecord::Migration - def change - add_column :users, :password_expires_at, :datetime - end -end diff --git a/db/migrate/20130613173246_add_created_by_id_to_user.rb b/db/migrate/20130613173246_add_created_by_id_to_user.rb deleted file mode 100644 index 615e96eb156..00000000000 --- a/db/migrate/20130613173246_add_created_by_id_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddCreatedByIdToUser < ActiveRecord::Migration - def change - add_column :users, :created_by_id, :integer - end -end diff --git a/db/migrate/20130614132337_add_improted_to_project.rb b/db/migrate/20130614132337_add_improted_to_project.rb deleted file mode 100644 index cc882c3f10a..00000000000 --- a/db/migrate/20130614132337_add_improted_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImprotedToProject < ActiveRecord::Migration - def change - add_column :projects, :imported, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20130617095603_create_users_groups.rb b/db/migrate/20130617095603_create_users_groups.rb deleted file mode 100644 index 2efc04f1151..00000000000 --- a/db/migrate/20130617095603_create_users_groups.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateUsersGroups < ActiveRecord::Migration - def change - create_table :users_groups do |t| - t.integer :group_access, null: false - t.integer :group_id, null: false - t.integer :user_id, null: false - - t.timestamps - end - end -end diff --git a/db/migrate/20130621195223_add_notification_level_to_user_group.rb b/db/migrate/20130621195223_add_notification_level_to_user_group.rb deleted file mode 100644 index 8c2e3dfcaca..00000000000 --- a/db/migrate/20130621195223_add_notification_level_to_user_group.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNotificationLevelToUserGroup < ActiveRecord::Migration - def change - add_column :users_groups, :notification_level, :integer, null: false, default: 3 - end -end diff --git a/db/migrate/20130622115340_add_more_db_index.rb b/db/migrate/20130622115340_add_more_db_index.rb deleted file mode 100644 index 9570a7a3f1e..00000000000 --- a/db/migrate/20130622115340_add_more_db_index.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddMoreDbIndex < ActiveRecord::Migration - def change - add_index :deploy_keys_projects, :project_id - add_index :web_hooks, :project_id - add_index :protected_branches, :project_id - - add_index :users_groups, :user_id - add_index :snippets, :author_id - add_index :notes, :author_id - add_index :notes, [:noteable_id, :noteable_type] - end -end diff --git a/db/migrate/20130624162710_add_fingerprint_to_key.rb b/db/migrate/20130624162710_add_fingerprint_to_key.rb deleted file mode 100644 index 544a8366727..00000000000 --- a/db/migrate/20130624162710_add_fingerprint_to_key.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddFingerprintToKey < ActiveRecord::Migration - def change - add_column :keys, :fingerprint, :string - remove_column :keys, :identifier - end -end diff --git a/db/migrate/20130804151314_add_st_diff_to_note.rb b/db/migrate/20130804151314_add_st_diff_to_note.rb deleted file mode 100644 index 3f9abb975c3..00000000000 --- a/db/migrate/20130804151314_add_st_diff_to_note.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddStDiffToNote < ActiveRecord::Migration - def change - add_column :notes, :st_diff, :text, :null => true - end -end diff --git a/db/migrate/20130809124851_add_permission_check_to_user.rb b/db/migrate/20130809124851_add_permission_check_to_user.rb deleted file mode 100644 index c26157904c7..00000000000 --- a/db/migrate/20130809124851_add_permission_check_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPermissionCheckToUser < ActiveRecord::Migration - def change - add_column :users, :last_credential_check_at, :datetime - end -end diff --git a/db/migrate/20130812143708_add_import_url_to_project.rb b/db/migrate/20130812143708_add_import_url_to_project.rb deleted file mode 100644 index 023a48741b2..00000000000 --- a/db/migrate/20130812143708_add_import_url_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImportUrlToProject < ActiveRecord::Migration - def change - add_column :projects, :import_url, :string - end -end diff --git a/db/migrate/20130819182730_add_internal_ids_to_issues_and_mr.rb b/db/migrate/20130819182730_add_internal_ids_to_issues_and_mr.rb deleted file mode 100644 index e55ae38f144..00000000000 --- a/db/migrate/20130819182730_add_internal_ids_to_issues_and_mr.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddInternalIdsToIssuesAndMr < ActiveRecord::Migration - def change - add_column :issues, :iid, :integer - add_column :merge_requests, :iid, :integer - end -end diff --git a/db/migrate/20130821090530_remove_deprecated_tables.rb b/db/migrate/20130821090530_remove_deprecated_tables.rb deleted file mode 100644 index 539c0617eeb..00000000000 --- a/db/migrate/20130821090530_remove_deprecated_tables.rb +++ /dev/null @@ -1,11 +0,0 @@ -class RemoveDeprecatedTables < ActiveRecord::Migration - def up - drop_table :user_teams - drop_table :user_team_project_relationships - drop_table :user_team_user_relationships - end - - def down - raise 'No rollback for this migration' - end -end diff --git a/db/migrate/20130821090531_add_internal_ids_to_milestones.rb b/db/migrate/20130821090531_add_internal_ids_to_milestones.rb deleted file mode 100644 index 33e5bae5805..00000000000 --- a/db/migrate/20130821090531_add_internal_ids_to_milestones.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddInternalIdsToMilestones < ActiveRecord::Migration - def change - add_column :milestones, :iid, :integer - end -end diff --git a/db/migrate/20130909132950_add_description_to_merge_request.rb b/db/migrate/20130909132950_add_description_to_merge_request.rb deleted file mode 100644 index 9bcd0c7ee06..00000000000 --- a/db/migrate/20130909132950_add_description_to_merge_request.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddDescriptionToMergeRequest < ActiveRecord::Migration - def change - add_column :merge_requests, :description, :text, null: true - end -end diff --git a/db/migrate/20130926081215_change_owner_id_for_group.rb b/db/migrate/20130926081215_change_owner_id_for_group.rb deleted file mode 100644 index 8f1992c37ab..00000000000 --- a/db/migrate/20130926081215_change_owner_id_for_group.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ChangeOwnerIdForGroup < ActiveRecord::Migration - def up - change_column :namespaces, :owner_id, :integer, null: true - end - - def down - change_column :namespaces, :owner_id, :integer, null: false - end -end diff --git a/db/migrate/20131005191208_add_avatar_to_users.rb b/db/migrate/20131005191208_add_avatar_to_users.rb deleted file mode 100644 index 7b4de37ad72..00000000000 --- a/db/migrate/20131005191208_add_avatar_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddAvatarToUsers < ActiveRecord::Migration - def change - add_column :users, :avatar, :string - end -end diff --git a/db/migrate/20131009115346_add_confirmable_to_users.rb b/db/migrate/20131009115346_add_confirmable_to_users.rb deleted file mode 100644 index 249cbe704ed..00000000000 --- a/db/migrate/20131009115346_add_confirmable_to_users.rb +++ /dev/null @@ -1,15 +0,0 @@ -class AddConfirmableToUsers < ActiveRecord::Migration - def self.up - add_column :users, :confirmation_token, :string - add_column :users, :confirmed_at, :datetime - add_column :users, :confirmation_sent_at, :datetime - add_column :users, :unconfirmed_email, :string - add_index :users, :confirmation_token, unique: true - User.update_all(confirmed_at: Time.now) - end - - def self.down - remove_column :users, :confirmation_token, :confirmed_at, :confirmation_sent_at - remove_column :users, :unconfirmed_email - end -end diff --git a/db/migrate/20131106151520_remove_default_branch.rb b/db/migrate/20131106151520_remove_default_branch.rb deleted file mode 100644 index 88a890eb3eb..00000000000 --- a/db/migrate/20131106151520_remove_default_branch.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RemoveDefaultBranch < ActiveRecord::Migration - def up - remove_column :projects, :default_branch - end - - def down - add_column :projects, :default_branch, :string - end -end diff --git a/db/migrate/20131112114325_create_broadcast_messages.rb b/db/migrate/20131112114325_create_broadcast_messages.rb deleted file mode 100644 index 147178e9dcf..00000000000 --- a/db/migrate/20131112114325_create_broadcast_messages.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateBroadcastMessages < ActiveRecord::Migration - def change - create_table :broadcast_messages do |t| - t.text :message, null: false - t.datetime :starts_at - t.datetime :ends_at - t.integer :alert_type - - t.timestamps - end - end -end diff --git a/db/migrate/20131112220935_add_visibility_level_to_projects.rb b/db/migrate/20131112220935_add_visibility_level_to_projects.rb deleted file mode 100644 index cf1e9f912a0..00000000000 --- a/db/migrate/20131112220935_add_visibility_level_to_projects.rb +++ /dev/null @@ -1,13 +0,0 @@ -class AddVisibilityLevelToProjects < ActiveRecord::Migration - def self.up - add_column :projects, :visibility_level, :integer, :default => 0, :null => false - Project.where(public: true).update_all(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - remove_column :projects, :public - end - - def self.down - add_column :projects, :public, :boolean, :default => false, :null => false - Project.where(visibility_level: Gitlab::VisibilityLevel::PUBLIC).update_all(public: true) - remove_column :projects, :visibility_level - end -end diff --git a/db/migrate/20131129154016_add_archived_to_projects.rb b/db/migrate/20131129154016_add_archived_to_projects.rb deleted file mode 100644 index 917e690ba47..00000000000 --- a/db/migrate/20131129154016_add_archived_to_projects.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddArchivedToProjects < ActiveRecord::Migration - def change - add_column :projects, :archived, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20131130165425_add_color_and_font_to_broadcast_messages.rb b/db/migrate/20131130165425_add_color_and_font_to_broadcast_messages.rb deleted file mode 100644 index 473f355eceb..00000000000 --- a/db/migrate/20131130165425_add_color_and_font_to_broadcast_messages.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddColorAndFontToBroadcastMessages < ActiveRecord::Migration - def change - add_column :broadcast_messages, :color, :string - add_column :broadcast_messages, :font, :string - end -end diff --git a/db/migrate/20131202192556_add_event_fields_for_web_hook.rb b/db/migrate/20131202192556_add_event_fields_for_web_hook.rb deleted file mode 100644 index d29e996852e..00000000000 --- a/db/migrate/20131202192556_add_event_fields_for_web_hook.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddEventFieldsForWebHook < ActiveRecord::Migration - def change - add_column :web_hooks, :push_events, :boolean, default: true, null: false - add_column :web_hooks, :issues_events, :boolean, default: false, null: false - add_column :web_hooks, :merge_requests_events, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20131214224427_add_hide_no_ssh_key_to_users.rb b/db/migrate/20131214224427_add_hide_no_ssh_key_to_users.rb deleted file mode 100644 index 7cec79e7ee8..00000000000 --- a/db/migrate/20131214224427_add_hide_no_ssh_key_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHideNoSshKeyToUsers < ActiveRecord::Migration - def change - add_column :users, :hide_no_ssh_key, :boolean, :default => false - end -end diff --git a/db/migrate/20131217102743_add_recipients_to_service.rb b/db/migrate/20131217102743_add_recipients_to_service.rb deleted file mode 100644 index 9695c251352..00000000000 --- a/db/migrate/20131217102743_add_recipients_to_service.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRecipientsToService < ActiveRecord::Migration - def change - add_column :services, :recipients, :text - end -end diff --git a/db/migrate/20140116231608_add_website_url_to_users.rb b/db/migrate/20140116231608_add_website_url_to_users.rb deleted file mode 100644 index 0996fdcad73..00000000000 --- a/db/migrate/20140116231608_add_website_url_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddWebsiteUrlToUsers < ActiveRecord::Migration - def change - add_column :users, :website_url, :string, {:null => false, :default => ''} - end -end diff --git a/db/migrate/20140122112253_create_merge_request_diffs.rb b/db/migrate/20140122112253_create_merge_request_diffs.rb deleted file mode 100644 index ef592305a23..00000000000 --- a/db/migrate/20140122112253_create_merge_request_diffs.rb +++ /dev/null @@ -1,12 +0,0 @@ -class CreateMergeRequestDiffs < ActiveRecord::Migration - def change - create_table :merge_request_diffs do |t| - t.string :state, null: false, default: 'collected' - t.text :st_commits, null: true, limit: 2147483647 - t.text :st_diffs, null: true, limit: 2147483647 - t.integer :merge_request_id, null: false - - t.timestamps - end - end -end diff --git a/db/migrate/20140122114406_migrate_mr_diffs.rb b/db/migrate/20140122114406_migrate_mr_diffs.rb deleted file mode 100644 index 1595e2b6472..00000000000 --- a/db/migrate/20140122114406_migrate_mr_diffs.rb +++ /dev/null @@ -1,9 +0,0 @@ -class MigrateMrDiffs < ActiveRecord::Migration - def self.up - execute "INSERT INTO merge_request_diffs ( merge_request_id, st_commits, st_diffs ) SELECT id, st_commits, st_diffs FROM merge_requests" - end - - def self.down - MergeRequestDiff.delete_all - end -end diff --git a/db/migrate/20140122122549_remove_m_rdiff_fields.rb b/db/migrate/20140122122549_remove_m_rdiff_fields.rb deleted file mode 100644 index 8f863d85a68..00000000000 --- a/db/migrate/20140122122549_remove_m_rdiff_fields.rb +++ /dev/null @@ -1,21 +0,0 @@ -class RemoveMRdiffFields < ActiveRecord::Migration - def up - remove_column :merge_requests, :st_commits - remove_column :merge_requests, :st_diffs - end - - def down - add_column :merge_requests, :st_commits, :text, null: true, limit: 2147483647 - add_column :merge_requests, :st_diffs, :text, null: true, limit: 2147483647 - - if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL' - execute "UPDATE merge_requests mr - SET (st_commits, st_diffs) = (md.st_commits, md.st_diffs) - FROM merge_request_diffs md - WHERE md.merge_request_id = mr.id" - else - execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_commits = md.st_commits WHERE md.merge_request_id = mr.id" - execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_diffs = md.st_diffs WHERE md.merge_request_id = mr.id" - end - end -end diff --git a/db/migrate/20140125162722_add_avatar_to_projects.rb b/db/migrate/20140125162722_add_avatar_to_projects.rb deleted file mode 100644 index 9523ac722f2..00000000000 --- a/db/migrate/20140125162722_add_avatar_to_projects.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddAvatarToProjects < ActiveRecord::Migration - def change - add_column :projects, :avatar, :string - end -end diff --git a/db/migrate/20140127170938_add_group_avatars.rb b/db/migrate/20140127170938_add_group_avatars.rb deleted file mode 100644 index 2911096dd5d..00000000000 --- a/db/migrate/20140127170938_add_group_avatars.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddGroupAvatars < ActiveRecord::Migration - def change - add_column :namespaces, :avatar, :string - end -end diff --git a/db/migrate/20140209025651_create_emails.rb b/db/migrate/20140209025651_create_emails.rb deleted file mode 100644 index cb78c4af11b..00000000000 --- a/db/migrate/20140209025651_create_emails.rb +++ /dev/null @@ -1,13 +0,0 @@ -class CreateEmails < ActiveRecord::Migration - def change - create_table :emails do |t| - t.integer :user_id, null: false - t.string :email, null: false - - t.timestamps - end - - add_index :emails, :user_id - add_index :emails, :email, unique: true - end -end diff --git a/db/migrate/20140214102325_add_api_key_to_services.rb b/db/migrate/20140214102325_add_api_key_to_services.rb deleted file mode 100644 index 30eeca2c1f6..00000000000 --- a/db/migrate/20140214102325_add_api_key_to_services.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddApiKeyToServices < ActiveRecord::Migration - def change - add_column :services, :api_key, :string - end -end diff --git a/db/migrate/20140304005354_add_index_merge_request_diffs_on_merge_request_id.rb b/db/migrate/20140304005354_add_index_merge_request_diffs_on_merge_request_id.rb deleted file mode 100644 index 65d28e8cb01..00000000000 --- a/db/migrate/20140304005354_add_index_merge_request_diffs_on_merge_request_id.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddIndexMergeRequestDiffsOnMergeRequestId < ActiveRecord::Migration - def change - add_index :merge_request_diffs, :merge_request_id, unique: true - end -end diff --git a/db/migrate/20140305193308_add_tag_push_hooks_to_project_hook.rb b/db/migrate/20140305193308_add_tag_push_hooks_to_project_hook.rb deleted file mode 100644 index 7017148702a..00000000000 --- a/db/migrate/20140305193308_add_tag_push_hooks_to_project_hook.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTagPushHooksToProjectHook < ActiveRecord::Migration - def change - add_column :web_hooks, :tag_push_events, :boolean, default: false - end -end diff --git a/db/migrate/20140312145357_add_import_status_to_project.rb b/db/migrate/20140312145357_add_import_status_to_project.rb deleted file mode 100644 index ef972e8342a..00000000000 --- a/db/migrate/20140312145357_add_import_status_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImportStatusToProject < ActiveRecord::Migration - def change - add_column :projects, :import_status, :string - end -end diff --git a/db/migrate/20140313092127_migrate_already_imported_projects.rb b/db/migrate/20140313092127_migrate_already_imported_projects.rb deleted file mode 100644 index f4392c0f05e..00000000000 --- a/db/migrate/20140313092127_migrate_already_imported_projects.rb +++ /dev/null @@ -1,12 +0,0 @@ -class MigrateAlreadyImportedProjects < ActiveRecord::Migration - def up - Project.where(imported: true).update_all(import_status: "finished") - Project.where(imported: false).update_all(import_status: "none") - remove_column :projects, :imported - end - - def down - add_column :projects, :imported, :boolean, default: false - Project.where(import_status: 'finished').update_all(imported: true) - end -end diff --git a/db/migrate/20140407135544_fix_namespaces.rb b/db/migrate/20140407135544_fix_namespaces.rb deleted file mode 100644 index 59665d538f0..00000000000 --- a/db/migrate/20140407135544_fix_namespaces.rb +++ /dev/null @@ -1,10 +0,0 @@ -class FixNamespaces < ActiveRecord::Migration - def up - Namespace.where('name <> path and type is null').each do |namespace| - namespace.update_attribute(:name, namespace.path) - end - end - - def down - end -end diff --git a/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb b/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb deleted file mode 100644 index 1f6d85d5f66..00000000000 --- a/db/migrate/20140414131055_change_state_to_allow_empty_merge_request_diffs.rb +++ /dev/null @@ -1,11 +0,0 @@ -class ChangeStateToAllowEmptyMergeRequestDiffs < ActiveRecord::Migration - def up - change_column :merge_request_diffs, :state, :string, null: true, - default: nil - end - - def down - change_column :merge_request_diffs, :state, :string, null: false, - default: 'collected' - end -end diff --git a/db/migrate/20140415124820_limits_to_mysql.rb b/db/migrate/20140415124820_limits_to_mysql.rb deleted file mode 100644 index 3f6e62617c5..00000000000 --- a/db/migrate/20140415124820_limits_to_mysql.rb +++ /dev/null @@ -1 +0,0 @@ -require_relative 'limits_to_mysql' diff --git a/db/migrate/20140416074002_add_index_on_iid.rb b/db/migrate/20140416074002_add_index_on_iid.rb deleted file mode 100644 index 85269e2a03b..00000000000 --- a/db/migrate/20140416074002_add_index_on_iid.rb +++ /dev/null @@ -1,32 +0,0 @@ -class AddIndexOnIid < ActiveRecord::Migration - def change - RemoveDuplicateIid.clean(Issue) - RemoveDuplicateIid.clean(MergeRequest, 'target_project_id') - RemoveDuplicateIid.clean(Milestone) - - add_index :issues, [:project_id, :iid], unique: true - add_index :merge_requests, [:target_project_id, :iid], unique: true - add_index :milestones, [:project_id, :iid], unique: true - end -end - -class RemoveDuplicateIid - def self.clean(klass, project_field = 'project_id') - duplicates = klass.find_by_sql("SELECT iid, #{project_field} FROM #{klass.table_name} GROUP BY #{project_field}, iid HAVING COUNT(*) > 1") - - duplicates.each do |duplicate| - project_id = duplicate.send(project_field) - iid = duplicate.iid - items = klass.of_projects(project_id).where(iid: iid) - - if items.size > 1 - puts "Remove #{klass.name} duplicates for iid: #{iid} and project_id: #{project_id}" - items.shift - items.each do |item| - item.destroy - puts '.' - end - end - end - end -end diff --git a/db/migrate/20140416185734_index_on_current_sign_in_at.rb b/db/migrate/20140416185734_index_on_current_sign_in_at.rb deleted file mode 100644 index 0bf80ce154a..00000000000 --- a/db/migrate/20140416185734_index_on_current_sign_in_at.rb +++ /dev/null @@ -1,5 +0,0 @@ -class IndexOnCurrentSignInAt < ActiveRecord::Migration - def change - add_index :users, :current_sign_in_at - end -end diff --git a/db/migrate/20140428105831_add_notes_index_updated_at.rb b/db/migrate/20140428105831_add_notes_index_updated_at.rb deleted file mode 100644 index 6c25570f128..00000000000 --- a/db/migrate/20140428105831_add_notes_index_updated_at.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNotesIndexUpdatedAt < ActiveRecord::Migration - def change - add_index :notes, :updated_at - end -end diff --git a/db/migrate/20140502115131_add_repo_size_to_db.rb b/db/migrate/20140502115131_add_repo_size_to_db.rb deleted file mode 100644 index 7361d1a9440..00000000000 --- a/db/migrate/20140502115131_add_repo_size_to_db.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRepoSizeToDb < ActiveRecord::Migration - def change - add_column :projects, :repository_size, :float, default: 0 - end -end diff --git a/db/migrate/20140502125220_migrate_repo_size.rb b/db/migrate/20140502125220_migrate_repo_size.rb deleted file mode 100644 index eed6d366814..00000000000 --- a/db/migrate/20140502125220_migrate_repo_size.rb +++ /dev/null @@ -1,21 +0,0 @@ -class MigrateRepoSize < ActiveRecord::Migration - def up - Project.reset_column_information - Project.find_each(batch_size: 500) do |project| - begin - if project.empty_repo? - print '-' - else - project.update_repository_size - print '.' - end - rescue - print 'F' - end - end - puts 'Done' - end - - def down - end -end diff --git a/db/migrate/20140611135229_add_position_to_merge_request.rb b/db/migrate/20140611135229_add_position_to_merge_request.rb deleted file mode 100644 index d5fdecd0c39..00000000000 --- a/db/migrate/20140611135229_add_position_to_merge_request.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPositionToMergeRequest < ActiveRecord::Migration - def change - add_column :merge_requests, :position, :integer, default: 0 - end -end diff --git a/db/migrate/20140625115202_create_users_star_projects.rb b/db/migrate/20140625115202_create_users_star_projects.rb deleted file mode 100644 index 412f0f6f34b..00000000000 --- a/db/migrate/20140625115202_create_users_star_projects.rb +++ /dev/null @@ -1,15 +0,0 @@ -class CreateUsersStarProjects < ActiveRecord::Migration - def change - create_table :users_star_projects do |t| - t.integer :project_id, null: false - t.integer :user_id, null: false - t.timestamps - end - add_index :users_star_projects, :user_id - add_index :users_star_projects, :project_id - add_index :users_star_projects, [:user_id, :project_id], unique: true - - add_column :projects, :star_count, :integer, default: 0, null: false - add_index :projects, :star_count, using: :btree - end -end diff --git a/db/migrate/20140729134820_create_labels.rb b/db/migrate/20140729134820_create_labels.rb deleted file mode 100644 index 3a4b6a152dc..00000000000 --- a/db/migrate/20140729134820_create_labels.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateLabels < ActiveRecord::Migration - def change - create_table :labels do |t| - t.string :title - t.string :color - t.integer :project_id - - t.timestamps - end - end -end diff --git a/db/migrate/20140729140420_create_label_links.rb b/db/migrate/20140729140420_create_label_links.rb deleted file mode 100644 index 2bfc4ae2094..00000000000 --- a/db/migrate/20140729140420_create_label_links.rb +++ /dev/null @@ -1,11 +0,0 @@ -class CreateLabelLinks < ActiveRecord::Migration - def change - create_table :label_links do |t| - t.integer :label_id - t.integer :target_id - t.string :target_type - - t.timestamps - end - end -end diff --git a/db/migrate/20140729145339_migrate_project_tags.rb b/db/migrate/20140729145339_migrate_project_tags.rb deleted file mode 100644 index 5760e4bfeaa..00000000000 --- a/db/migrate/20140729145339_migrate_project_tags.rb +++ /dev/null @@ -1,9 +0,0 @@ -class MigrateProjectTags < ActiveRecord::Migration - def up - ActsAsTaggableOn::Tagging.where(taggable_type: 'Project', context: 'labels').update_all(context: 'tags') - end - - def down - ActsAsTaggableOn::Tagging.where(taggable_type: 'Project', context: 'tags').update_all(context: 'labels') - end -end diff --git a/db/migrate/20140729152420_migrate_taggable_labels.rb b/db/migrate/20140729152420_migrate_taggable_labels.rb deleted file mode 100644 index dc28d727d9a..00000000000 --- a/db/migrate/20140729152420_migrate_taggable_labels.rb +++ /dev/null @@ -1,35 +0,0 @@ -class MigrateTaggableLabels < ActiveRecord::Migration - def up - taggings = ActsAsTaggableOn::Tagging.where(taggable_type: ['Issue', 'MergeRequest'], context: 'labels') - taggings.find_each(batch_size: 500) do |tagging| - # Clean up orphaned taggings while we are here - if tagging.taggable.blank? || tagging.tag.nil? - tagging.destroy - print 'D' - next - end - create_label_from_tagging(tagging) - end - end - - def down - Label.destroy_all - LabelLink.destroy_all - end - - private - - def create_label_from_tagging(tagging) - target = tagging.taggable - label_name = tagging.tag.name - # '?', '&' and ',' are no longer allowed in label names so we remove them - label_name.tr!('?&,', '') - label = target.project.labels.find_or_create_by(title: label_name, color: Label::DEFAULT_COLOR) - - if label.valid? && LabelLink.create(label: label, target: target) - print '.' - else - print 'F' - end - end -end diff --git a/db/migrate/20140730111702_add_index_to_labels.rb b/db/migrate/20140730111702_add_index_to_labels.rb deleted file mode 100644 index 494241c873c..00000000000 --- a/db/migrate/20140730111702_add_index_to_labels.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddIndexToLabels < ActiveRecord::Migration - def change - add_index "labels", :project_id - add_index "label_links", :label_id - add_index "label_links", [:target_id, :target_type] - end -end diff --git a/db/migrate/20140903115954_migrate_to_new_shell.rb b/db/migrate/20140903115954_migrate_to_new_shell.rb deleted file mode 100644 index 2d832109513..00000000000 --- a/db/migrate/20140903115954_migrate_to_new_shell.rb +++ /dev/null @@ -1,10 +0,0 @@ -class MigrateToNewShell < ActiveRecord::Migration - def change - gitlab_shell_path = Gitlab.config.gitlab_shell.path - if system("#{gitlab_shell_path}/bin/create-hooks") - puts 'Repositories updated with new hooks' - else - raise 'Failed to rewrite gitlab-shell hooks in repositories' - end - end -end diff --git a/db/migrate/20140907220153_serialize_service_properties.rb b/db/migrate/20140907220153_serialize_service_properties.rb deleted file mode 100644 index d45a10465be..00000000000 --- a/db/migrate/20140907220153_serialize_service_properties.rb +++ /dev/null @@ -1,42 +0,0 @@ -class SerializeServiceProperties < ActiveRecord::Migration - def change - unless column_exists?(:services, :properties) - add_column :services, :properties, :text - end - - Service.reset_column_information - - associations = - { - AssemblaService: [:token, :subdomain], - CampfireService: [:token, :subdomain, :room], - EmailsOnPushService: [:recipients], - FlowdockService: [:token], - GemnasiumService: [:api_key, :token], - GitlabCiService: [:token, :project_url], - HipchatService: [:token, :room], - PivotaltrackerService: [:token], - SlackService: [:subdomain, :token, :room], - JenkinsService: [:project_url], - JiraService: [:project_url, :username, :password, - :api_version, :jira_issue_transition_id], - } - - Service.find_each(batch_size: 500).each do |service| - associations[service.type.to_sym].each do |attribute| - service.send("#{attribute}=", service.attributes[attribute.to_s]) - end - - service.save(validate: false) - end - - if column_exists?(:services, :project_url) - remove_column :services, :project_url, :string - remove_column :services, :subdomain, :string - remove_column :services, :room, :string - remove_column :services, :recipients, :text - remove_column :services, :api_key, :string - remove_column :services, :token, :string - end - end -end diff --git a/db/migrate/20140914113604_add_members_table.rb b/db/migrate/20140914113604_add_members_table.rb deleted file mode 100644 index d311f3033ee..00000000000 --- a/db/migrate/20140914113604_add_members_table.rb +++ /dev/null @@ -1,19 +0,0 @@ -class AddMembersTable < ActiveRecord::Migration - def change - create_table :members do |t| - t.integer :access_level, null: false - t.integer :source_id, null: false - t.string :source_type, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false - t.string :type - - t.timestamps - end - - add_index :members, :type - add_index :members, :user_id - add_index :members, :access_level - add_index :members, [:source_id, :source_type] - end -end diff --git a/db/migrate/20140914145549_migrate_to_new_members_model.rb b/db/migrate/20140914145549_migrate_to_new_members_model.rb deleted file mode 100644 index 2a5a49c724a..00000000000 --- a/db/migrate/20140914145549_migrate_to_new_members_model.rb +++ /dev/null @@ -1,11 +0,0 @@ -class MigrateToNewMembersModel < ActiveRecord::Migration - def up - execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, group_id, 'Namespace', group_access, notification_level, 'GroupMember' FROM users_groups" - execute "INSERT INTO members ( user_id, source_id, source_type, access_level, notification_level, type ) SELECT user_id, project_id, 'Project', project_access, notification_level, 'ProjectMember' FROM users_projects" - end - - def down - Member.delete_all - end -end - diff --git a/db/migrate/20140914173417_remove_old_member_tables.rb b/db/migrate/20140914173417_remove_old_member_tables.rb deleted file mode 100644 index 408b9551dbb..00000000000 --- a/db/migrate/20140914173417_remove_old_member_tables.rb +++ /dev/null @@ -1,26 +0,0 @@ -class RemoveOldMemberTables < ActiveRecord::Migration - def up - drop_table :users_groups - drop_table :users_projects - end - - def down - create_table :users_groups do |t| - t.integer :group_access, null: false - t.integer :group_id, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false, default: 3 - - t.timestamps - end - - create_table :users_projects do |t| - t.integer :project_access, null: false - t.integer :project_id, null: false - t.integer :user_id, null: false - t.integer :notification_level, null: false, default: 3 - - t.timestamps - end - end -end diff --git a/db/migrate/20141006143943_move_slack_service_to_webhook.rb b/db/migrate/20141006143943_move_slack_service_to_webhook.rb deleted file mode 100644 index 5836cd6b8db..00000000000 --- a/db/migrate/20141006143943_move_slack_service_to_webhook.rb +++ /dev/null @@ -1,17 +0,0 @@ -class MoveSlackServiceToWebhook < ActiveRecord::Migration - def change - SlackService.all.each do |slack_service| - if ["token", "subdomain"].all? { |property| slack_service.properties.key? property } - token = slack_service.properties['token'] - subdomain = slack_service.properties['subdomain'] - webhook = "https://#{subdomain}.slack.com/services/hooks/incoming-webhook?token=#{token}" - slack_service.properties['webhook'] = webhook - slack_service.properties.delete('token') - slack_service.properties.delete('subdomain') - # Room is configured on the Slack side - slack_service.properties.delete('room') - slack_service.save(validate: false) - end - end - end -end diff --git a/db/migrate/20141007100818_add_visibility_level_to_snippet.rb b/db/migrate/20141007100818_add_visibility_level_to_snippet.rb deleted file mode 100644 index 7f125acb5d1..00000000000 --- a/db/migrate/20141007100818_add_visibility_level_to_snippet.rb +++ /dev/null @@ -1,21 +0,0 @@ -class AddVisibilityLevelToSnippet < ActiveRecord::Migration - def up - add_column :snippets, :visibility_level, :integer, :default => 0, :null => false - - Snippet.where(private: true).update_all(visibility_level: Gitlab::VisibilityLevel::PRIVATE) - Snippet.where(private: false).update_all(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - - add_index :snippets, :visibility_level - - remove_column :snippets, :private - end - - def down - add_column :snippets, :private, :boolean, :default => false, :null => false - - Snippet.where(visibility_level: Gitlab::VisibilityLevel::INTERNAL).update_all(private: false) - Snippet.where(visibility_level: Gitlab::VisibilityLevel::PRIVATE).update_all(private: true) - - remove_column :snippets, :visibility_level - end -end diff --git a/db/migrate/20141121133009_add_timestamps_to_members.rb b/db/migrate/20141121133009_add_timestamps_to_members.rb deleted file mode 100644 index ef6d4dedf32..00000000000 --- a/db/migrate/20141121133009_add_timestamps_to_members.rb +++ /dev/null @@ -1,15 +0,0 @@ -# In 20140914145549_migrate_to_new_members_model.rb we forgot to set the -# created_at and updated_at times for new records in the 'members' table. This -# became a problem after commit c8e78d972a5a628870eefca0f2ccea0199c55bda which -# was added in GitLab 7.5. With this migration we ensure that all rows in -# 'members' have at least some created_at and updated_at timestamp. -class AddTimestampsToMembers < ActiveRecord::Migration - def up - execute "UPDATE members SET created_at = NOW() WHERE created_at is NULL" - execute "UPDATE members SET updated_at = NOW() WHERE updated_at is NULL" - end - - def down - # no change - end -end diff --git a/db/migrate/20141121161704_add_identity_table.rb b/db/migrate/20141121161704_add_identity_table.rb deleted file mode 100644 index a85b0426cec..00000000000 --- a/db/migrate/20141121161704_add_identity_table.rb +++ /dev/null @@ -1,46 +0,0 @@ -class AddIdentityTable < ActiveRecord::Migration - def up - create_table :identities do |t| - t.string :extern_uid - t.string :provider - t.references :user - end - - add_index :identities, :user_id - - execute < 2 - end -end diff --git a/db/migrate/20150205211843_add_timestamps_to_identities.rb b/db/migrate/20150205211843_add_timestamps_to_identities.rb deleted file mode 100644 index 77cddbfec3b..00000000000 --- a/db/migrate/20150205211843_add_timestamps_to_identities.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTimestampsToIdentities < ActiveRecord::Migration - def change - add_timestamps(:identities) - end -end diff --git a/db/migrate/20150206181414_add_index_to_created_at.rb b/db/migrate/20150206181414_add_index_to_created_at.rb deleted file mode 100644 index fc624fca60d..00000000000 --- a/db/migrate/20150206181414_add_index_to_created_at.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddIndexToCreatedAt < ActiveRecord::Migration - def change - add_index "users", [:created_at, :id] - add_index "members", [:created_at, :id] - add_index "projects", [:created_at, :id] - add_index "issues", [:created_at, :id] - add_index "merge_requests", [:created_at, :id] - add_index "milestones", [:created_at, :id] - add_index "namespaces", [:created_at, :id] - add_index "notes", [:created_at, :id] - add_index "identities", [:created_at, :id] - add_index "keys", [:created_at, :id] - add_index "web_hooks", [:created_at, :id] - add_index "snippets", [:created_at, :id] - end -end diff --git a/db/migrate/20150206222854_add_notification_email_to_user.rb b/db/migrate/20150206222854_add_notification_email_to_user.rb deleted file mode 100644 index ab80f7e582f..00000000000 --- a/db/migrate/20150206222854_add_notification_email_to_user.rb +++ /dev/null @@ -1,11 +0,0 @@ -class AddNotificationEmailToUser < ActiveRecord::Migration - def up - add_column :users, :notification_email, :string - - execute "UPDATE users SET notification_email = email" - end - - def down - remove_column :users, :notification_email - end -end diff --git a/db/migrate/20150209222013_add_missing_index.rb b/db/migrate/20150209222013_add_missing_index.rb deleted file mode 100644 index a816c2e9e8c..00000000000 --- a/db/migrate/20150209222013_add_missing_index.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMissingIndex < ActiveRecord::Migration - def change - add_index "services", [:created_at, :id] - end -end diff --git a/db/migrate/20150211172122_add_template_to_service.rb b/db/migrate/20150211172122_add_template_to_service.rb deleted file mode 100644 index b1bfbc45ee9..00000000000 --- a/db/migrate/20150211172122_add_template_to_service.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTemplateToService < ActiveRecord::Migration - def change - add_column :services, :template, :boolean, default: false - end -end diff --git a/db/migrate/20150211174341_allow_null_in_services_project_id.rb b/db/migrate/20150211174341_allow_null_in_services_project_id.rb deleted file mode 100644 index 68f02812791..00000000000 --- a/db/migrate/20150211174341_allow_null_in_services_project_id.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AllowNullInServicesProjectId < ActiveRecord::Migration - def change - change_column :services, :project_id, :integer, null: true - end -end diff --git a/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb b/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb deleted file mode 100644 index a0439172391..00000000000 --- a/db/migrate/20150213104043_add_twitter_sharing_enabled_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddTwitterSharingEnabledToApplicationSettings < ActiveRecord::Migration - def change - add_column :application_settings, :twitter_sharing_enabled, :boolean, default: true - end -end diff --git a/db/migrate/20150213114800_add_hide_no_password_to_user.rb b/db/migrate/20150213114800_add_hide_no_password_to_user.rb deleted file mode 100644 index 685f0844276..00000000000 --- a/db/migrate/20150213114800_add_hide_no_password_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddHideNoPasswordToUser < ActiveRecord::Migration - def change - add_column :users, :hide_no_password, :boolean, default: false - end -end diff --git a/db/migrate/20150213121042_add_password_automatically_set_to_user.rb b/db/migrate/20150213121042_add_password_automatically_set_to_user.rb deleted file mode 100644 index c3c7c1ffc77..00000000000 --- a/db/migrate/20150213121042_add_password_automatically_set_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPasswordAutomaticallySetToUser < ActiveRecord::Migration - def change - add_column :users, :password_automatically_set, :boolean, default: false - end -end diff --git a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb b/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb deleted file mode 100644 index 23ac1b399ec..00000000000 --- a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb +++ /dev/null @@ -1,6 +0,0 @@ -class AddBitbucketAccessTokenAndSecretToUser < ActiveRecord::Migration - def change - add_column :users, :bitbucket_access_token, :string - add_column :users, :bitbucket_access_token_secret, :string - end -end diff --git a/db/migrate/20150219004514_add_events_to_services.rb b/db/migrate/20150219004514_add_events_to_services.rb deleted file mode 100644 index cf73a0174f4..00000000000 --- a/db/migrate/20150219004514_add_events_to_services.rb +++ /dev/null @@ -1,8 +0,0 @@ -class AddEventsToServices < ActiveRecord::Migration - def change - add_column :services, :push_events, :boolean, :default => true - add_column :services, :issues_events, :boolean, :default => true - add_column :services, :merge_requests_events, :boolean, :default => true - add_column :services, :tag_push_events, :boolean, :default => true - end -end diff --git a/db/migrate/20150223022001_set_missing_last_activity_at.rb b/db/migrate/20150223022001_set_missing_last_activity_at.rb deleted file mode 100644 index 3f6d4d83474..00000000000 --- a/db/migrate/20150223022001_set_missing_last_activity_at.rb +++ /dev/null @@ -1,8 +0,0 @@ -class SetMissingLastActivityAt < ActiveRecord::Migration - def up - execute "UPDATE projects SET last_activity_at = updated_at WHERE last_activity_at IS NULL" - end - - def down - end -end diff --git a/db/migrate/20150225065047_add_note_events_to_services.rb b/db/migrate/20150225065047_add_note_events_to_services.rb deleted file mode 100644 index d54ba9e482f..00000000000 --- a/db/migrate/20150225065047_add_note_events_to_services.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNoteEventsToServices < ActiveRecord::Migration - def change - add_column :services, :note_events, :boolean, default: true, null: false - end -end diff --git a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb b/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb deleted file mode 100644 index 494c3033bff..00000000000 --- a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddRestrictedVisibilityLevelsToApplicationSettings < ActiveRecord::Migration - def change - add_column :application_settings, :restricted_visibility_levels, :text - end -end diff --git a/db/migrate/20150306023106_fix_namespace_duplication.rb b/db/migrate/20150306023106_fix_namespace_duplication.rb deleted file mode 100644 index 334e5574559..00000000000 --- a/db/migrate/20150306023106_fix_namespace_duplication.rb +++ /dev/null @@ -1,21 +0,0 @@ -class FixNamespaceDuplication < ActiveRecord::Migration - def up - #fixes path duplication - select_all('SELECT MAX(id) max, COUNT(id) cnt, path FROM namespaces GROUP BY path HAVING COUNT(id) > 1').each do |nms| - bad_nms_ids = select_all("SELECT id FROM namespaces WHERE path = '#{nms['path']}' AND id <> #{nms['max']}").map{|x| x["id"]} - execute("UPDATE projects SET namespace_id = #{nms["max"]} WHERE namespace_id IN(#{bad_nms_ids.join(', ')})") - execute("DELETE FROM namespaces WHERE id IN(#{bad_nms_ids.join(', ')})") - end - - #fixes name duplication - select_all('SELECT MAX(id) max, COUNT(id) cnt, name FROM namespaces GROUP BY name HAVING COUNT(id) > 1').each do |nms| - bad_nms_ids = select_all("SELECT id FROM namespaces WHERE name = '#{nms['name']}' AND id <> #{nms['max']}").map{|x| x["id"]} - execute("UPDATE projects SET namespace_id = #{nms["max"]} WHERE namespace_id IN(#{bad_nms_ids.join(', ')})") - execute("DELETE FROM namespaces WHERE id IN(#{bad_nms_ids.join(', ')})") - end - end - - def down - # not implemented - end -end diff --git a/db/migrate/20150306023112_add_unique_index_to_namespace.rb b/db/migrate/20150306023112_add_unique_index_to_namespace.rb deleted file mode 100644 index 6472138e3ef..00000000000 --- a/db/migrate/20150306023112_add_unique_index_to_namespace.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddUniqueIndexToNamespace < ActiveRecord::Migration - def change - remove_index :namespaces, column: :name if index_exists?(:namespaces, :name) - remove_index :namespaces, column: :path if index_exists?(:namespaces, :path) - - add_index :namespaces, :name, unique: true - add_index :namespaces, :path, unique: true - end -end diff --git a/db/migrate/20150313012111_create_subscriptions_table.rb b/db/migrate/20150313012111_create_subscriptions_table.rb deleted file mode 100644 index a1d4d9dedc5..00000000000 --- a/db/migrate/20150313012111_create_subscriptions_table.rb +++ /dev/null @@ -1,16 +0,0 @@ -class CreateSubscriptionsTable < ActiveRecord::Migration - def change - create_table :subscriptions do |t| - t.integer :user_id - t.references :subscribable, polymorphic: true - t.boolean :subscribed - - t.timestamps - end - - add_index :subscriptions, - [:subscribable_id, :subscribable_type, :user_id], - unique: true, - name: 'subscriptions_user_id_and_ref_fields' - end -end diff --git a/db/migrate/20150320234437_add_location_to_user.rb b/db/migrate/20150320234437_add_location_to_user.rb deleted file mode 100644 index 32731d37d75..00000000000 --- a/db/migrate/20150320234437_add_location_to_user.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddLocationToUser < ActiveRecord::Migration - def change - add_column :users, :location, :string - end -end diff --git a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb b/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb deleted file mode 100644 index 42dc8173e46..00000000000 --- a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb +++ /dev/null @@ -1,6 +0,0 @@ -class SetIncorrectAssigneeIdToNull < ActiveRecord::Migration - def up - execute "UPDATE issues SET assignee_id = NULL WHERE assignee_id = -1" - execute "UPDATE merge_requests SET assignee_id = NULL WHERE assignee_id = -1" - end -end diff --git a/db/migrate/20150327122227_add_public_to_key.rb b/db/migrate/20150327122227_add_public_to_key.rb deleted file mode 100644 index 6ffbf4cda19..00000000000 --- a/db/migrate/20150327122227_add_public_to_key.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPublicToKey < ActiveRecord::Migration - def change - add_column :keys, :public, :boolean, default: false, null: false - end -end diff --git a/db/migrate/20150327150017_add_import_data_to_project.rb b/db/migrate/20150327150017_add_import_data_to_project.rb deleted file mode 100644 index 12c00339eec..00000000000 --- a/db/migrate/20150327150017_add_import_data_to_project.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddImportDataToProject < ActiveRecord::Migration - def change - add_column :projects, :import_data, :text - end -end diff --git a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb b/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb deleted file mode 100644 index 1d161674a9a..00000000000 --- a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddMaxAttachmentSizeToApplicationSettings < ActiveRecord::Migration - def change - add_column :application_settings, :max_attachment_size, :integer, default: 10, null: false - end -end diff --git a/db/migrate/20150406133311_add_invite_data_to_member.rb b/db/migrate/20150406133311_add_invite_data_to_member.rb deleted file mode 100644 index 3452fd45c4f..00000000000 --- a/db/migrate/20150406133311_add_invite_data_to_member.rb +++ /dev/null @@ -1,12 +0,0 @@ -class AddInviteDataToMember < ActiveRecord::Migration - def change - add_column :members, :created_by_id, :integer - add_column :members, :invite_email, :string - add_column :members, :invite_token, :string - add_column :members, :invite_accepted_at, :datetime - - change_column :members, :user_id, :integer, null: true - - add_index :members, :invite_token, unique: true - end -end diff --git a/db/migrate/20150411000035_fix_identities.rb b/db/migrate/20150411000035_fix_identities.rb deleted file mode 100644 index d9051f9fffd..00000000000 --- a/db/migrate/20150411000035_fix_identities.rb +++ /dev/null @@ -1,45 +0,0 @@ -class FixIdentities < ActiveRecord::Migration - def up - # Up until now, legacy 'ldap' references in the database were charitably - # interpreted to point to the first LDAP server specified in the GitLab - # configuration. So if the database said 'provider: ldap' but the first - # LDAP server was called 'ldapmain', then we would try to interpret - # 'provider: ldap' as if it said 'provider: ldapmain'. This migration (and - # accompanying changes in the GitLab LDAP code) get rid of this complicated - # behavior. Any database references to 'provider: ldap' get rewritten to - # whatever the code would have interpreted it as, i.e. as a reference to - # the first LDAP server specified in gitlab.yml / gitlab.rb. - new_provider = if Gitlab.config.ldap.enabled - first_ldap_server = Gitlab.config.ldap.servers.values.first - first_ldap_server['provider_name'] - else - 'ldapmain' - end - - # Delete duplicate identities - # We use a sort of self-join to find rows in identities which match on - # user_id but where one has provider 'ldap'. We delete the duplicate row - # with provider 'ldap'. - delete_statement = '' - case adapter_name.downcase - when /^mysql/ - delete_statement << 'DELETE FROM id1 USING identities AS id1, identities AS id2' - when 'postgresql' - delete_statement << 'DELETE FROM identities AS id1 USING identities AS id2' - else - raise "Unknown DB adapter: #{adapter_name}" - end - delete_statement << " WHERE id1.user_id = id2.user_id AND id1.provider = 'ldap' AND id2.provider = '#{new_provider}'" - execute delete_statement - - # Update legacy identities - execute "UPDATE identities SET provider = '#{new_provider}' WHERE provider = 'ldap'" - - if table_exists?('ldap_group_links') - execute "UPDATE ldap_group_links SET provider = '#{new_provider}' WHERE provider IS NULL OR provider = 'ldap'" - end - end - - def down - end -end diff --git a/db/migrate/20150411180045_rename_buildbox_service.rb b/db/migrate/20150411180045_rename_buildbox_service.rb deleted file mode 100644 index 5a0b5d07e50..00000000000 --- a/db/migrate/20150411180045_rename_buildbox_service.rb +++ /dev/null @@ -1,9 +0,0 @@ -class RenameBuildboxService < ActiveRecord::Migration - def up - execute "UPDATE services SET type = 'BuildkiteService' WHERE type = 'BuildboxService';" - end - - def down - execute "UPDATE services SET type = 'BuildboxService' WHERE type = 'BuildkiteService';" - end -end diff --git a/db/migrate/20150413192223_add_public_email_to_users.rb b/db/migrate/20150413192223_add_public_email_to_users.rb deleted file mode 100644 index 700e9f343a6..00000000000 --- a/db/migrate/20150413192223_add_public_email_to_users.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddPublicEmailToUsers < ActiveRecord::Migration - def change - add_column :users, :public_email, :string, default: "", null: false - end -end diff --git a/db/migrate/limits_to_mysql.rb b/db/migrate/limits_to_mysql.rb deleted file mode 100644 index 2b7afae6d7c..00000000000 --- a/db/migrate/limits_to_mysql.rb +++ /dev/null @@ -1,10 +0,0 @@ -class LimitsToMysql < ActiveRecord::Migration - def up - return unless ActiveRecord::Base.configurations[Rails.env]['adapter'] =~ /^mysql/ - - change_column :merge_request_diffs, :st_commits, :text, limit: 2147483647 - 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 - end -end diff --git a/db/seeds.rb b/db/seeds.rb deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/doc/README.md b/doc/README.md deleted file mode 100644 index 4e00dceac2b..00000000000 --- a/doc/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# Documentation - -## User documentation - -- [API](api/README.md) Automate GitLab via a simple and powerful API. -- [Markdown](markdown/markdown.md) GitLab's advanced formatting system. -- [Permissions](permissions/permissions.md) Learn what each role in a project (guest/reporter/developer/master/owner) can do. -- [Project Services](project_services/project_services.md) Integrate a project with external services, such as CI and chat. -- [Public access](public_access/public_access.md) Learn how you can allow public and internal access to projects. -- [SSH](ssh/README.md) Setup your ssh keys and deploy keys for secure access to your projects. -- [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. -- [GitLab as OAuth2 authentication service provider](integration/oauth_provider.md). It allows you to login to other applications from GitLab. - -## Administrator documentation - -- [Install](install/README.md) Requirements, directory structures and installation from source. -- [Integration](integration/README.md) How to integrate with systems such as JIRA, Redmine, LDAP and Twitter. -- [Raketasks](raketasks/README.md) Backups, maintenance, automatic web hook setup and the importing of projects. -- [Custom git hooks](hooks/custom_hooks.md) Custom git hooks (on the filesystem) for when web hooks aren't enough. -- [System hooks](system_hooks/system_hooks.md) Notifications when users, projects and keys are changed. -- [Security](security/README.md) Learn what you can do to further secure your GitLab instance. -- [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. -- [Issue closing](customization/issue_closing.md) Customize how to close an issue from commit messages. -- [Libravatar](customization/libravatar.md) Use Libravatar for user avatars. -- [Operations](operations/README.md) Keeping GitLab up and running -- [Log system](logs/logs.md) Log system - -## Contributor documentation - -- [Development](development/README.md) Explains the architecture and the guidelines for shell commands. -- [Legal](legal/README.md) Contributor license agreements. -- [Release](release/README.md) How to make the monthly and security releases. diff --git a/doc/api/README.md b/doc/api/README.md deleted file mode 100644 index dec530d0b81..00000000000 --- a/doc/api/README.md +++ /dev/null @@ -1,209 +0,0 @@ -# GitLab API - -## Resources - -- [Users](users.md) -- [Session](session.md) -- [Projects](projects.md) -- [Project Snippets](project_snippets.md) -- [Repositories](repositories.md) -- [Repository Files](repository_files.md) -- [Commits](commits.md) -- [Branches](branches.md) -- [Merge Requests](merge_requests.md) -- [Issues](issues.md) -- [Labels](labels.md) -- [Milestones](milestones.md) -- [Notes](notes.md) (comments) -- [Deploy Keys](deploy_keys.md) -- [System Hooks](system_hooks.md) -- [Groups](groups.md) - -## Clients - -Find API Clients for GitLab [on our website](https://about.gitlab.com/applications/#api-clients). -You can use [GitLab as an OAuth2 client](oauth2.md) to make API calls. - -## Introduction - -All API requests require authentication. You need to pass a `private_token` parameter by URL or header. If passed as header, the header name must be "PRIVATE-TOKEN" (capital and with dash instead of underscore). You can find or reset your private token in your profile. - -If no, or an invalid, `private_token` is provided then an error message will be returned with status code 401: - -```json -{ - "message": "401 Unauthorized" -} -``` - -API requests should be prefixed with `api` and the API version. The API version is defined in `lib/api.rb`. - -Example of a valid API request: - -``` -GET http://example.com/api/v3/projects?private_token=QVy1PB7sTxfy4pqfZM1U -``` - -Example for a valid API request using curl and authentication via header: - -``` -curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" "http://example.com/api/v3/projects" -``` - -The API uses JSON to serialize data. You don't need to specify `.json` at the end of API URL. - -## Authentication with OAuth2 token - -Instead of the private_token you can transmit the OAuth2 access token as a header or as a parameter. - -### OAuth2 token (as a parameter) - -``` -curl https://localhost:3000/api/v3/user?access_token=OAUTH-TOKEN -``` - -### OAuth2 token (as a header) - -``` -curl -H "Authorization: Bearer OAUTH-TOKEN" https://localhost:3000/api/v3/user -``` - -Read more about [GitLab as an OAuth2 client](oauth2.md). - -## 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 - -## Sudo - -All API requests support performing an api call as if you were another user, if your private token is for an administration account. You need to pass `sudo` parameter by URL or header with an id or username of the user you want to perform the operation as. If passed as header, the header name must be "SUDO" (capitals). - -If a non administrative `private_token` is provided then an error message will be returned with status code 403: - -```json -{ - "message": "403 Forbidden: Must be admin to use sudo" -} -``` - -If the sudo user id or username cannot be found then an error message will be returned with status code 404: - -```json -{ - "message": "404 Not Found: No user id or username for: " -} -``` - -Example of a valid API with sudo request: - -``` -GET http://example.com/api/v3/projects?private_token=QVy1PB7sTxfy4pqfZM1U&sudo=username -``` - -``` -GET http://example.com/api/v3/projects?private_token=QVy1PB7sTxfy4pqfZM1U&sudo=23 -``` - -Example for a valid API request with sudo using curl and authentication via header: - -``` -curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" --header "SUDO: username" "http://example.com/api/v3/projects" -``` - -``` -curl --header "PRIVATE-TOKEN: QVy1PB7sTxfy4pqfZM1U" --header "SUDO: 23" "http://example.com/api/v3/projects" -``` - -## Pagination - -When listing resources you can pass the following parameters: - -- `page` (default: `1`) - page number -- `per_page` (default: `20`, max: `100`) - number of items to list per page - -[Link headers](http://www.w3.org/wiki/LinkHeader) are send back with each response. These have `rel` prev/next/first/last and contain the relevant URL. Please use these instead of generating your own URLs. - -## id vs iid - -When you work with API you may notice two similar fields in api entities: id and iid. The main difference between them is scope. Example: - -Issue: - - id: 46 - iid: 5 - -- id - is unique across all issues. It's used for any api call. -- iid - is unique only in scope of a single project. When you browse issues or merge requests with Web UI, you see iid. - -So if you want to get issue with api you use `http://host/api/v3/.../issues/:id.json`. But when you want to create a link to web page - use `http:://host/project/issues/:iid.json` - -## Data validation and error reporting - -When working with the API you may encounter validation errors. In such case, the API will answer with an HTTP `400` status. -Such errors appear in two cases: - -* A required attribute of the API request is missing, e.g. the title of an issue is not given -* An attribute did not pass the validation, e.g. user bio is too long - -When an attribute is missing, you will get something like: - - HTTP/1.1 400 Bad Request - Content-Type: application/json - - { - "message":"400 (Bad request) \"title\" not given" - } - -When a validation error occurs, error messages will be different. They will hold all details of validation errors: - - HTTP/1.1 400 Bad Request - Content-Type: application/json - - { - "message": { - "bio": [ - "is too long (maximum is 255 characters)" - ] - } - } - -This makes error messages more machine-readable. The format can be described as follow: - - { - "message": { - "": [ - "", - "", - ... - ], - "": { - "": [ - "", - "", - ... - ], - } - } - } diff --git a/doc/api/branches.md b/doc/api/branches.md deleted file mode 100644 index 6a9c10c8520..00000000000 --- a/doc/api/branches.md +++ /dev/null @@ -1,192 +0,0 @@ -# Branches - -## List repository branches - -Get a list of repository branches from a project, sorted by name alphabetically. - -``` -GET /projects/:id/repository/branches -``` - -Parameters: - -- `id` (required) - The ID of a project - -```json -[ - { - "commit": { - "author_email": "john@example.com", - "author_name": "John Smith", - "authored_date": "2012-06-27T05:51:39-07:00", - "committed_date": "2012-06-28T03:44:20-07:00", - "committer_email": "john@example.com", - "committer_name": "John Smith", - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", - "message": "add projects API", - "parent_ids": [ - "4ad91d3c1144c406e50c7b33bae684bd6837faf8" - ] - }, - "name": "master", - "protected": true - } -] -``` - -## Get single repository branch - -Get a single project repository branch. - -``` -GET /projects/:id/repository/branches/:branch -``` - -Parameters: - -- `id` (required) - The ID of a project -- `branch` (required) - The name of the branch - -```json -{ - "commit": { - "author_email": "john@example.com", - "author_name": "John Smith", - "authored_date": "2012-06-27T05:51:39-07:00", - "committed_date": "2012-06-28T03:44:20-07:00", - "committer_email": "john@example.com", - "committer_name": "John Smith", - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", - "message": "add projects API", - "parent_ids": [ - "4ad91d3c1144c406e50c7b33bae684bd6837faf8" - ] - }, - "name": "master", - "protected": true -} -``` - -## Protect repository branch - -Protects a single project repository branch. This is an idempotent function, protecting an already -protected repository branch still returns a `200 OK` status code. - -``` -PUT /projects/:id/repository/branches/:branch/protect -``` - -Parameters: - -- `id` (required) - The ID of a project -- `branch` (required) - The name of the branch - -```json -{ - "commit": { - "author_email": "john@example.com", - "author_name": "John Smith", - "authored_date": "2012-06-27T05:51:39-07:00", - "committed_date": "2012-06-28T03:44:20-07:00", - "committer_email": "john@example.com", - "committer_name": "John Smith", - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", - "message": "add projects API", - "parent_ids": [ - "4ad91d3c1144c406e50c7b33bae684bd6837faf8" - ] - }, - "name": "master", - "protected": true -} -``` - -## Unprotect repository branch - -Unprotects a single project repository branch. This is an idempotent function, unprotecting an already -unprotected repository branch still returns a `200 OK` status code. - -``` -PUT /projects/:id/repository/branches/:branch/unprotect -``` - -Parameters: - -- `id` (required) - The ID of a project -- `branch` (required) - The name of the branch - -```json -{ - "commit": { - "author_email": "john@example.com", - "author_name": "John Smith", - "authored_date": "2012-06-27T05:51:39-07:00", - "committed_date": "2012-06-28T03:44:20-07:00", - "committer_email": "john@example.com", - "committer_name": "John Smith", - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", - "message": "add projects API", - "parent_ids": [ - "4ad91d3c1144c406e50c7b33bae684bd6837faf8" - ] - }, - "name": "master", - "protected": false -} -``` - -## Create repository branch - -``` -POST /projects/:id/repository/branches -``` - -Parameters: - -- `id` (required) - The ID of a project -- `branch_name` (required) - The name of the branch -- `ref` (required) - Create branch from commit SHA or existing branch - -```json -{ - "commit": { - "author_email": "john@example.com", - "author_name": "John Smith", - "authored_date": "2012-06-27T05:51:39-07:00", - "committed_date": "2012-06-28T03:44:20-07:00", - "committer_email": "john@example.com", - "committer_name": "John Smith", - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", - "message": "add projects API", - "parent_ids": [ - "4ad91d3c1144c406e50c7b33bae684bd6837faf8" - ] - }, - "name": "master", - "protected": false -} -``` - -It return 200 if succeed or 400 if failed with error message explaining reason. - -## Delete repository branch - -``` -DELETE /projects/:id/repository/branches/:branch -``` - -Parameters: - -- `id` (required) - The ID of a project -- `branch` (required) - The name of the branch - -It return 200 if succeed, 404 if the branch to be deleted does not exist -or 400 for other reasons. In case of an error, an explaining message is provided. - -Success response: - -```json -{ - "branch_name": "my-removed-branch" -} -``` diff --git a/doc/api/commits.md b/doc/api/commits.md deleted file mode 100644 index eb8d6a43592..00000000000 --- a/doc/api/commits.md +++ /dev/null @@ -1,158 +0,0 @@ -# Commits API - -## List repository commits - -Get a list of repository commits in a project. - -``` -GET /projects/:id/repository/commits -``` - -Parameters: - -- `id` (required) - The ID of a project -- `ref_name` (optional) - The name of a repository branch or tag or if not given the default branch - -```json -[ - { - "id": "ed899a2f4b50b4370feeea94676502b42383c746", - "short_id": "ed899a2f4b5", - "title": "Replace sanitize with escape once", - "author_name": "Dmitriy Zaporozhets", - "author_email": "dzaporozhets@sphereconsultinginc.com", - "created_at": "2012-09-20T11:50:22+03:00", - "message": "Replace sanitize with escape once" - }, - { - "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6", - "short_id": "6104942438c", - "title": "Sanitize for network graph", - "author_name": "randx", - "author_email": "dmitriy.zaporozhets@gmail.com", - "created_at": "2012-09-20T09:06:12+03:00", - "message": "Sanitize for network graph" - } -] -``` - -## Get a single commit - -Get a specific commit identified by the commit hash or name of a branch or tag. - -``` -GET /projects/:id/repository/commits/:sha -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The commit hash or name of a repository branch or tag - -```json -{ - "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6", - "short_id": "6104942438c", - "title": "Sanitize for network graph", - "author_name": "randx", - "author_email": "dmitriy.zaporozhets@gmail.com", - "created_at": "2012-09-20T09:06:12+03:00", - "message": "Sanitize for network graph", - "committed_date": "2012-09-20T09:06:12+03:00", - "authored_date": "2012-09-20T09:06:12+03:00", - "parent_ids": [ - "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" - ] -} -``` - -## Get the diff of a commit - -Get the diff of a commit in a project. - -``` -GET /projects/:id/repository/commits/:sha/diff -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The name of a repository branch or tag or if not given the default branch - -```json -[ - { - "diff": "--- a/doc/update/5.4-to-6.0.md\n+++ b/doc/update/5.4-to-6.0.md\n@@ -71,6 +71,8 @@\n sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production\n sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production\n \n+sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production\n+\n ```\n \n ### 6. Update config files", - "new_path": "doc/update/5.4-to-6.0.md", - "old_path": "doc/update/5.4-to-6.0.md", - "a_mode": null, - "b_mode": "100644", - "new_file": false, - "renamed_file": false, - "deleted_file": false - } -] -``` - -## Get the comments of a commit - -Get the comments of a commit in a project. - -``` -GET /projects/:id/repository/commits/:sha/comments -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The name of a repository branch or tag or if not given the default branch - -```json -[ - { - "note": "this code is really nice", - "author": { - "id": 11, - "username": "admin", - "email": "admin@local.host", - "name": "Administrator", - "state": "active", - "created_at": "2014-03-06T08:17:35.000Z" - } - } -] -``` - -## Post comment to commit - -Adds a comment to a commit. Optionally you can post comments on a specific line of a commit. Therefor both `path`, `line_new` and `line_old` are required. - -``` -POST /projects/:id/repository/commits/:sha/comments -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The name of a repository branch or tag or if not given the default branch -- `note` (required) - Text of comment -- `path` (optional) - The file path -- `line` (optional) - The line number -- `line_type` (optional) - The line type (new or old) - -```json -{ - "author": { - "id": 1, - "username": "admin", - "email": "admin@local.host", - "name": "Administrator", - "blocked": false, - "created_at": "2012-04-29T08:46:00Z" - }, - "note": "text1", - "path": "example.rb", - "line": 5, - "line_type": "new" -} -``` diff --git a/doc/api/deploy_key_multiple_projects.md b/doc/api/deploy_key_multiple_projects.md deleted file mode 100644 index 1a5a458905e..00000000000 --- a/doc/api/deploy_key_multiple_projects.md +++ /dev/null @@ -1,25 +0,0 @@ -# Adding deploy keys to multiple projects - -If you want to easily add the same deploy key to multiple projects in the same group, this can be achieved quite easily with the API. - -First, find the ID of the projects you're interested in, by either listing all projects: - -``` -curl --header 'PRIVATE-TOKEN: abcdef' https://gitlab.com/api/v3/projects -``` - -Or finding the id of a group and then listing all projects in that group: - -``` -curl --header 'PRIVATE-TOKEN: abcdef' https://gitlab.com/api/v3/groups - -# For group 1234: -curl --header 'PRIVATE-TOKEN: abcdef' https://gitlab.com/api/v3/groups/1234 -``` - -With those IDs, add the same deploy key to all: -``` -for project_id in 321 456 987; do - curl -X POST --data '{"title": "my key", "key": "ssh-rsa AAAA..."}' --header 'PRIVATE-TOKEN: abcdef' https://gitlab.com/api/v3/projects/${project_id}/keys -done -``` diff --git a/doc/api/deploy_keys.md b/doc/api/deploy_keys.md deleted file mode 100644 index e4492fc609c..00000000000 --- a/doc/api/deploy_keys.md +++ /dev/null @@ -1,80 +0,0 @@ -# Deploy Keys - -## List deploy keys - -Get a list of a project's deploy keys. - -``` -GET /projects/:id/keys -``` - -Parameters: - -- `id` (required) - The ID of the project - -```json -[ - { - "id": 1, - "title": "Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2013-10-02T10:12:29Z" - }, - { - "id": 3, - "title": "Another Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2013-10-02T11:12:29Z" - } -] -``` - -## Single deploy key - -Get a single key. - -``` -GET /projects/:id/keys/:key_id -``` - -Parameters: - -- `id` (required) - The ID of the project -- `key_id` (required) - The ID of the deploy key - -```json -{ - "id": 1, - "title": "Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2013-10-02T10:12:29Z" -} -``` - -## Add deploy key - -Creates a new deploy key for a project. -If deploy key already exists in another project - it will be joined to project but only if original one was is accessible by same user - -``` -POST /projects/:id/keys -``` - -Parameters: - -- `id` (required) - The ID of the project -- `title` (required) - New deploy key's title -- `key` (required) - New deploy key - -## Delete deploy key - -Delete a deploy key from a project - -``` -DELETE /projects/:id/keys/:key_id -``` - -Parameters: - -- `id` (required) - The ID of the project -- `key_id` (required) - The ID of the deploy key diff --git a/doc/api/groups.md b/doc/api/groups.md deleted file mode 100644 index b5a4b05ccaf..00000000000 --- a/doc/api/groups.md +++ /dev/null @@ -1,178 +0,0 @@ -# Groups - -## List project groups - -Get a list of groups. (As user: my groups, as admin: all groups) - -``` -GET /groups -``` - -```json -[ - { - "id": 1, - "name": "Foobar Group", - "path": "foo-bar", - "description": "An interesting group" - } -] -``` - -You can search for groups by name or path, see below. - -## Details of a group - -Get all details of a group. - -``` -GET /groups/:id -``` - -Parameters: - -- `id` (required) - The ID or path of a group - -## New group - -Creates a new project group. Available only for admin. - -``` -POST /groups -``` - -Parameters: - -- `name` (required) - The name of the group -- `path` (required) - The path of the group -- `description` (optional) - The group's description - -## Transfer project to group - -Transfer a project to the Group namespace. Available only for admin - -``` -POST /groups/:id/projects/:project_id -``` - -Parameters: - -- `id` (required) - The ID or path of a group -- `project_id` (required) - The ID of a project - -## Remove group - -Removes group with all projects inside. - -``` -DELETE /groups/:id -``` - -Parameters: - -- `id` (required) - The ID or path of a user group - -## Search for group - -Get all groups that match your string in their name or path. - -``` -GET /groups?search=foobar -``` - -```json -[ - { - "id": 1, - "name": "Foobar Group", - "path": "foo-bar", - "description": "An interesting group" - } -] -``` - -## Group members - -**Group access levels** - -The group access levels are defined in the `Gitlab::Access` module. Currently, these levels are recognized: - -``` -GUEST = 10 -REPORTER = 20 -DEVELOPER = 30 -MASTER = 40 -OWNER = 50 -``` - -### List group members - -Get a list of group members viewable by the authenticated user. - -``` -GET /groups/:id/members -``` - -```json -[ - { - "id": 1, - "username": "raymond_smith", - "email": "ray@smith.org", - "name": "Raymond Smith", - "state": "active", - "created_at": "2012-10-22T14:13:35Z", - "access_level": 30 - }, - { - "id": 2, - "username": "john_doe", - "email": "joh@doe.org", - "name": "John Doe", - "state": "active", - "created_at": "2012-10-22T14:13:35Z", - "access_level": 30 - } -] -``` - -### Add group member - -Adds a user to the list of group members. - -``` -POST /groups/:id/members -``` - -Parameters: - -- `id` (required) - The ID or path of a group -- `user_id` (required) - The ID of a user to add -- `access_level` (required) - Project access level - -### Edit group team member - -Updates a group team member to a specified access level. - -``` -PUT /groups/:id/members/:user_id -``` - -Parameters: - -- `id` (required) - The ID of a group -- `user_id` (required) - The ID of a group member -- `access_level` (required) - Project access level - -### Remove user team member - -Removes user from user team. - -``` -DELETE /groups/:id/members/:user_id -``` - -Parameters: - -- `id` (required) - The ID or path of a user group -- `user_id` (required) - The ID of a group member diff --git a/doc/api/issues.md b/doc/api/issues.md deleted file mode 100644 index a7dd8b74c35..00000000000 --- a/doc/api/issues.md +++ /dev/null @@ -1,224 +0,0 @@ -# Issues - -## List issues - -Get all issues created by authenticated user. This function takes pagination parameters -`page` and `per_page` to restrict the list of issues. - -``` -GET /issues -GET /issues?state=opened -GET /issues?state=closed -GET /issues?labels=foo -GET /issues?labels=foo,bar -GET /issues?labels=foo,bar&state=opened -``` - -Parameters: - -- `state` (optional) - Return `all` issues or just those that are `opened` or `closed` -- `labels` (optional) - Comma-separated list of label names -- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - -```json -[ - { - "id": 43, - "iid": 3, - "project_id": 8, - "title": "4xx/5xx pages", - "description": "", - "labels": [], - "milestone": null, - "assignee": null, - "author": { - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z" - }, - "state": "closed", - "updated_at": "2012-07-02T17:53:12Z", - "created_at": "2012-07-02T17:53:12Z" - }, - { - "id": 42, - "iid": 4, - "project_id": 8, - "title": "Add user settings", - "description": "", - "labels": [ - "feature" - ], - "milestone": { - "id": 1, - "title": "v1.0", - "description": "", - "due_date": "2012-07-20", - "state": "reopened", - "updated_at": "2012-07-04T13:42:48Z", - "created_at": "2012-07-04T13:42:48Z" - }, - "assignee": { - "id": 2, - "username": "jack_smith", - "email": "jack@example.com", - "name": "Jack Smith", - "state": "active", - "created_at": "2012-05-23T08:01:01Z" - }, - "author": { - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z" - }, - "state": "opened", - "updated_at": "2012-07-12T13:43:19Z", - "created_at": "2012-06-28T12:58:06Z" - } -] -``` - -## List project issues - -Get a list of project issues. This function accepts pagination parameters `page` and `per_page` -to return the list of project issues. - -``` -GET /projects/:id/issues -GET /projects/:id/issues?state=opened -GET /projects/:id/issues?state=closed -GET /projects/:id/issues?labels=foo -GET /projects/:id/issues?labels=foo,bar -GET /projects/:id/issues?labels=foo,bar&state=opened -GET /projects/:id/issues?milestone=1.0.0 -GET /projects/:id/issues?milestone=1.0.0&state=opened -``` - -Parameters: - -- `id` (required) - The ID of a project -- `state` (optional) - Return `all` issues or just those that are `opened` or `closed` -- `labels` (optional) - Comma-separated list of label names -- `milestone` (optional) - Milestone title -- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - -## Single issue - -Gets a single project issue. - -``` -GET /projects/:id/issues/:issue_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of a project issue - -```json -{ - "id": 42, - "iid": 3, - "project_id": 8, - "title": "Add user settings", - "description": "", - "labels": [ - "feature" - ], - "milestone": { - "id": 1, - "title": "v1.0", - "description": "", - "due_date": "2012-07-20", - "state": "closed", - "updated_at": "2012-07-04T13:42:48Z", - "created_at": "2012-07-04T13:42:48Z" - }, - "assignee": { - "id": 2, - "username": "jack_smith", - "email": "jack@example.com", - "name": "Jack Smith", - "state": "active", - "created_at": "2012-05-23T08:01:01Z" - }, - "author": { - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z" - }, - "state": "opened", - "updated_at": "2012-07-12T13:43:19Z", - "created_at": "2012-06-28T12:58:06Z" -} -``` - -## New issue - -Creates a new project issue. - -``` -POST /projects/:id/issues -``` - -Parameters: - -- `id` (required) - The ID of a project -- `title` (required) - The title of an issue -- `description` (optional) - The description of an issue -- `assignee_id` (optional) - The ID of a user to assign issue -- `milestone_id` (optional) - The ID of a milestone to assign issue -- `labels` (optional) - Comma-separated label names for an issue - -If the operation is successful, 200 and the newly created issue is returned. -If an error occurs, an error number and a message explaining the reason is returned. - -## Edit issue - -Updates an existing project issue. This function is also used to mark an issue as closed. - -``` -PUT /projects/:id/issues/:issue_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of a project's issue -- `title` (optional) - The title of an issue -- `description` (optional) - The description of an issue -- `assignee_id` (optional) - The ID of a user to assign issue -- `milestone_id` (optional) - The ID of a milestone to assign issue -- `labels` (optional) - Comma-separated label names for an issue -- `state_event` (optional) - The state event of an issue ('close' to close issue and 'reopen' to reopen it) - -If the operation is successful, 200 and the updated issue is returned. -If an error occurs, an error number and a message explaining the reason is returned. - -## Delete existing issue (**Deprecated**) - -The function is deprecated and returns a `405 Method Not Allowed` error if called. An issue gets now closed and is done by calling `PUT /projects/:id/issues/:issue_id` with parameter `state_event` set to `close`. - -``` -DELETE /projects/:id/issues/:issue_id -``` - -Parameters: - -- `id` (required) - The project ID -- `issue_id` (required) - The ID of the issue - -## Comments on issues - -Comments are done via the notes resource. diff --git a/doc/api/labels.md b/doc/api/labels.md deleted file mode 100644 index de41f35d284..00000000000 --- a/doc/api/labels.md +++ /dev/null @@ -1,84 +0,0 @@ -# Labels - -## List labels - -Get all labels for given project. - -``` -GET /projects/:id/labels -``` - -```json -[ - { - "name": "Awesome", - "color": "#DD10AA" - }, - { - "name": "Documentation", - "color": "#1E80DD" - }, - { - "name": "Feature", - "color": "#11FF22" - }, - { - "name": "Bug", - "color": "#EE1122" - } -] -``` - -## Create a new label - -Creates a new label for given repository with given name and color. - -``` -POST /projects/:id/labels -``` - -Parameters: - -- `id` (required) - The ID of a project -- `name` (required) - The name of the label -- `color` (required) - Color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) - -It returns 200 and the newly created label, if the operation succeeds. -If the label already exists, 409 and an error message is returned. -If label parameters are invalid, 400 and an explaining error message is returned. - -## Delete a label - -Deletes a label given by its name. - -``` -DELETE /projects/:id/labels -``` - -- `id` (required) - The ID of a project -- `name` (required) - The name of the label to be deleted - -It returns 200 if the label successfully was deleted, 400 for wrong parameters -and 404 if the label does not exist. -In case of an error, additionally an error message is returned. - -## Edit an existing label - -Updates an existing label with new name or now color. At least one parameter -is required, to update the label. - -``` -PUT /projects/:id/labels -``` - -Parameters: - -- `id` (required) - The ID of a project -- `name` (required) - The name of the existing label -- `new_name` (optional) - The new name of the label -- `color` (optional) - New color of the label given in 6-digit hex notation with leading '#' sign (e.g. #FFAABB) - -On success, this method returns 200 with the updated label. -If required parameters are missing or parameters are invalid, 400 is returned. -If the label to be updated is missing, 404 is returned. -In case of an error, additionally an error message is returned. diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md deleted file mode 100644 index 6a272539e45..00000000000 --- a/doc/api/merge_requests.md +++ /dev/null @@ -1,393 +0,0 @@ -# Merge requests - -## List merge requests - -Get all merge requests for this project. -The `state` parameter can be used to get only merge requests with a given state (`opened`, `closed`, or `merged`) or all of them (`all`). -The pagination parameters `page` and `per_page` can be used to restrict the list of merge requests. - -``` -GET /projects/:id/merge_requests -GET /projects/:id/merge_requests?state=opened -GET /projects/:id/merge_requests?state=all -``` - -Parameters: - -- `id` (required) - The ID of a project -- `state` (optional) - Return `all` requests or just those that are `merged`, `opened` or `closed` -- `order_by` (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - -```json -[ - { - "id": 1, - "iid": 1, - "target_branch": "master", - "source_branch": "test1", - "project_id": 3, - "title": "test1", - "state": "opened", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "assignee": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "description":"fixed login page css paddings" - } -] -``` - -## Get single MR - -Shows information about a single merge request. - -``` -GET /projects/:id/merge_request/:merge_request_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of MR - -```json -{ - "id": 1, - "iid": 1, - "target_branch": "master", - "source_branch": "test1", - "project_id": 3, - "title": "test1", - "state": "merged", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "assignee": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "description":"fixed login page css paddings" -} -``` - -## Get single MR changes - -Shows information about the merge request including its files and changes - -``` -GET /projects/:id/merge_request/:merge_request_id/changes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of MR - -```json -{ - "id": 21, - "iid": 1, - "project_id": 4, - "title": "Blanditiis beatae suscipit hic assumenda et molestias nisi asperiores repellat et.", - "description": "Qui voluptatibus placeat ipsa alias quasi. Deleniti rem ut sint. Optio velit qui distinctio.", - "state": "reopened", - "created_at": "2015-02-02T19:49:39.159Z", - "updated_at": "2015-02-02T20:08:49.959Z", - "target_branch": "secret_token", - "source_branch": "version-1-9", - "upvotes": 0, - "downvotes": 0, - "author": { - "name": "Chad Hamill", - "username": "jarrett", - "id": 5, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/b95567800f828948baf5f4160ebb2473?s=40&d=identicon" - }, - "assignee": { - "name": "Administrator", - "username": "root", - "id": 1, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon" - }, - "source_project_id": 4, - "target_project_id": 4, - "labels": [ ], - "milestone": { - "id": 5, - "iid": 1, - "project_id": 4, - "title": "v2.0", - "description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.", - "state": "closed", - "created_at": "2015-02-02T19:49:26.013Z", - "updated_at": "2015-02-02T19:49:26.013Z", - "due_date": null - }, - "files": [ - { - "old_path": "VERSION", - "new_path": "VERSION", - "a_mode": "100644", - "b_mode": "100644", - "diff": "--- a/VERSION\ +++ b/VERSION\ @@ -1 +1 @@\ -1.9.7\ +1.9.8", - "new_file": false, - "renamed_file": false, - "deleted_file": false - } - ] -} -``` - -## Create MR - -Creates a new merge request. - -``` -POST /projects/:id/merge_requests -``` - -Parameters: - -- `id` (required) - The ID of a project -- `source_branch` (required) - The source branch -- `target_branch` (required) - The target branch -- `assignee_id` (optional) - Assignee user ID -- `title` (required) - Title of MR -- `description` (optional) - Description of MR -- `target_project_id` (optional) - The target project (numeric id) - -```json -{ - "id": 1, - "target_branch": "master", - "source_branch": "test1", - "project_id": 3, - "title": "test1", - "state": "opened", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "assignee": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "description":"fixed login page css paddings" -} -``` - -If the operation is successful, 200 and the newly created merge request is returned. -If an error occurs, an error number and a message explaining the reason is returned. - -## Update MR - -Updates an existing merge request. You can change branches, title, or even close the MR. - -``` -PUT /projects/:id/merge_request/:merge_request_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - ID of MR -- `source_branch` - The source branch -- `target_branch` - The target branch -- `assignee_id` - Assignee user ID -- `title` - Title of MR -- `description` - Description of MR -- `state_event` - New state (close|reopen|merge) - -```json -{ - "id": 1, - "target_branch": "master", - "source_branch": "test1", - "project_id": 3, - "title": "test1", - "description": "description1", - "state": "opened", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "assignee": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - } -} -``` - -If the operation is successful, 200 and the updated merge request is returned. -If an error occurs, an error number and a message explaining the reason is returned. - -## Accept MR - -Merge changes submitted with MR using this API. - -If merge success you get `200 OK`. - -If it has some conflicts and can not be merged - you get 405 and error message 'Branch cannot be merged' - -If merge request is already merged or closed - you get 405 and error message 'Method Not Allowed' - -If you don't have permissions to accept this merge request - you'll get a 401 - -``` -PUT /projects/:id/merge_request/:merge_request_id/merge -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - ID of MR -- `merge_commit_message` (optional) - Custom merge commit message - -```json -{ - "id": 1, - "target_branch": "master", - "source_branch": "test1", - "project_id": 3, - "title": "test1", - "state": "merged", - "upvotes": 0, - "downvotes": 0, - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - }, - "assignee": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2012-04-29T08:46:00Z" - } -} -``` - -## Post comment to MR - -Adds a comment to a merge request. - -``` -POST /projects/:id/merge_request/:merge_request_id/comments -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - ID of merge request -- `note` (required) - Text of comment - -```json -{ - "author": { - "id": 1, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "blocked": false, - "created_at": "2012-04-29T08:46:00Z" - }, - "note": "text1" -} -``` - -## Get the comments on a MR - -Gets all the comments associated with a merge request. - -``` -GET /projects/:id/merge_request/:merge_request_id/comments -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - ID of merge request - -```json -[ - { - "note": "this is the 1st comment on the 2merge merge request", - "author": { - "id": 11, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2014-03-06T08:17:35.000Z" - } - }, - { - "note": "Status changed to closed", - "author": { - "id": 11, - "username": "admin", - "email": "admin@example.com", - "name": "Administrator", - "state": "active", - "created_at": "2014-03-06T08:17:35.000Z" - } - } -] -``` - -## Comments on issues - -Comments are done via the notes resource. diff --git a/doc/api/milestones.md b/doc/api/milestones.md deleted file mode 100644 index d48b3bcce8a..00000000000 --- a/doc/api/milestones.md +++ /dev/null @@ -1,87 +0,0 @@ -# Milestones - -## List project milestones - -Returns a list of project milestones. - -``` -GET /projects/:id/milestones -``` - -```json -[ - { - "id": 12, - "iid": 3, - "project_id": 16, - "title": "10.0", - "description": "Version", - "due_date": "2013-11-29", - "state": "active", - "updated_at": "2013-10-02T09:24:18Z", - "created_at": "2013-10-02T09:24:18Z" - } -] -``` - -Parameters: - -- `id` (required) - The ID of a project - -## Get single milestone - -Gets a single project milestone. - -``` -GET /projects/:id/milestones/:milestone_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `milestone_id` (required) - The ID of a project milestone - -## Create new milestone - -Creates a new project milestone. - -``` -POST /projects/:id/milestones -``` - -Parameters: - -- `id` (required) - The ID of a project -- `title` (required) - The title of an milestone -- `description` (optional) - The description of the milestone -- `due_date` (optional) - The due date of the milestone - -## Edit milestone - -Updates an existing project milestone. - -``` -PUT /projects/:id/milestones/:milestone_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `milestone_id` (required) - The ID of a project milestone -- `title` (optional) - The title of a milestone -- `description` (optional) - The description of a milestone -- `due_date` (optional) - The due date of the milestone -- `state_event` (optional) - The state event of the milestone (close|activate) - -## Get all issues assigned to a single milestone - -Gets all issues assigned to a single project milestone. - -``` -GET /projects/:id/milestones/:milestone_id/issues -``` - -Parameters: - -- `id` (required) - The ID of a project -- `milestone_id` (required) - The ID of a project milestone diff --git a/doc/api/notes.md b/doc/api/notes.md deleted file mode 100644 index ee2f9fa0eac..00000000000 --- a/doc/api/notes.md +++ /dev/null @@ -1,246 +0,0 @@ -# Notes - -Notes are comments on snippets, issues or merge requests. - -## Issues - -### List project issue notes - -Gets a list of all notes for a single issue. - -``` -GET /projects/:id/issues/:issue_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of an issue - -```json -[ - { - "id": 302, - "body": "Status changed to closed", - "attachment": null, - "author": { - "id": 1, - "username": "pipin", - "email": "admin@example.com", - "name": "Pip", - "state": "active", - "created_at": "2013-09-30T13:46:01Z" - }, - "created_at": "2013-10-02T09:22:45Z" - }, - { - "id": 305, - "body": "Text of the comment\r\n", - "attachment": null, - "author": { - "id": 1, - "username": "pipin", - "email": "admin@example.com", - "name": "Pip", - "state": "active", - "created_at": "2013-09-30T13:46:01Z" - }, - "created_at": "2013-10-02T09:56:03Z" - } -] -``` - -### Get single issue note - -Returns a single note for a specific project issue - -``` -GET /projects/:id/issues/:issue_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of a project issue -- `note_id` (required) - The ID of an issue note - -### Create new issue note - -Creates a new note to a single project issue. - -``` -POST /projects/:id/issues/:issue_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of an issue -- `body` (required) - The content of a note - -### Modify existing issue note - -Modify existing note of an issue. - -``` -PUT /projects/:id/issues/:issue_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `issue_id` (required) - The ID of an issue -- `note_id` (required) - The ID of a note -- `body` (required) - The content of a note - -## Snippets - -### List all snippet notes - -Gets a list of all notes for a single snippet. Snippet notes are comments users can post to a snippet. - -``` -GET /projects/:id/snippets/:snippet_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project snippet - -### Get single snippet note - -Returns a single note for a given snippet. - -``` -GET /projects/:id/snippets/:snippet_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project snippet -- `note_id` (required) - The ID of an snippet note - -```json -{ - "id": 52, - "title": "Snippet", - "file_name": "snippet.rb", - "author": { - "id": 1, - "username": "pipin", - "email": "admin@example.com", - "name": "Pip", - "state": "active", - "created_at": "2013-09-30T13:46:01Z" - }, - "expires_at": null, - "updated_at": "2013-10-02T07:34:20Z", - "created_at": "2013-10-02T07:34:20Z" -} -``` - -### Create new snippet note - -Creates a new note for a single snippet. Snippet notes are comments users can post to a snippet. - -``` -POST /projects/:id/snippets/:snippet_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a snippet -- `body` (required) - The content of a note - -### Modify existing snippet note - -Modify existing note of a snippet. - -``` -PUT /projects/:id/snippets/:snippet_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a snippet -- `note_id` (required) - The ID of a note -- `body` (required) - The content of a note - -## Merge Requests - -### List all merge request notes - -Gets a list of all notes for a single merge request. - -``` -GET /projects/:id/merge_requests/:merge_request_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of a project merge request - -### Get single merge request note - -Returns a single note for a given merge request. - -``` -GET /projects/:id/merge_requests/:merge_request_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of a project merge request -- `note_id` (required) - The ID of a merge request note - -```json -{ - "id": 301, - "body": "Comment for MR", - "attachment": null, - "author": { - "id": 1, - "username": "pipin", - "email": "admin@example.com", - "name": "Pip", - "state": "active", - "created_at": "2013-09-30T13:46:01Z" - }, - "created_at": "2013-10-02T08:57:14Z" -} -``` - -### Create new merge request note - -Creates a new note for a single merge request. - -``` -POST /projects/:id/merge_requests/:merge_request_id/notes -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of a merge request -- `body` (required) - The content of a note - -### Modify existing merge request note - -Modify existing note of a merge request. - -``` -PUT /projects/:id/merge_requests/:merge_request_id/notes/:note_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `merge_request_id` (required) - The ID of a merge request -- `note_id` (required) - The ID of a note -- `body` (required) - The content of a note diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md deleted file mode 100644 index d416a826f79..00000000000 --- a/doc/api/oauth2.md +++ /dev/null @@ -1,102 +0,0 @@ -# GitLab as an OAuth2 client - -This document is about using other OAuth authentication service providers to sign into GitLab. -If you want GitLab to be an OAuth authentication service provider to sign into other services please see the [Oauth2 provider documentation](../integration/oauth_provider.md). - -OAuth2 is a protocol that enables us to authenticate a user without requiring them to give their password. - -Before using the OAuth2 you should create an application in user's account. Each application gets a unique App ID and App Secret parameters. You should not share these. - -This functionality is based on [doorkeeper gem](https://github.com/doorkeeper-gem/doorkeeper) - -## Web Application Flow - -This flow is using for authentication from third-party web sites and is probably used the most. -It basically consists of an exchange of an authorization token for an access token. For more detailed info, check out the [RFC spec here](http://tools.ietf.org/html/rfc6749#section-4.1) - -This flow consists from 3 steps. - -### 1. Registering the client - -Create an application in user's account profile. - -### 2. Requesting authorization - -To request the authorization token, you should visit the `/oauth/authorize` endpoint. You can do that by visiting manually the URL: - -``` -http://localhost:3000/oauth/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code -``` - -Where REDIRECT_URI is the URL in your app where users will be sent after authorization. - -### 3. Requesting the access token - -To request the access token, you should use the returned code and exchange it for an access token. To do that you can use any HTTP client. In this case, I used rest-client: - -``` -parameters = 'client_id=APP_ID&client_secret=APP_SECRET&code=RETURNED_CODE&grant_type=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI' -RestClient.post 'http://localhost:3000/oauth/token', parameters - -# The response will be -{ - "access_token": "de6780bc506a0446309bd9362820ba8aed28aa506c71eedbe1c5c4f9dd350e54", - "token_type": "bearer", - "expires_in": 7200, - "refresh_token": "8257e65c97202ed1726cf9571600918f3bffb2544b26e00a61df9897668c33a1" -} -``` - -You can now make requests to the API with the access token returned. - -### Use the access token to access the API - -The access token allows you to make requests to the API on a behalf of a user. - -``` -GET https://localhost:3000/api/v3/user?access_token=OAUTH-TOKEN -``` - -Or you can put the token to the Authorization header: - -``` -curl -H "Authorization: Bearer OAUTH-TOKEN" https://localhost:3000/api/v3/user -``` - -## Resource Owner Password Credentials - -In this flow, a token is requested in exchange for the resource owner credentials (username and password). -The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g. the -client is part of the device operating system or a highly privileged application), and when other authorization grant types are not -available (such as an authorization code). - -Even though this grant type requires direct client access to the resource owner credentials, the resource owner credentials are used -for a single request and are exchanged for an access token. This grant type can eliminate the need for the client to store the -resource owner credentials for future use, by exchanging the credentials with a long-lived access token or refresh token. -You can do POST request to `/oauth/token` with parameters: - -``` -{ - "grant_type" : "password", - "username" : "user@example.com", - "password" : "sekret" -} -``` - -Then, you'll receive the access token back in the response: - -``` -{ - "access_token": "1f0af717251950dbd4d73154fdf0a474a5c5119adad999683f5b450c460726aa", - "token_type": "bearer", - "expires_in": 7200 -} -``` - -For testing you can use the oauth2 ruby gem: - -``` -client = OAuth2::Client.new('the_client_id', 'the_client_secret', :site => "http://example.com") -access_token = client.password.get_token('user@example.com', 'sekret') -puts access_token.token -``` diff --git a/doc/api/project_snippets.md b/doc/api/project_snippets.md deleted file mode 100644 index 50e134847c0..00000000000 --- a/doc/api/project_snippets.md +++ /dev/null @@ -1,103 +0,0 @@ -# Project snippets - -## List snippets - -Get a list of project snippets. - -``` -GET /projects/:id/snippets -``` - -Parameters: - -- `id` (required) - The ID of a project - -## Single snippet - -Get a single project snippet. - -``` -GET /projects/:id/snippets/:snippet_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project's snippet - -```json -{ - "id": 1, - "title": "test", - "file_name": "add.rb", - "author": { - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z" - }, - "expires_at": null, - "updated_at": "2012-06-28T10:52:04Z", - "created_at": "2012-06-28T10:52:04Z" -} -``` - -## Create new snippet - -Creates a new project snippet. The user must have permission to create new snippets. - -``` -POST /projects/:id/snippets -``` - -Parameters: - -- `id` (required) - The ID of a project -- `title` (required) - The title of a snippet -- `file_name` (required) - The name of a snippet file -- `code` (required) - The content of a snippet - -## Update snippet - -Updates an existing project snippet. The user must have permission to change an existing snippet. - -``` -PUT /projects/:id/snippets/:snippet_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project's snippet -- `title` (optional) - The title of a snippet -- `file_name` (optional) - The name of a snippet file -- `code` (optional) - The content of a snippet - -## Delete snippet - -Deletes an existing project snippet. This is an idempotent function and deleting a non-existent -snippet still returns a `200 OK` status code. - -``` -DELETE /projects/:id/snippets/:snippet_id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project's snippet - -## Snippet content - -Returns the raw project snippet as plain text. - -``` -GET /projects/:id/snippets/:snippet_id/raw -``` - -Parameters: - -- `id` (required) - The ID of a project -- `snippet_id` (required) - The ID of a project's snippet diff --git a/doc/api/projects.md b/doc/api/projects.md deleted file mode 100644 index 971fe96fb8e..00000000000 --- a/doc/api/projects.md +++ /dev/null @@ -1,713 +0,0 @@ -# Projects - - -### Project visibility level - -Project in GitLab has be either private, internal or public. -You can determine it by `visibility_level` field in project. - -Constants for project visibility levels are next: - -* Private. `visibility_level` is `0`. - Project access must be granted explicitly for each user. - -* Internal. `visibility_level` is `10`. - The project can be cloned by any logged in user. - -* Public. `visibility_level` is `20`. - The project can be cloned without any authentication. - - -## List projects - -Get a list of projects accessible by the authenticated user. - -``` -GET /projects -``` - -Parameters: - -- `archived` (optional) - if passed, limit by archived status -- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` -- `search` (optional) - Return list of authorized projects according to a search criteria - -```json -[ - { - "id": 4, - "description": null, - "default_branch": "master", - "public": false, - "visibility_level": 0, - "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git", - "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git", - "web_url": "http://example.com/diaspora/diaspora-client", - "tag_list": [ - "example", - "disapora client" - ], - "owner": { - "id": 3, - "name": "Diaspora", - "created_at": "2013-09-30T13: 46: 02Z" - }, - "name": "Diaspora Client", - "name_with_namespace": "Diaspora / Diaspora Client", - "path": "diaspora-client", - "path_with_namespace": "diaspora/diaspora-client", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "snippets_enabled": false, - "created_at": "2013-09-30T13: 46: 02Z", - "last_activity_at": "2013-09-30T13: 46: 02Z", - "creator_id": 3, - "namespace": { - "created_at": "2013-09-30T13: 46: 02Z", - "description": "", - "id": 3, - "name": "Diaspora", - "owner_id": 1, - "path": "diaspora", - "updated_at": "2013-09-30T13: 46: 02Z" - }, - "archived": false, - "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png" - }, - { - "id": 6, - "description": null, - "default_branch": "master", - "public": false, - "visibility_level": 0, - "ssh_url_to_repo": "git@example.com:brightbox/puppet.git", - "http_url_to_repo": "http://example.com/brightbox/puppet.git", - "web_url": "http://example.com/brightbox/puppet", - "tag_list": [ - "example", - "puppet" - ], - "owner": { - "id": 4, - "name": "Brightbox", - "created_at": "2013-09-30T13:46:02Z" - }, - "name": "Puppet", - "name_with_namespace": "Brightbox / Puppet", - "path": "puppet", - "path_with_namespace": "brightbox/puppet", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "snippets_enabled": false, - "created_at": "2013-09-30T13:46:02Z", - "last_activity_at": "2013-09-30T13:46:02Z", - "creator_id": 3, - "namespace": { - "created_at": "2013-09-30T13:46:02Z", - "description": "", - "id": 4, - "name": "Brightbox", - "owner_id": 1, - "path": "brightbox", - "updated_at": "2013-09-30T13:46:02Z" - }, - "archived": false, - "avatar_url": null - } -] -``` - -### List owned projects - -Get a list of projects which are owned by the authenticated user. - -``` -GET /projects/owned -``` - -Parameters: - -- `archived` (optional) - if passed, limit by archived status -- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` -- `search` (optional) - Return list of authorized projects according to a search criteria - -### List ALL projects - -Get a list of all GitLab projects (admin only). - -``` -GET /projects/all -``` - -Parameters: - -- `archived` (optional) - if passed, limit by archived status -- `order_by` (optional) - Return requests ordered by `id`, `name`, `path`, `created_at`, `updated_at` or `last_activity_at` fields. Default is `created_at` -- `sort` (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` -- `search` (optional) - Return list of authorized projects according to a search criteria - -### Get single project - -Get a specific project, identified by project ID or NAMESPACE/PROJECT_NAME, which is owned by the authenticated user. -If using namespaced projects call make sure that the NAMESPACE/PROJECT_NAME is URL-encoded, eg. `/api/v3/projects/diaspora%2Fdiaspora` (where `/` is represented by `%2F`). - -``` -GET /projects/:id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project - -```json -{ - "id": 3, - "description": null, - "default_branch": "master", - "public": false, - "visibility_level": 0, - "ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git", - "http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git", - "web_url": "http://example.com/diaspora/diaspora-project-site", - "tag_list": [ - "example", - "disapora project" - ], - "owner": { - "id": 3, - "name": "Diaspora", - "created_at": "2013-09-30T13: 46: 02Z" - }, - "name": "Diaspora Project Site", - "name_with_namespace": "Diaspora / Diaspora Project Site", - "path": "diaspora-project-site", - "path_with_namespace": "diaspora/diaspora-project-site", - "issues_enabled": true, - "merge_requests_enabled": true, - "wiki_enabled": true, - "snippets_enabled": false, - "created_at": "2013-09-30T13: 46: 02Z", - "last_activity_at": "2013-09-30T13: 46: 02Z", - "creator_id": 3, - "namespace": { - "created_at": "2013-09-30T13: 46: 02Z", - "description": "", - "id": 3, - "name": "Diaspora", - "owner_id": 1, - "path": "diaspora", - "updated_at": "2013-09-30T13: 46: 02Z" - }, - "permissions": { - "project_access": { - "access_level": 10, - "notification_level": 3 - }, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - }, - "archived": false, - "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png" -} -``` - -### Get project events - -Get the events for the specified project. -Sorted from newest to latest - -``` -GET /projects/:id/events -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project - -```json -[ - { - "title": null, - "project_id": 15, - "action_name": "closed", - "target_id": 830, - "target_type": "Issue", - "author_id": 1, - "author_username": "john", - "data": null, - "target_title": "Public project search field" - }, - { - "title": null, - "project_id": 15, - "action_name": "opened", - "target_id": null, - "target_type": null, - "author_id": 1, - "author_username": "john", - "data": { - "before": "50d4420237a9de7be1304607147aec22e4a14af7", - "after": "c5feabde2d8cd023215af4d2ceeb7a64839fc428", - "ref": "refs/heads/master", - "user_id": 1, - "user_name": "Dmitriy Zaporozhets", - "repository": { - "name": "gitlabhq", - "url": "git@dev.gitlab.org:gitlab/gitlabhq.git", - "description": "GitLab: self hosted Git management software. \r\nDistributed under the MIT License.", - "homepage": "https://dev.gitlab.org/gitlab/gitlabhq" - }, - "commits": [ - { - "id": "c5feabde2d8cd023215af4d2ceeb7a64839fc428", - "message": "Add simple search to projects in public area", - "timestamp": "2013-05-13T18:18:08+00:00", - "url": "https://dev.gitlab.org/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428", - "author": { - "name": "Dmitriy Zaporozhets", - "email": "dmitriy.zaporozhets@gmail.com" - } - } - ], - "total_commits_count": 1 - }, - "target_title": null - }, - { - "title": null, - "project_id": 15, - "action_name": "closed", - "target_id": 840, - "target_type": "Issue", - "author_id": 1, - "author_username": "john", - "data": null, - "target_title": "Finish & merge Code search PR" - } -] -``` - -### Create project - -Creates a new project owned by the authenticated user. - -``` -POST /projects -``` - -Parameters: - -- `name` (required) - new project name -- `path` (optional) - custom repository name for new project. By default generated based on name -- `namespace_id` (optional) - namespace for the new project (defaults to user) -- `description` (optional) - short project description -- `issues_enabled` (optional) -- `merge_requests_enabled` (optional) -- `wiki_enabled` (optional) -- `snippets_enabled` (optional) -- `public` (optional) - if `true` same as setting visibility_level = 20 -- `visibility_level` (optional) -- `import_url` (optional) - -### Create project for user - -Creates a new project owned by the specified user. Available only for admins. - -``` -POST /projects/user/:user_id -``` - -Parameters: - -- `user_id` (required) - user_id of owner -- `name` (required) - new project name -- `description` (optional) - short project description -- `default_branch` (optional) - 'master' by default -- `issues_enabled` (optional) -- `merge_requests_enabled` (optional) -- `wiki_enabled` (optional) -- `snippets_enabled` (optional) -- `public` (optional) - if `true` same as setting visibility_level = 20 -- `visibility_level` (optional) -- `import_url` (optional) - -### Edit project - -Updates an existing project - -``` -PUT /projects/:id -``` - -Parameters: - -- `id` (required) - The ID of a project -- `name` (optional) - project name -- `path` (optional) - repository name for project -- `description` (optional) - short project description -- `default_branch` (optional) -- `issues_enabled` (optional) -- `merge_requests_enabled` (optional) -- `wiki_enabled` (optional) -- `snippets_enabled` (optional) -- `public` (optional) - if `true` same as setting visibility_level = 20 -- `visibility_level` (optional) - -On success, method returns 200 with the updated project. If parameters are -invalid, 400 is returned. - -### Fork project - -Forks a project into the user namespace of the authenticated user. - -``` -POST /projects/fork/:id -``` - -Parameters: - -- `id` (required) - The ID of the project to be forked - -### Remove project - -Removes a project including all associated resources (issues, merge requests etc.) - -``` -DELETE /projects/:id -``` - -Parameters: - -- `id` (required) - The ID of a project - -## Team members - -### List project team members - -Get a list of a project's team members. - -``` -GET /projects/:id/members -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `query` (optional) - Query string to search for members - -### Get project team member - -Gets a project team member. - -``` -GET /projects/:id/members/:user_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `user_id` (required) - The ID of a user - -```json -{ - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z", - "access_level": 40 -} -``` - -### Add project team member - -Adds a user to a project team. This is an idempotent method and can be called multiple times -with the same parameters. Adding team membership to a user that is already a member does not -affect the existing membership. - -``` -POST /projects/:id/members -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `user_id` (required) - The ID of a user to add -- `access_level` (required) - Project access level - -### Edit project team member - -Updates a project team member to a specified access level. - -``` -PUT /projects/:id/members/:user_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `user_id` (required) - The ID of a team member -- `access_level` (required) - Project access level - -### Remove project team member - -Removes a user from a project team. - -``` -DELETE /projects/:id/members/:user_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `user_id` (required) - The ID of a team member - -This method is idempotent and can be called multiple times with the same parameters. -Revoking team membership for a user who is not currently a team member is considered success. -Please note that the returned JSON currently differs slightly. Thus you should not -rely on the returned JSON structure. - -## Hooks - -### List project hooks - -Get a list of project hooks. - -``` -GET /projects/:id/hooks -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project - -### Get project hook - -Get a specific hook for a project. - -``` -GET /projects/:id/hooks/:hook_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `hook_id` (required) - The ID of a project hook - -```json -{ - "id": 1, - "url": "http://example.com/hook", - "project_id": 3, - "push_events": "true", - "issues_events": "true", - "merge_requests_events": "true", - "created_at": "2012-10-12T17:04:47Z" -} -``` - -### Add project hook - -Adds a hook to a specified project. - -``` -POST /projects/:id/hooks -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `url` (required) - The hook URL -- `push_events` - Trigger hook on push events -- `issues_events` - Trigger hook on issues events -- `merge_requests_events` - Trigger hook on merge_requests events -- `tag_push_events` - Trigger hook on push_tag events - -### Edit project hook - -Edits a hook for a specified project. - -``` -PUT /projects/:id/hooks/:hook_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `hook_id` (required) - The ID of a project hook -- `url` (required) - The hook URL -- `push_events` - Trigger hook on push events -- `issues_events` - Trigger hook on issues events -- `merge_requests_events` - Trigger hook on merge_requests events -- `tag_push_events` - Trigger hook on push_tag events - -### Delete project hook - -Removes a hook from a project. This is an idempotent method and can be called multiple times. -Either the hook is available or not. - -``` -DELETE /projects/:id/hooks/:hook_id -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `hook_id` (required) - The ID of hook to delete - -Note the JSON response differs if the hook is available or not. If the project hook -is available before it is returned in the JSON response or an empty response is returned. - -## Branches - -### List branches - -Lists all branches of a project. - -``` -GET /projects/:id/repository/branches -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project - -```json -[ - { - "name": "async", - "commit": { - "id": "a2b702edecdf41f07b42653eb1abe30ce98b9fca", - "parents": [ - { - "id": "3f94fc7c85061973edc9906ae170cc269b07ca55" - } - ], - "tree": "c68537c6534a02cc2b176ca1549f4ffa190b58ee", - "message": "give Caolan credit where it's due (up top)", - "author": { - "name": "Jeremy Ashkenas", - "email": "jashkenas@example.com" - }, - "committer": { - "name": "Jeremy Ashkenas", - "email": "jashkenas@example.com" - }, - "authored_date": "2010-12-08T21:28:50+00:00", - "committed_date": "2010-12-08T21:28:50+00:00" - }, - "protected": false - }, - { - "name": "gh-pages", - "commit": { - "id": "101c10a60019fe870d21868835f65c25d64968fc", - "parents": [ - { - "id": "9c15d2e26945a665131af5d7b6d30a06ba338aaa" - } - ], - "tree": "fb5cc9d45da3014b17a876ad539976a0fb9b352a", - "message": "Underscore.js 1.5.2", - "author": { - "name": "Jeremy Ashkenas", - "email": "jashkenas@example.com" - }, - "committer": { - "name": "Jeremy Ashkenas", - "email": "jashkenas@example.com" - }, - "authored_date": "2013-09-07T12: 58: 21+00: 00", - "committed_date": "2013-09-07T12: 58: 21+00: 00" - }, - "protected": false - } -] -``` - -### List single branch - -Lists a specific branch of a project. - -``` -GET /projects/:id/repository/branches/:branch -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `branch` (required) - The name of the branch. - -### Protect single branch - -Protects a single branch of a project. - -``` -PUT /projects/:id/repository/branches/:branch/protect -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `branch` (required) - The name of the branch. - -### Unprotect single branch - -Unprotects a single branch of a project. - -``` -PUT /projects/:id/repository/branches/:branch/unprotect -``` - -Parameters: - -- `id` (required) - The ID or NAMESPACE/PROJECT_NAME of a project -- `branch` (required) - The name of the branch. - -## Admin fork relation - -Allows modification of the forked relationship between existing projects. Available only for admins. - -### Create a forked from/to relation between existing projects. - -``` -POST /projects/:id/fork/:forked_from_id -``` - -Parameters: - -- `id` (required) - The ID of the project -- `forked_from_id:` (required) - The ID of the project that was forked from - -### Delete an existing forked from relationship - -``` -DELETE /projects/:id/fork -``` - -Parameter: - -- `id` (required) - The ID of the project - -## Search for projects by name - -Search for projects by name which are accessible to the authenticated user. - -``` -GET /projects/search/:query -``` - -Parameters: - -- `query` (required) - A string contained in the project name -- `per_page` (optional) - number of projects to return per page -- `page` (optional) - the page to retrieve -- `order_by` (optional) - Return requests ordered by `id`, `name`, `created_at` or `last_activity_at` fields -- `sort` (optional) - Return requests sorted in `asc` or `desc` order diff --git a/doc/api/repositories.md b/doc/api/repositories.md deleted file mode 100644 index 33167453802..00000000000 --- a/doc/api/repositories.md +++ /dev/null @@ -1,252 +0,0 @@ -# Repositories - -## List project repository tags - -Get a list of repository tags from a project, sorted by name in reverse alphabetical order. - -``` -GET /projects/:id/repository/tags -``` - -Parameters: - -- `id` (required) - The ID of a project - -```json -[ - { - "commit": { - "author_name": "John Smith", - "author_email": "john@example.com", - "authored_date": "2012-05-28T04:42:42-07:00", - "committed_date": "2012-05-28T04:42:42-07:00", - "committer_name": "Jack Smith", - "committer_email": "jack@example.com", - "id": "2695effb5807a22ff3d138d593fd856244e155e7", - "message": "Initial commit", - "parents_ids": [ - "2a4b78934375d7f53875269ffd4f45fd83a84ebe" - ] - }, - "name": "v1.0.0", - "message": null - } -] -``` - -## Create a new tag - -Creates new tag in the repository that points to the supplied ref. - -``` -POST /projects/:id/repository/tags -``` - -Parameters: - -- `id` (required) - The ID of a project -- `tag_name` (required) - The name of a tag -- `ref` (required) - Create tag using commit SHA, another tag name, or branch name. -- `message` (optional) - Creates annotated tag. - -```json -{ - "commit": { - "author_name": "John Smith", - "author_email": "john@example.com", - "authored_date": "2012-05-28T04:42:42-07:00", - "committed_date": "2012-05-28T04:42:42-07:00", - "committer_name": "Jack Smith", - "committer_email": "jack@example.com", - "id": "2695effb5807a22ff3d138d593fd856244e155e7", - "message": "Initial commit", - "parents_ids": [ - "2a4b78934375d7f53875269ffd4f45fd83a84ebe" - ] - }, - "name": "v1.0.0", - "message": null -} -``` -The message will be `nil` when creating a lightweight tag otherwise -it will contain the annotation. - -It returns 200 if the operation succeed. In case of an error, -405 with an explaining error message is returned. - -## List repository tree - -Get a list of repository files and directories in a project. - -``` -GET /projects/:id/repository/tree -``` - -Parameters: - -- `id` (required) - The ID of a project -- `path` (optional) - The path inside repository. Used to get contend of subdirectories -- `ref_name` (optional) - The name of a repository branch or tag or if not given the default branch - -```json -[ - { - "name": "assets", - "type": "tree", - "mode": "040000", - "id": "6229c43a7e16fcc7e95f923f8ddadb8281d9c6c6" - }, - { - "name": "contexts", - "type": "tree", - "mode": "040000", - "id": "faf1cdf33feadc7973118ca42d35f1e62977e91f" - }, - { - "name": "controllers", - "type": "tree", - "mode": "040000", - "id": "95633e8d258bf3dfba3a5268fb8440d263218d74" - }, - { - "name": "Rakefile", - "type": "blob", - "mode": "100644", - "id": "35b2f05cbb4566b71b34554cf184a9d0bd9d46d6" - }, - { - "name": "VERSION", - "type": "blob", - "mode": "100644", - "id": "803e4a4f3727286c3093c63870c2b6524d30ec4f" - }, - { - "name": "config.ru", - "type": "blob", - "mode": "100644", - "id": "dfd2d862237323aa599be31b473d70a8a817943b" - } -] -``` - -## Raw file content - -Get the raw file contents for a file by commit SHA and path. - -``` -GET /projects/:id/repository/blobs/:sha -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The commit or branch name -- `filepath` (required) - The path the file - -## Raw blob content - -Get the raw file contents for a blob by blob SHA. - -``` -GET /projects/:id/repository/raw_blobs/:sha -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (required) - The blob SHA - -## Get file archive - -Get an archive of the repository - -``` -GET /projects/:id/repository/archive -``` - -Parameters: - -- `id` (required) - The ID of a project -- `sha` (optional) - The commit SHA to download defaults to the tip of the default branch - -## Compare branches, tags or commits - -``` -GET /projects/:id/repository/compare -``` - -Parameters: - -- `id` (required) - The ID of a project -- `from` (required) - the commit SHA or branch name -- `to` (required) - the commit SHA or branch name - -``` -GET /projects/:id/repository/compare?from=master&to=feature -``` - -Response: - -```json - -{ - "commit": { - "id": "12d65c8dd2b2676fa3ac47d955accc085a37a9c1", - "short_id": "12d65c8dd2b", - "title": "JS fix", - "author_name": "Dmitriy Zaporozhets", - "author_email": "dmitriy.zaporozhets@gmail.com", - "created_at": "2014-02-27T10:27:00+02:00" - }, - "commits": [{ - "id": "12d65c8dd2b2676fa3ac47d955accc085a37a9c1", - "short_id": "12d65c8dd2b", - "title": "JS fix", - "author_name": "Dmitriy Zaporozhets", - "author_email": "dmitriy.zaporozhets@gmail.com", - "created_at": "2014-02-27T10:27:00+02:00" - }], - "diffs": [{ - "old_path": "files/js/application.js", - "new_path": "files/js/application.js", - "a_mode": null, - "b_mode": "100644", - "diff": "--- a/files/js/application.js\n+++ b/files/js/application.js\n@@ -24,8 +24,10 @@\n //= require g.raphael-min\n //= require g.bar-min\n //= require branch-graph\n-//= require highlightjs.min\n-//= require ace/ace\n //= require_tree .\n //= require d3\n //= require underscore\n+\n+function fix() { \n+ alert(\"Fixed\")\n+}", - "new_file": false, - "renamed_file": false, - "deleted_file": false - }], - "compare_timeout": false, - "compare_same_ref": false -} -``` - -## Contributors - -Get repository contributors list - -``` -GET /projects/:id/repository/contributors -``` - -Parameters: - -- `id` (required) - The ID of a project - -Response: - -``` -[{ - "name": "Dmitriy Zaporozhets", - "email": "dmitriy.zaporozhets@gmail.com", - "commits": 117, - "additions": 2097, - "deletions": 517 -}, { - "name": "Jacob Vosmaer", - "email": "contact@jacobvosmaer.nl", - "commits": 33, - "additions": 338, - "deletions": 244 -}] -``` diff --git a/doc/api/repository_files.md b/doc/api/repository_files.md deleted file mode 100644 index 25311b07107..00000000000 --- a/doc/api/repository_files.md +++ /dev/null @@ -1,109 +0,0 @@ -# Repository files - -**CRUD for repository files** - -**Create, read, update and delete repository files using this API** - -## Get file from repository - -Allows you to receive information about file in repository like name, size, content. Note that file content is Base64 encoded. - -``` -GET /projects/:id/repository/files -``` - -Example response: - -```json -{ - "file_name": "key.rb", - "file_path": "app/models/key.rb", - "size": 1476, - "encoding": "base64", - "content": "IyA9PSBTY2hlbWEgSW5mb3...", - "ref": "master", - "blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83", - "commit_id": "d5a3ff139356ce33e37e73add446f16869741b50" -} -``` - -Parameters: - -- `file_path` (required) - Full path to new file. Ex. lib/class.rb -- `ref` (required) - The name of branch, tag or commit - -## Create new file in repository - -``` -POST /projects/:id/repository/files -``` - -Example response: - -```json -{ - "file_name": "app/project.rb", - "branch_name": "master" -} -``` - -Parameters: - -- `file_path` (required) - Full path to new file. Ex. lib/class.rb -- `branch_name` (required) - The name of branch -- `encoding` (optional) - 'text' or 'base64'. Text is default. -- `content` (required) - File content -- `commit_message` (required) - Commit message - -## Update existing file in repository - -``` -PUT /projects/:id/repository/files -``` - -Example response: - -```json -{ - "file_name": "app/project.rb", - "branch_name": "master" -} -``` - -Parameters: - -- `file_path` (required) - Full path to file. Ex. lib/class.rb -- `branch_name` (required) - The name of branch -- `encoding` (optional) - 'text' or 'base64'. Text is default. -- `content` (required) - New file content -- `commit_message` (required) - Commit message - -If the commit fails for any reason we return a 400 error with a non-specific -error message. Possible causes for a failed commit include: -- the `file_path` contained `/../` (attempted directory traversal); -- the new file contents were identical to the current file contents, i.e. the - user tried to make an empty commit; -- the branch was updated by a Git push while the file edit was in progress. - -Currently gitlab-shell has a boolean return code, preventing GitLab from specifying the error. - -## Delete existing file in repository - -``` -DELETE /projects/:id/repository/files -``` - -Example response: - -```json -{ - "file_name": "app/project.rb", - "branch_name": "master" -} -``` - -Parameters: - -- `file_path` (required) - Full path to file. Ex. lib/class.rb -- `branch_name` (required) - The name of branch -- `commit_message` (required) - Commit message diff --git a/doc/api/services.md b/doc/api/services.md deleted file mode 100644 index cbf767d1b25..00000000000 --- a/doc/api/services.md +++ /dev/null @@ -1,46 +0,0 @@ -# Services - -## GitLab CI - -### Edit GitLab CI service - -Set GitLab CI service for a project. - -``` -PUT /projects/:id/services/gitlab-ci -``` - -Parameters: - -- `token` (required) - CI project token -- `project_url` (required) - CI project URL - -### Delete GitLab CI service - -Delete GitLab CI service settings for a project. - -``` -DELETE /projects/:id/services/gitlab-ci -``` - -## HipChat - -### Edit HipChat service - -Set HipChat service for project. - -``` -PUT /projects/:id/services/hipchat -``` -Parameters: - -- `token` (required) - HipChat token -- `room` (required) - HipChat room name - -### Delete HipChat service - -Delete HipChat service for a project. - -``` -DELETE /projects/:id/services/hipchat -``` diff --git a/doc/api/session.md b/doc/api/session.md deleted file mode 100644 index 47c1c8a7a49..00000000000 --- a/doc/api/session.md +++ /dev/null @@ -1,39 +0,0 @@ -# Session - -Login to get private token - -``` -POST /session -``` - -Parameters: - -- `login` (required) - The login of user -- `email` (required if login missing) - The email of user -- `password` (required) - Valid password - -**You can login with both GitLab and LDAP credentials now** - - -```json -{ - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "private_token": "dd34asd13as", - "blocked": false, - "created_at": "2012-05-23T08:00:58Z", - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "dark_scheme": false, - "theme_id": 1, - "is_admin": false, - "can_create_group": true, - "can_create_team": true, - "can_create_project": true -} -``` diff --git a/doc/api/system_hooks.md b/doc/api/system_hooks.md deleted file mode 100644 index f9637d8a6c4..00000000000 --- a/doc/api/system_hooks.md +++ /dev/null @@ -1,70 +0,0 @@ -# System hooks - -All methods require admin authorization. - -The URL endpoint of the system hooks can be configured in [the admin area under hooks](/admin/hooks). - -## List system hooks - -Get list of system hooks - -``` -GET /hooks -``` - -Parameters: - -- **none** - -```json -[ - { - "id": 3, - "url": "http://example.com/hook", - "created_at": "2013-10-02T10:15:31Z" - } -] -``` - -## Add new system hook hook - -``` -POST /hooks -``` - -Parameters: - -- `url` (required) - The hook URL - -## Test system hook - -``` -GET /hooks/:id -``` - -Parameters: - -- `id` (required) - The ID of hook - -```json -{ - "event_name": "project_create", - "name": "Ruby", - "path": "ruby", - "project_id": 1, - "owner_name": "Someone", - "owner_email": "example@gitlabhq.com" -} -``` - -## Delete system hook - -Deletes a system hook. This is an idempotent API function and returns `200 OK` even if the hook is not available. If the hook is deleted it is also returned as JSON. - -``` -DELETE /hooks/:id -``` - -Parameters: - -- `id` (required) - The ID of hook diff --git a/doc/api/users.md b/doc/api/users.md deleted file mode 100644 index a8b7685b503..00000000000 --- a/doc/api/users.md +++ /dev/null @@ -1,394 +0,0 @@ -# Users - -## List users - -Get a list of users. - -This function takes pagination parameters `page` and `per_page` to restrict the list of users. - -### For normal users - -``` -GET /users -``` - -```json -[ - { - "id": 1, - "username": "john_smith", - "name": "John Smith", - "state": "active", - "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg", - }, - { - "id": 2, - "username": "jack_smith", - "name": "Jack Smith", - "state": "blocked", - "avatar_url": "http://gravatar.com/../e32131cd8.jpeg", - } -] -``` - -### For admins - -``` -GET /users -``` - -```json -[ - { - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z", - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "extern_uid": "john.smith", - "provider": "provider_name", - "theme_id": 1, - "color_scheme_id": 2, - "is_admin": false, - "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg", - "can_create_group": true - }, - { - "id": 2, - "username": "jack_smith", - "email": "jack@example.com", - "name": "Jack Smith", - "state": "blocked", - "created_at": "2012-05-23T08:01:01Z", - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "extern_uid": "jack.smith", - "provider": "provider_name", - "theme_id": 1, - "color_scheme_id": 3, - "is_admin": false, - "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg", - "can_create_group": true, - "can_create_project": true, - "projects_limit": 100 - } -] -``` - -You can search for users by email or username with: `/users?search=John` - -Also see `def search query` in `app/models/user.rb`. - -## Single user - -Get a single user. - -### For user - -``` -GET /users/:id -``` - -Parameters: - -- `id` (required) - The ID of a user - -```json -{ - "id": 1, - "username": "john_smith", - "name": "John Smith", - "state": "active", - "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg", -} -``` - -### For admin - -``` -GET /users/:id -``` - -Parameters: - -- `id` (required) - The ID of a user - -```json -{ - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "state": "active", - "created_at": "2012-05-23T08:00:58Z", - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "extern_uid": "john.smith", - "provider": "provider_name", - "theme_id": 1, - "color_scheme_id": 2, - "is_admin": false, - "can_create_group": true, - "can_create_project": true, - "projects_limit": 100 -} -``` - -## User creation - -Creates a new user. Note only administrators can create new users. - -``` -POST /users -``` - -Parameters: - -- `email` (required) - Email -- `password` (required) - Password -- `username` (required) - Username -- `name` (required) - Name -- `skype` (optional) - Skype ID -- `linkedin` (optional) - LinkedIn -- `twitter` (optional) - Twitter account -- `website_url` (optional) - Website URL -- `projects_limit` (optional) - Number of projects user can create -- `extern_uid` (optional) - External UID -- `provider` (optional) - External provider name -- `bio` (optional) - User's biography -- `admin` (optional) - User is admin - true or false (default) -- `can_create_group` (optional) - User can create groups - true or false -- `confirm` (optional) - Require confirmation - true (default) or false - -## User modification - -Modifies an existing user. Only administrators can change attributes of a user. - -``` -PUT /users/:id -``` - -Parameters: - -- `email` - Email -- `username` - Username -- `name` - Name -- `password` - Password -- `skype` - Skype ID -- `linkedin` - LinkedIn -- `twitter` - Twitter account -- `website_url` - Website URL -- `projects_limit` - Limit projects each user can create -- `extern_uid` - External UID -- `provider` - External provider name -- `bio` - User's biography -- `admin` (optional) - User is admin - true or false (default) -- `can_create_group` (optional) - User can create groups - true or false - -Note, at the moment this method does only return a 404 error, -even in cases where a 409 (Conflict) would be more appropriate, -e.g. when renaming the email address to some existing one. - -## User deletion - -Deletes a user. Available only for administrators. -This is an idempotent function, calling this function for a non-existent user id -still returns a status code `200 OK`. -The JSON response differs if the user was actually deleted or not. -In the former the user is returned and in the latter not. - -``` -DELETE /users/:id -``` - -Parameters: - -- `id` (required) - The ID of the user - -## Current user - -Gets currently authenticated user. - -``` -GET /user -``` - -```json -{ - "id": 1, - "username": "john_smith", - "email": "john@example.com", - "name": "John Smith", - "private_token": "dd34asd13as", - "state": "active", - "created_at": "2012-05-23T08:00:58Z", - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "theme_id": 1, - "color_scheme_id": 2, - "is_admin": false, - "can_create_group": true, - "can_create_project": true, - "projects_limit": 100 -} -``` - -## List SSH keys - -Get a list of currently authenticated user's SSH keys. - -``` -GET /user/keys -``` - -```json -[ - { - "id": 1, - "title": "Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2014-08-01T14:47:39.080Z" - }, - { - "id": 3, - "title": "Another Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2014-08-01T14:47:39.080Z" - } -] -``` - -Parameters: - -- **none** - -## List SSH keys for user - -Get a list of a specified user's SSH keys. Available only for admin - -``` -GET /users/:uid/keys -``` - -Parameters: - -- `uid` (required) - id of specified user - -## Single SSH key - -Get a single key. - -``` -GET /user/keys/:id -``` - -Parameters: - -- `id` (required) - The ID of an SSH key - -```json -{ - "id": 1, - "title": "Public key", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2014-08-01T14:47:39.080Z" -} -``` - -## Add SSH key - -Creates a new key owned by the currently authenticated user. - -``` -POST /user/keys -``` - -Parameters: - -- `title` (required) - new SSH Key's title -- `key` (required) - new SSH key - -```json -{ - "created_at": "2015-01-21T17:44:33.512Z", - "key": "ssh-dss AAAAB3NzaC1kc3MAAACBAMLrhYgI3atfrSD6KDas1b/3n6R/HP+bLaHHX6oh+L1vg31mdUqK0Ac/NjZoQunavoyzqdPYhFz9zzOezCrZKjuJDS3NRK9rspvjgM0xYR4d47oNZbdZbwkI4cTv/gcMlquRy0OvpfIvJtjtaJWMwTLtM5VhRusRuUlpH99UUVeXAAAAFQCVyX+92hBEjInEKL0v13c/egDCTQAAAIEAvFdWGq0ccOPbw4f/F8LpZqvWDydAcpXHV3thwb7WkFfppvm4SZte0zds1FJ+Hr8Xzzc5zMHe6J4Nlay/rP4ewmIW7iFKNBEYb/yWa+ceLrs+TfR672TaAgO6o7iSRofEq5YLdwgrwkMmIawa21FrZ2D9SPao/IwvENzk/xcHu7YAAACAQFXQH6HQnxOrw4dqf0NqeKy1tfIPxYYUZhPJfo9O0AmBW2S36pD2l14kS89fvz6Y1g8gN/FwFnRncMzlLY/hX70FSc/3hKBSbH6C6j8hwlgFKfizav21eS358JJz93leOakJZnGb8XlWvz1UJbwCsnR2VEY8Dz90uIk1l/UqHkA= loic@call", - "title": "ABC", - "id": 4 -} -``` - -Will return created key with status `201 Created` on success. If an -error occurs a `400 Bad Request` is returned with a message explaining the error: - -```json -{ - "message": { - "fingerprint": [ - "has already been taken" - ], - "key": [ - "has already been taken" - ] - } -} -``` - -## Add SSH key for user - -Create new key owned by specified user. Available only for admin - -``` -POST /users/:id/keys -``` - -Parameters: - -- `id` (required) - id of specified user -- `title` (required) - new SSH Key's title -- `key` (required) - new SSH key - -Will return created key with status `201 Created` on success, or `404 Not found` on fail. - -## Delete SSH key for current user - -Deletes key owned by currently authenticated user. -This is an idempotent function and calling it on a key that is already deleted -or not available results in `200 OK`. - -``` -DELETE /user/keys/:id -``` - -Parameters: - -- `id` (required) - SSH key ID - -## Delete SSH key for given user - -Deletes key owned by a specified user. Available only for admin. - -``` -DELETE /users/:uid/keys/:id -``` - -Parameters: - -- `uid` (required) - id of specified user -- `id` (required) - SSH key ID - -Will return `200 OK` on success, or `404 Not found` if either user or key cannot be found. diff --git a/doc/customization/issue_closing.md b/doc/customization/issue_closing.md deleted file mode 100644 index aa65a082a53..00000000000 --- a/doc/customization/issue_closing.md +++ /dev/null @@ -1,36 +0,0 @@ -# Issue closing pattern - -If a commit message matches the regular expression below, all issues referenced from -the matched text will be closed. This happens when the commit is pushed or merged -into the default branch of a project. - -When not specified, the default issue_closing_pattern as shown below will be used: - -```bash -((?:[Cc]los(?:e[sd]?|ing)|[Ff]ix(?:e[sd]|ing)?) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+) -``` - -For example: - -``` -git commit -m "Awesome commit message (Fix #20, Fixes #21 and Closes #22). This commit is also related to #17 and fixes #18, #19 and #23." -``` - -will close `#20`, `#21`, `#22`, `#18`, `#19` and `#23`, but `#17` won't be closed -as it does not match the pattern. It also works with multiline commit messages. - -Tip: you can test this closing pattern at [http://rubular.com][1]. Use this site -to test your own patterns. - -## Change the pattern - -For Omnibus installs you can change the default pattern in `/etc/gitlab/gitlab.rb`: - -``` -issue_closing_pattern: '((?:[Cc]los(?:e[sd]|ing)|[Ff]ix(?:e[sd]|ing)?) +(?:(?:issues? +)?#\d+(?:(?:, *| +and +)?))+)' -``` - -For manual installs you can customize the pattern in [gitlab.yml][0]. - -[0]: https://gitlab.com/gitlab-org/gitlab-ce/blob/40c3675372320febf5264061c9bcd63db2dfd13c/config/gitlab.yml.example#L65 -[1]: http://rubular.com/r/Xmbexed1OJ diff --git a/doc/customization/libravatar.md b/doc/customization/libravatar.md deleted file mode 100644 index ee57fdc6590..00000000000 --- a/doc/customization/libravatar.md +++ /dev/null @@ -1,69 +0,0 @@ -# Use Libravatar service with GitLab - -GitLab by default supports [Gravatar](gravatar.com) avatar service. -Libravatar is a service which delivers your avatar (profile picture) to other websites and their API is -[heavily based on gravatar](http://wiki.libravatar.org/api/). - -This means that it is not complicated to switch to Libravatar avatar service or even self hosted Libravatar server. - -# Configuration - -In [gitlab.yml gravatar section](https://gitlab.com/gitlab-org/gitlab-ce/blob/672bd3902d86b78d730cea809fce312ec49d39d7/config/gitlab.yml.example#L122) set -the configuration options as follows: - -## For HTTP - -```yml - gravatar: - enabled: true - # gravatar URLs: possible placeholders: %{hash} %{size} %{email} - plain_url: "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" -``` - -## For HTTPS - -```yml - gravatar: - enabled: true - # gravatar URLs: possible placeholders: %{hash} %{size} %{email} - ssl_url: "https://seccdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" -``` - -## Self-hosted - -If you are [running your own libravatar service](http://wiki.libravatar.org/running_your_own/) the URL will be different in the configuration -but the important part is to provide the same placeholders so GitLab can parse the URL correctly. - -For example, you host a service on `http://libravatar.example.com` the `plain_url` you need to supply in `gitlab.yml` is - -`http://libravatar.example.com/avatar/%{hash}?s=%{size}&d=identicon` - - -## Omnibus-gitlab example - -In `/etc/gitlab/gitlab.rb`: - -#### For http - -```ruby -gitlab_rails['gravatar_enabled'] = true -gitlab_rails['gravatar_plain_url'] = "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" -``` - -#### For https - -```ruby -gitlab_rails['gravatar_enabled'] = true -gitlab_rails['gravatar_ssl_url'] = "https://seccdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" -``` - - -Run `sudo gitlab-ctl reconfigure` for changes to take effect. - - -## Default URL for missing images - -[Libravatar supports different sets](http://wiki.libravatar.org/api/) of `missing images` for emails not found on the Libravatar service. - -In order to use a different set other than `identicon`, replace `&d=identicon` portion of the URL with another supported set. -For example, you can use `retro` set in which case the URL would look like: `plain_url: "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=retro"` diff --git a/doc/customization/welcome_message.md b/doc/customization/welcome_message.md deleted file mode 100644 index 6c141d1fb7a..00000000000 --- a/doc/customization/welcome_message.md +++ /dev/null @@ -1,38 +0,0 @@ -# Customize the complete sign-in page (GitLab Enterprise Edition only) - -Please see [Branded login page](http://doc.gitlab.com/ee/customization/branded_login_page.html) - -# Add a welcome message to the sign-in page (GitLab Community Edition) - -It is possible to add a markdown-formatted welcome message to your GitLab -sign-in page. Users of GitLab Enterprise Edition should use the [branded login -page feature](/ee/customization/branded_login_page.html) instead. - -## Omnibus-gitlab example - -In `/etc/gitlab/gitlab.rb`: - -```ruby -gitlab_rails['extra_sign_in_text'] = <<'EOS' -# ACME GitLab -Welcome to the [ACME](http://www.example.com) GitLab server! -EOS -``` - -Run `sudo gitlab-ctl reconfigure` for changes to take effect. - -## Installation from source - -In `/home/git/gitlab/config/gitlab.yml`: - -```yaml -# snip -production: - # snip - extra: - sign_in_text: | - # ACME GitLab - Welcome to the [ACME](http://www.example.com) GitLab server! -``` - -Run `sudo service gitlab reload` for the change to take effect. diff --git a/doc/development/README.md b/doc/development/README.md deleted file mode 100644 index d5d264be19d..00000000000 --- a/doc/development/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Development - -- [Architecture](architecture.md) of GitLab -- [Shell commands](shell_commands.md) in the GitLab codebase -- [Rake tasks](rake_tasks.md) for development -- [CI setup](ci_setup.md) for testing GitLab -- [Sidekiq debugging](sidekiq_debugging.md) -- [UI guide](ui_guide.md) for building GitLab with existing css styles and elements diff --git a/doc/development/architecture.md b/doc/development/architecture.md deleted file mode 100644 index 541af487bb1..00000000000 --- a/doc/development/architecture.md +++ /dev/null @@ -1,188 +0,0 @@ -# GitLab Architecture Overview - -## Software delivery - -There are two editions of GitLab: [Enterprise Edition](https://about.gitlab.com/gitlab-ee/) (EE) and [Community Edition](https://about.gitlab.com/gitlab-ce/) (CE). GitLab CE is delivered via git from the [gitlabhq repository](https://gitlab.com/gitlab-org/gitlab-ce/tree/master). New versions of GitLab are released in stable branches and the master branch is for bleeding edge development. - -EE releases are available not long after CE releases. To obtain the GitLab EE there is a [repository at gitlab.com](https://gitlab.com/subscribers/gitlab-ee). For more information about the release process see the section 'New versions and upgrading' in the readme. - -Both EE and CE require an add-on component called gitlab-shell. It is obtained from the [gitlab-shell repository](https://gitlab.com/gitlab-org/gitlab-shell/tree/master). New versions are usually tags but staying on the master branch will give you the latest stable version. New releases are generally around the same time as GitLab CE releases with exception for informal security updates deemed critical. - -## Physical office analogy - -You can imagine GitLab as a physical office. - -**The repositories** are the goods GitLab handling. -They can be stored in a warehouse. -This can be either a hard disk, or something more complex, such as a NFS filesystem; - -**Nginx** acts like the front-desk. -Users come to Nginx and request actions to be done by workers in the office; - -**The database** is a series of metal file cabinets with information on: - - The goods in the warehouse (metadata, issues, merge requests etc); - - The users coming to the front desk (permissions) - -**Redis** is a communication board with “cubby holes” that can contain tasks for office workers; - -**Sidekiq** is a worker that primarily handles sending out emails. -It takes tasks from the Redis communication board; - -**A Unicorn worker** is a worker that handles quick/mundane tasks. -They work with the communication board (Redis). -Their job description: - - check permissions by checking the user session stored in a Redis “cubby hole”; - - make tasks for Sidekiq; - - fetch stuff from the warehouse or move things around in there; - -**Gitlab-shell** is a third kind of worker that takes orders from a fax machine (SSH) instead of the front desk (HTTP). -Gitlab-shell communicates with Sidekiq via the “communication board” (Redis), and asks quick questions of the Unicorn workers either directly or via the front desk. - -**GitLab Enterprise Edition (the application)** is the collection of processes and business practices that the office is run by. - -## System Layout - -When referring to ~git in the pictures it means the home directory of the git user which is typically /home/git. - -GitLab is primarily installed within the `/home/git` user home directory as `git` user. Within the home directory is where the gitlabhq server software resides as well as the repositories (though the repository location is configurable). - -The bare repositories are located in `/home/git/repositories`. GitLab is a ruby on rails application so the particulars of the inner workings can be learned by studying how a ruby on rails application works. - -To serve repositories over SSH there's an add-on application called gitlab-shell which is installed in `/home/git/gitlab-shell`. - -### Components - -![GitLab Diagram Overview](gitlab_diagram_overview.png) - -A typical install of GitLab will be on GNU/Linux. It uses Nginx or Apache as a web front end to proxypass the Unicorn web server. By default, communication between Unicorn and the front end is via a Unix domain socket but forwarding requests via TCP is also supported. The web front end accesses `/home/git/gitlab/public` bypassing the Unicorn server to serve static pages, uploads (e.g. avatar images or attachments), and precompiled assets. GitLab serves web pages and a [GitLab API](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/api) using the Unicorn web server. It uses Sidekiq as a job queue which, in turn, uses redis as a non-persistent database backend for job information, meta data, and incoming jobs. - -The GitLab web app uses MySQL or PostgreSQL for persistent database information (e.g. users, permissions, issues, other meta data). GitLab stores the bare git repositories it serves in `/home/git/repositories` by default. It also keeps default branch and hook information with the bare repository. `/home/git/gitlab-satellites` keeps checked out repositories when performing actions such as a merge request, editing files in the web interface, etc. - -The satellite repository is used by the web interface for editing repositories and the wiki which is also a git repository. When serving repositories over HTTP/HTTPS GitLab utilizes the GitLab API to resolve authorization and access as well as serving git objects. - -The add-on component gitlab-shell serves repositories over SSH. It manages the SSH keys within `/home/git/.ssh/authorized_keys` which should not be manually edited. gitlab-shell accesses the bare repositories directly to serve git objects and communicates with redis to submit jobs to Sidekiq for GitLab to process. gitlab-shell queries the GitLab API to determine authorization and access. - -### Installation Folder Summary - -To summarize here's the [directory structure of the `git` user home directory](../install/structure.md). - -### Processes - - ps aux | grep '^git' - -GitLab has several components to operate. As a system user (i.e. any user that is not the `git` user) it requires a persistent database (MySQL/PostreSQL) and redis database. It also uses Apache httpd or Nginx to proxypass Unicorn. As the `git` user it starts Sidekiq and Unicorn (a simple ruby HTTP server running on port `8080` by default). Under the GitLab user there are normally 4 processes: `unicorn_rails master` (1 process), `unicorn_rails worker` (2 processes), `sidekiq` (1 process). - -### Repository access - -Repositories get accessed via HTTP or SSH. HTTP cloning/push/pull utilizes the GitLab API and SSH cloning is handled by gitlab-shell (previously explained). - -## Troubleshooting - -See the README for more information. - -### Init scripts of the services - -The GitLab init script starts and stops Unicorn and Sidekiq. - -``` -/etc/init.d/gitlab -Usage: service gitlab {start|stop|restart|reload|status} -``` - -Redis (key-value store/non-persistent database) - -``` -/etc/init.d/redis -Usage: /etc/init.d/redis {start|stop|status|restart|condrestart|try-restart} -``` - -SSH daemon - -``` -/etc/init.d/sshd -Usage: /etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status} -``` - -Web server (one of the following) - -``` -/etc/init.d/httpd -Usage: httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest} - -$ /etc/init.d/nginx -Usage: nginx {start|stop|restart|reload|force-reload|status|configtest} -``` - -Persistent database (one of the following) - -``` -/etc/init.d/mysqld -Usage: /etc/init.d/mysqld {start|stop|status|restart|condrestart|try-restart|reload|force-reload} - -$ /etc/init.d/postgresql -Usage: /etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [version ..] -``` - -### Log locations of the services - -Note: `/home/git/` is shorthand for `/home/git`. - -gitlabhq (includes Unicorn and Sidekiq logs) - -- `/home/git/gitlab/log/` contains `application.log`, `production.log`, `sidekiq.log`, `unicorn.stdout.log`, `githost.log`, `satellites.log`, and `unicorn.stderr.log` normally. - -gitlab-shell - -- `/home/git/gitlab-shell/gitlab-shell.log` - -ssh - -- `/var/log/auth.log` auth log (on Ubuntu). -- `/var/log/secure` auth log (on RHEL). - -nginx - -- `/var/log/nginx/` contains error and access logs. - -Apache httpd - -- [Explanation of Apache logs](http://httpd.apache.org/docs/2.2/logs.html). -- `/var/log/apache2/` contains error and output logs (on Ubuntu). -- `/var/log/httpd/` contains error and output logs (on RHEL). - -redis - -- `/var/log/redis/redis.log` there are also log-rotated logs there. - -PostgreSQL - -- `/var/log/postgresql/*` - -MySQL - -- `/var/log/mysql/*` -- `/var/log/mysql.*` - -### GitLab specific config files - -GitLab has configuration files located in `/home/git/gitlab/config/*`. Commonly referenced config files include: - -- `gitlab.yml` - GitLab configuration. -- `unicorn.rb` - Unicorn web server settings. -- `database.yml` - Database connection settings. - -gitlab-shell has a configuration file at `/home/git/gitlab-shell/config.yml`. - -### Maintenance Tasks - -[GitLab](https://gitlab.com/gitlab-org/gitlab-ce/tree/master) provides rake tasks with which you see version information and run a quick check on your configuration to ensure it is configured properly within the application. See [maintenance rake tasks](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/maintenance.md). -In a nutshell, do the following: - -``` -sudo -i -u git -cd gitlab -bundle exec rake gitlab:env:info RAILS_ENV=production -bundle exec rake gitlab:check RAILS_ENV=production -``` - -Note: It is recommended to log into the `git` user using `sudo -i -u git` or `sudo su - git`. While the sudo commands provided by gitlabhq work in Ubuntu they do not always work in RHEL. diff --git a/doc/development/ci_setup.md b/doc/development/ci_setup.md deleted file mode 100644 index f9b48868182..00000000000 --- a/doc/development/ci_setup.md +++ /dev/null @@ -1,46 +0,0 @@ -# CI setup - -This document describes what services we use for testing GitLab and GitLab CI. - -We currently use three CI services to test GitLab: - -1. GitLab CI on [GitHost.io](https://gitlab-ce.githost.io/projects/4/) for the [GitLab.com repo](https://gitlab.com/gitlab-org/gitlab-ce) -2. GitLab CI at ci.gitlab.org to test the private GitLab B.V. repo at dev.gitlab.org -3. [Semephore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for [GitHub.com repo](https://github.com/gitlabhq/gitlabhq) - -| Software @ configuration being tested | GitLab CI (ci.gitlab.org) | GitLab CI (GitHost.io) | Semaphore | -|---------------------------------------|---------------------------|---------------------------------------------------------------------------|-----------| -| GitLab CE @ MySQL | ✓ | ✓ [Core team can trigger builds](https://gitlab-ce.githost.io/projects/4) | | -| GitLab CE @ PostgreSQL | | | ✓ [Core team can trigger builds](https://semaphoreapp.com/gitlabhq/gitlabhq/branches/master) | -| GitLab EE @ MySQL | ✓ | | | -| GitLab CI @ MySQL | ✓ | | | -| GitLab CI @ PostgreSQL | | | ✓ | -| GitLab CI Runner | ✓ | | ✓ | -| GitLab Shell | ✓ | | ✓ | -| GitLab Shell | ✓ | | ✓ | - -Core team has access to trigger builds if needed for GitLab CE. - -We use [these build scripts](https://gitlab.com/gitlab-org/gitlab-ci/blob/master/doc/examples/build_script_gitlab_ce.md) for testing with GitLab CI. - -# Build configuration on [Semaphore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for testing the [GitHub.com repo](https://github.com/gitlabhq/gitlabhq) - -- Language: Ruby -- Ruby version: 2.1.2 -- database.yml: pg - -Build commands - -```bash -sudo apt-get install cmake libicu-dev -y (Setup) -bundle install --deployment --path vendor/bundle (Setup) -cp config/gitlab.yml.example config/gitlab.yml (Setup) -bundle exec rake db:create (Setup) -bundle exec rake spinach (Thread #1) -bundle exec rake spec (thread #2) -bundle exec rake rubocop (thread #3) -bundle exec rake brakeman (thread #4) -bundle exec rake jasmine:ci (thread #5) -``` - -Use rubygems mirror. diff --git a/doc/development/gitlab_diagram_overview.odg b/doc/development/gitlab_diagram_overview.odg deleted file mode 100644 index 9bfc7313ff4cfd7c82fe51aa4b073bef1d413edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50512 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�XU5vDi&3?D#<}lDVtQj_^@7?P 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

      lZnS%t7)iT3nb(8TaFa!D3f+};HV zAAedDEv&gpRKz8`m-8WO?t!LYX$R5DMl-pv)rszV`L^hCzjFL3 z(!F-M`T7YVo0iBfWGgafSbLK7H_wxoHsMu0lXGGxneqf47CCrutxCk7>EGE;R}~yr zx>@%vx3b{vtmAJ26k~FOF5Bg2d2NmM{c(EtVcU<>PQLuhyxS~h?{Bj!ytnV~RQ&sP z?(JF2g}JuIzS&`*A>MUB*ZtVLmlqc~A8O%VqioR~Yu&U>=UA6|N6`0!2aIMiq_j4z zo@p`j(G}+^mUCUDD?eV~W3Ko#@ukPx**%GOGYn*2%xaqFt8i&g?}Rs-5A0Srq7~iz z(tcWN(n-JH34TdA`zi#CG`uYKIwa~G^3rJC>MP%S*(Ho-~) zW7xoE>#>V9^j@uauU_GG?>n0>ot^q_XF*s=@#}f~H*;jXjPqvf4LxZY+Nb!);!a8I z=Zh0;bhfU)`~UBE``*Km-4S-npD)q*Y!S)0bmLd;fCKWU>`EW4sQqml@!_vtZ0ED2 z8WZEv&*%O;s+LVXZeq*W{xbZ*0)F0n*M)zUn{w#$FT8nEfU9@@ev6i8=`JrmxhjLO|^1Xb*ySx!Sw2<>TykmQLXt{r9PF&eXJ}a^K+xKR*h%?KsbNK)IWrAt#JLSFWuOF|D zSDU~d9dA6j)8F;7%KYOkn@{DHuSvMIRDNmnSJqjFE1PZi9}oPic;Dc!yR7D7*Z;f4 z{%+6wAl=o!-?-7fQ1=gS(AH*&{H=V3+C_e4^Y->MXIsoHDA>jv{4u}!lCs-0Pl5Oz z=4Vsxw@=X)d_OPv(&O;Euev^Q@lBe%_0X~MLoXf}w=BP$_rfb@-saNVU({D;uG@Kk z-6Zupzjt5%wo5{alRfxPr0`)0_j%|2i&8=~Yxw4}$y>30d%RKI+U&Ud#GM^IrpLdO z6#K~k)yd2AcKmI!Hn~})bJ5X9w>KS}p7ZV zviTL|671C#Waqj^PV9cV=EmRm_+QR7{}9%hdfRHLvy;B@vQ@uo*7Po`wLEaYI(gl% z4*l+j+|MV53un!_ex-RAAJ@&kss9S4ci7sv$K*elaYNdSJ>W()!_~!A`?+>xTI`It z@wimG@>kWS3v+*Yxt(N?P>lS&Rj?*JPADxoCDZ85g6)NM6Es%qf2i2u(A;fX@u20# zr5NuT@jXV@y-rB@A7k%!tiO;Vs;Js}DQ{=?{Z5vp1sw96TjswFSLwaBBierN)N-Ew zmklC^*9iVtDe{NIeJZ=b&Mdw9cz$NDr8-G_zRPW?^Iv;bd~N?WxtQn8W}O+2qx9#z zOMLmg{_5Lj|3Ph|`?o(NKjC0t&@zX$jTkr>Fjf#rF)%PV=jWwmrk55amSpDV6&vXn zO)qd5UZ~wKR>4+F)uX-k3Jb}_7&x)7o`>#CnXl)(TUBa#U+U)r3CcJ zW3e$aH!(f6Sl=nLBsa037-}iD1y<@1Y??edh&t3`)z z{QJ+(-2V9N%|~2@lKrC9PxaR@T-j%MBlOMVKXLmuChxVjXkFIo@@bz&o1IVph9t{H zU$kbb1X_Ab+VX{Q!$&J?he`KeKYjA0LyVz1?0whG^`>H{7TSL+E}gwrw|SBG(Ic}? z?0LJuaMcn!hod1J*D_q4XYNQkte&v%$&=WShe;(#k0kp(tM2v>Ii}|LU6udF+5(B? zRszZYG{xDM{4h8n8rme?Y4~?a2GgR4+b%ylbW6Ec_^!;1D(>5l=hGjP-xi{*1VGn_Tv~zpYY2_iTNoIMOJKb>m_AtGBGfT3fJz7i zfBIhhB^zpRBlMx0a~_L1pj-zl>2R9^D(evDvhTy<9+Z*~w@IizbHrj2a!H8W98g(^ za8V@|b1+Iqh+(kw1kwyE-aus|h!4Truo#A;q{J78s7al7KW3OA%1MaRu%!f4Q=GAw z0*XOM2}rCdl~_zcl%o(+V8Mi39DqtvNDzU@_4{#@s{!7uY#;>!3<3;hEDQ`R2SGdl Dl5nuj diff --git a/doc/development/gitlab_diagram_overview.png b/doc/development/gitlab_diagram_overview.png deleted file mode 100644 index d9b9eed3d8f6b244dabf5b3074324fcfa774704a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256612 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

      12GqM}VFPffKx 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 Q1_lNOPgg&ebxsLQ0AADO$p8QV diff --git a/doc/development/omnibus.md b/doc/development/omnibus.md deleted file mode 100644 index 0ba354d28a2..00000000000 --- a/doc/development/omnibus.md +++ /dev/null @@ -1,32 +0,0 @@ -# What you should know about omnibus packages - -Most users install GitLab using our omnibus packages. As a developer it can be -good to know how the omnibus packages differ from what you have on your laptop -when you are coding. - -## Files are owned by root by default - -All the files in the Rails tree (`app/`, `config/` etc.) are owned by 'root' in -omnibus installations. This makes the installation simpler and it provides -extra security. The omnibus reconfigure script contains commands that give -write access to the 'git' user only where needed. - -For example, the 'git' user is allowed to write in the `log/` directory, in -`public/uploads`, and they are allowed to rewrite the `db/schema.rb` file. - -In other cases, the reconfigure script tricks GitLab into not trying to write a -file. For instance, GitLab will generate a `.secret` file if it cannot find one -and write it to the Rails root. In the omnibus packages, reconfigure writes the -`.secret` file first, so that GitLab never tries to write it. - -## Code, data and logs are in separate directories - -The omnibus design separates code (read-only, under `/opt/gitlab`) from data -(read/write, under `/var/opt/gitlab`) and logs (read/write, under -`/var/log/gitlab`). To make this happen the reconfigure script sets custom -paths where it can in GitLab config files, and where there are no path -settings, it uses symlinks. - -For example, `config/gitlab.yml` is treated as data so that file is a symlink. -The same goes for `public/uploads`. The `log/` directory is replaced by omnibus -with a symlink to `/var/log/gitlab/gitlab-rails`. diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md deleted file mode 100644 index 53f8095cb13..00000000000 --- a/doc/development/rake_tasks.md +++ /dev/null @@ -1,29 +0,0 @@ -# Rake tasks for developers - -## Setup db with developer seeds - -Note that if your db user does not have advanced privileges you must create the db manually before running this command. - -``` -bundle exec rake setup -``` - -The `setup` task is a alias for `gitlab:setup`. -This tasks calls `db:setup` to create the database, calls `add_limits_mysql` that adds limits to the database schema in case of a MySQL database and fianlly it calls `db:seed_fu` to seed the database. -Note: `db:setup` calls `db:seed` but this does nothing. - -## Run tests - -This runs all test suites present in GitLab. - -``` -bundle exec rake test -``` - -## Generate searchable docs for source code - -You can find results under the `doc/code` directory. - -``` -bundle exec rake gitlab:generate_docs -``` diff --git a/doc/development/shell_commands.md b/doc/development/shell_commands.md deleted file mode 100644 index 821027f43fa..00000000000 --- a/doc/development/shell_commands.md +++ /dev/null @@ -1,179 +0,0 @@ -# Guidelines for shell commands in the GitLab codebase - -This document contains guidelines for working with processes and files in the GitLab codebase. -These guidelines are meant to make your code more reliable _and_ secure. - -## References - -- [Google Ruby Security Reviewer's Guide](https://code.google.com/p/ruby-security/wiki/Guide) -- [OWASP Command Injection](https://www.owasp.org/index.php/Command_Injection) -- [Ruby on Rails Security Guide Command Line Injection](http://guides.rubyonrails.org/security.html#command-line-injection) - -## Use File and FileUtils instead of shell commands - -Sometimes we invoke basic Unix commands via the shell when there is also a Ruby API for doing it. Use the Ruby API if it exists. - -```ruby -# Wrong -system "mkdir -p tmp/special/directory" -# Better (separate tokens) -system *%W(mkdir -p tmp/special/directory) -# Best (do not use a shell command) -FileUtils.mkdir_p "tmp/special/directory" - -# Wrong -contents = `cat #{filename}` -# Correct -contents = File.read(filename) - -# Sometimes a shell command is just the best solution. The example below has no -# user input, and is hard to implement correctly in Ruby: delete all files and -# directories older than 120 minutes under /some/path, but not /some/path -# itself. -Gitlab::Popen.popen(%W(find /some/path -not -path /some/path -mmin +120 -delete)) -``` - -This coding style could have prevented CVE-2013-4490. - -## Bypass the shell by splitting commands into separate tokens - -When we pass shell commands as a single string to Ruby, Ruby will let `/bin/sh` evaluate the entire string. Essentially, we are asking the shell to evaluate a one-line script. This creates a risk for shell injection attacks. It is better to split the shell command into tokens ourselves. Sometimes we use the scripting capabilities of the shell to change the working directory or set environment variables. All of this can also be achieved securely straight from Ruby - -```ruby -# Wrong -system "cd /home/git/gitlab && bundle exec rake db:#{something} RAILS_ENV=production" -# Correct -system({'RAILS_ENV' => 'production'}, *%W(bundle exec rake db:#{something}), chdir: '/home/git/gitlab') - -# Wrong -system "touch #{myfile}" -# Better -system "touch", myfile -# Best (do not run a shell command at all) -FileUtils.touch myfile -``` - -This coding style could have prevented CVE-2013-4546. - -## Separate options from arguments with -- - -Make the difference between options and arguments clear to the argument parsers of system commands with `--`. This is supported by many but not all Unix commands. - -To understand what `--` does, consider the problem below. - -``` -# Example -$ echo hello > -l -$ cat -l -cat: illegal option -- l -usage: cat [-benstuv] [file ...] -``` - -In the example above, the argument parser of `cat` assumes that `-l` is an option. The solution in the example above is to make it clear to `cat` that `-l` is really an argument, not an option. Many Unix command line tools follow the convention of separating options from arguments with `--`. - -``` -# Example (continued) -$ cat -- -l -hello -``` - -In the GitLab codebase, we avoid the option/argument ambiguity by _always_ using `--`. - -```ruby -# Wrong -system(*%W(git branch -d #{branch_name})) -# Correct -system(*%W(git branch -d -- #{branch_name})) -``` - -This coding style could have prevented CVE-2013-4582. - -## Do not use the backticks - -Capturing the output of shell commands with backticks reads nicely, but you are forced to pass the command as one string to the shell. We explained above that this is unsafe. In the main GitLab codebase, the solution is to use `Gitlab::Popen.popen` instead. - -```ruby -# Wrong -logs = `cd #{repo_dir} && git log` -# Correct -logs, exit_status = Gitlab::Popen.popen(%W(git log), repo_dir) - -# Wrong -user = `whoami` -# Correct -user, exit_status = Gitlab::Popen.popen(%W(whoami)) -``` - -In other repositories, such as gitlab-shell you can also use `IO.popen`. - -```ruby -# Safe IO.popen example -logs = IO.popen(%W(git log), chdir: repo_dir) { |p| p.read } -``` - -Note that unlike `Gitlab::Popen.popen`, `IO.popen` does not capture standard error. - -## Avoid user input at the start of path strings - -Various methods for opening and reading files in Ruby can be used to read the -standard output of a process instead of a file. The following two commands do -roughly the same: - -``` -`touch /tmp/pawned-by-backticks` -File.read('|touch /tmp/pawned-by-file-read') -``` - -The key is to open a 'file' whose name starts with a `|`. -Affected methods include Kernel#open, File::read, File::open, IO::open and IO::read. - -You can protect against this behavior of 'open' and 'read' by ensuring that an -attacker cannot control the start of the filename string you are opening. For -instance, the following is sufficient to protect against accidentally starting -a shell command with `|`: - -``` -# we assume repo_path is not controlled by the attacker (user) -path = File.join(repo_path, user_input) -# path cannot start with '|' now. -File.read(path) -``` - -If you have to use user input a relative path, prefix `./` to the path. - -Prefixing user-supplied paths also offers extra protection against paths -starting with `-` (see the discussion about using `--` above). - -## Guard against path traversal - -Path traversal is a security where the program (GitLab) tries to restrict user -access to a certain directory on disk, but the user manages to open a file -outside that directory by taking advantage of the `../` path notation. - -``` -# Suppose the user gave us a path and they are trying to trick us -user_input = '../other-repo.git/other-file' - -# We look up the repo path somewhere -repo_path = 'repositories/user-repo.git' - -# The intention of the code below is to open a file under repo_path, but -# because the user used '..' she can 'break out' into -# 'repositories/other-repo.git' -full_path = File.join(repo_path, user_input) -File.open(full_path) do # Oops! -``` - -A good way to protect against this is to compare the full path with its -'absolute path' according to Ruby's `File.absolute_path`. - -``` -full_path = File.join(repo_path, user_input) -if full_path != File.absolute_path(full_path) - raise "Invalid path: #{full_path.inspect}" -end - -File.open(full_path) do # Etc. -``` - -A check like this could have avoided CVE-2013-4583. diff --git a/doc/development/sidekiq_debugging.md b/doc/development/sidekiq_debugging.md deleted file mode 100644 index cea11e5f126..00000000000 --- a/doc/development/sidekiq_debugging.md +++ /dev/null @@ -1,14 +0,0 @@ -# Sidekiq debugging - -## Log arguments to Sidekiq jobs - -If you want to see what arguments are being passed to Sidekiq jobs you can set -the SIDEKIQ_LOG_ARGUMENTS environment variable. - -``` -SIDEKIQ_LOG_ARGUMENTS=1 bundle exec foreman start -``` - -It is not recommend to enable this setting in production because some Sidekiq -jobs (such as sending a password reset email) take secret arguments (for -example the password reset token). diff --git a/doc/development/ui_guide.md b/doc/development/ui_guide.md deleted file mode 100644 index 2f01defc11d..00000000000 --- a/doc/development/ui_guide.md +++ /dev/null @@ -1,12 +0,0 @@ -# UI Guide for building GitLab - -## Best practices for creating new pages in GitLab - -TODO: write some best practices when develop GitLab features. - -## GitLab UI development kit - -We created a page inside GitLab where you can check commonly used html and css elements. - -When you run GitLab instance locally - just visit http://localhost:3000/help/ui page to see UI examples -you can use during GitLab development. diff --git a/doc/hooks/custom_hooks.md b/doc/hooks/custom_hooks.md deleted file mode 100644 index f7d4f3de68b..00000000000 --- a/doc/hooks/custom_hooks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Custom Git Hooks - -**Note: Custom git hooks must be configured on the filesystem of the GitLab -server. Only GitLab server administrators will be able to complete these tasks. -Please explore webhooks as an option if you do not have filesystem access.** - -Git natively supports hooks that are executed on different actions. -Examples of server-side git hooks include pre-receive, post-receive, and update. -See -[Git SCM Server-Side Hooks](http://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#Server-Side-Hooks) -for more information about each hook type. - -As of gitlab-shell version 2.2.0 (which requires GitLab 7.5+), GitLab -administrators can add custom git hooks to any GitLab project. - -## Setup - -Normally, git hooks are placed in the repository or project's `hooks` directory. -GitLab creates a symlink from each project's `hooks` directory to the -gitlab-shell `hooks` directory for ease of maintenance between gitlab-shell -upgrades. As such, custom hooks are implemented a little differently. Behavior -is exactly the same once the hook is created, though. Follow these steps to -set up a custom hook. - -1. Pick a project that needs a custom git hook. -1. On the GitLab server, navigate to the project's repository directory. -For an installation from source the path is usually -`/home/git/repositories//.git`. For Omnibus installs the path is -usually `/var/opt/gitlab/git-data/repositories//.git`. -1. Create a new directory in this location called `custom_hooks`. -1. Inside the new `custom_hooks` directory, create a file with a name matching -the hook type. For a pre-receive hook the file name should be `pre-receive` with -no extension. -1. Make the hook file executable and make sure it's owned by git. -1. Write the code to make the git hook function as expected. Hooks can be -in any language. Ensure the 'shebang' at the top properly reflects the language -type. For example, if the script is in Ruby the shebang will probably be -`#!/usr/bin/env ruby`. - -That's it! Assuming the hook code is properly implemented the hook will fire -as appropriate. diff --git a/doc/install/README.md b/doc/install/README.md deleted file mode 100644 index 239f5f301ec..00000000000 --- a/doc/install/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Installation - -- [Installation](installation.md) -- [Requirements](requirements.md) -- [Structure](structure.md) -- [Database MySQL](database_mysql.md) diff --git a/doc/install/database_mysql.md b/doc/install/database_mysql.md deleted file mode 100644 index 362c492d0ac..00000000000 --- a/doc/install/database_mysql.md +++ /dev/null @@ -1,54 +0,0 @@ -# Database MySQL - -## Note - -We do not recommend using MySQL due to various issues. For example, case [(in)sensitivity](https://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) and [problems](http://bugs.mysql.com/bug.php?id=65830) that [suggested](http://bugs.mysql.com/bug.php?id=50909) [fixes](http://bugs.mysql.com/bug.php?id=65830) [have](http://bugs.mysql.com/bug.php?id=63164). - -## MySQL - - # Install the database packages - sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev - - # Ensure you have MySQL version 5.5.14 or later - mysql --version - - # Pick a MySQL root password (can be anything), type it and press enter - # Retype the MySQL root password and press enter - - # Secure your installation - sudo mysql_secure_installation - - # Login to MySQL - mysql -u root -p - - # Type the MySQL root password - - # Create a user for GitLab - # do not type the 'mysql>', this is part of the prompt - # change $password in the command below to a real password you pick - mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password'; - - # Ensure you can use the InnoDB engine which is necessary to support long indexes - # If this fails, check your MySQL config files (e.g. `/etc/mysql/*.cnf`, `/etc/mysql/conf.d/*`) for the setting "innodb = off" - mysql> SET storage_engine=INNODB; - - # Create the GitLab production database - mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; - - # Grant the GitLab user necessary permissions on the database - mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `gitlabhq_production`.* TO 'git'@'localhost'; - - # Quit the database session - mysql> \q - - # Try connecting to the new database with the new user - sudo -u git -H mysql -u git -p -D gitlabhq_production - - # Type the password you replaced $password with earlier - - # You should now see a 'mysql>' prompt - - # Quit the database session - mysql> \q - - # You are done installing the database and can go back to the rest of the installation. diff --git a/doc/install/installation.md b/doc/install/installation.md deleted file mode 100644 index a61a40ebd16..00000000000 --- a/doc/install/installation.md +++ /dev/null @@ -1,462 +0,0 @@ -# Installation from source - -## Consider the Omnibus package installation - -Since an installation from source is a lot of work and error prone we strongly recommend the fast and reliable [Omnibus package installation](https://about.gitlab.com/downloads/) (deb/rpm). - -## Select Version to Install - -Make sure you view [this installation guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md) from the tag (version) of GitLab you would like to install. -In most cases this should be the highest numbered production tag (without rc in it). -You can select the tag in the version dropdown in the top left corner of GitLab (below the menu bar). - -If the highest number stable branch is unclear please check the [GitLab Blog](https://about.gitlab.com/blog/) for installation guide links by version. - -## Important Notes - -This guide is long because it covers many cases and includes all commands you need, this is [one of the few installation scripts that actually works out of the box](https://twitter.com/robinvdvleuten/status/424163226532986880). - -This installation guide was created for and tested on **Debian/Ubuntu** operating systems. Please read [doc/install/requirements.md](./requirements.md) for hardware and operating system requirements. If you want to install on RHEL/CentOS we recommend using the [Omnibus packages](https://about.gitlab.com/downloads/). - -This is the official installation guide to set up a production server. To set up a **development installation** or for many other installation options please see [the installation section of the readme](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/README.md#installation). - -The following steps have been known to work. Please **use caution when you deviate** from this guide. Make sure you don't violate any assumptions GitLab makes about its environment. For example many people run into permission problems because they changed the location of directories or run services as the wrong user. - -If you find a bug/error in this guide please **submit a merge request** -following the -[contributing guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md). - -## Overview - -The GitLab installation consists of setting up the following components: - -1. Packages / Dependencies -1. Ruby -1. System Users -1. Database -1. Redis -1. GitLab -1. Nginx - -## 1. Packages / Dependencies - -`sudo` is not installed on Debian by default. Make sure your system is -up-to-date and install it. - - # run as root! - apt-get update -y - apt-get upgrade -y - apt-get install sudo -y - -**Note:** During this installation some files will need to be edited manually. If you are familiar with vim set it as default editor with the commands below. If you are not familiar with vim please skip this and keep using the default editor. - - # Install vim and set as default editor - sudo apt-get install -y vim - sudo update-alternatives --set editor /usr/bin/vim.basic - -Install the required packages (needed to compile Ruby and native extensions to Ruby gems): - - sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils pkg-config cmake libkrb5-dev nodejs - -Make sure you have the right version of Git installed - - # Install Git - sudo apt-get install -y git-core - - # Make sure Git is version 1.7.10 or higher, for example 1.7.12 or 2.0.0 - git --version - -Is the system packaged Git too old? Remove it and compile from source. - - # Remove packaged Git - sudo apt-get remove git-core - - # Install dependencies - sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext libz-dev libssl-dev build-essential - - # Download and compile from source - cd /tmp - curl -L --progress https://www.kernel.org/pub/software/scm/git/git-2.1.2.tar.gz | tar xz - cd git-2.1.2/ - ./configure - make prefix=/usr/local all - - # Install into /usr/local/bin - sudo make prefix=/usr/local install - - # When editing config/gitlab.yml (Step 5), change the git -> bin_path to /usr/local/bin/git - -**Note:** In order to receive mail notifications, make sure to install a mail server. By default, Debian is shipped with exim4 but this [has problems](https://github.com/gitlabhq/gitlabhq/issues/4866#issuecomment-32726573) while Ubuntu does not ship with one. The recommended mail server is postfix and you can install it with: - - sudo apt-get install -y postfix - -Then select 'Internet Site' and press enter to confirm the hostname. - -## 2. Ruby - -The use of Ruby version managers such as [RVM](http://rvm.io/), [rbenv](https://github.com/sstephenson/rbenv) or [chruby](https://github.com/postmodern/chruby) with GitLab in production frequently leads to hard to diagnose problems. For example, GitLab Shell is called from OpenSSH and having a version manager can prevent pushing and pulling over SSH. Version managers are not supported and we strongly advise everyone to follow the instructions below to use a system Ruby. - -Remove the old Ruby 1.8 if present - - sudo apt-get remove ruby1.8 - -Download Ruby and compile it: - - mkdir /tmp/ruby && cd /tmp/ruby - curl -L --progress http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.6.tar.gz | tar xz - cd ruby-2.1.6 - ./configure --disable-install-rdoc - make - sudo make install - -Install the Bundler Gem: - - sudo gem install bundler --no-ri --no-rdoc - -## 3. System Users - -Create a `git` user for GitLab: - - sudo adduser --disabled-login --gecos 'GitLab' git - -## 4. Database - -We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](database_mysql.md). *Note*: because we need to make use of extensions you need at least pgsql 9.1. - - # Install the database packages - sudo apt-get install -y postgresql postgresql-client libpq-dev - - # Login to PostgreSQL - sudo -u postgres psql -d template1 - - # Create a user for GitLab - # Do not type the 'template1=#', this is part of the prompt - template1=# CREATE USER git CREATEDB; - - # Create the GitLab production database & grant all privileges on database - template1=# CREATE DATABASE gitlabhq_production OWNER git; - - # Quit the database session - template1=# \q - - # Try connecting to the new database with the new user - sudo -u git -H psql -d gitlabhq_production - - # Quit the database session - gitlabhq_production> \q - -## 5. Redis - - sudo apt-get install redis-server - - # Configure redis to use sockets - sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig - - # Disable Redis listening on TCP by setting 'port' to 0 - sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | sudo tee /etc/redis/redis.conf - - # Enable Redis socket for default Debian / Ubuntu path - echo 'unixsocket /var/run/redis/redis.sock' | sudo tee -a /etc/redis/redis.conf - # Grant permission to the socket to all members of the redis group - echo 'unixsocketperm 770' | sudo tee -a /etc/redis/redis.conf - - # Create the directory which contains the socket - mkdir /var/run/redis - chown redis:redis /var/run/redis - chmod 755 /var/run/redis - # Persist the directory which contains the socket, if applicable - if [ -d /etc/tmpfiles.d ]; then - echo 'd /var/run/redis 0755 redis redis 10d -' | sudo tee -a /etc/tmpfiles.d/redis.conf - fi - - # Activate the changes to redis.conf - sudo service redis-server restart - - # Add git to the redis group - sudo usermod -aG redis git - -## 6. GitLab - - # We'll install GitLab into home directory of the user "git" - cd /home/git - -### Clone the Source - - # Clone GitLab repository - sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 7-10-stable gitlab - -**Note:** You can change `7-10-stable` to `master` if you want the *bleeding edge* version, but never install master on a production server! - -### Configure It - - # Go to GitLab installation folder - cd /home/git/gitlab - - # Copy the example GitLab config - sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml - - # Update GitLab config file, follow the directions at top of file - sudo -u git -H editor config/gitlab.yml - - # Make sure GitLab can write to the log/ and tmp/ directories - sudo chown -R git log/ - sudo chown -R git tmp/ - sudo chmod -R u+rwX,go-w log/ - sudo chmod -R u+rwX tmp/ - - # Create directory for satellites - sudo -u git -H mkdir /home/git/gitlab-satellites - sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites - - # Make sure GitLab can write to the tmp/pids/ and tmp/sockets/ directories - sudo chmod -R u+rwX tmp/pids/ - sudo chmod -R u+rwX tmp/sockets/ - - # Make sure GitLab can write to the public/uploads/ directory - sudo chmod -R u+rwX public/uploads - - # Copy the example Unicorn config - sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb - - # Find number of cores - nproc - - # Enable cluster mode if you expect to have a high load instance - # Ex. change amount of workers to 3 for 2GB RAM server - # Set the number of workers to at least the number of cores - sudo -u git -H editor config/unicorn.rb - - # Copy the example Rack attack config - sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb - - # Configure Git global settings for git user, useful when editing via web - # Edit user.email according to what is set in gitlab.yml - sudo -u git -H git config --global user.name "GitLab" - sudo -u git -H git config --global user.email "example@example.com" - sudo -u git -H git config --global core.autocrlf input - - # Configure Redis connection settings - sudo -u git -H cp config/resque.yml.example config/resque.yml - - # Change the Redis socket path if you are not using the default Debian / Ubuntu configuration - sudo -u git -H editor config/resque.yml - -**Important Note:** Make sure to edit both `gitlab.yml` and `unicorn.rb` to match your setup. - -**Note:** If you want to use HTTPS, see [Using HTTPS](#using-https) for the additional steps. - -### Configure GitLab DB Settings - - # PostgreSQL only: - sudo -u git cp config/database.yml.postgresql config/database.yml - - # MySQL only: - sudo -u git cp config/database.yml.mysql config/database.yml - - # MySQL and remote PostgreSQL only: - # Update username/password in config/database.yml. - # You only need to adapt the production settings (first part). - # If you followed the database guide then please do as follows: - # Change 'secure password' with the value you have given to $password - # You can keep the double quotes around the password - sudo -u git -H editor config/database.yml - - # PostgreSQL and MySQL: - # Make config/database.yml readable to git only - sudo -u git -H chmod o-rwx config/database.yml - -### Install Gems - -**Note:** As of bundler 1.5.2, you can invoke `bundle install -jN` (where `N` the number of your processor cores) and enjoy the parallel gems installation with measurable difference in completion time (~60% faster). Check the number of your cores with `nproc`. For more information check this [post](http://robots.thoughtbot.com/parallel-gem-installing-using-bundler). First make sure you have bundler >= 1.5.2 (run `bundle -v`) as it addresses some [issues](https://devcenter.heroku.com/changelog-items/411) that were [fixed](https://github.com/bundler/bundler/pull/2817) in 1.5.2. - - # For PostgreSQL (note, the option says "without ... mysql") - sudo -u git -H bundle install --deployment --without development test mysql aws - - # Or if you use MySQL (note, the option says "without ... postgres") - sudo -u git -H bundle install --deployment --without development test postgres aws - -### Install GitLab Shell - -GitLab Shell is an SSH access and repository management software developed specially for GitLab. - - # Run the installation task for gitlab-shell (replace `REDIS_URL` if needed): - sudo -u git -H bundle exec rake gitlab:shell:install[v2.6.2] REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production - - # By default, the gitlab-shell config is generated from your main GitLab config. - # You can review (and modify) the gitlab-shell config as follows: - sudo -u git -H editor /home/git/gitlab-shell/config.yml - -**Note:** If you want to use HTTPS, see [Using HTTPS](#using-https) for the additional steps. - -### Initialize Database and Activate Advanced Features - - sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production - - # Type 'yes' to create the database tables. - - # When done you see 'Administrator account created:' - -**Note:** You can set the Administrator/root password by supplying it in environmental variable `GITLAB_ROOT_PASSWORD` as seen below. If you don't set the password (and it is set to the default one) please wait with exposing GitLab to the public internet until the installation is done and you've logged into the server the first time. During the first login you'll be forced to change the default password. - - sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD=yourpassword - -### Install Init Script - -Download the init script (will be `/etc/init.d/gitlab`): - - sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab - -And if you are installing with a non-default folder or user copy and edit the defaults file: - - sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab - -If you installed GitLab in another directory or as a user other than the default you should change these settings in `/etc/default/gitlab`. Do not edit `/etc/init.d/gitlab` as it will be changed on upgrade. - -Make GitLab start on boot: - - sudo update-rc.d gitlab defaults 21 - -### Setup Logrotate - - sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab - -### Check Application Status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -### Compile Assets - - sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production - -### Start Your GitLab Instance - - sudo service gitlab start - # or - sudo /etc/init.d/gitlab restart - -## 7. Nginx - -**Note:** Nginx is the officially supported web server for GitLab. If you cannot or do not want to use Nginx as your web server, have a look at the [GitLab recipes](https://gitlab.com/gitlab-org/gitlab-recipes/). - -### Installation - - sudo apt-get install -y nginx - -### Site Configuration - -Copy the example site config: - - sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab - sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab - -Make sure to edit the config file to match your setup: - - # Change YOUR_SERVER_FQDN to the fully-qualified - # domain name of your host serving GitLab. - sudo editor /etc/nginx/sites-available/gitlab - -**Note:** If you want to use HTTPS, replace the `gitlab` Nginx config with `gitlab-ssl`. See [Using HTTPS](#using-https) for HTTPS configuration details. - -### Test Configuration - -Validate your `gitlab` or `gitlab-ssl` Nginx config file with the following command: - - sudo nginx -t - -You should receive `syntax is okay` and `test is successful` messages. If you receive errors check your `gitlab` or `gitlab-ssl` Nginx config file for typos, etc. as indicated in the error message given. - -### Restart - - sudo service nginx restart - -## Done! - -### Double-check Application Status - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations on successfully installing GitLab! - -NOTE: Supply `SANITIZE=true` environment variable to `gitlab:check` to omit project names from the output of the check command. - -### Initial Login - -Visit YOUR_SERVER in your web browser for your first GitLab login. The setup has created a default admin account for you. You can use it to log in: - - root - 5iveL!fe - -**Important Note:** On login you'll be prompted to change the password. - -**Enjoy!** - -You can use `sudo service gitlab start` and `sudo service gitlab stop` to start and stop GitLab. - -## Advanced Setup Tips - -### Using HTTPS - -To use GitLab with HTTPS: - -1. In `gitlab.yml`: - 1. Set the `port` option in section 1 to `443`. - 1. Set the `https` option in section 1 to `true`. -1. In the `config.yml` of gitlab-shell: - 1. Set `gitlab_url` option to the HTTPS endpoint of GitLab (e.g. `https://git.example.com`). - 1. Set the certificates using either the `ca_file` or `ca_path` option. -1. Use the `gitlab-ssl` Nginx example config instead of the `gitlab` config. - 1. Update `YOUR_SERVER_FQDN`. - 1. Update `ssl_certificate` and `ssl_certificate_key`. - 1. Review the configuration file and consider applying other security and performance enhancing features. - -Using a self-signed certificate is discouraged but if you must use it follow the normal directions then: - -1. Generate a self-signed SSL certificate: - - ``` - mkdir -p /etc/nginx/ssl/ - cd /etc/nginx/ssl/ - sudo openssl req -newkey rsa:2048 -x509 -nodes -days 3560 -out gitlab.crt -keyout gitlab.key - sudo chmod o-r gitlab.key - ``` -1. In the `config.yml` of gitlab-shell set `self_signed_cert` to `true`. - -### Additional Markup Styles - -Apart from the always supported markdown style there are other rich text files that GitLab can display. But you might have to install a dependency to do so. Please see the [github-markup gem readme](https://github.com/gitlabhq/markup#markups) for more information. - -### Custom Redis Connection - -If you'd like Resque to connect to a Redis server on a non-standard port or on a different host, you can configure its connection string via the `config/resque.yml` file. - - # example - production: redis://redis.example.tld:6379 - -If you want to connect the Redis server via socket, then use the "unix:" URL scheme and the path to the Redis socket file in the `config/resque.yml` file. - - # example - production: unix:/path/to/redis/socket - -### Custom SSH Connection - -If you are running SSH on a non-standard port, you must change the GitLab user's SSH config. - - # Add to /home/git/.ssh/config - host localhost # Give your setup a name (here: override localhost) - user git # Your remote git user - port 2222 # Your port number - hostname 127.0.0.1; # Your server name or IP - -You also need to change the corresponding options (e.g. `ssh_user`, `ssh_host`, `admin_uri`) in the `config\gitlab.yml` file. - -### LDAP Authentication - -You can configure LDAP authentication in `config/gitlab.yml`. Please restart GitLab after editing this file. - -### Using Custom Omniauth Providers - -See the [omniauth integration document](../integration/omniauth.md) diff --git a/doc/install/requirements.md b/doc/install/requirements.md deleted file mode 100644 index 7a3216dd2d2..00000000000 --- a/doc/install/requirements.md +++ /dev/null @@ -1,109 +0,0 @@ -# Requirements - -## Operating Systems - -### Supported Unix distributions - -- Ubuntu -- Debian -- CentOS -- Red Hat Enterprise Linux (please use the CentOS packages and instructions) -- Scientific Linux (please use the CentOS packages and instructions) -- Oracle Linux (please use the CentOS packages and instructions) - -For the installations options please see [the installation page on the GitLab website](https://about.gitlab.com/installation/). - -### Unsupported Unix distributions - -- OS X -- Arch Linux -- Fedora -- Gentoo -- FreeBSD - -On the above unsupported distributions is still possible to install GitLab yourself. -Please see the [installation from source guide](https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md) and the [unofficial installation guides](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Unofficial-Installation-Guides) on the public wiki for more information. - -### Non-Unix operating systems such as Windows - -GitLab is developed for Unix operating systems. -GitLab does **not** run on Windows and we have no plans of supporting it in the near future. -Please consider using a virtual machine to run GitLab. - -## Ruby versions - -GitLab requires Ruby (MRI) 2.0 or 2.1 -You will have to use the standard MRI implementation of Ruby. -We love [JRuby](http://jruby.org/) and [Rubinius](http://rubini.us/) but GitLab needs several Gems that have native extensions. - -## Hardware requirements - -### Storage - -The necessary hard drive space largely depends on the size of the repos you want to store in GitLab but as a *rule of thumb* you should have at least twice as much free space as all your repos combined take up. You need twice the storage because [GitLab satellites](structure.md) contain an extra copy of each repo. - -If you want to be flexible about growing your hard drive space in the future consider mounting it using LVM so you can add more hard drives when you need them. - -Apart from a local hard drive you can also mount a volume that supports the network file system (NFS) protocol. This volume might be located on a file server, a network attached storage (NAS) device, a storage area network (SAN) or on an Amazon Web Services (AWS) Elastic Block Store (EBS) volume. - -If you have enough RAM memory and a recent CPU the speed of GitLab is mainly limited by hard drive seek times. Having a fast drive (7200 RPM and up) or a solid state drive (SSD) will improve the responsiveness of GitLab. - -### CPU - -- 1 core works supports up to 100 users but the application can be a bit slower due to having all workers and background jobs running on the same core -- **2 cores** is the **recommended** number of cores and supports up to 500 users -- 4 cores supports up to 2,000 users -- 8 cores supports up to 5,000 users -- 16 cores supports up to 10,000 users -- 32 cores supports up to 20,000 users -- 64 cores supports up to 40,000 users - -### Memory - -You need at least 2GB of addressable memory (RAM + swap) to install and use GitLab! -With less memory GitLab will give strange errors during the reconfigure run and 500 errors during usage. - -- 512MB RAM + 1.5GB of swap is the absolute minimum but we strongly **advise against** this amount of memory. See the unicorn worker section below for more advise. -- 1GB RAM + 1GB swap supports up to 100 users -- **2GB RAM** is the **recommended** memory size and supports up to 500 users -- 4GB RAM supports up to 2,000 users -- 8GB RAM supports up to 5,000 users -- 16GB RAM supports up to 10,000 users -- 32GB RAM supports up to 20,000 users -- 64GB RAM supports up to 40,000 users - -Notice: The 25 workers of Sidekiq will show up as separate processes in your process overview (such as top or htop) but they share the same RAM allocation since Sidekiq is a multithreaded application. - -## Unicorn Workers - -It's possible to increase the amount of unicorn workers and this will usually help for to reduce the response time of the applications and increase the ability to handle parallel requests. - -For most instances we recommend using: CPU cores + 1 = unicorn workers. -So for a machine with 2 cores, 3 unicorn workers is ideal. - -For all machines that have 1GB and up we recommend a minimum of three unicorn workers. -If you have a 512MB machine with a magnetic (non-SSD) swap drive we recommend to configure only one Unicorn worker to prevent excessive swapping. -With one Unicorn worker only git over ssh access will work because the git over HTTP access requires two running workers (one worker to receive the user request and one worker for the authorization check). -If you have a 512MB machine with a SSD drive you can use two Unicorn workers, this will allow HTTP access although it will be slow due to swapping. - -To change the Unicorn workers when you have the Omnibus package please see [the Unicorn settings in the Omnibus GitLab documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/unicorn.md#unicorn-settings). - -## Database - -If you want to run the database separately, the **recommended** database size is **1 MB per user**. - -## Redis and Sidekiq - -Redis stores all user sessions and the background task queue. -The storage requirements for Redis are minimal, about 25kB per user. -Sidekiq processes the background jobs with a multithreaded process. -This process starts with the entire Rails stack (200MB+) but it can grow over time due to memory leaks. -On a very active server (10,000 active users) the Sidekiq process can use 1GB+ of memory. - -## Supported web browsers - -- Chrome (Latest stable version) -- Firefox (Latest released version and [latest ESR version](https://www.mozilla.org/en-US/firefox/organizations/)) -- Safari 7+ (known problem: required fields in html5 do not work) -- Opera (Latest released version) -- IE 10+ \ No newline at end of file diff --git a/doc/install/structure.md b/doc/install/structure.md deleted file mode 100644 index 5c03f073c18..00000000000 --- a/doc/install/structure.md +++ /dev/null @@ -1,21 +0,0 @@ -# GitLab directory structure - -This is the directory structure you will end up with following the instructions in the Installation Guide. - - |-- home - | |-- git - | |-- .ssh - | |-- gitlab - | |-- gitlab-satellites - | |-- gitlab-shell - | |-- repositories - -* `/home/git/.ssh` - contains openssh settings. Specifically the `authorized_keys` file managed by gitlab-shell. -* `/home/git/gitlab` - GitLab core software. -* `/home/git/gitlab-satellites` - checked out repositories for merge requests and file editing from web UI. This can be treated as a temporary files directory. -* `/home/git/gitlab-shell` - Core add-on component of GitLab. Maintains SSH cloning and other functionality. -* `/home/git/repositories` - bare repositories for all projects organized by namespace. This is where the git repositories which are pushed/pulled are maintained for all projects. **This area is critical data for projects. [Keep a backup](../raketasks/backup_restore.md)** - -*Note: the default locations for gitlab-satellites and repositories can be configured in `config/gitlab.yml` of GitLab and `config.yml` of gitlab-shell.* - -To see a more in-depth overview see the [GitLab architecture doc](../development/architecture.md). diff --git a/doc/integration/README.md b/doc/integration/README.md deleted file mode 100644 index 286bd34a0bd..00000000000 --- a/doc/integration/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# GitLab Integration - -GitLab integrates with multiple third-party services to allow external issue trackers and external authentication. - -See the documentation below for details on how to configure these services. - -- [External issue tracker](external-issue-tracker.md) Redmine, JIRA, etc. -- [LDAP](ldap.md) Set up sign in via LDAP -- [OmniAuth](omniauth.md) Sign in via Twitter, GitHub, GitLab, and Google via OAuth. -- [Slack](slack.md) Integrate with the Slack chat service -- [OAuth2 provider](oauth_provider.md) OAuth2 application creation -- [Gmail](gitlab_buttons_in_gmail.md) Adds GitLab actions to messages - -GitLab Enterprise Edition contains [advanced JIRA support](http://doc.gitlab.com/ee/integration/jira.html) and [advanced Jenkins support](http://doc.gitlab.com/ee/integration/jenkins.html). - -## Project services - -Integration with services such as Campfire, Flowdock, Gemnasium, HipChat, Pivotal Tracker, and Slack are available in the form of a Project Service. -You can find these within GitLab in the Services page under Project Settings if you are at least a master on the project. -Project Services are a bit like plugins in that they allow a lot of freedom in adding functionality to GitLab, for example there is also a service that can send an email every time someone pushes new commits. -Because GitLab is open source we can ship with the code and tests for all plugins. -This allows the community to keep the plugins up to date so that they always work in newer GitLab versions. -For an overview of what projects services are available without logging in please see the [project_services directory](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/app/models/project_services). diff --git a/doc/integration/bitbucket.md b/doc/integration/bitbucket.md deleted file mode 100644 index d82e1f8b41b..00000000000 --- a/doc/integration/bitbucket.md +++ /dev/null @@ -1,122 +0,0 @@ -# Integrate your server with Bitbucket - -Import projects from Bitbucket and login to your GitLab instance with your Bitbucket account. - -To enable the Bitbucket OmniAuth provider you must register your application with Bitbucket. -Bitbucket will generate an application ID and secret key for you to use. - -1. Sign in to Bitbucket. - -1. Navigate to your individual user settings or a team's settings, depending on how you want the application registered. It does not matter if the application is registered as an individual or a team - that is entirely up to you. - -1. Select "OAuth" in the left menu. - -1. Select "Add consumer". - -1. Provide the required details. - - Name: This can be anything. Consider something like "\'s GitLab" or "\'s GitLab" or something else descriptive. - - Application description: Fill this in if you wish. - - URL: The URL to your GitLab installation. 'https://gitlab.company.com' -1. Select "Save". - -1. You should now see a Key and Secret in the list of OAuth customers. - Keep this page open as you continue configuration. - -1. On your GitLab server, open the configuration file. - - For omnibus package: - - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` - - For instalations from source: - - ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml - ``` - -1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. - -1. Add the provider configuration: - - For omnibus package: - - ```ruby - gitlab_rails['omniauth_providers'] = [ - { - "name" => "bitbucket", - "app_id" => "YOUR_KEY", - "app_secret" => "YOUR_APP_SECRET", - "url" => "https://bitbucket.org/" - } - ] - ``` - - For installation from source: - - ``` - - { name: 'bitbucket', app_id: 'YOUR_KEY', - app_secret: 'YOUR_APP_SECRET' } - ``` - -1. Change 'YOUR_APP_ID' to the key from the Bitbucket application page from step 7. - -1. Change 'YOUR_APP_SECRET' to the secret from the Bitbucket application page from step 7. - -1. Save the configuration file. - -1. Restart GitLab for the changes to take effect. - -On the sign in page there should now be a Bitbucket icon below the regular sign in form. -Click the icon to begin the authentication process. Bitbucket will ask the user to sign in and authorize the GitLab application. -If everything goes well the user will be returned to GitLab and will be signed in. - -## Bitbucket project import - -To allow projects to be imported directly into GitLab, Bitbucket requires two extra setup steps compared to GitHub and GitLab.com. - -Bitbucket doesn't allow OAuth applications to clone repositories over HTTPS, and instead requires GitLab to use SSH and identify itself using your GitLab server's SSH key. - -### Step 1: Known hosts - -To allow GitLab to connect to Bitbucket over SSH, you need to add 'bitbucket.org' to your GitLab server's known SSH hosts. Take the following steps to do so: - -1. Manually connect to 'bitbucket.org' over SSH, while logged in as the `git` account that GitLab will use: - - ```sh - ssh git@bitbucket.org - ``` - -1. Verify the RSA key fingerprint you'll see in the response matches the one in the [Bitbucket documentation](https://confluence.atlassian.com/display/BITBUCKET/Use+the+SSH+protocol+with+Bitbucket#UsetheSSHprotocolwithBitbucket-KnownhostorBitbucket'spublickeyfingerprints) (the specific IP address doesn't matter): - - ```sh - The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established. - RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40. - Are you sure you want to continue connecting (yes/no)? - ``` - -1. If the fingerprint matches, type `yes` to continue connecting and have 'bitbucket.org' be added to your known hosts. - -1. Your GitLab server is now able to connect to Bitbucket over SSH. Continue to step 2: - -### Step 2: Public key - -To be able to access repositories on Bitbucket, GitLab will automatically register your public key with Bitbucket as a deploy key for the repositories to be imported. Your public key needs to be at `~/.ssh/bitbucket_rsa.pub`, which will expand to `/home/git/.ssh/bitbucket_rsa.pub` in most configurations. - -If you have that file in place, you're all set and should see the "Import projects from Bitbucket" option enabled. If you don't, do the following: - -1. Create a new SSH key: - - ```sh - sudo -u git -H ssh-keygen - ``` - - When asked `Enter file in which to save the key` specify the correct path, eg. `/home/git/.ssh/bitbucket_rsa`. - Make sure to use an **empty passphrase**. - -2. Restart GitLab to allow it to find the new public key. - -You should now see the "Import projects from Bitbucket" option on the New Project page enabled. diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md deleted file mode 100644 index 96755707dee..00000000000 --- a/doc/integration/external-issue-tracker.md +++ /dev/null @@ -1,39 +0,0 @@ -# External issue tracker - -GitLab has a great issue tracker but you can also use an external issue tracker such as Jira, Bugzilla or Redmine. You can configure issue trackers per GitLab project. For instance, if you configure Jira it allows you to do the following: - -- the 'Issues' link on the GitLab project pages takes you to the appropriate Jira issue index; -- clicking 'New issue' on the project dashboard creates a new Jira issue; -- To reference Jira issue PROJECT-1234 in comments, use syntax PROJECT-1234. Commit messages get turned into HTML links to the corresponding Jira issue. - -![Jira screenshot](jira-integration-points.png) - -GitLab Enterprise Edition contains [advanced JIRA support](http://doc.gitlab.com/ee/integration/jira.html). - -## Configuration - -### Project Service - -You can enable an external issue tracker per project. As an example, we will configure `Redmine` for project named gitlab-ci. - -Fill in the required details on the page: - -![redmine configuration](redmine_configuration.png) - -* `description` A name for the issue tracker (to differentiate between instances, for example). -* `project_url` The URL to the project in Redmine which is being linked to this GitLab project. -* `issues_url` The URL to the issue in Redmine project that is linked to this GitLab project. Note that the `issues_url` requires `:id` in the url. This id is used by GitLab as a placeholder to replace the issue number. -* `new_issue_url` This is the URL to create a new issue in Redmine for the project linked to this GitLab project. - -### Service Template - -It is necessary to configure the external issue tracker per project, because project specific details are needed for the integration with GitLab. -The admin can add a service template that sets a default for each project. This makes it much easier to configure individual projects. - -In GitLab Admin section, navigate to `Service Templates` and choose the service template you want to create: - -![redmine service template](redmine_service_template.png) - -After the template is created, the template details will be pre-filled on the project service page. - -Support to add your commits to the Jira ticket automatically is [available in GitLab EE](http://doc.gitlab.com/ee/integration/jira.html). diff --git a/doc/integration/github.md b/doc/integration/github.md deleted file mode 100644 index b64501c2aaa..00000000000 --- a/doc/integration/github.md +++ /dev/null @@ -1,79 +0,0 @@ -# Integrate your server with GitHub - -Import projects from GitHub and login to your GitLab instance with your GitHub account. - -To enable the GitHub OmniAuth provider you must register your application with GitHub. -GitHub will generate an application ID and secret key for you to use. - -1. Sign in to GitHub. - -1. Navigate to your individual user settings or an organization's settings, depending on how you want the application registered. It does not matter if the application is registered as an individual or an organization - that is entirely up to you. - -1. Select "Applications" in the left menu. - -1. Select "Register new application". - -1. Provide the required details. - - Application name: This can be anything. Consider something like "\'s GitLab" or "\'s GitLab" or something else descriptive. - - Homepage URL: The URL to your GitLab installation. 'https://gitlab.company.com' - - Application description: Fill this in if you wish. - - Authorization callback URL: 'https://gitlab.company.com/' -1. Select "Register application". - -1. You should now see a Client ID and Client Secret near the top right of the page (see screenshot). - Keep this page open as you continue configuration. - ![GitHub app](github_app.png) - -1. On your GitLab server, open the configuration file. - - For omnibus package: - - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` - - For instalations from source: - - ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml - ``` - -1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. - -1. Add the provider configuration: - - For omnibus package: - - ```ruby - gitlab_rails['omniauth_providers'] = [ - { - "name" => "github", - "app_id" => "YOUR_APP_ID", - "app_secret" => "YOUR_APP_SECRET", - "url" => "https://github.com/", - "args" => { "scope" => "user:email" } - } - ] - ``` - - For installation from source: - - ``` - - { name: 'github', app_id: 'YOUR_APP_ID', - app_secret: 'YOUR_APP_SECRET', - args: { scope: 'user:email' } } - ``` - -1. Change 'YOUR_APP_ID' to the client ID from the GitHub application page from step 7. - -1. Change 'YOUR_APP_SECRET' to the client secret from the GitHub application page from step 7. - -1. Save the configuration file. - -1. Restart GitLab for the changes to take effect. - -On the sign in page there should now be a GitHub icon below the regular sign in form. -Click the icon to begin the authentication process. GitHub will ask the user to sign in and authorize the GitLab application. -If everything goes well the user will be returned to GitLab and will be signed in. diff --git a/doc/integration/github_app.png b/doc/integration/github_app.png deleted file mode 100644 index d890345ced917f2c78ae77dc39c2b66d1362e0d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75297 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 diff --git a/doc/integration/gitlab.md b/doc/integration/gitlab.md deleted file mode 100644 index 216f1f11a9b..00000000000 --- a/doc/integration/gitlab.md +++ /dev/null @@ -1,84 +0,0 @@ -# Integrate your server with GitLab.com - -Import projects from GitLab.com and login to your GitLab instance with your GitLab.com account. - -To enable the GitLab.com OmniAuth provider you must register your application with GitLab.com. -GitLab.com will generate an application ID and secret key for you to use. - -1. Sign in to GitLab.com - -1. Navigate to your profile settings. - -1. Select "Applications" in the left menu. - -1. Select "New application". - -1. Provide the required details. - - Name: This can be anything. Consider something like "\'s GitLab" or "\'s GitLab" or something else descriptive. - - Redirect URI: - - ``` - http://your-gitlab.example.com/import/gitlab/callback - http://your-gitlab.example.com/users/auth/gitlab/callback - ``` - - The first link is required for the importer and second for the authorization. - -1. Select "Submit". - -1. You should now see a Client ID and Client Secret near the top right of the page (see screenshot). - Keep this page open as you continue configuration. - ![GitLab app](gitlab_app.png) - -1. On your GitLab server, open the configuration file. - - For omnibus package: - - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` - - For instalations from source: - - ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml - ``` - -1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. - -1. Add the provider configuration: - - For omnibus package: - - ```ruby - gitlab_rails['omniauth_providers'] = [ - { - "name" => "gitlab", - "app_id" => "YOUR_APP_ID", - "app_secret" => "YOUR_APP_SECRET", - "args" => { "scope" => "api" } - } - ] - ``` - - For installations from source: - - ``` - - { name: 'gitlab', app_id: 'YOUR_APP_ID', - app_secret: 'YOUR_APP_SECRET', - args: { scope: 'api' } } - ``` - -1. Change 'YOUR_APP_ID' to the Application ID from the GitLab.com application page. - -1. Change 'YOUR_APP_SECRET' to the secret from the GitLab.com application page. - -1. Save the configuration file. - -1. Restart GitLab for the changes to take effect. - -On the sign in page there should now be a GitLab.com icon below the regular sign in form. -Click the icon to begin the authentication process. GitLab.com will ask the user to sign in and authorize the GitLab application. -If everything goes well the user will be returned to your GitLab instance and will be signed in. diff --git a/doc/integration/gitlab_actions.png b/doc/integration/gitlab_actions.png deleted file mode 100644 index b08f54d137bd9ab1bde8471211f95016a9ee6aa0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17321 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 Kb6Mw<&;$T~Hs1CC diff --git a/doc/integration/gitlab_app.png b/doc/integration/gitlab_app.png deleted file mode 100644 index 3f9391a821bcb2d625e4c8e4db10f1da66168240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55325 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%0D)hhknj`Z@K>S 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 "google_oauth2", - "app_id" => "YOUR_APP_ID", - "app_secret" => "YOUR_APP_SECRET", - "args" => { "access_type" => "offline", "approval_prompt" => '' } - } - ] - ``` - - For installations from source: - - ``` - - { name: 'google_oauth2', app_id: 'YOUR_APP_ID', - app_secret: 'YOUR_APP_SECRET', - args: { access_type: 'offline', approval_prompt: '' } } - ``` - -1. Change 'YOUR_APP_ID' to the client ID from the Google Developer page from step 10. - -1. Change 'YOUR_APP_SECRET' to the client secret from the Google Developer page from step 10. - -1. Save the configuration file. - -1. Restart GitLab for the changes to take effect. - -On the sign in page there should now be a Google icon below the regular sign in form. Click the icon to begin the authentication process. Google will ask the user to sign in and authorize the GitLab application. If everything goes well the user will be returned to GitLab and will be signed in. - -## Further Configuration - -This further configuration is not required for Google authentication to function but it is strongly recommended. Taking these steps will increase usability for users by providing a little more recognition and branding. - -At this point, when users first try to authenticate to your GitLab installation with Google they will see a generic application name on the prompt screen. The prompt informs the user that "Project Default Service Account" would like to access their account. "Project Default Service Account" isn't very recognizable and may confuse or cause users to be concerned. This is easily changeable. - -1. Select 'Consent screen' in the left menu. (See steps 1, 4 and 5 above for instructions on how to get here if you closed your window). -1. Scroll down until you find "Product Name". Change the product name to something more descriptive. -1. Add any additional information as you wish - homepage, logo, privacy policy, etc. None of this is required, but it may help your users. diff --git a/doc/integration/google_app.png b/doc/integration/google_app.png deleted file mode 100644 index 5a62ad35009bc7786600408837f96b5c9ed97a07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52669 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 z 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 R%fP_E;OXk;vd$@?2>_r!TN?lX diff --git a/doc/integration/jira-integration-points.png b/doc/integration/jira-integration-points.png deleted file mode 100644 index 0692a7b458a3eef7486c0c665b16eb4222cfd11a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67854 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 Ar~m)} diff --git a/doc/integration/ldap.md b/doc/integration/ldap.md deleted file mode 100644 index b67f793c591..00000000000 --- a/doc/integration/ldap.md +++ /dev/null @@ -1,148 +0,0 @@ -# GitLab LDAP integration - -GitLab can be configured to allow your users to sign with their LDAP credentials to integrate with e.g. Active Directory. - -The first time a user signs in with LDAP credentials, GitLab will create a new GitLab user associated with the LDAP Distinguished Name (DN) of the LDAP user. - -GitLab user attributes such as nickname and email will be copied from the LDAP user entry. - -## Configuring GitLab for LDAP integration - -To enable GitLab LDAP integration you need to add your LDAP server settings in `/etc/gitlab/gitlab.rb` or `/home/git/gitlab/config/gitlab.yml`. -In GitLab Enterprise Edition you can have multiple LDAP servers connected to one GitLab server. - -Please note that before version 7.4, GitLab used a different syntax for configuring LDAP integration. -The old LDAP integration syntax still works in GitLab 7.4. -If your `gitlab.rb` or `gitlab.yml` file contains LDAP settings in both the old syntax and the new syntax, only the __old__ syntax will be used by GitLab. - -```ruby -# For omnibus packages -gitlab_rails['ldap_enabled'] = true -gitlab_rails['ldap_servers'] = YAML.load <<-EOS # remember to close this block with 'EOS' below -main: # 'main' is the GitLab 'provider ID' of this LDAP server - ## label - # - # A human-friendly name for your LDAP server. It is OK to change the label later, - # for instance if you find out it is too large to fit on the web page. - # - # Example: 'Paris' or 'Acme, Ltd.' - label: 'LDAP' - - host: '_your_ldap_server' - port: 389 - uid: 'sAMAccountName' - 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. - active_directory: true - - # If allow_username_or_email_login is enabled, GitLab will ignore everything - # after the first '@' in the LDAP username submitted by the user on login. - # - # Example: - # - the user enters 'jane.doe@example.com' and 'p@ssw0rd' as LDAP credentials; - # - GitLab queries the LDAP server with 'jane.doe' and 'p@ssw0rd'. - # - # If you are using "uid: 'userPrincipalName'" on ActiveDirectory you need to - # disable this setting, because the userPrincipalName contains an '@'. - allow_username_or_email_login: false - - # To maintain tight control over the number of active users on your GitLab installation, - # enable this setting to keep new users blocked until they have been cleared by the admin - # (default: false). - block_auto_created_users: false - - # Base where we can search for users - # - # Ex. ou=People,dc=gitlab,dc=example - # - base: '' - - # Filter LDAP users - # - # Format: RFC 4515 http://tools.ietf.org/search/rfc4515 - # Ex. (employeeType=developer) - # - # Note: GitLab does not support omniauth-ldap's custom filter syntax. - # - user_filter: '' - -# 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. -# uswest2: -# label: -# host: -# .... -EOS -``` - -If you are getting 'Connection Refused' errors when trying to connect to the LDAP server please double-check the LDAP `port` and `method` settings used by GitLab. -Common combinations are `method: 'plain'` and `port: 389`, OR `method: 'ssl'` and `port: 636`. - -If you are using a GitLab installation from source you can find the LDAP settings in `/home/git/gitlab/config/gitlab.yml`: - -``` -production: - # snip... - ldap: - enabled: false - servers: - main: # 'main' is the GitLab 'provider ID' of this LDAP server - ## label - # - # A human-friendly name for your LDAP server. It is OK to change the label later, - # for instance if you find out it is too large to fit on the web page. - # - # Example: 'Paris' or 'Acme, Ltd.' - label: 'LDAP' - # snip... -``` - -## Enabling LDAP sign-in for existing GitLab users - -When a user signs in to GitLab with LDAP for the first time, and their LDAP email address is the primary email address of an existing GitLab user, then the LDAP DN will be associated with the existing user. - -If the LDAP email attribute is not found in GitLab's database, a new user is created. - -In other words, if an existing GitLab user wants to enable LDAP sign-in for themselves, they should check that their GitLab email address matches their LDAP email address, and then sign into GitLab via their LDAP credentials. - -GitLab recognizes the following LDAP attributes as email addresses: `mail`, `email` and `userPrincipalName`. - -If multiple LDAP email attributes are present, e.g. `mail: foo@bar.com` and `email: foo@example.com`, then the first attribute found wins -- in this case `foo@bar.com`. - -## Using an LDAP filter to limit access to your GitLab server - -If you want to limit all GitLab access to a subset of the LDAP users on your LDAP server you can set up an LDAP user filter. -The filter must comply with [RFC 4515](http://tools.ietf.org/search/rfc4515). - -```ruby -# For omnibus packages; new LDAP server syntax -gitlab_rails['ldap_servers'] = YAML.load <<-EOS -main: - # snip... - user_filter: '(employeeType=developer)' -EOS -``` - -```yaml -# For installations from source; new LDAP server syntax -production: - ldap: - servers: - main: - # snip... - user_filter: '(employeeType=developer)' -``` - -Tip: if you want to limit access to the nested members of an Active Directory group you can use the following syntax: - -``` -(memberOf:1.2.840.113556.1.4.1941:=CN=My Group,DC=Example,DC=com) -``` - -Please note that GitLab does not support the custom filter syntax used by omniauth-ldap. diff --git a/doc/integration/oauth_provider.md b/doc/integration/oauth_provider.md deleted file mode 100644 index 192c321f712..00000000000 --- a/doc/integration/oauth_provider.md +++ /dev/null @@ -1,35 +0,0 @@ -## GitLab as OAuth2 authentication service provider - -This document is about using GitLab as an OAuth authentication service provider to sign into other services. -If you want to use other OAuth authentication service providers to sign into GitLab please see the [OAuth2 client documentation](../api/oauth2.md) - -OAuth2 provides client applications a 'secure delegated access' to server resources on behalf of a resource owner. Or you can allow users to sign in to your application with their GitLab.com account. -In fact OAuth allows to issue access token to third-party clients by an authorization server, -with the approval of the resource owner, or end-user. -Mostly, OAuth2 is using for SSO (Single sign-on). But you can find a lot of different usages for this functionality. -For example, our feature 'GitLab Importer' is using OAuth protocol to give an access to repositories without sharing user credentials to GitLab.com account. -Also GitLab.com application can be used for authentication to your GitLab instance if needed [GitLab OmniAuth](gitlab.md). - -GitLab has two ways to add new OAuth2 application to an instance, you can add application as regular user and through admin area. So GitLab actually can have an instance-wide and a user-wide applications. There is no defferences between them except the different permission levels. - -### Adding application through profile -Go to your profile section 'Application' and press button 'New Application' - -![applications](oauth_provider/user_wide_applications.png) - -After this you will see application form, where "Name" is arbitrary name, "Redirect URI" is URL in your app where users will be sent after authorization on GitLab.com. - -![application_form](oauth_provider/application_form.png) - -### Authorized application -Every application you authorized will be shown in your "Authorized application" sections. - -![authorized_application](oauth_provider/authorized_application.png) - -At any time you can revoke access just clicking button "Revoke" - -### OAuth applications in admin area - -If you want to create application that does not belong to certain user you can create it from admin area - -![admin_application](oauth_provider/admin_application.png) \ No newline at end of file diff --git a/doc/integration/oauth_provider/admin_application.png b/doc/integration/oauth_provider/admin_application.png deleted file mode 100644 index a5f34512aa85236ac9ecc7d70129d8a3a3f1a71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55533 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 diff --git a/doc/integration/oauth_provider/application_form.png b/doc/integration/oauth_provider/application_form.png deleted file mode 100644 index ae135db2627f24b24e4b4b1ba401ab78e2de0b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25075 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

      HU4jpoeA?d zTCBYHW&5LL@;N12U$%3dzOh>S_}ngSXR)->tw{^2Mf@*Lxq5lF;W;6{FLIfIVyDl< zy597AYt?TH$<$k!D$=sA@Y!1NLB>oQ4ty4H*znb6N+3I|d9gT*;o!9uvQ;HA&`wO_ zbH#>)*OeNJ`M_p0FtE6-WoTL(X#M4d1x(Xh}Pp6;# z`+G$(|M2I0hwX8f^-q|Zo7?|S;|c5iGWpQnKOFZGt~M2cTZ#!8tO7Z_YyTg}{-5yD z-fF+X;*)Z>*y6fe)`{%)1lea+`Rd9_$kv`ov+plr>(*Va7x9hbH`tv9pIAOTuTrsD zW`8&H@0Jhs@qf?H=D(%7XUetdjNp;|MIPC=Ql{tq{90wp8vSMal6f|jm)>3}uv-Ee z_Fv@To%c~)qP@8JBBT<05xZdeR4$h2y_X+Cwhe$9YZcoZ^bd+n6P$mxT?T9^XtQa; z0Z{kAr=1(@Z_v)D1Dja|a%^vNSc1I;7HI%^Z3dq>qMwq^t#G4in_v;h+y>BQwnj#7 zg&R@^vU-Rf!+9}>4PSGVpMd4Tk<2XSu)#FJDh5&@f!r`pw;|#6O}7(_V0n-Tn@&SQ z_JNWe0?;^TN+Jp=oWpv?4t12uN&TXj;p7 z`JodmsVIENVPuIuZ{`F~JfLwOmT2Z>hg(4wgT4FUCKJcDdAThp0n}H!zv$18kG1D} zp!@E@j#X)xsawMX)&&ZrL2!&9!$?0zaWnu%Qvm*>L=XJu54GFsd*S6AC(sGEp00i_ I>zopr0NP|&rvLx| diff --git a/doc/integration/oauth_provider/authorized_application.png b/doc/integration/oauth_provider/authorized_application.png deleted file mode 100644 index d3ce05be9cc71cf965a8941313057f6d0851b085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17260 zcmeAS@N?(olHy`uVBq!ia0y~yU|Ph$z_6BsiGhLP$*Qgh1_rKuna<7up3cq+0Y&*~ znK`Kp3?95|rmMwO7J$|8ZKa+&O1bHce8EZ@$vjZmB|F~{c%J1;#;BB=>5&vI( z+s~eIbB>7^Lx6yh%yGZur3y7%D@}D84P+TYM3Sz@P1h4B<~#JsDW#d?y;$)fo9i8x zdGl^RuQ}v&M{s@|!-o{L;28`IFBy}Tr*9CNV6h~#+&yRh>9ndJx*Ie!@02#q zbZYtc>ETl2Lt+s-%v^-#&)*X>N4~iFL6L;evn7>ndN&?d#`UnCd)DTvSHPy9^pk11 zYOB|`31>^E-)LPVaB|+`*0@Q=%a$k_|Bsq}^iTELlDrw`o93SV_#q~N&pu|8yyLFf zDt!u-di$S$JMZ~z+KtObPO8P1TN8z5Ib2xeRg~3_b_Eo~I~PvNimU za-23{`T^hNyOs2tozp)=F6(|Nmi8=+q2vC{8|)3=x9t4Rd~x0XT<^Cm2i7tCT=qz0 zdG}t1ge>NQXRHiYR_@Qe^?rhg!@Wa0>!x|kFnr%GRxaVda>+qXgSm78FHZyK28L?~ z7rw#y>ZOp z-X?6_AbZU3QGrG39K&;h;vLD4E*1XV!MtPf4(=V%I|T2T%xk%RAo{`H4~7+Xb=><{ z?swSt?{AeqdR`!fV;4)clR~5K38gnmR|Kp$%sG`?Bp2xf&VS*-qpT)mF6`ZT_Q>fY z>PNn-2zhp=xO1s}^qB3jbjjl-tCuKVQr{$Vv*V3loTu2t@=32x%ze`S77Mx`w;}VrvHnK7c4KHyfArbb4m5Ztye{*-(P=w zQFrC?_3kUTmt9|GzHI%H^B2xv%fD2gzU=5g~e=5E98w_=~g!}a&&JDC-lo;1ibk~CU6^VjS=!(8Lq%`WMlXC~Qt zS52!i-fZM;w%V{dM=$+d_P(Qg4*!|kI+6ACqC1cJRF7UdU9>oL_tV=;k9k{q^Xt|o zxNhaza4YR<>es8cjzwkM&9Ti}oGhFjoLGE6?4H?)vi7&3);)7)-*wx)xorNMwQn!K z^}q4|VZx&cPcFPL*yd9&nI3s|Q=+@B`?BPzj~58v)x7p{!{r5=ml;FT9<(z5m^}chYyPZ3E=)$+61S&MTVta9--X^Lw`J5!y3r zkJ_HKd#+cP|4OL&Q}gY|o%9uk5j||jTGsczXS<(gzbSr2{LK5s^~&`N>)jb-9!PI6 ze{izs?$bX{a~l;V2<|ZdkU60)AnU^UgEt;5c<||gxZ*QKOGVp-S1y|Gd~n3uTw zkX*ZTOZTDON=uZ(+)P|*dcJh%bjkEY32jw;<+jDkM1Pkpo4BxGu(a{cL&Zn;i7IQa z4STkJ&vvi+&}XZ%SBHkFueaOoR>fO<_GE-lPD)Pl8}T%S&9f{ek9Vx@n4Pe5^S8}$ z8)I)AeN)({yu8C$>b*p~i2bw&Gd7qf&Ut-C_u;;0J3pVQ$QP~^(iXN?V^zDVdREO{ zZTpf3!AZgAK0N*5`RCo%SJ}qb`8ax5e>NQq`F*8!rLdEIVy@JbZCYz>W90-*_9`)7 zEMK&cXL--3o|mP9ul>?arF}B4-rTckTY7I=b?W~ea(m}(-KXttoL+qH0^4=o(47H! zF?rYB-u6~XyPH+!ue$GZXU>+N({g1nyVsP<-s-)3 z_I_=C|L1wXlx{A1v*_Vo#_H(qmq%HT%70sXvwUqzrsvbTM|Btf9Sr(^=^L{Zdzt)? zpkunbqu+(y3tAYpaqpwYj^7SOx5x0AhOY`03#+p`WBq5rsokr#My=oVgyWmXv5DfQ zf~L0ixBlG-SRE7{@q24uym^Ft(EYm!moHpcacjqF&O9O0UisL{E&pd6-}o(U^0QT9 zQQi*=3t~$CJoVpbf7kk9`J&fL-ky9Gylc6ZU$DRU7N@n5YlU;~Y&-bv#kWS|ed)Wb zWUT!D=lm+Z8+mr~)8``R-dg$F%rCF|=Jc)gq@UyS*WH}r?Ypm)*zOZ4ed$+TP<}sk z|LO4c6|p<7Jib-@aMk0ho3FoFKX+$d_1?E_Uwf~`t-g18f5hLSUFUbL|GMn#*>82b z|MfMdGC$9^yuYjB_Tz6;t$VD^-|6kQF3|sTulcw3dw#nFdx`29e?Gij+~aQCZ*F_g zMzcce^Oh$wUu}LB&s(1>xkb*#{E6X}-!@-b-#@!eQ)}-C?zC$OX8WN zH*a=aulRpjRNp<0Gw$r3bN^$%eeW`7%lG^H@RR#{mn%n3L_fTJv)uZg_Wt$1H+*rv zo^s*I=9N=c&g^HseCqPo`8oDqYx@4!SZ#jC{m%Pk_~G@k_y6p(o#{JsuBbul8B5&; zrzi_MxrXvmhJZzaZ!hpO1ZKstpRaWId`mWQW1Dz*;ZOZ}*H0BIUt_qklR;n~C&Pa~ z20q15@kFCb-Kv2zxEpkJRYf;;ct`D7dQ`?CMN!FjS$g{Y)r<|V86K=IC@XvR;LV%s zQZDQ5Sr!1Ai&D~Tl`=|73as??%gf94%8m8%i_-NC zEiEne4UF`SjC6}q(sYX}^GXscbn}XpA%?)raY-#sF3Kz@$;{7F0GXSZlwVq6tE2?7 zNC5^Q?o6%7MA(#94E0uWey%=9M&D4+Kp$>4$as*bRX}D%YEFbpW^QU;ab|v=ote3b z4Ol&f48lemgw9BWPD68JWSvMdP@OjVAP*pU2ohRg(I6K$J1!f2aJYiP*pAEmE(;?A zgV_O37srqa#%Av#=Dx8vsLnnjcKc?~3kgf+Hcusf zm$aRYC$Fp$pDDlX<Pg|Yh+8t;i& zbcY|Qec86lgZ=h_l%pO+vD>&VWp=gPU7nTF@?h1|Yr8e_R;(@zYVBKkD>QtIgLUSr ziK`w-usATVI4FGNwAnKId+f_iRXgwcUVCRzyXHZbzNY3zem5JjJM(lb51P9u)ztk@ zVP*Z~KXnf0RY8t>xs8)Q^OhPvt9sIOJm@R`*NU4RA5L6SyCTgAGLeBrXySqGazU93 zZ{IpHBWUTDU9!4=OC=4E%~imtuXoc-_Agv&8ecTH6S97TV1C9GH)5a`(D(Zv~V6;)Xj zcw^&+ZD*dp%3H%RB`E#16vuRV6OA8lUu_Fz`4YKc?F#M{T03^^+}8K)Sd{0UZHqSE z7Tqu}Wa;HTzUbTwhumfxyQpc*xLbD1%RH)S=8XxP_bScUx9FmnlhP_F6Q^j!D8bfM zm(%WLyyTjuBqcW`?D{Ri8McaBw~ET@iHA<(NNwD<%{1h~TW#4=#ZRKW=N2y5FyWX5 z1ET-~qkxAA6aVvPC!g<>G|nixwCSqUu_~Qy7vAjNe*5Jcxy~6Ta)rCz`d#mMAX~8O zhtB>31M?4<`n2YE})*Tv+QSls=2)T(!u?6`8Cd%vOX+Ka~zez$+fG4c1|DN|El@o4&nF`nf%SbtuB z$DA^$FR!z@jhM9G&2(j(J4ua~&AFIuS=!+}TVA~WXj1)u(!4PClI8cb7l|w~m^M>Y zUTVjq607w)TF&@r9e*gZC#^idkZrA%Z;->py-EItqQ&(S#Ao=;wXIfieyl=ozo@*kfzLv~K-HmUSC@Hf`sba^~F^kIv(@lO8Ua zcq)M-%jL4nS$F=q8mEIaTzPpGu`!>^TfMcm=AOr@N2VtW?nbB1Wc2G=G;6zs>&B9x z=+qV39JAsAR;8VJEE-W2#`kpFEALlPx92ji<9WM#x?XIQpornRfH_Uz3QC2mvHeEV z^?YS@uXl(3ToNiiVYB}4hpDrgDg$laGn?O8dSY?xv%*<5pQbHbaN<EBS?aDeVdc4`GDByL zxfKe@^Tdi-ec!vgw0~ZC_2$HnUZ3XX?e8~}?pl?mb$HdODR&0stuIx@edhYE32MPt8ts?fE;q#AkIFzSkO%VIk-0b^K@~6YT2Aebyb(v|EySJ9uRvwz= zymleu#*)DA?>aYCYCehEd9Ln%$Nlv_sm&!eN2YId{&&gR!sVU5j(&kjN~LH1(w~gM zoAvCyXD<7&C49<^!(BUm%xgXquE*MUglWI%=-Qy zA7>XAJ*gArSJ!UbF*EPH=3ASS6F;7QS<|oZ`rSt@kxa=X+)>j_#Pf z>(Eh)`BWdwxhZmc+UATC@>9xqg7YDZ6C{Io^nB!Ykb!|e^>fK9kWxSF4*?rwvFzb?n zwQ{pbfu$#76}x`Uv%ew6u7_vymAB4gV|x>`_0Jz4&x$MO8a}>&#^qV%A|B@m+8*gyV|$B{CwhJ^tG!e zSDBoW%bsld=J5%^;{MB*0^VxJEsvgf*nQfU2m!-uqRKC9ZU?N4yZ=O^@?v=Kdf$&$ zy}ltD#-X~?*n?btO1;Whv90=LQ~rw8TSF(k{d(#X@6vAV&}V9^<6fJFh@@9$ezy8q zRO&m;XGdwUCfT1Dmtr2@p!fGl7&IbPlj!n z@Lu#Xi=D`;sJTJ;Ti0Fr^=h?A&V{@!78yUCR{P05(44cRQBR>g`@(|tr>&wUn@-De z5D7eUC1jP1QQ%oux+Lot_UAXkeE$`fF$usxAzW?&z z$dxZCjgaQ@gcB@}ia+l=nCvITANFj5u(Ys9_vxTlz7n+94YQ2lh-)^4!52cdsrzp0Cv9$aU+> zfZ76OiKi0pJ2a=yKObnkbkfb)FUqT%9499ybX`hbK4a&ilZh+UmY;OL)pkruH+AB9 zZQHMU(fc=^%rc8Q%6(MQByyol{v4ajS7J7|ZBgW|+>{jDd&tM_Ye}!c$Hdlqb-@<1 zdalM;?fm%b*{Tn-8iUd=Sm^j(wNYPNDlzMR)bwNgKRxU%X3K5!h%H?-@2b?=vc(jJM;J#)%JGn4CACTy8#jt)E`kstX&QuN9s7NYM`3UY&YC z_)FLUkym;@e(c%XWZid?#k0r9P<64V>6A<2EqZVBg=`wZk<*smsOORfXk1|v6n`g@>ruIjQ z?t5%-O#Yl8%dU$1Oox-Nu|INT0JruZ)G-CyWY*U+8k@E)dz@Kh`|E)Dzsj#Oz1Yj3 zhVU~Le7?L`ZUHN}_07Ox!v-qaF3)ePBx|0XZcDp3|c#?GVb`fWKEd_FQly{ z!}8$SV z)UDWb*m!|z#f`!@EcZPeHyqnhm{ zBj{haJ$Y%5{=8Wy16sEHFgog?x@z1i7co!Y$5$NS zR>Q&)zWV6eGy3Pkjl8qJ|4`qYVf2K{G+66c$WxUx-KR5`PS?Bn%-5-D$>Kkay{E5U zeU*0VQIhHBs9j3S_!iv|I-7E&(V?Ls|H8vmuh`Gkq1snIKU*oDJ=@oorZK^Lyybh>z7XCI61-?IH{+YOyVr#>tdeVtjv zc3h=twexCT|HqeC?(?{BXmMl3^{}lLGq*1dS)I@SC{?fa2 z+v$^}r;vDuhmUJ=wfRj!?K|6MR?oN<5Skodn6~lj=aMV;7Tpl?W_sktV3C>%}-VQ_R3xx_iF1F(cZi39L{^3jf=j0>!Mu7 zN$xFMWtk7op0H6uSH6^ysox{v)E%3t^Os$_wkO&%`1@<=W9yG|ulqK&s@Okj-^x1w z+NFJ#Ykz$;J9(ae*Icp17bpI!s;yl*Yp3)VRn@CvzP`1!z2{zU$&bl@T;6tmW&EaN zj}qFXx~^Hg<<$<~)|TJxzQs0kGpGEP2uba*bgfO?*8;zn-Y^tMd04u8w{q2H!R6Oq ziq1Q6M(f16B^SHRcPrQ{yGk`zOZTMBKelE0KDW1}v%aQX{Cz(!_UELFk32NZX826~ zscg$D?VV*Eqf&F?X+iMP^*1w0wM}=O$^Y%CS1&bXX=)bNCXFZmb?)DHKKN2#_aW`$ zU$T3|mKg?EUsz%x{Y6{)X#2!>$AoH|ryhU5^17zXGc|V3=^|XS1b&Fc$QLM=X0_U^ z)|nrs9(6>tCekGOSn5$tjvhsY^C8(9hc*UA-@bA2Z3*wk*b3Iy_p;V$J<5H*t@x?e z-mU2_$E(c`zm;2Em#P`h_1V%pJ}SS^qMO%rnbcj6{?g==llWe0R;FBdyFub?m~X1> z`|o%79?zPd!@Os8_tj6wHCluPDm0iD2MfKc4O$kqzv_#y(6@!2i^EobkJ)8vRrQ{w z-?lKnQd@78*hXAiYAdB#7jkCB&C8mxJBu^>XMFD~sd{-~byn$3_3v(#Ri!tV zI(&IC*SlTg=EDBw=Z+hH^mQLN>$fP~qA=E{rrkJfc3zkI_jU6Za4A0s67aw3ZvSx3 z`uSRmwYq!OTUOf^{5lyZRQTxE-sq&Sl71i46xwDl`Y`MDcenNP4FaTkU#?N9j&Zd4 zIM@41#0uVzhu+03`c?P!f@&a#{qrId_xE=m&03w!ecv&r;Zl9|E1~W zoNFYYf6wmEskQu-$)+E!Y2W2*SE@46+x6zn-U!`zpwdK2Q=;+D*_K}=v`{t~< zRt>hhH2&wB9cuY-A#$be37#cWJ}dSr{BVzH4q2Z%>&=1|9^aYAl4L&onmOtHq~KXg zF8Y5c`fD{!A(P#Nqf4;I*>z?&WE%9`=sHHZ=N0)kQuMoXGE5mkwQK4CWq0N$uYY+DL z@!#dV!jienQ+U^7k*rw5;#<{soFfCH_jzl~{o^JUr{fePG^5J={F9lc?OL+0XRp%v zCVEgedR^ZxA?2^TvtpMnbBk8nvfezd^NDY--HlS?X+md2XEteWu3HxAbFRhxRJW+n zex2s>2ORvK2U53MoP4}0uUy{l%;se)rkr`Zw70^l^kVIzMb}!UXsK42_TDbkROftj zneqITl|6d-D>kOsu3cnaeyw$vm)G3T3HvQ#)vlRe7SWy&Kh0~A#)(DV52rUJuDGow zwenS-y^YbKprD`?Yb);h-qp(u+|ZK{RnvTcg(X8XHs9a=S6rslq+^w4Fl(S58;>V&op}2?gn-_*Id!RezZ)_c|AK2k9F!A;Q&sS9Q;EEL$+&yyBvd^v4?4J?n08 z)H4S?d9(A9u#fQd?LIU8lGCcs2b4MNSl`~i^7GV#AAL+T?Pk|4y}J5V@hVG`Z4s8y%GnmTIIaeTpO)(^!x2TPxfT{eCr>xYCkGQ$KLP=|J|+n zOf9-TaB9ZW8$1@wjqCywCKkWj7-c1PU9?q7B)DU3l-_@{`j(Py7WvuSOYWUbjSjlB zAp2d&<+~4ZUP@kKd&l;$tM?t7>HO6)5BJXh+RW&@z+E_|Z1wb&;;Yk+XZ#G>|D8d! zkdq}zc*ZH+iit}_LQJ!k6wgZKulO?W@Y~qCcVmxdg-e~R-SIZ|VD0jWlJD)+mOD>o zFk#%Cma6-oRlBEV z^X~%;SA#om3Qkhz$UIYhrf5y=gKZ`U_+mNbQ*`tetLtZfJ#{Nt)-Sz0+tssq@=Bi6 zg&&PWpYFJDcSqkPgRlc^)=dXBm#ow_J##a_Y4*g*TKUz{$=mphcG@WKk2}2QTUKqd zb^mhTGhueK?e#d;$#H+3IdzwzTiUbNQ?>}MpKA8#X!2=`nHIijOjkCnG~X;89%gcD z1^cc?Z?>6Uy6d=ihMxWBnMYIAc4eEbTluztFXm<5{fJ8r+an75k_sbjkA|@Wt2&nk98B8Ov+JC5*Q>1T$$_iX zeV^`LcByhvRLE2xng1fLA#j>6G^DAstm`v?m7W7YJ=FUeUo7X$tPr1^)Hg0D8{Xb&!%g<=M zvN^Tty2Q(-DT_bd{qFVL)4XxMq3_aj*Hi9j#3fl>Ubu=$Pbcj3^hpneS>zfI2yZET zFSyAzO6-?ohW%vCCnf9w?C-hd>{<*?9aT+``7dxr&Q5c^`u`M-Zl-06=BfBH`Kle7 z;F&F<$lb0WV9xka{VnUxn8NzmBEPq+*n9c!-f5?o>1JyF-QcX$J_*trY+&H}kS&eZpflQ_X`YSl{ zd-k_4<@U>0b6(&E_oEqDCQWaMT3grf@#DW6Yw!ElTM9BlB^(l}1Sfp7za?j!aLGYg;8fN!*vWY{+FdP&vavu5p*`hN~9csdlTO2=ZowwI* z{@>mIzxd0$yX)6paMym(8M%4i@9+N~v+uv7;C;Trg!8hEc%5AOtZ;!Vpux;W7G(#! zdw|E z@K0T$`qj(j%lG%IpIf4`(u;jbnNxEA(my5j=em}fLx&%hsW4c8tEC&|cj_KD2Q;;g@0M@8|28$*cbbuF z=J}@QPZ}S;TzxwD_kH`~tLsD9mVVA(Z=M?XQ~S!E)_=wCx9_c=RN_;qnE&?G*4D~} zRUJP4k6$`D6vSIxnBBB4bJrF2F9~l9cU3<7zGdrMJr#3%#TNlyi2=J)?n+-f7rsLK zb8L3DwUGAi_qPsitIfXOFnj)lw?A0s?LB&HTcVkI`MKWH<`UXDZ|_W0O@CK>yL8#- zg%O*#8b7(Z^19KL?Ne8Oy2iF==ktV_4}Buu7-fI|n-^!Xy_R$Oc7yN7j-C$b+FHyW zn)&|Tb*hALL{M)tr_LSbN&9hq-asQ>R>sN8k#CN@?@1$_% zMC{afd$WAc+T5R;wr*bkEv{I*t-ZGPx&EYHZtmyWHFon)ou2XjN!y~k(<9$)`sAy> zJkGXw!M;yt8bf`zovr+STTYL|{k{g{_txB8_EQ&4eFHe{*ZsOU+rD>>&%amx*Z2P3 z{^#Xl&QC}8&9Qzyk%;Pd(!<7q4^3w(?l| zq_S+=-4l0jZTde|Ms3IT;G0RB6Mw$2$XeJe{*8})zUUG4N%8TwcWI~}y6$=w6rkma z>C)OJ#IHtp55xD=xAwH;#`locQp} z)wPimdy=-KOHS6k`{!IxTvx%Z-AnF8@5?@3bkgX2>)a=g!{2VojXNT5H%%`#uA;{I z=Dt(htF5QEEpxAMYsqv`$j&YQek*gy`7NQXHGlU0xA=YZdC#{e_CK57q!-N(Uw8Az z^8S0ZA+4$Y$3BVmYZV@Q(p@uW)|5b#rMv!aWik|bZ)@(c=|s1P`1=y>$47qY$=uXi zdV62_`?g2d&+TN@e7ZGzc{g{73E!>d(VITcu~wSB{{0g_O>f7KZI^3JPAy!JVt!8k z#%@)GR~75^m6}UDY~P=2@M5+0|JK>X@w_b0@~(NstknfAn7z->uin z=1H%AUz;Rsb*Ol2@5a#9M<1fsow_~c)GxcQM(bzK`FU+Cx9jDQ?CsAsea>rA4t};y z>;9INHIYkB9$J3A?PiUtaK-`2?y1*{r*6Cxx~MqmW%ssoiO<(pv78T;I=DY@#^I$W zLsy?#nREW{RRbxQu?E}cZ2pMzMtrD z{mZRykAvc$zqS5!>zm}gULVnj`s?|5TmL-UJneo>)c&W%_SHq#wtH@>sl0k$uG;=J z%irwZ58LK%mjD0hz2Bby_pe{vd&2qH`rH5VzPlZpH-GQ%2{WGkm6zT2XZz7dTOS-> zvuUoq)yIGLXWf^W{N}p#d`>lwZSOUu&i?*YvMcv+>+Gn1s^{%1E+s@gPumt7seJhG z-^af`?%TU7H}~-DSy7*Z?C2gq@6KMSo%$vz`n^{7*YHgTAEz!mWw-z6zOp(E@!l0%OwL-T zPhI*|wCwGYh4(I4J8?eitI&IAcHzn^qvXpyT`x!d*1Ex=ChIu{mhc4 zNK7*~?%Nc$^)^@PrG}|S6(&f)DUar`baXRetriu53 zueYu)a-A-JO8&cJf{#*7)x2e|xA)zxRSM6odp>uEs^Y^d0s?o`w@%&7z1=MGbI81V z%u~PK7T4W${%e&UU;Ms`1KHamHm5Y_PoG&*`;YH;)cdWM&40zsoYj=RYfApvzdzT! z-?;q7n)iR6Joi6+BmB?zPuJ|W|66|l)Bo#p&%NFx|NqNN)%|n+w%@Ng8TTvi-TBDZ zsndQQE1y5L_N)B$%V(_TSJqvde*O3Rdnua#XM8qiJ1rjT-f`{4^XoTf%{`x4bR)g? z|Mij&zn?juxA|ZD|LXnwpZ|ZDd1p@g_t3jHuUK4O=(aIG>&~9ve;n9bgrF_q+WDHnGryfZ8$D(5B<_PB zYqIXGFN>Vg{cJVM{BYB9MeFOqnOAN-qB1 zQQiMq>-)ymW9FZxobg@k|F1?^@{kP6LFvMS{)^9Au8z7_`M5RYe=GBCU$wh;=A2u) z@^EvW{C#W9fV)dhrqnreg`x*9JQzf#_DpG8Y`Gj=QXPZ7e(2clt z=J&Uq-}5eSjZHh zyM41;*}BE4DTYs^*3Rb05zs#B`N`$uKJM!6x!Jqt>^hTid)J)bnTZ9v^I{d$qch&t zxC^e?WY~IHxgloWyzMvh?(5`gTGVYVD1LJ4`;04%lUJ%8T>QCE61Kht;K(>yQ9vhVS4RgYf!t-m|9IP_(sn)A&?U1vY-zgw2Bn zx2&zV%i><#@n8LKV&a2lz52PkTbusl7aIj8 zoNQVBUVJ9cch2*3<=-?v*&M$>&Hl{tPJu^C4&2A)-{!x!^XR-i)#2NoY<+*W_FKN0 z&K}h?*~kCppWj=%$-ea6p(#(#|4-E`f4Ds+M=ZI1uh+TR><<^uju%b0|5|ctdYziG zyuahOS}zA<=J>$e8vExv%}>gDKD@d7f8*Vs$scqw_i=s|VR<(_e}}X8#9H@l?`1dd zkkf0bT6em+#>TBN&YtVr`yiJO!BY0D=UR-VPu;qa6`gM0dhVL6}x=i6KxR5cYYtw@@30*^{=`7 z@>IsQ=8eW*r{;fWd;4^zyh2&!I+Mc+{_)$&_=@>In@MoVTz%@Xw)Xmu)qE?HqpCGb zWmj-b-zd#~t4ZRgYW)9JW^w)H%iL|8U7sEJ_*n6Q-R7fLo^59NwP2d%9+AvFb(J43 zC!`yld2ObemTM<>Rw(9GynWXG;$45w$L{}qres1MzvSJUHKqUF%`e~g=3Zu5xcQ&` z_FwK6{^={7yZ3qe{fmE!u5CW^Kd?RJ%l3Kvd_w!pyYJk15&!O@*q-(4{=a*6vd--F z&zouccqb+8ld-Xm*z|ONS>Dc{>-X>e-F{znVgGX(m6XYUmP}tOk$rpL_onOa#+#1w zvY+eMcwxrzrD%(2-?vp4!mOisV`ER8o4sw$>*DG=dvBNQZhqSLl7IcT_^+R;)deJP zoP4r;>P_ycuPe@5AClMb_*Z#%+T^_X=P%diap!XAKgoYsS=GPi+pRb)udN;5;^+K4 zdhT*w|Mk1&pTwsm+_d+u-t643ylT(%N~tQ9j{*C<>||uE?{KX$FWz_e`Tb?CrJt8M z-P{n(Rm0`-k*RVi^KHIw)s|;++1sAyoa(JflS=;o;pw*A=yP9p*T#K6`RmkaozjbU zK3Q=O2ImIxo9q>Z`3gwPwkf$1ZvM{pqTNoAYK=|2QV%vDIletKO`8 z`yPA?Sor+gK40TE`p;X{`j4shS@f>c;_Zlk+`sUp<(BOiwtPOJ;Q95-+q+4NW-i+! z9(N=0d87Ttl5Iil`%d24`G2ZT)It6yN*^yCS+?wQ)y2lUTO337uwHw++pyjKW(#v} z#ggY7lc!w}6rH%a@mXJ3Yg_ZeB@1UKUXo)Q$iTdoSy5-?@b?0~SD|OTE#?OvlJc~0zr2N&yhque^_xux` z{nh7Y+0Xg^|JN*q(cv>(+5!Z>6Wc(JQq-u^gAF+ZV3de_y-H)!ORJ%G*9{ zvZ~rKp(k#gyUguc6lt*3rZ)HCoL^PW_X}3<4d|L8{_e(>^Bbb0UCy(tY&|Wu$yj{* z{FndV=InYM#C_9Iw*R^7t)4GN5_?zQuYSy?d|uT*K5KJNj^UNpNA4yUbM@|jn&18L zID4qqhUq@>w=SNl+j!39aCB5j#I)1rDt2y|Dc$0D>zZrrWvkp1$39Ktt5U4{TIc21GaZtmchvh&|QpZ@l_Z*tkD*+PRHIz zx$X7#xNmanl;cZI@Q77^yq9kB^xq%jdXt)KKi|Aj{ha=OrvJ6N%Fm0Iw|^FJ_T-{@Z)& zyLK2XWmVg-A$ykUeZSuaRd_1uuG!mI|C-)C-~Pk(q9^uoKi1~|e*bTxJ-dy>SUle&5YMqfFjnbJo?GrzaSzd{kB&-d;5^;Bj}m7SL76XwPzN)O)JS00?aUFX`T zz@mc^>2H^~e}4R=)_1vasmcGZyML}FkzA z4&WtG%XAyn=hanxS-pPQ+NwZN%-5c!C#^lC1{%rz;l>FXmF0W$|Iy=qH~abT^jBYwvF&|)^7!dX#`^-(`s02y zUw`)SnfzRxBIvOA0dv0x2lM16f4g77>IfMeW)!H1VR`UOUOe&yXbcwQfc!ZOcm9~i zu?B#><-ouqC(gLz=W$oDBItng18H>z^Z&i!j3Tfh>Eo^pdH)J0w#I-Q#=t1>;~3|G zv-OWd8CW4<@ diff --git a/doc/integration/oauth_provider/user_wide_applications.png b/doc/integration/oauth_provider/user_wide_applications.png deleted file mode 100644 index 719e1974068eaf081fbaea3c0b397654a56f9379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46238 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

      bIGnK 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 diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md deleted file mode 100644 index 24f7b4bb4b4..00000000000 --- a/doc/integration/omniauth.md +++ /dev/null @@ -1,127 +0,0 @@ -# OmniAuth - -GitLab leverages OmniAuth to allow users to sign in using Twitter, GitHub, and other popular services. - -Configuring OmniAuth does not prevent standard GitLab authentication or LDAP (if configured) from continuing to work. Users can choose to sign in using any of the configured mechanisms. - -- [Initial OmniAuth Configuration](#initial-omniauth-configuration) -- [Supported Providers](#supported-providers) -- [Enable OmniAuth for an Existing User](#enable-omniauth-for-an-existing-user) -- [OmniAuth configuration sample when using Omnibus GitLab](https://gitlab.com/gitlab-org/omnibus-gitlab/tree/master#omniauth-google-twitter-github-login) - -## Initial OmniAuth Configuration - -Before configuring individual OmniAuth providers there are a few global settings that are in common for all providers that we need to consider. - -- Omniauth needs to be enabled, see details below for example. -- `allow_single_sign_on` defaults to `false`. If `false` users must be created manually or they will not be able to -sign in via OmniAuth. -- `block_auto_created_users` defaults to `true`. If `true` auto created users will be blocked by default and will -have to be unblocked by an administrator before they are able to sign in. -- **Note:** If you set `allow_single_sign_on` to `true` and `block_auto_created_users` to `false` please be aware -that any user on the Internet will be able to successfully sign in to your GitLab without administrative approval. - -If you want to change these settings: - -* **For omnibus package** - - Open the configuration file: - - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` - - and change - - ``` - gitlab_rails['omniauth_enabled'] = true - gitlab_rails['omniauth_allow_single_sign_on'] = false - gitlab_rails['block_auto_created_users'] = true - ``` - -* **For installations from source** - - Open the configuration file: - - ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml - ``` - - and change the following section - - ``` - ## OmniAuth settings - omniauth: - # Allow login via Twitter, Google, etc. using OmniAuth providers - enabled: true - - # CAUTION! - # This allows users to login without having a user account first (default: false). - # User accounts will be created automatically when authentication was successful. - allow_single_sign_on: false - # Locks down those users until they have been cleared by the admin (default: true). - block_auto_created_users: true - ``` - -Now we can choose one or more of the Supported Providers below to continue configuration. - -## Supported Providers - -- [GitHub](github.md) -- [Bitbucket](bitbucket.md) -- [GitLab.com](gitlab.md) -- [Google](google.md) -- [Shibboleth](shibboleth.md) -- [Twitter](twitter.md) - -## Enable OmniAuth for an Existing User - -Existing users can enable OmniAuth for specific providers after the account is created. For example, if the user originally signed in with LDAP an OmniAuth provider such as Twitter can be enabled. Follow the steps below to enable an OmniAuth provider for an existing user. - -1. Sign in normally - whether standard sign in, LDAP, or another OmniAuth provider. -1. Go to profile settings (the silhouette icon in the top right corner). -1. Select the "Account" tab. -1. Under "Social Accounts" select the desired OmniAuth provider, such as Twitter. -1. The user will be redirected to the provider. Once the user authorized GitLab they will be redirected back to GitLab. - -The chosen OmniAuth provider is now active and can be used to sign in to GitLab from then on. - -## Using Custom Omniauth Providers - -GitLab uses [Omniauth](http://www.omniauth.org/) for authentication and already ships with a few providers preinstalled (e.g. LDAP, GitHub, Twitter). But sometimes that is not enough and you need to integrate with other authentication solutions. For these cases you can use the Omniauth provider. - -### Steps - -These steps are fairly general and you will need to figure out the exact details from the Omniauth provider's documentation. - -- Stop GitLab: - - sudo service gitlab stop - -- Add the gem to your [Gemfile](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/Gemfile): - - gem "omniauth-your-auth-provider" - -- If you're using MySQL, install the new Omniauth provider gem by running the following command: - - sudo -u git -H bundle install --without development test postgres --path vendor/bundle --no-deployment - -- If you're using PostgreSQL, install the new Omniauth provider gem by running the following command: - - sudo -u git -H bundle install --without development test mysql --path vendor/bundle --no-deployment - - > These are the same commands you used in the [Install Gems section](#install-gems) with `--path vendor/bundle --no-deployment` instead of `--deployment`. - -- Start GitLab: - - sudo service gitlab start - -### Examples - -If you have successfully set up a provider that is not shipped with GitLab itself, please let us know. - -You can help others by reporting successful configurations and probably share a few insights or provide warnings for common errors or pitfalls by sharing your experience [in the public Wiki](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Custom-omniauth-provider-configurations). - -While we can't officially support every possible authentication mechanism out there, we'd like to at least help those with specific needs. diff --git a/doc/integration/redmine_configuration.png b/doc/integration/redmine_configuration.png deleted file mode 100644 index 6b1453632293f010e2349a98270e99d5ac60c39d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118752 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�t+hIK+jeOw>s!-_mpm^+ zE|0}O;@D`yA#&otCYeQ!th()oITN+-U-v(JdxpIQYl*%ngJ$fmk^;tuzoqB#TN!|= zSD7ZJo2*QsOTSDB_A_L)7JU;C7#^b<@umJ=;`o%e{@C zFzxGax6jYc#yUhyT@+va)>J!u-5o}I*SpgUk)Q(terwkpQ3T&GX|R)F=i`jCelSU?OY&^sv^9 zSBF>D*;!pp*yn$W`SQjCTtBK$*6MB8-XZMF(AezZkho{EpOvOXa{Sha(5bc6@ArQH zlQZq*>-GEJIjsWKp4txSo|PoQP!T#X=jTVuP^xQXtr2uZx+|Wb8{?>-`!j- z^%1la0yHvZ`|*hIvZr^p7$zUvVF(&2OW@g?>Hhq}LT7f+(S<)BEMwZi_3ByL{0}=- zt**0ji?!_DS;^YqJw@Z;Gtj9|om!#iXBr=GtpM$a_;~E3(TBQq5&LQ?1=j8RaENiz!y zzWoimgaZuG8FQg z`vGSD8zEbCbVtJzH8I6c))yGPFE_fSMPV7 zkFmGHz1nM5pxwg_4zHLVI?QJ}leIPb`nIaCuXa|pP7*cfGYjpj{q=HrY{3Qg|5;a8 zrGn05d2LnxE(SE>vv~JRt;DDSck$v1eyzr&sBT{PS7b z+I-oyTg*3g`hx!bVrxIx9XwWR%vE;3@VM;3RiH+D<=4Mo*Vn&&wmtuTp8lQ>PSecy zX&$jDdg5{2{hzyBWr{)H{ErXobwT4O>n81dCb})O;pY7KI$Lk6vMs8geVOGKv~-fw)YT5bRTf7Rb@{gPkq`}twhwAAPC7utP1 zT>t*cHs+tRF8nY7?Sa8x1TnH01wL57sgtf`cYR8Pf=o!*`WHoyY;S_s>IsN)wCjqh zg$Ao$oSnbV@D?g=V-``ieA^yTgh1r3uue$YiotXP|nr`$RQ_VSRF09u2t@Y&Y z+UV^MR;7sYnXpN3nt9P~)vr~{4m>$39{_v1?W6YPQw$s^3`#hbI5;VUrd*GetXG?}ky%4FhqTZ{OX|FLb)b z74h4w_E(9x$JELn_cHI-{rzRxy*2y#EFI7`H-#nlRt7I$ptMqCef^E%T z&?KbqER&PAo2zPH?t8uS+G{`GhfnJN|GvL&(w=FeA>j&9zE|ggh5)zkZ~BnM{>t$}p zPp+QlZQYW7e%{-rom{4?9%b)YR(D*kI%kis=k=eTLvBPeX0&EcmUU-5bvu9m-PW_k zoBREqP4d<=3|$d=d28vrJ2%g!f1m&A>gwAI9Gjaq{QCWVfBvs7v$>1sJPO_1`|awc z_1D(^^tb%cR|4I4PWV*& z{qFN!`@i3-Uba5t@=whhZ=-jt+7$nMITyqCx3|qJ{MdLT5_F@s7~GV7k$!T%bIGhT z;omjPpHDrNZ4z_SvdZtK?(02&zVAp`&tB_q^?Xio)5Ax1XFu+@U(tnIfEv&5~yfIA@ZXTrYfIo6=H zNe2`)16Bs9epY;vc6QcIhHRq_&_aQ!@u95YjW(vCt)U4YPpZ%F;q3dhQRK$!%gg(@ z8&_@Glz(fzd%xVb8_E5w&mV5jT-9}sYrEEk|T}i6*L;SHS20oZPDibvOibX*F8NKdF~>p8ke>%%lV+w z@_zQOZCO`Ov0nDKd^+XDy1bp<)Ah^>A02t{@90~R$dv_~oR*koU*p-`o*W9woVBebB>$`PcgR{r9%z+)P^aXSKp&r<#Wj35&R| z*3CB0FFTmRDspYN=R<@F; z@Gm0TWC|1JGqFtj96UQ2oNGiP7@1D9e!EtX#Gz2Y!QsMuT3F3z1DB|l3{&_yRbsl4 z1sNQF-WN~d?|uDLi<{l6VrC*38k^%94t#Q~ z=ibQxiFEMX1z%pHQ!7{G-(O#wyFpuDn=8}6;)I9?55z&KDC`mg`~TV}TwvwjfwrgI2QV*pOQZe4&k( zmU_#tntrZS8QeL?PfWPT)Smj~YGENUl@fZQm=Ffqp!xLq12QzHY-4DAdS>7L7+Fvu zO2qghvXV^DJ#k@me0|7*#5uwt4YWb?&F|A!!KoJAO9Vn|)WgKb)*z2zmyLYcK!f^ivLqGemM4Ywh{(a)zx8TADCl zBOOxQAE@Jck$&&a&f@RIB9LkU;Ua7-iyJH=ad|g3ES#zrYjxk>*4FT4&3+%g4%A57 zkaN>0dSA`X<`p3;C&||RcsT7``Gq2P43}drvg2FR@So-0*6i!Ic9p)4XF);tBR4ZM9+ z?AG_f1FU8rS1F-%z6|>+-VRtE)o0FBJ9ooD=^t@j}+8u+pt> zX1(ha`kr;PTio3C45)+sAVK`YeeTsED~mS7b3F$w!BuE*5M%uN@841J_#I!}}`dQkLma~ z9=KQWnAiICn$14-1bsadmFKI4lI{54M$6ckbed@jS z;`i0;n{zJlXVDZHIhVxLt^RgDRq`S%ZSG9b43?R3Uwu#S&nHYqmybJ&>&4tC)rsD= zX7#2yXM%2biE4}Sta+O9x4G{Oa?Cm0V)--M;p;~`P{3j)C$JM>M5A-`f&XuB{MWU# zH{nW2h!kJfwZHh;nUmKNo}Zg*R{rizPV=^#d?g*F9~6`AuRdM9sI(Ta~E4Tfw zwC{a)*a*2AS`wcC%BCt_Q?;i4oBWUmW(i8_Lk*8hS`Yr0z4>5EaD-kd!OqM*4$9P_8e!^dY(U@&)Yw5k93n&mNNUs_+&-umUx?%0(sVR=K1$> zs=vS6nsl@)a;ewUH9j+q#AMBF`o7)Yk~w*8?Cxvd-rP(++AY2vH1QYUy65keTKKkKU2?TyLp(yKvhIcvT&b(`lID1i1Xpq3E$n>-B+ zOuuyl5|~eit_tz|`KTsdeuiqxETdQ-_xIwPjkYX!d-7Mt?ezJzY5IFUG;y=Hmz8b? ztsw=S*Z1nmN?~Dt zAYnf%-|hE;d>0s29gAM<);q;5|H_I$ufH#*m@{$xZks(#^w-}9&HQg(E}!2g9TryK zI_dqc*LvZsH~Sa943Do(t^NJ2S32xk-TOVC`)ofPVE%U5-=4KGGc+$OcAyf{ z)5cXk75)71O2zbg&^&&^=0j_?{1LxkdwKdQ$$lA2Ba24RF@ ziHAW|m|lrZ*_(*)%t*!Opz?fizn#>Z>zh)&t$)ASe7ElZ&-3+n{$4*;`T5z-2b)$Y zwa?Zv`n~FmRsUo^tCLbD841D5{kE=+-o9(yQt#=YqXwf6xAESs^qXmP^vhDvC|mg6 zouC!wq4V#$5w(;6HT`Y4&%~;=Va@7~3!nPVHjBKuDRph|azC@eM=rN_6egcJ`m10S z(>kt0S`yJa3Leg|(|Iz#VSm0=5@@;Vtn77#q0_gt*z4V$aZxEaA@aHN)~5}fk|f8UKWJj~CVO0{=l99}c7<09 zMV;*ae!2V>w1Y^rEPQR$Q>`aqD}#={y1xE>)5iS$f48lEu=+1(>(u_gZ}Znye0;>> z|M|&BkJ3;ND7+2}P@i}k$g@jltuqp7S@zUo}Wo;2|l@O(WEjhs5KKkfVbEjrxyX8fyd zxwmuv{P-BQG0D~X*Nerz4?{z*$AXrh9a*)1eaGsT=J#uoSDmT(_w#wM?ses7mqWh0 zHa8obFZ9WRx<63^d_PU7I zw}++muj1?fZk@jsG_uG#ty%PUnpMe*2dgZ97j6aZHF2B{T66O1oN4wolhCBF4SVDE zR^{D$zj)<*{<0L5ZZuJzPT0@N<&qG|cy({}_gn4qbrRp3uC0&H4_@xqyIXfx(aA}w zX65f_cg$px2Z^h%reaXMvJgZ6WHPuE*#wE6vdgRd_xF8;fS z+jMo+_Cu$MsCQ9ILxotTQ-NCFrF4Jo+W-79_b#pcndhc`JFw~a-*>y;=luTmwlZm< z)}B?1ydx~D{p2OW&WElJ+u3#eXt#K|wHjAV{@q=s?+!dYJ$<`lGuzGsKlcCost-Jl?J{~`wlT7RZdhqmkLZ4AyBkWqy`FXbQHtgip|NSRt zqLORO#+!HgCQrXU@7sY*`)3^O7XN+o@4R&p8xOJOcZ+I2JND_rZ`%Skz6It>;)pnUfCA%Fdbb+NnEq>OHV*m>^s{Pk=fpT}%Wa{c{S{{M?Zr+3-4Zc0Bp zD^=OO&qV%OSnBh~eb#z6)E|0oAlb7P4oqBHpmE5Mh%if!r`A(@zsx*Q;Ad3B_3-Vi z@VKB_@9BEErvkNh%y~EMn(+sRS?l8VTKVfS;v z+ZxCT4qske{Pt{i{;q$k^40`wj`QKt@t*%Qk(y*@jws5Ny40JZWuUI<~v)ZBb-YstIUo-zpvL^D7>$u{-^;|7mgG z$7|Z!E5CASPS=mW_v+f(?9f#qhN6t$So8i`{IvAVPKXqLwb3m9-kjyv=U#vO^yNv> z1qYwhgXSy_Z1VG7_^9gZt4Pp7-#Jgu&9%<`@Zg|hY7%SBSA*9F!ynWBQ?la_+%jd+*dA@-F-PxoY>h;?vV~f0pt6`aUJ*Qsvo|60h#3{n|e1zj=_>?+eQl zI9^D8mgimee2u~$?|lg;3dE4jL=RwxgCYR}kq?thTc=Lfi_N-U|9|gFg*V%BZ{M-{ z`}a8ev|78M(+{69pR#jbnfiCFN4;^79cX`1p3YOVt!u<&m2K`d&hoELxEViV!{<$z zHuc4yithNxyx#Nq+~$*$)py&^d)-+3<6-+-(3MO0l{* z@9r+vdWKNd$BSIMcfF0T`Pj-UV{sugYhB37N!1t9&&)_nKHm3rH=E;g&?2t`o6LIT z?eFcqU{&@eBXo6GY2xGhKab_Nff~y3Z*Of~>o?cxpv1?t8imNl?7gQQp4a_;yZyH6 z^q3^jp$yMge01xRdAUj}o2PZ%-)_5mGu9xlfor_Ny6^WpYfym|bkA}B^4GoHpn2g_ zzu)A$|6TlV*Xwo0wYN@z77p)zHY@vE`H3aJU-Qn`TlKZ*f8445$Evn7RixYbWI<<% z7yP%AGD_+Aov}jYu5sODr?_JRjuizA+9N+U0)Zb#;)Gfr{(a(xc`*LtM^fM4Q~#g+P7d* z*MF@gYjo1LW?j8>DipMZPE7la)`C4*y8^d7VY0ikTI4V2Hif^xzw^sQwf23Tx+;O}vnEUqj_U)i)=nz>S{UeEo+gx|=NbM~@%xk`*@Nutj zxq29M(!ilnh$DQ8PgzoX(bkhICjR?4X?|$#*K_ATypL-CwAbTXPui(%bJ(oEzHbB7 zsz=4+bE-Zk)tT%)cs0E7Tz|dwy4c-j6`#}VWc1D3s(N4Dy|v{(=bq2!tltUOe|dk* zU9R%Tm%h(UcMhGO_RpT17qyCnS1XX_`ho=Rmj8Y0Dr;Z9|NU$BYNM^kWr}-NURd4r zW`)EHWJT*j~8&$rvMreM>z*gX{+YkxkSesD%zjlPiGw)pY|%UP8+ ztlK6VXK0y#ZiQK=wJHAnaxRP2 zkD_jFN=b;*b zFOq+K{F-*Y>DC{0`Iq-2tC9~cyjSxg{J-5b>zmwF2|ok&$H&+sckz+O89?QKfdTi6 z{2Bke>z4<`1qk|Sh8lxDudVgHLsT2EIoGdS1Y&ptzTbX zHy2+1SsrwEHj`k)wN8yUzh13gziZ0&Y2TNFHv03~|M}3e@b+Ix>&xGG+e^N(zx11H z71_=wn{#rK>bAVQyB-vMHF({>nM-AL>-W#6t0um9JSVi$EA&gq-H4a9y{pAr_{FmC zzxem{_4VzbBcR@H2QBJJE)Q*s(Vvs?fAcx3)937dzj+XI==R?|ebq8J3j56;t zemxPZopkEj+UUFQ|5R;$I5j*@a{X(^z3T!OyMfk??abC#kw5Li{^#%ZeD*7sH;E58 zZyd|t^iS6lxyZwkITZ9+7gf6I{!ZHbYxZ1yqb2({u8x>8i|NF#Cs#mQ=b!E>eI0dq znQyGxrL{kv+TXhVKQ}JhGTf2?|!SN<)uz9+w<*51Ci zPd?xN{&oMqcAeAyny#Gx>jnR5yNtKrzux|1VimSS9<(_JlyoLkGF2Uaxb=EmHt5P= z?%=e0qQ~L_zm&`Fov6KjRvmvo+s{M$`(IjAEl=O^@^My1dz(Yq`B|%YUvFJuZku*J zY<=9@e;?OAk9@BN3c3&PXS)1;wRKl9kWwojmi8 zT#>f=IwzZ__Q|CG?R$S|Zdspov1;Ac*!glxGIwOg|K(?yTm9v$Ab6u~NbuQNrki`j z<)S}JIopAzl4pN8cD~|2Th}}B*lYWb|M}0*nRj`UU0v4GQ&ZoW>dNmG3|Ux`KQ;XK z5ovYx*Cpq_{1^RWdvSLDu=|7-|6t_@Av!p#%X6ZnBS{VUN*aaS^ekP_jjy1Ia$rO>*hMvTB$Qn zr^m~&%od#&s+!4~@io(MUsuVGitqQT*MpYKeLH9UK1K5V8RPSy6+K!K=gU3H=5krx zuXx=1uB!I`n`NMbpg^Nzk9j1GR8~w`C$RP1!7Z7WH}NR)*9M(u6^{`puCu)B-uU3% z-QBy*_1k+7vGaTnybybJ_hH|IpO(+7I<W>fa{bq{LZ@B5wi-L~vN1LHw;(Xa3B-uAP4sq)>{f4-V& z-klvYKK?l*=q~ecpL^DwjNiXruYbGq`Ml!BA1};mcU?5S9`m^A_r=`KY3=;-d7!b4 z+iR|$PwuxBdo%xXx@L|3q}cjJ#fi4~%J~L|B*wqIe!iD8Hbl&?TJ!4UzK%)H4$t4T zruNVDe{4^Vd(~|Db9>UY1Dp2yEOd#kh&9?!V1M>^s{Q-viyv?PW8XMOs`dBpO5f7? ze?I+p>z~V=&wu{-x2{;O@1H+EOh2^#b9LrVhq>MMY_O3zjU7zCTw@sZL-W4+iq`%A zy1xGA+U@sVh3{O+lny#~D{(`Kn!B_oE z*O!~D@>;4jG3~m@i_ooMtZPlzbIsu@$&y;XvOj;{sik%DmyYkx;0YBAH9dFvTkEvP zrmQm#@Av;{Si-l;XLYWqc34mKU8`+OGo+O7{ISej_3@SJ&o6x+>Sj%!t+nHn@6}XM zoA3ix6L;EA`}S4Td8^++*WRU%PuuPeSo3Z9Qul;&b1V-wE>=up?Q`#!lg;5j|Dt!Y zzs<*%YQOXL|NkURzGna70JB;3w>Jr~6>jqVOB$9&Eqd;i{N?54<6k@fxv%GBwViC* zTKDx$>B~z;OQUy}t*u_Ga?Abr>)YG&7oGj~@Av!N54Jk(+Lt+h_q$!EpPilkJp8E7 zblvD@`<~yed_K1fwDC2kd;5adT)hAZ)_yE2zONit|F`setv6%Q z+v&4wAMwpgdCG79M__a4_v!}+8Vz3`;?Cdub=u}hk&Ax6`~AAQe$lqX!)-I(&)jtn zv^exwzr6fs&%ml_e`|Z^Wmn|XuD^7C*}-OZ_WUguzi9?9yJ39ZM);kS@&B{t_jk;X z<+uB>;J2LgX2VSjs()Yd*1vhAQ@B|dbnjU6hEM-&yicyPw~!z(8eYiyrF>3>Z~gwj z&%s|W-+%h`d*$D^f%AJ_F`u4w-Rf^`P<`_Edh_qUe`S8L=?x{F_R zpsO_w9Ml!yy)aED@>0mckgKZtd%s+o(H*StsY`oZ2WOY2&hJCq`ZrGN@0Yn8&dueb z9Z_-4^7)SY$%kb{K7~&B*vxOov7Yal=$^fg`>cJYMlSYMjBZ^XDr*v#eRtQ^yG5sU z^(@|OUmf(!_WPa3;&=aX-CDWo6=*$YRcKM@39CErLFY!Ti`~8J{^nBMe>G2+a4iB| zzVaV*qr}=(um1I~pCeGn++T>m%4HSyuFJ(&iWW% zk~!sb_ITqKr?ZyNIZb5>^tUvt&06-SAFlj?VM`M z`+uz;&P<=DInA5@x9`=9vSl|E`IZ~KIWbXL+UGF$wf&#ZSs#BG!m#&26ZfHu?((r~ zngyTFudlmNaG3Y8$xC^s>1(!YrJRxvd1DzKg z(|X+5>-UyDs979%(#*bp#kJGsKR+D*xufv$qpfrQY53o@NIq)+$JTLa%DS7GmzS}w z(wpAAd(QNbUr+7XZ%hkm{c$ZizgM*OXFp@ztlJUy)a`$s+_5*LVgJK6=|^io*Kh8r z*WG$0=%eZP6(V72KilQ1G9uFFmOiR?3(&NTJ)C2F@VZI--nT2P;#krz+kJm|SzV^$ zLF2<@`QH&WD;^w^&e!Q<=5H+QVVx=S_~DQ3R87GM9@;{RoTd)XC9XDbi?oqs(fWtm{oxx=Sq!gDGaTH6D6 zOfR(Cl=p5n=#-VLdC5MXLES^p#iE5bbF9A?t($q}R*~M-+yA%J?B>!~(7=R~&=vNW z@BT58r}sL`WOd(JBKGx*W_NwKaQ=Bx&9fuvAzv zs=8s?8mqIDcj?Z&o+&+hy8oYN5?inB+xq$H?PYxtX?wp~`Z2PK1UN9V?rL}VCA(~o zY4+N!VQVV93@l9RI_rNvo!))GXyN0(-|yS+`T1;i<|MY*W%loOJU-OSZzpm1_{t#l z(8iUYX8qI1Fu2^VA7M7t%irQ*i_(?T8cdg33^`X`&1w<-sd!{syVd8HoKKeuq)Ww# zIy~W@dgao$&$GO)w96EENL^iUy6*3Xc6*+XT-7&s=1e=Z;HTA$^?$5ym0ph(_s!Ow z%wV<9=FsfL?)~c`bANrg?7x0%N5tQ$4>S|6J!3J?);l4nEA+tg-s*L`Ryn#xpHp3R zCFtc01NG+`3j+?#VlmE~v$#bgGv@r$hNlPF{d|rlA#8d;F?~}ePV03(AGr`C8qp-it zMvj$29jZ3I4ckq1_s4IrZCM%o*y4i$v*^;D_blhJOp7-5k4nql#d7rW-?r+Pa@B7F zb<(ECmT|sbw>xjmjI$x2#QA^oiy1jLH?Z_U)W6>wn+A-*=tyvS5W;Lyzsk51PTtj(qP6eIB|= z-+bG{9^-QyE&nrfltpJ&ZcyI(&1(9o-}9&CheOi^IB{SQ3!XC7oD2RJGxz*ojVGTk zdFvlN&;4^v=dtIuHEGAUn|+>{c5l_R$^Gx&{A;zUZryrq`r#%2wv}YBJ^oNv*yH$u z)MCr6u!Mf0mNlsLK@E5Cj=l>jjeDXJpVr7Vt!KHP@#mb2>9eAUpPT3Z&EZk{eBALK zhpLRXJ-wR!T6cCrspXoOd3Aq&d@MbD z>gSh`$+pjCBzGkw*{!qu%i^(;Df_hzBh%EDPR_h#^6R8meS4Oe%Ct1(gde}Oz!}vq z-iwpU<9N+-|CZg(4G(#>%u4t8_p9OYx~mw2eXDQhZugxm9{bN@`KOBD-h@1^`O7j_ zUYXmpj+u>zLppy?p_J(E9DC8SVDI0Pa+tB}&ZmZgUB?9+d>Lc!oKmd0_PaN~ zX7PL?=hf8ybvm*yNhtg_NDe($%x@9Xy;{CUXmMpCzK(utV{|5k}MKDwi+ zYkgnd>C7JWspplQURA%{8eU^H@3X<&$(fQXPdm$Kt~pa55ZGzSuWcM#J=go`U;o<) z1S0z@(-Y31$Di%&;+2>WJa?_JHnjg@+*9~7z3JzkOv%{0u}fB)FWB?%T}Q}0w|H%M z8Fpqr6EizskH7dc$BiO#a@J)zHNOnr$~r#&eBRzZtTweuYhPT!LDtL?i{EcHcYDnZ znRHhA;06&Bn=cof4~y^n(3*5J#HjAs%=9FSiCJsP?^UMTWv^lKU7GBa!Ef`yVa=^s z+or#}TYf)wdz98~+oC5YejGp1A*h^m^g5e%#-pQkzu$^$>n{H)Tyy5O>t`*?;H{Ha zt$)Kkb!qU4*`>lBsxHUn-M`lDf8M{eDD=s_z17FHPKDe`y&2NC_sb>k?yJdPUo7qy zbG({#q}}$+`9dX&&btrWb>()MO^#8Qf=vR-VahKPp%zMvD?7wa77oBYT z@5kfDRaaX!-Hda(=G?~9`S+;H=c*`Uf4h3`U!2>P7dQW1l4Skx(Wa-#{kCB`)7te` zgxrbCeYte{x;6WJN>l1GWaL*V`p>hmWP5#+?Oov0Y47Wk_MW=<=Sr6P{FzWGoBI-I@=Y|jB4_EE+GQ4Wm z&Mz+qy04OrgGDO1^=jPSs-p|!rrL16y}07VuM5unN3~}0rp@{OXvt(huH*9cHFM^d z&MUnZX}H2|LZAG<4h5aEr&GhtW=vgm&5>* zm2;Z4#(e!NABinH*Jk})KDR7N!Za&nV+UwJ@11qu%ado5p6rop%K0hp^mE6a`3*03 z6h8js`0!5gd0yvszTU&rB9b}_o=kLSb2`?tIC%HdY0+71(=5}n*KBl~GiAX8P)$?! zefRyPk&lZwn$6RHcg=j0xs|~&`Oxps-VbVxrH4+oT(|U_ll^ppq2p~(7eBN+!=PtE z9@h(_Mfvyl@g94wzr)Ugeb%a3v(E>=i?4h-wfn!uiQ`YN$Jy;!S+{1^ZH~Rmj%}S7 zFP~X)@2EMy$@9mvUfoY<<~=lh|DUH3u6DlO1~X3GTv>QFkkcYGBJZqCW~A<0zxj51 zD}v_y-ScFU_pBI~U*~75spmXnv6=WO{{QE$H{p=j21hw2k+ILgGULqi+L~n^{~DU?G$))Xuv@HhWKO+W z#Jv4Kv)}E|Tx}otddJtDDM)E)S4e|HvRqb5ve~_g$3MO(HXh$Ix9Zi(#IIMw^_|jK z3WFmoecdHy2t-(he7lvs{;1YbANQ>n=a${l47(LmeAcu(^Jj9S)}cz!Ivc6hOn!?8 z4I7TjRUfgp;Mfy*bL*;)>?iu`zAR=-e7fr8E8f*n_6su)&0pDNblc~|6t7LWnNKe$ zJp2%nXs#t^=7UYAvOY$>ScC?Rq7KSRE^gr)BGxa~FjSD5D(AKRKzxpI-g z>D+Ucy{>t;=Da<*{ATI(*vGYfuipI$;I+hCF|KD!Ee=p&h&5t?r&-1EfJ>y>G zA^fBMVXOF~-#2Ea&y%eC_j$hgj(JwUW3rwtvz`g7ap46tQgib{GV6~XjoNL~?bM%s zF0@%|{vp$=cR8SN<|E(CxM^3fou7N_b%I1hp1$Yw#qj2;K|F_m zz+$7Koq<~|*6%t~vFiUcZHDR3A5X8Y+xPqK`!;sDiUk~BpI!EyVW9Y-_}k6&)oyMrcN8? zpL+a9o%!nR)$4A5yH_U{bt83p>?8iNkY`ID{h9y&&+|tM`Lq&)m)ib)?(Y38^W3*j z3LZaqeEJ#|QuTb^me1#`+2uaG;OnjSjgzcDZ~MJR@!cP}zmK~0&A4=)U%mgiIVe(LzbJ+=G7@aMMK z4*zai-ej_~ezbXhNbJn>of$QLZVEHccTbB-nUZE~EtT zxt&2&|8(z#l0B1YwoA)S>uz6i&+V@E`aMQ9 z&#muwUKhFkXo8}1SLV81uU5@kn6j#5`_m}xuuHDCEuS-60(MRhF+CROJN>|S%ja`~ zTe?;+TWkIXbd=ud2aep+Je5PdTi@I*zi<2JUHSg*&<&F3>L;CBpM+{{y^qZ5j6;;?fqG_x)aV{tV0Fv{_3Wzwdgzj{Eui`Z|m6cZv@y_uE`bkkQ|E zJ8!pyjJnCctLy8wO4MI;6=!X_zq0h%&MDV23ACHGG0dMjRa@!vO|{mW8b`i;I;|i6 z&!8{!)cod6Yog}wzk08$Pck`SXL3yJDtOd5n2S`rTDd&wfcE_@pi--G!TSS^%+7L? zR2bYPK0TYA&j&gLsC)kH{Qb6fDxc3idft&;Hbke->j=w_6-K8@KnD)s(^PrlE#OwhR4gU zIOSt8<=EFbt9boq8mY!qzuj6`@sEFMrv9D}hiWd=TnC*lC>GkIzvDrZ+tr6R7lKYA zVvAJwn(gH=uE&n9c5 z_kH+vi_@VCccM@Ceih_cR_GV-ap#=~v(H6uEcGvao3>ng|GDj&whQCtExY#m&mO&S z`!qSZ4GXNwvLr57eSIZ*fAWiTNtT||-(9~6D@$Envoa_y@8@sEtKTcnW=YH|Eo_EU%M9K^u(`f&xh(Bzc~x9%K>ZJuiO_-OpUPt)CAFE`RmJa~oUK4`FK zZ_bsc{EMD#`D7>1b<8}!S7F%|+B6nMfT%Y;Er=j*dS2y{)%a(=|-r3Q< zsek37+KtKb-`?zeKJVy){r|qM|H#PCbbF3=zum8lHHXfcUFJA^eRuuQPP;$q^&Lwg6&-1N8k=wj!2w(g#O5NJU{l82q_eCfO$iZySucz4igrUE3gGS5vW|t7z{rqy69azCZf9>m|p$&AeOASxtX*>W@2SD+rzp zL;@BxGR%KGMf&im`8$JS+VlI~U0)ynK-%PIPx{WM)4IXkD4$@xBZoI-tzEw7U0>Z^ z5BK#4o+A2C8W(0Vg**ji^x0dz4jsyjT2&&XXZQ6=aChbY-*?|1+wfT3?qg>}@1%lz zD*_jHotn>*$JzJM+rH88P~jHC+ic3u_8yp@aDTbo*Odn8=jQB~|1|T`YenZamT5<=f~plD-}s4{+1K{y?DlUfADuQmD1UbTpC{^ve|&t*e4U{; z@74M5Ggh67|8YpX%kg&J?%W!MhEp$0&dvX18RB#2(7Zj5^0?D=)$&g*p0S}*Zq;t# z4|Q+1UVrrW<)dzWzCTl>zwh{ZJ$}E$7@Auai{#kM7%-`}03mg|NKEJfa`VIb8 z^$LB59W&0qy2L;KVqi#5lV!_9&3}hYRys(qUYs$l&|7Dt%baPIm;RKjW;*?K`=aDy zX77V{^+j&?4n?#c7My1J@$~Qa{r_uuo-XUXQF=XAI%Ji~AJ{tJ4pKMdylMuRLRT z{K?{^(hI)kcefne@U6~q>eIK|ZtHCTb)4)r>m9oCvS0q+16k|8=qd(d7@B^Y(bV{s(!daGpuc)~jLN zdv%)CUz~n>dH%l=9%th@r9pe=U%OVkGVA~2roRM=o^=kt=B&8qQX_Wa`9hXyC)Gd9 zywjzddkVUA-4Q( zsq2K?S65aV-T0!{PZ{R=AYwUa#HKIt}~hQ zcJV4(|LMl|ieF3adt5F_D}Q%qXXEDy>_#{EwyDqDxc<)Xm!CpoLvMSQzTSSnZubrO zRp!fo-mbPUs-AW?@Oe;m{`S+sh#ZT_dgjh(=k48E^~2`H%H{L8_-(%g{CU%#U%70> zg;%TB%a!+@_xf2g<&kO4vdLTzm(=ZQnGnpVW~VK0U6%9bPS5!;^II8y40aSI&2i+PBu&c5a4bn14_W?u=zB$pcr&AeG`vXS>dM-)eN ze(usmv`s?j_X^OY)zZD?H&L1%JN;;c7}f}sSZt!509&Sx+?If!78ier!E~m z!1pS1buD}Dv~HwA6*G#&Di{wPd)fZM@Tj=D&kTWkmCxr!+-S?=(g{yoa=?hS=!e^# z>G5@zddj^1r`OHezPT+jap&eGvHhUtzr%L14Tp-h+u7vJVTx6AFgt96@frVFIRuygVHBORas%jutakDE8pF1}pJ(Qt zVVHmW^H00A*V3Q=tgu`DJlf%;&4;y1n%VjJ-#nuS#9JmQecs z-d<*VmczM-kwo0AFD#5s$3(tF6&@93Zrzu5ex5Az@h`%9YTgbSJL3{8eVsXGJ^lF8 z_I}c7qsTIE?!K+te=EJ+>o9#ee3S!ArvO)%VJmA;Y3i~C3vPL7uNB!X^7GN`&fwIi zA`yO#PgbceD{Pq+skfd}pebJdsRi4STm*I&HsVDTW7E;o zy4z#c^qiTtM4`xgyB6#0$hh#3;B~j+m`{gl@dbkt4n*q$c8(A2XHQI2u0AktS2ylR zLxgWhek15)dbTN?68hV2B)#3Xv1R(tm#-ddYJ6H|y+qH0V2XuUjBtWO<23G)kOec6 z($=oMa_7_D6}HEnwz^xok!}zpt4PM|hQ_Dcep+q^Wo4pb3dzq`1PwOCupbXZ5<>W! z0PBJoBlGFp&&7F2@d)mN5<{#|PDt3v*S8qI+8odBJlI(P*i|mbWn!Cl``Pn5OPWN^M3F5U4OUjY9zv4vf2~u zto`PzmcP06@BbxUo$|I#uThiCu7Cyk_xBaP-JE{@-J!JwSBWt6uA@S2*&I9XcRjgA z8}3M+TIYiTLzgu&yGW*pU+ag=E(CcNH7E^T6AmhRUgUm}yKm!UF*2nL^ zu)qHQh27=v{r)O%x!7ijlzDMkyWlX(z3TUSL7h^A(pOg^B4>(zylFUJu{`bfi8Ya% z|J|OcT@nkiyTrY*@_l>ZW;Py)3$o_tbA!OfFSyGBx*zbz5uN%ex1fOomcT(&^*Q`1 zyLXOHTRA6T=kqz~?^c3}00&t{=F_DGGD|^edcy%ufv{(L^M8GL`4DvbMcZ`o9nNp~ z2q*Z!h6zRY_thRYI;|u8>&wf_srL_LC)^Yc0(-u(l8J4aEiVyHgeht46O34qEOvX_ z(z++g@|^GYeD<4Rk{QG^;p48Qy_IQaW(dYrzuo#_{{KJfThb(TW0zk>8i^n}cRDyX zx=QVPb1S^1>wf+JzXiu-%Uj&#Yq#8(VR|h>x#m^ye6GD!U%CGOeP7@GFw|Bj`PrG7 ziEnOfOnh{tvv5+YSd>N%Xt4IOuX%3Kzg4MLK49OHNJOb$$kozW&UFGbzT3RPX!qAM z#^+l=NBzA^oV6~iT=M%tcKMdq>-X>D&^DGm{BGaxcLsHTDztUO4_=jMOaHn2*b+Yc zqwm;rQP6_u(1l)L5kdG}U-=VNB);{mmuKsDnCA4a(o$`S5D>`nHw9%iCJT<1Bb2 z3>4Pvc+{16(N&z+CwR5szOA9$OBR4mpA)b9|NDM>`Mt{JRfj5_!=o~ne%QLcRu{C+ zRw8QM$tN5nS3ixFOm~$w_(V*buR1-(=*z3C+H8|n_wh}wjjwpvT5#FdycN_-I;isZ z*H>=q_j`&LM6Wi~V=bO}Y{T3C(+{z9UtH|ozWe>Y-D2^Eb2j`aJT5E#?SB1#gQO!J z7BQ!rj?0nmAfE-%EYmi>pm9zP*S>jpK>pkl^uPvLui#z&&`?3w6Ci~k-`dPhPl9d1bMsoj#=kuz~R=CY| z+xPum^}{2={yf5JJ{`@VL{#u>W;!VG+~~T>d2$^S*O}=|pYQQMF8gekgw))_QFg)# zCQt*)zA-O2vGUv;%ZF{!c^sfwy#=#A9h1(N;po@hctpt1!u!XLl^cw7f|vPlf=+6_ zQTcrC;Xdnk5};nzjvn)S70P!?F8hA`>Sz5nMDkd!{k5Ojp3~#1GB+N)owqypM)vx> zS#A9*x7lP}Sy6CA(B0+qOyl%6(8%B)}wI_+=YUSA&{lUALdf5+p0AmIQ&El-{mH|p{0EI)M$)XlE|&FP;1`~ANBukY{W ze|>u^&2ePi=5tntF}Gr}nU?z7|1ANP<1g;+F6UY5H`{FOjJX$dPN&?pHBFgyXMXj& zogW@`>$^!i9RnrX#Gq}7a#D(Sea&vFfCiQeqnsYGOq29~@dq?i9#Q#p>S56EXTed? z@D|WE`@(%8y_T&L*YEvytKh8Z^&_jU7dG+#Pqf_qeqZ$;&&x(#AAU}Bmy_IW{bqyn zoohAwKAFV-eHDKAT6Dhb_Sf%rzvlxPk}UA+K{G#J^6@@i(2PRmH-`l2=A&ZKYYGyo zIZlIe{KI{}-({QluYH?qvXB`mU7!XF4v9uNjSEj3pQiXty?2G6ZqyOXzX0#Lz)AZ_Hw;tmG+4b_I|%- z&F3AuVW$52q?(Ja;;qs7d#4_BO}6y;JbC^fl|6qxoj&?uPy1Ja6tx}yF32Y0&slS2~{x3pL#~{lg#qx{uusTT`VRGgo;9f84!l z>04C|e~DYf_2-aFhY$5kchxr7)c*SN|Mse&`_lP)1g}LT_g=biOMiNN-A{wOJ3D3x zUx^MsJ5%g{AWQCNt;4hPc4gi(#?^EQ=4FHNP)YKjY)P>UW&g?{=oI;hPsd<@)PvQVZ$@>YOE+2{R2cfBigP|1bFR zU(m!^bpGDb1(V*txw$#p?|26zGux4_J?r=Xt2+BKLj3hwu3OjUWHL%kJacoY$i1{1 z3mluf_WCs5F27%EZu9w!vFp^wCXSyLM}2y5u=(-E#E6}_8;^=ToZ!sYxiI0F?;Hz5 zw(83z_kZ8}euzyvXF^;XC`J?CZoSS2x(r(8+W}^N7A|?{T>mO8 zSNQRY88$gLHdsjh-UV8Zvg&q7$+E!I%2!ub7Vce{WpWs_QpKR=M?qDx^@jt@hZlA0 zNgeBxm0of0&!cYrV+V>VZ(sUShSISiq7l?MPwm3e#-}p7S25*D`3rp6dOeQY`rVG? z9nWTEUwYscJ8k1>z1=O(=T+;mrOaHvYH6vY7O(3BPzl55t-CdZr*QcOqr0FL8JGR6 zbp>M9T`jwj*#2RueywKTIp#y!>-QA>IA*>tkfk?L&hf#OZFkFVZ+O@yeXMj@VhN`~ z{{Fw;HWnFvzEgBsH}U=6@8{Gtf1N&V5MOV2anHOOi>vcKZz!6Tw|46_F6*~jf(7lC zReiGi{pNDQ{hMM;SO5O{s=aNt*V&MmwCHvo$w^}A_~+NL6{!jH4mjO)1ubIeHA_9I zI-Li!{*mW!(9vmL`#@Y1#1*NwUQ zMT5wzWw%4VzKU|uh)UjdG-H(O3YDxaq6}8`#r`! zGYk~vgqu!<+_Qbqz) zr{DHl#GLw>sna-DuiKRsQFb#m*WC zU4ad53QA1>z9B|SEP2kHm-{{*lP)xxc6oRC`=n_myv!2YA9ZQB9Tkta(VHJoV7G6^ zN>SS!@#hXvaj%wr6{=B}@ppZ>d|s87-}ZmMUbp}Kc3VHD=%ngVDbUgY&_u%{(}mC0 z*F4oOym{228b_&*CpS1vXPfqUgU0cuS6fc&@2|1ZX$j+O0Uav;(e(eGzu#_y+H(u@ z@9#@IF+s7h;3a5ata<76`1;xzrrBYJy0(vx^>#nJE~xBwlk6#d-{29UVXJJ^ESoMo^{*beZN<& z-?uJGpRuBjLua$jGQ}rB7f4@`gU-9eZa_KdXZl=%Y1r2tC)}S9c zCY^sLVU9kj{%)M71Iqha6-efzqCvMtxk-XIQ!$*Yu+yO#D|$mjCdyau#_ z?wJyY|MD==Iexb%9b1~Wc0zTO*xl&7ovQUW7yN(NF0U82JnL-z-`DYnR|GCTl(~HF zwFR$?KyBt|i|2ES4?XJEmwR6QdhPZuult#^yI60bj*t-1C;Q?6YS<!&t5|NVO1{SY+2W0U`G=ks}>0ha?cKPzXRTNt;usuk1| zJa>I}`TGq=guF#=U%9f)A`VYh!uoN`TBpKAFf)xu1gAZ&b-2s-QVw3w|~7JZ?CiK#Ue)MHenGzU4DV( ziCcGN&IL8TL5oT}M5ok$?2d1dEx%)!v-j&YLx$Shx!YSeCLb5;zL~T6EYs%;9L)T3 zHWoHtuLK*esrhozz1^A5QblL$m7s?w)#vkw$Cd;NCh3U?r=XESIzqtE);jO0UhzuyR-EtqLhn6%^1r_@(T%oz(0n z38c1N5*kHbm^D5XQBm{oPS|OC8&vRsW+FiAop#*VvhG{V@jtuPq&OzbJaquHlR&u ze5^+z%Fpem&6i-_U$gK3Nqe)bR?q)2>20&+oH|!z%YT4w2>E{YRY&T!-)?1(m^iOY zbKVN-#9KU_5`3slIxnKw``6dk;(XR`Hb_|A%UZqmQ3<#Ho`S_MCEZ+~tU9(s*v~>S ztYDc};ZDInvX(_D7XN-cX1=`a?Go>;k43oj&ToIW>-8}MiIt>$8XS%x1O~x zYi!*zzqwJHH|1w6=@*LrGv$B3UT+7jXepEhw?sE29%fQ3yLQ${EIMc7hC4;4kER+1R@Sv` zlv!1}|L3#Wg>p<6bM(zLWzN?8BjYWSwS8b=jEgICnhNNelzu*?Y5*KZ4<0d*kFERk_KE4ilyl3A zw9kjjy(c4TxIoEnPQVM$29Ss?Yj1CVv8el4>QaZy=;_-RoSh%@V%sGMy?u(X+%Fm(?8A}^+iPO}uq zUbi!CO^P*WXyw`Le6hwG&*W5AJrCMizW3`jZg0JvDU(IZXYanlT4?38ZRMl_@9+Ao zB{Tak7@hXim7mU^eQwvM%HaA}%TlktHZ#?IeA#5>=})VEMepAGb=&zum}Nw`2du=w zU+_g)<5L?0uLl*Y*KX@lykWy}`^rJj(+i@%UcU0jwy?%1+t0%MyXWVniBGR*R^0Qw zY_fHoNo?i4WzW1XKmUAwuC+O@-Z@S-17EvXsW6{E4^8&uW$k_X^vUTB@ub!TFIFkK+)@lf^qz2fD|!q>+o zK5P~5`#Vqk^Y@RXuSGNb!6WsB%xpXv=a25vA)(k^aGbm3HP`8vFO~#k7B`>Hta`TG zey`u%Eit=oof{tSyOGp=bbd|$<)0IF{j~Uv)Y*!dzzQmu?^V5CYf${`jKhC+`I-$1 z@7Mh%+;9I9(by^$rJ=L&h*09nrPH`h>+Q~Y^Pa0GFFesw@yWv{d+dAj{ml6nJ^Ooh z=JiZ5nZ}ZTOY*G5gUS!y4F2xI$a+gDq4nvu7nbWm6A1_YsC@YKdVM>nk6m{wWqT;$ z;9nri!lAz&G>-e=K;zpDTc+tQx*ZzfH+%k}B`rR|^-|X- ztB{tbOf*>Y<|l!y-N3~4#fQ=9^vX@2j&uq$&sQxEGv06~^3pnYut_lDg;FD^k-ctb z{QkPIuy>1+A7mk=Bkbc>jqem3GG?Cd16__g0W>}M7RU79Oyl%pTR(rbL!PF`+Tsdu zXq=}DoxyBtYkYbxpiCAe*c`;U&dfAcU$?jX{k_;7qD0LJT5~Kp-*-9vWm$)Fyaw+}z%gs;D-B4pbJ$K<7D;$1-g)O$w zd$Ev-ZCdq<#&V)oC7_w`f`@U`Vxj|mL-y@#vD13bA$H&Kq4>U3#{&qY6e#Tp*JXeEzP|o%w$1hO8;R{3{(L%popr8ZvRg#O!`8=NHz@4?f7P`hrQ-kJ z?}x45?-5pgcKv?qt*W)jAHLnrKmPm3qi+3okqdETOqa&Kza>G)`|(5q92(_R9X7n~ z(q6~Gt-B=vv>nFz{=VAiE&o|kII6F5T^4FnV{r~xr+u4UzDD4jy-|5;IP>Amm$u9v3ok+=DDLiwXD z?|t2EHx}uAb`_5m`S)%6{;j|Mu77u^`iDoKsr{bs=lLBA>i+Ni`|bAg*ToBUuUj2| zb-|gxcfWEiXyO@k;sC#W^W9q1N&!~fcrdX|o7@r$mu!?%oe<8udh6pBCGqH-jTdBB zH9ftZt$I4jea*)YcX~J4E|f}1ZapV^$aHd)x3lYcyWcrK9`e^qq=Qzsfu=y_iiz&t zoPM4!{{OG*$yc4Uq=XwXUs_4&Y~a;b^O+&gY@w61e($$cF_+eEzbDl$yzgGw?Og5U zFV8eyUhc0Sc3m>B^2HwGYvFI^*v?e~&&z*sR^IT&FweHS_?`ON_^RLMZpN;AeXhcO zf!9CKejLW@5y`y<6(1hVn&I>NPVxDxGVeRCaVJ!tF+A>a|KH!=?VHb8t$yb0yEfkY z_t}%*{N~y0jCk;;DnIA+)^pX)s|@D;kBeAv1IM6-ZP=)bbNlQ#r!C!fM96zd+-~j;hdSG3 z4?Zz%%AUJV+V`%%Rc-UDH5+!vT>ts=dfSASONO>y-Y_f1;l1-Cinp`Sz8KuTHIReLkz^!$J1P8*kKp zzpJfn+b3^tXCRyVd~SK)-Fe^6Pm9izY~z&{(|#`%@h;Q-{@>hn4#n@(&&GzO`&^e@ z|GKZre#g&evz1?h<{I9oeyyoI|LbFaz08Vr-uu7rsfx;#zJBFBdv5fuV)e#%6>FF0 zZe9(FX3Tcd=k*PZPk(;DvGXaSjWJip;praz`k$vaW@WAVa_!`7f$-_|XG_A@?7wEk z`~1qJmpcy!x7spQ=I{HN_NS^~-Q1~RQ7Z#aOrLOl_xpX(31{b8n}1vWL0q&u_^X%O z1|Kb*%a^L|)&Ku1A(kAmO3fzq)RY~0)10S177dG7IAh++sLPA~x!?e{B?JsRJobY!+m(|o+H@EFE)V=L*>KV1a?ypnaM}zrh?~ms_I?{P@ zb@}^y9~IlHzOQ*QZCm$S@W$CcJkfbOpB~zDT5tAxC7)R)nt9fbL3`O}-9B2YD7$=1 z!>3;o=W2V4TNI>TA6mOIAZp+Ioa3N^f0DP}%&^O=^0LoHZ{Bosb9(#A;N{0&H@$r> zQP{J(FZAXb+kU~{KFQJ6`Fu~BH0ZWSi>~~w5B{9~-YobgI`}<%A*1}i z!$vpd)+rx4d*|}3UE!dihKI+b^LxB+)ct-tTht-%RO{E`^^fQIiKd-X+_v=I*Q>KC zKh@^@)@S#{X7|kAoGX*P=F@kd_~Yh7je<7F2<<(@vi{mH$Xlm4E+eleuJ_!n8x{#=XBe|x2CWk`tK+bx&7 z64)FUi(K%zof_WwPVIoHtHJ9vo6m89_J}o~RSqb5(8%5pqsvQ$_`E}C2PU!jbugmTKzAQMv$bRAW0>N3k-tBt*Xai_tQs9K? zf-P^4^-7B`znQ!J?xU@zKlxj|T=D@lI&b^^j`6=ab-!M^E=^-91l1UiZG5V~UJY;8 zUbkbBqeu5d?R7hneq7tW@2UceZ2GM4{D~)_i(ssIwRS1H^>9e%ZVCKo^>xF#C!iUs zqi+w*-Vk>WG)D~HMi>w|_pM*!Arsz%PJM@8tzJKmt@Y22O+MG=ukYVres%fI{h_-3 zmDi%O*Cti2Tz;=E=;F@}hxxi0KbX`O@6t6q{_H_Bzg~~s|DWgE|Nor-KXZfBx$}ql z?f1-hHYM1P6Lb{CWq~vQ-saa!%hmmO$o6@O`0V_Bl@?zvICl#q=UuyZ{KYxz_dVA& zuCwN`yalaF*rMq={qu9}_@7=H;cNBPR=jxG@z~|S`%B*Xy6Xpw{=v(fe7rB$ zV4nD$?0sLB>YLtDJ9c%~{4Gy+JbC^cv`pxIV9f5z%Y2ikCSF+)_)vKM50^Ljz1~+# zWyQZev~O`aZ}8X5F9l@yFx-_Q=g?N0a}o^sikt!!+Lh z_rXuUzrB?{9$#|N^xvWIpbPTPp(_8*A#`w--fJ&e`hoPq`k`sf@kbu;4hS&ZWoS zZpb1nms{Y}ARyLgtkwCnH-YQnu|1RS=Wf3%);x{HF{sq!nWrPO-I4l_N5v0+d3iZm z_2#Os6(OD~XJ)Q4FyamUwo2;iDbTd?s=(g1jqgC~bJoqyRsQ1?dbsN9?@z4(l9K|0 zZ|P};1%2FnC&GW<`yTa#gCB~fZvV9B?N_V#dfngOqNbnD+{y6#0%-sADM?Fz4$;E8 zyp2c2KJHmLr{JE$A3cr)6ow8>bzYqmmTmA_5OXf>~ru{P~%2PAc+J8JE{BZaEzj=ke zANL)59rbKZwv6|oW}77w*exQ>PXGP)egFKh%L`6#{P$G9{$@hNPgcgTcdWnPZjY}F zIs4nQT1Nca!n27V~fw4e!O>V>)dmh zJeJ?H?sCsCwEv%__vf%+W;|$}-4DCq?5aaMWy0kSJovt3&qm*u2Sv1krZcbkx#eX| zqMY0ePhI(QmWN7XR~zR2`SH;;!*p)A?#%X7^~+WKVoNe_gq?d^Vz=eljjcy_OmnrH z^LF+3fBp~VP4hqe)vd#9Yl%#R*#5}^@77+mP_L*zd;fS;Rh?OB{gXdW9?tvnZ$D_b zxVrY2?Kacz=bpW(Ut61Zwm`?XgqxRDkCtlbGthvgO6HqzrgIsR` z?^N61sZMQEmoL1er5NHQ`!sh&s{dA-=<8epVGD~49!5F64G~oN&)6-OUcMFn??o$gie=h_umI`w6c_rbY)imboOteP7n zIm4~>qDa`YnB|xBe*ZrvozJqWT+Mo2sm{tB=e9j#jJ)>w>iRm4mb33gKtf% zie05#^!L+-L%rtrB>IExZ27}$KF_}2qiDbFYxw?Op*+o>1Q@?J+ANuSK7953RTp#g z7dkk_WX5lJ!Z@+y|KqQqa}rq^XZAlZ`0jUTS<4xVc#dWBs$Q+!s8w#XersOa_G5Fh z_OSf9^wXuH`)jejvcdGG?mcP=XUhuafLiEE7Tu4p@B6k@BJG*YzSrw^cP)@zXm#%R zpLsLhJ6Fpt)|#(h^N>67_1f)yw|yLbeLAh*zdEg&L+5$ogPPev_3kq2Z$9`YraE$vV$rwf`t?7(1E2np|Nq0? zMy%5G?iT-&%T_zrRc>g{p77i2-iF0dR<9S&%3D=d_j*r$+Jo{=5ig(5S9ZMG)@qH@4`Y&cN_?!2 zz86>j_iKfI@(s|GBiq8$e-bs1J)RR48ZnjqM$m^D#ToDSe&+)%N3)r4;lJ|7>~HVy zRln!`!*^p=0)Y(7y+s7`PnY*|A+U@^4n#z8)b6wr@f2mt&^*+Pq52p9^4pwXZcJjV! zvKGEBZhqUTZ6TLebA7nF`TX?s`sZ8%ahl<~R3-cuw12p{#B*}egZ>L|w|!pK zQU4}czT44c+oT0Hikq*r@ypAtz9FQgqT+F5azer`zf;d;4mzw_wv6k!kALdz(D2x; z6%36FZkXN95q55wQ{R#X+62h#y)r5<%0716Oaql(hgi#+69tDVG(&b?_Omuzk)~|m zdP05f?>o#K?iV+BH>SjG{u^?~cd7?xSfQ^lhsu-LOq(j^6rIv^b&Y@abeHOmqaT(@ zDdwy)R}VjQD5g3@Z`nryhVPrUyl>f6q0#Jh!i4FJE~k#L+G%Z0;X6tkUJ4W4eq^rS z`>pG?^8$0*Ck`Jb9Z0?9*Yv(6!19=k`nzbGHwP_4*KfTxC$%VEWy{fDKNN3x-!KaO z{%nVw`TA2SRq_uGN-*6u>C^vy&!jK0CDw9Xi)H4^JstX+>a9LW1jd#u?lsf8=C(p4 zdsX^nj(I}QR8-f7>|Pvvf(@Zp0n^k`~L!+9pxV%@bp%$6soxr=w55#%CXq3SIeo7=Si*2UH%G* z6@UI6Ei)~(_vFq$U3l>IkH`J`+vcX;D>|+F_R*wm{d$aVMf~oh&#yfMI^MD8S=~un zj{Id06GfSh+;N|wZ@O-!jlsF!hbAaGC!Ls_$zfLiR6Cy2cdxv_GT+_{+Wd7(s*i$Z zkbusbf6JGzn)~nJtwljqS%2(~zfW5EcEe%5kBmC+>i5jQDS|c(59Ky)I^gt_aUXKa zQJqVm;lyFBlMN3Nx#llT+{$$3=?0_A!KRbl6n4Z#So(c=Xb)NtAr)$J_PB7BN3Q@| z{Qh}OF_{&i)7S4(doZ2J)yFyYU{&JN8cUYF9N$cq3p%~&2-7|getw_ww!^7r{tW_& zt7K+8Q{b4QB`$PINnlEpoYCp_AoT}oK&)s@8toK;4ZJ(^Q8DILps>GY;Yn~Z5IuzIW37_z~t{$4h zS@gU&b7kB-r*$FnX;n^pR|+!8*i;l$MV72|nXR=zoY~vmE5ZXtz2hTE;Y!gioKe<*7CH{hKf6T z9E!3+=BDfpx?TVOuXM|!8~%r4LjFAaG2J=$%<;Nw*|L>AD`e)hPrY0waOvr;g@yY9 zOLvF8Uh(+LgJyoQ)lX#NO}Vv~3x<4A?K#7Lo#FN&(@9bXe~EWI+ZE$JY$#GO#51HN2&8$okJgA`IJ33@lEjF-=4G9uRY#6p-n{Y5Y^KXLDihC3r)&M4ynp(~ zy2EwPdw*+xuXehiIp_AQ%1^1=mh9gO>KWb9qUe14y(o!@n;GGb=C-;cRgckM6PZ985abM@cy+{}Kx`$m(s zP8XjAt@!E{JN-T`Eo3q?x8_WqAmU$w)4yHRsK{l6mfI4b@B`OvBW5O)r3>i+gEOBvl{d<)a$N3K(C9Ul#rf6GB`>WPMQ>ZaYw6l-77Ko}8wt&) zrY<+oQa-J?@04Ve#RP`P&<~T28uY!Ml=WCQGv@sDxa!xS+!Tz#Jsjj zkp98-bx+}a&_?`j#}NOzk4MF&Ti$SN6m(NcaGPyWm^8z#wo0(!aMA6q4*^jc-&?Er z%{TaK?wI*(;cTZzI{UL~xbl|0J@tI;_48kMUGma4oz?PHz|8x*T-;{fm!^Cnx6&-+ zDi150YGnz{S}&@Rv(}RFbVe#nW_a;a&?gZ`j2$NEm za4+?JxBF|9yWHYc0(G~q#5wo>sVUdy<>LlxmLK zO{P;{f<_S}OrGs+d|-Th*{Z+4@Bi0hn&}&Qa{a9RHa+YH6+0R~PrR?r=~cY0X#KKR zCj8q3PMnL*es=PCzGr=Qzii!F)4Y@4ww6R4dh+t$ob#udtzRybefPJeL*0L#499~a zy)fGe$A3K3ZNAj;zwP#a600P4*SvQ8xp%eh_j5H5w|=vqzfAXUO|fH^O+#?$ zS)+LgKU&4(GNwLlNyV|QnyayG{u|New@8EA3!Za6iGLfH{hrhIX?%FxygvT-KVOwD z^X{FHELRm*bW-*3%jNUqLi|kN>>v0@_-{=*7hK zbOUSrO5Y7D!aR(17cbrw`i*Uxwb$;KPmAQHXtS8xhX3|)6unyY`kZsod7IBZ&0L4J zZfkJJ@baEt$+Ox%gk-UFzi#cG*{2})y)k6r zl-x)Ef>vLZK5lb|dDS;<-TvgL(1qK!Ubp$)^Ql&4?dm(KJTuuBRaPuodF)GN!J4dJ z*JeFG{pg>b;HXmDx`b+ReSy1 zKjn=z&z{}!pRsT4@z(o_r>;l1@A$C5!Akvw+4Dw$ZON~$tYr0$>)j=BRIRsp=Y=1j;fC$%k{^8~*Ql@U zzQ22g-Q1>+YiBNBdVA`!{I?sk*A_|w*F4MAKhmb~2mH>-?cKb_J}-q8Lxp=Rv`amG38vbMh2 zomCz4{y+cavZ>C&idSu>%wE-Gwsq~x)wg!;J1y!xbNcJYpc4kWZe*eF3l7H4sJGOP%?JK`t>29{PW7$$X zf7R2cw=c{|opv@-ZR)$v8;lNv4tqVyZpZO;>9LPLpX%4&)adYIn7+Y4)SJ^F=;!9J z)7!Ua&DtiTto8m{)}8OcKh~%|cPRFmT|DPf+18T(5&zdjZoc$J_S)L?@U54Yy;J{b z^L5(YX^$@j>ctfAQNNzuBDa(O*>!iW>DOnkSAD!~)X#X`2F-5e#LL_`RbS!p=25qPpXiTB`TgxruM6_`&n>+c z`7zGvYiv~Zv&?hPp1#)gzdtGY_@1?fdh0iDj=Nv+xVLxT+a><_#?`)mLIv;EIkQeU=z-@EzXq1zvn{{LO2yFY(R zqVOCXOO~D$H|9x4toyn!>7V@K&pY?dUJp-12J)N%U*DZj?&n#3Znag+>cG^^F$bsI zk6-CEXZx!AnLq!QzqqjQXNoV|+h^zIN`G1(o}P9n2XuLbw9fKBO}QzM5$MG$UWDhd zbiI08T={EVRcz}0(A$rycE^D>aV9=HGqacJN9O4jn`T7)+~s}vvtHsK&;|;=Te;is zN`<)kTrQlu|Le8rkE)_GUTLGwEUQ&vknr>9`t>RoE5Pd|-X7W8qlzn!FeVf>1# zL9E}S9`F8KAh%CJ26VRC(Z5I4`6q8pyB(c9Z+-WHYo6+Jr|@_EeSEy1za^;rUgh(o zJD2_KV_T-){HEMzp(K!Zes#_!U(mW_L;v)z0!cMLpH4r#z_D2?{O2j{^&+C{uE&<& zo%Kz&aL$bdHVm`Ff1EL&mffhJaq#ff@OayOR4g=|IgQMB~PDrG3c>Le0tf= zXa9a2w-;M|r}(^WvV!gZxqm@7(uqWzdw*8f(!N`?_D1mqNA_0G)Xcs2pz$}0FRxaw z=bN3oEi&-tzQyn6KF!U1{rb=MNm1XEt{rTi{PwSaQ}p(`&?Bp$-3oZueL*$HpZJyY z_3p{pMO1yg8qWORG3Isq|B&;?KhA%Iyrk-ub3?&#(72Ywx4mC3c{~47yi)Xf?e;d~ z^ESq9^IxsazFL|1?A$-ut#MC}M%}im{Pe^^D>TvXa%ii@m;=TJhTLwsjlU zZ@2AxEyMV)Z%r1-GBebNUNGM}KM`Kg-X& zb9+$d471W#S3pYx!}H9hdR6Xt0-CI8e0ZvJQ{!60=MqcIs=mBv4cCfxa^hG_+nQbniZgak%NU%G0{rMHXkZ&g$m8b>s4! z-=6!rzFFw~{KS#CZ9DhD^G}Zb-Fof4TEG3j3Y+gc?J5gY_}l+Kmj9m-P->BDe7ybs zL5p=V_e*-0d|Wwu{`5QSbsw7LTR;;_6*HP&?yz6K|KG2NKOXn|fddrksx00_*J>DXl`!?)t^xjmzStcuQim^O-%~u3Eirm891*+rwOEJWs8I_X6OB z*n$Qot|v@$f4>ah_iWAl|5NsUyOquS|Dt8unHfJ0zy9PeHGP*(la{1r!9?9laquN4 zjI2>Q4ksq8Z(TOKj*VaLj>eUM?1Q25XFl)NJAFp_@TuMhOjEyox)!3)e5$%d{*&8N zvwfFlH3a`syyIGWfz{=rXs4cYW6HI_x!LPFekwp5n&(RD+$y-?P{XMOD+Twch(zSIsDO4HeR}Zond$GDTH(b$bzfJ< zi#o2aQUCYv`+oP?n!(FVIPAk@qn~B3wfqb^&%@Q#PiqrMRd3=6L1i}sE4E8J(wBX< z+JAg$LHe8zhwDLyzCDUj_V8!Db}lF6uK)AGeQ|O!{?{3fC+>c`?XGt;Rp}#W}GkOiMXHGw6I!o*3aYp%n&Z(bD?(F!# zjBCA){?<>w8UOoxY^~b$CqB9E?b6C$UtUhGN^Y24U03CybvL_*C$lZ z{$<UYj@Z~eU@&rgeqR$I!|{{Ghc_s)M#qwQ&OViSBmELAGKCvluv?CCXd3jVY! z`jgdL>CYd2=X*!(VmI~={hC>KeQ8#GR?D%>Tub}Qn{K@Ok|1(?R@Uj4bDr1i{`2Yd z<0ZL!%a?sEEt%dfd&%@f<+1;Fr%PYA;D2)i*Z7Q9qw6ZRvS$YWoTtg}tJ<=(_va7) zbh|Z=oD=^k?|kLlF-`CKOT=Q=s$~vxZ5jTJA`U*MRZeXF|L?c?ihJ%K4E|@8EX(zq zdaWqq@&AqG@*j#qQXe1h7g6LiR1^?mQfyK4?P>^OaeUbn6f%pesexC}g^}CUr6t@k zo^hf$Yi*{WE(x+YYb;b**s8+9^zXCvk2S^Wo2$#scdCB>ckcP-^0f44 zXXgC$yLs38yp3~$Kg;Q(pE$l){(Ley`zAl=$OV}n?hUaUC-}~4*v;XRAk)|n+G3Nt zDRo-pGO>(6>4+B(t*bVxGFi-+*C5YS($$}!?s59kewKuxa`a z-O5)hmtSL2Jh{YYg39SmhUfjYZ<41vUSeSqHu0A}Ipb!Yq+LzLy7Rv5XZqhP*iyfC z>$Ov-_dcB#eTh{(CSW$`I+E$_$u8I2ZXK+u`TzUAKj_TV&C=6Y4Bekyh6Zf;{ay)n1DF@DQTh0ha}-M7iinJ#_t+5E|V zR+@q$`=3sWe)hCT?wLjR`QxEskxQq|-F{DLSCaL|N)NTdZPvMp(Yo`)v)AoRyZ7x+ zd-wV{9KY{ zSe(3D*|^s3-^c#z=dx?U z6$|G7?JvAj;Ci5NihupD%Uj zT3_vipMoBD{bcvmPqekl+opKi`nhVK?5#6}GXIW#yLkWHw#R?2b``RuPM?1FO!c+i zza6EIf2eDlzCK!h?8Kz|8Fn?>JDe6+MlQX1e1`u0;`-0C@0XllJF{~-L(Q!_=l-4i zxjXKmaSzXL^?4OZ^IB#*n%yZlyyyJZ>UV3luURK??q^}Y?Y9%ZZ9m(;-}Cv?zpbFf zjpv{Lez#kHVU!fUx9>2o+}w5h|NU~=mT`KIdH~NA&2Q$L)mSDAwzxSM z?GNTSr`nMH^=kO}M&~!iDc`GqKAm1Hkj3&-I7CG9u%%woPL?wQ9Y{q zrB1J&8N{QrDl0tw@oU}1anCN6JwLwl`HD!%ZhqS@7i40N*?j^X^HB8hC_|Fkid)+P zH-;A9s=rfs{3_F(8`G2iC(mQKTC8XL>&4>FN*w#t9j1k|+%Vk?x39Y19x>v#ezV~V=p3E-@;BI6n!=~<{dPPnB}+xScZD_f+%iefsZ?m#S;^zIam;G;7b{+hyCm z+h_jy?Hj&BAm;qHPKSS>n-oAxmNx6oE4KPA7<m z(_c0TQGMA>otpf1KN9MmnlH6y$rpYAIxp>+;T!g+@70fL-7pP)RH4vq|F-YV#jo3x zKR-FfmRFOpobM~>u-a!!_*k+w*SiJiJeHbTwoUeVb6C&Ln~8p0j!#%N1anwCcU@L` z#!8#Tda|YMyp*7P`DD8{(^+DK1^We!aij@2g%}>9sXG zb{s4b+;ZmVP0N|->8IahKjxhF&`B?{jnCpigG-uyH@vBK;Et%mispnvNs86d{W9_8 zcT0sMgOruye2PCDWH%T6;lbcx*wFsV{@=&`&j!!-zFxQc8k2;i`-XHM|Af@g-5f1T z^c>>_Q+#8Y%sB6K1f7|1#^9cChGUzT5u2G7OS9Xz%QO1kFWdcgTXdfMOh(<$%N$tR zgg#u2ObGvIE}QMW&Fxz))6c~QzJJn|?7m<3`>D_Bqq~ki75H`hd*mo_8w(7iYZ|IlRc* zLECXh%APe@@;A*5m3HTB4CsGg()4x}7h?fSS?F2grZqRq5@YAEAIuSX71pco7tQnK z@iSJg(j60(ywXp1zkE@2PgCq%B8%drz+J00oO#@Dzt4Hww@)QU|8^Iyoi({}#)AT` z-%+6lWbT1Z)tT33&vLf-9_XxSq1*do41Qf%Za0<&VrdGjEtp47J`C+|!*W!+&P^%+H=zw9B5S?4I)d>!X_6rJCm! z-#P!CyXhzB0N+n5{>*!jur2Y;dY&U~pH1(}TFg7u`Y|Q=`Lbm<8zjo*ElWij(C#9=f9Vx@0(&@E#ap2 z&-&dC<^Fk-i_`ah?SH!M*4poq=ZbbrZ2P+_Ykpe%<7ce<)(1SYx$)}LTpXLSe=R$( zJ1tdZ)&DuW^y1S09h6*O6**DLw6S}OP21Nq#^=}g9<#r5QtkNB{vx*STQ1*H7~kwn zD0|Sz{!H(Gi~3VXc8|I`F-K9i2U@;+Z}-Fl|l*oHHUkMiuR=~s!)W@$Cu z{LjX3&Y9jo4!axa^J^dFw(H$r|Kr^0#V@V3&onzUaGZMZ@x|^po4nUbMLzn$C&S2a zd71BNNAnbmcWWkWEN&GITjA@r`v+geyPeOkwOxI!n5}eBDKJ8h@eJrHV8^X_%H1#ndV(6ZJHf_@7&oft8acg<9+#V?f1JociQCbSugf2)#%nF$BD`93oMwX-|*jQ zIJsvs%XxtlNAnk^ahnTIxHyyH3WuN0wYiqXX-W-K8)}VS94m~Tv+Qo&waiCHIy)2U zxK6L=Gjyh?Q5Kw+r@h@u{h|KX@2QU zmKBB09KZP+3v1YW|4#Z^_3dVQ@d5jpj@^tu*Xk|b{8E4Sn@uI(Zl*s!$?+mtewnZS zz8^{V-e*W3OfSCFw(f@Co5wl7!}@z4?b_(~Mqft$Zm5;@d>89o$-9qida>egNT%0s?#DCmE{~USzFdUpZUz>w{bjWbB$8H z&K)>YVDzgzwKLiNTL1Z_=VETHJpA7~QlIPf)idetYs#%}uQPr;qujszXH1Ix<2^0a zAO9RPQ_MDw{kD76+e@Oq(`_fOvnan7eQgfU@s`@&$8-MfoO(Z~cvH-49Bqm_f-l~^ zKEZuvZrb^qF^?9-tS(-;>bQL|XPiOC&W&j|T+NsDeJ}aRzSorz+Npi9nrWh`&Ncm} z`p31#cR#UK8r{CCU9;cn#e(LdGIJvZ_p)=3zOV=t2g~&v=}-I77bX+-M*T(Go4G8{ zg+k7hKPpmuFtg|6Q)%NF=BH!w_kO(uI!|0?Mc_JbGw)3+rfzQ9bO&_gl;wxt*P`=v z!(V^-TYdlcy*a*9)^r~AITr#t?d0;qcKLarSGoBY>+a-T4 zyUy)0&E?zWq=cx|yz!M!r%Hz<&X1~oyH(on@;i?{|E6V8x-!~Fd6uocHa~pXbG0_r z=`ls?%(lmV4wH5?s0~#Mcy_p|SJHUd)yQ*OU*24P`{w&srVF&U3IDFJ&Yg4nby)t~ z*SzoF)C8@UJG^_-+qGwAXKKo5_ckTmw*78&-tF^Q?);Db>A4TnCR9bXe;$rD@i?qL;ui~B~{rud!g7UiIAcv)&2nXf=J!WJBOi5req#7`PlTBMCS4%` zw^*akSG7TB4*mLhzJA{3(?StW*SueCypzTyS-*bwyIo)Yd_I5Oh%w3WnDr^q@R&f$ z*=cV%|K*iRhw5Eugv>E~NoLI3qVySbMdRIm(U`AgtZ@|&TT9+fh7vXLq>BG9_2ADBNykm|9VjR5*LebN5)e<0o9#SNLem^ix{URvEZ|kM3f* z{}uIrzh2MomsQ!(nklWj`3~EC_%WKciWhvg?a5xZQ!QOGZ)t6fzfyOR<>aExpEJyr zST`mrttCx4HfQyHx0-`lhc&7tL2a-|?U0#XouO-#8jf0WA|&?4CcL_`a;k4k-p;3=%9os)$QQC;KG%onh6g)AO9dkj+-Le*;$E;d zTId01XrN7+)1v3Q_ZIFJSRm87TtTMp$3tD#`EIeh{{}y}`@XK+FXw{&^?lE;MSY*Q zx%?y~aiH#1<q37O^y5f z#^Z9c-Fl^_zIM6rabde$l;o2$dqAVsWiwPuIUJr%dRhM{J^B5&u7icIl|(SdrdEadH~yR9_F{7bI$7ZnlI00 z=c~z`u6Z)iec5F{Yu)tw4{iUh-}ftP9{=si_j|wly|2Fi`;);Yt^392Z7XB`bf(@b zx$L_&;i+RY+fvXb1>OCBK3Prx9llol$aUx2ZMQF-vwlBEEWW02vkv zl|PSrunBv@bzo!_c~Q-@*D7Hq!wuc-cZ^nx%lk_Gy_ni`T&`Ltw(8~5&AEz9vAkjP zdQOJPMRcWCG&jH0*VvW$IS9&$n(xd9nkB^oKH{Zr9Z-Q+Ne`d(I&;R2l^fU+>6UHL;d6UC>z6elzqw3Gc z{l z=J&?r<8Gk@uAIh}k8D*gtY)4zzv|V>BiVl4l4Z|BHYC^DbTd8zo#-~J{@+h)Ka#Y4hzgXP=OfPb>{f~qEWh>lepV?P@c(CP8(dnh`a+OOC zS2RsrZ1dwm^UKxof3u`avqJb<;!>xEUIOjJ`mNkBGw+MLEg7!8s}6GQ$ve9bacQUY zx;ZXq+2J?GV&mlpY0T4~-|PGOYW4bSX~)XCg6{ZL2(Ph8J2OM3;?JMY=a*+*UbYmp z`%29pv;%hS{9Q+LT^x!<+JY-oex=)eo(XE?9baLRc&Mf1VXOGHd%{=tT#u_>nwrk4 zAB{WpV#~!Kv8u2I;p{rXYyM2^uUX>UcBjZer-o%SsDGDupvX{QTl&fB@0XMfEMivg zdA-)rCz{V@ow+UJNx><1yzZ{ue$Q&{{(rw-_F2F4*nYPxx~u2x#yQ93>uo@5!M)k# zDiWg7=awdIfMraOg~U0rQBL5+RmRi(w%;PuIuou{*|FT5l(=)12y?;eW7aukjRvcq zpZk#%_B83(lNHX>UoP{XKkrz-{Cshvq$3?B85b6ql)Sj`r|#LAnJ;Ii&+}|%=Rfy; zF<)$){@yQ_-t_+dKEYKy)+Bf9)v(S7Pq*Kz(%$>w5ckVYC!~9-FvXo^}iq($?&BbkL&vrkVNIFV_wtpM z!Izb~btX-Z-YU1171u6XJRZ8B3NHK>+~BWyz`V8LX3+u7gX=|hrF>L9yl!bNBUAnT zzwgSgrwJT9^-xCn249Z!CLQ6BbFcsZd;kB^y4~+?DbD`*rnl$z2ar=LTYvaCbxC6TF-uCyK%`bmGpYIP^ zup(ug<|B93;?~X!PTW_Smb3FnOkm@anbAJ|``j7J$w+1EL_w+Sa2v08^6|d4tUAtu zjmwWJME$y7^;(yC+Vg_=gC9Ukhxk76K7XX6tWj}cfn(;)G>-GEV-pLy#x$p(4oi_Sx^K3@) zrLgGSsrUZ>`~F7vUvp}TqI265hL?QCpL*e=NhlM4SPFSq#5!!}`tqvb>F@XZ?b(-`DLaM5dB0{7 z4Dj)7YXARf`u-9t;ii7hh7F#3J>8}Ov)Er=B zf70+YBCS#i(Fo(xxDe0sqwdW2=QEAd)%MLNrs(>$p5c0*W{mf{b(d|<1X^~3jzgGRbV?Ic z!^$25U4-@WMsmMz^}C(vN({RqKu1cKJelbJtkQT+LWz-{aD`8`zs<)ZTYf&9Exx+s zMSS+!t(W@i|2*FEWRmx@hip3K4?ZHIz`=~Mj>-ThAuzR^=@~jmXf2n{@PX#4;zB1K*mTocFPt^e~qjCdetPm{?x&vpsFG&XXDYVo3|I)#WG#wG+2Ibfn)QhHK5HAU#>;x zF9oHc!0DNMmQNR&FME>z0dAZJmKpd@YlS7cgf&C|wz zpv8EvI12tP;*q!8b4~<$D1E{`QP2rJpUPh+9&TH@G5Pqp-P%c~!TkjMMfA$TPzab4B zTzJm{x=iNFA#VLA@^fn1iq&eLBl&eDiMb%%ccO^!=nZ&v?>(;rpUMW+p^q{o3@c7!&U0*JFU(Q~? z_t@<@sXw>f&hrM1U4N?nH$ina^Wx1v!+Mw79oB_qOwf5h>5TK-4t*~;mE3PTt-j$~ zI{)=pSaTa^z4@Y_iAB5k?2JREDIj-NUca(3xLRk{#he)++CYb z%$yQm|Mx53;jqZmsU<%iwm<)?_)PR}+BC__WiwXhiv&0{ay3TIZ?Amu;o)KJV^)w$ za2oe19^gL@YQ3yKvmx>DCt+_k9*GHJ5ev@S*DTM^ak%b8&`TMC3D3^V%>4D`W#*+N zo|c=9u7XbF4U0%@6?<-yKKXma0i(0()p`e)e@u$ln-Fr$R7-Gy*Y;OeSLD^pUGFNF zXb(>>?Y?~6Y+3bb-R(<^&sivgN>{_xQPV$GzuD-1tLU_D_Q6wz^1IgRY&Hu99q`)7 z#>A#$exPs)s62I;FI4gG=kv=goWer>J{$2Arm#Zyi#+3_(vxd!l8$ub#lMu}jY!Mw zW?UoKB6YXSw5xIL7xDYst^Hr0m2G_VtGy68X$vXoUhqLHxmJ?hebNA7PuxrLmlUD}w6zKBhr`Gvdm$N4Q zc6(q{+@JVV^{82~^|aKQ^$kq1iU|jb!dF=NbC;NYHqL0p1V#sVYkWVwcWSZ-?(3@TYQdmV~e9f<5I`HB&SFT)$YITccJKhcp)zl zFr(6%XHv@fm;hg$%1|ki4Aw$&6ccQ2+P*Qd)^^m#2{g( zd7kL)C1hxp7c@xN*`MPP?o2`)LH*QtPb1+#QT`pRZJuOkwo^(tP$YkI!n!t4!AGLg z_XZwlczSO~XwGCZG}pQuXn1P3Nimj}jMQDVxPkHX-on*4)X32MtD}MObZv_BE-5_e zZ~>06_~ORMJgxe1*hXJ+Gz&5^Py2nMt;Cd^JUN=7p-G;|bUt)5^ah9goGIvK*b6I2 zGa$as5_ClG#sA-K=a=6-G-os6%;(V0dB*&HP3D6GjhP=F9L#)iVd2jG>QbNAtqflN zZ?(GE8zV^d_QIEGvmJkNaT~wX?1Uo~?V5@FwaF@=iC zD=Pvsk8}v$y%%7tQ*OPJI|NbIIxw32c#>IaS?f#)KWy?!+E#c=~QqnI(#I9QZl+e7WRZdGc@@ukq$0 z{#<5p94BHSY5T&)*fect*`IH>^Ox_Kc1QNDQNm8^DY2*p{Do$w;AK81y`O)y6C>zU zhsJ-p0@wQayW?@+%lQAl!pqH5 z=SAG>ku<&(oxe9U`}KiF=Ip<7zwY_>>-E-#f|`}x`{8rHAh%WZGxUF2sI$Rg{vXa8 z)eCYv2_`E8ehzTY{En>eyWsHE$^qX%<8q*jo|O(8Jzcqcp4a-l-=d;YCc5%Ot-G-r zvB-5L7v1H1wYKKQdsVB2 z=09Z7p5B}|J*Md7mRnh?pE^AK`F#HVO?j3Y+l!Rgud)35vfO?t=t9E%$N4@ldiZwx z{dxE5e!so-gD=Xh;F(V)j_PAQl9iD<$roM4*X~}kLOgelQL0x|LL+O@ z+=b5VMpkF%SQ?kF{&w=6(MjG9;M<>}!HZOi;EtLL%}jfh5@tR)3m%#MaDdr2P{6}$ z!)qaLor%+;^LCn~oS1O))l}x3Zs84kRyACIWb$`o{hJ#bExo_){eExuyZ!(F%{e;j z!REWXcS@ekOkWlrUu(+tTrYCN_uKjV zw;W`Xe)4^z%&zINWs$pHEb6xMk^|LqXQEnTOj^O`&U zhg183r;85$d_MoaV!`anHM?G|%G`X`%p0^6Y~E8xcG)SLLy!O2eOP50u1%>pv!%$3 z%tkr>2(^mI*OmKiE^Rpqy3K3O$!Q5!HICLjbJyep4Z~kjo1HUhT5Q=(n{)Q>Ia);D zpJ3VZbXv4pQ~AkxHP>Uym!37hUt_ikRF)k};I zjX0LMeD1Updq5Y*T;HS%n)?Dxwyan+sr_!{^SPDvmM@n~E(%NDR=m1&hTy?d_y0UI zzdSpC-_3%^Eugv7xNnJv&Q1G%!I@t*F7U$(&dCw`NFF6$pw3!llCV?a$W4umEj%G> zj_*iHDB7d%54uBS`Ru%1niE}j*wj}3`}_5;bpD=+VbQr;!80(WudcX=J?*b~qHI}Q zG~+=PXi#|jm--jZ@?QUc@Bc5o*t&$XLXS=R{if4;ojpf$UV}=9zdz5{pSujYl`V7W z)G#mY^?Qn{Uaef7b@0@g|KOq|eQs&df%kXI@6XlS@t{e@$9G%WJ|WSw@>U_uEARId`wBt(lKfmEcYdpo#_}`$CuL^Vbq*jwd|{=PYx% z8&3%K$lQHoBOaMD@lo{ebWV}EpyAjp51P1_fd->*gRW_?{rlyz?3@|TrbXwSJk0S9 zbmatSJi9&f#yrqngSr!DeoxT=tpS(^x}_FW<}a!Jc2oWB?)Uq)R*A>g6uw&?HwAR$ z(e=ozl}j(J2wYqw_RN{jQpIgKyL^qo_sJ_Qy^KpU_)9_iTb^gF`TX&?{Cv^$StUteBs&DkzkARYVaay;LSnA)#bFSFZyXiQ7H|9<(+ zl*ztDWvMdxdp;ifa`SxMwzN+NnE6$jrfH_cAKRHBFKqYo$>h#8*QS8x;M4v43NQZs z&~87+SoD7N`@Jv0ZOXmhqWDVsKJwfDDUjRus7w3Ww2jB4vX?OP+Zgzp*Zlaf=TFjv z;`CAuk7Z}Mbv8KU*`JQh+xhg;A#Qz{?zN@euU%#1K%2UA?PKeHKGpuN$+Qo2o;_%~ z_12yjFZm`%>`%IFZF0z*sPYo2C+T3${bg1|DpO$ozMs#Qh5g_2`J6XsSBJOGMi(jT zvK*xaQ@;mt=;(?Yy%!S6RY;Fq_PDy{M1#+>C!ibCV(b5Y&Ac94es<>cnV(K+uRkOD zYs112j%MFb`uibuc7KdKl<6d(sot^~`-Q_A(_-9)dr-8Uxk9zf&sTh-D>%$+Sum65 zl(JioM)=3tZYGvHlSF@R-~Tt4Oj!uCs1*=wh&`OTTJoqx0PftnK&6gRUTcT31G zoS1UX?)RI`-OXCRPfqa(_z7B#2ioR$W!wKPnU{+el(2Z~?|QK)bNk&gZ|S@piSzhN zL07|+yxDlXEGoU3*KCFE>;v~eyUakVJTmX>DBSum)K;(rbSUht7fE5yIE4DX_UHM? ze0^LSK2zknK1y}c_)g@(cPVp~pdCLq{JFcs`u3%(rype+{)u~3uHnBxQ@l<+ru1s) z&+S*NUay%P7F&AtlgizH^VG!(53Aj7o9(fClgRhhR9?^`ufqH)vQU<#d9|M zN8S?GnCEYHD`WAk$}7psD=&wg-}z?0jVsUNNB=8k#VY;3{m|yszWZxtT*f&H_ocjX z-CnDkop~&kMv~&&L1l|c)|C}USg(MZaGS5Hb$qLRUmedkNp;89R`ECwP<}dh>G%2i zf5sn`nDrfJck6Duk@L0t^z7Uv%vKx%e|#qx9(;T~rq~xWX?|I@{7xV@M_TlTv#(}~ zH4E){;Ve+H*eT%CpU>y#t5?3SzCZh%#p9kY+xP#~O}A28F{8|-^5xR$mq1gh%{}G! zYro&=3wwRx-DH0|%k{x$roRJq5jxGLtgp z0BG}$-i`-Nf21FX@BiWYsO@kV7h_7z{B`0!-UcT7**OhfpFEU5CD_kWb?=`~r+8R4k8ms3S+9NlXytjm z0~>!#U0SynNoj(7TVlT_7=aWG=V$2N9 z>8@gtD(PQ)Uvf04c8jhD-KNT}d%x=ST2KLax^WGQZg^}>@2{snfB%zZtf?q8oU3yx zWmnyYgY3m_uV1g*t>^#cUHN|NwVO_9O-*@t`de2Kc!KtMMf|&CM#&cMIqf3q|9<`4 z?GXQsv+44A%ja`s1P*LT(YjrBJGVG`=CY|)EW3ppd=ujzDZSqHdfn`1C8Z5B^dgrn z{;+RG;q#Bj<TAlYMXf`jhNz^>qRJ zeqEhqdax9B7Qp&v_p6Rt$#lp6c_d!!=EKy&X^>qidGzO5PkVoMrHGlIKu4e!g@LZv zlRIa({pGURVSbnAGJ_V|-g>m_@Y;$srN=*IX{Y;d=h*Y{nDoz;J~}-OsoM*Gzj^xk zBO>tpfi%dLN^nf|SJDZKyRyh9du*I|}G#++~4IwjA% zR1sVw75mIRz+>lx+_pEihOveMlOG5&W!Qh;d0tg+wx__!v*!2b=^pH<;#d<8r~#ie2J zoC$Ot)aA6An{ z_s^sJ1&z$?WnUl7sW;~q>346MuKSjI%6WA;>$TD6PFha?T(Mg9TmARHVNd7a*peU; zu)v=C%POAJERjNUqRyO?mTvcnO3|0JEK1RRFe7tu!1V6*uh(vm+ZXYt-TsfF?dLPb zl_rd5nAvzbJl~pWItW*@pTlr$J#? za#S?@$w3y?{a-G5TV|g#I;}H#x6P+%shj45?pl*w^;sh3%&F8bFD~9qaw^ykYluGU zW4JE~+HSnl*!cM+Wu~WVI&0={IU~(9H&=U8YPp$j_*%{V?4TRvZGM9eOxS$)&xww9 zxhf4q+0@r-x1YQF@7r@{`CkEbxA<~2sBsbZji+?kx$mjr10a+b2q#NiY)^cTEzeUuiTIvA++X9a<{U!M6mAGD?yo8Rs`;JD!ldo%)_~M zMrYsb`~B|am0j~r2+4VpTC#(fpEo%>v#c>n!7ppvMd#L!ss=KFaypHALk zV>-99qx|dD@a5I-cB-GBoXR6*vclPHbJ{Bbf%r3FC8so(Kgl_ly=J4^EW6sOU7#k- z)9LYX(W=)z=hy#^mNHCo$$PwR_q$ns_J6O{ z+jdKNzwI{R%U-;KtV8rn{>Ij)hc+oCYwb^-9-X)ImdYCUExnCv*!}wy53A>Di!EFFH+Y%P$>yDw z8-GMEv&h{jznfE7Ek(c18+2p&&Ak@B8}08birw0a`V`lR< z<9YWVe7$w_{p1^df&2H^v=uvR{N}hl>p$lMxBA6FG5)s>=5Jdiy+HcxVw-ibpFh>i zsyv^6!gI3P)5lHUigPyfzMSTLGbb-k`Pxh;X^oulTSx8uq91K9kh^(o{<<4}bGU!J z?NxmH>_%SM{DpG+|E|2AaX&S5bq?qlhd(L$IXet@R@g1Hl{vrm##QV2A+px4b?10< zw7>EGYd=*l}vesdogMZe8Yzb*dVJ}>Wi&4IJ8de5=U}0V zU(x6MzoyNwjDanY-V%Nx%6R(Xmq)HlMmNFNHU#cG?W)*jEUUWf=h-#(F$o=&1qVBP z4uDqS?&CQ6;nSDE_4~`a^`8FoHM_aQ`G67Q@f%{xwSOD-#}E^Xjb-v6Oh|4H{G&}FulOF;{;W70vpsm0?sXDryu zVr8!N|9k!a>CCJVYHBfi)GKBcz2E!&S@_~#4_i+j=C_Y2exWrvB5tvnr5|FXsd1f% z!j5i*E1-pR=gcRGO+Wg+71aI9-T8D{rGbB(C8%vX`N{h;HSuaIK5RJ5=M7rrYSp8@ zqIb56CTLOK<=^+d?<@Io(f#>-g+FOO-=y2m*4z8#(vjf!F4bd&ms1Qqdf#7gm#a)! zcm50LV$NTGp4-Q-nf04+d4wm!MN>`5Z6oytKxi#rx9{@p(?c zdZ3fptN#DKA1^njp1<|>G3op{w_D49t~5+h2A}j?p~d%BZ@18o<7E+bKc8lw*2oKg zcJfo?_6WIy_fqEn``BL}V`=|t&-cCW*Phj{l3M%xR`&Y2`#w!w|AgVgjD0inw4dF0 zv;BUZ>EgL%w=@frvo~(2ulu?>eywlupO43vZ%jV^%#-7c-PbF-foqZ6yaW02~-S<1i*~b$$ z&MnL-esd{ahvo15!ef$CkF)*Od%pP7S@t)t+vV#j=7}HI^Y4G8_B83C%%`vG>uqa4 zG|Qj4S+#!Gt5uI)+&RDVS@HbecXD!*QucoKyt+}?_}PztNA>FhZ*Nbsh@Dqf`k;}0 znPKuV5%%X_^OpMQ$h*H1G>FkNfBrjX{r=4J;J&9xiS-X3Z*wtN`a%rU& zi$$@bjhKWFMwo>ifx&%YTkU4JC{`Ppu{gMMp-U#Gvc zWNbPB+OBn8Y>iL%4L=tCW4&D;e=l6M^-Xk&KyHZAj%oK*YUVFL2U^R2s@Ce*-#^do z=jZO%Ww#8|Exxm(@MlCisCv4t_`-78^Gti4_WPE1CP=E@@;so`SX_R;w!CN6+4d@T znL-z<_j^94Wy=dsww$>OG)li#&z9xt$LLjB5i>v5|GGT?5~unchxa+E*JhUq*GRtA z@%wQjx&J9cVcqMHx!TM8=FX~T5AD@H*Zwa;?%<|B+g7hS{D(u~`JN~pnd`mRCNF>d z;rE8Dc}IVW{Ejw#UaqwN_oA4Zk4HJ@YrHwnlGv_ne&*QwtZlZ9XSQsPQ+)g`&|UUw z;(q?kJNNcJvgu?z?h?Ae=xxe>#SW`$E8}h_SA^%NPxF<2)YcdgRuakHSKXA}{aobR zLbu;MzopE>{`|VW|6Ra(i~G*}wk6vVQjcw(13I&TeN8y4w((i{e;?XqQhe)oniSh< zUVC^fb6R-5b-`l$+}dX|)3dJLS{c0BW_5dU*5Xf(y7iy+Ts8EyzFqg{$H$k^_kV?@ zZZP`%bhps$ub_KEj+VT*X8pWu#)>a(?=x!rLZ^D`?Ns@Dz5Z{w-TG;*`mrM@ka0Mr%JlT4Y@+alTcdY1K;U&*yA6|JxGOUKv=iMpyjJ$t_=QWv{;~ zw>YY%M`vbB#TCQfO8tS$Hpmyw$;{Nu+T{b^;dChC5hk=(cPY}*2x zO-^Fol~T9d+|DKKe7$b>CD18Krw%C0Q!6~7*nXxgS^Qw&|IhaSCpRDL`rK8QC$dD& ze2Hs9Y|rXfM)pSMKgmu!bT%>Nn@(Dxj=%G=(58z&?uEwrZ~83c<9p3{-|fH?eW!UV zrp*&gs8@(6_y*Xw?R?q}Gl;3-qdC2;V}pLHq?^Vi&(qMmlQ;^4ms8}(;` z|Nj|p-xfIayt@6*lYdeaj|p;A{rma+`O-`CKw~7ekEQRg_*2JcS*gvGD-o<0TtQ%Iq}#PVb97<8uD_*W-5I zHvXv>I>$Xn{=>ofJ{M}_wgoTWaVG8e#)Vrpzg>B{P_VUjcCq#U&5A!}{_R%}4Xpcp z`~I`f-WMmP9{ahr=G@b?=~d=?M4k(tUgn*ayQ#wcVR2K=KbiG1)0fY$tGf5E=lJ%D zzJ4ow6Q>KJ7CfFh=~d>gQVsEiJ0cv*V&xusrStO_W>he>k?2k#>pF71bhn=0yZU3~}-ca`L zjQTIe^V435Oh3+A7k56my zlJw&J+CE9Pi_U($2RoJPOf91k_xmlE{VWwW+`Gf+^Y2vnzDdl_IZiFv621POkrc1` z3;B{})qVb=?V`&Sg;mXGi|!9TwuL22a7v_3p>bs4jK6oa4}8y@7jr0o zr^fyN|GpP97$0o_E!0)c?u~`lr~Wb0&ax$+-k5mU74` z8yI}s`ssUo)5R0BcKvwN{XEjZ_Wo1Q`35pyjve^_{r|uCU!Z|^=H{FKIcCkZtF7WI z>iKIw&40R?FpuZWvfH`Ed;cu^(0*VS$ErJ7tJiWRr@epL#+-Mhr*{5l*E@e2Vp&vz zCx0t8){HFR-1f|z({TdJKjA0RjGHP7bllwHUkTmtydZnnTAL+t@6fziQAB#YqQDe}Qm+5PKR_oz+;(=zzw^X_ z!KQJ=MZbUH4gy-YXS{V`P;YF16Wr^y``MY||9`)qcRa1rFWxv6)FypyBCYVY&8p!JE4|OZpG_YD63lZrSm$^}IpT zk=Ik#-SE?yeCD#qHcQ4wGN%K}Zs%^V>6x%|?xE)gt6s02&b;oXnaCMS^#Ywh3-bxR zGZa2@>+dn(*PbW*siFRVVsyc~N5>?&N>4JJdmby2ck5wAM-k{$1c&Hz>~}nZ|NU7M zJ9n;sQruI$#t(PS2>iA;kJvny<-%kpf8OroiBE+r&KG_< zvgSc5zS*5EY8NU+9J4>qUcB-#lW}ZZ%!((EK7xA8Wj7Mr@0@3yHe=nrLyPJ*M(0Ph z?-$mH*^;%@o@cS#`^EbM&6joO`AENCEPZ&f^x>C9f!z;}CK|?WjFyxC+I6|)+Ibr` z9*Ka{m&^+v9hnoWCAaW&h2E3Nxn137M2w7eH=R)0YF4%_=GBG17jCm3)s`ezfRWsu z?a*mzhwB_4D!sSGZ<;Q48npXlPG|r7wMU&C(zOXbINpD?SZ3lrw z!-$#J1YSrv*1pMRndqt*ojT>w2Z>`}1Y5%Am>m<}&BE-yp{UTJ@t9za=YwdL2}ZmJ zb66~eWX|$-J#|tGo96u?`VL3HoVLfamoo*fxUUgWw)^ciZx$2r?=NrX@82u7Kv{H8HKZo>UTdo)6NjV zG-+{6-Or~xV?WNDy`j7D{hH@u(K!=O{5boqe>wZnFC~%Z-IjuqcV_p&Qy2M~N-Xm< z-sGp;T^GJ9%i2{eW!h=GeL0E|mbVT)7dm)ij|E!>_i+yqrq{|5mTebR18n-ff3j3u zb~|HnZ`Q$6hCQ_=eXg&Hdqla9^FFTCawoAW#_$L{(Qw7@)0BD!OHP))ww$!kN6$h8z(=s*o-Mfpg z-d%y`w0L}%ouO}G#LoRTzI)R5U5sBR{J#6~%lu`0rHkXjuWN3f{Ow~#kesg1!$)TN zZJ)K`c%D4^+GqVvV)Kg&&u$&)nipa2wsm)%=;qQ1(6(ktVAxYzmY-SyH@PARtV%;$)G;@qLBgZl-VF67g-NxBgy}>xvEAwIpWwtP+gyeD=6V zAx~$5SnA7}4ZmT;V)c=(y^VcDxApQ7HLJGt%ooL`^`F8xoNPV0H^Il*=Q ztS;#C(7I2e$D?+dRG-tmzWVz-pL>OJhl?*PaGW~1DER26%}vj&t>d({tpgCFHfXHI zI-Lt2PsQmsywGu&{Bhb&?F*sH4CD1Kxz>lC?tZ*z|Mn}I+stpdm1)Yco?g6m=M2}x zn4agh;>IVBI3HW{=);Tmuf8tkg)P;4QP=pm&sq<(;LMU+S(2gh%O7t2Jrm~db9fLE zx`B6X&h|L%Y>x>^A5RL@#49>0-1pW1t)j4cxn%OCeZSvD&wjh}`MlZlON1^T;gFl| zcP(Jkg-L5CEqD%|MhX`4h~RPSwYqyzwOI4tQJyX~o$~gYuSOi#bkjN3%`1AxpSnM1 z%bTauqStK;$Wzfs6Ij=)@l_zeYk@**!sAbc2R}sT?=_Ww&!T5`D$VDDW@G!)LqCHm&NGss6dPV*bc`-3Pm?-)_C0!?@C07F7m*&_1zPx?qnP}dwEU1b?K*`TR)7|Z_hjP*5+u}nu~!IQO+Mbd26046x+>Qve=~h zT<=TJw3Qmy{nQVuwdSaEPJmTg4bV~pT8n|X4%tk5^%7=2D?Zp-|L^+l4H5Yj*{k1O zxvP5N+_zV~rH>BT=00}PljMr8dbw0)i%ssWEj16PbuT!5?$jpZloJ!qoZfOYd`9{8 zUq?T^(Sj^JaJbGfg*o!Xzn%a8{eIrMcE_Wx%++hRopS6>dD)%$Q%>OT#Z_sqj&6Bd zcG4+A2Q>8c&rX=Jq2{_`!RCmJ>r*s?(|*VK1qe9?i!kYLzgP8o%gZ%u*4?>bnsA`O zX3y^b8)BMvykc!HEw7HbXMJ#s?b8c4zrX#F=l}c0{MnkIU2yYyYS(BrTQJT6op(7e zZSU7>t5YAWon`)6W1HeK&239(CRjANcYjXYD|szXQ*VEk+?wRQ4p&#bw3fbh^OMxo z{A2A5Zx{Jr{nM43kv1>2_?c(gjie1mhe5;iB}W9^ODyhhuH9j{M5e=!L2tj|$z$GP z$xP<2rzTaeUN&=bZV1mco%6FFgvYI^*Z%EbyzFew@(lmguaAE^?a$d!dG>6c^6phn zOUmq4t~zXBR9*bp#PKm`NA<4P>vm_E>lnz%Gp*-LuzT1d{E3(G?Uls1;;5*b-)i(9 zsjUJHF5WGSGk#kVJ?ACFr6)4~s} zKtSfMVy#L&VC4Ju4O8*gR~8|S>qHaw_i*3)0$P>uGc+#i&Hj?b`)zvPLsn@AB-|5w zV13Yh-^X4Vog=rK3bNi=x@0GXTult=7dd~X& zo||n`*)QCCyY03fyFF-ym0th3NIB3w5l6Z|wd&U>re~(j-Mx9j!!4WNY`l9@Zu-^D zO#1tNB=K!~{<|tvlkGWZ+%j}>iNrD9E|#Cc+wRx>KDFk6%=^M*2FV%HQ&%}y^qCsX z75?M(K~C~k_e_`9XZs(|_BjfgLHVp=oOWh~d1lqyt=C`my?(2_!*a?2@4O`mwI4O_ z|GD_eYD;!p3?Jj3l#}|?K@(MiQ%>>92Flfbxfr#fh$Tbl&b|Xo|9@WR$+ddDX7eJi z?WLS0wXaq#zck5PFLLJ@(5lmE539Cb4O^XkU-Wh-n`nMpr*!Tq-lq`?4dtJnoXq_B zbh`iPbGv3*^s&F1kh}9<`sKgh@5j%UHNRhyn)$5eQpV3W%5%0qy5rhb%Jl4{m7Kq5 zLiOG9`?cU*lJi2XOQp6lW;b2#_xs(?quZ*V%}g))R%A3Im_y?qX#e-O zd)4p%$gaLwoVRgq@2~Fr$`<~c=iQjfeK`5%)53k>C~MzQ+9{2{n692TTVuaBS>(lb zrkDwfF62HHEiFp@4=oiO<_jt8{*XF7cG|x0d*5GWYF`yLL1CpcpQTDVTT0FDudANL z%6)sY`TR8Yr{9kztUty1iswl+|G^TL7-5AUpc5U=O?l5__qfOS()zlutJ^M{SWik& zVA?oKlVw>btEg%4^~`6njX(P0;+UKCPaiBXfEJ_|2uxa+nw#Z zviy#rV|b4GGs%NHZ`?09%)51)NOgr0gTK?Suj}jQ+HYR5{mUiq=bjvPsxx-3GC2Qw z-R^Z}tKtHRbDJ#RWIn42+RE|m?O{G^om$ZJz}*E0O6C-UF02L3l`QwKeHFZQ)g70M zesgc}{JR^xbuXukoPAwQyXWn@-+oNyot6BpOMBglv&9Qr#ZEon_V?Ruec8$<6SqFR zQ{XgrXW_ZEXTRLH?bh8Eq4Z(ap?^ZhAMba+ZdG%AmO-M^+r6;W50D}nT=K(-3v(R4 z$NkM(=j*rBVZCSvcj-~RzfZ-r1LiEdzHS09bQ@u#rI>=i577OwzuxB8&z3*$w=9wA zVprs^B*mi)N6KCw-Lq;}&3_5=ygNCIIh3M`&zf5E{C}cuKhyY_&;l`iBaO+fW^pMd zDvLE+D|2={Y_nX^;ePi2yYl^~8!H7}!sb}^uT=NgeO2iG{6+V!tPBngRl6k-|7OzD zD@O0R1z5zF&L}l&6I>$Jy1?k$>8jQPm76|Jb>xz}0U>b60&&x!tP}+N8&MMpxYE;JxDWww4j^ zriRCzWSi(ZHIs8s&4WhvQ&)=^zUOYgYj*oXWh%pME2HquzIER=&wrY;`sug-AN%Xi zmSD8U>vO$PiGr6u&HLPsZ}Kxr z{KxrX_vrQ6ysW>LI($?rR&GdJo^8T^9J(OP;k~HBhMeiKWu7U|RhaKzi_V|RT*0~O z(bu2n>+R;2-O7~R#B2ZS#o|u!e(U_LaiI(bjh&!V@ZSo4w@KR<7Z%y{va7Yht<6=< z@t9ys@g+}n)uwihZoOR@^Xy-HDrh!N0gd_I)UM32UN2jALy?_Hw&a52PQH2$mBqTv z?ELF^SHIF+C){{4rMbsJahZC>xl8+5ZtTBt{)RZGoyvy#BOQXB51iYC6VBLqJKPTT zx1E|VqEM0hxYzvLWwEU{(ob&ree-;s+1kzLtSo>01)YbV`ZOi#TkbQ@hrfTXTs|*~ zyG3QP(QzY;1F!ABEaZRsbL;2yA0Hm>v~%2Wrr&23^w8_4X^q@^I~JI|233^&$20zZ zz3#uI`RfnR{j)nX8O?Pp!$pjzUrRIS|GGhzQ$y9^&;0*?(r=aDul=0;^Xc^S2PaRD ztIE{vn3xcHZGKQbI5`?!7dj)+TC01ma{li-&x@=%UMyLgGVlK*@%=XxZ_M4r61yqa zGJaETX1&O*Ge2vdoS4|@v-xi54;}@Ly3@Mb&zyd0bB5RQjr){P&~evWcf`%!m1I3} z>l~j)Ipwzw1#^Qco*HAmb1a6!4t@_Uo*2(Ov=ek+@5$SZ$z3}8a^#!-aB>{q^CR-` zjzusx#~F95u;vsrYb^{qjL}`8nTbrcR4gv;FyG^2;xm{oj9^&3P*K z3!ZtJ&#M|3Pk(+jZS!4Qy#uT%u)(P>@r+F;IM|e`627we$jz^*0#uL4F!)a3?{8M`Shwne-X=R?1^0#T`0GA2gAYDl&ptDT^VQBz zr?j)LR&M!oppp49m-d)moE7nxC;(Da!`tzVRSCoOtOo93@ zi{(qrxQ~B#YJBwlNm9MBuj+?Bh9ss*oK7kh)Bomx=0ARG{^oJak%>O@o4@{t^E}<- zA~TCLQ-1b56}s_b_WeI<`#+sHB;WLy(?L(HDRHsO1dW6HL~ezi3prOXP4M7>p8hpY zda^?n^*+tq_n}q)iL~?yzPl^_vZPEpJN=N=bvdM7ag4N zHK~5J*2Q(8!OqVc4)dL!A2|ndc(iEV6UBh(PSHQs{01#SJFk7k`t_R4pH|0||9-pO ze|F9$&&qFf4B4bGx5K@Ub}D4d#}X87Az%uU7}#I$nD9OZdy)1&u?eW@oCwGeXE3i z>pkX}XZN6i`O^9Nf1hn$wr~pnu?uQ_W`KM7(k+1s^+OAKyTXtLj~3W-PY~SjqoYcP zW5Vs+?RSd`L=K(?bwJq{rB07EOK;3wE@!MHoW66y(U}a|Mr%La_*~VhAirs=7}t~8M@1Yq$#(aDo+~d}P<%#x*Olb^Y7YA>`X%IJZ#g8W99%YK?Y3L1 zruAAbTWFnkXGhe8g1tOvj=p@UE?{tNrA=Q$SW^M$GN4o6c%@77OMCE*>nG;L=vCzJe!Fe!L6&on zGn+qsTi^SmoZsz^3aANav|at!@n7X>*WQ_RJ-wj%+u-@PRhxc3o4p*gLihfUAk%rZ zyLRN49xXf6@Mc?0UZ`kZ#e>fpo3xLc-1x9_>&s=ck1gPf{pQQG5qfH~`nQQiiML(C z-rn$gn)#?A!S3uF|3!6slhZ*vfIxHa=k~~67TbMC$K_d}-TTK8xy$+9{(Z<_AF*3= z(GH$tf)~6MOjLW4W|eKTEj?ki@7t~H<2hC(k>Y*on;zJIK4Yvqzj&tP=Z^Es`Hbg( zZBuxfr1)U=*Z#+=Ec(9QO`l&YWWF%)RqpR3S>)@-(3itMkZmkKdnzVrR>XHUP%>?- z(|1tQ_p)qQdjBxT0tb6>g%2NZ-~U&(>)EXAEFqT1ldjHCP}w9ToDi+Qx^V5KHF8Xn zp!NJRH!kPd-g0g`nZ17RHjCG7e{G`X9+2Yt%GsjgT$J9r&Fz75q{_*<6UsNNwNnb! zZtL7VcS^b6X41DC$^GZlR`;rFboA_ES^M!u^`c49)AL$epKKMsuT0GC6wdVG>oc2l@r#)%7 z1v=HLbiMiCJyvscwoF#{_ba)%?1oA4yUZ>7-p(?gm44M?)1%2B=lyL@h}hSBtnTD5 zo8NCXTRs3a6y~!13qQO6W}=PkgEyPcpPT∨}L5Ezlm)XMg*)339~j(Oht|@_0$? z#<@3+-~6^#PWotR^4uHo7IwQ*Y9-xmccZ+!o*5)=E(_NL3plIVHr{fq7Yd^lWu;79R!+v(}zGqoy(Z@ML0f?8`|%3gr( zy_3BsZfn)^!FRr}!i9N<45MxGqGK->xqT_B{kF0y((&}=ZNKIvmvyR6%h(#VZ{Z>> z<1k~TD*1Y+gaOhaWuVrom!o`_gIhQ)eaG``!{cPGxJ@ixj49abCyAFOMBeE9RqV9{iAuoG`=Otzj`{rF;v>bmJO zcLbg-dwq4bI^*4x=C}NkiLWIsYTj|UggxD9Z2o)^ytjz02MHE4*v|57cC>Mk9r}u| zFH;yA-+SxtEy?|u60=QXfkSd5Xa|B><8hzfL-;qrHtGpffDV}2+jX0D!?_?(qE5Ic zG~;XK3~8UT5NP|X)_1{f`KOmB*VQZ&-eZ$+pyAHjliPOWuvYCp&?9Ml>C8;yVq?(W z)h!2@>^fF&&o{ok9G`E_=z_xU&D0e;w?3VNwq4bspPNU@WX18@3Ctoh!dW+l5?bjS!ziNkbmi4Aw29?>J#HY9b8|Fjbh6#c*ZZQV{#UPCjP z5I0sY;Xu)J;oS^40{g-L&E;|*%0g4`#kBzn|OxjjR9rRq;~NY)wq(V>7vzyJiyBkijtei+W>4naue~zZd7Q zp8o52(+Dj*c@!E07rQ;ZwA_EbUBlK58Tf)7VYmbj%cGlxHs0_0tu!Ov@t>Neh~`)Z zPMw`kCUyG%1l9PN*VaTbM+kRMLl}S~VnGTT8&wV%C(o1p%ri6nzxwE97;;P+|gy6$c!I9M+sMPVPxRVdMQyU;17=Yh)jK zSn|j;ZcIL&w(!%LnZ}nv`*Nm5Wv$$D#_04CL1nik4-fxc{_w!p9#wB*QqK!(ruF;( zRn4-kE(7gj__oH!6SRHwkz`T*t=n-`FPGMTNpGA6jcth@mS=JN#aoZ{NE%D5PM-^n zt-Wp!UM`>S=Wq8jrRwup^J-mx<4K^fLJf5+u4z2zpKxPC;?2!P_1#ky7fY`_Xm7V> zA*y#9ays$M=ZQJH;7 z9oIB=mffvhs1A~_VEV&cvf!VfRl(YADMThT4W`3vs}fF6CCazhg5y~|6W6ro|LwN5 z;wnuD87*PJ#5IkbXD=&J(Tye9CHzx2i07Vm|J%0hXaCz~aI0b|(g-;MWUN64Cy)G* z((IjCmzVi^>+k8ZZlf;(T2!k4Bcb}M$RvMjgIOO^NiE|W?7YH%`(jn+a6_+b!Eku zZ`=3Vf;SR@P8dC@K0jv$-}}>w1z}t62uxPT;ZlMjcOjdFtv5kZ@nih|U)M`MpEX|| z9$&llHg8N)r|P9utJlqHJu&~+mF1VFhR4mESMjJ*?{e_GMNjLKs$MRgp0($LlkB2* zQ3gQqqt6c!;fvZ^G=)I&RV_p((e0z-}P

      3hZ5 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 a@<(fWYF5AS%w=F;VDNPHb6Mw<&;$U;+rxnX diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md deleted file mode 100644 index 6258e5f1030..00000000000 --- a/doc/integration/shibboleth.md +++ /dev/null @@ -1,78 +0,0 @@ -# Shibboleth OmniAuth Provider - -This documentation is for enabling shibboleth with gitlab-omnibus package. - -In order to enable Shibboleth support in gitlab we need to use Apache instead of Nginx (It may be possible to use Nginx, however I did not found way to easily configure Nginx that is bundled in gitlab-omnibus package). Apache uses mod_shib2 module for shibboleth authentication and can pass attributes as headers to omniauth-shibboleth provider. - - -To enable the Shibboleth OmniAuth provider you must: - -1. Configure Apache shibboleth module. Installation and configuration of module it self is out of scope of this document. -Check https://wiki.shibboleth.net/ for more info. - -1. You can find Apache config in gitlab-recipes (https://github.com/gitlabhq/gitlab-recipes/blob/master/web-server/apache/gitlab-ssl.conf) - -Following changes are needed to enable shibboleth: - -protect omniauth-shibboleth callback URL: -``` - - AuthType shibboleth - ShibRequestSetting requireSession 1 - ShibUseHeaders On - require valid-user - - - Alias /shibboleth-sp /usr/share/shibboleth - - Satisfy any - - - - SetHandler shib - -``` -exclude shibboleth URLs from rewriting, add "RewriteCond %{REQUEST_URI} !/Shibboleth.sso" and "RewriteCond %{REQUEST_URI} !/shibboleth-sp", config should look like this: -``` - # Apache equivalent of Nginx try files - RewriteEngine on - RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_URI} !/Shibboleth.sso - RewriteCond %{REQUEST_URI} !/shibboleth-sp - RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA] - RequestHeader set X_FORWARDED_PROTO 'https' -``` - -1. Edit /etc/gitlab/gitlab.rb configuration file, your shibboleth attributes should be in form of "HTTP_ATTRIBUTE" and you should addjust them to your need and environment. Add any other configuration you need. - -File should look like this: -``` -external_url 'https://gitlab.example.com' -gitlab_rails['internal_api_url'] = 'https://gitlab.example.com' - -# disable Nginx -nginx['enable'] = false - -gitlab_rails['omniauth_allow_single_sign_on'] = true -gitlab_rails['omniauth_block_auto_created_users'] = false -gitlab_rails['omniauth_enabled'] = true -gitlab_rails['omniauth_providers'] = [ - { - "name" => 'shibboleth', - "args" => { - "shib_session_id_field" => "HTTP_SHIB_SESSION_ID", - "shib_application_id_field" => "HTTP_SHIB_APPLICATION_ID", - "uid_field" => 'HTTP_EPPN', - "name_field" => 'HTTP_CN', - "info_fields" => { "email" => 'HTTP_MAIL'} - } - } -] - -``` -1. Save changes and reconfigure gitlab: -``` -sudo gitlab-ctl reconfigure -``` - -On the sign in page there should now be a "Sign in with: Shibboleth" icon below the regular sign in form. Click the icon to begin the authentication process. You will be redirected to IdP server (Depends on your Shibboleth module configuration). If everything goes well the user will be returned to GitLab and will be signed in. diff --git a/doc/integration/slack.md b/doc/integration/slack.md deleted file mode 100644 index 2fd22c513ad..00000000000 --- a/doc/integration/slack.md +++ /dev/null @@ -1,42 +0,0 @@ -# Slack integration - -## On Slack - -To enable Slack integration you must create an Incoming WebHooks integration on Slack; - -1. [Sign in to Slack](https://slack.com/signin) - -1. Select **Configure Integrations** from the dropdown next to your team name. - -1. Select the **All Services** tab - -1. Click **Add** next to Incoming Webhooks - -1. Pick Incoming WebHooks - -1. Choose the channel name you want to send notifications to - -1. Click **Add Incoming WebHooks Integration**Add Integrations. - - Optional step; You can change bot's name and avatar by clicking modifying the bot name or avatar under **Integration Settings**. - -1. Copy the **Webhook URL**, we'll need this later for GitLab. - - -## On GitLab - -After Slack is ready we need to setup GitLab. Here are the steps to achieve this. - -1. Sign in to GitLab - -1. Pick the repository you want. - -1. Navigate to Settings -> Services -> Slack - -1. Fill in your Slack details - - - Mark it as active - - Paste in the webhook URL you got from Slack - -Have fun :) - -*P.S. You can set "branch,pushed,Compare changes" as highlight words on your Slack profile settings, so that you can be aware of new commits when somebody pushes them.* diff --git a/doc/integration/twitter.md b/doc/integration/twitter.md deleted file mode 100644 index fe9091ad9a8..00000000000 --- a/doc/integration/twitter.md +++ /dev/null @@ -1,81 +0,0 @@ -# Twitter OAuth2 OmniAuth Provider - -To enable the Twitter OmniAuth provider you must register your application with Twitter. Twitter will generate a client ID and secret key for you to use. - -1. Sign in to [Twitter Developers](https://dev.twitter.com/) area. - -1. Hover over the avatar in the top right corner and select "My applications." - -1. Select "Create new app" - -1. Fill in the application details. - - Name: This can be anything. Consider something like "\'s GitLab" or "\'s GitLab" or - something else descriptive. - - Description: Create a description. - - Website: The URL to your GitLab installation. 'https://gitlab.example.com' - - Callback URL: 'https://gitlab.example.com/users/auth/twitter/callback' - - Agree to the "Rules of the Road." - - ![Twitter App Details](twitter_app_details.png) -1. Select "Create your Twitter application." - -1. Select the "Settings" tab. - -1. Underneath the Callback URL check the box next to "Allow this application to be used to Sign in the Twitter." - -1. Select "Update settings" at the bottom to save changes. - -1. Select the "API Keys" tab. - -1. You should now see an API key and API secret (see screenshot). Keep this page open as you continue configuration. - - ![Twitter app](twitter_app_api_keys.png) - -1. On your GitLab server, open the configuration file. - - For omnibus package: - - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` - - For instalations from source: - - ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml - ``` - -1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. - -1. Add the provider configuration: - - For omnibus package: - - ```ruby - gitlab_rails['omniauth_providers'] = [ - { - "name" => "twitter", - "app_id" => "YOUR_APP_ID", - "app_secret" => "YOUR_APP_SECRET" - } - ] - ``` - - For installations from source: - - ``` - - { name: 'twitter', app_id: 'YOUR_APP_ID', - app_secret: 'YOUR_APP_SECRET' } - ``` - -1. Change 'YOUR_APP_ID' to the API key from Twitter page in step 11. - -1. Change 'YOUR_APP_SECRET' to the API secret from the Twitter page in step 11. - -1. Save the configuration file. - -1. Restart GitLab for the changes to take effect. - -On the sign in page there should now be a Twitter icon below the regular sign in form. Click the icon to begin the authentication process. Twitter will ask the user to sign in and authorize the GitLab application. If everything goes well the user will be returned to GitLab and will be signed in. diff --git a/doc/integration/twitter_app_api_keys.png b/doc/integration/twitter_app_api_keys.png deleted file mode 100644 index 1076337172a98c81c09a851ef0f4dc4fbfd0c006..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72200 zcmeAS@N?(olHy`uVBq!ia0y~yV9{YY!z`)p<>FgZf>Flf!P?VpR znUl)Epdq?;qOCWxqd?pJ?u#0n5-J&76Ioq#-aYAY_1SWgeMX0C2Uk}4&N-bE`X3i5 z{$hTUvqd0RnGYU8OTQa_I!QYjw>Bw#TW~UHAL-y7uLQ!b0N>MP`Dg zN9Ee(dUA&Efworh1p2x@;DwJ3s7Z zg!234hJ7NF5;&aQScH<6ZFB$0)VXS3{u{9_weG-F(`hTFeciQEQpr2~O60`WCzdmh zf1FpyzhzUIe#^z_>%#W3C{1>_pBR36E<^cuhYu@P`_5%P+q4%E23=E9(GD9Lt zB7A+UlJj%*5>xV%QuQiw3m8DaroyTsw;(sQBvGLvHz%*ys=`(Ytimd<*a{@9ucQE0 zQj%?}6yY17;GAESs$i;TqGzCF$EBd4U{jQmW)5 z^YiQs4a_WTz#1^55LVhCv_>Mdnp&D6>qL@)>a@`Z`2fjBkl+G~2D!M|aoOmD0~Qp> zc3g3q{|gxy92h)Z978G?-^}H$@j3qMIRDK(CuZw3DJ*mp>dcy;vC7kH$l&y z3NWCcSqx1AJ+nCj&MVGZ|RUcriG3L>3;FK=lO3sVI&YU|<||Ds4hlVCK~* zWz%JoVy)_b&YQF;_wLc-cXv)SW6EnrPF4=giVX@&X7vS#$XDin`C}92C1X&2dzR-` zZWobBb7DQ0Yp+?m_UbLIQ(AlO&9S&}we4yw`~5V7K=wGZI#DjqYun=gZzxNs+H~yg z%4M%pcSb+OtYQ>6zio!<~^~%hyiaWm??_3kC?*BCAhw^?8t*aHvV!L;ie0}@! z_Uotr^uND-nbg1ki&VL=7CgCMk#7X$ftB`ed*e5!Ouc`?;%*v?%iB2PJE7+1m+YR? zn|vs_>&K$W$wAM4SbZ#>XOzn(?EfmKAYqk-uk*}PUXRenN_QfKGbAS zm*5ep^n2u=t(3fjBXYga|7+GJNf+(ae(jLpO!=|M0}&z)e}xacUmR*Q?Y>QZz`SV_ zR!XefT&Jjg!m|2tqpJGKCAaopIe*u4{@SIX(Os7~ow9y9Tcw{+NMsXcGt(5FogZ=W zk7enzRZFi1Tj}5V+9b%a@kzo``x#Gm1}SBthG z#l;nK#=kp#Yj0;y`n6uw{p|JVM>i%I9l!rz`fIhD6+rd1`-K&}H!RAGKHSeg;axR5>dI?=tDR(MJaHyO}5T7Qf?0#)ed^bl+pqP1mSlgM7xD-UlH0xCb(H^5Uu^qB(!;);#ieiUymeRe?poc^0R+B_e|c7 zh>ZzJ6S{dS6YjZw@hsEqWz#Qz$ls~y zeYpJVOPi3Bs*|G2-``Q+ouHE|dwbj42X9h}OddXwig@~X1JC!k$jEEF5v^;sd|CJ9 z-(U7Ex2J8>l{uO__vp7wHpIVif zFXOkrvs17OoU%4Kdu#Br#la`NRJZ2|T9uUU3ValH?i?FG%Y(|_BI`bFSuy$BIX$%p zljqp2il2Drd~NxLWfMQ$QEl73;e=A##ie|VxhkjimD0|d#NRcV*!})PZ}rNB%F17- z#%c!zOgXtYK3w}9#G4KeW(p}hY!6zwr}+7~!|nWnT@%(RJaq3C(~a7mmz$Y+bBB}Q zW%Zi#B}Z&q3o8q+`AgSzcwYPO8u3Ql>U;Cd!?j1Mr?srz?XdHPaj=)r>WbQ})jRpE z59*w~_3PiH*gZ)&#Jzj$<2PcOH<=RP;BQ>wrGJ@5W|I3?t(OsL+&C)pR+A|0>g zS5Gc`>#cEVzWpVyBli^F`_`A2ENIu9o1W^KHhYtD^#0#gR({V<#<)z3K5(bwWj_1w z8HWN?yTYcTu-qh!U9%hcUrcy zRTUgxKmSx{bK7+V=V^lK8;VcqKJrbIZR&GaruO>PVrGF$tF#^oSUtG3KTh_^()ma4 z>}J{X+Sm0p?|Hqqs}r=>uQ$}1NyZmj+N?TE6`+cYOZwZQG0 z3l{B+`n&9egz|TjQp>q6C!5*%-`(4*E!Mqu&6-!!7}A&832mKKf302l>tf?_|0`Eg z+jb{rBwu>da$+T?rl7a=ecef7AM2~O)gLH+_G=|`)zMV1H1WPiPDQiwTysrVhWx%} z5f&F6Uy)~`5(l4j)dGg}t$%~IB@ZMhZXD;ipbjMTI z6T7!(Xunv#B$LzdiT%d-8=w5seqYW%wqozFUmQ5qi1u@{iCOS-+P`HDSdF^rKcRTrDU$tq@CXSOo|(qyHA(;zAa2S2pWtZ z&TvfNERT$wxp(j0wQF@Bvz&aWz9ZUE+;e3@K%&lkjfWyeobM*DfBy0D@iSNEYm08t zo1wWPK44N|TmJMbsc$At6_})!616q!=o5*{7Z!Y){psMBJ8M7pxGKcRFIgMEt#!@B z7xNxH&A+vA%cY*8bzIXoq=kF$n6unRWJ%5&d!0S6I9#$9Y2;;nSe5j4Z$Z{+BV|Dj z^?BP>bDpefdevuM@F-?c*xBjo>!gBRSq^C~Uvkp8y;W80#8%5!A%$KcQw2N1VrI#j z7e84rcX|fz)}qkWtI9N89WPZiGc+u6I=1(a&cz!&f2&wI)l1f2*s3`DY8O~yxtaundy_e*R&WE z=RFJiFxiDwWqwT&r(2K76qOmzj5=3+o*8u5Ke>uWHGBHuoo7`gY>&N}RCB0h!owpo z%*;NVSCekh(0e;aYHpg=-&JCAK36|pDe4N|f8 zomwdw@84;1LnLjFTVP6ri`f6lO`Cf9S^X-d!yQ;F%2&Mh*vOS_<+|$2jQ1r*SIp~* z@0X^Bm*>PZZ$Ik#@zMPWXID;KvZZIgQ2L6dqFFy)1|5F0XGf|s`_Hr8w{}d9iQYfY zXv_Z>Gqrh@1qxrh+HN~fRM>g_L}sX8O%)u}Zcd##b&1o}$<=NR7rj+hPhB51`=@vI zL;ICZCk%R1rS5&OzsVVR`1_VLIjwK&A~UzNMXb43p1yiwl9#or?GENsY0FirZAO~qfF0o{C#6ZU(J8Ge3U&vdrL;Fx|^Llmref&-C*U zVf`IG$v2E`di0AsqQ>_>6{ziJS)FoJy#Dq--;y~K<~X`80zw4#HeP)-}OwoO< z@>UZhpDx-uc~9=kb~DYD*Y5iMdw5f|;%CbCnXhK*;h`$ zGcUPI_Lj|1>+lynNsUA;E1C(ry#fRNU3i^GLq)`n^l7Oe}m+Qs2BW z;k}`j>blc+!}h&nb8XAoDU<#`^JR7XpKqu2w=I#p^>9fA=f?6McU&JH&i*dIG*3>& z5z?P|FjFX@Nx(=}J?;go^q)wJ>1Jw&ISl3>Q~O>cc}(Vd$+C{qCRYx78X5I)PBKgD z4n7+4}@TyqbRL zP;WDPu8igGWwRGZv?_(m$A_0*`V_lg_oCHCNAve_c2`;0+W0P6{(JBKD>w4PtF{}S z|Lz=~8{s)I_`{s_)5Q8>rY#fxXmd$sO8U_+`|cjvc2w_)+OH`mjwL@>@f^&- z>sC%zJ2G#+_?zrkAv@B}hKnv)cYVGtd(J&G_xGiu-`*XZ{b<@Z{^(=bEhcLJ&U~=^ z_ey5(XUj{w&Al|kWdoF|uYa7l@m^iDYFzS7=ijEqQ`2{C^K{M2>G4xJsxj;9_iz?d ztDV0$t>c=;oqlV_kMqA?EVjR#_NvDwF;Xk#+9JurwLKzA($F@flq6%`p|h$dK5`m~ ztIw~}O*A^Ge)75hot@E>9$bHV`g7>ST}wKQmruX2J9SF&r<%DvOBUMPXWtil`Squ4 z)2@=wZVyv==Z4(XyJ&yG=cjJh6*q;bT0Q3bbF&N1gh%H@c||VN5BE)2pnq=n_K$aG z)J||wc)}|&UGM3o>r1_lE;aggpv`wZLz>mO)j_F7Hbzd;jRlkZ_Dy{Ktf)LkN&mY( zb6!rQ=>26T`yYhNn%8zgRG!nWHT;QPR_=^*jc*s#N-lkM>XbYGmnm!JTVBe4F=a(> zbg)rT#T1SC4<|RZZksmq(W-f!QFp}TZ>_o?wdiR6Md>$-e058tLMATHnRBszhNmFM z&DQCAa#r2Hpenh`{W@=n5;H7dtQdgILaj0 z?PS@hD!#nS+u-LMiN}_oJyUvO=V<9A`b;{Rex&18+r7$N|4dI#6>$A0`ZxZry1)FY zyEm3JH_W~FI>qj=bmg&gU;jsDR@6kx2>d!XW#;9oZ?Al}XfP@gwIxtnK9gv}W(G%b!|~$Xmx2)}*XB+I8we_TDd7N-bT# zUD*2i;^ajI!ISnh{B+ocnr|5iN;$zx}15s<81=C+GcsuFsMJ8F1yb=~Er4?rG z+e+Owyt@@08u~)Ke}eZco9dKnmvVQzbGj@I4Rx1;fwzRxuWaKM-GVOG>@}9@rUYvXBYwH}JEY5SSOG8UH zZ*N^flF!;F`YTUek9+dz(+UACzl5gsYt_&C^(p_?RaSQj`=1`QVE48oF`AL*)>kc* z&5e}#Hm!bc?}486%OyJVInC|;$zurn|-+LwLdRZG_ z)z>mX1>w9R!%aR;@282FuHI8__S`?zSlf1Lzg%b4kNsCJIep%v6O()b+~w>SRn|0MUlnqS|ZUcTFG-AX zd@}P!^XED5?WaGB%(&qBI6-R5ZPU_qxu8I*%OC(1~8D-BocT&`ub8>OW(a!lCwkbJ9A!oikj462dSl%LQ zo=W=PMIS6`BW?!1Hhv_|XL3`41zNN&NEA$X_UMTEza?{K&NUYPuFk){=FdZ>nGM(d z;#J?iU2XR-YseWqA|Nb>DgAlrH;P!!Jhl zOP+O->zlW4-yW-;>mn=tY~|;y_a}B|J9y?Px;`;7FsuE(Xv3=e&zFC+v9_v7?z>>` z`1P7mXkpg{sn+{T%wOgBK6`Xf*6O_Kg4;^-c3Y#oQOlKlFE{WtVJEvmu^IL7Xti^;mbLNz3{Cgj#5+d>Y^TI98Cr|$V z{{PZ(zt2L>b+Kw^6z1Rg`lGP;=h8=)gWk?IxA^P&JA5L?k*{Yf?d2_s-fX{bWW-nd zf4$+A*0b-=bn7SI_f$Ij%U5=BKz%(p%?bHiEPr>`_NAe#SFndh7d+S>ye})zcV%LKK;GoV z%StrN6PYC{nOC@5-|LiK`y**wRlfL4HZq2R-f;G;b!bKvj;XHBvkH4LZw)1m)Wwqbb*2XHjzVI0%r&AWg z(T+UWutUR5PJ_#Z$8^jcpWmNkGIMeC%}cj!XPMVK=~r89$;`ZZ=hUfdpH3b=BYQD> z`#Zg9fpe?+=l#FPUVAHYLgo3Lcki$LegC|8%9LRB^A|p_US?krb}nvOpwG#=zu%AC z-~IpfZvVY+Ossdz3Kh%yWz$(yTYlI*`NaRPtC|_T-RKiwtY45K!_@v;Y^X@NQw#r56pxKI$DZG{UJxr&^h5i=* z{px$i{f-9@7iayy5HWG@=KKc*pYHQ~>Th>a)7!Q%e{$ZUAsyb@A|oI-D>~K zWs%3OGqG145lqhh=CE1o;;KA}9^q9lPU(uKuD{La=lM|HGG>sIW!T<Smdd!#JKfkQt`|J1j@6KBEKmK>g zpKo@_|91X3YaM+(=YPsc?%#F4X3xFFsCG$VzDt|o*%eBbSz5ntZ(sG`vOw3YXJu>j z_WqJOaF$Pg?f;ITRuy$E9iN1I838+&Ns69HUX~Sf_Q92w`T5~rm$}BO#{T7Q0FO_tf}kmnQQm88|f`R_lREOspY{oFO5OX9nyBA8M>#lCfY_SB_qt)uB`i~qWv4)>z}|9$jfyZZUN+aJe^Ox>vax$5On`_41c z`Ti1iHaSnH$-94-)5yE|Gr!xe?)226+W-H>+!`ec3Ov@oo$qnQqgo^%f$_8y~W%96b0CR4Htd#LTB(*ezHJWwV?<;p+GG0BFW4bZ<|E1Mz?KUSa zmtPL!`z*aVD>#X-a-~n^$|XA#v{U`B^ekNb{B{13pxap@=QCGuik@f!47Jp_tT7x8Vb3ovlhDF60_tFO=Nh zux_Kw(ua~=Tc#eYyM6bF>ys@`N48zbyt;qp!DDM@&p7q?w_@*{O-C{>PikEEMkPx1 z{LSrlH8baZKQ`ylQ*l*&KL0TJg7S&pJ#q^=W(dXXmN>HI+3x?zt{I1tY@dIg<|`{E zEg)v6w9E<>DAWk z(yQKFTe|nY&Sm~}F)~pfJZ3!8THkci)AN--%f^3C#r~<~JI}4lT>I`WdwY;m`~8!P z{O|lavE%DiZPE69!R6^8tIXLsq4RSq)R|J8&bt<>WL%sZZ33L_9yG|EB~*C zR~||0##OG}{A+sr`RTvRH-FAZzq|AN#U=M%vhy#O@w+AbTl8ms$dhUO?A@NSi{fPy zE?kvtU1YYdRzvIKk*BPTdOnLg7;a{%p0@Q=nzOxn_msK5J}QOn!drj;exJ$s>4%Qj zx6gfF%75=YdZKv#Cuh5XeMB-&4^Je%R-dUUb6{~AvLrzC|*%1Pj1sJ7%p@dS%*_zrj=}(9q%A6^yG$}hqtjw;;ecp%}hD#-Qp{r*_!uM z?_2Fq7#gW&c3-vPUd(=$!#|4yqheB`<}6^${Pd`F{rkDX9{=Y~cE8*vZDXgSuiN)W zJ!1Mvo|ytijun)&b*>9rc)=qu^G?;>eZi+&&sBE+xgETH`iayZZ69Qfle26k{_LA0 z9XH@l^YM(%&GFgH!EI{D-oo8vXTk7R4FSrFW}8 z#^-E!lOMjJ{%-kC{dIqy-;b00y50Zu`WnNWsBc%J`{k`Kimui5>~U;4x%6WG-P|7n zuSy=N?{-&j-REGxy#3q5z>ocb(I@m)Es)dgU;nFdQCrT<&ynI^)%1ksr>v`f{(swl z{oiF7`^COYdD7{zdH3t{i`z9<*>V=yA+27>s+lZ_e>$uC0wS=_CdmZ90vUO!~%Cau~SZbW7k$<04NGQB|=cVEj#+8fS zY}u0YX@8WDm1+Oi)L9w}qGmtcTlQ7uUrKCrlGCXt&u;tw%AfOZX78&n`9B{{m@`rE zW@Whgn)r9Nz18d_enc+{Np}vtdboD;@yGwZo_sciJA7Tr^5tm)m0zRzPTtwC^78qS zE5_SjHp|WGmMNE)`e@0ScI{vCq3!$Ao`{S6t9-OQH8J?xi4_mM?Y{)gxm(jwG}qwL z)F92NUYn*k&iimvyFw?D=jPV`O`*}{{#~~|y*>YYUF_)_Ki~IHe(_RquT8LLz0BSH z>VJ=X~muInfVaF25?K4^V{}%yyBVl&n&bk-m9?x39&?pONx-nlsb7_Sb&1I7!=G=B`^eW&V58x%T&sgLC!X-4xjQ z&Sz<|w(Wn-Q#)H*uQBE}^9HerN>{P%opSj?ZB5qy6Vhfz!NJDo=IjqDiq@Nc`*!(D z%Yp;hijM!@rM%L;Z>8$-J#p(j!<8HFtUtPQcG?TO_!GHD@9jtsKYVkkR{8l|{L^y{ z=X{tv^GjFj;gj2BE{B}#%Zc5s6ZK$XY#!re`zV9e+q2^TUp)Q8Ln$d}+0U%9zZ^3> zy7Cu`U^7Rq(6J7`@KNT~o z)UkZ~@bujFhoRHFize6I-C7>rwDD|e()$UK@@Hh8`qwQN*pu~a)dH@$KCbV29D{kI z9_>|B-4^D5FjO{D)GYpe;Ng3MD>q(dnYJoq)0!vu%iiCZIwyR|<4NaunLqo+e>zne z1D$%gkij`YQ#&$xN5#iQ-Q6ptc~8t!eb&poM5&YAW7eDgRckb+YlmDb(_O2Z(b~d( zGCwTR(a2RvIy;+N$Yz3%lIN$FE1YAeM?5cch>VDsaH;E4wb9O|kj$IARBtA^9`R7y zIYa9X%j_otwoj%#xxBPrPVlY2&YI|mOOp$Zi7lSMF+oP@aD7xB9TfDT@#lMU1+O;#}|CZQ!ZLcPq=I--S)YQ`285r`bVbh|H_%hww zTQcu&T-;qeHTKvq#p#~^cEu@8oT8;WH%D`(&&w+Zm)0IXm#4>Y|ubh+H-Nen2h`T zY>m%9^FQ)axP(tw+0D+=b&}_^?@uQCTt2C8{8)Ydk||Fn`xgnesZFzJE-sG4$>P&_6UFmV!X}ev?NKW8+c0s4)4t-k3IB|@9GN_s?_A}qyPoH_ zoHgKsPRl4TF!@ekm|0Nl*pc}8$K;|q&H6{@&Ocx78EbU+`EiCbF7f_tfv!eBt$vpI zo_xOQ^VG>E@%;Nc)=!>)-ru-XI#%FP%lVcSLDTdVXNPoc)8UiatYWy@;r&{nBF}Tz zjon_mD~LS(>!+Y3@b8416tpwpz`!EK!6>9Pq1$Ko>Kz@cmrN;~;TfWMhC^VkkM2I3 zar8Y=M2Q8kEVxOPnB|I?y=N7-x)jS zjNAncuf92+`;Q(xd;9$AXm&3}?UP={MT-vnZZ_O^tVBs3VY9=7nZggAy{Pfu;iGo& z?x$3i%Pv6$Q=2)8y}p!4off|m-zvAS#<#Sn)YJ8mefjMOAzu@YKv5m__1DaHbbZ>? zU2?wuMQ6*pAA7>uJHK9mcaT6azu+C`gqvoOo)7%OLb4n7&+VMKrntDaE>>@{XTkQG zndy_vF4iAfa`C95Z;AD^6>k$J&u2c(tGT~}cjCcgax0H`Dl#G>Md3pZ$CiwXj}A7o z_vGp&C~zi=-(2F-bwYiohwihZ)reLmvvYiS1O<3$&K3(|u&HbLrmom+B9- zOi(P7zIb)Y{65u_H$O-IFltU;&h@SD{vzJ_J>Sj0cIG!}P2fbbE5M&+#!icwx$@R! zJvIufOJ84`Hf@^9Y>FLj^9VV3x z@9*v|Kl!;bzVfMPbaeDH$LN?$XFrpt3NB}311C(~XRi72#KkR2-h*&oScT+hbF zFKu??KJ)s5%Sn!0h-i_LV@z{gux8DhPft&mzq_MYJwa+-|Fdr$Hj}3xNxr+gyu6@5 zL6BqTnYWI)Z%uzHxNy5IoG>}iJ5X0gbLpf_IS&)^(*@;E1?G8P#w zr%ZCI7(`+K!NJ}6ddX7y^D&*OS>)k!yMOUBhzQ>RW1ef&{s9;9Ol^2LG6LI+NB&7Y?5 z>bfPPP@{*6kh;2hb#*m2cemB``voFlVPU797R~f|_UKWQ#gd0#xNYF86j$UkaX7u2 zZSdv#j03&W<|lqRoSvqe9kaPGY)AQfxya9%_xII4E|HIe4jX|y)yw(7$D?=RLZ@0` z1>>SkY(e+Kr26VEMO=E)_Lv`GGDG7pwFZSH`#7EJdpRc*EBIE6Pm>e8bYofV7uWTB zcd){Oj)9RyQGyvQDAH6L6ppOfk;sD@a14$d$B^O<N`JRqZxOr9~7p-Eu#qc%g3QAlx()u{?btGBYH zuG#eH%+%dp+`baamdx6{O?0=VovA?7+rNHy=gifWdmg{H^8U8a_hr|fBKS+!5-8HqTH~5s@ zz50)f@+QWoUtjN5R=V-R*{63k^Thn_mOhWa{OgN}+1=n%$KL)g{xzF<#r-8)H16k@Z@k4ebE@64BGnML-DmcHFEGmrll*`Br`(+f=l>S_c zJ$-8Kr2AUce)_u>D8{ckR4QLvIByZ#nO|vn3)o7JUcJBnN74Lw*XO$FM3^4k|L9Yr z{=Qq{pDuoXxc90dr*=rq6Z`mg(qC$0EG9=!-2eY?znSfVocsTaV*SIGG1hYT#+}*} znpC0hzj{|u@J{uIkA9t-_j7TK&$WndEw$He3a}jNAguI3hF$UOZ0mq2%a^DB2}qy% zsq@oBrROnqKUO|+ye&WfZ*+OJa;;8~=BBCqQ>VFgd2U;JSwH_vL5ZT!)Ua(+mYO*|}Tu$@zztf6VewuMPS*`v4F7f!+ zd+)X@bx8dveSgMLsByyUAM0PfXYISXCbHwj%pVPr7v;a?2Rk~P@S5~*yH(x&>79+y zZ7aIh@Kgo3RGkjH{PwB1P@3z%FAcALUi?0B*TSw_LC!xeNbWtNn0jyK>GyN?NY5;M z{(Ql;(kBbP9=T}C7HxgiC0cjY6&KqS=rj=n%Pg+O=N24+fg-#GSj z=AHFh_I$0K`spws$q*+PJc2!j!-_=9@~x?}^F1{QBtWN!O3xr@G|Kh;H|9 z+xsA=X5-Rt&Z|E;eq`>-(tYRbuJA$mq(g&%EF&$2kJN`6^6fBx?3K+no;d0$`7 zw*7t6Q+a!wN2SBvJtc`hu8M7r7jl)ozU|!qw1=-=>(*B+e0uis^JyXx{_i6UKdWfw zzPo<&>FSAhXC7U&sC&A-?_`)$=p2-3bfA^Q{^Zdz6C*~#JtFAxf z@H;l}ztz>J?*oJXNLGsrEec-}RsZd1bt?P6?V5HwTR678H2Lv1GMH)itC=efN56fs z)a5VR4z_uFs-2G>naozJn^$M3t^R4(;hOTR%iC4++kWkwb87E}je9?Tog{jF>RX-Y zGkhO2!i!A*ys164sd7Q|^Q+2M-I`BVUcT;E_C?`0CoB7gfMwgbI=lOp{y*8Xy{zxs zX7(z-4@;b*KDnz{%xT$jRZ(jN6RgzCh+sMM)4KL>mgQsLnd^e%Y;RBMai7{Rdj0cn zbrH3|Z{5Fl^=z!!q4f03uGOMbPVDl}u8OMK?Ajf6?QGYkb9;+l>0Q0{^K^LZa_g{T z^Y{KZ9IE>BrtRN-fBH9ht$pNPp7v*w{Q9hqCl8$ae9O%Ll>VHmFMZp#@CA$U?Mtz~ zH1|-0d~w;F$xpoHS825Wtd};}FK+wOdgdh4r&nUz`QF-9uAKVj+}-jd|M-xun4`Kc zbe}13d%*r6Ki|aqD$FAMXy}rIC#_QA5aQ%JT z{{Ip@_3v}Ib^nGbx)xfNN}&^*T>NVHiusd7ZQXokf7@mqx+(vz zJLgX+PPcV^_LZ-5R^9%tzu^|^uU~>ob=IHI)2VyD;mM-Z?sMD3K5c5ZpR;GzqB9Ra z*S(FI%5VSgZO)IIU6p^W+_!A9m{f0SwSA7p~K3S0fHLq_)Ri>|4i?I-sw z3w!zhg=>Dh{F7@>e+y>^c`y5a_w(v&;*;xk{(dcTf1cQtpQpV}ZG8N!@b1gUiubnt z-nZ97{%}CN6}y|<<(Y@8cKCfPU-l>d#Xf!O+w0~f?SGbh>`U#GIo}KSy?K1tXshzH z$-l~GTCZ6ABk<*`J6!vx*VOSX>TmaX8F{1h_0<`Fp2hcl+WOBf*S)-7R|yLJU$c|BL}{Q0^yDuR)->rU@P4-mkdcF1_&7-VQ*Lywo8iFZHxP`++a zPV>GNzeBAzBDX87I3`Ys^neY^!nFbhlE#(m_F0pe`)f5p@|LKkL`Py z`rU2A`(G#4mR5(vyq)u`dCeAC%j(3&Gkr3ADu5XJr#U2;u>wWF>Pi)zj+}#O>Z<@MyFDrk2jz{b7!zKTA8=k(;QOG9_s|F8j zR&P*n+0K7TK4r3}%GV!!k(U;nvitY4V&|kyn{(<~&LrrHrrcb@y7$n>2v0BF74w?o z&b^77HRIp&k3x}ud>`9aL`PKyUAY##GuGc!{@Tvc4FB`0cVE3-(K_{Ti=e*$iV(58 z6Xt5~lC6LC>{{^j?f2?xR`K7}JHMLs^13+9<+E-FZrQ#wW#QuKymK$TdALwy&$Wp; z-;|79(%+h?dw)GLrOK(Px6E!`35!#F+4}0}b?22iUr&$Qu&l^C{;A6Qw{OS$Z2VpRWLatVzvo}~7g)VgQ1=pf^7+qo?`N7KQ+j*PPQ88PnQrRy zi^@6mx28`Kefa;_Q{~^9S}#oXt(S`_UfJjSabkUc{$<@2_5TkRi&b8|z4_vcwum6t zAggZ*g&pzM%TF@fx|eL3B7Rr&UAFY4em~=v94@shHO{}weK}#uBC9eL=1q$hFSdHN zr9dXZ`|Y(O^Is($WQ?iw&j`6(Z}w!;{YAAMA9B}s9$R}PIDS)~eRNr@?E#jy$qP8$ z#O)B(x)LLcqSfB0lC2@N>*w`u-SF<&lFCaH{Hxu)RCoRF$T}!&Ke;OD&dv5GM^2RV zo5feJcqX&=r1le4-6*%Sk|NWhYaV=>8{4|nvvq06?sMttdlJqIubjNZOY3Kbf8c`; z`;>1*?kX)&``;^ZA@_J+vb^}e(v$7~Dt|q4?pDmxy>f9_ZCD!g`0>kC z+m=}JPb!z6{YL&&Mpbgz7Z&~O$y+A{Bs+Zhv{6>`Reb*ZKQEp?IiD04CI4>y%6qG7 zm;2?;*s^=N_}3GDaTlvjwCwwBrW&vDe(uiqWy`m-Ul#O!ZvLpQ#_;j?#qP$JgTDWD z`Nus=R94U<$t9!p%=6br!Z{Cz6%j^4p*3S6+N!0q=pUkHR?9NPOZ(NuB;faQ0`-#r?vv&%4 zZrIEn`{#p$oMoB+xyv5m$DfwhJUyy;@a-~|;HBdK-|YXN_DuJwcHc5~=B8^r#-TI! zPrR}C{dB|b9e=|k4F%)Xj?dpE{A*IwpNU;1(_fZ}PFc$>yE-uB`o`j8GQZtxK26_P zyMO+rXqV3$KGy0hO_Ahj-GBU#TJ^@orm9t@OD-?dPx}A+t>~$;unFQ5m0V}9uX1nm zmyob()H>h)@3;GN?)-^U*`hLSV^VWO4qnfFpR{EC%pbG#v!bF37@mum-k+FgvC7o3 zWA9{J&Xemr-UZJ)6R^hOQ#$Lx+ef>0silNmaQXYEmt&^89IQ-hxXHPq{*(Fct89q@ ze|P79d-~|d<<^gpKkvUk{jF!O&wEAAZ*Q^^Ew{`UE?sU>a{lRO^Y?RY=1LcBDVZPh zH)g3^sZm9x?bey(38Vt`6_bf6q@Uy*#@5 zI=}anl<@HC%WA)V?OL@*ywkeo(yTecCu*zDA5A`T?dv7k-~K*|{D)t?xN~*m*D2RR z{#;yhHPXC0@BYn=&%YdRHQL#lrhWD3>DG_W^QKLTU->mEe5&Q?g|#Pp{=WMXuQzW` z)#u;wo32exo9MY~>RMjQ);R@L?s=L2&RVZ{E+*}b7hsm zjlDmvG2GT(elGa#u^%h9H`wZ&wVway>M2?GPn{{xHg4V`|MkLUm(^8YUg~5Q4!oap^K(+2FSykH z>D`cf$Q%|w2aMG|$gFQM5x;1E$xflaG$}3S?B82kXZ_3iKB4c+Ic4$rakrORzMr$} zU)aOaqSrS!K6d+BCjI-G-(j8ne+5SOZ|!`0gkie;cke^x^A(vI=g$4ZmHJV=`1toX z2Yq?3`nRjPFWdd^*Q!T*7n|R|x%S@r)SHh^U$o2nS`=`*$SWdV>*JsF)=8SJLXSk> zMqEFq-F{K{D`(=~_ebW(PyYD)7mro_FNgV^ua@8BtGiiw^x-AecKN*T8Q1%-?+Prt zBjr?luyc#I{(YCwclZ0f?(Ni5%)cR#rtQCI`_~A6+1r1k4n6G;F3L21vZE~i{K>ph zd%^wl=2p#Kw2b#_+8TrT*J9)OHvZMLeETFezG~v~wapigs_hnQQ@-E!=FO$JwSVnr zihen`>&lA%|Kzs6Xzo|(-}mF^^AnHlg&WOk@BgbP%HO)=ME;9}S3mYG5Y#v3_KABe z_SbjQr{zCNmtT=Sa_ftXVSSGO+H+PuE8X)~CMstLD;?aouOM=VeB^SMZF>SPp6&~a zJ<3q_K0()F)l97{`CrqH&W|oMvyYSQnwa<@|Lo~3mOBQI?{nOafvpr`;IIj1Iy=v% z@{^Bj#*Jgzp-o|iq`DT+!pn=C)=|vYv1jj zxi^q;-@WDD_CeFMeo-;l6u+fLIj3#D?S_Ikkg z(3%u6ZJnWH_DSseiCXSYT8Fi?BTTkGJl7Zz(Y0F0Ozvbz=0da9uxaPo*0Y3b3q?kD z-JGnj_2QY;pFg~NYpUK|zgzS7hW6Tr^4G)eENSDt@^1S^!$%DMj>+Du;%hR_uH#>s zH}B>)?Vka!DsNBdFHsV>q%(2r+>WW$Woy?Q-WO)>RKUQUmUTPES$@^UWmmgJU^&A< zS-nAF$;9#pn~U!kJKT?7qhDYA>Y2}`uct3n-CM1{@BZ?qn~RU%nWp{pXnTps3 z{VAWhHu6~+!#BuK7KmK%QRqO~nq#-ieXo7~bz}CG1BtfnzIhL9nZAQ$!Q)=9rZ!Am z%=a}*_!PVe0g;=R%*5d|@9{bJ%P0~LA_W`-KIyDDtOj!_c&yCkIEz4w&GEVY%MinZ z3>*yyHY+qJJc$fw_eB{!tLWoY;Hd1gmiJ|6M3QJscVuupv3UXCY>%(- zrrd58(%gsw1Jn5?2jQAX#me`$H!EZIX0@Bqlf+ z!NlQ2yWsxQ5-bWk3t%+p;eife&^G7?dvKe4RB$PJl5M|#;g_e+&GWPK{whp;KgWEE zgrZo{lP#>SA16vaId@(^%ilI~Nw3UJi~enfsiEs`W&AZcJ11&(T=yAI{%w$O1d$62 z1qDpi(zD;JespAgw1?`-DeGo#d%YrOQh#vo)R6dvZ?;WYtdv;8*zyJB;`u?<)(x0!$tEl`g ztLA(A>-1wa)?LQGSd66oyXQ%9ioi2n!-3C!3q08syZ-!r)wyfgXo-kcWub_juE{0@>|pql`19uOdDo^y}vtlYM;7W zlpoD2BOK#?RJ3*%|C|@6k1Bt?Fk^XGX7cL;FE(ty zbR^?Rn8N0dTVAZ3=)j05|7_l~%qkKndgrkz?z@`$oGzJnr`83p;41RFSK;6i_3hR5 zpI)!lpOpN`b!yq_``P(?&$pS+R9c+g5_D2D*X9@duYhS&y26)fobd8LYY|)2FOhk3 zvHyb&32|Q*OnN%+j78zQqLXW@mu$JrZRhCRd}r>AdlTbNdHwVg_B-jnJl$r)*01lb z2Rm+kDen;`rX#9#%I$VLpvE{90#)k)uayiwSQ`bCra#MQB(o5I2 zu3ujqd1_s}@u&Piu2ruWT-bQH*3xj^d7q$p)hbV4bb9yr_1pc8=loQ9ElS16X0fjI zS56tJC$Co(#ujNB#}*s7)v2m$zn+(x{XS1OPcrS-uG_D-b-33p@Q?K4dMWpa;p!!I zlbki{x$j51`aRm#@v1P&Q9h2{U*!R!XbDL`I>&ttkkM7iD?~l{k>3U)N z+b0+8HBMaL+jq#BIpPGQG>4EYra5d@_n#M{eZ_*cYw;g9^$Y8|pRb!&TJq26tI0im zwOVECyVLSzq(m0m?OAx=p)lgkz1A-mxlgIgTpQf9=yS)0a-S?6PMs%~(#?mGGY(HS zmznd}Uprj1##T3nTletpBZ{-j_0-+nyo$^A$?uyK_x!@%XUCTKd@7yvJdbCVSN7xB zJn5ih|K7AY>Mtwm({x=5Gp`=$d=(pAb92LvT%YJIeG~Tv=7mh`J9F_mS zcXQ^%X?t$m_MLV7x>Db*z0-SDz0J=`Y>N|K_%X_N(xVSknvFeH1Wu3;6A3(5*w?UT*gSR zM8DmyZ)hl&uSx#)MosvMI7=W=c(C z{CmgMuhwbL%-gZ;U#}_8c++sTP;=%>Pj6?_gIy+yX5RHdd0jmY|4$Y_UUYN*D`ur@ z%Tm&ozwhN-dfoGy-)BW{iEqNw{MD{HDTS#oO;1lxe|OJd`rOmc?@S2(7MEOp{Af$& zpQ30fVR7;8E7>=HIk;Kvd}sXmZ8@L1a*v$Yw!*--GOlFK!Qz^|>h7vb)0gFRUn)>s zDC{piJ0wOwWs&H1(cQ+6&5y~Q@w>Z0qh*nk{ro4+DHU#i!`}P#_uJ3dl&kr;=Hj&8 z$fDUBH&&aU`I@|CXRF)Mw|%!wHck&nkJ%M_#2l= zwVb%bpV2g7!h?M*vD^PS@;GG1cx|-v`gmzaXyX%>w%*SxPW+!Bx$4&`>r&UGard@b z(>sSFRf?o+UX{j~sqUX~O77RkdmrX!9@*F1UH@eJYSWKW@l)2!i?OVAbJ~93-qHCc z36%wV?dLmOw}YK^0q$*VVVRX7pmh57@}HeCHapC1?{4{C75TZ@X6l5<1=|IeXHVz5 zlgaU2@XaFUqs;%@G=fvML{w_JUKBms+4bQfv!(G9#of2ItTOp}+~d=uga4Y@zP^8N zo`3b)Cci4-%uU+edn-K6x@)w%yiCHJoZ=pR`rWqg@RIJnmsZr;23R@5&g<@hIyB-*FtRxbS}Tb=P}!=4>8m7ClAA~zX77P`(bPXT2m$1~*% zCd~pTZ+=nYb#9+FWlczsR`8Y=2mRjE+s|9i{e$tpW|;2n47H8!=VBjs&Qv-q{9JXd zY3BQVwk-TklZBO)rytF{mfMjN74zj+%C*{g^Hxn>Bf4Gg&7#h}J+@1GD?J$X%A87Ka=<_0u@r`1+Zn7vKDHX*GLg5Rg;V##ebT z>)ziTGfpkIV_9%FXw!G!V$aW$!q3gK$at|wdD5!I`rDXLx-7369VYWQg{1Szq(q9I zm65c`d9vZbgAKZGj@ZrKV>MTI-J{)Wn{!2%`b^X`S|jASG9=;A>JxvbS{n*&D>-~` z$&M8#-^}8T-mG>%#nt7v^ZpL&=ZepdN19$te=k^RV5+7y$9l4#*7Bog;&v=|2=AV~ z{haH$6}x*sT-WJ*;dSlr+$Bp^O*oVslJe@^jDl|g0=aRs%<5BAYG261CoUlU%mtr+ z|JYoxKrTm%D`?W!`I@VfkA1lMGK!~b&g7dt8`k@$&y8Ak;zh`X-4mDnSCo9Ws$Rs= zHM2~6;^fQR?ibI0E}gmg;;VZzj&kOlS+acDuG_CC8J%+8Z0V_`d9h=A>4jbKbJ?1U zs_#EEPHJ!W)|0)xDJL>U?yQ;aza2GKqUStWv}4D|S>;6qm0#y4h(|5ql$_-8R%SjFCw zv7RBXb>WK>k^f$P*>fY-(uddeU|nA9qOH31_wu@UvO}NWzW4ttgPO8sk+a@zFU6By zC$-Y@uN>vmjV}6nYm2F!Wg35R!J$_y8y989-q~c)xol0vX|J=%UCeD?OxFd5PkuLd zk;2Ep4jdF;E->8=DCfhwL_*{dvPk%{`6MSRQED9t~I_N?#);?RrJgivGA#z z-hW$kOj7IN=e0ikr-HAoyEupKQb_2MoIh61Z+lPNQ!Ti3C|7WnSO1gre^P6AOkFJ^Z-^VlcZR^^&%@=0wRb0Nkb{S95{?G|t9yVK5EM{nXcJs}j zWdHN4-<8I%(KpU)aQw3R*w*0e;FKG?tnSO@_Z4^h1+ULm@s}+r&%0t>=DJ_6Td^@H zBPLCyylYp+Y4hr)@cvJN;!BRS6#LIhHQm_0`*YIuTpx`+_GOhU(Tje5)M~T{on9%VzB3H z&WVq0Ta2t{JQMOiweNe2fL2f~ld82<%?n0*anEg4bKSI+EjN`F`pAfG*3WsjD3H-^ zk+k}?4gN;kHsv%m$KNhmf)sv?!WmVcH#|Cgr+MR{xM!{kON4V?xOUnY{Z_x-`E7o9 zMzg@AiPIN+cKW>G>g3oA%ekj#@JK6eIP_*qbn$zW5BA>9ho%`G-@19R^5)2$EqkA* zpZ_Rp8M$Yk&zDZ_)64jxk4<}7*B!O>V#<=-PQ{hemLHZWQPn77st!DGWa_JHPgQju z-@D*`uXAI`QHN(9d*&r)@y_|&*1D=mIP17akKlF-o4$O5Kg|MG2MV}iHkza?+Ld|f zjqc~eI|cgYB%a?VYI-NmrBf!-e`)6H&i8q_>3!b|1Wx>se$JWf@qSwVT;J}t^Rd#C zZD#j1d3>0=O>YJ#A&usDdR5sIzggF7xnjyG`F%;ZKLyGilTmJ*8Et+{ zKl+`3wX%<$>$}C5%GdLLzFa!zMU1TZ;dtTul|51Ws!ewv?p*s)d|O6-no6<9kz=(_ zUY)eL-<>yc@@J=+RT5wGBCo#6kIoaG{`tU;z0!x6Onx1`mzZt7UbWVTpK;clvmZ=X zW@Q#xw98aFIe^U5$xClP|7)=!!paZ^3xHWHmL=IKd)&zzPcNEZ?KP^%1W=99d$VOg=cDv+Ro6l#|l9!T+Zn= zS%oeY>U4757TFoaS*bo<#QS7$Q|OeSL?QJ`N85^4AW9i-Q)bbSr)H zTet4bl+Y8E!6_}TK7KxN`ux}VeMd#DcZOunJJGr7(OkdSBxA{<*U);vZunqjOjVJVLZM|h1CxqYmUG}(AXO&!j zFORbXk_#Saawu?Aa#gJO)x)V#wm!-;=EkOqS7N8m-d?M-zT<9}d*FLti7!2Sn=6sW z<&;@w-I*z%{8r?Q-esHLUU?O2vnQLowh6l(+QZ@^Tl+Vn+w~8JO3KA&AHN(vi*lNz zi3`*D&oc!=^G@wMT_U4YSLw2#`@^gWnnt`EQa zwbTR&G#Ovhu6OE!eRU5D)OqVQ8Ab zcF(Z@EnK7+yZ!C|ZdtjtGp|1=D4-xb^KnZ0(#+VWe-HgxbZIyL+bHX`aP-X zb&>T(=d)`yytvjy--!0&%D>t1b3wvkX3OeDn?q8^$!JH}IPp;Tf zP_k*=y1AxXBb*50|mb+lhx$q%Pw2E76zSqc>n*7m6;P4sT6+h zV{Yf4zdtxLlD~J)_%b(S5eYStoB);V-Q?DQDdbIw?l>7P9?*Fk>-59Yj`2WAw z!_~oj@^%Fti=KR%TK~r1rpBUmH=oM8UxsEs!&C(Wo~g)N%=vWO+3(t%&QDD(H|Fjv zztSg_Khe^5)iJUAiHa8|ovGEdIj8gCux97-lu7m{7VJ{F`i*Pxf*&rA9!~KQKIU+< zlewM0U~$NaUzeX~_U;G|o?AcH%Wh85u??18`_Cp3IF!251EoOsovrI{cHbsuUi+{Ror=d z^7*@qj?R*q^XgV#5hyjT;B8dnugkj!or|$9`*rPw-4)$SxBT+HUb^z?R%qSi zHH=ffZU{bJbu21mu2Au`*A_Y{JAw~9(Oe%A6%pa3FMFeS&64Y{h5uMbTs)zxbNc_E z-bHh&OEz6xef{A3uh;iPS-f~Eb#L1Adka>q)4#BIi`}~4OH=Gr9>nqHYW`Dl-c_4^ z_?d^QOa1S@^HqC$GnchH>d&}vX8Dh7Q^()NA}g0=UtvCfd2@4PyW8(u4wHK7KQ=tL zu5)V#mx$>(os}+5fsgcZb8@t5|*ujC@oJByFQgQviH7+j+ia zdHXB9pFYRic2@1;9u|GGd4JjYU%CFDfAVkBm-~KGw&i9A&Zuwh=(eupm%Fv!^#A|a z@8bP#6#p^XTTqzyJ1;aNBiza?AjbDz<)2womK@pJzUQ2aUDK~pH}}+~O-hb#OD6?= zsE^k3u#fQSY=dQj$8aPLQcv- zUPASrf7(Yh2~pmM0cZ{>+;&-+w~)t?K<&IRWL~OP`#0uYQ|f zGSzYFWVLxGv=yCC9o+f)z=Q?ocKzNgQnEtl)s41y0Vj9f=T8&g_FY==QQ*vZYuLkP z&i>;)Z|nUT2j0CBjF~re!)yOl=@A+7=VCYAH2C_x=TDGO?X4~EZ<(uHINr8ON3^8B z<>{uTEn9?tn!lJQRQ^iTVu$_9dtNtNfBZ0x^<2MFal*v?>R;bI=v+8g=S9Kwos*3X zeb+2mo))u2yUXh9r>)x4f|Bgd#*1EbjX!eLwsK1MYS))LYmA&C)tZ!jE43?s*L}QT zP`}l+^~slaOFrLiYyH{1l#NB>Q~R8PU3=8Gss80FrLXQwLq4qkdhO+rzpdvI7yrFlG4;7n{YlZUQsR$-BPVVB zJ>kgJ!|NWz*!}D-|Hi}dVL_klnH>uQZd#N`eR=l!Rej>S`TuOc)+nA_oFg-*nos7^ z^3BPWo@q?67dKky&;P@mto+WZad%n~Y-u~Vy zJf9HCzYj3U1eG<>6yXVuPIg8cb@k?Icd+XXs zJsD4nNV^|%AI`l}TlPBU)4m+n6GtwTbxHL)->t7-*7N>MU)@17slUr-JKU?=u&B2B z)v>KXmnz!7)j2BeeQ{2KdF7N%AM=t|p0TabxW6s``@1C@o&F1Pl{S7U`SkBIi(2Tk zo!T3dDiUrBvGLuFzhm$FM!%3NQA^L)m{`s|T zUn;&RHRqfkaNPCD8yiQJ7eS4oc^Ub;jLs=*9EeT`2oH~I@T|>#%6~z7Uvh-Uip2$9 zKjs*yZ*DDJx^07_`Yg$JrYHIS`IR-?Jl-o-uRS zd|F;uui~4(?yYDQ3+vgEC#$plUM+id_;}XuU%T=@9Sd9@_Tb4Yo772r8w$2| zi0*hDz z`;42JY^p;yO>SS!wq-(=xK3(e>1Op$kDMz-jrNtl=>DfteqUfig8WO9tedH2r5^n; zL3h{9{&mIV0(aNXV)Bd-6alA*$+bgT* zy*zz=g^IfO?gfie#Z9e5Q|7!dzkEJ;N$}}&+ctEY>mJ?Nt?0(_{lLa+rnaACKE6~l z{m3^%^1<5`dHEKqnXOvZFGa)xw{N%peU|5gNE4roWn~|e;aAi0dR~EPC1$2sCMhQW z&#isjZ}y_(ZB$uh#{5ld7M*XizL;TKMFCLe^{Sz339GH}Q4|L4oe7Vg01+TBD(5>h_hTopC zD%XZ*`JXQFV>JAz_$4m$!{l%CJG4`Br>DkWJ@n^z{-i@IpUS;)x3j!(XPKIRUtV^z zb;qI;_jNukQcv?$V)r*QDSPoZ)@PbV{iOfdg0E~Vd(R&~VrSV`a`kz$;}a<(d$j|s zMm;YlOfAjIo0R9tnEsRb4@*+Ay=}v>8^8VA{ncKq;?n9k@O$b5&jiICT%KEBWyvoL zHkmv9WxUbJm3OWg9y##%YixG-#ppHnHt#)FDi+T)Q@1zOX#7C&-!2mznmZ z@n)XjySRi$*CIpi`nfQAi??2|Wc}}XxB8RylvjC0{7lgv1}_5q-_PRSbI{F@b;o?3 zuy&0H=G{&UZvTqOdvkK~;hlL|4;kwVoE*4g)6emiZB*Ph+3WLpNqOmnQ|rUEOpl!O zjVjo%%k#0MiG9{I@9d)szb#Do&7|fdG^tGVjcwt>a_=sw4ugbqlf_Og-hIpOx!Rv+ zY`>eQb$#NGW$Jw{=KuZfN+VgpeLrR&^Xb@W?u4}*R#{@_CNmWwLIsVV0yaZ#ksqKU$Z<;3=1opdF~O{l+dLG^%^>d zp8uZwyKQNExXyzM-F=!bs<*`CUWwdYa(m0A(@oFkv(Bn(-ct>>3hkc=&Zd(Oc$7HplJw^Icd2F1qjh@vnJZRgedSE- z;d;vd^+NBg?)x&kG8(2D*f1Sq+_`kG3VZUA3pJlEC^j?tR58^r@|+#Cd^_W6XORzk zZoZMUWh=-`I4N?bZboy^HKx_`)eNr9?(z$$IG1W8@MHD;o1PVN!7Q=5M&~|tRysEB z+`!0w_qo>rqs87#T3($C{aLpQRfiVzU!S+3KB+R9*Y^5?l)dwMM1P*EvC@#};f>X!m$*E?u^s(JU*@}uX+0{1<0oL61@)u*bSO48GYnB;~==-Q|z1JlE++qb?0sE-Ri9D zzu(&GXS$gsk888m$vNNFv4+L%u3=Va-6N8-MK3qz@ya8$&$;B59C*;|pll1udE^XEljg$53CG)AW#67z#JBIS@xDoi+Vc7C6dRb^;%xQH=(V(vl+@-E z^ZoXj7InDm&2N0!-5`EO?~KTM%_WRJm+RIyi=EOtT{w@SeU|$hZ!f-HK#SDf1NYEm*t7{swnd- z211qd^!dIyWb|$k*QuJnF6<4{^qJX9jE%n47xY~#v<;VB?|fw0>z8|Y#JN_@sr9@h7D}cZRPoy>y$&#lq9&is*yA zKldJ3^!oKKE~eeR;xD4SzdsE=-^zI?e3DSr`=pMYys{RL*9SUJU!DEqagEZmTPL)* zUagA@G(LPL(n9Q+b%rxj&nJhs$;S_tZS$Kk@m2D#s-|^MwfnT0e>@PozS_>z=T~RU zoSX$F>#j-8K3a40hQEMNQLkTR>9lLBSof{>k+1&w;KP><{#W^rZ^}6||HxIhfP{D6 zKmCJ8&Og`@OZBw9mv!lu7)%Eu`Y?FS& z{`qcFnDUI@Hy34|IrU@SwzMDCCTBC6jdwquJ9qAv>#rpyzwyUY$2Q$$yGy}h=5KEHF!le~F7#@(*7+-DQ=gifp6ltHx8&KR zSDdpqf8B7iqC@&(vE)0c>R$%yI^VIyMk*G~Gni+vSv;9xQDVecwqt1<=s)=i%GL0WljuKI`T`|TNRcSSeu<+-k6z?)!Ru$wiu=gR{Yw!&Sv z4<3II>2)$Ex%AtD%S-|eyazVT*4*^+Cu2|92b+bgaSuJY@2aGq^GLmFxk>(+iq2Pa zwPlhC;rs`ho=V^Av)y#fs`C6A_2ZGOr{($2`8Nlx%+Z`G_}p?c+uBAYvww#9R&)RF zdnE1YeDq{n)&8a3&yBWUW$#YEU(9QAqj=H9Lv6oquV8KKSkHod%XRJEz^LA3Vxip4)w4e|PcL<)3RWzD@{= z+s9E8<7k=qR*c6f-b$6p(O=w+i&@RsT={?_>#BWzkI#wA+uUVn-=LQMO4wMH}{rDJ&KJnknV@@lVX}yDw*pSjAkcS~YXuvv}tH-H)p{ zv~v00c$wLY2gZjhCrIA1D)y>6AindX$LZ3wn_fv5*d{sI{@V5O?$pGW3y&6T)0w@y zx2m*vs`vI~P4|>On5|y>&Zt&M@k`UJa}zAAIdiSfA5`)@&iQzTbcpl1maz4)R#p=q z*-ZWQHq9bxhFn|VQ6F(*r`LH0^hEN_BeqtjXG~jrBw3|_Wx@dtRRgBE0;SS_LvqA_Mz&a{}lbH(@v)Edt_MDzv@BF@$x8~K9kK2?sd(8c6HDkZ?gw~ys?!LlBlf?|S z)Ff{V+xKLt>xXu&gu0-POm^++*C8vf`EF!vo?bCaYm?4_io$hQ9ZeGvz&#_{p!SCaYNSOyZ)+^xCybeu|rCnD)(K$+>#} zkVo0;`|J#nHyL*CPtdT~e2ObD{ME~4>@zmJ%6=^IvUsL@z>H0otnaP4%3=8I;;o;| z5|ibEZ?t_qaX!HA%GIQ8Q8QB)aNDu&I~F>#r&+5>vtLb8CxxflI?ZbBqQ$GW&06>B z<<46Ns$_Ha&gD|D6#Y}O@4?9r1!XLT=_O~&uSD$q^W#FJapO*5gDu%^+D{)e?l|Y! z@o{YYCpO|jVN^W^)9%ytSJw)9VeJF7Z!e+Yw}| z8xZxsmc97(8O@o@jf+=1M9rSh9xE#1?rvNE<-?Z%_U+}r*4sZj^zf_aoZL6-+OySL z6sNzF+f{IJ(?`>(7p&L$@4RIazR_IpOM2qN`5CiLEbI5{=ie!0SKR#j7VC!tGd~tA zTXD9)L-^0GgE9XeGW=@@abk(tUcD}E2X}@EHyb$roKQ1(kbkfvW7Rs*cix|B&c2=) zGru}cYTNR!HLo-LcU5)& zIAm+0X0ZL5OTtM`j`E*5M(6x*><;4C9y0g&27bPz%O8#hNq>BGb>2I>U+QA-ZtgO99I>Yk_d5Tl?(-t<26W59h1B#dXIeD#F%Cr!jUG z7vB_b0(4x|B9K-W(s3yy8BG+((0E?Jn72|Yd@{Na431H znWCNFt+Z3FEZT`WO}l!fc5l#@JtJhF=$U)==DSG2umenj?&6A#`xbad-tc>&zlz@~ z_EyOZaj|!%^G?im$YkaFw)gpq$#p)}(|sNZR$Dh*EwTDco4Qw)kZj#<5yl`sQ-uIZv@+yr_j+tIv*`T*)nFmuK1;t+o$v zw9pduQJeFa+sLYFm*C1Rv4>|1%N`Ipx;ARAufueycg{?!-@lE27Ji^(-_5FR0yP2^ zJ7m|GF;}+tl$?I!wm$hp#@of`XJxOmyZ*}dTh>d@2oKioK8<7B%(x{b<~>L-VEwjr z`zG!W9>Ouc>ouQvE#G+S^K!rIOfC;IW}o90lYF_!TsGoz^KSt?m6G!pWlhDjWQ+=0 z{N}_S-oB9eb=2-f$*+8`eosv;uod)aTAKgLY?t=lhpUAbO?RHtx$2E}g$|>B%DFG{ z)~jDUJ$*7xVb|xctAxe!3~h}ryxwrlYWBx(1sj{bRkm&1ee})T_SNlT1ro2$9M?Fe zEqCkK>NCuj+v0YWz6#Q4H<_bTR`YZvXRUpR$ic&+Hiw9}`%sURO|LH7ZY#VOzVay3_x_m$Yo(ujNUqyiH1&S`u?fn5 zzpIJ{-0#-s-|?K+d-cP2h3U(;U4JHJ8h*w*KlkyGWd z;BwQ(_Yd9jpI?s8ia5xW_It-WH8=J*KlKiNW{N7#UYc5YW>fvd^nfXaoA(*E3%#2o z)f;&53&ZtWMmJlv6F0AEXie)(*to#$OHjuD7_Ml6IaTkjTArG->6Xwhova@(t)GYL zFVcM~#P7F%hryd0_FgKjm0Mm{ESfN52E(qC2Mea+M78*7{U*xD@iGdBZcW7cWm`Ygls{E1XHFw5{32e9=_8 zee=9L+r;Br*{@H%kY*Gv{^F0V%^ucCT$x8-N|y;ApE=WqYo7e2x#5booc(LtPR;on z*UR>F3)kAo_vD*iu4+8ob*ht*Q-M*%z=-qDt7~hcl{cqu&zvf^t>|!!?H-0hMuGF! zxx2e@v*fJV_wzx#zh6&`)KgQx<;~Nb`sLI&WQBcqtZe4mtaGEnWclPOfwKx`jWVV^f_;f?;F>#)n%TF6r z{@QD-Rn%Jh`XysijBMh$3VSP?o;@-wXOto=7raVImfG{owF=kIebFW!=H z=fLacsYjX@>3(YZ_0J+>3$Itr^7(UQ*6_&W?FnK2{Yzr)g2O%b>*8&7{0dJUj8#a# zWbOJ&i|^g)tG`uMXPQ5gEWWc^j&H?z(ZwT&1tfU5zUjVY)|UM6+KyE&;M(243-qn_?4B}hCEJOW!PmT^XJ@S{wRvyx zT8<+{e!}TZ7VDDzqNe>iKb7;*j;%+%9ywk-e8PIowhdRmte%{@^^WpgBi8F1dF$`U zPVLl|@7;Xj^vZqLJ{2A-E_#vwvZ3*C@ARw%A77a$m@2RQDU$y54r`IxR=Jhaug}ZP zUhe;wFY?Ep%4L`5{EPc~A%?+L;)+`tuj2KkyQR~lTIx!qxaM%}dh<^2P{FPPQH68X zZkZ%{L^wt9NrUthUBFE8!>zcGQ|QDO}fC@D9v zagx)@Tf>874p>u(Qvf^IR4@;suVMwu1ytm8^Z!+48F4Mk$IEn8`6r$F z&3?1GH&ii1uIhY#hEulmetBH^=jv;VVsdLM*QQN5+i(6WCw3msmqMfI3$xZ(-Oqge zaK-)uQ=k5-*xq?P`qs%G4GHzu!E$ALZuChPzkSxbaO)kl?#at1ukt*qdO)Ij-?rJS z#a>6|DSs9|_)kwQ@uM^(QB7bFsyM@WM{4K7jN~Ud9H)=&eP))W^*Hm&0fCt}88l6% zPO$p4*sD0|nZsu8OMHDYGg#_vcd=ZVuX<_Uz2LPkr*B-`5!ijk?48_lPE%fY-zuS# zDs4uO`pqIlF2&FJ=n?E|nwrq@=S9Wc3oVDQYlLyGHZ85r`1!H=$}%VEBbfpl|2znn zzaTtu`K>Q+Bx`SLswG`_&5k_6n<{^C+R{#GpVrbhNw;c#e2LGvw{UC3`J$MM8NLmV z!?JezPP=^~M@SShm=4O4jmPIPRKAH$Sj)J#^z=$YR>gfQ4o_LJU8?8OkN#6tU-wG! z{&~GZB;Bd&h;8Zi8Nr>qSNVG0%s)Ht$IXw;%Is$mcBZC%uJ@Q6$)EUGvvr^N7q81|tM5#8Tl54b!r`Y(V{GGh5KZCjFQq<|9*J09+6(nM( z?>e7xQd%=#I8i2 z3%}XBQS<{#S=op4niYXD0*be0SD7_lGrIdA+4<+auiVdcZv@_9N)Iu$TrGZvyU9R5 zHGiW_(vzRj&vkFyT49`a`Q+!x&vY%WRNPi#4{zKrZ^F3y!5Q6+El>9SE)*46t99Kh3g8mFusm~vY&e`<#vx}gn$A9fm@pTtwOrE%<>iELFl08za2Mc>o z9Z)mTSiNnX-=bThTN2#Q*<1VG{5$=x;mx^IQuf8)Q955&F05F$dz((v*AScaJNz#n z>M+U9u1h}K*!x>l<>BEo0co5Ix9YU)*t6N(+2zXn{6F`n9h+mm-P_|v+g8K8fUCAC z8}%BlMy*NT*~_3N@S~RnRw~;(V{uz0e5q7Pd-@OEd5?vEWl2oTv0t<0&GL)KY!wC4 zGj=L$wmDk5CNb=n`1^=$MynGpJ>m~*-ThLE-&H+dOYz{!%$0#op4Voz+%=6AUUp-( z=p*6u&>YFOowv5wHY<+#GBkBJy=ch++U+?Iwek4ErSM>UA zuVXeg?a=3u-SYc@uF2K88eQ3?cEw6DB9DCEi>&Hc_|f6hx0r`}mPnXCuA4af$O~74 zr`E1|-;|dut6j19@SJP$dlhtV&YwB;x6`X#r7JfU%#qm}$;T=ob^TntqF$idlH7>t zQakE{tt>>{UTA^P04W zJCD}v(c@}!|0DDv{m>@kM?SaX-YIf#RBQMewI)sR$SQ_w)_ms`;Pq0!aO1?6EfP_u zHXm^L{r}m)x9`Fy2R(HAVV~7AZGrBc3+H~_{ngX+^|kS}^?sb4{^7!#J}k}L{?g>( zi*t|mYG!})PByRERUK)dxJ!R~s!*WQy@_W}Pt&_y^MvKjoOAceyaax{W^wu^zc%Sj zK&s<5rzsPjBpbcX3$~m0tCN#MZ0Y+i%CF8$&F1RJI9#v){{FtRfrcx16z9Ej{?%*V z_KR_G<&n&r=VAkH{XQK$P4}jsOQ-yL-lrPN>`$$`|MYEtO231o=c9ANFHei|c&mF}whDY;%-QKjHhmn#qhb zgZ&Qg?QVCR#a=T-tUX#a?Ka1O6W#Kl91ISx1CMlrQwPu!a3JB_7h-;MB_)-T#tZ<*57tLZ5a6jaCleM#pgU+0)dmzq2dikEIMbC1(f zd-B#i?W=f;yS*}F`vv>d1B-Noru>R8JhS;io;vpnr{%M*PFr{~V~_KPc5C4dCneQ) z(cjh@owwle^*I(`et5@~{>LUO0pg?9C!ScJA3EyQZ3QD zA1{8>eQ`xa(b{>@%Y><(f%h#E7T!OQmXW=W?f%uk;;QVRuFB05cE*^kJsk0Q4r{-E ztk@yDXV;bHeNfww`Et2ldhw=~j%#o4Fd0kSzJDj}n@q@2Yje>R%|YAObc=d^UvG2a z{rrftOl|*;nf^|!z11$+>7rZrJ$du%BL2vP{k@{#3ZVOI+PBFEl;Mrd2Zd^&vHQ@} zI7Y>lH(QshmA(7Lw?d9*xi8+Fzg>Ut!lAC&U$(BkWUjVrHTR{>t5fKxgrGKCQ-`y4~wI%PL?A+P6!+X=^6&RU!GA_M) zh5r*{$K0cAip#8aU!Rl^8FF%4ZHcn=oAW1r_P==X^L2UtT{dI3&U{w~b?GTTPn(PG zIKE7cZQ|eTdz$8!+b2|+%r6bf@T;s7%lRgzy654_?CD-dxOjV2+Pq!4o;B1pTvpUG z-6_a+^n1Wjm4&+TFF0Or((>uIFwoe?TAQ}~Rmju-n^!jcP|c4Mk@`8W@UZP;%Z%(g z_S>;8ocrU&c4jE-`;BDbejR-7qHyWMlKbZ5KHgYyxB2eNdpZ5DXV zG~?n!MsO1v)V}#pAuQ48=W%i0-*{fvd)GVvsE}ux)3L^?oqM$E-JO2@3!dAubFpqmh4xGj?*|8C zJU{PY167-vOl+@MJox2KoIHQtu+7=B)wJot_G_$yp4YmT^e~$i9bF=RC_zp)n&(;7 zquB=^glpORHPyN#Mqks9{(4+jX;H+^qV+d>yqnQkC|GX}|ZLwd?#)%FO zHrDRg5PI<8UV+YPw!QBT|9IB8_)=8G!^0OgZ_(My6Su?ci>=~^ZPuTwovvK{l3VCg zR{J#l%3)_P2OuQ@Z#%F3QHZUYClW-tMtrf$K}QX&5h~l>2cTj z%};SRKikjWZxbcjwR&USw7ANGsZv|CwzB;SfAJ*c_+`;|5$ierCP>cZ**Tq|b)^a0 zy@-jEn+s2d{k_MUFIT3BWCN_k{bQ{0W-RH z8f z>gs?;5V+yuCd63cNOoYDJK^|($pJ1%p$ZyEo5Zm|*l1Ff@a-m4 zljNA0UbNV-&23Rq0=oq^^w2obrNMlX)ZuNeYs32YxFvRjE!tneq%`q`xF5spevmN| zo-B2xudl70cts99bR3xaEf{0^zIK!gbhU%jBE}fpq(F|3>QAZ$n+Xr=1Im63b0@g( zX%4VKbNnTc<1bZ-+-^oSNv;s&_(!rWj}*}y@5V59!o+KfZy+Zw1xA$*9l{RkPXym9 zi135TRd76l9oA#Q^rEF_i`>y~kbr~-gZmr?E5-f__JtL2cY@^-mIykir!4uZv5g(o zB%4Q|k(MLY97oYcLzH_NtQ3{kx^J{aHR*w%`hn^rPj}0Iiuom+O(fLIC`E+ z?8?$wT4gu?@5$}0%)ej$i~C|y-1Yw1^Y_mR?58H(bDz|(aOtu&Pj<^&nYvgU{kwB# z;y=BzG|SRhFW2Lthh{%`ml`4h>8MLwZBcu2+sglYx$(-0mfFV~S8aS%qkjMWO$YYR zH>6gS=E&J@{5t#P{rSuGt2l>G-}Ya;`pD+u4aVZ;KbBm*Z@}8-8Kn9KXbc38=tTG`kZmqRNW&#Z#wA9U3ROsKfT#t$&;ylKbNlF+xRWmQAyi#Mn;tP?eN(sZjbAX`aBo;-d{C9!MK;+t zKd!9VVA+_*qu;z|)uy>U{2cG5H}2Jej0f;;XJpELeL8!6fBEc+y{*QOp@G!bpHdd| zPmc6hw)^;v&s*=tY>had1R7YlP+7ZzVOF4-{k<2DR~^j)b+-4;^k@0Kdq#94J1iRN z*qFAvp`c};xYi6f?`_3Q-%VIw) zIVQ|se5pMsJ%8@WPd)mt46fdYp371H-CpbU)$ds*AJ#7p^2yx<9iL!cs}a0y{-5ak z3}T)&TQ6?=d2;n{)zAyoQw#%)`>$`@w<1nCdF{RPuS{fJw|t*oU$V;i^6C|0!LLm| z8XGj3_B8JJIK}Bcw--~_qIK4OZ(shfUfI5@M{RMV=J6Ai4c8nib6z}sm%De_!d<)i zIC(dNb#fLNbOQm$3k#tQ0HA~iT74S#qDK~sgYq}u;D-ZwV zu(-XMCy@Fwk+bmshtG2zT?#iWxL4G7GOuTCgZhTe&GmiGiTeHX2sav z*4LB8SR7|;PxyLGW@@AF3T^uhr3Y=K_9~=iPrW3O9dPwc#9Wu;=4VUS+`oN7leSXH1uWz+6u-5Ju~*ZC)2UUP5aeb)|~`s^>0beu%qyQ<5slGkcl`liChhN*3u zzWLM%3$FNIKlWpD_sWX0IB#RKc0r}=cRRi~vnp=fA20ecMZJJKW{awBhlhWh!Pkb> zi#yaAR2f|hKh$eVXqoA1KYCZ|RI>crTXo0Rc7F{TJ+@EZBC)k;>J2}Oc^9oT`gxfm z^p7lzwXvRmz@c94#|Ql!ErpHIeR`kL#bga<9oCT5NItbtN;G=YrdJoT+{B-s^*&`0 zu&z1c?bP5Fm7F-~H_sBDKlu9k$8|+7{zos?IX`};>-V8>Q*i-j%#U5xf#n$zygpHT zt^Z#L3)8*+UN>)z)s!Qv%7fgddcIuv;Np|A)rWkZMC{bDEA5r^G^p7o^)zNe(Skj# z^UO@%ou0O9dEG9ZJIDPV2<*}LdwH()Vw;(LuNEC{$<4X+O4f7@Pg`Hp-Rdms4B_5` z3iqeZ^S(3r`!f9^<8=|jKaQ{YE3+$TQl%50X6(J2vlW$IeK-G?@11;Z_H9*_oWr*y z%ul@A|EB-syCo{0|2`6{{I+{G$H&`SQw1*{4cq)-&m%iuZskjB*8c1@WjA{lKB0x* z*g5n09cQuCOcCorWg17q-kEA`@L{0`&lL=U=1y2A9J%vI{zsYl7s3yBr2I}?s(R<* z-|oM>y5cF*mb1yeeig1)x!=LsHurGblZ4$uAD2D-y}~|t>+iQyZyznwS6RMPEkosz z=;!NZO5Z4mw%etXHzncDZx2X!>vd27AhP3NT6 z1l1+WRFChP^2R@Y%hnzFTORi)*lUEnHS#t2R_1n3;pKX5<5EnvTK=wWy|}H#zRobr{=_DtB5cX(Hdc&mzW zi>4mrb6K9dQr{m{l;U(OU=`TE+?UlW_wn0kk$SnZp)P0!Lx z@oenIXZ2@YtgLUJ=?z$U%j&GUk5lx|eRYnjGz7b6FVkqkot ztLGmB;f9R|tHd7dH?b8JSgP-NPfyS_bq$~SyEQx7b+!v0h|=ADGAWi}^;wgPhw@=f zE_>$2iJ70IK*M3HZkY1V`koc^YT2YU^;g#TaV`;4pD}aNn)_?>c~u^my|~5Yr6TY% zU*A{x2@`uA^IS#F=ouSK^d=lR>RTM~_b!Xw#jAfTqhC#*wKqRfVNR^o`Y5w6dN4#U(7uEMy zy|=x8;c2_+>f9C`#rf}izst{*J=FN^q084*w;%Fte=ailrsalfo#)oIJjuH+y|*&b zAaGj#X`RN;QX2|q+MV|5YxueH--CI79Oq2mdhfo>%dq%@0NB)mz=1Z=f+;zWS?7O&|M^a#*#UHsfvCC9eJ@R*G58hm#Y|>L|6mWF~Z}sKJEBu8D zHrpir-l=UB`*yzLu?_y8w_WUyMKYP=~nzRv&yfY>XJ_Qy17fUuKr|$ zn}gtk{JXINNAoNv$#G^rR!UcORmr~}{3EI>j%)wsZIc(=*s|rrzf#cFNycGjvcAb{kG+VXyoqCQrpkU$4q{g)!sDWI`eWKJ4G4(bB^uDEDpcioZ%Xg z#<=CC?c42VQV&eIqiSS((N;3e^^!|nRxS#%EiC;hJFL?7vIG*Et-@coX;DN!DjaQO( z@Y%a8`O5UTD5Enz;!Xa&D8a|c?zNK^IwsinMy)*Qc-u8`{|13mR$~_;=7gwt`1+#F1ccH%fm*&ggqXoPx5U`ah@KuQhe8rqia0Q=-rsV zH7PHwzW14^dtD&s!pX<)C?ucYJ!)9k7pu(i2ENL+gQEWzDNf2(-=x;7Z;{;<)HD*t+9 z-Tlw+2%Y2JR9$Q?tSoG8`m~ud@#Gpj1 z!|iZ|yZEA)@y$=C@A~X7*tge5xnfUteSLZBk34nf6NhdHZ1b71!qZb^tBbF&MDZ>;%!s9_#`boH8r*SWspwk zLGi1x$4>nf`(G$8-S_79c3syCI?n|pR;%m?m-jlwTt!ot?Eg)vY3 z`@8GRzO{2-PqvGTv&;GL{dWs*=mjJ zm!uvz#}X{ix6xF#Y4_60FL^eYzr4`sbYta{2TvY7dbVH3_AYZIPrevdk+LC2Te+y2U82BtT$YXt+eqjcqpWBgQ#=K>26_saaWVxi4e14-NX658} z`0MOtN;89W{xp4bk`P#Y+lk3qo$?n3cyp8gKQ?48L9FIN|#~FL~py(qG8})vL z7c)MweYRZNl_!63-ft;A#)q42Gxuyudpzs!5!;W4dt4TY?f+f4Q*$F?z}RH_{++zj zwo5i&)o}^kQykoArBQl%SH#4U|6aRR^zeS4z&hPz*`tUeWc~q;5~q-< zl^b-lOm}~n(!#sk%ifpS`%A*aIZw0iwbi-bv8w#{>gs>vGQT^kzT_@f5tUavV0W!n z_nh&agGFA|`B$UN_E>Iwe9OY!VATOJk@<#_Mynp>7C(2J5|#6+_0=&h*@Koc{u`)NhW`#asRui@&Q=XW5k{&3|_G z^n>$-HKFh1sXB136=OfvC`HjYlFVa-2O(mTukofw0WCM(yWYI z51b3o;1i#vW%y*xTvgb=5oq79yeulxx^KabSe~K?NQM~`=^CrPJ%XcojEq7j*R4Yf4X4Q4@@zKD`MBWG({#NVMOyubgN!5ek2ZI@1cj!{%s8^( zhnv?O=fAlx18&8;Y@cfE7+EARiT_JM&vKT18v`G-?y2v1cZzBM@{f04yhxR_-j;j1 zO>)`^$p=SXep_zyHbEZYSmYw}rTu&iEs|I`Y7U z|97QkEcE*Echd=1ZS!XK)S_6>l$%xqc-C@ynv~!pap)jfA>{Vq1cOgZRJqh#v13Gvh0XVmsMk-|l-rufSAdURL3srmvPyzZO*{ zKfKpdQ890lhN9seR|T2nVd8r>m*w~FS^6sASl3^!?@wC(ZM9<7X1=TO@0-xZ$FKh0 zW4posWS&I+%<`}=Ni!O)XN2=x-#@r)nw-sq$@AwYbG7q{uKKlOOLt-8t=qF4+S4t* zYV)5j40ApE?aR-v(F*lxhiP1>gVS18=ifF?(AcOyQAWjnLgKxzm-VGRgAkPF&KZK$o9xc^(@lss22?wm_|L`qSS& zSI<ujpQ|a6wmD)4{h*cfBs$bNqEC^6>`c(x|CX%*D#dt$sZ-d>D7l zVlAE=|9?-(On!bh_WTbM8r3??!O+DV`{E`1m3psc<@}k!SBTR`|KKwLJ|*IwwQ7&O*&jI zy3S~SXYvo;YbUv{@Bdxb$uzGZR_eLwjkQvBl{1*(Bgj82IeUItY9HSWau z%iG{fjCS@8r-@(guE+~m`Rj)9uU&1^lta(*+S<hye`)vm8juQGBy zzhP5^=Nj#MdrkL$bj(;dmCHa1nobTZ_D@i;R!p^?zCLDi(aB?b+z)VH6jfR8bI$s| zg2*FAv9Ah8DvzALF!y}K&Z46YAJR%(F5J_)TFZ4W0`%)CsvBPel_px zIjCS+@l5bXw*9TSJNh5m3oNZ@aJ3bvlzZt^QDg0NN4R`i*c35G4P9Hse+C^B)_iS$ zf9}=xTNbx3>ba;qiL|Z1u3k|i?({CmREj@;(u5UTEY|PV`+JU)b@4*MnpLxE+V}7O zb!GpK0}uO4A9VSA%ZL!&n09N1wfM&$OC>g|{9C!--aav+>3l`uvx5=*4>x>@@O&e> z->j!&`}6G)mi-qYS*L-;&90F>!NqpggegngRge5VeEz=ej+Cbdn|^&*`ftq~w$QW3 z|CitXC#0#kXu*o3tFP;SX4IaV(fvK|cA-J|LbZ2wiJq(NJGe_0z1-ScZJvKxYl6e0 z4M(wk@)hYfrf8Ou!%#3y9l>bv# zx}jUq{_$IV7SH)>dPNLYW`A3EZbfz7{cWygF-$y~0?O|k4uFTn6}BwyoEu)@wW+$O zto@jSOoj9Braq3)+JE29*LZCIiRJ(2lTrF%>I!om_f_w{qMs`}MfLZ(vRY;Pi_ZI33FSTSkNVJ4 zzG=1I-UY6U)c1YktB;WQu*P=p{sp@#3X=nGcjnnvNP7RZx$fqZDk0$d_ow|7?e6ve zEpFa>c>ivKuVk_DqW8Z#KTTWkb6cwVE3-1;OSi>-PuJG(*ALzvy)_}F_pj`! z&Aak%DdWAx3oDWXG-qwEyIRGPrMS3B&HvBcn*Ym>Pi$K?t3=ZNUgZAIzt^31$k}xH zx1s-8mX&#{F7tb=x8m&F^qPeu!P-pqjQ+`Tg;Tee8cvz&^*^L~D`S*Z;UW3B>R*u; zHJW!leJfMyH6=LF@vz*ZNuSU3`j$6b{{FVycWQ8LnxC9=Ufk{J^?BvR?^BIVl`r~R zzwg%<8F#t#l+9ay9`=6x-NsN(qNr)*RDuw&+y~?RPZz7-()>Am)e!7#f?p$ z9)4bYcljT?U!3am!i6*ve@)zKxOzoeBCHtxa9a6*guL>Go3ZMfiaPHg;#n~^INYYv!}gZtv+XB*ov^Xb=6PHHs0kvnYofvs73>{=eV1f{}lLL2_VKS)+H3(F#7xt+m!?Hg6RBJE7}zxr(EB z_MYU+*Opd!dmDuxd%x~gQ;6-_Nq=YGJDAWnWE2~i)Q-6q@k3HF+ArxVKWgV9Kg{hq4(Ce`wuNmHfH)x}@UnbtS5@6SQ_Jd*=7MT`H56O5oLb zJH`8y=+xMi=d1qQtL|Cy^HP1?Vm0&iOa8=`9WfC5v1XphtClrC&#qtZpm;gHV(x_G z`@tcIc{w4@o-;EAoV_cjHL1Lt#eTNhRI@bL^O}8D*m9OzTSZdD1t#rz9pGhfr@jX| zu6;#vQ}i0>Ag-2x@WWjSMZHTLO&`C}GgOp5qW);lf*DKoE7!+us&$VIvRZ;Zf^Haa zIi)~lxz)?8e{*!ddY`?wT}R-Y{@m{+0X4twdqo?GsZ9Jk+pm5#4`2DkllvJJub-WN zb<+HUiVm;r&NUfcl46W@Qi(k27&+~^tEBa`8<8)&zv?{~Igo1vGGxTUtLQe@J$d%CBuU3+tHy?|@#lia>W%bum5pRb$0Tjlrp;`rJJtyX;CcJ5mp_ z?PdFP{)548yTxTXwf{=gi<-YQI2@4wM$dVKiNq$dYvXunOE+p^c>@{jQQx@ntL+A>~$KXhx&lZeR& zp9|EvC^hPsRx29*{K3Ef@1&UhdD*K|m9+K#W=SdTygj*jTlb-)`2J46Xz4d>uTw0P z6hBW`FtwJwbf@@RKh0frb8p-dl2ow_zkjZ~$3ral)W731w>~UP_m@#qQ9R^b(0MD! znPo@8*+<*{P2e&};$VEG@XJ-T%}?zLr-Hr6`{^22-iDXl%6qqOLw8JApvn48PcDR= zG#A~e%5{Qw*|*lsA)bqxdyd{_-8WTZl1y{_EoM)_+Ye=g|4iDvIc~vGwPWp4zFCdu zFNN%HTJy{7@cP8NQ>#N%zB(vy9GB+5F~5alj|02W=Kpcq%uL?J9CWo3v%`=BrTz#y_sq;s1d)~K6C-=?kVQ1=ev$Zc4nixB& z?1kIq3iDTu7YwvYuBBYMbMl`-?YF=Xwk$htHUG%7`8UJv?z{KBQ~umGVWWqo<&!yl zvaHMRw>_O@9CS0Sb=Q{2+YH+4dzLzs{oavzg}L#;mzH9SKu@cZ6sx~GzerA2S1yQp zX|3hCjye8-N6)g?%oEpZ}P0Ex_rT^`S(q z1@g)BDwB9thVR|6nB!W~(cimL^oj~MDbAT#dd%nAfqNXw`Pwg^zQUZyG=E~Z{jKQ} znD1Y!uD8~@m7MhE^1j#0FK$h@QRly)4c?^;>JHXzWbvujcNb!4{*z(0mCJPJ&B!gW zU&1znRx58c-1cSp=A(H@&3$ZA*0&CAYKmZfXejvZpntVw@9yPHi%;|}ce$rI=~C;_ zcrmf*GNDWsVtN%=7Qf`8G-Y zVm+by_|TjUPwx`+=;98)hG5y<0ze)Gh0Rb##9bNANl`S@zur+2zfeSiP^yVEje z;^Ui-*3@1SYy5oJxGMHpirHi1u(Q4^@+~X>oqCvdwKGlBhq?CuY;_AgzGpfWu+?l2 z#2pe?tQ1$BvWc*tJS%pG&V?6tFJAGVsV)9}Q0Zqh%Nx;;l0UQ3T15jz^Sk4e?`?YS z|6p0jH52{M>2E?}Ll4~%Ez6w$-|>Y<$ET^=ueWVJs?lxyPpA8hcI4h)fAY7lixQRF zu5~wHk7;6W#r^N4i}~Nn%KU6L)2rxMm}s8cX05~SU!5PylYP2W_SB7&^^LPO#|h?l zn614t_v>^arCXnb?%1d%?_{YsdzWwSgok`SZ_n0Up3h+u_d$8mEP0;Q>BZk%KhLx& zaIn+8`^^9Sne5x!)5Ut8-LCX&Kk`)6SF^Fv=k2M-8y@g4>QJb-xGBNAG34F?zfZ-! zDpP!Ke*K!LS?K>&V1n_qlRNtEDn0&dw)V&8Xa6TP@VU&~qZWK>GlmFjxBaB(|xYMk!AKaca(E+68Z8}2V4q}RaR$9QG0%e}9C z*4FtKC;#3%@4_@*jyaicVq|JMFWEm?X}bBvE&UH)_nr8exaESy^26H;a@eMn&Xza7 zD&LhF{QQhZ*PJ;bo*}&UEj5)p7p>i_6mDp-$@zcRP8sclv(I(;OQz4hZ@bnv`pN!d z|2s{e9KT!=7&ANM`w^Y3Lhq)uM5!GGAD9Cgu-LD{wB6WFE||~t_cvi7>+??<9kf~g zC2}TwubE?>`7g;pz+Bf~f8BKRFxjZhZayw29nafrmsoS@ZT`Cx>$4_afAg>ZE0@!x zxKE$D+A_Y*a$U`xE%ns2_4Q=XQ2M8wDle~Z>VL}0Lu-?heFFGP2j^$Mb@;NXb^hOgWjl&?ZBbhmz&qH{qNKF{B18i z4<9X)O!YWiU-$9u#_p_}N2l@gZ9kB5G}<`vk6?kqzxr?ISoKyd`un(9@4Ksb@MRIN zPfZmkxtCS?iv$aaPIhsw5kA3v@4}Rdsb00bf1aDVdcO)aeBW6<`G|;U{)#88qN2PS zhNj=niiStt{a<|UjUM|ARuvzy`p@-S-O6*YJwqmT&6}KmL4T`% zzx*nm7r(po`vpywA|;+ljsX z*Ysw8x%h&0GIPepmKcWjN4?!OW}I#B4!Sv^701O zItGC{@1%AbelZpQxoYNq|DFy>Spj9SUHKjdB9S}&v83E@6fwqp7(i<1hc_T^tm+J8^#<}Sa$)lvJe7DU`? zec>$Lx-l%cXJxtlukE*`jpVAhZy(NazvSMs{lAjd#((|g+7CbcQZAeS?rl!FTI@eF z&lN8}yG@SF<@(~@x-6yb$F_aDpZ@u?r2Ash?TNCpdDp53bN{Omb)2p@mB-z__!?ug z)ZH6(Pw)TM`>@O|clHnK)241*y7jwN->hDo!nG!$IVEVvhBr^IZ!ZmGm*4eN{T$Qg zEr0hno}IIL6Zdg`gJ&Xxh= z&Qb05X>wcFOTRdW8RDm&6uqo!zj&y|_0k--H)}lNg9M%Ltzc}6O8KY9xVU)X!X?Yv z8=p;|C$_cM>6|>*!#xw+oQ2~bNE)U!1#UgY!aZeaKG)aYQ?aELJ9kK~aS*+mlE*7+ zaa&EV((j8EZZ3P35DH+b+KS zdi*B0`30N0MJKD1l>eNrT(s-|jbrydU20VRyZ*`^fh#WGG~UO_6>kuKtef@yMcMsS zakhQeEmy>eUj1t`GmzP9(nSud`BN_aIJ8Y_cewqj#l=6&%&L@KB^S5;T8 z^Efsi(0Q`!|BjTl-TY@}Z7KV@;aHI36KIxta8xm1k#?wN;E5+(wZXzsXhYeb2YlASqFQ?*lJlPH4Pj;;oAMB+oGOMaJ}H+>5ii zGgs`aG*UC`vwQsP#r`uHEKa#|@A1C0y8V4W`*GKj$Lv;J7niSJr8W7s^zZbz&}SK2 zV($0-zxw3PuU{wf@5cx4y|ZNHN{$wl)X>!z{vS~beey^>qjhdprT>fB;eBD#`Yuh? zh*C&=v!4CQ#L0=fwz6(q_#|jj&zcE-o|iYJ<}Q(6c44(a)Qa^>Hh)z+@XXtzIP{6x z&umk3{(t84b{^$%Vo`E!u>s%SaiH5(;s1aAeG!k3WjHQq61;F{_s7G>e(ahzd7t#{ zb4xOfru&Pr|Er7HUVdUp#Lv)-qR{*CzfZ4>+xvBIT%Fe1ZKg82EKhUSYjuT$Of0Qi z8O1Ifzv)tGpw!Ieo0cVUu0AjG=WhMI`lzYjOkIv{lDh`FIvND)a zt|(CmNMqt~I@QC+3yoLUy(6cb7#uw!S1jZOdmd(ZgTqWt1rAMPD-#y5BS0pD85*GL zrBfHSnJK{UPysVi)fyC*oOy9UfW-l3GKjH2heZIp;~UnT(bdj5JZH`vu54)@W{Ba^ zjPCBoH<`LcyyAbti6;{;-g(XdXJZGR~1H_odQ(g>?9;tI9d$>_Nqou*fq9|ID zlpu!Un2<0g4kxYGXOd!2?Q{g$xj>kCGbkM3VX|P8kb^)_WV+a6R6DsqcCyZun8At? zZBwT*G)*{VwOIoB$~Xp&kN}XKFOD40LG}I`mXxWb2|bxc!F?+8_EkKWE3P=Yv-bJA zv#(BRzfUmSv`IK%+43cJ6+4qR@A6sfV_Eq0soC3Cw>-8;>Q1@hy=m5$DZ>15d6(BX zRD1s2eCD2?|K%%XE49}j`M+qss@)6tP2)e(IYTZ@74Uub>7gten_rxO?B?QhpOO$4 zhyCvs-k<*`{pKR`&k6;}#SeZoM5s!x-uLO_kBidhIdA?+*sTe2*7?y*zL4?KtJW^abl_6Y-3Ye=JuX<-GI0b!z!p^^!`j zs#Bi=?GBy!Cbh3-zQI>XcC-4ee4wiA#`SW4 zT7UIvtogA`CVYIBk{^HT-CK5R_R4l)<07*>dsT}CvwCtjo?P=V+pMyFSz69~8@r~T zezWY(-d9w%%Q@wCk@xJJ+qD@be@yQiPG;KsTJ4w{&%EjhH7BdhCoN`bcRQkHz1w{2 z>M7jbtd_H`&vlz~cEiWbZ~v(KetJJ^qJ;1ZX^F|V6K{PnT)+9sj1A{C@@hUj-+0A& z%Y+5~)69G(n{B>-;l`2K$;!t~o;`Qw65Cd}HOlYUG27=Y%R4SD{W0UpoLl)8r`KlM zsv4T9Eq%CU=H)%F({kp>Zuq^dE%Q?Pw&%l+}K#VEGS3Wrr3VzygjqE zUoG&?^YS}(H|Ffw=FiNFlS1DzE%%>)#mS)Pg_`57ACI3KCA|9dwD{Q>8Fzkjq=IP% zcjKuSrqP${W?b2$Wc(rP_d6Y{Uq;;D({i4l4_Di=y7cc4Lr1Nj8Et7BypOGPIkv2{ zJeA)sc;@dJGoH$CTjb+icG3LRk@c_mSHF$lHgV%i>F+!RiW!Hi_Q+Y499;A{IgGnb zy?FNa$Gh`NwUvFO=KNf~?sC{!`8z!u|MBye_3wMWKmBV*;?Af`0 z*4um*c{DCp`kRdG-WvB?e-5rUVE?uM(93H_ zKZksIw}GF{WHNun_Pci`Jnh@2Q@s7+@%7Q#2a~wcKOM1%JoA_dQKpH`b5Q*<`}4bt zt5dhXa&`N5eCp~aiu>ZuZ*ATG_}h)ir&i{vo2OOy&6=_`;h?^`>9%xXiO=ueBpp5? zYm&b$|HSimqT9_i(@tL9u;-1AR^+e96a6~o*U$M)o#V6p__}}Ry^hM%9#>>qd7{6n zczgKgv#+oADG4Y>zGC99JHB3I|FITdu}|~vIk70ICAXHc`xM>Zk?{9t$G)|7_C6P1 zZux#IK*Pa$`yAV9u7zx>?XPS;hx6H5-m^<$aXQ*nR=X#%#OohZhlbA19aX$sYx~Czb48+aqT7?MrdW%8$?UmdoCCd@XZVv*zm3Kdu)0tQ75J zuJT^}vgb;9+V?M)ChebA6MFbqs>7$o9hH}lRb2a*oa__gu>V}~_taSxe^MqrJArhY z;Z1=REsh>*za7%NJ3~J#)ho?$?l#SwYQE1hmtxL6@wF;Xl}waxPc?|&9<_BAZ;|&L zSv%{AKfmT^Wd>SgzYdtp*YJgJ-YV~XzW;YTeemea-(!ak?J$pLYFsEN{Or&1$s2Ec zjE{M6{HmmJP{iuL5#`%HuGW91?@>Dcn*a7)Ni{b_z8#VCxc++A%pH2oSGQhbUH84B z;`EGHmp+DUto-%Pb>aPG<LuuD3>Ly|FG6m{LwVW2Dle9P zc5`p1MBtPCC(g|e(kg!W`1!FSHGaOk(j0sQRRu%?|@FZ(8Q++J3Yz;eEYk4TjrGQ#c~-l);2dg>D`?CfBTfI5Us@c-Wb01@AC`S@bu=tD}FEj zY=6c1mcFC!j$PspT^n?9S66S$Ip>Fel9onkY}Jfd6S(?{)XX!-mN{6;+1r}^VP%B2 zyA0Bqrdo3tKA+k6R&>^Zw|DQay}RAm%7^`no6>m%-H zEp^7P^6l4;&P)Co{YmS&fuR=EKn6yE3Nw}sLZ5PWIB6rag4+HKoJ#h zj#nuzmu*IINaJ&N2FDYhll$jE41hNF9<-`7C_HJMQ^q5ONGlEuEc4_+VbX6~g=&cS zB!;F5;zhR%GZ3)@il91>AML-rkVG*g&Vz}=Degq(@dc=M{uFc&`1I$-;&fC)6gd?* zDrx5MhBcr1q9)HQQu+AhsP*?5hqceWwJy&M3;);87q-~Pa$?rYC)dt+E(}baXF2<< z&e4CLKSg}C>YcSiL(A}Yy-3N)xtUYUFaO`6zPYqwXXP(OQ^>~VgSXgbEBcph^^wOrEhi`H2tXEs<_wAM4te^V7Go7qMPknmVXvn&| z^vnF61y1+VSh)+s|FP)haPfC^U4LCVd#B;9_1!9d0ctez#mS$ukH#dNX$)Muqwedq3+FZq z|NXA&f5BDM>f)lO+xPR!?otS>@p;+#b&i~QI>X8xAMSo=$oQ!EjJI~Ws=sK@8Jis$ z4^o`>pEEXJ_xAOoe!r4f1^wcjj;ga=V?c zvD90%{Ib1?qS5JHS0-=W@h36UHS+z59UsnZy&`pXuf1Mgw2+*zU_tlMvoC-9-~7za zyF00LvFCj+!H&(}x41t3eWK3$kBx%Tqs95R|C%hEcFyN%`QzikCmudK5WdoAu_jaD zmzZyNuPo!M&zt@GV$;pdd+$fyJ=J#C@8w;Vi2|HUBT;IC8fB>Yj;P-_M=((Ax6R;;C=z zq?XE0%uD!zG=w2K(?Qinc#+?2v8iY7sIOgG%J#1=LakiN=J{)f^li2|H$OU`uKw8) zAJ93u$XfHt^6Pi*zI@aR>!V%RT`+$p`{c6zB5@(k_ukJh9jg8W?V@S7rmgZ_xY%sz zlDBa#PZtM$X%RA6K_* z`Ec^eK|ij_yJ@w~>N_{jX*U0Ix#Z#R4KG5{(_ej^cw_Uccm6#;&&|Bmw?tI$FZ(|4 z&$HFvweKo_{H3!yE8M?)Wvfxp%~heshPDBX-5zhJLL2KW4 zOG)WpU$VB(vs7;LtHXJ{PtCf@nw7(Jkpk5i{7O6r- zZMy>=&&|J2)cT&8ZT+b>eCsV&9r16zOKa;(UwC!yxLD--PWD(_vSzXS*&8$FJbZDj z^wO4&eI@6dOJCb0uS{fq?8@5r?jQI5ITw7+)!EKv{X<=c$&mt?T6N z)lR6$pS{3ScG6<%i5pwqt$TAYQ>$2Bc=MmbVN)_s>iu$?`y=#k;?}>X&5X=yAJ1dd zW66!^zn&@nAJqMe=2mREy+`(bsdmwy8CqUmMSri&o5T_rug27MOt$*fqQI{QU4_%t zFA3dTam=J~)|Z+40{i}*W;0*+b#9mCi>a5LM0L$-uCK2)v0rd;^>TyTZA(s0*2$6Z zy1M(nevje#mCW2n_v*Y~XjmAwAZBi%tHn3Ly$w67{byatecyDWqha3n>vAt9YpJg3HIA z-94>(e{I#oiGK^9YUzgW!Po11am6j&>Or+*z~8jrZF}0o@7!B5LpA*Hr%jtzq`XX5 zwBK|m#@ag6Xm4;jxZCI2t^D|uP$S2|puCF-o!`5&ErkN^+gO&r$*?;A@R@!7Ljx{R z6ZYpdBIo~n=V-rp^_r9arG$WYo6Fqgzs|3ocDCc5MP1-?TVbnfTIXiWZdY!(krvTd zuyh9->noF;-&?A`d$LdCU(Ap(BVBvG-Q??U_ghsQSrBSy8<*>Pd-n?ouj6ifiHE01H~5SzHxb^JdYe3qDKc+n$`UXP0jFt;_uz zn@?(2npM@lCT3j#xP-Eu|xsQt(o~-NI{$x>C+^XW;&-C=p&c3{~ zxjtdR{`$*Vp)2n#oOPx3DVNutRY81#62X)6d9?zim{QdWj58~r*NHUl@a@03vC7Fj z@vlQ^+QqV{mmPC$YIgLWzc5u&M>#EN{lnt*Da&(y)!p~y4ZgA}`ufV7?Sg`NUlz>y zyY|Pr%ir?V7~ik+?GiT*)y}`sRQ2)8J1rLJDOp>;7bi=4icc|WzdpNLup{Emo?`K1 zMt*UDVXK4Z%RT^ybq(jAR%d;IUq?p2sME#RK;Ha10DW2RZNfB)+3FZ?oRn||fjhOl1} z!T)9nII{iPo_qV+=G)naj%jZ%+dJ!e^^8J;EXN!3PXC(!FW`CC?v-8fYl7z9@fMc6 zac<=rVa?5pkM>S}{`0z^#;dayvrf&iHru^%OZ;=bg};KPO|0q?bGT(1wC9oA{8B&L z75y8HgZu(2yW9Lf%Gep-KyK?URSgI`zjDj3`R#LjSFbeQTdSPJ{%x1(-_MDc9stZ4udr!qb@qp3vfA{)2Zx_q#y?xnE`ZS+xqz}*Do_F_LzC7vqIVa@VrQ_#y zwF*ByxNzdX^i!wx=j{2q&wu=PT_&;NQQa&hWzp*aOZGkNthK-L^Xk8ge}AV7hvoUJ zUElutKWn+pB_7tNo)7-aySn7v-E&)m`Q^?mo!_}6<@uex$&dFfR(rAgqJ_+x56<5c zgY9$N;`f&(Z@kF(ur$fdG)3}tdeDqhYNeWbCaJID`2)`g+&K89ZLNEaq3`{<57+Oz zvux)4^^c$QPENlz`}@J@tB;@8%{dW~aQphJr+ZH)CEH7Feet=l_Qq7($C_Sca*vlK zn0?xAbF=Bj#l+q)-`cO|8aqW!@AA)9tUbqLtAJebPjyJ;aneY5A-(b9zJKYH7pM0> zzb}@Awe#wkLFXJ|KZdsm!w@u?df9Ck-VVqEGhd-i##da~xVe6q1>RM~#&zMSgB zrEBI~tvz{T|3;>#cb&rfPs&N}P5AVU)hYY_%hhh2_H7nsX}1m^SaIVcqlo=w<~RGl zoaSfUoT~RQdwDwVTv@>f+8)-`$6ff&#U}}OO@Q`e7+4$@ED~O^WdDqHht~z(J6E|N zaT^~WS7qhTOsT0}H`Y1Ze-FI)T~o-LaD*>{JyIdLG$t5dBGPx+iqu?kLscLgDgDe8?{PgnBnLO2E7 z+jLlILECNlk#1uM7B1!>}K@OgvnIRXBuV@{*r=W?DosU|K(2SYH zp}?WpDewxVZ^giJ3N%4dbd)m{%@|cd2Z10V#VgI=PAtemFk^}~Ba7nGF5y#XuJ=-E zP*|ekw1OShv4`|#HNruYW}@m-Q09#oIHtHbgiUJrdG+~|Co|?>+#mrCwgnMPeSLjL zuPqh=a}Uhnh{)I)RlG@j8+uRMk}>DF(Pz$u6q4T_mKoX*rR zCEB3`;0$R-7R6^~$s5GMwn5^6f#u8`h9&{y`3^IX+ItENOwZgH96NTNm3V{Ni#Jwp zP&jf%UEmo?Fg5HHbP!0&GiIws3G4%BI2AYyN1Y7|YKPI#9!(_hlBI!xV>C++ijt(^ z%$c|5ng5avGq*-f7Fq!*$w9+*A2}i-B0@wjcbk{=NU&%LFm`*rT$XJj)#a!qkTwH8 zNfj`WBS1oFa_Ft_jiQ|Fi@ms@b7|RDK?Np!-0Rq4Bx*0-=4(6=m59 zHav0a~ZW>xHe$Gom|)52G8f(xt9ZEq-|bWS&BuM8 z!`8*Jmu7xg^Q)q*>OZH;`3p5GAOnyUek>;v7kr)Y{EFo+)<*HU4yrs(^KPJbGAJT zT>CV3IX#$Z$s?NDuz{IH%c#+7hwN*~hhfYAolzFJRR41J+Q{=Oq=U3K3zb+$bTTel zZU>yqoUN@k^QGd;DtKYhjfxU?jurP<%V)Y>q+R9*eSjTnbe_@KiP za%k#=^v2GTd3ScXEvmdeZ*y`})Ia9aY-Y`3Dqq4fQ$BsV-IJ=kS=c>k<@}o2Zp}j9 zzFjkj{P|VUG4x(!wD!T8YPrRnr{*&*`m{~*7jmV(gyl=!iY+`p7qNt-hrbI7D*UjC z*Yw&R`O22HcWU0m>)tGdq$=q<1B99*05XTh$bH!h!^X79iM^YpDT z8Z@rl+^@Pc%B*5@F7w%irP+M3%lp=>-g{}s<=cDjyy~dlv!q#Lf_dU>7q`m4Zx$YT zoLT-a>CCQY*}S()U%d%)mze+Q*UIAUpEl`nJxhkajO|0Q=z6wlrM`ZnLMA5NuZuJ12u_m;hWCH}M2L;PZC=vt{uzi0bA4w@)Et!$~?+SS2_J7K|eh=R=i)Q_Hxn3F2UVpFVD4PZ0c|2pH-t0-}5{s zeQo3|XB+oL^6MA%uKrZwnC%qy=96)0&VGs8zf6UG2gpYmndQVf_8zgV_;{ybTl(~h z-nj4!HT#dcJIxYt3b8x3`kdPrxmcFPN+nO*9M8WKW^8SIEC+6IJ-8{fz&zvpHs%a= zMgapyhIA*N2F-vqcQywVxX-Prd7)8q*8F~{XqJAi=Z;DGNBN6BRJ$&pup!d;klPkP z=PBN=4;?Cxd2Sl^?WeBQ&z3W@OqFk}?u{tXeDl{b{7bvZr&fu{*9G6L(LHKZn$=>* z^zwzk`WPa(S;O<{w*cu{6g<;mq;Fi+d+`TwU2a zefsf^wnLfIm^w}!uQZmO8NfVy~Zm9 zkIpH2wl=dmSDVbdFLPS%o8Q^j?Jk{uiPF!$t=5mave^InvAcF1DQ~vhM>a2*X*^S{ zG{)&d=C!mEmmSja3ohP1_do9Dwx;io#CIw#>0YtqxOLp!@UQa!d0XSUug(2swqotV z*4G`C_t{DX@^|lfnsnDbhkN&wDeFFEM;6r2P;ijx-spQ)>O@fZ8FAHHEpL9E^5-#) z=$|L6ysLLXMZ(iDzBg`SQuMc!T<>MCeWb*%u6sY1 zAp7mdbK~B9{^ft~(3EKXl}%P6vU58a#KGk=q@U7wN#KB&$H^&^%4_vGEPG#E?wDUT zp;Z2n_7sile@m7&u%DTcbZkrFqzy~{t})|PEA1`({SGtS*814i z_O0Idq~7GwBIeVz3-lJm)-U$Dbws&wL!b?lpmx?a-Wg9-kFZV`YMJkKak<~*zm+UX zB3E*LE!**G((L8y^*(G@xgCgUhKKT9g1z(d?47F^g6a~L zgjd?p8M@6u&rVqi&h+t}w}JQcgXq#5vwYM49NO&>Qj!(4oFORk?y@cMuS}BrC4O$) zrPbf(tKzGX{kiJ3*_#uYW&0BfCt82Jz4y%1-s{{~PGo)i!2M#Oe%6(TvdgW*Cv98% z>s`gCo7^vFdOhsjcX3I#XV;aFw#jkKw?!p5lk@pLr0(9AIP-ems>s-Tr?zf2?mzuw z?H;S0?^sT^q(yRWd-*H-Th&=6TkShlEITESg&(=o#QHR4kFR?C{-4V;E4_ARpX`bC zUcv7w-ESB7cW>3UwebgbH0^!N2QG9VU5^DOEDr*vI=no0^6jJ7m5y&bn)JRIYzcgK ztD>xC`k%G#>%L}*Drs%rV(RhQ*l)eXtIfOiZF2C)~z0InQJ&seC3tzkVKh5%IZiH}?!xK$4=0%7OZ9q%Iy^T6SjZ708UM-*c z$X~>&@~p(|qgv-ToImmD;#%j;(=M2A^2@iIbM@2QUsf^Gg)WCO{xsyAx=Q|zZquh5 zAA6kk8-Dt|(>O+}e&-SoZLJ4-^^Z>WFqpr5zg4^c?TzBU7f+&xZ8 zZQqMlF5WQlWQ()H-4_BLnZoa%zM08$E$9|^aN2*h6$M#;vmSm}5;E)R%B7ooB~~#< zc|8(%I@P&)(&o6lZ)N?{O1<8!lb@*z?H`};H9czJ6!b%f^Lz2?_}~tQ4EMlKa*qW&K5~SpiPxY0@WuRf>HIH3p+V;N z&o5rkU8nY8>7(8&o#H=(7v)wJ>!~gik+{E6G|_vS&diOEmPD;G{(qcn>C&eudtSXc z;Wwr2&kR+U)-J2Bx4%i4e7?O``NzcR_VOOPT_E)vB&j{f1T6#ZyK!^x{cc9L*^FQAL50c{w)<~=k(1SVCS)hE{ZUuY3%A9m zqQni0x=$QZUlBf2%*msB#nmmjW_f!nW47mg+9JEshA(jWza1&lcF3PQ{#{pd&YSG( zEU&*Nikr{%yFR7=yrBMf z%(iP&cTaux>sh|uMFG(`=DSP&t*^V%Tg4lqW9d8Z=lAHKd+!$Or=C)sd_Vq>2v=)R zy;_Xmx1+yXWy+sURDJ(FZc#yyhVj?e8ghyMYLvyxuYLWsWVv2enS|t}w9}I=>lAyZ z{MVi6=hx*^Tijpx{<@<5emCBYvCk%5Y@X)fE8wNy`(AdVQKDL|$|=#jsh^wK&Zhfy ze_xj$w84Gn?F}CDZ4;x7ZoZtVyeCX7;IZJh!1hHSXDnEEBqf;Zw%ech6T1|w*y=Qm zR@A33TE)HJzx4h0i3$6R6pI3!mN@+oJgyex@-(GJ_I;pSw36_RrKOI4uZzy`dG_S? z>cY4w7ctI$g)8wNvO~2vyFZGzk?0tz1&x8g13tm8AX^=ShmD7`EDs2+7*`eJBY{~oLHUy?eWAu-`?q>AYF1~W&NoiNj=T$fQN|_hNarG{_5q30u+9|WG77RfuWicr= zN53yvtt^pHXPt&bZorzL$R9u z7lMCE_)oj>C)WE^g3T;wG63ycNL6ci8}Za?_p$BjQ?tbb*q9Ji00UE+AA_TZrSAea z8`-&kS3Hn>f9RC_U2(5@hs!n|YI}fO&@iyflV+U5sj2=&%GBP{;W=B^MGcNjiMe_Q z9yTRuEaZY#fBz(zEQCLuFL2XW2$;gqG+~iX0KDJ+!AZbD;FFV&Fl`r& zwAJ*}L96Mlw@aXoMTdYE?r1&PazF#AX~ih8Vh?CD!M&YFPawy+!vZJJ3Vy}qtZpcS z!VXVCAIl?fhcGV5tpT|0n7^!!?g4nSrn(1=NY1obFY{Hvhze{V<2)cDg;z= zp3r)K;Z$x))Y@%#N*phKR!&Gv3_Nwt@bOZXuSs1~|2b9}{!F+6)f6Db#NpJn*yY>` zx5Yp2|Nr;>!$W6_Wk)Bjx>5SXG%7kee0^N3+GNr9j!DO~zxmjuzxMjCV4LoI(H5L! z7&t;Im^hq#`~<(dhiXlATDW2JW@XDF#|n)@#z%K=R{J_@g~D0YSNgp@oL}F(-(tEn zI4Vx+@6w4AUrl-TKkfFNJ9nzTzdQN#Q_>@WS4~NNXLg8G8~(g>#v?Pur}Sg_tyz~e zb@hAyIT`uSv#I>>z_F8m(iZV2@OE5}(1psYZm-X5nGmLX>S$4s#R>VXTeoiAzFoih zkkdQv{i?RhPWhI8-12GJ7n|IjE9-ox&c5^?!mGSkr^%>k+a43ZV{32C&A6mJ}n4;?c7lJ1y><)>JtXf8^5CQ=SJt#D!^vNzJ@; z!hWsXO26QrmtN@f_Jr)$tPFm7X`BCS{a(MtMsDfBw{{!cKPI-XCu_3VlA6qvCB8l< zXKPL0R(q=^vt*i^+pYBo4d*VM@c3=2n!hUM*0mSTN}>+%47>o8V7eYFS1obsadevU z{2ph%!dEAr%3!0IhIrqd7D1Bt<{mVPOV!X>bzI?ODo@$0SEm+Go8}msIVL{NrWBCcVVyQqfAk%zIOM7RJw;SQf6~&opI4{JLuiom<2+=W$=2 z`dV|!!|lu54rX(kYA%)2OA|1=k-18Ll1Yim+2Dl>a~BpJUaL7*f79Qf87y3|fO3E| zXJ*bg_|PEb1&eWIT8ZwJ8RD0wp7Pz9acNsny(p5>_BKUIOhZ zlTj^-*C^zir&;11+O&Gs^x}6{p4xbOcj`qyKjxcl`C?nh%q;DR<};`6I<(|@CNo2G zT(FtPSLqf_<+t9qzMY#I9R5CP*RJg$67ytxKjnN}$hTtEqa`j(Y?2`RbC=q#+O%HA(`r`b z=Xuu_=1n%gRa$d+<*E+{GA`A7hF#CQx~1C%wb1f+PWr}3Z zgjdterhGfv%InJ``Sk1N>3NdNW<^C`%f7U!FJ{#;2Kklen4Fg7x9DBjYHhMM`BdAY zZ`{6eSMu(ENoCd!&h;&y9j|;f|5V*N`~AE{&=Qw{$=~z90}s2@-QsR@sufLQR$42S z2DhA5f0Z5YGjmd8i|2(V-NSdYMK6b~3ceM!YW{9(*Y&L_Kh}nDKJ`5rV41vX?tE7D z?SK9l&v#StT&!_x+WXZDi<;+(_2<|8e0W5;r}FF_nQz}t@A||Zu5ABr$A=H1%=>SP z-0~>atvMy~Ybn!i0v*gsA*H~PxI`0YJ2h0F_{ zKRmgIQ*+8I{nY(?IPK7QA%G3fl8GMB8^s zW8O}=m38;JSMJ-vc8@C@UJ4iqI|u~HSgkyK@UN&d=l-R~+IseGU0WKOZEbB`o&9=x z+-n(=L!FxMSFotZ*VY_v;{R3t`qtLh7dW~7?w(n!_TV?yTXeko5)PYHN3E!h6}q>?lGmSW%6PjV7kxb5CywVa<%&4S~5c;tT8ss-oG zHZ6IPKK|MHyDGl&>GPTLwF;LczMVW2TW<2x zZk^x$C;Zzdtg}&GsX1rrse(l3&V{>NU@1WA?{)GYt6E zujb$Ue)NX&=R@ZW<5@U`7thz9waHriu|2nxS6cb&YxWvCzZL}<{62P%_2B&VKP~eZ z_4)g5Y4|DMT=vKE+2(&Hk7IYY>2~}}I&|TLZn(>Hi|K0J#X|E|74HdxZmahRNt%3_+{%6UNc*z?8#-V2f1JvDb=`^w{$h2z-+WFmTAY17aejSu zgOj+|FLmD+GdKSB`508XT5H<2ZC_Sg&%S7#(V~6&PQ9<|UptG9g^IS%r||SoQ2YJ7 z^B}i>tmVE250;~GH+Cy%=%l@$#>zBp-M#ro<@Ob2d2g_Ic(_T~|L(cPlIJb9r2brI zvNhpVZ*SnCV(&@vK0Q{`emY28KOArF;wLck!e*ID8*hO#HZsez58b$1yxWdb&MkM> z*Z&Ge-wb#g&!`=8oWJ&8Ww*nOEv)W&0{=y`R&rlb`*-<8{slKK-cDy>Ly-puPV*+6 zfcIo|PqS_~Hfa`d$B~PTY}{s#d%zeDA7nU$#HCkCRHj zuc@GN!@X23@6vDMOGWby&R+e`BemV`*U>4dcCqI z(w5eqK9{et=Br!T73r7Oe@`*bz3#gAg~A=XpLa8#J^UJWna?&>GJ5Ox9LBO~p`Jbb z{{xR*Em_#tuD2*YW`gY1yUKATy=ld%8|%*TU)uJg<&5v93~3pmHxCQa zTz`C+vDwRYZq}(aJAQC)uZ++99TppQEi2Hv_|*x2;dkbIoZQkEui0tlz5B6sC7X4t z<>mb%&+kg*X&(MMV;7gMxAEie@8TA3UC$Vs-Qj#r`10f9(`xPi*8N@{SK{InA#JrO z@9NI$OFyR;em~L@`2Xho-&!+eA6-di2OhnxBK4J8zklux;s$Um=QjPI&I0BeK2f@5@<=mzS|tZ1}s{ z{;$R_i%ezipH~^ya^3A_uK)Dp`(w`O64~MY=eX>jr%avIHm&qo(VZm|<&VdPmE^?6 zJ1hG}{hi->^5DXSaqDvacYT;RS!~}Gb(NA9_h(D*PCitxU@iBj@>7t|QP)?xm)rF3 z*6wBRWc$9OJnj3H#M7I5Mf6TDQ{?n*QTP`3s_LQOE**Xj&ac^J`QN)fES&iJ<^1!_ z_CfmZ`+t@!ocCegixn2L97 zFQ&4dx&P99zUMDd>Uvqse)?+q{zQ?&S+-4U=EU zw7K4na%ZcVRQcO(^}p=Er`i4g?Oe7T(#}bpasBlz_LYh0GmdY0I{(XR|1z`sk~ht& zndMv8|7!nx`&Z1NZTo@`*=2lEF@Jhl$*r#5M0-)S?cp1m#g+flRI?xdE_-`iY%6n( z$ow_;3X>~dhrd+VmiJ?`-T9nza+9*B@3nu)Gt*#AHuKsr9ygcj7fzF&IA5Oni7%|Y zZ%w4wzJHspZ^>U)xznz4((DZ-iori};>5Lj3O(-ss$&kT-Fn}C*?j)!y@|(PF1WTg zMaMd^blRcxq~w_!9$a4ef5G>?Q3m?!*{&{IdPTrV>KuVh@t4$*9{eG*YKg|-U( zzq=(nZu*?SW`n1hC0APf7TYYc_j5L1D;wLM_p|2j!l1}ysfO3}r@L-l?bU=j9hi2+`Ty?91m|q-?(On#>(d|aW#5t_xI1*^ho4GnTewRvE-#(??qA@N9?9xO zKT;+ND!mOpT?8B_B?~vS0&8dcT?tR z*4HIo`|V02zOUeYt@rn}Z+NzB#KyI@!S8;)*{qZOmRVZ5`*ZcT;2jT4mb^aAU)OoT z-bv-y{LfpD*Uff%y!?uqO5VlarjolQcK2D$-)MJjb6jY*-1<4SY#20S`f+CFTX(-F+&4eHV)F}m z@$DOyyPw$owC2D6HXSRuCxMeM+Fv--vNcNimPtyZ&-VpE!cH!SABM2*Ml5tZ)d}h* zIZXN-xahy)FAbgPS9W}pxwLQDQRRcFp4OZGl`J#*?f1?$m20m?nOBcw{f9ce&6_vx z@N3GP{%=QaX`f;Lxph}FUN)GRyuH-j>3CxP_B!Rp_0L<5WfvE}eN%Lvuj?c4 zr~BFNy1poNn!5k0Tb3N_=7v@OKc??CC4SG*RTqzmu5Z|Y35p`DIHZ)%$%5rd;JeSsE5=zUcX>r?-8CS}w3H$-O_>uuJ~>(Ro+0>g_$N zzP-0JeYUvF)T7s+hV}Q~T?SUSHaxy{GP}TG!tvK-{#WieURk^Jg2&3;t3q2_o6d+n zeAu)lTb@6>$wB{LF^jJHf8)HAbq=TA@$B5*^=ALPD|O{LuXVlacUWu@*FlZ?(raU%%0r`|5MWf{N)IkK7b_7X5!)^oDa0i}WfAzrEeR z<<_ey<|ZeD)6!Sx&Uqar#4>CBE&q8>&QEV`-TRvTclmdV(v;78F01>!6}w7hZ^$kCJA1P0--+A))!yy2 zoSB<=TjzqmVd{BZ)8zh)Q3HTJWYW<64>_%P*2V$i>!XYapl zx#WEE-qzmu{|$n*(JS?iN!5zzzT!$!Zu+%%$<;|=h33=q+jof_@;Lfg^=-82ga0ft zajTqHCqLSLv_*|&TO@z@wye4F(@Vcbe}8d#_4zN6`TIgbqql5W))RPrijI!l^Sg;% ziic<4yp**>Kw#JY*Jros?ESKO)8r2=TrEfU$r-ahbGRzjwdhtB$7&lUCA;M+DjNjS zV-76k_o!HVLst*p*-KSyP*}3%$`U<}@2)$to$S0q1KYF1?{EC)`*IuCQic9PImg-M z^W|@Z7ep9u&b8kAS4&sO;M$VZYVOL(R$l-lkP9Zop*Wd zQs=*BDI0&u{;v4KQ@Q>6`OVYrsPcPPH0xJIHTfmZUD_~l(Y)!cLAAT;{~gHdvKG3{Py2oS z?XU0R_Ia}|UcS^6by2eHIU8?Fe_o*Ub@O`{R=s_1d%^6B#F_}Hc@wIRe|y!xWyY18 zH@!~B&7CH3|G&qff6nc7clO$4e*bm;-mFcvW%4_Zq@H=db&ci3dGB;BdOPk=~X-mf2gFRnOYQ-?~w%F3yE`?f@dzM58kTu1F>Uu`?j++1?SDAeYv%i@Iv-~$tv-rP?VSa|x z!ed92mt0+T$z}h?F5cXT#r0w)E`pRe_W1X2W^PKq z-&lM5QP`Qg`;+n}uQ=;%UGw8BU%zp+uu%Q2ZLQ*Nd2vcL{~{;3JUztIab9q3PKK@q zN8pK0gR|`hB7rmBt>C`&O}RF}={{>_^=7vJ?7AEid1ktVZ*0{wdRU3r#{KX4pKbOG z3}OkOvjF%&t<{T<@AbS;1$SSe%>nCm|5JXoYnf?h0bo#)avMt$-8;b&-+qS z?~?Z?o4M@+S&W|i-_~CjT#^3&b=WOdH@g)t+AbcwHEGSH-6oTzJeM=G*uH(c(o$Y| z=XLjOHQwIl+1t+6Z0&k5A#ioF_upk}qAOqJ?bqXL+V-2j^sxAs?#}cdQ&&IY$y9Zz zdHL_;5<}g4m*)Mg_&eun+*`M8Teql~etYYz#<$@5LzPNpyQATu#}c`ZAuE7v_uAxTtUSI=50*QzUW6 z<$cOrdK~*hq%+T0Y@NPpe_wx2l55$$^KqLL9H0N`<}JBX5xutduA0bmSud~e*-zZA z&RTQ$_LQDSPQTgmTGee|WzW)aj(1ak{Ud1q$wMiXA1^P8@f{I4(GJh>-GLVxxGu-zOp_=+F5*g{oeQM79>oI4*wx(FopZ< zM97SX0|U!HwnnG*tNynwJ9T49jF?wV%AL0hv{kj9gm3)UIc=Yf%e{pU9Bmg`xae%j zzTxGlzhh?YS91^+XDpNrX5l@{-k@Z;Uz$hH}cR-#9a*guiV-udZfv**wC`{(_C z$UV2{o&2TUc|z;5wD+91`~3Oe=j-ca|0e$X!0IWY|7VtFU0e6YHMY`a@9e*}r%rYh zQm+4zq$OFoewBdi$CQuPcixzv`PyDq`{ZKAphe=hb*uRnZAd?T?{v+NvMu-B=3B@g z^y^L7a86WIcX{-|8r{j!T>6ji^ZeSvo}9hx%-&B2*1i5<_vXu=hsD?C?yvfKWS;8b z^!5LLuA4S3O5tIwYwPTsP4WnpfV zf?%wF-sUe_Uo^gXw|SoKes*-HcIB~`Jil(s*SR?!dh~!_EZ4SX>I?N;ZdsYKnH&4< zU#QuO_;`)=7#@`|$^gM3WEBw5*bxP=bzSyNHk)6NS+dsI*xh=r2esQYl-Tzl- z#m3p@ecZNW^YL=mAN4C$IJ1){@2md4SL+ZLo2ujK|2;lo+=ZL!etZx(zjduEjVH!itwu6Mp@q{bHq zL5{Ps?6)$b>rV|=%d;swT$=7iC99vi9BkG|3_ktq z*Tticm*?75JbQJu*wei)aHaFt>1)@?$C|u*?91*a&GmF!=-1QgpVrmY&M5l(;-q$e z{GN)E&(j;ZC(n3&BX9jBukHoL_ALVMwwzfu?dsR$?qj}BV`Y4Wc5e{AcUt1i<(aB8 zmRGm5EK`#+j%$SJAjlZ+?(oemn!;7xox|VTZ%I*Ht zU;G_0rQbi-ub*e0x_Cv>f#dPK1skh!J{~*u{{QFsng8d>*G<{@sh-Mw|&FWlQ# zdgW99^1fgDX9{aXEr|7(RsLtaZQg?|+@2vm(^oyY79F;9ePHC*|4C2p&b++z6#Krs zxpjBqEJ793ZoB=pm;dp3c_H`lcgueNs{Os~-rnD5_Vk;V-8NeE`Na2RyZZ+DVYjAR zhw=YNdODx=>kpGH4-~Udisc}<8SA%nw>xIT>rO_`-(DQ(`g&!c@h^+X&;On{QFC(DHW`si z<-d3E7CV_wsF`f%Y;$hC|BVg0SKrHWU4ByK_A5{0oaBZN?71O74jnb#HnHMbT%Ej4@Ah5q<6Cfn>v&`3{0UKBvd#bAKb}|mvSs3j2|LTO z%2IDGndr20(boz3>HHfib!q~mc3j{2>}S82{`L6Y2-p5c$`5z29bLXlg=NVjkDX@D zC0ZHct6%iz@^YQm46U!f_~!mH|9G3^ri#;5J%9IqpSAB(#l<)Gm;3+MN?NqApdh%i zY}bXBMKh=G_K!2VsFaeJQ{kaARU?Z3f6=z}dpER1EQr4swtB6Z%N4b^Nddyv%$|B} z@N{=zv%-Sgr5|)c?DgmJ%X2-~{+Fh-yffyBw0Yi@wb9#MLbq(3_igv&83)~$N6++G zR=&4o?)QHAd*LfhuYLO>%zY^ON&Eh}5&PeV>F;-3-)VPqEpy=e`m&O1%XITCyWG82 z+3c+UuV^~`^ivg|S)PjKo$F#Oe?AIv{poaSshc=5xYD<1b`r+&VdX>mnXRcpDBv*O(#B}1<*HiuSMaKYrCkFbR&Hx4fwPIR8~CCC$y-*Jr(0cj~Q6|H94p=KppMnEk5F@uDE} zR4?D?e{bKm-u=gxc#r$#le7!E=P!JHc6Rpqz2BsIXJzf2@z87Ql7&-@{nmOgzg)N^ z>|Wrcqeio5nTpnQHmv%=@bj}nrId1{$6AkhT%YBh+&qzc;$O8T|C&{u@9()vr7&z& zO`KFSY4*<2*gej_8TUqC6Y2?>JNJdDUip(vOY3?ou3tK-^fbo)eN)xKXib4U=H7`b z&;R@`dH?zD`F0h1yS!FTIw|_6amm+>yvo1+-*`Uz{omNDS*Eo`UV7UVgFQPh?4IGl znYrxV$~j+x+nSepotkh{MPX~#txsxG79KgfO#A6d%k_)emh^J1w0x==I8R8Puk`x| z#oT{MW<{18m%4;r*^r@_?{t>cc%IF!^7oCcYn$hWioWXRTFJ@zp-ywLvd%eMr@g#=+^H3!S3ji)tkBxLQT*H6%Vlbg>7h5{v#;sIZGL=Y$H&^Y|15;Q zevP}Pa^Y;?jkB&&8Xy1bOo~4LHGp&Fqhk`g9*2fRxVrgCMQT{Ihj^$4C2DP4k)&F4 z-ed8?{=|vG>5;A-(>>HZi&U+CuDbT5>e73SXHPk$TH2C?zI070S;`dWS1DKeA$nI3 z=hjJTT2DH;D%)mFHY?()Kh>@3F#f$?=F=P57YiTqt9Wv?AA7%X z{}q1Ep0tCfyu8gO|Gjd@VN#yvMcr85EKg(qD-%|&dLge^c-Ch|@Vp&zrzZ29ysZ25 z3Q#I^Ki;dv%)7+KXlb%cN3Yr(~8Xo5tu7Wy2V`TNNX~G=EeSy)*=2CUp;9mN!+{^V`p=VEd!Bf`IOY3v5}WFt0IP3{KE<@n`k-~{!;#XUd9Rfcimi%+Q0SHBXHl)iA*FfQ+_dnoZ z=Qoe8G}(4`hKu0)pIf79|31#&U;p*FeEt8gukHWWeS7evJ-+VW%ia0c_B(f+R@MnR zT77CJ-{QIFo~8OSUYvhSp!a;9OnvpIzbBi&&R-oRAGf3{r+oe#o1MQ?U5t)ab6WJYv$+Aio-v~KC;H`2EqgN2z|8se-OESAH18?})xO!A^(Z?jD=qL?&r_M# z`s;OXH~;w1$$#cZ^$C{1IlT`YeXMjQ_iTL}Y|<}h%k}d}T$}5p6Z`jz>c5|QD|z#Y z%bmxSYYQ}b&DzA*TUdLTPFv1%+R*U(iJA4$lae3B6>1&Yc2B8&YVRCltK^oK2Dg&` zKHZwSTWz1(vNMsFGbUPL7vZb5VNM zlf!3EIQqLR(=C1F|NHdkSC4C1h5k0rvHZE9euAa^wIkP$JZVW)*7LDG_d;j;yh4j< z#cTHaL~mpN_;AvZMH3IR8U8e2uklLG-galE)X#$Fy-J^ok__)_a0ca0xV6-w^1jWC z&W%fhHT}0-PV}2({M^k>bmDaB`V^0H$vfKV=Xzxf1mlG#3s39aQE>mUe*SXb1_nkZ z7LF?%8cxfmB)u2fec*@U$B=+Ry|<;0Y=50v>o2$|Z`s?Bl)mc^t|ao?XZ@*Esx05p zf6)EY+1!sedY2uSue@}rCsyvSpg{Mg<)Zz6POb{lIcr;=mz8wm>vFbvkvhLl^MB

      RmSB|IxYg=Dn+#aLO@DSiu40$JtE#gg0ewde?c@cZ$Hr?OyZkYNg`2 zcNRZCC;m~tYX1KfrgQ(U(2c6>-;L`w`g&(=Nmj`nzZ{Mu*R}HQ@B91V;o;fl`EIO2>w71Zwu|0BwaAz|#LmMq zu9>0nC%1;vv;A&vH&!<&rIe&TZeR1!OZsw#OH7sg-UFSHTu1o#B*%Q5cd9?*NcL-w z>#uWUL}f!L&w8GaMOaLMpw?U)TpPFI9?7jEn9c7WADq1Il|ro5#e&; z>oxp-*o1Wjuy%OFc`aawCY#TV;3Cx&#;9LHSb9pn^TtKk|HnYJ& zpQ&p?T-YTWaA5#esN>=wxM@PGkq_8BaE$Kd&~U1X^!yBoUyx3)HBMru3^<_)iiP8g z(gKc`sj6q2!KQ$O4>+-iC~`+?9999F0@8P(+o9dHqyEXl>Ft*xb{>#p&5`)lp>5h2 z%OoqNxcX|=^)++VAsW{0Zs0v!TF-Rm{{p63F~xuRPZ#h{oefTAjXSxIgdNOFeAk^) z6U!|#ckbL$%Y*;V#qT}0?zF10CfMx-tV|y@bwp2yTI^bgg6ImmMK%$1SwTRkP%=$3x|ntK#R%ZDIL@ZCcFG;nP#1FdnycP zZwY85VQ2c^FIEnohgm?aCb*`eXU zB~}qd?|8?@2z46_8u_{f;(g+87-#H&2g7xr1M-u0rE%x&f(x0Wr4?^L7yBn*?~8~7`*p8< zd^GFU8CDT+p`{Fs1_6Z&vmM%9PrQ7YnZG*44&sahax8uQ{of~qdNHw-am)N!cIWvUg5C3a^ XeWuEt+y@yL7#KWV{an^LB{Ts5uRs~- diff --git a/doc/integration/twitter_app_details.png b/doc/integration/twitter_app_details.png deleted file mode 100644 index b95e8af8a74eb7e7a9455d7ef9fafdf339a9627f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121621 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"gitlabhq/yaml_db", "id"=>"master"} - - ... [CUT OUT] - - amespaces"."created_at" DESC, "namespaces"."id" DESC LIMIT 1 [["id", 26]] - CACHE (0.0ms) SELECT "members".* FROM "members" WHERE "members"."source_type" = 'Project' AND "members"."type" IN ('ProjectMember') AND "members"."source_id" = $1 AND "members"."source_type" = $2 AND "members"."user_id" = 1 ORDER BY "members"."created_at" DESC, "members"."id" DESC LIMIT 1 [["source_id", 18], ["source_type", "Project"]] - CACHE (0.0ms) SELECT "members".* FROM "members" WHERE "members"."source_type" = 'Project' AND "members". -  (1.4ms) SELECT COUNT(*) FROM "merge_requests" WHERE "merge_requests"."target_project_id" = $1 AND ("merge_requests"."state" IN ('opened','reopened')) [["target_project_id", 18]] - Rendered layouts/nav/_project.html.haml (28.0ms) - Rendered layouts/_collapse_button.html.haml (0.2ms) - Rendered layouts/_flash.html.haml (0.1ms) - Rendered layouts/_page.html.haml (32.9ms) -Completed 200 OK in 166ms (Views: 117.4ms | ActiveRecord: 27.2ms) -``` -In this example we can see that server processed HTTP request with url `/gitlabhq/yaml_db/tree/master` from IP 168.111.56.1 at 2015-02-12 19:34:53 +0200. Also we can see that request was processed by Projects::TreeController. - -#### application.log -This file lives in `/var/log/gitlab/gitlab-rails/application.log` for omnibus package or in `/home/git/gitlab/logs/application.log` for installations from the source. - -This log file helps you discover events happening in your instance such as user creation, project removing and so on. - -``` -October 06, 2014 11:56: User "Administrator" (admin@example.com) was created -October 06, 2014 11:56: Documentcloud created a new project "Documentcloud / Underscore" -October 06, 2014 11:56: Gitlab Org created a new project "Gitlab Org / Gitlab Ce" -October 07, 2014 11:25: User "Claudie Hodkiewicz" (nasir_stehr@olson.co.uk) was removed -October 07, 2014 11:25: Project "project133" was removed -``` -#### githost.log -This file lives in `/var/log/gitlab/gitlab-rails/githost.log` for omnibus package or in `/home/git/gitlab/logs/githost.log` for installations from the source. - -The GitLab has to interact with git repositories but in some rare cases something can go wrong and in this case you will know what exactly happened. This log file contains all failed requests from GitLab to git repository. In majority of cases this file will be useful for developers only. -``` -December 03, 2014 13:20 -> ERROR -> Command failed [1]: /usr/bin/git --git-dir=/Users/vsizov/gitlab-development-kit/gitlab/tmp/tests/gitlab-satellites/group184/gitlabhq/.git --work-tree=/Users/vsizov/gitlab-development-kit/gitlab/tmp/tests/gitlab-satellites/group184/gitlabhq merge --no-ff -mMerge branch 'feature_conflict' into 'feature' source/feature_conflict - -error: failed to push some refs to '/Users/vsizov/gitlab-development-kit/repositories/gitlabhq/gitlab_git.git' -``` - -#### satellites.log -This file lives in `/var/log/gitlab/gitlab-rails/satellites.log` for omnibus package or in `/home/git/gitlab/logs/satellites.log` for installations from the source. - -In some cases GitLab should perform write actions to git repository, for example when it is needed to merge the merge request or edit a file with online editor. If something went wrong you can look into this file to find out what exactly happened. -``` -October 07, 2014 11:36: Failed to create satellite for Chesley Weimann III / project1817 -October 07, 2014 11:36: PID: 1872: git clone /Users/vsizov/gitlab-development-kit/gitlab/tmp/tests/repositories/conrad6841/gitlabhq.git /Users/vsizov/gitlab-development-kit/gitlab/tmp/tests/gitlab-satellites/conrad6841/gitlabhq -October 07, 2014 11:36: PID: 1872: -> fatal: repository '/Users/vsizov/gitlab-development-kit/gitlab/tmp/tests/repositories/conrad6841/gitlabhq.git' does not exist -``` - -#### sidekiq.log -This file lives in `/var/log/gitlab/gitlab-rails/sidekiq.log` for omnibus package or in `/home/git/gitlab/logs/sidekiq.log` for installations from the source. - -GitLab uses background jobs for processing tasks which can take a long time. All information about processing these jobs are writing down to this file. -``` -2014-06-10T07:55:20Z 2037 TID-tm504 ERROR: /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:228:in `read' -2014-06-10T18:18:26Z 14299 TID-55uqo INFO: Booting Sidekiq 3.0.0 with redis options {:url=>"redis://localhost:6379/0", :namespace=>"sidekiq"} -``` - -#### gitlab-shell.log -This file lives in `/var/log/gitlab/gitlab-shell/gitlab-shell.log` for omnibus package or in `/home/git/gitlab-shell/logs/sidekiq.log` for installations from the source. - -gitlab-shell is using by Gitlab for executing git commands and provide ssh access to git repositories. - -``` -I, [2015-02-13T06:17:00.671315 #9291] INFO -- : Adding project root/example.git at . -I, [2015-02-13T06:17:00.679433 #9291] INFO -- : Moving existing hooks directory and simlinking global hooks directory for /var/opt/gitlab/git-data/repositories/root/example.git. -``` - -#### unicorn_stderr.log -This file lives in `/var/log/gitlab/unicorn/unicorn_stderr.log` for omnibus package or in `/home/git/gitlab/logs/unicorn_stderr.log` for installations from the source. - -Unicorn is a high-performance forking Web server which is used for serving GitLab application. You can look at this log, for example, if your application does not respond. This log cantains all information about state of unicorn processes at any given time. - -``` -I, [2015-02-13T06:14:46.680381 #9047] INFO -- : Refreshing Gem list -I, [2015-02-13T06:14:56.931002 #9047] INFO -- : listening on addr=127.0.0.1:8080 fd=12 -I, [2015-02-13T06:14:56.931381 #9047] INFO -- : listening on addr=/var/opt/gitlab/gitlab-rails/sockets/gitlab.socket fd=13 -I, [2015-02-13T06:14:56.936638 #9047] INFO -- : master process ready -I, [2015-02-13T06:14:56.946504 #9092] INFO -- : worker=0 spawned pid=9092 -I, [2015-02-13T06:14:56.946943 #9092] INFO -- : worker=0 ready -I, [2015-02-13T06:14:56.947892 #9094] INFO -- : worker=1 spawned pid=9094 -I, [2015-02-13T06:14:56.948181 #9094] INFO -- : worker=1 ready -W, [2015-02-13T07:16:01.312916 #9094] WARN -- : #: worker (pid: 9094) exceeds memory limit (320626688 bytes > 247066940 bytes) -W, [2015-02-13T07:16:01.313000 #9094] WARN -- : Unicorn::WorkerKiller send SIGQUIT (pid: 9094) alive: 3621 sec (trial 1) -I, [2015-02-13T07:16:01.530733 #9047] INFO -- : reaped # worker=1 -I, [2015-02-13T07:16:01.534501 #13379] INFO -- : worker=1 spawned pid=13379 -I, [2015-02-13T07:16:01.534848 #13379] INFO -- : worker=1 ready -``` diff --git a/doc/markdown/markdown.md b/doc/markdown/markdown.md deleted file mode 100644 index 1d5fd4c8b0d..00000000000 --- a/doc/markdown/markdown.md +++ /dev/null @@ -1,532 +0,0 @@ -# Markdown - -## Table of Contents - -**[GitLab Flavored Markdown](#gitlab-flavored-markdown-gfm)** - -* [Newlines](#newlines) -* [Multiple underscores in words](#multiple-underscores-in-words) -* [URL auto-linking](#url-auto-linking) -* [Code and Syntax Highlighting](#code-and-syntax-highlighting) -* [Emoji](#emoji) -* [Special GitLab references](#special-gitlab-references) -* [Task lists](#task-lists) - -**[Standard Markdown](#standard-markdown)** - -* [Headers](#headers) -* [Emphasis](#emphasis) -* [Lists](#lists) -* [Links](#links) -* [Images](#images) -* [Blockquotes](#blockquotes) -* [Inline HTML](#inline-html) -* [Horizontal Rule](#horizontal-rule) -* [Line Breaks](#line-breaks) -* [Tables](#tables) - -**[References](#references)** - -## GitLab Flavored Markdown (GFM) - -For GitLab we developed something we call "GitLab Flavored Markdown" (GFM). It extends the standard Markdown in a few significant ways to add some useful functionality. - -You can use GFM in - -- commit messages -- comments -- issues -- merge requests -- milestones -- wiki pages - -You can also use other rich text files in GitLab. You might have to install a dependency to do so. Please see the [github-markup gem readme](https://github.com/gitlabhq/markup#markups) for more information. - -## Newlines - -GFM honors the markdown specification in how [paragraphs and line breaks are handled](http://daringfireball.net/projects/markdown/syntax#p). - -A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. -Line-breaks, or softreturns, are rendered if you end a line with two or more spaces - - Roses are red [followed by two or more spaces] - Violets are blue - - Sugar is sweet - -Roses are red -Violets are blue - -Sugar is sweet - -## Multiple underscores in words - -It is not reasonable to italicize just _part_ of a word, especially when you're dealing with code and names that often appear with multiple underscores. Therefore, GFM ignores multiple underscores in words. - - perform_complicated_task - do_this_and_do_that_and_another_thing - -perform_complicated_task -do_this_and_do_that_and_another_thing - -## URL auto-linking - -GFM will autolink standard URLs you copy and paste into your text. So if you want to link to a URL (instead of a textural link), you can simply put the URL in verbatim and it will be turned into a link to that URL. - - http://www.google.com - -http://www.google.com - -## Code and Syntax Highlighting - -Blocks of code are either fenced by lines with three back-ticks ```, or are indented with four spaces. Only the fenced code blocks support syntax highlighting. - -```no-highlight -Inline `code` has `back-ticks around` it. -``` - -Inline `code` has `back-ticks around` it. - -Example: - - ```javascript - var s = "JavaScript syntax highlighting"; - alert(s); - ``` - - ```python - def function(): - #indenting works just fine in the fenced code block - s = "Python syntax highlighting" - print s - ``` - - ```ruby - require 'redcarpet' - markdown = Redcarpet.new("Hello World!") - puts markdown.to_html - ``` - - ``` - No language indicated, so no syntax highlighting. - s = "There is no highlighting for this." - But let's throw in a tag. - ``` - -becomes: - -```javascript -var s = "JavaScript syntax highlighting"; -alert(s); -``` - -```python -def function(): - #indenting works just fine in the fenced code block - s = "Python syntax highlighting" - print s -``` - -```ruby -require 'redcarpet' -markdown = Redcarpet.new("Hello World!") -puts markdown.to_html -``` - -``` -No language indicated, so no syntax highlighting. -s = "There is no highlighting for this." -But let's throw in a tag. -``` - -## Emoji - - Sometimes you want to :monkey: around a bit and add some :star2: to your :speech_balloon:. Well we have a gift for you: - - :zap: You can use emoji anywhere GFM is supported. :v: - - You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People will :heart: you for that. - - If you are new to this, don't be :fearful:. You can easily join the emoji :family:. All you need to do is to look up on the supported codes. - - Consult the [Emoji Cheat Sheet](http://emoji.codes) for a list of all supported emoji codes. :thumbsup: - -Sometimes you want to :monkey: around a bit and add some :star2: to your :speech_balloon:. Well we have a gift for you: - -:zap: You can use emoji anywhere GFM is supported. :v: - -You can use it to point out a :bug: or warn about :speak_no_evil: patches. And if someone improves your really :snail: code, send them some :birthday:. People will :heart: you for that. - -If you are new to this, don't be :fearful:. You can easily join the emoji :family:. All you need to do is to look up on the supported codes. - -Consult the [Emoji Cheat Sheet](http://emoji.codes) for a list of all supported emoji codes. :thumbsup: - -## Special GitLab References - -GFM recognized special references. - -You can easily reference e.g. an issue, a commit, a team member or even the whole team within a project. - -GFM will turn that reference into a link so you can navigate between them easily. - -GFM will recognize the following: - -- @foo : for specific team members or groups -- @all : for the whole team -- #123 : for issues -- !123 : for merge requests -- $123 : for snippets -- 1234567 : for commits -- \[file\](path/to/file) : for file references - -GFM also recognizes references to commits, issues, and merge requests in other projects: - -- namespace/project#123 : for issues -- namespace/project!123 : for merge requests -- namespace/project@1234567 : for commits - -## Task Lists - -You can add task lists to merge request and issue descriptions to keep track of to-do items. To create a task, add an unordered list to the description in an issue or merge request, formatted like so: - -```no-highlight -* [x] Completed task -* [ ] Unfinished task - * [x] Nested task -``` - -Task lists can only be created in descriptions, not in titles or comments. Task item state can be managed by editing the description's Markdown or by clicking the rendered checkboxes. - -# Standard Markdown - -## Headers - -```no-highlight -# H1 -## H2 -### H3 -#### H4 -##### H5 -###### H6 - -Alternatively, for H1 and H2, an underline-ish style: - -Alt-H1 -====== - -Alt-H2 ------- -``` - -# H1 -## H2 -### H3 -#### H4 -##### H5 -###### H6 - -Alternatively, for H1 and H2, an underline-ish style: - -Alt-H1 -====== - -Alt-H2 ------- - -### Header IDs and links - -All markdown rendered headers automatically get IDs, except for comments. - -On hover a link to those IDs becomes visible to make it easier to copy the link to the header to give it to someone else. - -The IDs are generated from the content of the header according to the following rules: - -1. remove the heading hashes `#` and process the rest of the line as it would be processed if it were not a header -2. from the result, remove all HTML tags, but keep their inner content -3. convert all characters to lowercase -4. convert all characters except `[a-z0-9_-]` into hyphens `-` -5. transform multiple adjacent hyphens into a single hyphen -6. remove trailing and heading hyphens - -For example: - -``` -###### ..Ab_c-d. e [anchor](URL) ![alt text](URL).. -``` - -which renders as: - -###### ..Ab_c-d. e [anchor](URL) ![alt text](URL).. - -will first be converted by step 1) into a string like: - -``` -..Ab_c-d. e <a href="URL">anchor</a> <img src="URL" alt="alt text"/>.. -``` - -After removing the tags in step 2) we get: - -``` -..Ab_c-d. e anchor .. -``` - -And applying all the other steps gives the id: - -``` -ab_c-d-e-anchor -``` - -Note in particular how: - -- for markdown anchors `[text](URL)`, only the `text` is used -- markdown images `![alt](URL)` are completely ignored - -## Emphasis - -```no-highlight -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ -``` - -Emphasis, aka italics, with *asterisks* or _underscores_. - -Strong emphasis, aka bold, with **asterisks** or __underscores__. - -Combined emphasis with **asterisks and _underscores_**. - -Strikethrough uses two tildes. ~~Scratch this.~~ - -## Lists - -```no-highlight -1. First ordered list item -2. Another item - * Unordered sub-list. -1. Actual numbers don't matter, just that it's a number - 1. Ordered sub-list -4. And another item. - - Some text that should be aligned with the above item. - -* Unordered list can use asterisks -- Or minuses -+ Or pluses -``` - -1. First ordered list item -2. Another item - * Unordered sub-list. -1. Actual numbers don't matter, just that it's a number - 1. Ordered sub-list -4. And another item. - - Some text that should be aligned with the above item. - -* Unordered list can use asterisks -- Or minuses -+ Or pluses - -## Links - -There are two ways to create links, inline-style and reference-style. - - [I'm an inline-style link](https://www.google.com) - - [I'm a reference-style link][Arbitrary case-insensitive reference text] - - [I'm a relative reference to a repository file](LICENSE) - - [You can use numbers for reference-style link definitions][1] - - Or leave it empty and use the [link text itself][] - - Some text to show that the reference links can follow later. - - [arbitrary case-insensitive reference text]: https://www.mozilla.org - [1]: http://slashdot.org - [link text itself]: http://www.reddit.com - -[I'm an inline-style link](https://www.google.com) - -[I'm a reference-style link][Arbitrary case-insensitive reference text] - -[I'm a relative reference to a repository file](LICENSE) - -[You can use numbers for reference-style link definitions][1] - -Or leave it empty and use the [link text itself][] - -Some text to show that the reference links can follow later. - -[arbitrary case-insensitive reference text]: https://www.mozilla.org -[1]: http://slashdot.org -[link text itself]: http://www.reddit.com - -**Note** - -Relative links do not allow referencing project files in a wiki page or wiki page in a project file. The reason for this is that, in GitLab, wiki is always a separate git repository. For example: - -`[I'm a reference-style link][style]` - -will point the link to `wikis/style` when the link is inside of a wiki markdown file. - -## Images - - Here's our logo (hover to see the title text): - - Inline-style: - ![alt text](assets/logo-white.png) - - Reference-style: - ![alt text1][logo] - - [logo]: assets/logo-white.png - -Here's our logo: - -Inline-style: - -![alt text](/assets/logo-white.png) - -Reference-style: - -![alt text][logo] - -[logo]: /assets/logo-white.png - -## Blockquotes - -```no-highlight -> Blockquotes are very handy in email to emulate reply text. -> This line is part of the same quote. - -Quote break. - -> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. -``` - -> Blockquotes are very handy in email to emulate reply text. -> This line is part of the same quote. - -Quote break. - -> This is a very long line that will still be quoted properly when it wraps. Oh boy let's keep writing to make sure this is long enough to actually wrap for everyone. Oh, you can *put* **Markdown** into a blockquote. - -## Inline HTML - -You can also use raw HTML in your Markdown, and it'll mostly work pretty well. - -See the documentation for HTML::Pipeline's [SanitizationFilter](http://www.rubydoc.info/gems/html-pipeline/HTML/Pipeline/SanitizationFilter#WHITELIST-constant) class for the list of allowed HTML tags and attributes. In addition to the default `SanitizationFilter` whitelist, GitLab allows the `class`, `id`, and `style` attributes. - -```no-highlight -

      -
      Definition list
      -
      Is something people use sometimes.
      - -
      Markdown in HTML
      -
      Does *not* work **very** well. Use HTML tags.
      -
      -``` - -
      -
      Definition list
      -
      Is something people use sometimes.
      - -
      Markdown in HTML
      -
      Does *not* work **very** well. Use HTML tags.
      -
      - -## Horizontal Rule - -``` -Three or more... - ---- - -Hyphens - -*** - -Asterisks - -___ - -Underscores -``` - -Three or more... - ---- - -Hyphens - -*** - -Asterisks - -___ - -Underscores - -## Line Breaks - -My basic recommendation for learning how line breaks work is to experiment and discover -- hit <Enter> once (i.e., insert one newline), then hit it twice (i.e., insert two newlines), see what happens. You'll soon learn to get what you want. "Markdown Toggle" is your friend. - -Here are some things to try out: - -``` -Here's a line for us to start with. - -This line is separated from the one above by two newlines, so it will be a *separate paragraph*. - -This line is also a separate paragraph, but... -This line is only separated by a single newline, so it's a separate line in the *same paragraph*. - -This line is also a separate paragraph, and... -This line is on its own line, because the previous line ends with two -spaces. -``` - -Here's a line for us to start with. - -This line is separated from the one above by two newlines, so it will be a *separate paragraph*. - -This line is also begins a separate paragraph, but... -This line is only separated by a single newline, so it's a separate line in the *same paragraph*. - -This line is also a separate paragraph, and... -This line is on its own line, because the previous line ends with two -spaces. - -## Tables - -Tables aren't part of the core Markdown spec, but they are part of GFM and Markdown Here supports them. - -``` -| header 1 | header 2 | -| -------- | -------- | -| cell 1 | cell 2 | -| cell 3 | cell 4 | -``` - -Code above produces next output: - -| header 1 | header 2 | -| -------- | -------- | -| cell 1 | cell 2 | -| cell 3 | cell 4 | - -**Note** - -The row of dashes between the table header and body must have at least three dashes in each column. - -## References - -- This document leveraged heavily from the [Markdown-Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet). -- The [Markdown Syntax Guide](http://daringfireball.net/projects/markdown/syntax) at Daring Fireball is an excellent resource for a detailed explanation of standard markdown. -- [Dillinger.io](http://dillinger.io) is a handy tool for testing standard markdown. diff --git a/doc/operations/README.md b/doc/operations/README.md deleted file mode 100644 index f1456c6c8e2..00000000000 --- a/doc/operations/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# GitLab operations - -- [Sidekiq MemoryKiller](sidekiq_memory_killer.md) -- [Cleaning up Redis sessions](cleaning_up_redis_sessions.md) diff --git a/doc/operations/cleaning_up_redis_sessions.md b/doc/operations/cleaning_up_redis_sessions.md deleted file mode 100644 index 93521e976d5..00000000000 --- a/doc/operations/cleaning_up_redis_sessions.md +++ /dev/null @@ -1,52 +0,0 @@ -# Cleaning up stale Redis sessions - -Since version 6.2, GitLab stores web user sessions as key-value pairs in Redis. -Prior to GitLab 7.3, user sessions did not automatically expire from Redis. If -you have been running a large GitLab server (thousands of users) since before -GitLab 7.3 we recommend cleaning up stale sessions to compact the Redis -database after you upgrade to GitLab 7.3. You can also perform a cleanup while -still running GitLab 7.2 or older, but in that case new stale sessions will -start building up again after you clean up. - -In GitLab versions prior to 7.3.0, the session keys in Redis are 16-byte -hexadecimal values such as '976aa289e2189b17d7ef525a6702ace9'. Starting with -GitLab 7.3.0, the keys are -prefixed with 'session:gitlab:', so they would look like -'session:gitlab:976aa289e2189b17d7ef525a6702ace9'. Below we describe how to -remove the keys in the old format. - -First we define a shell function with the proper Redis connection details. - -``` -rcli() { - # This example works for Omnibus installations of GitLab 7.3 or newer. For an - # installation from source you will have to change the socket path and the - # path to redis-cli. - sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket "$@" -} - -# test the new shell function; the response should be PONG -rcli ping -``` - -Now we do a search to see if there are any session keys in the old format for -us to clean up. - -``` -# returns the number of old-format session keys in Redis -rcli keys '*' | grep '^[a-f0-9]\{32\}$' | wc -l -``` - -If the number is larger than zero, you can proceed to expire the keys from -Redis. If the number is zero there is nothing to clean up. - -``` -# Tell Redis to expire each matched key after 600 seconds. -rcli keys '*' | grep '^[a-f0-9]\{32\}$' | awk '{ print "expire", $0, 600 }' | rcli -# This will print '(integer) 1' for each key that gets expired. -``` - -Over the next 15 minutes (10 minutes expiry time plus 5 minutes Redis -background save interval) your Redis database will be compacted. If you are -still using GitLab 7.2, users who are not clicking around in GitLab during the -10 minute expiry window will be signed out of GitLab. diff --git a/doc/operations/sidekiq_memory_killer.md b/doc/operations/sidekiq_memory_killer.md deleted file mode 100644 index 867b01b0d5a..00000000000 --- a/doc/operations/sidekiq_memory_killer.md +++ /dev/null @@ -1,38 +0,0 @@ -# Sidekiq MemoryKiller - -The GitLab Rails application code suffers from memory leaks. For web requests -this problem is made manageable using -[unicorn-worker-killer](https://github.com/kzk/unicorn-worker-killer) which -restarts Unicorn worker processes in between requests when needed. The Sidekiq -MemoryKiller applies the same approach to the Sidekiq processes used by GitLab -to process background jobs. - -Unlike unicorn-worker-killer, which is enabled by default for all GitLab -installations since GitLab 6.4, the Sidekiq MemoryKiller is enabled by default -_only_ for Omnibus packages. The reason for this is that the MemoryKiller -relies on Runit to restart Sidekiq after a memory-induced shutdown and GitLab -installations from source do not all use Runit or an equivalent. - -With the default settings, the MemoryKiller will cause a Sidekiq restart no -more often than once every 15 minutes, with the restart causing about one -minute of delay for incoming background jobs. - -## Configuring the MemoryKiller - -The MemoryKiller is controlled using environment variables. - -- `SIDEKIQ_MEMORY_KILLER_MAX_RSS`: if this variable is set, and its value is - greater than 0, then after each Sidekiq job, the MemoryKiller will check the - RSS of the Sidekiq process that executed the job. If the RSS of the Sidekiq - process (expressed in kilobytes) exceeds SIDEKIQ_MEMORY_KILLER_MAX_RSS, a - delayed shutdown is triggered. The default value for Omnibus packages is set - [in the omnibus-gitlab - repository](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-cookbooks/gitlab/attributes/default.rb). -- `SIDEKIQ_MEMORY_KILLER_GRACE_TIME`: defaults 900 seconds (15 minutes). When - a shutdown is triggered, the Sidekiq process will keep working normally for - another 15 minutes. -- `SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT`: defaults to 30 seconds. When the grace - time has expired, the MemoryKiller tells Sidekiq to stop accepting new jobs. - Existing jobs get 30 seconds to finish. After that, the MemoryKiller tells - Sidekiq to shut down, and an external supervision mechanism (e.g. Runit) must - restart Sidekiq. diff --git a/doc/permissions/permissions.md b/doc/permissions/permissions.md deleted file mode 100644 index 8cfa7f9c876..00000000000 --- a/doc/permissions/permissions.md +++ /dev/null @@ -1,55 +0,0 @@ -# Permissions - -Users have different abilities depending on the access level they have in a particular group or project. - -If a user is both in a project group and in the project itself, the highest permission level is used. - -If a user is a GitLab administrator they receive all permissions. - -## Project - -| Action | Guest | Reporter | Developer | Master | Owner | -|---------------------------------------|---------|------------|-------------|----------|--------| -| Create new issue | ✓ | ✓ | ✓ | ✓ | ✓ | -| Leave comments | ✓ | ✓ | ✓ | ✓ | ✓ | -| Pull project code | | ✓ | ✓ | ✓ | ✓ | -| Download project | | ✓ | ✓ | ✓ | ✓ | -| Create code snippets | | ✓ | ✓ | ✓ | ✓ | -| Create new merge request | | | ✓ | ✓ | ✓ | -| Create new branches | | | ✓ | ✓ | ✓ | -| Push to non-protected branches | | | ✓ | ✓ | ✓ | -| Force push to non-protected branches | | | ✓ | ✓ | ✓ | -| Remove non-protected branches | | | ✓ | ✓ | ✓ | -| Add tags | | | ✓ | ✓ | ✓ | -| Write a wiki | | | ✓ | ✓ | ✓ | -| Manage issue tracker | | | ✓ | ✓ | ✓ | -| Manage labels | | | ✓ | ✓ | ✓ | -| Create new milestones | | | | ✓ | ✓ | -| Add new team members | | | | ✓ | ✓ | -| Push to protected branches | | | | ✓ | ✓ | -| Enable/disable branch protection | | | | ✓ | ✓ | -| Turn on/off prot. branch push for devs| | | | ✓ | ✓ | -| Rewrite/remove git tags | | | | ✓ | ✓ | -| Edit project | | | | ✓ | ✓ | -| Add deploy keys to project | | | | ✓ | ✓ | -| Configure project hooks | | | | ✓ | ✓ | -| Switch visibility level | | | | | ✓ | -| Transfer project to another namespace | | | | | ✓ | -| Remove project | | | | | ✓ | -| Force push to protected branches | | | | | | -| Remove protected branches | | | | | | - -## Group - -In order for a group to appear as public and be browsable, it must contain at -least one public project. - -Any user can remove themselves from a group, unless they are the last Owner of the group. - -| Action | Guest | Reporter | Developer | Master | Owner | -|-------------------------|-------|----------|-----------|--------|-------| -| Browse group | ✓ | ✓ | ✓ | ✓ | ✓ | -| Edit group | | | | | ✓ | -| Create project in group | | | | ✓ | ✓ | -| Manage group members | | | | | ✓ | -| Remove group | | | | | ✓ | diff --git a/doc/project_services/bamboo.md b/doc/project_services/bamboo.md deleted file mode 100644 index 51668128c62..00000000000 --- a/doc/project_services/bamboo.md +++ /dev/null @@ -1,60 +0,0 @@ -# Atlassian Bamboo CI Service - -GitLab provides integration with Atlassian Bamboo for continuous integration. -When configured, pushes to a project will trigger a build in Bamboo automatically. -Merge requests will also display CI status showing whether the build is pending, -failed, or completed successfully. It also provides a link to the Bamboo build -page for more information. - -Bamboo doesn't quite provide the same features as a traditional build system when -it comes to accepting webhooks and commit data. There are a few things that -need to be configured in a Bamboo build plan before GitLab can integrate. - -## Setup - -### Complete these steps in Bamboo: - -1. Navigate to a Bamboo build plan and choose 'Configure plan' from the 'Actions' -dropdown. -1. Select the 'Triggers' tab. -1. Click 'Add trigger'. -1. Enter a description such as 'GitLab trigger' -1. Choose 'Repository triggers the build when changes are committed' -1. Check one or more repositories checkboxes -1. Enter the GitLab IP address in the 'Trigger IP addresses' box. This is a -whitelist of IP addresses that are allowed to trigger Bamboo builds. -1. Save the trigger. -1. In the left pane, select a build stage. If you have multiple build stages -you want to select the last stage that contains the git checkout task. -1. Select the 'Miscellaneous' tab. -1. Under 'Pattern Match Labelling' put '${bamboo.repository.revision.number}' -in the 'Labels' box. -1. Save - -Bamboo is now ready to accept triggers from GitLab. Next, set up the Bamboo -service in GitLab - -### Complete these steps in GitLab: - -1. Navigate to the project you want to configure to trigger builds. -1. Select 'Settings' in the top navigation. -1. Select 'Services' in the left navigation. -1. Click 'Atlassian Bamboo CI' -1. Select the 'Active' checkbox. -1. Enter the base URL of your Bamboo server. 'https://bamboo.example.com' -1. Enter the build key from your Bamboo build plan. Build keys are a short, -all capital letter, identifier that is unique. It will be something like PR-BLD -1. If necessary, enter username and password for a Bamboo user that has -access to trigger the build plan. Leave these fields blank if you do not require -authentication. -1. Save or optionally click 'Test Settings'. Please note that 'Test Settings' -will actually trigger a build in Bamboo. - -## Troubleshooting - -If builds are not triggered, these are a couple of things to keep in mind. - -1. Ensure you entered the right GitLab IP address in Bamboo under 'Trigger -IP addresses'. -1. Remember that GitLab only triggers builds on push events. A commit via the -web interface will not trigger CI currently. diff --git a/doc/project_services/hipchat.md b/doc/project_services/hipchat.md deleted file mode 100644 index 021a93a288f..00000000000 --- a/doc/project_services/hipchat.md +++ /dev/null @@ -1,54 +0,0 @@ -# Atlassian HipChat - -GitLab provides a way to send HipChat notifications upon a number of events, -such as when a user pushes code, creates a branch or tag, adds a comment, and -creates a merge request. - -## Setup - -GitLab requires the use of a HipChat v2 API token to work. v1 tokens are -not supported at this time. Note the differences between v1 and v2 tokens: - -HipChat v1 API (legacy) supports "API Auth Tokens" in the Group API menu. A v1 -token is allowed to send messages to *any* room. - -HipChat v2 API has tokens that are can be created using the Integrations tab -in the Group or Room admin page. By design, these are lightweight tokens that -allow GitLab to send messages only to *one* room. - -### Complete these steps in HipChat: - -1. Go to: https://admin.hipchat.com/admin -1. Click on "Group Admin" -> "Integrations". -1. Find "Build Your Own!" and click "Create". -1. Select the desired room, name the integration "GitLab", and click "Create". -1. In the "Send messages to this room by posting this URL" column, you should -see a URL in the format: - -``` - https://api.hipchat.com/v2/room//notification?auth_token= -``` - -HipChat is now ready to accept messages from GitLab. Next, set up the HipChat -service in GitLab. - -### Complete these steps in GitLab: - -1. Navigate to the project you want to configure for notifications. -1. Select "Settings" in the top navigation. -1. Select "Services" in the left navigation. -1. Click "HipChat". -1. Select the "Active" checkbox. -1. Insert the `token` field from the URL into the `Token` field on the Web page. -1. Insert the `room` field from the URL into the `Room` field on the Web page. -1. Save or optionally click "Test Settings". - -## Troubleshooting - -If you do not see notifications, make sure you are using a HipChat v2 API -token, not a v1 token. - -Note that the v2 token is tied to a specific room. If you want to be able to -specify arbitrary rooms, you can create an API token for a specific user in -HipChat under "Account settings" and "API access". Use the `XXX` value under -`auth_token=XXX`. diff --git a/doc/project_services/irker.md b/doc/project_services/irker.md deleted file mode 100644 index 780a45bca20..00000000000 --- a/doc/project_services/irker.md +++ /dev/null @@ -1,46 +0,0 @@ -# Irker IRC Gateway - -GitLab provides a way to push update messages to an Irker server. When -configured, pushes to a project will trigger the service to send data directly -to the Irker server. - -See the project homepage for further info: http://www.catb.org/esr/irker/ - -## Needed setup - -You will first need an Irker daemon. You can download the Irker code from its -gitorious repository on https://gitorious.org/irker: `git clone -git@gitorious.org:irker/irker.git`. Once you have downloaded the code, you can -run the python script named `irkerd`. This script is the gateway script, it acts -both as an IRC client, for sending messages to an IRC server obviously, and as a -TCP server, for receiving messages from the GitLab service. - -If the Irker server runs on the same machine, you are done. If not, you will -need to follow the firsts steps of the next section. - -## Optional setup - -In the `app/models/project_services/irker_service.rb` file, you can modify some -options in the `initialize_settings` method: -- **server_ip** (defaults to `localhost`): the server IP address where the -`irkerd` daemon runs; -- **server_port** (defaults to `6659`): the server port of the `irkerd` daemon; -- **max_channels** (defaults to `3`): the maximum number of recipients the -client is authorized to join, per project; -- **default_irc_uri** (no default) : if this option is set, it has to be in the -format `irc[s]://domain.name` and will be prepend to each and every channel -provided by the user which is not a full URI. - -If the Irker server and the GitLab application do not run on the same host, you -will **need** to setup at least the **server_ip** option. - -## Note on Irker recipients - -Irker accepts channel names of the form `chan` and `#chan`, both for the -`#chan` channel. If you want to send messages in query, you will need to add -`,isnick` avec the channel name, in this form: `Aorimn,isnick`. In this latter -case, `Aorimn` is treated as a nick and no more as a channel name. - -Irker can also join password-protected channels. Users need to append -`?key=thesecretpassword` to the chan name. - diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md deleted file mode 100644 index 03937d20728..00000000000 --- a/doc/project_services/project_services.md +++ /dev/null @@ -1,20 +0,0 @@ -# Project Services - -__Project integrations with external services for continuous integration and more.__ - -## Services - -- Assembla -- [Atlassian Bamboo CI](bamboo.md) An Atlassian product for continuous integration. -- Build box -- Campfire -- Emails on push -- Flowdock -- Gemnasium -- GitLab CI -- [HipChat](hipchat.md) An Atlassian product for private group chat and instant messaging. -- [Irker](irker.md) An IRC gateway to receive messages on repository updates. -- Pivotal Tracker -- Pushover -- Slack -- TeamCity diff --git a/doc/public_access/public_access.md b/doc/public_access/public_access.md deleted file mode 100644 index bd439f7c6f3..00000000000 --- a/doc/public_access/public_access.md +++ /dev/null @@ -1,44 +0,0 @@ -# Public access - -GitLab allows you to open selected projects to be accessed **publicly** or **internally**. - -Projects with either of these visibility levels will be listed in the [public access directory](/public). - -Internal projects will only be available to authenticated users. - -## Public projects - -Public projects can be cloned **without any** authentication. - -It will also be listed on the [public access directory](/public). - -**Any logged in user** will have [Guest](../permissions/permissions) permissions on the repository. - -## Internal projects - -Internal projects can be cloned by any logged in user. - -It will also be listed on the [public access directory](/public) for logged in users. - -Any logged in user will have [Guest](../permissions/permissions) permissions on the repository. - -## How to change project visibility - -1. Go to your project dashboard -1. Click on the "Edit" tab -1. Change "Visibility Level" - -## Visibility of users - -The public page of users, located at `/u/username` is visible if either: - -- You are logged in. -- You are logged out, and the target user is authorized to (is Guest, Reporter, etc.) at least one public project. - -Otherwise, you will be redirected to the sign in page. - -When visiting the public page of an user, you will only see listed projects which you can view yourself. - -## Restricting the use of public or internal projects - -In the Admin area under Settings you can disable public projects or public and internal projects for the entire GitLab installation to prevent people making code public by accident. The restricted visibility settings do not apply to admin users. diff --git a/doc/raketasks/README.md b/doc/raketasks/README.md deleted file mode 100644 index 770b7a70fe0..00000000000 --- a/doc/raketasks/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# Rake tasks - -- [Backup restore](backup_restore.md) -- [Cleanup](cleanup.md) -- [Features](features.md) -- [Maintenance](maintenance.md) and self-checks -- [User management](user_management.md) -- [Web hooks](web_hooks.md) -- [Import](import.md) of git repositories in bulk diff --git a/doc/raketasks/backup_hrz.png b/doc/raketasks/backup_hrz.png deleted file mode 100644 index 03e50df1d76e57a667770b062a82898a6fa34d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21955 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 OEcJBtb6Mw<&;$V6q@#rZ diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md deleted file mode 100644 index 2e41fad89e7..00000000000 --- a/doc/raketasks/backup_restore.md +++ /dev/null @@ -1,240 +0,0 @@ -# Backup restore - -![backup banner](backup_hrz.png) - -## Create a backup of the GitLab system - -A backup creates an archive file that contains the database, all repositories and all attachments. -This archive will be saved in backup_path (see `config/gitlab.yml`). -The filename will be `[TIMESTAMP]_gitlab_backup.tar`. This timestamp can be used to restore an specific backup. -You can only restore a backup to exactly the same version of GitLab that you created it on, for example 7.2.1. - -``` -# use this command if you've installed GitLab with the Omnibus package -sudo gitlab-rake gitlab:backup:create - -# if you've installed GitLab from source -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -Also you can choose what should be backed up by adding environment variable SKIP. Available options: db, -uploads (attachments), repositories. Use a comma to specify several options at the same time. - -``` -sudo gitlab-rake gitlab:backup:create SKIP=db,uploads -``` - -Example output: - -``` -Dumping database tables: -- Dumping table events... [DONE] -- Dumping table issues... [DONE] -- Dumping table keys... [DONE] -- Dumping table merge_requests... [DONE] -- Dumping table milestones... [DONE] -- Dumping table namespaces... [DONE] -- Dumping table notes... [DONE] -- Dumping table projects... [DONE] -- Dumping table protected_branches... [DONE] -- Dumping table schema_migrations... [DONE] -- Dumping table services... [DONE] -- Dumping table snippets... [DONE] -- Dumping table taggings... [DONE] -- Dumping table tags... [DONE] -- Dumping table users... [DONE] -- Dumping table users_projects... [DONE] -- Dumping table web_hooks... [DONE] -- Dumping table wikis... [DONE] -Dumping repositories: -- Dumping repository abcd... [DONE] -Creating backup archive: $TIMESTAMP_gitlab_backup.tar [DONE] -Deleting tmp directories...[DONE] -Deleting old backups... [SKIPPING] -``` - -## Upload backups to remote (cloud) storage - -Starting with GitLab 7.4 you can let the backup script upload the '.tar' file it creates. -It uses the [Fog library](http://fog.io/) to perform the upload. -In the example below we use Amazon S3 for storage. -But Fog also lets you use [other storage providers](http://fog.io/storage/). - -For omnibus packages: - -```ruby -gitlab_rails['backup_upload_connection'] = { - 'provider' => 'AWS', - 'region' => 'eu-west-1', - 'aws_access_key_id' => 'AKIAKIAKI', - 'aws_secret_access_key' => 'secret123' -} -gitlab_rails['backup_upload_remote_directory'] = 'my.s3.bucket' -``` - -For installations from source: - -```yaml - backup: - # snip - upload: - # Fog storage connection settings, see http://fog.io/storage/ . - connection: - provider: AWS - region: eu-west-1 - aws_access_key_id: AKIAKIAKI - aws_secret_access_key: 'secret123' - # The remote 'directory' to store your backups. For S3, this would be the bucket name. - remote_directory: 'my.s3.bucket' -``` - -If you are uploading your backups to S3 you will probably want to create a new -IAM user with restricted access rights. To give the upload user access only for -uploading backups create the following IAM profile, replacing `my.s3.bucket` -with the name of your bucket: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "Stmt1412062044000", - "Effect": "Allow", - "Action": [ - "s3:AbortMultipartUpload", - "s3:GetBucketAcl", - "s3:GetBucketLocation", - "s3:GetObject", - "s3:GetObjectAcl", - "s3:ListBucketMultipartUploads", - "s3:PutObject", - "s3:PutObjectAcl" - ], - "Resource": [ - "arn:aws:s3:::my.s3.bucket/*" - ] - }, - { - "Sid": "Stmt1412062097000", - "Effect": "Allow", - "Action": [ - "s3:GetBucketLocation", - "s3:ListAllMyBuckets" - ], - "Resource": [ - "*" - ] - }, - { - "Sid": "Stmt1412062128000", - "Effect": "Allow", - "Action": [ - "s3:ListBucket" - ], - "Resource": [ - "arn:aws:s3:::my.s3.bucket" - ] - } - ] -} -``` - -## Storing configuration files - -Please be informed that a backup does not store your configuration files. -If you use an Omnibus package please see the [instructions in the readme to backup your configuration](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#backup-and-restore-omnibus-gitlab-configuration). -If you have a cookbook installation there should be a copy of your configuration in Chef. -If you have an installation from source, please consider backing up your `gitlab.yml` file, any SSL keys and certificates, and your [SSH host keys](https://superuser.com/questions/532040/copy-ssh-keys-from-one-server-to-another-server/532079#532079). - -## Restore a previously created backup - -You can only restore a backup to exactly the same version of GitLab that you created it on, for example 7.2.1. - -``` -# Omnibus package installation -sudo gitlab-rake gitlab:backup:restore - -# installation from source -bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` - -Options: - -``` -BACKUP=timestamp_of_backup (required if more than one backup exists) -``` - -Example output: - -``` -Unpacking backup... [DONE] -Restoring database tables: --- create_table("events", {:force=>true}) - -> 0.2231s -[...] -- Loading fixture events...[DONE] -- Loading fixture issues...[DONE] -- Loading fixture keys...[SKIPPING] -- Loading fixture merge_requests...[DONE] -- Loading fixture milestones...[DONE] -- Loading fixture namespaces...[DONE] -- Loading fixture notes...[DONE] -- Loading fixture projects...[DONE] -- Loading fixture protected_branches...[SKIPPING] -- Loading fixture schema_migrations...[DONE] -- Loading fixture services...[SKIPPING] -- Loading fixture snippets...[SKIPPING] -- Loading fixture taggings...[SKIPPING] -- Loading fixture tags...[SKIPPING] -- Loading fixture users...[DONE] -- Loading fixture users_projects...[DONE] -- Loading fixture web_hooks...[SKIPPING] -- Loading fixture wikis...[SKIPPING] -Restoring repositories: -- Restoring repository abcd... [DONE] -Deleting tmp directories...[DONE] -``` - -## Configure cron to make daily backups - -For Omnibus package installations, see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#scheduling-a-backup . - -For installation from source: -``` -cd /home/git/gitlab -sudo -u git -H editor config/gitlab.yml # Enable keep_time in the backup section to automatically delete old backups -sudo -u git crontab -e # Edit the crontab for the git user -``` - -Add the following lines at the bottom: - -``` -# Create a full backup of the GitLab repositories and SQL database every day at 4am -0 4 * * * cd /home/git/gitlab && PATH=/usr/local/bin:/usr/bin:/bin bundle exec rake gitlab:backup:create RAILS_ENV=production CRON=1 -``` - -The `CRON=1` environment setting tells the backup script to suppress all progress output if there are no errors. -This is recommended to reduce cron spam. - -## Alternative backup strategies - -If your GitLab server contains a lot of Git repository data you may find the GitLab backup script to be too slow. -In this case you can consider using filesystem snapshots as part of your backup strategy. - -Example: Amazon EBS - -> A GitLab server using omnibus-gitlab hosted on Amazon AWS. -> An EBS drive containing an ext4 filesystem is mounted at `/var/opt/gitlab`. -> In this case you could make an application backup by taking an EBS snapshot. -> The backup includes all repositories, uploads and Postgres data. - -Example: LVM snapshots + rsync - -> A GitLab server using omnibus-gitlab, with an LVM logical volume mounted at `/var/opt/gitlab`. -> Replicating the `/var/opt/gitlab` directory using rsync would not be reliable because too many files would change while rsync is running. -> Instead of rsync-ing `/var/opt/gitlab`, we create a temporary LVM snapshot, which we mount as a read-only filesystem at `/mnt/gitlab_backup`. -> Now we can have a longer running rsync job which will create a consistent replica on the remote server. -> The replica includes all repositories, uploads and Postgres data. - -If you are running GitLab on a virtualized server you can possibly also create VM snapshots of the entire GitLab server. -It is not uncommon however for a VM snapshot to require you to power down the server, so this approach is probably of limited practical use. diff --git a/doc/raketasks/cleanup.md b/doc/raketasks/cleanup.md deleted file mode 100644 index 96d67f7b5d6..00000000000 --- a/doc/raketasks/cleanup.md +++ /dev/null @@ -1,23 +0,0 @@ -# Cleanup - -## Remove garbage from filesystem. Important! Data loss! - -Remove namespaces(dirs) from `/home/git/repositories` if they don't exist in GitLab database. - -``` -# omnibus-gitlab -sudo gitlab-rake gitlab:cleanup:dirs - -# installation from source -bundle exec rake gitlab:cleanup:dirs RAILS_ENV=production -``` - -Remove repositories (global only for now) from `/home/git/repositories` if they don't exist in GitLab database. - -``` -# omnibus-gitlab -sudo gitlab-rake gitlab:cleanup:repos - -# installation from source -bundle exec rake gitlab:cleanup:repos RAILS_ENV=production -``` diff --git a/doc/raketasks/features.md b/doc/raketasks/features.md deleted file mode 100644 index f9a46193547..00000000000 --- a/doc/raketasks/features.md +++ /dev/null @@ -1,20 +0,0 @@ -# Features - -## Enable usernames and namespaces for user projects - -This command will enable the namespaces feature introduced in v4.0. It will move every project in its namespace folder. - -Note: - -- Because the **repository location will change**, you will need to **update all your git URLs** to point to the new location. -- Username can be changed at [Profile / Account](/profile/account) - -**Example:** - -Old path: `git@example.org:myrepo.git` - -New path: `git@example.org:username/myrepo.git` or `git@example.org:groupname/myrepo.git` - -``` -bundle exec rake gitlab:enable_namespaces RAILS_ENV=production -``` diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md deleted file mode 100644 index 8a38937062e..00000000000 --- a/doc/raketasks/import.md +++ /dev/null @@ -1,68 +0,0 @@ -# Import bare repositories into your GitLab instance - -## Notes - -- The owner of the project will be the first admin -- The groups will be created as needed -- The owner of the group will be the first admin -- Existing projects will be skipped - -## How to use - -### Create a new folder inside the git repositories path. This will be the name of the new group. - -- For omnibus-gitlab, it is located at: `/var/opt/gitlab/git-data/repositories` by default, unless you changed -it in the `/etc/gitlab/gitlab.rb` file. -- For installations from source, it is usually located at: `/home/git/repositories` or you can see where -your repositories are located by looking at `config/gitlab.yml` under the `gitlab_shell => repos_path` entry. - -New folder needs to have git user ownership and read/write/execute access for git user and its group: - -``` -sudo -u git mkdir /var/opt/gitlab/git-data/repositories/new_group -``` - -If you are using an installation from source, replace `/var/opt/gitlab/git-data` -with `/home/git`. - -### Copy your bare repositories inside this newly created folder: - -``` -sudo cp -r /old/git/foo.git /var/opt/gitlab/git-data/repositories/new_group/ - -# Do this once when you are done copying git repositories -sudo chown -R git:git /var/opt/gitlab/git-data/repositories/new_group/ -``` - -`foo.git` needs to be owned by the git user and git users group. - -If you are using an installation from source, replace `/var/opt/gitlab/git-data` -with `/home/git`. - -### Run the command below depending on your type of installation: - -#### Omnibus Installation - -``` -$ sudo gitlab-rake gitlab:import:repos -``` - -#### Installation from source - -Before running this command you need to change the directory to where your GitLab installation is located: - -``` -$ cd /home/git/gitlab -$ sudo -u git -H bundle exec rake gitlab:import:repos RAILS_ENV=production -``` - -#### Example output - -``` -Processing abcd.git - * Created abcd (abcd.git) -Processing group/xyz.git - * Created Group group (2) - * Created xyz (group/xyz.git) -[...] -``` diff --git a/doc/raketasks/maintenance.md b/doc/raketasks/maintenance.md deleted file mode 100644 index 41a994f3f68..00000000000 --- a/doc/raketasks/maintenance.md +++ /dev/null @@ -1,178 +0,0 @@ -# Maintenance - -## Gather information about GitLab and the system it runs on - -This command gathers information about your GitLab installation and the System it runs on. These may be useful when asking for help or reporting issues. - -``` -# omnibus-gitlab -sudo gitlab-rake gitlab:env:info - -# installation from source -bundle exec rake gitlab:env:info RAILS_ENV=production -``` - -Example output: - -``` -System information -System: Debian 7.8 -Current User: git -Using RVM: no -Ruby Version: 2.1.5p273 -Gem Version: 2.4.3 -Bundler Version: 1.7.6 -Rake Version: 10.3.2 -Sidekiq Version: 2.17.8 - -GitLab information -Version: 7.7.1 -Revision: 41ab9e1 -Directory: /home/git/gitlab -DB Adapter: postgresql -URL: https://gitlab.example.com -HTTP Clone URL: https://gitlab.example.com/some-project.git -SSH Clone URL: git@gitlab.example.com:some-project.git -Using LDAP: no -Using Omniauth: no - -GitLab Shell -Version: 2.4.1 -Repositories: /home/git/repositories/ -Hooks: /home/git/gitlab-shell/hooks/ -Git: /usr/bin/git -``` - -## Check GitLab configuration - -Runs the following rake tasks: - -- `gitlab:env:check` -- `gitlab:gitlab_shell:check` -- `gitlab:sidekiq:check` -- `gitlab:app:check` - -It will check that each component was setup according to the installation guide and suggest fixes for issues found. - -You may also have a look at our [Trouble Shooting Guide](https://github.com/gitlabhq/gitlab-public-wiki/wiki/Trouble-Shooting-Guide). - -``` -# omnibus-gitlab -sudo gitlab-rake gitlab:check - -# installation from source -bundle exec rake gitlab:check RAILS_ENV=production -``` - -NOTE: Use SANITIZE=true for gitlab:check if you want to omit project names from the output. - -Example output: - -``` -Checking Environment ... - -Git configured for git user? ... yes -Has python2? ... yes -python2 is supported version? ... yes - -Checking Environment ... Finished - -Checking GitLab Shell ... - -GitLab Shell version? ... OK (1.2.0) -Repo base directory exists? ... yes -Repo base directory is a symlink? ... no -Repo base owned by git:git? ... yes -Repo base access is drwxrws---? ... yes -post-receive hook up-to-date? ... yes -post-receive hooks in repos are links: ... yes - -Checking GitLab Shell ... Finished - -Checking Sidekiq ... - -Running? ... yes - -Checking Sidekiq ... Finished - -Checking GitLab ... - -Database config exists? ... yes -Database is SQLite ... no -All migrations up? ... yes -GitLab config exists? ... yes -GitLab config outdated? ... no -Log directory writable? ... yes -Tmp directory writable? ... yes -Init script exists? ... yes -Init script up-to-date? ... yes -Projects have satellites? ... yes -Redis version >= 2.0.0? ... yes - -Checking GitLab ... Finished -``` - -## (Re-)Create satellite repositories - -This will create satellite repositories for all your projects. - -If necessary, remove the `repo_satellites` directory and rerun the commands below. - -``` -sudo -u git -H mkdir -p /home/git/gitlab-satellites -sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production -sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites -``` - -## Rebuild authorized_keys file - -In some case it is necessary to rebuild the `authorized_keys` file. - -For Omnibus-packages: -``` -sudo gitlab-rake gitlab:shell:setup -``` - -For installations from source: -``` -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production -``` - -``` -This will rebuild an authorized_keys file. -You will lose any data stored in authorized_keys file. -Do you want to continue (yes/no)? yes -``` - -## Clear redis cache - -If for some reason the dashboard shows wrong information you might want to -clear Redis' cache. - -For Omnibus-packages: -``` -sudo gitlab-rake cache:clear -``` - -For installations from source: -``` -cd /home/git/gitlab -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production -``` - -## Precompile the assets - -Sometimes during version upgrades you might end up with some wrong CSS or -missing some icons. In that case, try to precompile the assets again. - -For Omnibus-packages: -``` -sudo gitlab-rake assets:precompile -``` - -For installations from source: -``` -cd /home/git/gitlab -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` diff --git a/doc/raketasks/user_management.md b/doc/raketasks/user_management.md deleted file mode 100644 index 80b01ca4043..00000000000 --- a/doc/raketasks/user_management.md +++ /dev/null @@ -1,49 +0,0 @@ -# User management - -## Add user as a developer to all projects - -```bash -# omnibus-gitlab -sudo gitlab-rake gitlab:import:user_to_projects[username@domain.tld] - -# installation from source -bundle exec rake gitlab:import:user_to_projects[username@domain.tld] RAILS_ENV=production -``` - -## Add all users to all projects - -Notes: - -- admin users are added as masters - -```bash -# omnibus-gitlab -sudo gitlab-rake gitlab:import:all_users_to_all_projects - -# installation from source -bundle exec rake gitlab:import:all_users_to_all_projects RAILS_ENV=production -``` - -## Add user as a developer to all groups - -```bash -# omnibus-gitlab -sudo gitlab-rake gitlab:import:user_to_groups[username@domain.tld] - -# installation from source -bundle exec rake gitlab:import:user_to_groups[username@domain.tld] RAILS_ENV=production -``` - -## Add all users to all groups - -Notes: - -- admin users are added as owners so they can add additional users to the group - -```bash -# omnibus-gitlab -sudo gitlab-rake gitlab:import:all_users_to_all_groups - -# installation from source -bundle exec rake gitlab:import:all_users_to_all_groups RAILS_ENV=production -``` diff --git a/doc/raketasks/web_hooks.md b/doc/raketasks/web_hooks.md deleted file mode 100644 index 5a8b94af9b4..00000000000 --- a/doc/raketasks/web_hooks.md +++ /dev/null @@ -1,45 +0,0 @@ -# Web hooks - -## Add a web hook for **ALL** projects: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:add URL="http://example.com/hook" - # source installations - bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" RAILS_ENV=production - -## Add a web hook for projects in a given **NAMESPACE**: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:add URL="http://example.com/hook" NAMESPACE=acme - # source installations - bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" NAMESPACE=acme RAILS_ENV=production - -## Remove a web hook from **ALL** projects using: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:rm URL="http://example.com/hook" - # source installations - bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" RAILS_ENV=production - -## Remove a web hook from projects in a given **NAMESPACE**: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:rm URL="http://example.com/hook" NAMESPACE=acme - # source installations - bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" NAMESPACE=acme RAILS_ENV=production - -## List **ALL** web hooks: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:list - # source installations - bundle exec rake gitlab:web_hook:list RAILS_ENV=production - -## List the web hooks from projects in a given **NAMESPACE**: - - # omnibus-gitlab - sudo gitlab-rake gitlab:web_hook:list NAMESPACE=/ - # source installations - bundle exec rake gitlab:web_hook:list NAMESPACE=/ RAILS_ENV=production - -> Note: `/` is the global namespace. diff --git a/doc/release/README.md b/doc/release/README.md deleted file mode 100644 index 1342b90f3b3..00000000000 --- a/doc/release/README.md +++ /dev/null @@ -1,6 +0,0 @@ -GitLab has the following updates: - -- [Monthly release](monthly.md), every month on the 22nd. -- [Patch release](patch.md), if there are serious regressions. -- [Security](security.md), for security problems. -- [Master](master.md), update process for the master branch. diff --git a/doc/release/howto_rc1.md b/doc/release/howto_rc1.md deleted file mode 100644 index 07c703142d4..00000000000 --- a/doc/release/howto_rc1.md +++ /dev/null @@ -1,55 +0,0 @@ -# How to create RC1 - -The RC1 release comes with the task to update the installation and upgrade docs. Be mindful that there might already be merge requests for this on GitLab or GitHub. - -### 1. Update the installation guide - -1. Check if it references the correct branch `x-x-stable` (doesn't exist yet, but that is okay) -1. Check the [GitLab Shell version](/lib/tasks/gitlab/check.rake#L782) -1. Check the [Git version](/lib/tasks/gitlab/check.rake#L794) -1. There might be other changes. Ask around. - -### 2. Create update guides - -[Follow this guide](howto_update_guides.md) to create update guides. - -### 3. Code quality indicators - -Make sure the code quality indicators are green / good. - -- [![Build status](http://ci.gitlab.org/projects/1/status.png?ref=master)](http://ci.gitlab.org/projects/1?ref=master) on ci.gitlab.org (master branch) - -- [![Build Status](https://semaphoreapp.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/243338/badge.png)](https://semaphoreapp.com/gitlabhq/gitlabhq) (master branch) - -- [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.png)](https://codeclimate.com/github/gitlabhq/gitlabhq) - -- [![Dependency Status](https://gemnasium.com/gitlabhq/gitlabhq.png)](https://gemnasium.com/gitlabhq/gitlabhq) this button can be yellow (small updates are available) but must not be red (a security fix or an important update is available) - -- [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq) - -### 4. Run release tool - -**Make sure EE `master` has latest changes from CE `master`** - -Get release tools - -``` -git clone git@dev.gitlab.org:gitlab/release-tools.git -cd release-tools -``` - -Release candidate creates stable branch from master. -So we need to sync master branch between all CE, EE and CI remotes. - -``` -bundle exec rake sync -``` - -Create release candidate and stable branch: - -``` -bundle exec rake release["x.x.0.rc1"] -``` - -Now developers can use master for merging new features. -So you should use stable branch for future code changes related to release. diff --git a/doc/release/howto_update_guides.md b/doc/release/howto_update_guides.md deleted file mode 100644 index 23d0959c33d..00000000000 --- a/doc/release/howto_update_guides.md +++ /dev/null @@ -1,55 +0,0 @@ -# Create update guides - -1. Create: CE update guide from previous version. Like `7.3-to-7.4.md` -1. Create: CE to EE update guide in EE repository for latest version. -1. Update: `6.x-or-7.x-to-7.x.md` to latest version. -1. Create: CI update guide from previous version - -It's best to copy paste the previous guide and make changes where necessary. -The typical steps are listed below with any points you should specifically look at. - -#### 0. Any major changes? - -List any major changes here, so the user is aware of them before starting to upgrade. For instance: - -- Database updates -- Web server changes -- File structure changes - -#### 1. Stop server - -#### 2. Make backup - -#### 3. Do users need to update dependencies like `git`? - -- Check if the [GitLab Shell version](/lib/tasks/gitlab/check.rake#L782) changed since the last release. - -- Check if the [Git version](/lib/tasks/gitlab/check.rake#L794) changed since the last release. - -#### 4. Get latest code - -#### 5. Does GitLab shell need to be updated? - -#### 6. Install libs, migrations, etc. - -#### 7. Any config files updated since last release? - -Check if any of these changed since last release: - -- [lib/support/nginx/gitlab](/lib/support/nginx/gitlab) -- [lib/support/nginx/gitlab-ssl](/lib/support/nginx/gitlab-ssl) -- -- [config/gitlab.yml.example](/config/gitlab.yml.example) -- [config/unicorn.rb.example](/config/unicorn.rb.example) -- [config/database.yml.mysql](/config/database.yml.mysql) -- [config/database.yml.postgresql](/config/database.yml.postgresql) -- [config/initializers/rack_attack.rb.example](/config/initializers/rack_attack.rb.example) -- [config/resque.yml.example](/config/resque.yml.example) - -#### 8. Need to update init script? - -Check if the `init.d/gitlab` script changed since last release: [lib/support/init.d/gitlab](/lib/support/init.d/gitlab) - -#### 9. Start application - -#### 10. Check application status diff --git a/doc/release/master.md b/doc/release/master.md deleted file mode 100644 index 19070b46a0d..00000000000 --- a/doc/release/master.md +++ /dev/null @@ -1,33 +0,0 @@ -# How to push GitLab CE master branch to all remotes. - -The source code of GitLab is available on multiple servers (with GitLab.com as the canonical source). -Synchronization between the repo's is done by the lead developer if there is no rush. -This happens a few times per workday on average. -If somebody else with access to all repo's wants to do it the instructions are below. -This is just to distribute changes, not to make them. - -## Add this to `.bashrc` or [your dotfiles](https://github.com/dosire/dotfiles/commit/52803ce3ac60d57632164b7713ff0041e86fa26c) - -```bash -gpa () -{ - git push origin ${1:-master} && git push gh ${1:-master} && git push gl ${1:-master} -} -``` - -## Then add remotes to your local repo - -```bash -cd my-gitlab-ce-repo - -git remote add origin git@dev.gitlab.org:gitlab/gitlabhq.git -git remote add gh git@github.com:gitlabhq/gitlabhq.git -git remote add gl git@gitlab.com:gitlab-org/gitlab-ce.git -``` - -## Push to all remotes - -```bash -gpa -``` - diff --git a/doc/release/monthly.md b/doc/release/monthly.md deleted file mode 100644 index cfe01896d8f..00000000000 --- a/doc/release/monthly.md +++ /dev/null @@ -1,212 +0,0 @@ -# Monthly Release - -NOTE: This is a guide used by the GitLab B.V. developers. - -It starts 7 working days before the release. -The release manager doesn't have to perform all the work but must ensure someone is assigned. -The current release manager must schedule the appointment of the next release manager. -The new release manager should create overall issue to track the progress. - -## Release Manager - -A release manager is selected that coordinates all releases the coming month, including the patch releases for previous releases. -The release manager has to make sure all the steps below are done and delegated where necessary. -This person should also make sure this document is kept up to date and issues are created and updated. - -## Take vacations into account - -The time is measured in weekdays to compensate for weekends. -Do everything on time to prevent problems due to rush jobs or too little testing time. -Make sure that you take into account any vacations of maintainers. -If the release is falling behind immediately warn the team. - -## Create an overall issue and follow it - -Create issue for GitLab CE project(internal). Name it "Release x.x.x" for easier searching. -Replace the dates with actual dates based on the number of workdays before the release. -All steps from issue template are explained below - -``` -Xth: (7 working days before the 22nd) - -- [ ] Code freeze -- [ ] Update the CE changelog (#LINK) -- [ ] Update the EE changelog (#LINK) -- [ ] Update the CI changelog (#LINK) -- [ ] Triage the omnibus-gitlab milestone - -Xth: (6 working days before the 22nd) - -- [ ] Merge CE master in to EE master via merge request (#LINK) -- [ ] Determine QA person and notify this person -- [ ] Check the tasks in [how to rc1 guide](howto_rc1.md) and delegate tasks if necessary -- [ ] Create CE, EE, CI RC1 versions (#LINK) - -Xth: (5 working days before the 22nd) - -- [ ] Do QA and fix anything coming out of it (#LINK) -- [ ] Close the omnibus-gitlab milestone -- [ ] Prepare the blog post (#LINK) - -Xth: (4 working days before the 22nd) - -- [ ] Update GitLab.com with rc1 (#LINK) (https://dev.gitlab.org/cookbooks/chef-repo/blob/master/doc/administration.md#deploy-the-package) -- [ ] Update ci.gitLab.com with rc1 (#LINK) (https://dev.gitlab.org/cookbooks/chef-repo/blob/master/doc/administration.md#deploy-the-package) -- [ ] Create regression issues (CE, CI) (#LINK) -- [ ] Tweet about rc1 (#LINK) - -Xth: (3 working days before the 22nd) - -- [ ] Merge CE stable branch into EE stable branch - -Xth: (2 working days before the 22nd) - -- [ ] Check that everyone is mentioned on the blog post (the reviewer should have done this one working day ago) -- [ ] Check that MVP is added to the mvp page (source/mvp/index.html in www-gitlab-com) - -Xth: (1 working day before the 22nd) - -- [ ] Create CE, EE, CI stable versions (#LINK) -- [ ] Create Omnibus tags and build packages -- [ ] Update GitLab.com with the stable version (#LINK) -- [ ] Update ci.gitLab.com with the stable version (#LINK) - -22nd: - -- [ ] Release CE, EE and CI (#LINK) - -``` - -- - - - -## Code Freeze - -Stop merging code in master, except for important bug fixes - -## Update changelog - -Any changes not yet added to the changelog are added by lead developer and in that merge request the complete team is -asked if there is anything missing. - -There are three changelogs that need to be updated: CE, EE and CI. - -## Create RC1 (CE, EE, CI) - -[Follow this How-to guide](howto_rc1.md) to create RC1. - -## Prepare CHANGELOG for next release - -Once the stable branches have been created, update the CHANGELOG in `master` with the upcoming version, usually X.X.X.pre. - -## QA - -Create issue on dev.gitlab.org `gitlab` repository, named "GitLab X.X QA" in order to keep track of the progress. - -Use the omnibus packages created for RC1 of Enterprise Edition using [this guide](https://dev.gitlab.org/gitlab/gitlab-ee/blob/master/doc/release/manual_testing.md). - -**NOTE** Upgrader can only be tested when tags are pushed to all repositories. Do not forget to confirm it is working before releasing. Note that in the issue. - -#### Fix anything coming out of the QA - -Create an issue with description of a problem, if it is quick fix fix it yourself otherwise contact the team for advice. - -**NOTE** If there is a problem that cannot be fixed in a timely manner, reverting the feature is an option! If the feature is reverted, -create an issue about it in order to discuss the next steps after the release. - -## Update GitLab.com with RC1 - -Use the omnibus EE packages created for RC1. -If there are big database migrations consider testing them with the production db on a VM. -Try to deploy in the morning. -It is important to do this as soon as possible, so we can catch any errors before we release the full version. - -## Create a regressions issue - -On [the GitLab CE issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues/) create an issue titled "GitLab X.X regressions" add the following text: - -This is a meta issue to discuss possible regressions in this monthly release and any patch versions. -Please do not raise issues directly in this issue but link to issues that might warrant a patch release. -The decision to create a patch release or not is with the release manager who is assigned to this issue. -The release manager will comment here about the plans for patch releases. - -Assign the issue to the release manager and at mention all members of gitlab core team. If there are any known bugs in the release add them immediately. - -## Tweet about RC1 - -Tweet about the RC release: - -> GitLab x.x.0.rc1 is out. This release candidate is only suitable for testing. Please link regressions issues from LINK_TO_REGRESSION_ISSUE - -## Prepare the blog post - -1. Start with a complete copy of the [release blog template](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/doc/release_blog_template.md) and fill it out. -1. Make sure the blog post contains information about the GitLab CI release. -1. Check the changelog of CE and EE for important changes. -1. Also check the CI changelog -1. Add a proposed tweet text to the blog post WIP MR description. -1. Create a WIP MR for the blog post -1. Ask Dmitriy (or a team member with OS X) to add screenshots to the WIP MR. -1. Decide with core team who will be the MVP user. -1. Create WIP MR for adding MVP to MVP page on website -1. Add a note if there are security fixes: This release fixes an important security issue and we advise everyone to upgrade as soon as possible. -1. Create a merge request on [GitLab.com](https://gitlab.com/gitlab-com/www-gitlab-com/tree/master) -1. Assign to one reviewer who will fix spelling issues by editing the branch (either with a git client or by using the online editor) -1. Comment to the reviewer: '@person Please mention the whole team as soon as you are done (3 workdays before release at the latest)' - -## Create CE, EE, CI stable versions - -Get release tools - -``` -git clone git@dev.gitlab.org:gitlab/release-tools.git -cd release-tools -``` - -Bump version, create release tag and push to remotes: - -``` -bundle exec rake release["x.x.0"] -``` - -This will create correct version and tag and push to all CE, EE and CI remotes. - -Update [installation.md](/doc/install/installation.md) to the newest version in master. - - -## Create Omnibus tags and build packages - -Follow the [release doc in the Omnibus repository](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/release.md). -This can happen before tagging because Omnibus uses tags in its own repo and SHA1's to refer to the GitLab codebase. - -## Update GitLab.com with the stable version - -- Deploy the package (should not need downtime because of the small difference with RC1) -- Deploy the package for ci.gitlab.com - -## Release CE, EE and CI - -__1. Publish packages for new release__ - -Update `downloads/index.html` and `downloads/archive/index.html` in `www-gitlab-com` repository. - -__2. Publish blog for new release__ - -Doublecheck the everyone has been mentioned in the blog post. -Merge the [blog merge request](#1-prepare-the-blog-post) in `www-gitlab-com` repository. - -__3. Tweet to blog__ - -Send out a tweet to share the good news with the world. -List the most important features and link to the blog post. - -Proposed tweet "Release of GitLab X.X & CI Y.Y! FEATURE, FEATURE and FEATURE <link-to-blog-post> #gitlab" - -Consider creating a post on Hacker News. - -## Release new AMIs - -[Follow this guide](https://dev.gitlab.org/gitlab/AMI/blob/master/README.md) - -## Create a WIP blogpost for the next release - -Create a WIP blogpost using [release blog template](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/doc/release_blog_template.md). diff --git a/doc/release/patch.md b/doc/release/patch.md deleted file mode 100644 index 4c7b471785f..00000000000 --- a/doc/release/patch.md +++ /dev/null @@ -1,55 +0,0 @@ -# Things to do when doing a patch release - -NOTE: This is a guide for GitLab developers. If you are trying to install GitLab see the latest stable [installation guide](install/installation.md) and if you are trying to upgrade, see the [upgrade guides](update). - -## When to do a patch release - -Do a patch release when there is a critical regression that needs to be addresses before the next monthly release. - -Otherwise include it in the monthly release and note there was a regression fix in the release announcement. - -## Release Procedure - -### Preparation - -1. Verify that the issue can be reproduced -1. Note in the 'GitLab X.X regressions' that you will create a patch -1. Create an issue on private GitLab development server -1. Name the issue "Release X.X.X CE and X.X.X EE", this will make searching easier -1. Fix the issue on a feature branch, do this on the private GitLab development server -1. If it is a security issue, then assign it to the release manager and apply a 'security' label -1. Consider creating and testing workarounds -1. After the branch is merged into master, cherry pick the commit(s) into the current stable branch -1. Make sure that the build has passed and all tests are passing -1. In a separate commit in the master branch update the CHANGELOG -1. For EE, update the CHANGELOG-EE if it is EE specific fix. Otherwise, merge the stable CE branch and add to CHANGELOG-EE "Merge community edition changes for version X.X.X" -1. Merge CE stable branch into EE stable branch - - -### Bump version - -Get release tools - -``` -git clone git@dev.gitlab.org:gitlab/release-tools.git -cd release-tools -``` - -Bump all versions in stable branch, even if the changes affect only EE, CE, or CI. Since all the versions are synced now, -it doesn't make sense to say upgrade CE to 7.2, EE to 7.3 and CI to 7.1. - -Create release tag and push to remotes: - -``` -bundle exec rake release["x.x.x"] -``` - -### Release - -1. [Build new packages with the latest version](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/release.md) -1. Apply the patch to GitLab.com and the private GitLab development server -1. Apply the patch to ci.gitLab.com and the private GitLab CI development server -1. Create and publish a blog post, see [patch release blog template](https://gitlab.com/gitlab-com/www-gitlab-com/blob/master/doc/patch_release_blog_template.md) -1. Send tweets about the release from `@gitlab`, tweet should include the most important feature that the release is addressing and link to the blog post -1. Note in the 'GitLab X.X regressions' issue that the patch was published (CE only) -1. [Create new AMIs](https://dev.gitlab.org/gitlab/AMI/blob/master/README.md) diff --git a/doc/release/security.md b/doc/release/security.md deleted file mode 100644 index 60bcfbb6da5..00000000000 --- a/doc/release/security.md +++ /dev/null @@ -1,76 +0,0 @@ -# Things to do when doing an out-of-bound security release - -NOTE: This is a guide for GitLab developers. If you are trying to install GitLab see the latest stable [installation guide](install/installation.md) and if you are trying to upgrade, see the [upgrade guides](update). - -## When to do a security release - -Do a security release when there is a critical issue that needs to be addresses before the next monthly release. Otherwise include it in the monthly release and note there was a security fix in the release announcement. - -## Security vulnerability disclosure - -Please report suspected security vulnerabilities in private to , also see the [disclosure section on the GitLab.com website](http://about.gitlab.com/disclosure/). Please do NOT create publicly viewable issues for suspected security vulnerabilities. - -## Release Procedure - -1. Verify that the issue can be reproduced -1. Acknowledge the issue to the researcher that disclosed it -1. Inform the release manager that there needs to be a security release -1. Do the steps from [patch release document](doc/release/patch.md), starting with "Create an issue on private GitLab development server" -1. The MR with the security fix should get a 'security' label and be assigned to the release manager -1. Build the package for GitLab.com and do a deploy -1. Build the package for ci.gitLab.com and do a deploy -1. [Create new AMIs](https://dev.gitlab.org/gitlab/AMI/blob/master/README.md) -1. Create feature branches for the blog post on GitLab.com and link them from the code branch -1. Merge and publish the blog posts -1. Send tweets about the release from `@gitlabhq` -1. Send out an email to [the community google mailing list](https://groups.google.com/forum/#!forum/gitlabhq) -1. Post a signed copy of our complete announcement to [oss-security](http://www.openwall.com/lists/oss-security/) and request a CVE number. CVE is only needed for bugs that allow someone to own the server (Remote Code Execution) or access to code of projects they are not a member of. -1. Add the security researcher to the [Security Researcher Acknowledgments list](http://about.gitlab.com/vulnerability-acknowledgements/) -1. Thank the security researcher in an email for their cooperation -1. Update the blog post and the CHANGELOG when we receive the CVE number - -The timing of the code merge into master should be coordinated in advance. - -After the merge we strive to publish the announcements within 60 minutes. - -## Blog post template - -XXX Security Advisory for GitLab - -A recently discovered critical vulnerability in GitLab allows [unauthenticated API access|remote code execution|unauthorized access to repositories|XXX|PICKSOMETHING]. All users should update GitLab and gitlab-shell immediately. We [have|haven't|XXX|PICKSOMETHING|] heard of this vulnerability being actively exploited. - -### Version affected - -GitLab Community Edition XXX and lower - -GitLab Enterprise Edition XXX and lower - -### Fixed versions - -GitLab Community Edition XXX and up - -GitLab Enterprise Edition XXX and up - -### Impact - -On GitLab installations which use MySQL as their database backend it is possible for an attacker to assume the identity of any existing GitLab user in certain API calls. This attack can be performed by [unauthenticated|authenticated|XXX|PICKSOMETHING] users. - -### Workarounds - -If you are unable to upgrade you should apply the following patch and restart GitLab. - -XXX - -### Credit - -We want to thank XXX of XXX for the responsible disclosure of this vulnerability. - -## Email template - -We just announced a security advisory for GitLab at XXX - -Please contact us at support@gitlab.com if you have any questions. - -## Tweet template - -We just announced a security advisory for GitLab at XXX diff --git a/doc/security/README.md b/doc/security/README.md deleted file mode 100644 index 49dfa6eec76..00000000000 --- a/doc/security/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Security - -- [Password length limits](password_length_limits.md) -- [Rack attack](rack_attack.md) -- [Web Hooks and insecure internal web services](webhooks.md) -- [Information exclusivity](information_exclusivity.md) diff --git a/doc/security/information_exclusivity.md b/doc/security/information_exclusivity.md deleted file mode 100644 index f8e7fc3fd0e..00000000000 --- a/doc/security/information_exclusivity.md +++ /dev/null @@ -1,9 +0,0 @@ -# Information exclusivity - -Git is a distributed version control system (DVCS). -This means that everyone that works with the source code has a local copy of the complete repository. -In GitLab every project member that is not a guest (so reporters, developers and masters) can clone the repository to get a local copy. -After obtaining this local copy the user can upload the full repository anywhere, including another project under their control or another server. -The consequence is that you can't build access controls that prevent the intentional sharing of source code by users that have access to the source code. -This is an inherent feature of a DVCS and all git management systems have this limitation. -Obviously you can take steps to prevent unintentional sharing and information destruction, this is why only some people are allowed to invite others and nobody can force push a protected branch. diff --git a/doc/security/password_length_limits.md b/doc/security/password_length_limits.md deleted file mode 100644 index d21b26a43e8..00000000000 --- a/doc/security/password_length_limits.md +++ /dev/null @@ -1,11 +0,0 @@ -# Custom password length limits - -If you want to enforce longer user passwords you can create an extra Devise initializer with the steps below. - -If you do not use the `devise_password_length.rb` initializer the password length is set to a minimum of 8 characters in `config/initializers/devise.rb`. - -```bash -cd /home/git/gitlab -sudo -u git -H cp config/initializers/devise_password_length.rb.example config/initializers/devise_password_length.rb -sudo -u git -H editor config/initializers/devise_password_length.rb # inspect and edit the new password length limits -``` diff --git a/doc/security/rack_attack.md b/doc/security/rack_attack.md deleted file mode 100644 index 92066997be8..00000000000 --- a/doc/security/rack_attack.md +++ /dev/null @@ -1,25 +0,0 @@ -# Rack attack - -To prevent abusive clients doing damage GitLab uses rack-attack gem. - -If you installed or upgraded GitLab by following the official guides this should be enabled by default. - -If you are missing `config/initializers/rack_attack.rb` the following steps need to be taken in order to enable protection for your GitLab instance: - -1. In config/application.rb find and uncomment the following line: - - config.middleware.use Rack::Attack - -1. Rename `config/initializers/rack_attack.rb.example` to `config/initializers/rack_attack.rb`. - -1. Review the `paths_to_be_protected` and add any other path you need protecting. - -1. Restart GitLab instance. - -By default, user sign-in, user sign-up(if enabled) and user password reset is limited to 6 requests per minute. After trying for 6 times, client will have to wait for the next minute to be able to try again. These settings can be found in `config/initializers/rack_attack.rb` - -If you want more restrictive/relaxed throttle rule change the `limit` or `period` values. For example, more relaxed throttle rule will be if you set limit: 3 and period: 1.second(this will allow 3 requests per second). You can also add other paths to the protected list by adding to `paths_to_be_protected` variable. If you change any of these settings do not forget to restart your GitLab instance. - -In case you find throttling is not enough to protect you against abusive clients, rack-attack gem offers IP whitelisting, blacklisting, Fail2ban style filter and tracking. - -For more information on how to use these options check out [rack-attack README](https://github.com/kickstarter/rack-attack/blob/master/README.md). diff --git a/doc/security/webhooks.md b/doc/security/webhooks.md deleted file mode 100644 index 1e9d33e87c3..00000000000 --- a/doc/security/webhooks.md +++ /dev/null @@ -1,13 +0,0 @@ -# Web Hooks and insecure internal web services - -If you have non-GitLab web services running on your GitLab server or within its local network, these may be vulnerable to exploitation via Web Hooks. - -With [Web Hooks](../web_hooks/web_hooks.md), you and your project masters and owners can set up URLs to be triggered when specific things happen to projects. Normally, these requests are sent to external web services specifically set up for this purpose, that process the request and its attached data in some appropriate way. - -Things get hairy, however, when a Web Hook is set up with a URL that doesn't point to an external, but to an internal service, that may do something completely unintended when the web hook is triggered and the POST request is sent. - -Because Web Hook requests are made by the GitLab server itself, these have complete access to everything running on the server (http://localhost:123) or within the server's local network (http://192.168.1.12:345), even if these services are otherwise protected and inaccessible from the outside world. - -If a web service does not require authentication, Web Hooks can be used to trigger destructive commands by getting the GitLab server to make POST requests to endpoints like "http://localhost:123/some-resource/delete". - -To prevent this type of exploitation from happening, make sure that you are aware of every web service GitLab could potentially have access to, and that all of these are set up to require authentication for every potentially destructive command. Enabling authentication but leaving a default password is not enough. \ No newline at end of file diff --git a/doc/ssh/README.md b/doc/ssh/README.md deleted file mode 100644 index 0acb15896d3..00000000000 --- a/doc/ssh/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# SSH - -## SSH keys - -An SSH key allows you to establish a secure connection between your -computer and GitLab. - -Before generating an SSH key, check if your system already has one by -running `cat ~/.ssh/id_rsa.pub`. If you see a long string starting with -`ssh-rsa` or `ssh-dsa`, you can skip the ssh-keygen step. - -To generate a new SSH key, just open your terminal and use code below. The -ssh-keygen command prompts you for a location and filename to store the key -pair and for a password. When prompted for the location and filename, you -can press enter to use the default. - -It is a best practice to use a password for an SSH key, but it is not -required and you can skip creating a password by pressing enter. Note that -the password you choose here can't be altered or retrieved. - -```bash -ssh-keygen -t rsa -C "$your_email" -``` - -Use the code below to show your public key. - -```bash -cat ~/.ssh/id_rsa.pub -``` - -Copy-paste the key to the 'My SSH Keys' section under the 'SSH' tab in your -user profile. Please copy the complete key starting with `ssh-` and ending -with your username and host. - -Use code below to copy your public key to the clipboard. Depending on your -OS you'll need to use a different command: - -**Windows:** -```bash -clip < ~/.ssh/id_rsa.pub -``` - -**Mac:** -```bash -pbcopy < ~/.ssh/id_rsa.pub -``` - -**GNU/Linux (requires xclip):** -```bash -xclip -sel clip < ~/.ssh/id_rsa.pub -``` - -## Deploy keys - -Deploy keys allow read-only access to multiple projects with a single SSH -key. - -This is really useful for cloning repositories to your Continuous -Integration (CI) server. By using deploy keys, you don't have to setup a -dummy user account. - -If you are a project master or owner, you can add a deploy key in the -project settings under the section 'Deploy Keys'. Press the 'New Deploy -Key' button and upload a public SSH key. After this, the machine that uses -the corresponding private key has read-only access to the project. - -You can't add the same deploy key twice with the 'New Deploy Key' option. -If you want to add the same key to another project, please enable it in the -list that says 'Deploy keys from projects available to you'. All the deploy -keys of all the projects you have access to are available. This project -access can happen through being a direct member of the project, or through -a group. See `def accessible_deploy_keys` in `app/models/user.rb` for more -information. diff --git a/doc/system_hooks/system_hooks.md b/doc/system_hooks/system_hooks.md deleted file mode 100644 index f9b6d37d840..00000000000 --- a/doc/system_hooks/system_hooks.md +++ /dev/null @@ -1,180 +0,0 @@ -# System hooks - -Your GitLab instance can perform HTTP POST requests on the following events: `project_create`, `project_destroy`, `user_add_to_team`, `user_remove_from_team`, `user_create`, `user_destroy`, `key_create`, `key_destroy`, `group_create`, `group_destroy`, `user_add_to_group` and `user_remove_from_group`. - -System hooks can be used, e.g. for logging or changing information in a LDAP server. - -## Hooks request example - -**Project created:** - -```json -{ - "created_at": "2012-07-21T07:30:54Z", - "event_name": "project_create", - "name": "StoreCloud", - "owner_email": "johnsmith@gmail.com", - "owner_name": "John Smith", - "path": "storecloud", - "path_with_namespace": "jsmith/storecloud", - "project_id": 74, - "project_visibility": "private", -} -``` - -**Project destroyed:** - -```json -{ - "created_at": "2012-07-21T07:30:58Z", - "event_name": "project_destroy", - "name": "Underscore", - "owner_email": "johnsmith@gmail.com", - "owner_name": "John Smith", - "path": "underscore", - "path_with_namespace": "jsmith/underscore", - "project_id": 73, - "project_visibility": "internal", -} -``` - -**New Team Member:** - -```json -{ - "created_at": "2012-07-21T07:30:56Z", - "event_name": "user_add_to_team", - "project_access": "Master", - "project_id": 74, - "project_name": "StoreCloud", - "project_path": "storecloud", - "user_email": "johnsmith@gmail.com", - "user_name": "John Smith", - "user_id": 41, - "project_visibility": "private", -} -``` - -**Team Member Removed:** - -```json -{ - "created_at": "2012-07-21T07:30:56Z", - "event_name": "user_remove_from_team", - "project_access": "Master", - "project_id": 74, - "project_name": "StoreCloud", - "project_path": "storecloud", - "user_email": "johnsmith@gmail.com", - "user_name": "John Smith", - "user_id": 41, - "project_visibility": "private", -} -``` - -**User created:** - -```json -{ - "created_at": "2012-07-21T07:44:07Z", - "email": "js@gitlabhq.com", - "event_name": "user_create", - "name": "John Smith", - "user_id": 41 -} -``` - -**User removed:** - -```json -{ - "created_at": "2012-07-21T07:44:07Z", - "email": "js@gitlabhq.com", - "event_name": "user_destroy", - "name": "John Smith", - "user_id": 41 -} -``` - -**Key added** - -```json -{ - "event_name": "key_create", - "created_at": "2014-08-18 18:45:16 UTC", - "username": "root", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost", - "id": 4 -} -``` - -**Key removed** - -```json -{ - "event_name": "key_destroy", - "created_at": "2014-08-18 18:45:16 UTC", - "username": "root", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC58FwqHUbebw2SdT7SP4FxZ0w+lAO/erhy2ylhlcW/tZ3GY3mBu9VeeiSGoGz8hCx80Zrz+aQv28xfFfKlC8XQFpCWwsnWnQqO2Lv9bS8V1fIHgMxOHIt5Vs+9CAWGCCvUOAurjsUDoE2ALIXLDMKnJxcxD13XjWdK54j6ZXDB4syLF0C2PnAQSVY9X7MfCYwtuFmhQhKaBussAXpaVMRHltie3UYSBUUuZaB3J4cg/7TxlmxcNd+ppPRIpSZAB0NI6aOnqoBCpimscO/VpQRJMVLr3XiSYeT6HBiDXWHnIVPfQc03OGcaFqOit6p8lYKMaP/iUQLm+pgpZqrXZ9vB john@localhost", - "id": 4 -} -``` - -**Group created:** - -```json -{ - "created_at": "2012-07-21T07:30:54Z", - "event_name": "group_create", - "name": "StoreCloud", - "owner_email": "johnsmith@gmail.com", - "owner_name": "John Smith", - "path": "storecloud", - "group_id": 78 -} -``` - -**Group removed:** - -```json -{ - "created_at": "2012-07-21T07:30:54Z", - "event_name": "group_destroy", - "name": "StoreCloud", - "owner_email": "johnsmith@gmail.com", - "owner_name": "John Smith", - "path": "storecloud", - "group_id": 78 -} -``` - -**New Group Member:** - -```json -{ - "created_at": "2012-07-21T07:30:56Z", - "event_name": "user_add_to_group", - "group_access": "Master", - "group_id": 78, - "group_name": "StoreCloud", - "group_path": "storecloud", - "user_email": "johnsmith@gmail.com", - "user_name": "John Smith", - "user_id": 41 -} -``` -**Group Member Removed:** - -```json -{ - "created_at": "2012-07-21T07:30:56Z", - "event_name": "user_remove_from_group", - "group_access": "Master", - "group_id": 78, - "group_name": "StoreCloud", - "group_path": "storecloud", - "user_email": "johnsmith@gmail.com", - "user_name": "John Smith", - "user_id": 41 -} -``` diff --git a/doc/update/2.6-to-3.0.md b/doc/update/2.6-to-3.0.md deleted file mode 100644 index 4827ef9501a..00000000000 --- a/doc/update/2.6-to-3.0.md +++ /dev/null @@ -1,62 +0,0 @@ -# From 2.6 to 3.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/2.6-to-3.0.md) for the most up to date instructions.* - -## 1. Stop server & resque - - sudo service gitlab stop - -## 2. Update code & db - - -```bash -# Get latest code -git fetch origin -git checkout v3.0.3 - - -# Install libs -sudo -u gitlab bundle install --without development test postgres - -# update db -sudo -u gitlab bundle exec rake db:migrate RAILS_ENV=production - -# !!! Config should be replaced with a new one. Check it after replace -cp config/gitlab.yml.example config/gitlab.yml - -# update Gitolite hooks - -# Gitolite v2: -sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive -sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive - -# Gitolite v3: -sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive -sudo chown git:git /home/git/.gitolite/hooks/common/post-receive - -# set valid path to hooks in gitlab.yml in git_host section -# like this -git_host: - # Gitolite 2 - hooks_path: /home/git/share/gitolite/hooks - # Gitolite 3 - hooks_path: /home/git/.gitolite/hooks/ - - -# Make some changes to Gitolite config -# For more information visit https://github.com/gitlabhq/gitlabhq/pull/1719 - -# Gitolite v2 -sudo -u git -H sed -i 's/\(GL_GITCONFIG_KEYS\s*=>*\s*\).\{2\}/\\1"\.\*"/g' /home/git/.gitolite.rc - -# gitlite v3 -sudo -u git -H sed -i "s/\(GIT_CONFIG_KEYS\s*=>*\s*\).\{2\}/\\1'\.\*'/g" /home/git/.gitolite.rc - - -# Check app status -sudo -u gitlab bundle exec rake gitlab:app:status RAILS_ENV=production - -``` - -## 3. Start all - - sudo service gitlab start diff --git a/doc/update/2.9-to-3.0.md b/doc/update/2.9-to-3.0.md deleted file mode 100644 index f4a997a8c5e..00000000000 --- a/doc/update/2.9-to-3.0.md +++ /dev/null @@ -1,37 +0,0 @@ -# From 2.9 to 3.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/2.9-to-3.0.md) for the most up to date instructions.* - -## 1. Stop server & resque - - sudo service gitlab stop - -## 2. Follow instructions - -```bash - -# Get latest code -sudo -u gitlab -H git fetch origin -sudo -u gitlab -H git checkout v3.0.3 - -# Install gems -sudo -u gitlab -H bundle install --without development test postgres - -# Migrate db -sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production - -# Make some changes to gitolite v3 config -# For more information visit https://github.com/gitlabhq/gitlabhq/pull/1719 - -# Gitolite version 3 -sudo -u git -H sed -i "s/\(GIT_CONFIG_KEYS\s*=>*\s*\).\{2\}/\\1'\.\*'/g" /home/git/.gitolite.rc - -# If you still use gitolite v2 -sudo -u git -H sed -i 's/\(GL_GITCONFIG_KEYS\s*=>*\s*\).\{2\}/\\1"\.\*"/g' /home/git/.gitolite.rc - -# Check APP Status -sudo -u gitlab -H bundle exec rake gitlab:app:status RAILS_ENV=production -``` - -## 3. Start all - - sudo service gitlab start diff --git a/doc/update/3.0-to-3.1.md b/doc/update/3.0-to-3.1.md deleted file mode 100644 index a30485c42f7..00000000000 --- a/doc/update/3.0-to-3.1.md +++ /dev/null @@ -1,97 +0,0 @@ -# From 3.0 to 3.1 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/3.0-to-3.1.md) for the most up to date instructions.* - -**IMPORTANT!** - -In this release **we moved Resque jobs under own gitlab namespace** - -Despite a lot of advantages it requires from our users to **replace gitolite post-receive hook with new one**. - -Most of projects has post-receive file as symlink to gitolite `/home/git/.gitolite/hooks/post-receive`. But some of them may have a real file. In this case you should rewrite it with symlink to gitolite hook. - -I wrote a bash script which will do it automatically for you. Just make sure all path inside is valid for you - -## 1. Stop server & resque - - sudo service gitlab stop - -## 2. Update GitLab - -```bash -# Get latest code -sudo -u gitlab -H git fetch -sudo -u gitlab -H git checkout v3.1.0 - -# Install new charlock_holmes -sudo gem install charlock_holmes --version '0.6.9' - -# Install gems for MySQL -sudo -u gitlab -H bundle install --without development test postgres sqlite - - -# Migrate db -sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production - -``` - -## 3. Update post-receive hooks - -### Gitolite 3 - -Step 1: Rewrite post-receive hook - -```bash -# Rewrite hook for gitolite 3 -sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive -sudo chown git:git /home/git/.gitolite/hooks/common/post-receive -``` - -Step 2: Rewrite hooks in all projects to symlink gitolite hook - -```bash -# 1. Check for valid path -sudo -u gitlab -H vim lib/support/rewrite-hooks.sh - -# 2. Run script -sudo -u git -H lib/support/rewrite-hooks.sh -``` - -### Gitolite v2 - -Step 1: rewrite post-receive hook for gitolite 2 - -``` -sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive -sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive -``` - -Step 2: Replace symlinks in project to valid place - - #!/bin/bash - src="/home/git/repositories" - for dir in `ls "$src/"` - do - if [ -d "$src/$dir" ]; then - - if [ "$dir" = "gitolite-admin.git" ] - then - continue - fi - - project_hook="$src/$dir/hooks/post-receive" - gitolite_hook="/home/git/share/gitolite/hooks/common/post-receive" - - ln -s -f $gitolite_hook $project_hook - fi - done - -## 4. Check app status - -```bash -# Check APP Status -sudo -u gitlab -H bundle exec rake gitlab:app:status RAILS_ENV=production -``` - -## 5. Start all - - sudo service gitlab start diff --git a/doc/update/3.1-to-4.0.md b/doc/update/3.1-to-4.0.md deleted file mode 100644 index f1ef4df4744..00000000000 --- a/doc/update/3.1-to-4.0.md +++ /dev/null @@ -1,90 +0,0 @@ -# From 3.1 to 4.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/3.1-to-4.0.md) for the most up to date instructions.* - -## Important changes - -- Support for SQLite was dropped -- Support for Gitolite 2 was dropped -- Projects are organized in namespaces -- The GitLab post-receive hook needs to be updated -- The configuration file needs to be updated -- Availability of `python2` executable - -Most of projects has post-receive file as symlink to Gitolite `/home/git/.gitolite/hooks/post-receive`. But some of them may have a real file. In this case you should rewrite it with symlink to Gitolite hook. - -I wrote a bash script which will do it automatically for you. Just make sure all path inside is valid for you - -## 1. Stop GitLab & Resque - - sudo service gitlab stop - -## 2. Update GitLab - -```bash - -# Get latest code -sudo -u gitlab -H git fetch -sudo -u gitlab -H git checkout 4-0-stable - -# Install gems for MySQL -sudo -u gitlab -H bundle install --without development test postgres - -# Update repos permissions -sudo chmod -R ug+rwXs /home/git/repositories/ -sudo chown -R git:git /home/git/repositories/ - -# Migrate db -sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production - -# Enable namespaces (**Warning!** All projects in groups will be moved to subdirectories) -sudo -u gitlab -H bundle exec rake gitlab:enable_namespaces RAILS_ENV=production - -``` - -## 3. Update post-receive hooks (Requires Gitolite v3 ) - -Step 1: Rewrite post-receive hook - -```bash -sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive -sudo chown git:git /home/git/.gitolite/hooks/common/post-receive -``` - -Step 2: Update project hooks to be symlinks to the Gitolite hook - -```bash -# 1. Check paths in script -sudo -u gitlab -H vim lib/support/rewrite-hooks.sh - -# 2. Run script -sudo -u git -H lib/support/rewrite-hooks.sh -``` - -## 4. Replace config with new one - - # backup old one - sudo -u gitlab -H cp config/gitlab.yml config/gitlab.yml.old - - # copy new one - sudo -u gitlab -H cp config/gitlab.yml.example config/gitlab.yml - - # edit it - sudo -u gitlab -H vim config/gitlab.yml - -## 5. Disable ssh known_host check for own domain - - echo "Host localhost - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config - - echo "Host YOUR_DOMAIN_NAME - StrictHostKeyChecking no - UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config - -## 6. Check GitLab's status - - sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production - -## 7. Start GitLab & Resque - - sudo service gitlab start diff --git a/doc/update/4.0-to-4.1.md b/doc/update/4.0-to-4.1.md deleted file mode 100644 index d89d5235917..00000000000 --- a/doc/update/4.0-to-4.1.md +++ /dev/null @@ -1,56 +0,0 @@ -# From 4.0 to 4.1 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/4.0-to-4.1.md) for the most up to date instructions.* - -## Important changes - -- Resque replaced with Sidekiq -- New options for configuration file added -- Init.d script should be updated -- **requires ruby1.9.3-p327** - -## 1. Stop GitLab & Resque - - sudo service gitlab stop - -## 2. Update GitLab - -```bash -# Set the working directory -cd /home/gitlab/gitlab/ - -# Get latest code -sudo -u gitlab -H git fetch -sudo -u gitlab -H git checkout 4-1-stable - -# Install gems for MySQL -sudo -u gitlab -H bundle install --without development test postgres - -# Migrate db -sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production - -``` - -## 3. Replace init.d script with a new one - -``` -# backup old one -sudo mv /etc/init.d/gitlab /etc/init.d/gitlab.old - -# get new one using sidekiq -sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/4-1-stable/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab - -``` - -## 4. Check GitLab's status - - sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production - - -## 5. Start GitLab & Sidekiq - - sudo service gitlab start - -## 6. Remove old init.d script - - sudo rm /etc/init.d/gitlab.old diff --git a/doc/update/4.1-to-4.2.md b/doc/update/4.1-to-4.2.md deleted file mode 100644 index 6fe4412ff90..00000000000 --- a/doc/update/4.1-to-4.2.md +++ /dev/null @@ -1,36 +0,0 @@ -# From 4.1 to 4.2 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/4.1-to-4.2.md) for the most up to date instructions.* - -## 1. Stop server & Resque - - sudo service gitlab stop - -## 2. Update code & DB - -```bash - -#Set the working directory -cd /home/gitlab/gitlab/ - -# Get latest code -sudo -u gitlab -H git fetch - -sudo -u gitlab -H git checkout 4-2-stable - -# Install libs -sudo -u gitlab -H bundle install --without development test postgres --deployment - -# update db -sudo -u gitlab -H bundle exec rake db:migrate RAILS_ENV=production - -``` - -## 3. Check GitLab's status - -```bash -sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production -``` - -## 4. Start all - - sudo service gitlab start diff --git a/doc/update/4.2-to-5.0.md b/doc/update/4.2-to-5.0.md deleted file mode 100644 index f9faf65f952..00000000000 --- a/doc/update/4.2-to-5.0.md +++ /dev/null @@ -1,211 +0,0 @@ -# From 4.2 to 5.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/4.2-to-5.0.md) for the most up to date instructions.* - -## Warning - -GitLab 5.0 is affected by critical security vulnerability CVE-2013-4490. - -## Important changes - -- We don't use `gitlab` user any more. Everything will be moved to `git` user -- Self signed SSL certificates are not supported until GitLab 5.1 -- **requires ruby1.9.3** - -## 0. Stop GitLab - - sudo service gitlab stop - -## 1. add bash to git user - -``` -sudo chsh -s /bin/bash git -``` - -## 2. git clone gitlab-shell - -``` -cd /home/git/ -sudo -u git -H git clone https://github.com/gitlabhq/gitlab-shell.git /home/git/gitlab-shell -``` - -## 3. setup gitlab-shell - -```bash -# chmod all repos and files under git -sudo chown git:git -R /home/git/repositories/ - -# login as git -sudo su git -cd /home/git/gitlab-shell -git checkout v1.1.0 - -# copy config -cp config.yml.example config.yml - -# change URL to GitLab instance -# ! make sure the URL ends with '/' like 'https://gitlab.example/' -vim config.yml - -# rewrite hooks -./support/rewrite-hooks.sh - -# check ruby version for git user ( 1.9 required!! ) -# GitLab shell requires system ruby 1.9 -ruby -v - -# exit from git user -exit -``` - -## 4. Copy GitLab instance to git user - -```bash -sudo cp -R /home/gitlab/gitlab /home/git/gitlab -sudo chown git:git -R /home/git/gitlab -sudo rm -rf /home/gitlab/gitlab-satellites - -# if exists -sudo rm /tmp/gitlab.socket -``` - -## 5. Update GitLab to recent version - -```bash -cd /home/git/gitlab - -# backup current config -sudo -u git -H cp config/gitlab.yml config/gitlab.yml.old - -sudo -u git -H git fetch -sudo -u git -H git checkout 5-0-stable - -# replace config with recent one -sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml - -# edit it -sudo -u git -H vim config/gitlab.yml - - -sudo -u git -H bundle install --without development test postgres --deployment -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production -sudo -u git -H bundle exec rake gitlab:shell:build_missing_projects RAILS_ENV=production - -sudo -u git -H mkdir -p /home/git/gitlab-satellites -sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production - -# migrate wiki to git -sudo -u git -H bundle exec rake gitlab:wiki:migrate RAILS_ENV=production - - -# check permissions for /home/git/.ssh/ -sudo -u git -H chmod 700 /home/git/.ssh -sudo -u git -H chmod 600 /home/git/.ssh/authorized_keys - -# check permissions for /home/git/gitlab/ -sudo chown -R git /home/git/gitlab/log/ -sudo chown -R git /home/git/gitlab/tmp/ -sudo chmod -R u+rwX /home/git/gitlab/log/ -sudo chmod -R u+rwX /home/git/gitlab/tmp/ -sudo -u git -H mkdir -p /home/git/gitlab/tmp/pids/ -sudo chmod -R u+rwX /home/git/gitlab/tmp/pids - -``` - -## 6. Update init.d script and Nginx config - -```bash -# init.d -sudo rm /etc/init.d/gitlab -sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-0-stable/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab - -# unicorn -sudo -u git -H cp /home/git/gitlab/config/unicorn.rb /home/git/gitlab/config/unicorn.rb.old -sudo -u git -H cp /home/git/gitlab/config/unicorn.rb.example /home/git/gitlab/config/unicorn.rb - -# Nginx -# Replace path from '/home/gitlab/' to '/home/git/' -sudo vim /etc/nginx/sites-enabled/gitlab -sudo service nginx restart - -``` - -## 7. Start GitLab instance - -``` -sudo service gitlab start - -# check if unicorn and sidekiq started -# If not try to logout, also check replaced path from '/home/gitlab/' to '/home/git/' -# in Nginx, unicorn, init.d etc -ps aux | grep unicorn -ps aux | grep sidekiq - -``` - -## 8. Check installation - - -```bash -# In 5-10 seconds lets check gitlab-shell -sudo -u git -H /home/git/gitlab-shell/bin/check - -# Example of success output -# Check GitLab API access: OK -# Check directories and files: -# /home/git/repositories: OK -# /home/git/.ssh/authorized_keys: OK - - -# Now check GitLab instance -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -``` - -## 9. Cleanup - -**If everything works as expected you can cleanup some old things** -Recommend you wait a bit and do a backup before completing the following. - -```bash -# remove GitLab user from system -sudo userdel -r gitlab - -cd /home/git - -# cleanup .profile -## remove text from .profile added during gitolite installation: -## PATH=\$PATH:/home/git/bin -## export PATH -## to see what a clean .profile for new users on your system would look like see /etc/skel/.profile -sudo -u git -H vim .profile - -# remove gitolite -sudo rm -R bin -sudo rm -Rf gitolite -sudo rm -R .gitolite -sudo rm .gitolite.rc -sudo rm -f gitlab.pub -sudo rm projects.list - -# reset tmp folders -sudo service gitlab stop -cd /home/git/gitlab -sudo rm -R tmp -sudo -u git -H mkdir tmp -sudo chmod -R u+rwX tmp/ - -# create directory for pids, make sure GitLab can write to it -sudo -u git -H mkdir tmp/pids/ -sudo chmod -R u+rwX tmp/pids/ - -# if you are already running a newer version of GitLab check that installation guide for other tmp folders you need to create - -# reboot system -sudo reboot - -# login, check that GitLab is running fine -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production -``` diff --git a/doc/update/5.0-to-5.1.md b/doc/update/5.0-to-5.1.md deleted file mode 100644 index 9fbd1f88515..00000000000 --- a/doc/update/5.0-to-5.1.md +++ /dev/null @@ -1,91 +0,0 @@ -# From 5.0 to 5.1 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.0-to-5.1.md) for the most up to date instructions.* - -## Warning - -GitLab 5.1 is affected by critical security vulnerability CVE-2013-4490. - -## Release notes - -- `unicorn` replaced with `puma` -- merge request cached diff will be truncated - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 5-1-stable -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.3.0 -# replace your old config with the new one -sudo -u git -H mv config.yml config.yml.old -sudo -u git -H cp config.yml.example config.yml -# edit options to match old config -sudo -u git -H vi config.yml -``` - -## 4. Install libs, migrations etc - -```bash -cd /home/git/gitlab -sudo rm tmp/sockets/gitlab.socket -sudo -u git -H cp config/puma.rb.example config/puma.rb - -sudo -u git -H bundle install --without development test postgres --deployment -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_merge_requests RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 5. Update init.d script with a new one - -```bash -# init.d -sudo rm /etc/init.d/gitlab -sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/5-1-stable/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 6. MySQL grant privileges - -Only if you are using MySQL: - -```bash -mysql -u root -p -mysql> GRANT LOCK TABLES ON `gitlabhq_production`.* TO 'gitlab'@'localhost'; -mysql> \q -``` - -## 7. Start application - - sudo service gitlab start - -## 8. Check installation - - -```bash -# In 5-10 seconds lets check gitlab-shell -sudo -u git -H /home/git/gitlab-shell/bin/check - -# Example of success output -# Check GitLab API access: OK -# Check directories and files: -# /home/git/repositories: OK -# /home/git/.ssh/authorized_keys: OK - - -# Now check gitlab instance -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -``` diff --git a/doc/update/5.1-to-5.2.md b/doc/update/5.1-to-5.2.md deleted file mode 100644 index cf9c4e4f770..00000000000 --- a/doc/update/5.1-to-5.2.md +++ /dev/null @@ -1,104 +0,0 @@ -# From 5.1 to 5.2 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.1-to-5.2.md) for the most up to date instructions.* - -## Warning - -GitLab 5.2 is affected by critical security vulnerabilities CVE-2013-4490 and CVE-2013-4489. - -## 0. Backup - -It's useful to make a backup just in case things go south: -(With MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version) - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 5-2-stable -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.4.0 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 5. Update config files - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-2-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/puma.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-2-stable/config/puma.rb.example but with your settings. - -## 6. Update Init script - -```bash -cd /home/git/gitlab -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 7. Create uploads directory - -```bash -cd /home/git/gitlab -sudo -u git -H mkdir public/uploads -sudo chmod -R u+rwX public/uploads -``` - -## 8. Start application - - sudo service gitlab start - sudo service nginx restart - -## 9. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (5.1) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.0 to 5.1](5.0-to-5.1.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/5.1-to-5.4.md b/doc/update/5.1-to-5.4.md deleted file mode 100644 index 97a98ede070..00000000000 --- a/doc/update/5.1-to-5.4.md +++ /dev/null @@ -1,100 +0,0 @@ -# From 5.1 to 5.4 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.1-to-5.4.md) for the most up to date instructions.* - -Also works starting from 5.2. - -## 0. Backup - -It's useful to make a backup just in case things go south (with MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version): - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 5-4-stable # Latest version of 5-4-stable addresses CVE-2013-4489 -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 # Addresses multiple critical security vulnerabilities -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 5. Update config files - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/puma.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/puma.rb.example but with your settings. - -## 6. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 7. Create uploads directory - -```bash -cd /home/git/gitlab -sudo -u git -H mkdir public/uploads -sudo chmod -R u+rwX public/uploads -``` - -## 8. Start application - - sudo service gitlab start - sudo service nginx restart - -## 9. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (5.3) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.2 to 5.3](5.2-to-5.3.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/5.1-to-6.0.md b/doc/update/5.1-to-6.0.md deleted file mode 100644 index a3fdd92bd2f..00000000000 --- a/doc/update/5.1-to-6.0.md +++ /dev/null @@ -1,216 +0,0 @@ -# From 5.1 to 6.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.1-to-6.0.md) for the most up to date instructions.* - -## Warning - -GitLab 6.0 is affected by critical security vulnerabilities CVE-2013-4490 and CVE-2013-4489. - -## Deprecations - -### Global projects - -The root (global) namespace for projects is deprecated. - -So you need to move all your global projects under groups or users manually before update or they will be automatically moved to the project owner namespace during the update. When a project is moved all its members will receive an email with instructions how to update their git remote URL. Please make sure you disable sending email when you do a test of the upgrade. - -### Teams - -We introduce group membership in 6.0 as a replacement for teams. - -The old combination of groups and teams was confusing for a lot of people. - -And when the members of a team where changed this wasn't reflected in the project permissions. - -In GitLab 6.0 you will be able to add members to a group with a permission level for each member. - -These group members will have access to the projects in that group. - -Any changes to group members will immediately be reflected in the project permissions. - -You can even have multiple owners for a group, greatly simplifying administration. - -## 0. Backup & prepare for update - -It's useful to make a backup just in case things go south: -(With MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version) - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -The migrations in this update are very sensitive to incomplete or inconsistent data. If you have a long-running GitLab installation and some of the previous upgrades did not work out 100% correct this may bite you now. The following can help you have a more smooth upgrade. - -### Find projects with invalid project names - -#### MySQL -Login to MySQL: - - mysql -u root -p - -Find projects with invalid names: - -```bash -mysql> use gitlabhq_production; - -# find projects with invalid first char, projects must start with letter -mysql> select name from projects where name REGEXP '^[^A-Za-z]'; - -# find projects with other invalid chars -## names must only contain alphanumeric chars, underscores, spaces, periods, and dashes -mysql> select name from projects where name REGEXP '[^a-zA-Z0-9_ .-]+'; -``` - -If any projects have invalid names try correcting them from the web interface before starting the upgrade. -If correcting them from the web interface fails you can correct them using MySQL: - -```bash -# e.g. replace invalid / with allowed _ -mysql> update projects set name = REPLACE(name,'/','_'); -# repeat for all invalid chars found in project names -``` - -#### PostgreSQL -Make sure all project names start with a letter and only contain alphanumeric chars, underscores, spaces, periods, and dashes (a-zA-Z0-9_ .-). - -### Find other common errors - -``` -cd /home/git/gitlab -# Start rails console -sudo -u git -H bin/rails console production - -# Make sure none of the following rails commands return results - -# All project owners should have an owner: -Project.all.select { |project| project.owner.blank? } - -# Every user should have a namespace: -User.all.select { |u| u.namespace.blank? } - -# Projects in the global namespace should not conflict with projects in the owner namespace: -Project.where(namespace_id: nil).select { |p| Project.where(path: p.path, namespace_id: p.owner.try(:namespace).try(:id)).present? } -``` - -If any of the above rails commands returned results other than `=> []` try correcting the issue from the web interface. - -If you find projects without an owner (first rails command above), correct it. For MySQL setups: - -```bash -# get your user id -mysql> select id, name from users order by name; - -# set yourself as owner of project -# replace your_user_id with your user id and bad_project_id with the project id from the rails command -mysql> update projects set creator_id=your_user_id where id=bad_project_id; -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 6-0-stable -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 -``` - -## 4. Install additional packages - -```bash -# For reStructuredText markup language support install required package: -sudo apt-get install python-docutils -``` - -## 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_groups RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_global_projects RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production -sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production - -# Clear redis cache -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production - -# Clear and precompile assets -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production - -#Add dealing with newlines for editor -sudo -u git -H git config --global core.autocrlf input -``` - -## 6. Update config files - -Note: We switched from Puma in GitLab 5.x to unicorn in GitLab 6.0. - -- Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-0-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-0-stable/config/unicorn.rb.example but with your settings. - -## 7. Update Init script - -```bash -cd /home/git/gitlab -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 8. Create uploads directory - -```bash -cd /home/git/gitlab -sudo -u git -H mkdir -p public/uploads -sudo chmod -R u+rwX public/uploads -``` - -## 9. Start application - - sudo service gitlab start - sudo service nginx restart - -## 10. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (5.1) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.0 to 5.1](5.0-to-5.1.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/5.2-to-5.3.md b/doc/update/5.2-to-5.3.md deleted file mode 100644 index 27613aeda07..00000000000 --- a/doc/update/5.2-to-5.3.md +++ /dev/null @@ -1,86 +0,0 @@ -# From 5.2 to 5.3 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.2-to-5.3.md) for the most up to date instructions.* - -## Warning - -GitLab 5.3 is affected by critical security vulnerabilities CVE-2013-4490 and CVE-2013-4489. - -## 0. Backup - -It's useful to make a backup just in case things go south (with MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version): - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 5-3-stable -``` - -## 3. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 4. Update config files - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-3-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/puma.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-3-stable/config/puma.rb.example but with your settings. - -## 5. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/5-3-stable/lib/support/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 6. Start application - - sudo service gitlab start - sudo service nginx restart - -## 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (5.2) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.1 to 5.2](5.1-to-5.2.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/5.3-to-5.4.md b/doc/update/5.3-to-5.4.md deleted file mode 100644 index 577b9a585ff..00000000000 --- a/doc/update/5.3-to-5.4.md +++ /dev/null @@ -1,90 +0,0 @@ -# From 5.3 to 5.4 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.3-to-5.4.md) for the most up to date instructions.* - -## 0. Backup - -It's useful to make a backup just in case things go south (with MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version): - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 5-4-stable # Latest version of 5-4-stable addresses CVE-2013-4489 -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 # Addresses multiple critical security vulnerabilities -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 5. Update config files - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/puma.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/5-4-stable/config/puma.rb.example but with your settings. - -## 6. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo curl -L --output /etc/init.d/gitlab https://raw.github.com/gitlabhq/gitlabhq/5-4-stable/lib/support/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 7. Start application - - sudo service gitlab start - sudo service nginx restart - -## 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (5.3) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.2 to 5.3](5.2-to-5.3.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/5.4-to-6.0.md b/doc/update/5.4-to-6.0.md deleted file mode 100644 index d9c6d9bfb91..00000000000 --- a/doc/update/5.4-to-6.0.md +++ /dev/null @@ -1,149 +0,0 @@ -# From 5.4 to 6.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/5.4-to-6.0.md) for the most up to date instructions.* - -## Warning - -GitLab 6.0 is affected by critical security vulnerabilities CVE-2013-4490 and CVE-2013-4489. - -**You need to follow this guide first, before updating past 6.0, as it contains critical migration steps that are only present -in the `6-0-stable` branch** - -## Deprecations - -### Global projects - -The root (global) namespace for projects is deprecated. - -So you need to move all your global projects under groups or users manually before update or they will be automatically moved to the project owner namespace during the update. When a project is moved all its members will receive an email with instructions how to update their git remote URL. Please make sure you disable sending email when you do a test of the upgrade. - -### Teams - -We introduce group membership in 6.0 as a replacement for teams. - -The old combination of groups and teams was confusing for a lot of people. - -And when the members of a team where changed this wasn't reflected in the project permissions. - -In GitLab 6.0 you will be able to add members to a group with a permission level for each member. - -These group members will have access to the projects in that group. - -Any changes to group members will immediately be reflected in the project permissions. - -You can even have multiple owners for a group, greatly simplifying administration. - -## 0. Backup - -It's useful to make a backup just in case things go south (with MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version): - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch -sudo -u git -H git checkout 6-0-stable -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 -``` - -## 4. Install additional packages - -```bash -# For reStructuredText markup language support install required package: -sudo apt-get install python-docutils -``` - -## 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_groups RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_global_projects RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_keys RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_inline_notes RAILS_ENV=production -sudo -u git -H bundle exec rake gitlab:satellites:create RAILS_ENV=production - -# Clear redis cache -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production - -# Clear and precompile assets -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -``` - -## 6. Update config files - -Note: We switched from Puma in GitLab 5.4 to unicorn in GitLab 6.0. - -- Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/master/config/unicorn.rb.example but with your settings. - -## 7. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -sudo chmod +x /etc/init.d/gitlab -``` - -## 8. Start application - - sudo service gitlab start - sudo service nginx restart - -## 9. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Troubleshooting - -The migrations in this update are very sensitive to incomplete or inconsistent data. If you have a long-running GitLab installation and some of the previous upgrades did not work out 100% correct this may bite you now. The following commands can be run in the rails console to look for 'bad' data. - -All project owners should have an owner: - -``` -Project.all.select { |project| project.owner.blank? } -``` - -Every user should have a namespace: - -``` -User.all.select { |u| u.namespace.blank? } -``` - -Projects in the global namespace should not conflict with projects in the owner namespace: - -``` -Project.where(namespace_id: nil).select { |p| Project.where(path: p.path, namespace_id: p.owner.try(:namespace).try(:id)).present? } -``` diff --git a/doc/update/6.0-to-6.1.md b/doc/update/6.0-to-6.1.md deleted file mode 100644 index c5eba1c01c4..00000000000 --- a/doc/update/6.0-to-6.1.md +++ /dev/null @@ -1,108 +0,0 @@ -# From 6.0 to 6.1 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.0-to-6.1.md) for the most up to date instructions.* - -## Warning - -GitLab 6.1 is affected by critical security vulnerabilities CVE-2013-4490 and CVE-2013-4489. - -**In 6.1 we remove a lot of deprecated code.** - -**You should update to 6.0 before installing 6.1 so all the necessary conversions are run.** - -## Deprecations - -### Global issue numbers - -In 6.1 issue numbers are project specific. This means all issues are renumbered and get a new number in their URL. If you use an old issue number URL and the issue number does not exist yet you are redirected to the new one. This conversion does not trigger if the old number already exists for this project, this is unlikely but will happen with old issues and large projects. - -## 0. Backup - -It's useful to make a backup just in case things go south (with MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version): - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout 6-1-stable -# For GitLab Enterprise Edition: sudo -u git -H git checkout 6-1-stable-ee -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake migrate_iids RAILS_ENV=production -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production -``` - -## 5. Update config files - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-1-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/unicorn.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-1-stable/config/unicorn.rb.example but with your settings. - -## 6. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 7. Start application - - sudo service gitlab start - sudo service nginx restart - -## 8. Check application status - -Check if GitLab and its environment are configured correctly: - - cd /home/git/gitlab - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (6.0) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 5.4 to 6.0](5.4-to-6.0.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/6.1-to-6.2.md b/doc/update/6.1-to-6.2.md deleted file mode 100644 index a534528108a..00000000000 --- a/doc/update/6.1-to-6.2.md +++ /dev/null @@ -1,122 +0,0 @@ -# From 6.1 to 6.2 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.1-to-6.2.md) for the most up to date instructions.* - -**You should update to 6.1 before installing 6.2 so all the necessary conversions are run.** - -## 0. Backup - -It's useful to make a backup just in case things go south: (With MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version). - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout 6-2-stable # Latest version of 6-2-stable addresses CVE-2013-4489 -# For GitLab Enterprise Edition: sudo -u git -H git checkout 6-2-stable-ee -``` - -## 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 # Addresses multiple critical security vulnerabilities -``` - -## 4. Install additional packages - -```bash -# Add support for logrotate for better log file handling -sudo apt-get install logrotate -``` - -## 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production -``` - -## 6. Update config files - -TIP: to see what changed in `gitlab.yml.example` in this release use next command: - -``` -git diff 6-1-stable:config/gitlab.yml.example 6-2-stable:config/gitlab.yml.example -``` - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-2-stable/config/gitlab.yml.example but with your settings. - -- Make `/home/git/gitlab/config/unicorn.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-2-stable/config/unicorn.rb.example but with your settings. - -- Copy rack attack middleware config: - - ```bash - sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb - ``` - -- Uncomment `config.middleware.use Rack::Attack` in `/home/git/gitlab/config/application.rb` - -- Set up logrotate. - -```bash -sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab -``` - -## 7. Update Init script - -```bash -sudo rm /etc/init.d/gitlab -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 8. Start application - - sudo service gitlab start - sudo service nginx restart - -## 9. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (6.1) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.0 to 6.1](6.0-to-6.1.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/6.2-to-6.3.md b/doc/update/6.2-to-6.3.md deleted file mode 100644 index b08ebde0808..00000000000 --- a/doc/update/6.2-to-6.3.md +++ /dev/null @@ -1,108 +0,0 @@ -# From 6.2 to 6.3 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.2-to-6.3.md) for the most up to date instructions.* - -**Requires version: 6.1 or 6.2.** - -## 0. Backup - -It's useful to make a backup just in case things go south: (With MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version) - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout 6-3-stable -# For GitLab Enterprise Edition: sudo -u git -H git checkout 6-3-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.7.9 # Addresses multiple critical security vulnerabilities -``` - -The gitlab-shell config changed recently, so check for config file changes and make `/home/git/gitlab-shell/config.yml` the same as - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production -``` - -## 5. Update config files - -TIP: to see what changed in gitlab.yml.example in this release use next command: - -``` -git diff 6-2-stable:config/gitlab.yml.example 6-3-stable:config/gitlab.yml.example -``` - -- Make `/home/git/gitlab/config/gitlab.yml` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-3-stable/config/gitlab.yml.example but with your settings. -- Make `/home/git/gitlab/config/unicorn.rb` same as https://gitlab.com/gitlab-org/gitlab-ce/blob/6-3-stable/config/unicorn.rb.example but with your settings. - -```bash -# Copy rack attack middleware config -cd /home/git/gitlab -sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb -``` - -## 6. Update Init script - -```bash -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 7. Start application - - sudo service gitlab start - sudo service nginx restart - -## 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (6.2) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.1 to 6.2](6.1-to-6.2.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/6.3-to-6.4.md b/doc/update/6.3-to-6.4.md deleted file mode 100644 index 951d92dfeb5..00000000000 --- a/doc/update/6.3-to-6.4.md +++ /dev/null @@ -1,90 +0,0 @@ -# From 6.3 to 6.4 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.3-to-6.4.md) for the most up to date instructions.* - -## 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - -```bash -sudo service gitlab stop -```` - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout 6-4-stable -# For GitLab Enterprise Edition: sudo -u git -H git checkout 6-4-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.8.0 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 5. Start application - -```bash -sudo service gitlab start -sudo service nginx restart -``` - -## 6. Check application status - -Check if GitLab and its environment are configured correctly: - -```bash -sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production -``` - -To make sure you didn't miss anything run a more thorough check with: - -```bash -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production -``` - -If all items are green, then congratulations upgrade complete! - -## Things went south? Revert to previous version (6.3) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.2 to 6.3](6.2-to-6.3.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` diff --git a/doc/update/6.4-to-6.5.md b/doc/update/6.4-to-6.5.md deleted file mode 100644 index 0dae9a9fe59..00000000000 --- a/doc/update/6.4-to-6.5.md +++ /dev/null @@ -1,96 +0,0 @@ -# From 6.4 to 6.5 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.4-to-6.5.md) for the most up to date instructions.* - -## 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 6-5-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 6-5-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.8.0 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 5. Start application - - sudo service gitlab start - sudo service nginx restart - -## 6. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.4) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.3 to 6.4](6.3-to-6.4.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` - -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/6.5-to-6.6.md b/doc/update/6.5-to-6.6.md deleted file mode 100644 index c24e83eb006..00000000000 --- a/doc/update/6.5-to-6.6.md +++ /dev/null @@ -1,97 +0,0 @@ -# From 6.5 to 6.6 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.5-to-6.6.md) for the most up to date instructions.* - -## 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 6-6-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 6-6-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.8.0 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -## 5. Start application - - sudo service gitlab start - sudo service nginx restart - -## 6. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.5) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.4 to 6.5](6.4-to-6.5.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` - -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/6.6-to-6.7.md b/doc/update/6.6-to-6.7.md deleted file mode 100644 index b4298c93429..00000000000 --- a/doc/update/6.6-to-6.7.md +++ /dev/null @@ -1,109 +0,0 @@ -# From 6.6 to 6.7 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.6-to-6.7.md) for the most up to date instructions.* - -## 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - - sudo service gitlab stop - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 6-7-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 6-7-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.1 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab - -# Update the logrotate configuration (keep logs for 90 days instead of 52 weeks) -sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab - -# Compress existing .log.1 files because we turned off delaycompress in logrotate -sudo -u git -H gzip /home/git/gitlab/log/*.log.1 -sudo -u git -H gzip /home/git/gitlab-shell/gitlab-shell.log.1 - -# Close access to gitlab-satellites for others -sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites - -# Add directory for uploads -sudo -u git -H mkdir -p /home/git/gitlab/public/uploads -``` - -## 5. Start application - - sudo service gitlab start - sudo service nginx restart - -## 6. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.6) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.5 to 6.6](6.5-to-6.6.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` - -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/6.7-to-6.8.md b/doc/update/6.7-to-6.8.md deleted file mode 100644 index 4fb90639f16..00000000000 --- a/doc/update/6.7-to-6.8.md +++ /dev/null @@ -1,122 +0,0 @@ -# From 6.7 to 6.8 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.7-to-6.8.md) for the most up to date instructions.* - -## 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -## 1. Stop server - -```bash -sudo service gitlab stop -``` - -## 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 6-8-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 6-8-stable-ee -``` - -## 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.3 -``` - -## 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab - -# Close access to gitlab-satellites for others -sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites -``` - -## 5. Update config files - -### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml if desired. - -``` -git diff 6-7-stable:config/gitlab.yml.example 6-8-stable:config/gitlab.yml.example -``` - -### MySQL? Remove reaping frequency - -If you are using MySQL as a database, remove `reaping_frequency` from you database.yml to prevent crashes. [Relevant commit](https://gitlab.com/gitlab-org/gitlab-ce/commit/5163a8fcb9cfd63435560fda00173b76df2ccc93). - -### HTTPS? Disable gzip - -If you are using HTTPS, disable gzip as in [this commit](https://gitlab.com/gitlab-org/gitlab-ce/commit/563fec734912d81cd7caea6fa8ec2b397fb72a9b) to prevent BREACH attacks. - -### Turn on asset compression - -To improve performance, enable gzip asset compression as seen [in this commit](https://gitlab.com/gitlab-org/gitlab-ce/commit/8af94ed75505f0253823b9b2d44320fecea5b5fb). - -## 6. Start application - - sudo service gitlab start - sudo service nginx restart - -## 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.7) - -### 1. Revert the code to the previous version - -Follow the [upgrade guide from 6.6 to 6.7](6.6-to-6.7.md), except for the database migration (the backup is already migrated to the previous version). - -### 2. Restore from the backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/6.8-to-6.9.md b/doc/update/6.8-to-6.9.md deleted file mode 100644 index b9b8b63f652..00000000000 --- a/doc/update/6.8-to-6.9.md +++ /dev/null @@ -1,103 +0,0 @@ -# From 6.8 to 6.9 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.8-to-6.9.md) for the most up to date instructions.* - -### 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - -```bash -sudo service gitlab stop -``` - -### 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 6-9-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 6-9-stable-ee -``` - -### 3. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.4 -``` - -### 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production -``` - -### 5. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml if desired. - -``` -git diff 6-8-stable:config/gitlab.yml.example 6-9-stable:config/gitlab.yml.example -``` - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.8) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 6.7 to 6.8](6.7-to-6.8.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/6.9-to-7.0.md b/doc/update/6.9-to-7.0.md deleted file mode 100644 index 236430b5951..00000000000 --- a/doc/update/6.9-to-7.0.md +++ /dev/null @@ -1,141 +0,0 @@ -# From 6.9 to 7.0 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/6.9-to-7.0.md) for the most up to date instructions.* - -### 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - -```bash -sudo service gitlab stop -``` - -### 2. Update Ruby - -If you are still using Ruby 1.9.3 or below, you will need to update Ruby. -You can check which version you are running with `ruby -v`. - -If you are you running Ruby 2.0.x, you do not need to upgrade ruby, but can consider doing so for performance reasons. - -If you are running Ruby 2.1.1 consider upgrading to 2.1.2, because of the high memory usage of Ruby 2.1.1. - -Install, update dependencies: - -```bash -sudo apt-get install build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl -``` - -Download and compile Ruby: - -```bash -mkdir /tmp/ruby && cd /tmp/ruby -curl -L --progress ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz | tar xz -cd ruby-2.1.2 -./configure --disable-install-rdoc -make -sudo make install -``` - -Install Bundler: - -```bash -sudo gem install bundler --no-ri --no-rdoc -``` - -### 3. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-0-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-0-stable-ee -``` - -### 4. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.6 -``` - -### 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 6. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml if desired. - -``` -git diff origin/6-9-stable:config/gitlab.yml.example origin/7-0-stable:config/gitlab.yml.example -``` - -* HTTP setups: Make `/etc/nginx/sites-available/nginx` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/lib/support/nginx/gitlab but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/nginx-ssl` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/lib/support/nginx/gitlab-ssl but with your setting - -### 7. Start application - - sudo service gitlab start - sudo service nginx restart - -### 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (6.9) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 6.8 to 6.9](6.8-to-6.9.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.0-to-7.1.md b/doc/update/7.0-to-7.1.md deleted file mode 100644 index a4e9be9946e..00000000000 --- a/doc/update/7.0-to-7.1.md +++ /dev/null @@ -1,138 +0,0 @@ -# From 7.0 to 7.1 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/7.0-to-7.1.md) for the most up to date instructions.* - -### 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - -```bash -sudo service gitlab stop -``` - -### 2. Update Ruby - -If you are still using Ruby 1.9.3 or below, you will need to update Ruby. -You can check which version you are running with `ruby -v`. - -If you are you running Ruby 2.0.x, you do not need to upgrade ruby, but can consider doing so for performance reasons. - -If you are running Ruby 2.1.1 consider upgrading to 2.1.2, because of the high memory usage of Ruby 2.1.1. - -Install, update dependencies: - -```bash -sudo apt-get install build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl -``` - -Download and compile Ruby: - -```bash -mkdir /tmp/ruby && cd /tmp/ruby -curl -L --progress ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz | tar xz -cd ruby-2.1.2 -./configure --disable-install-rdoc -make -sudo make install -``` - -Install Bundler: - -```bash -sudo gem install bundler --no-ri --no-rdoc -``` - -### 3. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-1-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-1-stable-ee -``` - -### 4. Update gitlab-shell (and its config) - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.6 -``` - -### 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 6. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml if desired. - -``` -git diff 7-0-stable:config/gitlab.yml.example 7-1-stable:config/gitlab.yml.example -``` - -### 7. Start application - - sudo service gitlab start - sudo service nginx restart - -### 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (7.0) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 6.9 to 7.0](6.9-to-7.0.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.1-to-7.2.md b/doc/update/7.1-to-7.2.md deleted file mode 100644 index 88cb63d7d41..00000000000 --- a/doc/update/7.1-to-7.2.md +++ /dev/null @@ -1,137 +0,0 @@ -# From 7.1 to 7.2 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/7.1-to-7.2.md) for the most up to date instructions.* - -## Editable labels - -In GitLab 7.2 we replace Issue and Merge Request tags with labels, making it -possible to edit the label text and color. The characters `?`, `&` and `,` are -no longer allowed however so those will be removed from your tags during the -database migrations for GitLab 7.2. - -### 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - -```bash -sudo service gitlab stop -``` - -### 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-2-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-2-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v1.9.8 -``` - -### 4. Install new system dependencies - -The latest version of the 'rugged' gem requires `pkg-config` and `cmake` to -build its native extensions. - -```bash -sudo apt-get install pkg-config cmake -``` - -### 5. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 6. Update config files - -#### New configuration options for `gitlab.yml` - -There are new configuration options available for `gitlab.yml`. View them with the command below and apply them to your current `gitlab.yml`. - -``` -git diff 7-1-stable:config/gitlab.yml.example 7-2-stable:config/gitlab.yml.example -``` - -* HTTP setups: Make `/etc/nginx/sites-available/nginx` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/lib/support/nginx/gitlab but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/nginx-ssl` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-0-stable/lib/support/nginx/gitlab-ssl but with your setting - -Update rack attack middleware config - -``` -sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb -``` - -### 7. Start application - - sudo service gitlab start - sudo service nginx restart - -### 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -### 9. Update OmniAuth configuration - -When using Google omniauth login, changes of the Google account required. -Ensure that `Contacts API` and the `Google+ API` are enabled in the [Google Developers Console](https://console.developers.google.com/). -More details can be found at the [integration documentation](../integration/google.md). - -## Things went south? Revert to previous version (7.1) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.0 to 7.1](7.0-to-7.1.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.2-to-7.3.md b/doc/update/7.2-to-7.3.md deleted file mode 100644 index 18f77d6396e..00000000000 --- a/doc/update/7.2-to-7.3.md +++ /dev/null @@ -1,145 +0,0 @@ -# From 7.2 to 7.3 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/7.2-to-7.3.md) for the most up to date instructions.* - -### 0. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - -```bash -sudo service gitlab stop -``` - -### 2. Get latest code - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-3-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-3-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.0.1 -``` - -### 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - - -### 5. Configure Redis to use sockets - - # Configure redis to use sockets - sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig - # Disable Redis listening on TCP by setting 'port' to 0 - sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | sudo tee /etc/redis/redis.conf - # Enable Redis socket for default Debian / Ubuntu path - echo 'unixsocket /var/run/redis/redis.sock' | sudo tee -a /etc/redis/redis.conf - # Be sure redis group can write to the socket, enable only if supported (>= redis 2.4.0). - sudo sed -i '/# unixsocketperm/ s/^# unixsocketperm.*/unixsocketperm 0775/' /etc/redis/redis.conf - # Activate the changes to redis.conf - sudo service redis-server restart - # Add git to the redis group - sudo usermod -aG redis git - - # Configure Redis connection settings - sudo -u git -H cp config/resque.yml.example config/resque.yml - # Change the Redis socket path if you are not using the default Debian / Ubuntu configuration - sudo -u git -H editor config/resque.yml - - # Configure gitlab-shell to use Redis sockets - sudo -u git -H sed -i 's|^ # socket.*| socket: /var/run/redis/redis.sock|' /home/git/gitlab-shell/config.yml - -### 6. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml. - -``` -git diff origin/7-2-stable:config/gitlab.yml.example origin/7-3-stable:config/gitlab.yml.example -``` - -``` -# Use the default Unicorn socket backlog value of 1024 -sudo -u git -H sed -i 's/:backlog => 64/:backlog => 1024/' config/unicorn.rb -``` - -* HTTP setups: Make `/etc/nginx/sites-available/nginx` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-3-stable/lib/support/nginx/gitlab but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/nginx-ssl` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-3-stable/lib/support/nginx/gitlab-ssl but with your setting - -### 7. Start application - - sudo service gitlab start - sudo service nginx restart - -### 8. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -### 9. Update OmniAuth configuration - -When using Google omniauth login, changes of the Google account required. -Ensure that `Contacts API` and the `Google+ API` are enabled in the [Google Developers Console](https://console.developers.google.com/). -More details can be found at the [integration documentation](../integration/google.md). - -## Things went south? Revert to previous version (7.2) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.1 to 7.2](7.1-to-7.2.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.3-to-7.4.md b/doc/update/7.3-to-7.4.md deleted file mode 100644 index 53e739c06fb..00000000000 --- a/doc/update/7.3-to-7.4.md +++ /dev/null @@ -1,197 +0,0 @@ -# From 7.3 to 7.4 -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/7.3-to-7.4.md) for the most up to date instructions.* - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-4-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-4-stable-ee -``` - -### 3. Install libs, migrations, etc. - -```bash -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 4. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml. - -``` -git diff origin/7-3-stable:config/gitlab.yml.example origin/7-4-stable:config/gitlab.yml.example -``` - -#### Change timeout for unicorn - -``` -# set timeout to 60 -sudo -u git -H editor config/unicorn.rb -``` - -#### Change Nginx HTTPS settings - -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-4-stable/lib/support/nginx/gitlab-ssl but with your setting - -#### MySQL Databases: Update database.yml config file - -* Add `collation: utf8_general_ci` to `config/database.yml` as seen in [config/database.yml.mysql](/config/database.yml.mysql) - -``` -sudo -u git -H editor config/database.yml -``` - -### 5. Start application - - sudo service gitlab start - sudo service nginx restart - -### 6. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - - -### 7. Optional optimizations for GitLab setups with MySQL databases - -Only applies if running MySQL database created with GitLab 6.7 or earlier. If you are not experiencing any issues you may not need the following instructions however following them will bring your database in line with the latest recommended installation configuration and help avoid future issues. Be sure to follow these directions exactly. These directions should be safe for any MySQL instance but to be sure make a current MySQL database backup beforehand. - -``` -# Stop GitLab -sudo service gitlab stop - -# Secure your MySQL installation (added in GitLab 6.2) -sudo mysql_secure_installation - -# Login to MySQL -mysql -u root -p - -# do not type the 'mysql>', this is part of the prompt - -# Convert all tables to use the InnoDB storage engine (added in GitLab 6.8) -SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' ENGINE=InnoDB;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `ENGINE` <> 'InnoDB' AND `TABLE_TYPE` = 'BASE TABLE'; - -# If previous query returned results, copy & run all shown SQL statements - -# Convert all tables to correct character set -SET foreign_key_checks = 0; -SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `TABLE_COLLATION` <> 'utf8_unicode_ci' AND `TABLE_TYPE` = 'BASE TABLE'; - -# If previous query returned results, copy & run all shown SQL statements - -# turn foreign key checks back on -SET foreign_key_checks = 1; - -# Find MySQL users -mysql> SELECT user FROM mysql.user WHERE user LIKE '%git%'; - -# If git user exists and gitlab user does not exist -# you are done with the database cleanup tasks -mysql> \q - -# If both users exist skip to Delete gitlab user - -# Create new user for GitLab (changed in GitLab 6.4) -# change $password in the command below to a real password you pick -mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password'; - -# Grant the git user necessary permissions on the database -mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `gitlabhq_production`.* TO 'git'@'localhost'; - -# Delete the old gitlab user -mysql> DELETE FROM mysql.user WHERE user='gitlab'; - -# Quit the database session -mysql> \q - -# Try connecting to the new database with the new user -sudo -u git -H mysql -u git -p -D gitlabhq_production - -# Type the password you replaced $password with earlier - -# You should now see a 'mysql>' prompt - -# Quit the database session -mysql> \q - -# Update database configuration details -# See config/database.yml.mysql for latest recommended configuration details -# Remove the reaping_frequency setting line if it exists (removed in GitLab 6.8) -# Set production -> pool: 10 (updated in GitLab 5.3) -# Set production -> username: git -# Set production -> password: the password your replaced $password with earlier -sudo -u git -H editor /home/git/gitlab/config/database.yml - -# Start GitLab -sudo service gitlab start -sudo service nginx restart - -# Run thorough check -sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production -``` - - -## Things went south? Revert to previous version (7.3) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.2 to 7.3](7.2-to-7.3.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. - - - - diff --git a/doc/update/7.4-to-7.5.md b/doc/update/7.4-to-7.5.md deleted file mode 100644 index 673eab3c56e..00000000000 --- a/doc/update/7.4-to-7.5.md +++ /dev/null @@ -1,108 +0,0 @@ -# From 7.4 to 7.5 - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-5-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-5-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.2.0 -``` - -### 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 5. Update config files - -#### New configuration options for gitlab.yml - -There are new configuration options available for gitlab.yml. View them with the command below and apply them to your current gitlab.yml. - -``` -git diff origin/7-4-stable:config/gitlab.yml.example origin/7-5-stable:config/gitlab.yml.example -``` - -#### Change Nginx settings - -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (7.4) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.3 to 7.4](7.3-to-7.4.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.5-to-7.6.md b/doc/update/7.5-to-7.6.md deleted file mode 100644 index 35cd437fdc4..00000000000 --- a/doc/update/7.5-to-7.6.md +++ /dev/null @@ -1,114 +0,0 @@ -# From 7.5 to 7.6 - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-6-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-6-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.4.0 -``` - -### 4. Install libs, migrations, etc. - -```bash -sudo apt-get install libkrb5-dev - -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 5. Update config files - -#### New configuration options for `gitlab.yml` - -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. - -``` -git diff origin/7-5-stable:config/gitlab.yml.example origin/7-6-stable:config/gitlab.yml.example -``` - -#### Change Nginx settings - -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting - -#### Setup time zone (optional) - -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## Things went south? Revert to previous version (7.5) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.4 to 7.5](7.4-to-7.5.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.6-to-7.7.md b/doc/update/7.6-to-7.7.md deleted file mode 100644 index 59243713156..00000000000 --- a/doc/update/7.6-to-7.7.md +++ /dev/null @@ -1,119 +0,0 @@ -# From 7.6 to 7.7 - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-7-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-7-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.4.2 -``` - -### 4. Install libs, migrations, etc. - -```bash -sudo apt-get install libkrb5-dev - -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 5. Update config files - -#### New configuration options for `gitlab.yml` - -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. - -``` -git diff origin/7-6-stable:config/gitlab.yml.example origin/7-7-stable:config/gitlab.yml.example -``` - -#### Change Nginx settings - -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting - -#### Setup time zone (optional) - -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -### 8. GitHub settings (if applicable) - -If you are using GitHub as an OAuth provider for authentication, you should change the callback URL so that it -only contains a root URL (ex. `https://gitlab.example.com/`) - -## Things went south? Revert to previous version (7.6) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.5 to 7.6](7.5-to-7.6.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.7-to-7.8.md b/doc/update/7.7-to-7.8.md deleted file mode 100644 index 46ca163c1bb..00000000000 --- a/doc/update/7.7-to-7.8.md +++ /dev/null @@ -1,120 +0,0 @@ -# From 7.7 to 7.8 - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-8-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-8-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.5.4 -``` - -### 4. Install libs, migrations, etc. - -```bash -sudo apt-get install libkrb5-dev - -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 5. Update config files - -#### New configuration options for `gitlab.yml` - -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. - -``` -git diff origin/7-7-stable:config/gitlab.yml.example origin/7-8-stable:config/gitlab.yml.example -``` - -#### Change Nginx settings - -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your settings. -* A new `location /uploads/` section has been added that needs to have the same content as the existing `location @gitlab` section. - -#### Setup time zone (optional) - -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -### 8. GitHub settings (if applicable) - -If you are using GitHub as an OAuth provider for authentication, you should change the callback URL so that it -only contains a root URL (ex. `https://gitlab.example.com/`) - -## Things went south? Revert to previous version (7.7) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.6 to 7.7](7.6-to-7.7.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/7.8-to-7.9.md b/doc/update/7.8-to-7.9.md deleted file mode 100644 index 28fd433e1c8..00000000000 --- a/doc/update/7.8-to-7.9.md +++ /dev/null @@ -1,120 +0,0 @@ -# From 7.8 to 7.9 - -### 0. Stop server - - sudo service gitlab stop - -### 1. Backup - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 2. Get latest code - -```bash -sudo -u git -H git fetch --all -sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically -``` - -For GitLab Community Edition: - -```bash -sudo -u git -H git checkout 7-9-stable -``` - -OR - -For GitLab Enterprise Edition: - -```bash -sudo -u git -H git checkout 7-9-stable-ee -``` - -### 3. Update gitlab-shell - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v2.6.0 -``` - -### 4. Install libs, migrations, etc. - -```bash -sudo apt-get install nodejs - -cd /home/git/gitlab - -# MySQL installations (note: the line below states '--without ... postgres') -sudo -u git -H bundle install --without development test postgres --deployment - -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -# Run database migrations -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production - -# Clean up assets and cache -sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production - -# Update init.d script -sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab -``` - -### 5. Update config files - -#### New configuration options for `gitlab.yml` - -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. - -``` -git diff origin/7-8-stable:config/gitlab.yml.example origin/7-9-stable:config/gitlab.yml.example -``` - -#### Change Nginx settings - -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your settings. -* A new `location /uploads/` section has been added that needs to have the same content as the existing `location @gitlab` section. - -#### Setup time zone (optional) - -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. - -### 6. Start application - - sudo service gitlab start - sudo service nginx restart - -### 7. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -### 8. GitHub settings (if applicable) - -If you are using GitHub as an OAuth provider for authentication, you should change the callback URL so that it -only contains a root URL (ex. `https://gitlab.example.com/`) - -## Things went south? Revert to previous version (7.8) - -### 1. Revert the code to the previous version -Follow the [upgrade guide from 7.7 to 7.8](7.7-to-7.8.md), except for the database migration -(The backup is already migrated to the previous version) - -### 2. Restore from the backup: - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production -``` -If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/doc/update/README.md b/doc/update/README.md deleted file mode 100644 index 0472537eeb5..00000000000 --- a/doc/update/README.md +++ /dev/null @@ -1,16 +0,0 @@ -Depending on the installation method and your GitLab version, there are multiple update guides. Choose one that fits your needs. - -## Omnibus Packages - -- [Omnibus update guide](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/update.md) contains the steps needed to update a GitLab [package](https://about.gitlab.com/downloads/). - -## Installation from source - -- [The individual upgrade guides](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/update) are for those who have installed GitLab from source. -- [The CE to EE update guides](https://gitlab.com/subscribers/gitlab-ee/tree/master/doc/update) are for subscribers of the Enterprise Edition only. The steps are very similar to a version upgrade: stop the server, get the code, update config files for the new functionality, install libs and do migrations, update the init script, start the application and check the application status. -- [Upgrader](upgrader.md) is an automatic ruby script that performs the update for installations from source. -- [Patch versions](patch_versions.md) guide includes the steps needed for a patch version, eg. 6.2.0 to 6.2.1. - -## Miscellaneous - -- [MySQL to PostgreSQL](mysql_to_postgresql.md) guides you through migrating your database from MySQL to PostgreSQL. diff --git a/doc/update/mysql_to_postgresql.md b/doc/update/mysql_to_postgresql.md deleted file mode 100644 index 50941db25f6..00000000000 --- a/doc/update/mysql_to_postgresql.md +++ /dev/null @@ -1,116 +0,0 @@ -# Migrating GitLab from MySQL to Postgres -*Make sure you view this [guide from the `master` branch](../../../master/doc/update/mysql_to_postgresql.md) for the most up to date instructions.* - -If you are replacing MySQL with Postgres while keeping GitLab on the same server all you need to do is to export from MySQL, import into Postgres and rebuild the indexes as described below. If you are also moving GitLab to another server, or if you are switching to omnibus-gitlab, you may want to use a GitLab backup file. The second part of this documents explains the procedure to do this. - -## Export from MySQL and import into Postgres - -Use this if you are keeping GitLab on the same server. - -``` -sudo service gitlab stop - -# Update /home/git/gitlab/config/database.yml - -git clone https://github.com/gitlabhq/mysql-postgresql-converter.git -b gitlab -cd mysql-postgresql-converter -mysqldump --compatible=postgresql --default-character-set=utf8 -r databasename.mysql -u root gitlabhq_production -p -python db_converter.py databasename.mysql databasename.psql - -# Import the database dump as the application database user -sudo -u git psql -f databasename.psql -d gitlabhq_production - -# Rebuild indexes (see below) - -# Install gems for PostgreSQL (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment - -sudo service gitlab start -``` - -## Rebuild indexes - -The lanyrd database converter script does not preserve all indexes, so we have to recreate them ourselves after migrating from MySQL. It is not necessary to shut down GitLab for this process. - -### For non-omnibus installations - -On non-omnibus installations (distributed using Git) we retrieve the index declarations from version control using `git stash`. - -``` -# Clone the database converter on your Postgres-backed GitLab server -cd /tmp -git clone https://github.com/gitlabhq/mysql-postgresql-converter.git -b gitlab - -cd /home/git/gitlab - -# Stash changes to db/schema.rb to make sure we can find the right index statements -sudo -u git -H git stash - -# Generate add_index.rb -ruby /tmp/mysql-postgresql-converter/add_index_statements.rb db/schema.rb > /tmp/mysql-postgresql-converter/add_index.rb - -# Create the indexes -sudo -u git -H bundle exec rails runner -e production 'eval $stdin.read' < /tmp/mysql-postgresql-converter/add_index.rb -``` - -### For omnibus-gitlab installations - -On omnibus-gitlab we need to get the index declarations from a file called `schema.rb.bundled`. For versions older than 6.9, we need to download the file. - -``` -# Clone the database converter on your Postgres-backed GitLab server -cd /tmp -/opt/gitlab/embedded/bin/git clone https://github.com/gitlabhq/mysql-postgresql-converter.git -b gitlab -cd /tmp/mysql-postgresql-converter - -# Download schema.rb.bundled if necessary -test -e /opt/gitlab/embedded/service/gitlab-rails/db/schema.rb.bundled || sudo /opt/gitlab/embedded/bin/curl -o /opt/gitlab/embedded/service/gitlab-rails/db/schema.rb.bundled https://gitlab.com/gitlab-org/gitlab-ce/raw/v6.9.1/db/schema.rb - -# Generate add_index.rb -/opt/gitlab/embedded/bin/ruby add_index_statements.rb /opt/gitlab/embedded/service/gitlab-rails/db/schema.rb.bundled > add_index.rb - -# Create the indexes -/opt/gitlab/bin/gitlab-rails runner 'eval $stdin.read' < add_index.rb -``` - -## Converting a GitLab backup file from MySQL to Postgres -**Note:** Please make sure to have Python 2.7.x (or higher) installed. - -GitLab backup files (`_gitlab_backup.tar`) contain a SQL dump. Using the lanyrd database converter we can replace a MySQL database dump inside the tar file with a Postgres database dump. This can be useful if you are moving to another server. - -``` -# Stop GitLab -sudo service gitlab stop - -# Create the backup -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production - -# Note the filename of the backup that was created. We will call it -# TIMESTAMP_gitlab_backup.tar below. - -# Move the backup file we will convert to its own directory -sudo -u git -H mkdir -p tmp/backups/postgresql -sudo -u git -H mv tmp/backups/TIMESTAMP_gitlab_backup.tar tmp/backups/postgresql/ - -# Create a separate database dump with PostgreSQL compatibility -cd tmp/backups/postgresql -sudo -u git -H mysqldump --compatible=postgresql --default-character-set=utf8 -r gitlabhq_production.mysql -u root gitlabhq_production -p - -# Clone the database converter -sudo -u git -H git clone https://github.com/gitlabhq/mysql-postgresql-converter.git -b gitlab - -# Convert gitlabhq_production.mysql -sudo -u git -H mkdir db -sudo -u git -H python mysql-postgresql-converter/db_converter.py gitlabhq_production.mysql db/database.sql - -# Replace the MySQL dump in TIMESTAMP_gitlab_backup.tar. - -# Warning: if you forget to replace TIMESTAMP below, tar will create a new file -# 'TIMESTAMP_gitlab_backup.tar' without giving an error. - -sudo -u git -H tar rf TIMESTAMP_gitlab_backup.tar db/database.sql - -# Done! TIMESTAMP_gitlab_backup.tar can now be restored into a Postgres GitLab -# installation. Remember to recreate the indexes after the import. -``` diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md deleted file mode 100644 index e29ee2a7b3d..00000000000 --- a/doc/update/patch_versions.md +++ /dev/null @@ -1,70 +0,0 @@ -# Universal update guide for patch versions -*Make sure you view this [upgrade guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/patch_versions.md) from the `master` branch for the most up to date instructions.* - -For example from 6.2.0 to 6.2.1, also see the [semantic versioning specification](http://semver.org/). - -### 0. Backup - -It's useful to make a backup just in case things go south: -(With MySQL, this may require granting "LOCK TABLES" privileges to the GitLab user on the database version) - -```bash -cd /home/git/gitlab -sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production -``` - -### 1. Stop server - - sudo service gitlab stop - -### 2. Get latest code for the stable branch - -```bash -cd /home/git/gitlab -sudo -u git -H git fetch --all -sudo -u git -H git checkout LATEST_TAG -``` - -Replace LATEST_TAG with the latest GitLab tag you want to upgrade to, for example `v6.6.3`. - -### 3. Update gitlab-shell to the corresponding version - -```bash -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -``` - -### 4. Install libs, migrations, etc. - -```bash -cd /home/git/gitlab - -#PostgreSQL -sudo -u git -H bundle install --without development test mysql --deployment - -# MySQL -sudo -u git -H bundle install --without development test postgres --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production -``` - -### 5. Start application - - sudo service gitlab start - sudo service nginx restart - -### 6. Check application status - -Check if GitLab and its environment are configured correctly: - - sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production - -To make sure you didn't miss anything run a more thorough check with: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade complete! diff --git a/doc/update/upgrader.md b/doc/update/upgrader.md deleted file mode 100644 index f62a53d3340..00000000000 --- a/doc/update/upgrader.md +++ /dev/null @@ -1,76 +0,0 @@ -# GitLab Upgrader -*Make sure you view this [upgrade guide from the `master` branch](../../../master/doc/update/upgrader.md) for the most up to date instructions.* - -GitLab Upgrader - a ruby script that allows you easily upgrade GitLab to latest minor version. - -For example it can update your application from 6.4 to latest GitLab 6 version (like 6.6.1). - -You still need to create a backup and manually restart GitLab after running the script but all other operations are done by this upgrade script. - -If you have local changes to your GitLab repository the script will stash them and you need to use `git stash pop` after running the script. - -**GitLab Upgrader is available only for GitLab version 6.4.2 or higher.** - -**This script does NOT update gitlab-shell, it needs manual update. See step 5 below.** - -## 0. Backup - - cd /home/git/gitlab - sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production - -## 1. Stop server - - sudo service gitlab stop - -## 2. Run GitLab upgrade tool - -Note: GitLab 7.9 adds `nodejs` as a dependency. GitLab 7.6 adds `libkrb5-dev` as a dependency (installed by default on Ubuntu and OSX). GitLab 7.2 adds `pkg-config` and `cmake` as dependency. Please check the dependencies in the [installation guide.](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies) - - # Starting with GitLab version 7.0 upgrader script has been moved to bin directory - cd /home/git/gitlab - if [ -f bin/upgrade.rb ]; then sudo -u git -H ruby bin/upgrade.rb; else sudo -u git -H ruby script/upgrade.rb; fi - - # to perform a non-interactive install (no user input required) you can add -y - # if [ -f bin/upgrade.rb ]; then sudo -u git -H ruby bin/upgrade.rb -y; else sudo -u git -H ruby script/upgrade.rb -y; fi - -## 3. Start application - - sudo service gitlab start - sudo service nginx restart - -## 4. Check application status - -Check if GitLab and its dependencies are configured correctly: - - sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production - -If all items are green, then congratulations upgrade is complete! - -## 5. Upgrade GitLab Shell - -GitLab Shell might be outdated, running the commands below ensures you're using a compatible version: - -``` -cd /home/git/gitlab-shell -sudo -u git -H git fetch -sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -``` - -## One line upgrade command - -You've read through the entire guide and probably already did all the steps one by one. - -Here is a one line command with step 1 to 5 for the next time you upgrade: - -```bash -cd /home/git/gitlab; \ - sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production; \ - sudo service gitlab stop; \ - if [ -f bin/upgrade.rb ]; then sudo -u git -H ruby bin/upgrade.rb -y; else sudo -u git -H ruby script/upgrade.rb -y; fi; \ - cd /home/git/gitlab-shell; \ - sudo -u git -H git fetch; \ - sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION`; \ - cd /home/git/gitlab; \ - sudo service gitlab start; \ - sudo service nginx restart; sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production -``` diff --git a/doc/web_hooks/web_hooks.md b/doc/web_hooks/web_hooks.md deleted file mode 100644 index 851f50f5e9a..00000000000 --- a/doc/web_hooks/web_hooks.md +++ /dev/null @@ -1,218 +0,0 @@ -# Web hooks - -Project web hooks allow you to trigger an URL if new code is pushed or a new issue is created. - -You can configure web hooks to listen for specific events like pushes, issues or merge requests. GitLab will send a POST request with data to the web hook URL. - -Web hooks can be used to update an external issue tracker, trigger CI builds, update a backup mirror, or even deploy to your production server. - -If you send a web hook to an SSL endpoint [the certificate will not be verified](https://gitlab.com/gitlab-org/gitlab-ce/blob/ccd617e58ea71c42b6b073e692447d0fe3c00be6/app/models/web_hook.rb#L35) since many people use self-signed certificates. - -## Push events - -Triggered when you push to the repository except when pushing tags. - -**Request body:** - -```json -{ - "object_kind": "push", - "before": "95790bf891e76fee5e1747ab589903a6a1f80f22", - "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", - "ref": "refs/heads/master", - "user_id": 4, - "user_name": "John Smith", - "user_email": "john@example.com", - "project_id": 15, - "repository": { - "name": "Diaspora", - "url": "git@example.com:mike/diasporadiaspora.git", - "description": "", - "homepage": "http://example.com/mike/diaspora", - "git_http_url":"http://example.com/mike/diaspora.git", - "git_ssh_url":"git@example.com:mike/diaspora.git", - "visibility_level":0 - }, - "commits": [ - { - "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", - "message": "Update Catalan translation to e38cb41.", - "timestamp": "2011-12-12T14:27:31+02:00", - "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", - "author": { - "name": "Jordi Mallach", - "email": "jordi@softcatala.org" - } - }, - { - "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", - "message": "fixed readme", - "timestamp": "2012-01-03T23:36:29+02:00", - "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", - "author": { - "name": "GitLab dev user", - "email": "gitlabdev@dv6700.(none)" - } - } - ], - "total_commits_count": 4 -} -``` - -## Tag events - -Triggered when you create (or delete) tags to the repository. - -**Request body:** - -```json -{ - "object_kind": "tag_push", - "ref": "refs/tags/v1.0.0", - "before": "0000000000000000000000000000000000000000", - "after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7", - "user_id": 1, - "user_name": "John Smith", - "project_id": 1, - "repository": { - "name": "jsmith", - "url": "ssh://git@example.com/jsmith/example.git", - "description": "", - "homepage": "http://example.com/jsmith/example", - "git_http_url":"http://example.com/jsmith/example.git", - "git_ssh_url":"git@example.com:jsmith/example.git", - "visibility_level":0 - }, - "commits": [], - "total_commits_count": 0 -} -``` - -## Issues events - -Triggered when a new issue is created or an existing issue was updated/closed/reopened. - -**Request body:** - -```json -{ - "object_kind": "issue", - "user": { - "name": "Administrator", - "username": "root", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon" - }, - "object_attributes": { - "id": 301, - "title": "New API: create/update/delete file", - "assignee_id": 51, - "author_id": 51, - "project_id": 14, - "created_at": "2013-12-03T17:15:43Z", - "updated_at": "2013-12-03T17:15:43Z", - "position": 0, - "branch_name": null, - "description": "Create new API for manipulations with repository", - "milestone_id": null, - "state": "opened", - "iid": 23, - "url": "http://example.com/diaspora/issues/23", - "action": "open" - } -} -``` - -## Merge request events - -Triggered when a new merge request is created or an existing merge request was updated/merged/closed. - -**Request body:** - -```json -{ - "object_kind": "merge_request", - "user": { - "name": "Administrator", - "username": "root", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon" - }, - "object_attributes": { - "id": 99, - "target_branch": "master", - "source_branch": "ms-viewport", - "source_project_id": 14, - "author_id": 51, - "assignee_id": 6, - "title": "MS-Viewport", - "created_at": "2013-12-03T17:23:34Z", - "updated_at": "2013-12-03T17:23:34Z", - "st_commits": null, - "st_diffs": null, - "milestone_id": null, - "state": "opened", - "merge_status": "unchecked", - "target_project_id": 14, - "iid": 1, - "description": "", - "source": { - "name": "awesome_project", - "ssh_url": "ssh://git@example.com/awesome_space/awesome_project.git", - "http_url": "http://example.com/awesome_space/awesome_project.git", - "visibility_level": 20, - "namespace": "awesome_space" - }, - "target": { - "name": "awesome_project", - "ssh_url": "ssh://git@example.com/awesome_space/awesome_project.git", - "http_url": "http://example.com/awesome_space/awesome_project.git", - "visibility_level": 20, - "namespace": "awesome_space" - }, - "last_commit": { - "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", - "message": "fixed readme", - "timestamp": "2012-01-03T23:36:29+02:00", - "url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", - "author": { - "name": "GitLab dev user", - "email": "gitlabdev@dv6700.(none)" - } - }, - "url": "http://example.com/diaspora/merge_requests/1", - "action": "open" - } -} -``` - -#### Example webhook receiver - -If you want to see GitLab's webhooks in action for testing purposes you can use -a simple echo script running in a console session. - -Save the following file as `print_http_body.rb`. - -```ruby -require 'webrick' - -server = WEBrick::HTTPServer.new(:Port => ARGV.first) -server.mount_proc '/' do |req, res| - puts req.body -end - -trap 'INT' do - server.shutdown -end -server.start -``` - -Pick an unused port (e.g. 8000) and start the script: `ruby print_http_body.rb -8000`. Then add your server as a webhook receiver in GitLab as -`http://my.host:8000/`. - -When you press 'Test Hook' in GitLab, you should see something like this in the console. - -``` -{"before":"077a85dd266e6f3573ef7e9ef8ce3343ad659c4e","after":"95cd4a99e93bc4bbabacfa2cd10e6725b1403c60",} -example.com - - [14/May/2014:07:45:26 EDT] "POST / HTTP/1.1" 200 0 -- -> / -``` diff --git a/doc/workflow/README.md b/doc/workflow/README.md deleted file mode 100644 index 7e996dc47d4..00000000000 --- a/doc/workflow/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Workflow - -- [Feature branch workflow](workflow.md) -- [Project forking workflow](forking_workflow.md) -- [Project Features](project_features.md) -- [Authorization for merge requests](authorization_for_merge_requests.md) -- [Groups](groups.md) -- [Labels](labels.md) -- [GitLab Flow](gitlab_flow.md) -- [Notifications](notifications.md) -- [Migrating from SVN to GitLab](migrating_from_svn.md) -- [Project importing from GitHub to GitLab](import_projects_from_github.md) -- [Project importing from GitLab.com to your private GitLab instance](import_projects_from_gitlab_com.md) -- [Protected branches](protected_branches.md) -- [Web Editor](web_editor.md) diff --git a/doc/workflow/authorization_for_merge_requests.md b/doc/workflow/authorization_for_merge_requests.md deleted file mode 100644 index d1d6d94ec11..00000000000 --- a/doc/workflow/authorization_for_merge_requests.md +++ /dev/null @@ -1,40 +0,0 @@ -# Authorization for Merge requests - -There are two main ways to have a merge request flow with GitLab: working with protected branches in a single repository, or working with forks of an authoritative project. - -## Protected branch flow - -With the protected branch flow everybody works within the same GitLab project. - -The project maintainers get Master access and the regular developers get Developer access. - -The maintainers mark the authoritative branches as 'Protected'. - -The developers push feature branches to the project and create merge requests to have their feature branches reviewed and merged into one of the protected branches. - -Only users with Master access can merge changes into a protected branch. - -### Advantages - -- fewer projects means less clutter -- developers need to consider only one remote repository - -### Disadvantages - -- manual setup of protected branch required for each new project - -## Forking workflow - -With the forking workflow the maintainers get Master access and the regular developers get Reporter access to the authoritative repository, which prohibits them from pushing any changes to it. - -Developers create forks of the authoritative project and push their feature branches to their own forks. - -To get their changes into master they need to create a merge request across forks. - -### Advantages - -- in an appropriately configured GitLab group, new projects automatically get the required access restrictions for regular developers: fewer manual steps to configure authorization for new projects - -### Disadvantages - -- the project need to keep their forks up to date, which requires more advanced Git skills (managing multiple remotes) diff --git a/doc/workflow/ci_mr.png b/doc/workflow/ci_mr.png deleted file mode 100644 index a577356f8e899d55dab9b9137010ac23320cd762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40065 zcmeAS@N?(olHy`uVBq!ia0y~yU@T%_VED_y#=yX^aOO@!oW=v`f|g9E?s*`CKbH_KLsRy>8vEUAsc>{w>>|yY5|m z_tV>@Z$*!8RbI4c$^}lvz2EQsR=NEA|2*rN0vrm7jt=L43Z}i=yL``c%kp`j=Y7BT zd7qNL>W3qO4>$@~ESS=DnI3HpE7G%YZ%{rU_<)0hqd@7oITM&?aa!}Oz~sxveC zJyB)hSfylNs5cagp~P|IzArhQ*14|rIWEa-C0RpcuxqUYYNNWvmPwYsYlt2QyO0t zev;BZy>G+oV+tqErk!v;tPpmIIo#^_za?)XmVS^8w!U;hW5uJS+T;H=Nhv=`JlHH1LXwnhTyn1E1Kt~Es zyE3O)S>IJ_&gihV6u$muEz_xSv0jZX#*StS<3s$C7nz-z(AFYzsduYt#2Ni6!{ zEyLJ%z`VQRiTM;Yvzz~arWbtw=AfeJWNBl#X+gQf)I!dJZQGr*wmHZNdj71gwM^xj z@qUl|vZ>t*JG|QyPwG^-z1?u9Lf5T4x9Re$wyLAL250#WJh&GWFS%;6>bHPvk2g4P z{b0nR61~9kyV4G8t;GDdia{lZYtA=M;M;Qe+7+%BhXsFaZeMuemcgFw3Ki~FO%KkTBCsX70yY98oT@6b=KhV%@SX}O*@Sx%K`{rW?Tu%?3PTcp$iACp3 z+g=U+KD+y+UoXv0n3aC)!8)hL2U9PHDSVi8Q=mQl(4H*2HPzo38Z|q9d_A9_eTVt# zr)+_epII4csRypwaa}GAKNz{S|CV&>qzMVhtJ$yVPxF|ZHhJ}WS?;!PQ-2-nFZjIb zkie(U@y_PTlB*w;2(T*2S|1*TsP zN8QwUlDb+}@uz8NR{R0aA1SLRb{LN2sl>B^0Ca> z-8ALg22WP?{acMRPahQS(P0wPX?j{+zUX=H^#v#AF?Zf;I5yv&r956f^O3fofi2J4 z{(mxy@5ar@k959Op^>>?SdF!xWmf8SC96V9nb6;c5l@@UZuRz+Z&QA8?exPwOS@N~McRE8+9&8T!qb9?Z0yJMQt+RF zV<`<{+4b+A#+B>;xY|UE7fe!doGrw=(X6B6fAEX-e;IpEa}CjIl0aP-ZC$0U-R-zpUmbf z^|?Yx_rk@9wm$Lr=A2_m65_gwpLiCYPHF1&Y?*R~IcTq-+@_7$`g^#zO69HMe)8Y( zTXt3O=cG2nZp7wCq>`A2PMK4rP&=J~mP*KaL|tYbY? z_e;P<_UDVLa$CW!Ik%L*Ubxvm@o#nFdbPE7xtdd!32xc{f$PcU^R0;oi!^kMzO4Q4 zF(XE$OTj~zG2q-h?$8>h67BU(YHq#j{#Scm$XjZqdL++!&f2vSYgK~cYb3u!8osFf zsCi@8jA!$k4m`d2qWX1Z#Oq%jE2IsBqI(be?hKe;u6!YoE8A1|qs7dMwwwKSnt>D6MkO>{d`u3UGmbg z;i&yz$*HW{@blX24A*7Ni?@k=dQrj>Q($c}v8cp$yO@$QOUd*5Jq?yGnf~1p4R@B7 zuUsMNH=+0calr>1b9h+P4BixmxZ7uJ^m0vE{4sUe(@iQ4_I_99y{p>v+Rb@c@Bv$` zwx{#l6K73+Q@y}EY;VUjj(2@gJ#TJvhd)=yJnv=HZQD43h=3qghZK!9Z zs^5+dn`rsJhHX-9C*Dl-`ze*EdyhRmU45(X+pd%E{GO>w3hukmzfZ5{iReVj6_cL? z9<;vWF6=J1CUotGzNl8t3(k|f^6JcPo=WGqo!=|IzF}{U_O1V)*h}(t8j8f;KH9{e zv}KRL;+^aYTs+IBa($gy@VzUeX!4}oefy&`(zonvf2Mv-Un$>hpOey=Jxflmua!I7 z|Bpv`uHTDg$1krGtVq>5`L%1{%Qo~o_Wwz>USsPB)<6+b_`SNoIkN#$b2BaQ+VKRc#i zrJ^+BYiG_iDQR)N{r^LH&F}9Acl=UP(o`z@weYrASz<~+^N0I?8{h2RugvS)skq6y zdkOni7ygNBs}81i{5d?|gLzuwjGX76o>+ENypYpi?wm5?WOLmIrB(SUzx6bp#X45j zJ3njVP|8-4nKq-%zfy%!aRU2AW~WWhyU!{HTsrKSBpSu*abn6w*>iET6e8|jbo^4g zi*uG~x$>v${Fk^K*!#OPSA}q1PEZZ%d3S^N=p)mPsz3i7GZohEpZP>Bcgo3gugXnC z54GWyPilUTCygael9m;Qm^s zXWYvU?kd(^!0rB_U(WT!-0c%ASIxP_tGsWT)1phk`!k&aT7Tb)v}x8+5t{M-uPD>> z3oNJPT#SG3jAr`V8m{nyz1(?S;o|!5VimlF9JOES4mo*GUgsNewBoMcjqkO56D!%2 z{ypD*Vabt8+Y*#&cF$FtC+N{6B=F}#e!|W?&YL&6PpG7doY4zlb+{DIFtPR2-*18$ zLd}WycXys~`qI;|_n^rI-s*66=@7Fjn?e=~CUr^1iw_O0U)O(1zOh=%Gg$5Irw=Ys z^E?(dT*+u^?(kd0y`X)5)TK4nFWtSCoRDjp*c&?AR66L=y0yQ{4qLuyu(1&EQ_`%u z=JAtRaq)J8l!a*)+FXhG(hAWZV@`xDE-)!Mlv;fG(tHz}OF6NB_fBX%?kt$M?3>iX ztZem53)$<6O!xj=)V_PU^rs(@D*Ty0&1Nxp7?<+$avyo~?j76a*Q?cmKeydI=Z@#ROvZU@rhs*8-9!t!v4>6xi33lPy*K*J03QT5=HZ%+f(eVTF!XtPFXK0*U34nC-Y0grml72jzaTTO0#%m&4d51v|WF$ zeD8MNb$w-*9=v=z{bAkwGjW=>7JSXCm&+<03NY4f-8XsWvQ>hc9u%BVQsxw|`mkd= z&!rO;S>_$^7??m%)%tW9kar?OP_uy z`9A678mX=uDpJwPF?+*;c7#r7k$kY?bz9!Y7@oRKe0eWC)_EM-FY$MN?$WXy#@i0p z2mP6$ToA)y;C<|afKuIgk>hJTU6;8%Sz}=wyJ5S4hqvgxpJ`9d?fWep`+5IcM}M)- z`!6$B+uNT$ypB8H_CookwwayI71L+MD);tk=7uc3z;}7s@%ulQRkf7eXn8o@afe^j z^BtlO7aUWclKR$wcmAi1srwcz+_b0t%F!nuzaA`~`!v0X`z*)P85vGVw{%bHpYWXZ z>xcEzHFgKh&i<L&e~o`t z<641Z{VSs!#lp&*tV=teGj+JaO;theaJP6HQ**Kh&PGxUTZ*g>%tNu2bZ`b=5?4Ypu*%)&0=%J7aV% z$N8Wemh&u_WExj0I_#gFEckQEy(qybIc4#OyB+-6Pa3<42%nd8`r^K;ZpJtJkIVHY z$vGb3G}^$v!QETQXy%30_aDFPsJ!{aaN6?^+tf}eh8$8`#yR=g!>^l<@m1cah^PxY zu6X^p>gQU?^|L2#aQO1?bNkoF8|pU3JWg#@Vplgg|G{7_->DkWzvlmiUq+YbiFy1y zakU~*`}|VNl$@ePh4W^x{IuxwZ)vH2&N0V?rSHHb^|g6%7iTsw%>L46A~{d#rkZcv z@)fdiy6z3i1p#1doOwjVCxg4IGQ5o^mx)%Lc)Iao^|d#S zV*WCWV3h^G1QmoeZ!fCfV$yj+waT`HTfBC0+116I$IlnDSTM;j_BHS`KD+N#q5PJk zLB{Dxj{8z2GciZ=`(-U_{)m9Pu@5-r=&`I}=R4qAx1w)~+U*lJe;)=HEufy2WNX9p zJ%{CVebqiKe){COCCEeu_Xj;L4Z=SqEp=ivAg=hsQJ`dBx2D1m!gW(R(D|oFMobT4 zgGC*S#YB1gFdKESg%--7K>;^DZt*UN-|Ruv({~U1eLsHKhL{FEkx<;ZvH0`z8-XGA zWq;oODhLpf-EBYPXvFmxK4~}EGo|ZfZiqwC-)#M|Y|r@*-R^6f{{Q0=wKe%DGc98Fzi<4zRb;}ReqZ4$Y$)z$WG?DSJE}5;=2ia8jj8<2%<)G5DEDi#N6X}G zIUdjW{h_KW5mi=`K`!|xS{PxB9c^fLWluj8lGfcuwv zr%u1u;3{(N?b-EZ2cwNzw#@KIQEOYcSx;Vn??={IE~*i;YV3QW%bdO?Pxte}A|%Tl&K7>piUDceow_B)d_;%AHVPa%NqK&%;mV7f=QNDm~Q96cImFd|IOx$YrebHglQbw zo4x77vHkN7iT~CTG|e@X`|#?AkhaX%B3ce&eGygzhW;q8gT-_~ynW?7Q{@%8+> z-3(H>&jZZks^87Ov2DK_$D^9lw)_VyB3gJ`FaljhwF77 z>puTSwmQpNKt!hdcK%)=`E}KEU#&h~yk6gNlOOxWn7(<>xNJUNUtXI$c`J|opLeKCsm3x@Hy5?&s{(lqIE7ofH`lFL4dtKfC?-xQoh~E3LM8y8z z(Y+UZJXL@0vYs3NoMTQbhtJP%*IAZ7dTzgu_x+!*fm5oJK1{Y=f50JEPwxNg;)u%6 z{vTFXuRrqI|G%u|&(swwbPgK0<`(mRU$AAuqO1KY{o>rs>;50#ubA>}YQ>w0zYV${PKl-Tp80#Nu^F zWDtH_2Q>v;cXFI~ z{E|n!x?Svl%}rtJ8#8xEoZqvRb^HDQ$us7<{`fmT{%G|78kwzq27ex&-``ZXL+o~$ zc*2V1%twEBA7op-d^abnXzq=V7x#bsw$1O)i-YV5`c?A(-#`8OLf}&WW1~Zm#07`Mm#sx87kNn~%@!4@7U3^k4UvY3R-&evC|f7%zr ze|k-K!S$=fAAkOyzhLin=H^8Vcm6iNcfK^Sdwbc{$4$lO7yn9obm_Bk;PmaHylcN! zeCw}oJ8f^K?7L#kYM0nz@pF6ssI8gfH~EwHe>eWzw8annoEGf}>EPf!wvPAx;vFmb zXJ6afmba8sB!0Gf-+^+eM&VzaDRav;Cp~H|Jot3FqKB$mb+NW3Z-NIn~y#DIAPFsb7r0sGct{|HZa9!X}?{QShdM&$`(QuCKh{U#O$))phaG zUH+YC)T5l<=;+Lu*3gpqazZ74mvvTo@`lyLHv66Q-28_!}NNbtWle#1EYEW0{O{VGIeYYkFX*gdtY~FJI)2h6bbvEpQ zf`Jikl}nB!>BP)S(dnAh;lvszp-YgWZ;txxf32unKn&y z@w&ajN>isOo&Wh>Du_d4MoC1J*tF&CkFHM73=MpI$W(lud0qU^suTa8bJTnnusG2Z z{AzcH(xK{(1+`|EPdrJNotfi1w^oGZX8O|73G*3u ze_n8O+v0URx64HPp66$+Yu2)m+`Co&;nwf>j_21EnaBOy!gMe5QeR;8N-I4wCYZzb8`>nmoicL^Z$md(N__h6?4PR+G zY_T_tySedS?3C-*4}0=E$(Btz`Ldx`>8x?}#_pW+zE@j+q+I4xNk8w}aj)~NH8;y` zgVoJ9d+(ZXZanIl;-t1^k|Rrm&H)epIiC!4;wCit$5pb**L^X(w(p}|EB{o7wLy#5 z8j9!d`>%Mf@^h`lU8PwCVh(w-ZWE6BxLPkX+4bRLwY)G86 zul_&th8tIOu1=9ZuOIy3M-{0&!?c*DKd#)Wi|KZ+o`NX&E)-49Jb=IZ(rt;a{ zjBbCr`O(Ki`{y6sRr>nFpX}%fb7wN~+kPp%abm5St%&T>h8sCKHzam)O#Z}tJK%;v z%ZCpFigMYtshVvvaaY3LA8Fe=HRK52_K<$p%!`kcKR36_9o@J0cjlwp?8zA>B~q-n zqM|NdxZ`JG?Wtz|rcC;d$gKB|vh`fg?FxUu`4}bNC$^-WIn}ZJ>3_dVMMro1z4zOo{F+J2 zB*&Widv!CM78zDQ<2iHU1cT-|kq6;^DF(t{RVy{}->C0?CA;IrAJ%}~?g0@|ofBT9 zw7d-E=PT$)y$)CIO&8+hdz`we_CM+}-I4K=DaFrUA#(fTWtZDduiwvllF{tV8GVP45(}-9 z>#C1_uWL{>e!S3l#>JT14Lf>fau{Z|mN9#Lew)9lRn<&VY_eeH%S?mJqZ_P_dU$&; zl{lTG6R}6;;HAVjHzxC!258k)oR{Ueq}}>SZaTBlPPt6u$$~Ny8#tOdqCMhvYBq+c zg)0`9nYHcC3W&VVXPLRg)|uln59@bwQm$!X(;8|6JS^5a{0fM=*zn@Y%nK)% zM(ijt{qjgozQEZ#|tTFXS7O;to#s=l7hauKzMOb;)#r?@f$d#wc`9emwanS_-O_uS!@GCKSEzGb7CLL- z?tlEK_*#ef*opZ$dhyMt!`C-N@`{LxI=g@OshJ_z_|WjslF5@Md380*th}6lXwlS% z-RI2`pZ0!Nv^Erx?OiGn>Y`8_wWY!Ef4}mFT$ckEFZpmORIcd#V4FYthP&X-b+VVQ zzPKy!>(xG9d>+wzJI@b)v8;+XH~gpMAxT_zrAhmC6%$-{oTJ$ zAASAZPnLQ4asQ}zld)p0{gH#$H8bDLUUB91vcIWMt~aUo9S{+iAvCc&Bm2j6`F)MN zyH`JWvGSnt|0;IBTX!CBiZ-;cQ8IbG@NQF2h0T`Fm){@ki~X=8M?&I@@M`g9=Guau z${)oS#eOzA-qN?9cS2jK@>cPtyG>tCZcCFdQGb23qqmIhSA6~Q?^^DiJM3>y=)U_@ zS7U9qvtuFezYmYZrj$n>->bbTc1Dx4t=929KP)qjYka=;T=L(Nf-pzNrbS~=o zZsWeJdE$lWt%Rq4UGx7@y<-@Kk>&y@O>w_jwu`F=UxI##yKD8G4)y&3!4S4(2M znzUn1J-0vq>-fISuean1wT7O}Sdn!=SU=zC@q~PK-Rkr6PbMt4x~nq(Lc3vO#N4n+ zC+EAZls8*7Syk=&hZV^+P8)>du5lLKdU50AFSD@e1#j#uYC}ZcA6styJvkwvU=QE& zvs~LWd$f+T>)UlRul>7a=l$-+eT~g6es4F`Rlc0}LSDXle@pWBhRf}L7k+0qFu7r0 zS8tJf_{uc@#DsSR?QLv{%L_m5YX9)Q{-1E~Ugs6rYZl3_Z{a*?nv%NDGV;@fTDMBh z^7{NeSKQh6=AHVq<1XK>{I&bme6i2I{PcKn)0^g!{9S*(ue$KQ`BZnlbQ^nFo9$iu zzkk^cH$}E5r0%%9!?1tOrr=t#9GI^NL`y(0x=V0`@dhWW#|lQ-LZ7~!(&g48IKG6 z`}Qf#2bX{(vXqBNr{FHiTan!VBi%hQ_`-sT={t37*R^8X3H z*Tr@u%;m9-&HeHF*4zxqf`@mG8XF#ebM$}hoc_cU8=qZbmC(~Z{Cume#KNaOGdw$I zeG|M>@HD1GG+bf+oP80tN-Y{%&Vm+2Tt_W^CRqvwM}b;EuI2-@kYpGwIxu{KuHZmp56j96?1KPv$jOVRQpNoyH&%` z`$XAR*_N~WkV?hd(?vWtV=SKksWg}@eoVYrYJvKE%goKolG|=|UEhAyVd3S+^Io46 z@AG68?TtS7JNshP7Ur}f?G0IuM)xXzI}3bG{x-+w&AHWwzC20X^ZU|fja7NB9zj;q zmK;yIdy9W!#W_oX?^7lj>u5hpUwdTh>NMdGc{#sc#6G#W>f~CUW4)`zA3hF`bLY?9 zKY!noq?Rw!5`z<2m$YfbY{(HS+IPogUw%wPWo44y{QclJH zIx1283+_EaK=+D)b7fXIV(edrQe*ZU@)E-+~;TY22v&hPhr3Gl6E4&3}~visqf zFBMxoI{6Oo)0ICYY03ZnUYX>cC9#pe*;&k&sj{kmNe*(Bo!3>pZg#i6nMlIHLy}Jd zGFjHw1vYu>&G5|&iZ-Z^6ibPHo1wnxUetxw_EdswDdKVsFm3d>s(v~|*$_`44G>VqoGqq^gYW=F<^3jqc(6ys#$7Mv{oY(vwpG#>^GcI`-;+{V;8cNh)8>eC?dxnTRQzrRml>mzOJx{#{Yr84!BA)AD6uQ~$*5Or;B_T_u#6K} zJpR_5mY82?oVU|LT6JmZi@di7zNtxXN@CiueGfC2(kZc99w|Xyi6$!oV=nSc4f8#> zTExK9!@8{Vp^S{n?+MJmy`>7?hCWv+*dV-g?&2Ha5zNIQ8f?+G6S)4z`ZlMkPBviWdA zd4}A&qu;*fFSxkQeMJ#VwU@Pm()=I%f4@8rh&mmZI$8OaP=~1Yv*i2p<}$D{c}8zw z`#eeH#zt-SwXt3{f4b!tuJ4FZU|FiH=F{D^DAr(!&Y?>x%xq6g0#n=;Y}v#XUG_v_ z(w&dno;{xwyfskc(emUti=WFjwmw=|eJ!E>onBFLOi$YCSt%Qn^4BsyKj*9Lq<8$B zo8~$@bt(O|e|utdmL$H93sT^cDio}I8#8sup?}L5E3BguXBx_%`^GdyR9skW>I}y` zsj|0cTbsTaT4Y?&sWN_+zWjnq;*nRMH>>~g`5E5F@N)a{8;k5!FL%kGQSfHbDLi;+ z;iUzxrOv8cp0f*2@m@G7vqD#QVTNAimL*>_|440R(=9bEDSkfrTUg87C(nRgDxcT)HQ)pfPHpL&wDig-_QHZV6a=rFHMmC!fj=_}VAQ z?n&8xe_nX=vU!3=)e}71EI%*WC6ltKqr3B1$z}<8QNDz)b1D{Q-8T|9U|X>;KwCg2 zr^U^0-#Sk>+o_Xg$EZ7^WktyRg!?E?$tF$K5xA& z>&bPBH!m&vV(|Lv47qHj<-xKyVz0OF;4pT&8uvyg>qz=;=?h-_T2+_$R;v^pi8Q$} zHN0`pHARi9UJ@(p&&2brw!XJU=$2^UZr-P@E7I~h@0!iXWM5-;poQbop35Ge)2x%9 zKG`YIS2jzgdu83H3XgsHhnkr=(_c-FYk#nTWslDA&?ck zD87BtADcI;U$phy($H00o?-pjK*`+M-!4BQ`tk|JTLzXK+KWPcnAh&&k+PlX!FJ)E zxl5X+QT&Csi`Dt3Dj6kvJhd`<&O3SLS^-hrSd+{jd#tPOBxRVGq?y!lSsiDpFpy#L zbTpjhY|y)TqgN-k*64Eazi}_mw=bDy@FJt=^Y__}j|(djmdxF*_Nhx! zAg!Ub=4Q%SKlhj&T%k{0HCC=u{(d$|LzVB!#rH|&=jx)~N+d{}wyqB2I@BXLW8S=` zX>+9m121+x+{ah+tn7l18V}R|e&qrlmSt-uZr-)$%i(J;nFWRO97T5Or5+UWie9th z&9B!J{iN>9%e9;^p?US1oTy#GD_Pu+E!w|J;&=A$6Z^kccBlnuX1`OL#N(EfW0G{z za@x@)?bDgUU0i=|TfEyC&e~;z7$)AN>-2$)Tq1 zy;QfkLrvF6TUAC)>1;~|_tw?UOJoRSs@_bZvN zm*_QFn7ZCZ{vjJH?|z9YBlnq^Mpq`W$t3YKoD=C|eey-uzFb~pqGyDKG3PG^X5X}h z8S6Dwjn=Uo?6ltZzm~^r>Y}MrI+k{eUrJfU@N-9l%VOu4B(9w$Wr_8UmO`GN#XEIB|n$Gmts18=>-4Bt%ppGybF*2bn3(=4xj z{AP9Uy#)!&+VYd7mNHz@+IrrlBw}eKX%?iCF@Up zy#D$|_@%TFDgul|VJz9MS%2^tPH&5*T;k{A)|386)C$~NL z3|R-htm8nZ;Lk#HC$kdqovo?2AN`+w#B7bvn&vIxMIMh-7z?Hm>L-^%C9 z)Xyim{QY*iQs(dT%a02ij%+Sqv0$1kU{UJg$D%zctMK?5QIAU#&U3gOIdq>TXr9Lf z;q|iLYy*7xdQKeY`23KkU*!5S-J_v`Pg*C|1g{QpyEDI3F6m_IYKK`m{NDe*Nof18 z@wb?#z$}=XQlM40{ezLs#wT2VCfS&?o#fL${7PEeIPQIf^yA#0uTxTAT3^*(miyk& zZS(rtY5nSu;N}9mCF)(tX%n0M50q@?Oi;?$Wwf%XCQtfgqsYzcFL!m$(Q3_PV#zNR zS}C(oirK_Sa_0oq^(|lK#wO2Roj;`w_$I!kw0zKyY&w^b;Mi)Vu1#NPeq z_XXx5Qe+kU9CDc#-jKyrtj zkwov`xe-$~@YK(;6Bera@nU+rskF+8#m#Va7-3$nsPja3!?LwZN~J2# zqNY@A-p4B5)^H))mc3#=VJCqdrn)r8o=+<5Tc=5Nqpn0}0Bwjgt#`7kE(B z;Ru)s=cD zTBw_F{lBx9Z+gy8j)_nBwy)VOCm-@=fdjutQn%ceE}O7Dw=cBEpSR@yXk_@Ud`n{4 znVK_KIsvfTL-e@B?^%w77z z#^s;frzN)MCpEUFDQ~^q`DKC1kqOK9CT`l=-(~Y-O=na5mg^6ByVOs4{t>yecaK*e zgS!JH2qwhOGvQyncWK480`+gax(D~3G`^7k{lT{{KP}A7dXwC4ZP2h{{uH49>_uiZ|zKZ)?3QE^T*>y+8=H< zel3_e+0g1zuibP>)5EnK3tx9evCf)PCZnMHyX{EM4BMy`bDT^3dg{1TuP4j8CC}Gi zu%XMxZfk66#e>uS0XzT5#pH9j9M_np(JL`nSp3rT=-NNFBm4X8H99Fb(QQV!S;`oA>v&F~D(b)5L?WzpzPu8<8CdPNa z>XSM$t2)4`(B$*)Wr-^fHq?veEy{4sx)MAgF0)?T=2!qrb*ado9n9tLZ}h%jdX|Ol z(?^||PMQ6Gi4D7Nmbum4sXNrP_}+)TIkH^$?vAV~u_RFuhv|o= z{532$e&^?NXxS^7oLr5zrY4y+T>QsAtIl71NAD=_Mb01T_thkt(>E?%*|ca+%~_cPae_-U>_y_*&WL~6GQnxO;pUDH$9-OW*-)Uf zX0JZ~OsyA6bBiA?JbHb>+BEZfIk`*9Bsedbirt-4yId!s)VSJsb+FU?H(wpEiOuwU z!Sr_{+YR~L+WvFLgpHqbF;@OxU!Z(%%}UAB-ld!D3}&wIt#}!{qPuqaBB!L@i;R<} zHvM;FIePJw66gLCH(zAW|LW~iy5aoBHIJX(xUIY9{hGXK?X~t{i_8nAxvC|9K5B0f zrdQVss@D3H3Uun9#2-HPpEZezv43j18tXT=;}1J`l-qb7TPHm8U+H;wCl1|Ziob+rBuK!hQe`GIR`rw?p?}n4TbC1ONubVUfAx8nrzO5WSGf$|V5jp6?nI4){)^BVh zxU6gOTDEfq7k5^GN~M>s38!4@WcM!GzINrLvQ3v?E8EO9VOf%*x68`z@sg{@wLuZM z&l+UR{`pqooQ#btWM0@+KI?zachCKeX0*P_%d-~k_g*~g1P{;qh&E~pTV^*1@~O{V z>2&rpq-hb{e84bnyM-z5rzqHZt|y=cTTdRH%zg|W$G>mEH0Q+r!V{IvGN5H<4=9y3 zc>4W>EFZh2Y{}%y2R0|%{(bUj*Y#t9p#5Whl1yigPjOnP;Jz~W`ugQQPmH=&p8N+* zs4|U{yAO0~od{O@B%J%=N!fI$CJUxImSyV>|Mvdm53a5c2wEtEnon*#%;M1PT_7L$ z%UH)v0tdt#LC^v<<+eudgAiL~Ks&kmWc5#ix#u`oEGEtuJba)P-2=TB9TJffJ~iBGV}Bo^Z+~Z+q{dm){NoX0Q6YHzb{WU3M@_*0Q?AzH3Qbzx3k8CT{neKF+-1+JCxr;lhg> zEw;o(w7adCU-pGR;^9Z$hezK0v37sZ;Z^k;HuLWO9^OAa_3QifSy|+HP&YzU&FeY zb>`|%-<{;Nl9c*@Isp{aJ8l8K(EVPjB9->L~RYa9wwjnmT79G(;|T4TWf_3hsc zEbI%{ZcT%PI(UMwgxPs)$fero@_7aZJv_)%{2$-$s+5BAJ zrNfceqJ3lWalJ477AF&Xxe9J87`G@|+lu}E{-*V+^1(AbnHekfT<5!YaxCWi`n9y6 z!ez!h+x}at+*51Sm4ufkRt1UJEN(t=cQbqQuLzB`VQ=ni60E9KNL#Azv~bemU3&yf zOLZ@>wI%z7v89+yHJc)~VAV!h!IPXXa&rz$V4h){Z^t&vE6`7Pj>|Has34uS4Q>X> zVM2UQrYjg(af$w{lql=wyzEnQMP%{PauG#G#SGo^uG@D>C$2uMezbWW^vO@QC>(zN}EX@*?sl7Ai+A>c%{61;DY$dzb1Pfc?yHkHQxb=q} z%D?f>t?F9Lj%w+^pqmWEAxuV>Co3w(=P zCN``u>I%GX%GB?~*?gjrZ@Q4VzVDH5wNEo%Y<6B6?(C%97T7AceZ9}IX>VOM-pV*e zCGn)ORDXQAFYOD@?Fmz-_8pzb^{4tTy&t2OtA^({N4wdQQT zu0*YZdPxG@LhA8LKZ(|rr>KQB)7ggd(h>87z_JsmWxk|%(=R? z0-^)^rhQ8jnX+BE+Rx1D)Th9Ju&!rzQS)xOUkJMVAbQuXw!o-3F7+b?myRTGayv)3 zu*lrim5`8Vj8L*WvU|~uyZwhY8BG!RDL!@j;*DE5otv2_XqZamtaOMhRlQ~XYoeX8 zY_D(WgjdaiLQ-taZj2pIIeIxwWURuN&Kq;z=UqPinO2c?hJYOG!3z%CeJc+&nAlW&-^0-tD5b*`k0mh!Jv zTo)Zuc&hd7et!@anQ|o|Elf@2uuv38vQi@BWs9bc+~K!tSFFocc^k~PK3SmhXX-v1Pss@a z8^flBE?&4({KJh4m!i7+zUiF^iDG;`Ynz{xyr#>Og}%N}qK(*TAj6 zZ+f%f+KC?FU3**J+h2RCq^ByjxYV@b=V_su$_0F0Qr$+gQr494ms~YXD9=>hCbNL^ z;F_cJ{)Ps;%3Ra6dc*c5oVl{h0lVBj{<|jhW_{+dd&>k>+B80#+~&0AcZGi26h@C; zrLWD$4*NfSBe!K@Wome)wwHADhUGJ-20og+_GiW4=D9bnn)J+DR%P=!aNz~-fAa1R zN|X#zmA+578?`RPabcL_>W`U96FFZx#9Mwd?^QB2n{*|>GECIt z>1%Yf@Q@B&^|WBe9F7ZYN?JBkW=#|HT%j;sQ(^L^Z$|;OZs1H+yr zA2)k;?(7SBUDDCP*BrIJ*;0d}h*eN&=j+hyEhdSriVnK1*D_q3YL+}m3UYsH>J>Jh zTd7l~s##L8v2nps7E|@ssI?2Mo(On`x~vK`kPcN@-F<7af|(xULq#@|D_0UX%m zz%xNn)vj?%`Zamprl!LSgAJoZ4rdrRtq&F~?0O)&vr~i9eYSAkrk7lwSX&QCWH{6m zvGEwGzq&o^!9=avcLv9^rmxuA(b3TqCe6U@dx%lxcR)C|+Z??W9;;I$JWQ=x+}#eH zxTX5WRgRslz3pMa1+Fz)+4ZEX+qPbIm9mX354yQvh0Cl9RTGLA2uf~wl+d~JLCDH0 z0jK`T8D$2kHErpSxM-i#?w0OyYzxZ{8Rr$6YnRq}W*$v)$>^B5r7+ROz~irR@O-CU zsU36kdM?2}KY8v- z_uRO7%0TT~!pwb+>UWK^RF1bPM6FM``>a#BAWHCq@#{kFg{EvyjxGsC5)ON`RW`=7 zXZ%uRiEx@YL7?5kcthf0wjIpMhUH~uHnO58PU^N?N>RyLq%tibrGz1tdGUq_9S%eG zgV%2I?2cfb?CD>cow!JTQ_wqM|70#VnZFZ)JhS^cI$V;RcqT4qTYUKMhRI=ZyAN?P zK+ghrxygHh`772)rmrqn+?ZAR@=7jwHK@+j6Zm$n?8q{e1=|wXi$1NMV5fh2dF{kw zc?K6wHPvlzbkPVBoS5Dq`10n>2^UW-Tw5)$aATpt%dZo(N;@{r*qHt~Tw|5m<-in~ zphssiva;Ir3^=NK&j&3vZ(T5Xi^aw;_8=R@@Yjh8cJ;b^`xdBewTmr*i>s}TBYr}^ z!BnA6^)s`4bE7U^y4wHaX0f2SXotSte;(D8GERj0twb51G#nQ~%=^>KCina+oj zl@g_29AKE)-lU_*v1r%sS+gCvS%M5zw@fk+>a0vKkjy9&cJ!ZLH7nz2pCC`a#e$$+ zt(<*&j-m;RJaw6@0?qfGIl0u1UFpJ_!zU)lXB+Z_m>C54A6e%d*#V}8;M9ky4>Cx!eh zPA%!+Fm?12j^~K&SFm*E_4*Pucgp-nXfAr0;|Pw_e1|zHO7Z_H5nEc~Q`0 zCWo@pGOIHjX6y=jXF3vgZC7H7l$2C*ZZ5dWYMl6~XVJFXjaxDkoj4&ym4Z_5l$DN7 zNwdPfuhv(5an1VA^1j!b_b+CfpLgo$A?`5cu1vEj5g#}^Q+i(Rm3!oA_+ophM^e;M zmsiUBo%Lj%H}2XRJosLU zJoymt+$E=H#xqOJ0FJA^lV_*!+)z%;eVc#$SZ};i>BFBM$(z3$PTK#+ac5?&(KY^M zzTSVopQ@1EqO`dBSpS~sYlZv{Jlwb6c3JfA*HZb1{RQTuwo{$s}cV5t! z(>S^3z=wNxQ&>MJB>ZdgG@UP^w7r+-!ldiY{6~8xOa0h3x8SB{a^72pXw?}f`F{JV zq)q$aCA!7QQtD^DaF9>l;Y?{q^S$%Loz8prc}<$!{m~fIC*xEo&{4A2JhMRMa^s{p zhM#&WE1jA%jJDQH_H-=!Y;1TkkZRUD4K8ER?$_8x>^}Xj9LESyj-lWYUjDAnj zUmhsj2<~b%$TRvqsZ;p@-3a3iT1_>LPeyz;xR>%n@PW%a_ojNt;;GFdjVE2~o_^0f ze`#JZMEilrmWCG+)p=@r>t4Ki%~~Blu`GU$YwVLn5FPpEOpBKu4NzGsvvG2J4o8w@ zn|Ig47ccD^=jOSunLi)WnUQIn+`w>q_L|v-!a<+DmQ>7gdD5Q#;5fLW*PvXGrhMS7 zdiu8?1uwz7hYnl^^$fEWA4x*EGkY1-KN(lo>?i?ic#tjlz~$dofsZ^8?isfR;h!^Y z?P9FJ{jv{RIee=6ZRRuG{Wf|2%azu*{@>bG!3LH(AZQWDqQP*=r`Uo=$Ky|8rqIOu zlRw*)nf+w?DK~ApJlIE!eFt7TH7IrG?)qb=)BoY<@wpnuRFtL%+xUw0#{QT+V{-j- za0gAM@p9LJClh+?3e|3&IL=%#FRZZgG1x^7$^{lo!cIE!MVUeq<%_1ugL`m{eFr4_ zK_02=*wFx1_uvM{94n>oRSZVw4m;1+*_d4Q%4*)9=g0kJz8#%kpCtM1@9R^tVP~iC z|9$(5dsA}%?fQ~8{tMqk)H`mHE2`;Pr%R{r}qe_UHMJpib+9Es6z29diV~xhO42UVEzJ=){vV@;F#x{AQS_ zv1p6#t5M=SR9dBR)LoH(qDY{XFw@kimh7!8e5aqc#w>HtnEF|EKG&H&7c`g!R!x%6 z30~#AOjSmz^TiF`p!vR8%!{t5=+}yOrx>he7Fcu5`LLV<+Fk(7KG1gnsO!G?ZV@e+?_6s8f!amnIG`E@mtGAX7NX+KiuvO$_29oW_-DJ zs_^7NkJ*AJZ#-w+`0~Wt9H;Lu4CWRqE1F2^>+h8*=sBQq{lVWu{EGZ@`6Hk6{n@cW zB!K1d%A?|szFWt+$Gz9stLXfhb9J}iyyKz<&u0`>E)`Gu6OhjZB-;>(wrH*;c_ zT|2Y<)Ah$MfBm}epJC;nw;SJIN%IL%`e&rfeZA(BQI1esBU``jE;-J5ayO1>MO@Lk z@y52I;QRC)ipi$uOr<$*h27bgZCz*iUrR-6&Wl&M$Nr1FIllPxI@ei2ZGUwuccdRr z-%xo&#i{da{EUDbj9>5S9+zL)`!h<@DmG3+)vu=ha@3obZ&{ZZC4LHJad|ZHiv& zpst+bru60f0?y;w+WY(UZqO%yeO!>e1=S>HYC{ z4^NeH5a-h5hAqBcE|1F3$MvpOUgXJ_PO$XlOc2}4 zWAE$hT6fn^hhuK9xX~uXQr^cG|GbS5n%lZmjoED4n&bCZ-TL_V<>rlM^~zc*hCh;j zCAoa>G_<q`s?cCQEhfVEipDcXA`bOLQ zcXv9}#C`A0Ide1itg!oo7J-B_Rew57)^{ggnoxZ5?hI+6=K1M*;vRpFcGXtw-`3#K zBoUhE)D+eE{B`z2)!gj(V#RlNw{phjZR~IOySCG&Vr35dy|>#Qoi7f1xM@ShjFUYA zD>x6v6iXaBX|h=9t?xq4W68zS9yFht8*%+2_u3ExsS7C&j;@(t5%D|gLrSIKKKtKJ zccxD2S$Ht-i(|W~vDl++S9HGg@Hl!uYwTV=zq_)^RI06Q!qge9>SAk;G;C$}ayGgb zS84sOxBpOZrF6i1nWcFF_8Cf>yzFp%P95+2@0JDGuXvuATo0-gf3t=8^|39*A6~bv{&2kYH2=2pduw;t8?yah z!nu^w>x{zZ$#=~=4|?W6XjblZY0%efX8D4!5$ynpuh|2KQt=Y(F}Y4&f9 zWp3KJFZZM`YwvAtXy9PdN_wL^ZOiN$&wte&>_y*20U3_4g-IbN*D{#zG(?q2r#uj|s^e_m6*xBC6}n?0qRH$74~o=&@B zc|?QHlgm`?j@XjRi~nD}BwgU_rL&92Ipg8071!S!IP+s>fb}thoXLgvb@1*dN6<^;r@7%{%HzYqSe;YZm)8i|*Q;(Ve*SblY4s(CV&(wT>)MM7f zy?Y9MON7cy=O5dasQmAJlk^5V6{)qm7+u)aA7p20f9Rd!@@L@}1`)f3Hzv(#KK@+S zQC|J}otDTs8ph|=t+{9F^G97kfWt?yaiyT;&$ZVr&dpdU&zDytu|KB3Rz>K4*2C8Z zw{lhVjT-MVG#~C%4a&Kb=2jHJSGMk-(4;*w3+|V0o1ik+jG3=2G&$W{HN~r5;|1gF zIb}aqiEc1F^H3#l_lu7|D}OsMbAQ_s{^0Glv`WmkE_b5w&;lK-23L7$(dJt;IqRPX9*?aee%lZBPSfpkvv}aGR7?2>1eg0)KaF6 zvlPzndAIz-;g(Du>si_XR(3rOw}e(qQ9h+E&>Y6S=jF?8B>@4BKiM2Ux?7z1cjs&n zp8egn`TF%c&DU?OwpGcSoOE^G4UOKymmgoZY1wSg&=ykOJW+CL@2_`@3s_SRRu}#B zY5MlD_lU6eyGB>Rwr%gYPBckQil|VYiD*_6r|;wz5m zcilgD{rS2h_SftiZr(c}Y^MJw^JuKbDJiE}m(EC33f9@AYsSUR?p1KN&sWP9ID4a9 zz1jC?TLYZWAX4r$ig3QH{DMB#^rcCL*Lo1Fhf4; zk!6VUTVuw#M%RqDv3@*Rv3Zls+f|7gYuH$JyO_x2yU0sCBQ73fQ%!-XpkEZRp6}Xx+tZw4@$vc+Y**a~yeP#wvPKW1_6B+9BUS>GN1ei?e z$v2m(beud~xyn z!!I8c#EzsW-@DD-zAO8}+b_p#HDj*LKK?Pr-8M;rEy6$O?NvjQgLYY^k7e4Kb}qd5 z!jNaul0OCKdAR1!+FG%2xA4lwg)gr0JESk3etNm}k`yz=FD{{TT-;tXn$48iq3M|w z-yLoxtr*N+%#&_!fBj-h#JBR=7^cGtXDw{4y6$XndGaZ9GGm+Dw{Kq+j5TC(Zz&#W zQ%Q6Uv6#g+t1u;@!)1Qk)<8jx*V%3lPiQQunX}=HnQh;&tX-TSFc`9>~7p5Lh>3pR@HU$5tMcgKZ}y*I*rbHq93xHo9OYUatV zk61VLv~tnP)R&t4{yIMo@6oLLtY0%J@e`-;$?WeHPv76xx8135*FyPc)u|=V_5MyZ z^NjWQ>*;z+?dtRA`DgaZ#mcHyWH0ESqit(c;V6B{@lxSDv!%&DiuduJ-+ZKCr_|_`X{To&F9+uE#X|Mo^L(e;w<9MTkNddwC~D3lYO7(pTG5fqpwtdNc^kg z!9OBjMX%ETJ9S&N!Gvwz#|s}>{Ga(-{rA*c6OL6pOs})K|9s~)+uDuu_Fs}Nw)p9D zFJ%f-n3i4RqlDjn+w^6%)^^1_H<;-8_OjaXo#%_{!o2>TG`%s!fLVRl>WkTh4o5}X zC!5XBJ$zO(w(;u8pAiy5UF$aH{h2&@#@ys>!rUv*m)#3^d!c{c_T)=GAHx+C1S;g2 z!dp+=zkYoAr@~1oszxHISsWfMHFck6+*%mEWt&N)=j0X*CdS4C?#dqoUH%DvoZO#R z9Q9_ZO-P^~KV#;n-zz@ce7aSuPl$tq#g3JwMf;0pgWfI?4h|L;rf?xf$0y-Jz89xC zI4CFx{16fN;gE5(xVU?xL?8Dh0Edq}3*XmmAI@g)Yx%DD zl-cl8x8c8b8ErF87O)Km)LR;!^Zx4o@|96(zlZI{NCgD}0S*q9WtvP)CzikL6ifpv zZ1i?@5cs)NN%a+ko7vT%@F}w@sU;HZ$_GJ$0xoqcJvytv+=N+53LQ1G=1C+%Jhmf* zWtqzpz14zKRb3^n`OeATzjU8esciFe`}%$V3g@3+Q~hv<&CHmUTp{;w@XURA_qo;G zZ=6@IT{r6gwe!mkak(#=fA#l1Dc$)r-tybwUvqNSPuKFcbrz}I*OFxZ^1`Jn9Fr&3 zOTV7^@0$>xP$&yiyaC9%Da{A%<^Qwp`+Qh^g$ifSwmAo`%T-A{&2^sdedF7ohlX#g zV*k$DDEjuN@xL9rJ64AK{`|JNd7tc`s`Ty7S|E#Zq zz?JD9{>JZnZvNa?EC1ugQa+{5din1*A7c0Hsps5PX4iQn^!vkYp_LhWwq4@?cFHE3 z$=|8@Z5uIBym9)r_eW>Ve&@7cBk%3+a}OM|e(!c*r`*=s-XFK`&v(4Nf%o+K+dZ?d z={S5`IJe^STjeWS9mjmX+jN-Z%Wivb$#pov+Uoe-9iLy{KlJCyip^y^*J#xI_I-0F z{>94uFVC@WP%)NiFW>vMo2tPb#od2$IcaFr#!2g|ho_O?pyYevK zKi_@!8lKO>`?%`k&CB+GO1H7U(3m>=-H~abJ3W?bO*oc%pz*EshUXcof1HI2t~Y;I zww<-BSjRcn^hW6eo;LRA3H!f=vAm4__(_^wV6GKEzkQ8*Yrk*B$CK&-_g1;4#jz z6f*x#b6T_1TlKi(>&j;d%(s;{Uq7#L`u|TVr*8e4xHUmnZbzOid9J`ina>}_k zS`J<_dQ-DpuH2?V-6Xig^IV+EqwNk4J~tkiqW^z`B=^U9xm}#~{~m4+xUu}$_x-i{ zYyOs2e6g=@>-b}OV@prhyMDW_%U8czlzrlO`anb2>{j#Q_ix%>&M|*l_Ugmt`TxY- zuB_Zq{McyDjlH~AMW_Yy&vBWO#8Us~?q>;^7e~6!|7HHzz0P^jd4qpnrtf_o zxV`u5g9i^6ef~QC$6;;_-CND^|4Q}O-LK+*w3lr|?rlArpWVj;mR^1E&N|=aYUf@J zEzKk6<^M_w*ovRNT=U`b|38eYvZ6Qq{rOy>`{ePn+UXC=@7!Or_+46&iBZw!m4{b; z{POy(c;lQiDN9lUjP$IS_#O+)X?&=%>u1Hwo%^3Xi`BP!{-O8r_u8M={kAsg zKfS@gTJq@ee#Ig;zDJK285XC>slGTjYr)&aCUJ$l>uzq5Ty@dw&%5`(FL>YFahLs- zji^<2|KpO^5}!5~35ZT>inJ{Jar=B-&tcoR9q;em4%qrR)8=25;w=An#~L5iG{o+N=ftkDXa&GMrRGzx~!}sP;jT0w7Zwa3;wPBZX{=$We zMbCe@6Ee@*e5(4l1v{3>wDZk%IJIV~21oeA&int``WksYom@R7MQ*{ghhNh>zi!}s zzvoxD$XDry#ykJpoO&eRctD)H@$@gQHA|1rl6l&@HTs={*9P-lvsdJ;?>w}(Jomx2 z>WPBSn&0Vl{SSJ7G1@cIebp`Pl}h$2A3whIb>ZUkUAnX1AGl;{{_vuFE&oTui5%B{ zELgvn)wVh6gkDa(&3m?f)~YC0!`yCz=djX!j& z_qvju7K7gI*}tYcWCY1=yH}%Jm3?l(%Hs_WxJ3%)Oi4ODXD8SF+825!w#pjJ6n*hJ zqggA7?a-d%1-q8WYVRx27SoMriGFwM$;9Z%fkD2$JgR>}{;UomnsHzXV^y0f`d@|9Nf!)10acSV~e zJYA*A(eHKelc@BDw39(BCt^fmzBTrrlGf$*y^wWwf_8I-+-3nusng$*9xQ#d)#2|o zrT@7YX`nOj-9g_u9wdaeJsV5(gF ztsVCk*S|H4`y<3r<0!a8M~VHbT&jx5|Ax(6wt=3U6C~L_oDb)JbmQFgi$*KlWm=~k zul`;5=!E8;(hmZy6Xwc!dUB@g@7FlOc5~zF2YgfHYPs((HvfOl`uK-u_mWS{vliF< zcu?YUpF_66+;HX1K^-?AR+u~73XSf`-Q72Dz5StI`$P=nUfDD(Ui!4+)&Bp?{(IxP z{v6?Wb8D~sQ=Y#yudVMpcL(-rymEI7kl3Z5%v*QRj-!|7h)1?|*`8hUuI%xy(f2u= znwk=~MiwsGz@hy3+2`r)haWmT?M!|lFZt=lvk7@Qw{ka3PFZ4Os`o0YtlVVLw&?z| z+jCuK6p85nE1v&+UelG1?#+|$Ed4N{$Rk8+k7!wn_!$?c9rk}-GM+!vb!_7HZwnSJ zV*34EW(n6U@vSCPU&yaG+_}j}=GJF389&KKmp3mgs!Y6ghNC5#O5{S>D*k7x=$E{P9t#pzq_9S(lV=RBjO~ex~P;vw;8DvEK;`cYF=FoH-@v zVcq+GM(0^x6%@(beX5ZyfAGx_gFV~+@`{MhKlnO-j!RaS%^g1LIWp!IaXD$yw>KQj z+8T82a_^)=xfWs8Z9BQe6lQ3-C^Os6*l^?G<>1aw-xwdct(o%gL?`F5bH&e}S^xj2 zEV8edLyp8I#_O4{8$U#oKJUwxP0_c`>asbWse zYge1ie}CL$?7Gj?sIS2EY5oSEzUZn|4>Ig+56zIAJlpQi`rDn)j)kQ>Iqx17qq3)Y z(FB>r2iN8PcL>bY&#U~Py`%1_lg1k7isI*TGdwMf)0QNid~`IR_|=4ywFbt@a_!&u zbskn(uMJj1gAmXOkz# z2Pp8^zO^X&lvCS!w&|#Jp6jfBKK=dQ#E#un{P8JV{?M$YKQ%13u(NadD3sRm6>sDJ-BR}G z!kVT-%6UNjuqpFF4@vWt;hfCo7FKnw1`In6)#XS*_}H!GjXfKgx$D+GZv+CM#NA$<{_U#3e@*3-d7%wF?U$}9z|7Q0zg@(WU zAL5SP;$3|qG`uA^_3MY_({s%tH)I?&mB`U{?>C(Cojc`&_l(wPv$$rVwmawM&HlRM zZCcfJ;hwGHa?K}w-5uY$C8Y2${i&HadG>3?Z!^26DH<9{u-~f^?#}yZweF<1L+L~5 zj0>y}XZ@6vuiM+TmZ|YPBa^O(=5z}yTa7==izgNyw~T+gX8VuLo60}DxMM26;z#8@ zgP_n3`9JT2e;h5=S1vL7XUxl1Q}zDxkEh&QE8aehf1L9mSxVxo=IjKyS4Zd9f98I( za_)in`IStXJdZn-1b!$fY*@cr&~M!obCuNEgdM?ESx=eW>;24rs6TtCegBW%e6xoQ z=iIuN9X)X=J-%DsgS^KuGuk9W%JmNRqm_2Gv%fFP0lWt1m-@A|d}TkGZi?8r*m@9@Bu!{_Bk=b4B2qs{e>1plvL{JXJ8<*BYqOHBXry3ZzU zZ;fKkZ|8iw_Gw4-4zXp&gkJ1THZ)h43)^>g$K#{ZFD%=hc=MO;2jfq?=N4(P9DAM+ zT4(cZ&sJ%x)!fB1x2O0z3dL8>KX7_?*G0pmw#k;(PJ41*Y+m)@Y_#~Iz02fockdFI zKd0mO^^}K4E(XcGyKwl%@}sxTxKym3bEA3*)7HmkN5ZBgmuN^{PyhLF>fyILvQI1h z@acKH^RDU(x$TFoFNkw(mK1))P*Z%_XO7*;CBC|kBQ|RAOa4>aQ@M%#-@&>Wg6od$ z+f?WBWA%oP-zLul-&ox1n{mYA&Q>#dsk9|Vm$hp@o>jWSAHA_Lzx5ms>%UK7k|jp@ zclKx6wY`=u+>L2d}?v|M=)07tg2C?+MT94PWtmcsRSCKW=v4U-qs*!-RvSKEFiI z*J!Vwlhc0ZxOjAU%EBcp#I`DnojK!w^p6K?oaGe;<-5;chn;urNEE0~4?C1lZ@Q`2 zc%pp9;m_?-GxZc?z8i-73cQ{0dFrpjx8t2o&vZT!QK1`l*7IOrcwFPTg@?M9vfkMH zUnK3`ZWi_LdB-0HZ#@yUhlzW}(xUh0whLMn%Q2lE( zma(eKSZj5%XI45xzO~a&jmHNLFy!s|?D&KC+GE~tl5;G@y=OK(xG?W8$I1EJTenGF z)m7%;@H#MUZT80c+u2)OkA2}TS1_EDFK*0v^PR1=;`j6JB|ljF#I7fPyYzL&gDvGII?Y#Ws<+D(Ph01_>AgjntR-`5jM${TRUbZa zFQ2%*fX_&{`TplrQF#_7ap#0n>tC?Ds5suP;@N#F<;T79eJzjI+wvB_5Xy<2+Y`S1 z{qZ9YIFx?A+PChj#jhEc%#1bJmbRBKI4st@J1?$r;zPq1?#CBg`7zO=TOs_kVcPeD zcg-gVd<#u{`Kac^k5zvjTYF8IJGrH8m)VijB@Vam@$S9Z6{~VVI)6sDlpo7kXSX@) zULT)U%9@e&-dSdUgt~UMfV4Ev=F8l#pB+iKelabAXYq>p0m*;gR9GC}T2WMPDt5;2 z*vm^|XS6&Vb932C+;q$4ymQK0!vAf0iPO<1QS7sMcC@B^{Bkc#=!s8B==P+J&fRD)^GakgJyT~vdXTRvIv}(m$x2zhK!`ggnlr7y^S1fof zuXNHZ@#vhCJ;7JnQa1+ UPc*7KczQE0YvVWcqEv!_gdZC6NceB|S4JI79H%eAeCr6k&#emFc^ zpXoB)l%wBf1FQSCTzBVS)>~V&S{C=OmSg?&XvS`}kmls4dw;yT{?6%WqpXkVYS-DJ zjjf$?EXs^mt4_{;YZ=h-bal8<<8pe?C65QmIGUJu&p?W4@QaUOZj(>OkSL z${$inp<#1sew&)StQFLgc1aB7Z*ylay#AN}@TJHmz2*FeYHBz9nN?|V^pE+qjddB5 zt}EDIJ6Sk&!7jgUcKKb>XIt4H2wQV|8rH4Qv*Xz7uk}o|V&PedmeiSzD{@~RS@`$2 zz|?8|yAG8bSY)~MU!J{E`pJqHg%9`LHZv$a?AY_wY(briWAv}U8wtlw{fxX&8us|= zVcCe?8l30JM^>zKELtD-t6ndO=MtPgRWMhAoYkk+kshexl z4HJWd9NDh?$=Djb@WJ$x(NCGDJA3t{9&hpMe|Jq!t$l@IE&cZhvz)3yPd~302A(Hd3rUjBj>6nDKMNvp=Q}T8`!< z`c=ls`^c^|FA{b0*jqdGjB8qJXJ*dQeT#xB&Z@dP>M0+~N(+Ay6?ClFr+G%~#QLQ^ z!ZzzAIXyY}KD6IGRUxw3@6=4@@MCZKOkTzWD$J~4XKz)S_54=6^PbN2(eJo18KQmWxxfiof} zoI82yX!4W~X->vdx2!sN^Sx_$w)y5`8$<1%O-fuhd(Rz{l&5+ro3^O%%&B6p-MhF% zN#xDt<|)hhKYA;CDCF?DsXSe3&VumlX+J-mmTNz;BSOY{gRr{f{J3*lwy@R+2MQU# zkh_|EZqZbq?@|pHIy|Z}^B)I9$_jmcrf|T@!I4vWe@)r4^}TLBJ~od$R{f0<-?VwM zg7U%bye}pmow6~lS+cV;us}j>!i339l8kzLD%Wt%S`lHhDN`&(IO@$(cHXJ_&(e<{ zIQhOfDTc%N%}GP+xk&=Cu^C&lKTPHQsS;TyIn!}{_LZJHTQYhibx!#7HBFPdvFGMY zj^f#YmlvyBsw$~p6A#-dpLUj`wQnZh>)URIr?#w*{1P`^?f1e(l^pjDE))s$XyjL4 zv0{ZniFx^>jKc~=#YP)uu5MIb{_29ot7CVipC4@J-0)}dVM(=3&T=A69BM6_3@Rfu zHg_CVcXReL;_mBh=s$euNCe{?j|LgPlwE_X=i?ol1gE?_Eg@5%H?Gyp&P^M-wEGY43p9Atyypyy&|bE=GV7b3h|iYk zZ!)kvXTs;O+`Nc&VpsHYmqn{G1^l+kU(@k$XYf3cXte0Z70!^*sfz0o6!Y#B=+0U# z`RHP#!Sv1xHJZn#?J1C~;psi&u~R;g$6sgu%o9ERc3ae?pZ!xaDdSO8&6eAgcBIJY zi&K5J?AsX$i;T3V#cUR8e(Guw5!AdS^16YJ>hag>_czL|W;4IHhtIaxR3ah%v-nx3 zrzf4Rm~J)HUNo!ou-Snd(d}lNxdc_7Ot_%X;-Vfn=P(1Sv*JQ6VLlnFwpGXU&O~qK z`#5LA*IR`ee;0RHt4FJ)Pgc|3o^SE&qm{<`6;0L#vxKvR)Dw9(T@JbsSIDI9wZve4 zr*`A-3%3J~9!Ze-K1sEM_hWOi(|OUQGCzOroG`OJ;PQpG6<1<%qKvyGHMSeC31v$U z5es|nmiWDI?h7fox56 z(*Iki`)@oCi`^;Z|1s)kU%ksanjf!u_|w$xg2#7uoVLF0r~Pl^V~eOQWy_qWKYTZP znxgWh@1JhXDs$htv7EnEWyKEV&ct=m`z5+3Eia6@X4aK1v2VxQd%G=NYhpG&`k5a8 zu;pFTyvcWRT0VNC(Tk znCULg%cAc1v46g`JL9v-@v>FS!e8wRS?sz_=)ZsU??`(=rL31>zG(7+|5XzeXPo|a zKASTk@B4Wd%jLH#S8mgi$n%~#v1sL0`z`bG9W;V|6z_CBb?wF9kEh#D=f=sX3w%&e zc(`I|l0VN!m9as%dNh&CYei#4v;B%N`i_9Y{TTBD#`!#qA$?=cb;wV7q+i zPsM%(yQs>a8*gM9awN7mI4FEr2|Bjn{>{jKefeMPZD(sze5<6NPnswHBjngO$(JFA z1USBbJbpj?ZeMSw{FTSQdw5)CXbK2$)Odk5h{~_G?R>~7dw<2`dsV_uy%ZG^e@*{& zx#`4ukp+un8xM$cG-@6{q3g4N#qOH=DN(nE8B#OeIf#H=Y7h!K24a(DYmkK518>WD zHWI;G-`IXV-zI-9zsi61o#WH>{w=lpv8Z!7?@HN~Z?z+r$S6#YSl0Gd)l6#@Xu@!Q zHOn%YsGTJ)9tlROMu(LzES7G%=s0Q5nL|_DeWt0Zu1=cm(=}C2>THVZ;*6y?8mBw; z?%Ck6f1EY@mo1-m~2g>>p?TwODu(~-BVgt z@7yUFwf0-h>YzjGrc4o8mR9?o_i~qVbz##?o>VE*y1kBYn?hdZH6LqE&A3u+C6j;o&RoKoSJEJbnRY=>n|_dzTLcRS(rcDnPaDd zri7YT_Z3Hd(Xg!j^``K7H2WL9qKGx9HZ9e#{t#PKw?p?PooDw;9Yhm6Tn@S~2Q3Kb71(F`55Z_TRl3rXG7<9y#>GMuk=8&@su%4_}k)M3>svZF-}3 zCdKN;;5BD&gcyaOngD-Jcq-6t)O|vq~ zIp0~<$?)s%mEXKrxUfB6DzCTCRrqaXv&)yicPaxe?zX#nn`!nT@!hlfmF>#-F0Fn0 zf$P-4OBW2DF|2o7dRV^v`0>L@QthF#O|yk31zxM;@-O9$*;vgz$zAS5r}xp21Cw1> zhE!d8;a4~B&*~3hMo(9B*-6#2v>NSRRLZgc*ZTX39?#o)Bmd{^PGtP|sr|XYp)b3F z{3f0V5WU0bS@B`o)QUeRrwg1g*;&nh&Sg@$yxXF1<>+dbs~#U-}P@F|PSq340Q{+wgCcxTUu-NfB|xN6Jma)XUGy=)HK9a{7^k-OtyZg%>k zo8jLKpKcI3dOfezZQ1dKvFjgwT^Dud_v8Bsmk<5%+;Jqn@j$vzQTfB5i-%b#~=>`aUoe$}6r*Oa+|ZU0KGgI!lFD@^hkZDSvNTeI{> z**~X}Z_^)dKl}B@EX!^uj=dJgj?4XiA=qTOC6-V2+=a{Pgs{6KXYh%WP9(yQ}b== z{{5a+{c-LR4ijIC4~PG_%2nr`-p5vbE%(^NZN?Sr_OcgiuGwf{G;t9xm&*i|ciz!$ z`KeD2`iXy;xX1KI-MyG4zYR=`1f zH}7p-sLopQrAb?B_RPNR4XfF-^h^5`b=27Hf4mEyC^NC=c-=qYmepT0Z1>97ZO%XV zzV2&n$rf=%ooYd;`!#awr}ibeb~pDca!PQe>8;q-RADOhkP$WF`fa1^Fd(4i_*mV8m)!={(8@b;v_b>h$A!ugvL-x-n_4}=E_j`>~ zLp{!DI;^9UCr-*zAF(_xi3rkzc|}*DyBL9?<4mRzDti!^u3)?d)fKN{rG<@mJ_9B+^yU3eYX9fztYbZ z^*d=S;$X3R%@Jc+wo`yp?N$6d17SlW<>_bHrUV^&Jv*{^L5kN!!|sXm#05^xSQi(y zYPSx@lH)IuW-OV(rE~R`;;P>kiOUQQv>fK!eVNVJb-t?HoGWubJlwc`d)R}Ame~sC zWeX2wG`GDnXIstJ&UWi!!kmWbr@OAdu;t$vYyEbji~0&R_o(8+4CkI_;5^N(WGPn&!o-4yUv_7Tv@T-Q7EZE@XeM#suI?ldF_AQlz$*UuQgPA zy7Swtc0b9+((LI5qA6fFYXrio;Uye z$-N+5;>kw&KO9eW?_TO`*q^WRXQxv19wqjC+wbOoejML_V1W_O&6zhP*rCc1wo`Dv0MqLL{&REm9=b3}RQg6ro|+Wc z({xL6N>s2y{Y|YYd%oK2``#@7IOMi~tA&Qmq3jd0odiJf%Fp3r+57g?T>pn2<;wdN zQ2 zZOfBw^LzM=-#j{gql#~T%H1&bZ&%(PHjK29^X)re-oL-oteMAt`MHOE)4cA?+beQh znrq_h3H^&}b#Khr$Pjr?DZFV-#2Nhr=_KK zUECKjzn-3?xK~*@d=kg`z5S9suUX|R$a~7*R8Z@}a+s<1#x>)%-=EW!CnPaj#d6O} zsd)C^-&^(P$q#976@R#&Ib@Sny{)HY!O4Y3+}b+M%<+g@qkS}NofKc#`y=j#g_y&orz$Azm+J}Jz9J;Nks!JN4YIcDp^A|5@e(0|xubR&*`a=FE%#fLSt z-6gjlkjRi>n-bim<0xdx5wc+RW6v&rr~La8u6jxr@80chnG)i4d+Oq5C7H^eqwRs0 zH}9VsHUD0sM>p@`8xG=HuQhrm%D@-;|1f2uWe3%_b8Z%0~& zcK2kr@?_Ipnk@@I^1H@_aPWLtAsjT>;$>7oT#VO3Ui&k%qa99ebDR=#P02t{lr@u6 z=y`S5w8UM<`WWwVJuEe;=G&uIl^DjNXl25%^=jyp*T#ld4b&%WNSL8xwB!iug66`X zKc0wO2^YECIbrkPnG)~bEb4G)nzKtTV#=kDj?b$E>RFgBi#PUrC0Cbr#2j+k^-#T* zRrRD+RrS2tO*LV+`hz0fs-Dg}?_>PRUCBJ?XPfBG^X+m|8TUtiH`xEB^+$2O`qC#V zC-qi3PCNPh`qFKxOq26WylyY~w)Bv?FH=a?3*DGk-oJO&#=fhvnKrM9bNj4clhi-l zT{L-$GWUXN|CeSbW4~QVu2xCyUn{r!rkH*8n~k$y25qigC-rIZr4RC!kvodtXJ7d7 zE9uaw+AYyphtEf!E&Omyesz|G+sW$bDR*qPRhAr6V^@^?rI^a)q9?06apy&iy|LBX zJmi*%m`~4Z>H;nBtNADJLqq95$M#?GEJ>3}mZmM)!7=?!kYSa_w>#;RR98P=Ji$~3)hiIS}S$<32rvfK2-gx#^ts6HRXlT7K|kZa_>IgQSYq(^x^xJ+W+TH zdOcbX>KF;^_yp>)#0FVB%9^gdNp1)^PSjRQ+0?7u42b%0JtN^!Lp8tsp-UerWK1k!TqBTo=OTGe*E=h*hy%K$^NXWH#gog=V>rCQ zJ~)u7sL=6eQ-Ux%s4K?Q__Db{;nT}vy%tqS=W~;QfJMxEC0zbc4iXRdJ z8($E~!J)KY=f)97uV39ots->^5Uk&?P~s1-l;A)=2Tra&s@- zv4}l;o$dqC7YF{8YY9k5wcKM=zP4s2XZ_FRiBn$$D->jc(w@83?ZkpzfuYx1zWkXw zFYcJT+X6n0Ca-5L=Q5hN-)a1}(6Ghj*a82ihg!~dFHt(a<6z5#2MXs6g?Ab9^z|tl zSg^$QF2A^d`^cdq2@&cgFC?}&CSE;kt<>ql*VEf`NMD0P?XN}6pXP+w1_!)XKKPcn zLv&vUAAeg}iG;A2HdE7KgIi(k!lh9)nXjdOOiF*H<-Z`&h9f%c?9m$u`fL8II(GcH zgP!54(~T1!CQ6(U`|%?qVY`pRQ}Lz~7aVxLmK}aFN!dTb@(ZlUl|KDKO)-V;9b_I`@PWNB1d=axws*F3F zS>ybg;rv&DzKJKo=O}+#{8aaZ&IzXuuXC@@H6-qR`Nr^~P21$~=<5B;@7vsZUb;2? z+2$1;_n8{IL50qA}dVl#xLP>^hWv4y6TxzrR z_v~Gh(eH7@!(I2voQOSV*feVX8eF;Bv}7jtg4a2%)4h5p&2r1Rv4L-&o;Bx1p62O{ zUhSN=wr?de*1A6Gk(7&;p0(^p(z@_AugNrb|29;&GBEnr;uNg_w6bayLT&| zY4&!u!*eb?a;~|!viRZs{F&X0)w33Cy_GnHJ;8aO{ye)2jU2oSIz12ks$l(Bw@Lb8 z%$k`Z|7Mizx%%dgS)x-Qe__e%50@VLwG_|0=%W6ht;BSm{S`L-zS4J}SSt!bZ@KPI zNNRU@FxlZjGvAftUtSgM6ciHfpRt5RMa`u;YkA7kNio`i*G!sD2-I6lofuJm_iIPE zm7#?Rmu07)-sHolOZ#R%z1Pv**Y5U|)%r!C`VmD#TVcn2MM8|%-@Mm8DQO%~yo|?a ztG(4Ktp{H|Icw}SZk-dit|`S&-`qw?^7`7HVq8;&90fT${5_mk$UAcziB1XG^Sj?_A9Mw`92OVo?{jD z`d1R?^oTt>tXZ6Rb(U$wl*uf*ow+Gz+BR$mus9=ZAo1pd(!_HfeXdfu*M6`ieY|8k zW2#_R;9-m3i@wX84&}0SQ&*Q=Wn=M0@EE*VuZq7^bTBaPwscDa+9iAviWt{L2ZROlaEOq zX*rf~?atDUrRDi%eg&-$cumju7N*F=H9m|eds}*fC$#9%<<0z?G}N>7{n*R=R%MC4 z7RqKm9L6H*7suYI8ClT3b>WINaxZVbl*^A<|MvLCLyI-mu1jrj(#qTMa+BBD#%Gy- znqEk@7s&-A>{%|ZtQ=MKY2k-QUT*&D#rG)jg_S4&J(m69bM_P?~hCc zg~cAsO!#8Pe(7`3hr`xljJpa&uJa@v=Jo#g|E>);R~+}`@cGa6k7qp8I`QO*%4}`f z%@P;-A2}47@5w9<6H>poE--Tfs3#Z7qSt&PRwY_}$(|>EaX*4Cwj5D*%00Nkx%bZ* z$%2_x0ToX;cKw{|-?QA@d;RJUPc(aO#-u+!>{sRf<=CG;wHMBRXt?>vrM_BwOOE(K?>{pbvpvV%pmoJ@U?CRM5ee`^ubX7&_n`-Y#&A$^2=JKg8n)FCD_<`#o z&aN(%TC0T%#AQ#M7Ydxa@~uNbgoLweR@DuMfC2+&f#;8o+N|5UlecP8L$}MTgzCKQ zJbCSN&1OD){Ji~PV_jSDxm)i08s;?jKFB)YyE>&v|43T;<>#ggKm6dFVp3xCM#v#Z zQgK}?k8XzKd_Rly`9gJyjTE)|> zulZ4M-oB;ql(MY#(c8W1A9ue^ zH4s{VQlqnZwe8Da(~fB|K7MNHb}o6!jOl_Wr*emDxLHq{ba;tlmy*Db5Wxw7Do(%L zD!NK8{#)}#*2b#*?2~2uf3EiTR@pcTcOJG^VBt|bly>d$k%P4tQgjaf`4S;E>{)HE|CF512#vF3*Br8F1g`lhZHTzR9SxHO?> zq3E#;XGx~QOJUrP?**-KRxDqXU%*n=Gtu4sqHt>MUyb7jJr7;K&22k(?mRnT$$Jf% zGPcgjFS1vK``##{WB2O5XAO1C8V_QZ66< z^z-r`NSSWvHjhDnHs9PH|KIH{3TBVqY<*Z35qMVmu$X@S8L$4f$qV;%O;eor-QkJh zpDTB4yH;?ty^&Dj;^b|J%x*Xnee$<)SX-lncKQx=EgO!*hppDF+p|+E#b@q!rka{c zI}@(+E<%sh-OqP$ehmDVk@4#3l$8%`8RO4%On&r7ujEV5q1&?^^^RToEBVgQYHEjV zxerq~6Yp7Do_Ng()1}V-c9_gKlV5u84K;xsMjUTm=PkMX_)y!DHT)(PsY?GHxbGO4 zU1<8$W~dWu)qncE=lo}fv+AyG-&whMJ)dc>?1z4zLwlNXjuo!|SK+=Z>fwbJ<*p^B zb5F5^doDjEwV~i<(4?DF^0)geU&s;7!gN`#v0v$v_NTYponA+`240qH*G^c#Q)pad zV;{a?qj#Q?PU11u>wi_Wvziuf_|;wb$lf!;HJ+(aQ`z9D#Lp?!0_?C}UMOfsUTAB$ zi5{fSX$R_(+8tZO4(^B*go1YDg+3JR1+5@uYFyplpzvvR|Hc=PxyYDMP`53#!u2t@ zSNGr*Xu;{LWSuI|-ai(maM8x^Htu@K)3mHV*Y_CAUif7{XpduqgM-3{m&yyKR645f zEqqu1?d`|!(O=}0rk7P!Rvx_mJ;v(d_v>QwSs_~&9|*f2m>v22ice?ZMkOb0ac8$2 zaSo8{=L@p1OsseFn_>_Q=_K+nIzGWC-N=9E&7O#(-MQ1}K%p*msBs`vfytHBehV9?~ zo`3CJ_fAveq}j`=i7xUgAK6&XPruIkTcy_i<>o1B@wfE5Kw=O;%qY zABBb__Dj?KkLmwAk|53}v-;R9X>$i>$Fxol)uyQ(u}UhcuDlwC&P%6n{wxi?%&{#-g-Uak{~TTMHJZZ?#cT zRq;IWY)#IrNy#(UtbXwSQjllR7s(f|+VVx7K3rma^q-kmXZrI7Zm-U%S9}|x6zqDhCna%GTcJ@^{WquMD zZE{+o-?b_gtHs_BBjHIr~aMFiV~EO;}rfX z7ajfT!qxl*xBB?w{#?%2Tp;aZDq;Fn|F6M~tBt#smHlXIIUJtnUKz>R=2jBI`DrQN zGIKX8?GLk$&v%}&U!QBG@=B$T9;-fV>onB(b0|UbtwXA_^`GX$D{Pi5ShPpf_O5J3 zR?ah)$1dK^wsW|8-Ouh_yG~~9-p3rvJwDv{F~Pkv_OY(JtEcAE!#*MUTn%>(T8x*P zhUjs%&o{rFTpy+N>&usK!3!dL+g2I%%zP@NZulb0Mf7)>cZ$y><4Bo+;Kex;y6o%h za<;FLh`QFx^Vz*RS9R8|_6N($9>4tm*OVu5<_TYp#)+?d*yNr+-B7`@C{*Rv!+mx) zG)nGNyt1(BVe6S4qjAFP>C1_MIy=RWre6KP$>Vr-;`W4(XPu@T>$tpJTj4vmqrugp zS6Zhp8m@45Nl{Td_A6rlx2BH;N|G{e7T-&+g)N9(<(|4|;W@RCz!>F*TZ`286)#w# zGWmMv{R?&3J<&g3xe+|s!g5x1MKG0IMAs{QcBp1W|-<&LSJgI1b6 zZ!#C{;_~0F(32H(yzBPF*>a7CQ*}?A_iQv*56-j`a8>x=>gM3+zB17KQDMpD6Xx&r zC(SQE>FVgeX2l8)_Z7!~o>1<8uylIdq0i^-`}1oaOV3L`|FS=DTDC-b)Ypn1`=SGU z^7ZsBoDS9- z*fypaE0Xk#c@}M}nxbOXa`$(ilC>^h>fFa3?!vRwY7D}H+gePwKRkGLwT8x;<2wrH zY%1d8*>-J#;(^ZKqh~$(6C;-8vMf#SQ&h2(TpMQkF4B^F*+aEIAN~E6wXG%B@43~( zr1g(yzSi+oteH1rBl-olGV=0vW@zX;o_n;_;%k_!jAP)6wH2bL*WGSex2z~bL$&Np zisZg;Z`UhF!yvF zjt2K`#Pzla$lf}B*Wio1Yi^m=DQzhOWmS==WUHyqdZ)xLw%Fvv>g;b@HYGz-%ckpX zsMej$HUh5c78}o=XlWCw^g7A>oOAj`?QOkV91~#H_#6J#(u|y zQ|8u715W8px;TCRpH%*d^{=DvANu?K{`<&v-b`C%RjzHDrFP|dNO0#qmUiz|f-|>^ z@!Na})rp_bbE-^uU&;ULA1^qUA2PbqyX_t4kD{A-a`}zdM4M*6uV9Ja_t)x6c|oOZ zw%M~YvyQ6nVRhThYaE_`Z148nzcKfUN~f2vAI)px8_Sw`Imp|@AS`JKfC?nIjb!}J`ryp^EX$@EN0WL zO=wGZQZBe}JNshrWxx7J-@WeK=jPb;9XRv4;QinJggPgYoEXj%9aEdCX69{{6g{e2 zaAMC+FM|Vz1Va3>ELvy2{Sb6K;og~>Gfb_e{but9O78q{>Dr=wi5#5g_~xv51!nvH95}qA?x@kNXU9CUxpnF?D_%@o|7ZWVb?=t1H17F- z>yncut9Pd3f|{2u4ia&KgZhLd+%gY9KZ<_Nf9%)wh^t6db%)UA|yh}-}BChAs#OO|Cd9z!WlyZ)k zIz=5j!>^^1>BjT9v9R9q(58IN8R>5?Zb=E4t4yPt2k_k2H=_v2Xl#|6Kw{7mcHwZnf0JTrRy z=H&a2Z?F4yEZ?+msS_|sl@Bc3O|0~&#?Q>eP?R*M3LBplB(_+{oDsX*oux# zhk_jz~KW%>cPysErQ?f))vN_hTtd+}#W=%=eOGeus^i``pG? zRm+x(v@X?CSsoP_G>JcamgPZ9X-nzF=Vo=;ESc0)bYpJC=6!Mp*Li1TS~f~6E1xKP zw%~o3^(?=?JohItvahnOX_yhY;uf#E_DS|fD>qF3ocCTb?dx~eKNrmu?D|W5#k}r# zzKA<>{GgS3Roa^s8XJr^J?(405-{gZ-JB!4KYZouXTLa;@6VM>EuW|BD{sqkN=pLcEHunY}+S};5AF;&7RwMa;3uRTj`skY8ZA_>hYA6 zD@m9gijF+gVaL^fyfJ(E`2?L!O%MOo?Wukf{H9oU;(d9?z*g~AOFyd%8p}@hTNl6l zqpVm`R&p@mv|DVf;XMV*j(klnnx^lN|O zYIu6l*}YFzpUzlsD%W^&+DX}yDm#A#icAe(tkC_rtVF3N4l? znz3bzh)7DhVD!l^IxwXx2{#q}yvq$M%%)OY`el@iz zfhHZFn$NS?K3c?|+N8fQMWEDu&h1=dc|c(*;;ns?b>GbyG{X?5(SBjc#LAMG z6mCcVRqm7Km@oWdF!^xb;`M8pXHJdVkt?>&Xkp&Otv2tx%g^j|{kcfH(uLKDT|IEk zmeQSy)6du~%6T})B=FcH?^~K#Gg>YSZ=G=Bx5>LDkCJ-+%ndAX3ew0HyXxgMS9!P4 zLHGCjm))88^V<8*ySm)Nx3AGGcv9E3&2@^N(fTvV5%$MFK8f=bUgci*W$VlO=)-eg zR|a)y)UuvGV*BvF*l{th7w?};xfE{Ndce=|!Bopn;fxDB7$283Jxbo5rRFwIiC@HB zA!wKQ&a~Br+pY42mb<&F@ELFWw&B*RS-sC)g*43eHFQerhprc8;%b!bIuO=Z6Fsqi zm)URD{3*vc{*{{d20p9LU9>aIS8;(r0LLC57NI?dPs;@ME)@vi&|nc^S})4@^hCV& zoh+l)1}6u_51#~YxUBV<le`b8$^(nD> z#=@|LU_;9Em>wO;x7*R~eE!F;Da)UympaCo?cGFnGH9xvXAtd5!_mr zbQ-!9xYn^w*s36w)17p9pQ9LSX{=61*D2`-g7>PQzpZ?JcaHV__jih)+y9?gbKg>& z;Z*Iqh&g=POcNAOO>6mGxhd)KqsSl28#qK5c^@z|pFSz6BLN_~uNLP`PefRXnPlYDuKOC8q!ysVNcyCkAN0#Xe&rDdr7HDU3@MQ2E z!-Ji{HR+qwjqY$ib!6ZW(F>o%!|;ZVSgE{+FMh&QbaD)TcPlE9H#IbB@K&{fon*TpsxJPv4_A zvF)_2x@XPP_cJD%KJGm}_v3`QLNDzf>xR8+)c^2p;&s=+Pj!Xcmd6Cok<)rFzU24G z*O8WjpQ<-sJO+hVjnVQ?zxfg1?ubjIgbd@o~ z^?R#S;j(4*3=B~^47#r?f;`WK@ER8$WD=^{Ch5SN!DySnb0#qT+X2>!1%1p8933o$ z35E|EMJ6z+BuGZEUTbCwVA<9*cLCEI)~yTVWZ2vtwJliBHF`gg+QIp*$=!jC?SQrc zk6n`?N7DxZ(M8T#6UO8 zyF|!}J+`rG0egVF3CrH*eFr#v8YMTV<#3#Dl}$90;c!3H{UD`6a}M|O!?Pb6?O?NG z*?!>pgX|Bn5p4UL+yxpY2&ye=o}t{=AuiN(MA@^0C9+vWX{iVArIszqu_tm}+V;5F zB^O9owY3@^-;wagFi=7+O*4&mnM82o%HvxS^b+!te;FK}@jgN;j5)il^jOh`jW<%> z809c-6NzrOZQR?jw_El=-I0d{K63=mF+T6_KD_i%*rTq(-Gyg&@Wt@2lQ(ZV{`l&L zw2JT=j(OeZkBL7x{jvQ+`p4}bn1A@Q7&*>P@cp2AMA)Up#!2&`!b6^iVh>ppdscXu zC|C(Qcho%MdL;I!F3I{MTVaERTac3E#2C+sOF}MH1xc>#ESdOa#+P|MYOg2FJ&~BA zSSh=+r>3Q5<{kHcK7q?-1ntq_)(kq8c8bx9{VC&9+o@irOR54Mue^EX>=m|Gm9K(d zsk82CYGrb7T)!b~VbDU?htm#8OHE93NWLs~xhQk#mgFtcTdsGxxH`M)yRLgAb=2$V zCA`Q*Ed0PSrfEc^dWf^QpfjE$iIBFZ%pK`o-^; z;xCzbWDa*6Ok85rCDATC5Gs*L1Gitp6F+z4Gb8 zsjId+zwWsPEc{ZKWn9e@d5FUA4MvmAuPsSKzM7 zU1xXsfAOg5tMaU}{$lmD?d#UB&0oV`n!mC)QIN8bS|ahr=!KDlsfkgK;hl^dSr!>f zvW^&@GR-on%JDHRGmp!PNv=80lKv=TQrf25PnK!sWTnqaips1y%wx9MTzJ-7v)415 z=RP)ZH(8$Mx8CyToZNZI_cHFKAKb#R>BQ!Ytrf=M^?85p-?&_ujX!DX?lLwrC)u#SC3s!TkAXfY;?47bmLpO+rP_7b|>uaEt^|*|BdV$ z)o;GvocVt7aq@-o?d{_^9&kMA_-Vfgb^qmC{g%(Mv%YPeZY^K>@AT0-s%M`rIQ_t8 zab;8G@8@54zuHw4yE-;CPiH&J_S!t7a@q2A)xE!s`EB|4xz9b$y^Yg)YHi2gW0x-l zKdL-beC71b?5*ML=8xV!k9~3X?cz7WPlF$Rz7l@j{O0zHGbZhy`GLjCM| zefPz;C|s_TaP||y!i3!NA6-jbZ+cSNLYCHP*dx7F-hI1eJ@TWeLecJ z+h2d7?n6DxX$`&|o)$AcOqD*g_F{tPVyRnGjV~lV-*qM8SMwJAsD`jw5@B~z1z?Bt=;FcQf2#+ z`sxqgrpd06ZMC+06SL{F*UH?N_hOgCUW(ncX~Cv#MSnl7eHyPFr1dVWD$FcAGbDGF z)ZMf9YqR^0&s(;4R(1Ecx|`~E%J<(|zia8S4a>HOh0hNDT~q(%-@5s-^?56T*K4o( zUFJ~Y5GEg2zwqF~g%1}TJE+@Ruy{-1iwlRG&H1b4^RkWdSLLOdiOVv&FL96iH|fLa zy^9;&t@|zIvaRw8_Pk>G>ypTQWz(Y69i~e|uZdm1R&4YjC4IN|@6LGLI@=sTmQKw6HzgDl?{QIrT_S*8(yzSDt=5zD5eLwTsviS7hYdde> z+pd52;hmjj<^S%^s}B7B?z`Tbsdt~>m#>-d@4?%{bJ~;puh|~6)2mtZW6775$1cyh z?^~BY?dEB}@0H(U>%~643AA7T|EhdseU0pidcWGZUrxVW4=?!oV5Q>yg|qd=_sCSJ z)|r0W^}v6r{px!X`z`-XKOTR*J-MCzp4Yv;{n~Zwzx_MFew%-;@EF?IImbR zyf9}}(DXTbVlt!e*{_pX{`D>`fn)%1LM5Rkcg59UmvUF{9L`nl>DSry^7od1`x2R zu&T%{$W1LtRH(?!$t$+1uvG%9u*xg80txFYDS(xfWZNo5_y#CA=NF|anChA687SFt zDJUq|6s4qD1-ZCEwHKwN*(zm}loVL$>z9|8>y;bpKhp88yV>qrKIT= zSLT%@R_NvxD?a#8ycOWRU_4K-`&Hk%_P=uNdmB z@FFQLBK=iqxD4m(1MMyyDFKJUc@}b0ZtD1`H{Ll{N^ikqE7p z#^%U6kz}AcZS+AtK=KhJxWJ-8E^c;QHu~Uz1qHGlSLdax-V6*544y8IAr*{oYB?K3 zj$ZxGf1~wj#7@=_fdB`QPOe3QoE6%RB7eE(vrA0a4-!`s*q*X5zmE1Ee#2?logKlV)w}eXBMxb7ppJrp7g~1gNQ&*(?-Eg z>?#8y1tz#mdF&JZY>8*8-0oy84sQVg78XWF2Mo%{VL_1E94+slrJH(;n=AFza0TFm zWEQ@kDwh||%CHPMKK1cW-FH~cV_|e$z$0MsM98N-=+V;vDR0R$sV|){tcB|3V`6G| zDO$NmJyFZ)kEr6Y<`2In>ak*TCre|H>jEW}JT0f5bCW{?C(E)cziYm@{PPmdU|fcK z@isP3d}1k4o5q^p>NRPK>zdSy?qTXaJ=iT^bbPQtF+i+y{-zho*$moFOiQ;U>FDl{ zoG(&{GhvCcHD2;!m^$tL9ERw5leLx#MrZzbA{;nt-%kFOxNK3dX7Mr(43^sGeK@_0 zL+kaYSu7_*W1gP%zozaZgDU|$tW=(`TE(yO^JL=(MN^!6WdWpxfze_i9PfpiL7C8JS^7xv|SIu)<#jxi!mc~nt3U`-yi~Kd1 z>yv8o%iy*_iP2W>&o8G;P5q=id0)`YmXpmXjx|ggK4Px#SZ*dS`y`vDZRCiVYr)y4 zqs_t0b85)8#7_#50`uL3)w-3+6(^lqep)RzE>hLf=%xA@wb;lBbprDncqY3}TwZJx z^mS^V{zXyjuH!3ZDVk~G`Bd9SPNn!`tc{)j%u_e+tvmeZ<}S&tr9=?W5%LkfLjk ztzv7pb%#tZ+oTlxKk=8Nk+?nA`K8VamYz;u(EKK1-sxRBzfYy!d4!|jDo_kqb&`Me z;gDL^lZ!vaRs~jytn!}TE})hyyV)=N{ubV)-qwZ_`~DlmPS@c&f9;{!bv28?%9O{K zOlu8gL;Jrj#Ti9+6a`Ed3N3m5sQqJ3c~xtBlq zE|;FniHn$>QWFwtBD?1NR?eUhxtlvmeB*uGuO`>x&iutJi`0UezQp`7kUPm&!G5vk z14qv7klan1OK*g0&0INs-MU=q8+vP9+^y=GOJZwgi!b%%TvAhdCBVJ3f8DaIO{Q;s zqdH4EPjO#PkBoTxO5Gy8%TYX!V-0vRTbaI>j z_O&r8KNaLeZ-@81{x`dC-RtSDI=dvNdfqk)x9$)>ram+FO*Lqlvd6-bVIzl<^Hw>ypN)@8hvly%UgZ4A#rua z=1dPQnas7!cRD45PcE4}*`f1Nfk{s6=G;r1aZM~{_w&>(Jl7}gGJ5%CPe@X(w8`$= z{nOrJ)GtprCW1W9_AI-LM zalg9x?VMb%T~9W-v|4+de-?cE$;{lz%M3Tjea_5b%}T#C)m^^!%YwbG)ul$7qBSO& zUydmDmnELp+jsV~qjkn2_FZW#OrkF6H6)92fZFuQHNLU|m#qx%Dp$B@s#wNGEq$?i z%h8)Xst;mbh=#R%K3J7`b!l(=kM$NDGm5V-@lIxW`D6KY*CUIrzdL1~n{+dH3%mPv zi>eE+*YB@eYNQ{){#5NpsGFScc{6(tx3UnQ${yk0(nrioJNj0o-?qHH(?`RVSI6W0 zv-YjNk{9ooWlKf(CP&E^U)#5LiolnyOB`NTSkxxn2)pWObt+!y`~`o{q9gN^jvo6j zl;hdY?;F*|dFm2+D@jX`DNw)n?a`Ew-CYbzZN;kBI3{m++w{fgi94^d^Y^5%X&g7y zFXznOA{cz=)-}`XOmDVuPq+J>X1$8n>glbRpFS%ee|6k=yY+bT^?j?-H^n)CS5=hU2p-$w4K zCsyR=zW(}t`_2Bq+qEiNc<0|bk|$l)B7&Y+XH0KVlg<3HtkJXjnA+(j%0Kx6FYV)L zXPa3enWsJJN(kS}#YUYnco4!7Khd9tpN|-QumC?nl1}KA!UEevIlAi3vVVTXPTJ(s?}VSMsdvXBRzB z2cKM`<|usq+3S;u^Xxt?>9Wi;X|7I+^*>(oFvIrpwF|zJ3=gm4mA<^auRY1&$u`aH zZ*K_S+P3#@ntBjwr5+;1a>m*oA-HbUg> z?{B}ns&b>VUrf@{S{Wi#-}vL(MhDAPEmn!KdAExHyWLl1_j+;sfX4GfoT`(G+I@#eo2^Z2ICvy{}G_)6{Le0}pIg?aA}OLVW-Zb55B1#k**>=p^j z-si!6)mdyA$7BAZ`pyZ5cJW5YrQVo4W2z-ny$Y*8_j2{6;GSFrQ5woYuTBre2)b0>uuAI zp0{c4YFV$9R$W3X)*jAXw~~L^&a#gl&*a(pWCD1D=lUeM`b*^>QoXolitAhdQzq)B zr7v&aS}46QBW7Qm!<=PzmTcYi@bpc-51KhB4W344amLR=7ndma-Y_x9Jbxo)W{Jvu z%_(Q(^FP;Cx7@#GcV^n6vuRy+T3cou%UrK}D#3w$}#Wd4<>yl~Ru{^Cg*o8!ZCJlP}-KCOPfc*6#P zpFe-D2r_jF5d0Nz``?E0`*Ck>>|=g*_|oZ3>o*v9EB9^qmlG*qw{6}QRz~5*X50L; z5iRgmOORrLLoENhVE#3CcjdBwn`J+5@+kxE$`?~}Rv2{q9lhdyATDa+fuo;!H>s?W zem!HAWz_K{!a-`+zp($VTIY0Z&9yIEmfhLtym$JWo3ksrGMZd9|NP>=Xny^k&u!E7 z|2yAb-gx`v4)%4;iylpHiJYu=^QO&h_SZN5XuQqI+3e@KgsGM7!KICrX}4XC^}T$p zNz9+J{8hg> z^B?mam5rCTJlt1n?-nyFealPUwT_3`3Tt>~=FjI$oYU?rZT`}{VbdFJohL!v%4>q7 zpB*?JHgTImf>MCqv$c{FEV;+-$Ft97=8B))v*DJivfNVkyGNgB&zh`T^QiR68s~X4((=o0KQ3O>@%Lug zneXbRzqwc5Oz-FlK2p2!Lf-9-GjqSXR0T}4dVaLn)8hJ?(BSk*pd|BgN|a3E+*?NM zcH6qZNv6m!|7-&+$*lOmG3AhGf{@yl6U$#8ytOqusekWg1y5_K!#*+-TJQE%8@gv) zD(pSwc=1N1WT>Cpo2c@ol2WnK7xgT{4R9CAn{H#s*+%ET`()8pv^Xsa1Ke~|ec#=c4al^bX^Fnf_ z-SsnC@F#fFq_c~+*=tU|DjTOeE%R`OgjQL-%BRX@YZDKvq@JveO?$RuS@g>l{hQus z=WwJ7x<~xq*7I@W&r4z~J}jqh?=ejlhIes2S{dG|E!4geBXa9&O3bU(vH_iME97^+ z)PJ{LDX?#&@absp8{S;I=boPE_9^#>*w*(eicdAR+&_A1s`ked%KZr^CMa6`da<~+ zPR(UX_ODN6w$nY&{M&VnO_SlphOKD}^lxv!xNcs&ZQzDs{ml6Z z(wCO!X9&mHpSf1I`9ttlud4@U?Cj5ZofWz|^A9MI%s8#ox8Yx|EmMXzo8yJd~PiZSk!f9-VZ zxqOz3T6goE#DvB3tj~AOTeYIJCoV;0lk)a$c{jTXA0K=9{FBYE7mIh4KiRt?-2PTg zS*g&|S^M_Ho}XHFruy5PgZAnFg+D((f1Ka`&w|A4OG`NYET4+Zx%yb=%8J0ltf?C7 zvqDSnE#5Qb?exa<$s6RB&x_f|6Ft|$=$4hmdAIdPAAehtDi?M2w{w)r<5@R++OIA- zUgk3U=+W|zKGKU8zqny`!err;CmPIbtU2P(TCeI!e)O^1zWRsyEWh@!u9byK?GiS)c`c1q6gnAxG0Z(Krhuf*EEU8%n6ij5Pm)6wTQKXjZh%WTqqebqJl!?9)MAJ+TI zKlmKmy>-8EwrqPIZ(R?!^qgj8u34(B&yJ^h2-Qe`l+v2$Q6+Fo`LX=LKzG^J>~%ZU zmiG3!etq6`GIdYkVYkx$zi}p+w^)Ah9$qSP;PF1DBeP^p`GVw3vqYxpL<&7SrxxZhZlr6-!@hkh6}!H+YGI= zNw*Dezg1WwrW@6wKCgl)dRvZXz|9Sb%wl>m9oOTkdH4S~s()c$?QfRKD{XtX`ETg< z&+2}AW9E|?ZZ>Z9e{;_Hx^9lK?%%#L{IkJYkEyp~c30>aXJ2|OWMCvVJuWtiQ&nn0 ztk1k|v&v<&so3UGv(Ks34ZrkO}RIez7AUx zyIIV4w&_`&l}BXLBQGDlG}+&-)2j5c88)SJpGwXH>qBP4>wEdO55_xttn@$8or zy1KhRp0j@cVE_NW`s;Q);xfs*V^Nc%_4x4gy$`!CE_v4?baU3;86_tBMdQ7DXI>Na zbXIRmJ~;6(!+3Z7(g zdD3mkc`~ipxrd@=u5mnJrul41W<;v))y;v)jzs?PvGI`x`V9Y*f}| zoxP=@Qh!@4x%ZN$#QkNEC$DIgz!X zJp08-xl8xulFQ*D^QZXyx;+2ilF)2;%yZDf2{?Ed{o zzWdj|{#Wqc?irK3KR-L`e0^P3c>!DMKjz98O*=LAJvR|qKd=9Je0(c6+ZVUZO+s(t zY&ctG?;TivJN{UwY4hCk|7+b#G^@Cdmd_Deqax(EKuF0UUd?a5oowu`l7m~X$E_}x z6X2P`VE1;*tC|4ME3jsac!LUS3|_pZ50lcK$Cp3w^vY<1e?@uAF;Ps^!=W zk>Y6Cd~90NFK0U`R487^a3?c!x_#%i z5`MMFPmcTE+|1c_bJmw!yU!=s#l`zm9Ba0n_MDsN)Y;?}8uW6V8M_BFcJ9U1P2)>;zoqjNPw$%P&^_Tv%ckn$%e$-6C(ZX+#4`2e`YchI zWq)cnr7yg;ciqjaAAc12T$Db%qy6~9)$8{idT_A$>rt1e*n&HPy+3#-zS|nRxr+Ca zm)6po;Zr6oQkk^q2j>;d))~ydg&M*2>{FJ;t=ZQfJ?hr~rmvK_&@1|ZvF_RGf6V_K zigWknKaSy%`6FWYs^0L$u@8@GkKAjEJsKtR>3M-ne1Nu#o|5B&Pl_8dFRShObV_^2 zr&HP&_f)WBim;Sf3ocHBi&nM3rWVU=lZf4j@u(_g$j zRjV>?zq`A8W7XDMe?<-NZTRT+HSw6EN$rgp@)p}{ZkMf^;hMMiTF-UQ)PribE!Dm? zIaIndVxByGs`!4>><`(l_y2Bpy_NF%)AtYe9<9Bx?}zK0 zvQGg=e+$KO=^xIHfB!A^*uG-DV}Hcu5A1x>+*h1`D7$-m_S`>G?GI1a|BL+j_QgrI z2TRYJ|NdsS@z-H-!v%|9wwIPCpEE9By!iU@o#ub#-lToMuK#coBmcvr_wS3mUi_G0 z&yRPzf9$=Ue!MvU`0v$^4R6+%jOeXJlD@ee&62o(>10IEq_`rKHGS+ z=#laHD~bCeZx`hi`__4FU9#I*Gt^)uQ`yPG6)MJ0?>w9JDDhV0<&*xqSD1HcxtlGN zT+x+&zV1t%|Exx><&gmb)e+{W&-8h?o)4L7erp>;sPu~H%PS^W2hY!VKf7Vosr!vv zxv#Kk1aaxbzxl;g${)_pa($nT?Y4zKZ0dNQzVF@||5Dt0!}c?({r3MX#B}4P6dH9_ zoqO>|!`e%0s)^>s?fch8Zf0|rDRep2m~tz8#^X!(7KTU}w)eV22IXaPSYC)PT2YXD z%z4lMpY#74M#}A#<1c;R^iZNHa{fQYAKw>S)PKnNVqrS1=H|9%rF-H^INf5euzv58 z@2GQDe>`n@U7K0E=I7YL^4<3JQnA18xBp&t?x?)~iQ_%&yBGN17v4~LP=D&AUrNuf z9{=#LHu&RF@wFe;yYF6b|Kw`J>c6)wHrL%@4?KE*Z<|=`@5RSsgFn3d!uKQT(A5{0 zAF|af$y>eJ^lN?Lwe#@@=APf%X)nK-yT9yh^JIICL$g@R7bIMF+w<#C!Jb{oHg>;~ z^wRF!75#g@o-w@lKl{EN%JTkmYwW6QJ_d{Y|Munx-%?c$85Ndky3xz>i;Z_Lmz8-r zEhhH;ho=VL^S3A0{IxTa~=zYu1ORT-Msr2==n`znzk{rjeCuM1Bv>WZqKU9+jvCM+sTI$vj* z{JUdQs%^SX*hEatzP{#}x!R`1hpf)@7be#&{tz)g>r>|K8K1Vih*6*N=A2}Mg5Bx2 zv%btcZn70L?UBcRZHlJPewXbRC!d%RQWt;9)#q8UlCTNq&$@Fb+!(t=nv;XrGnSuM zyZ_~M_RMKHNy^c^g-6b9eyP2J``+A;sLrLAIxI7E4vB+?R2M8#3ixw(zri2xgkN2S z7PI%oTNK(X+hZuX_%Gwd^_!k4um5Mbx`|<0q>V8ovG-X?qzau&a|{MUy`LuUN4w=WN~bm ztE=md@As-VW?fyC;TRPqW9&OIqBFR#FDm=8%y+JvEbBCVi&GE%tBtPzW^_C6BH|+OmsJ>{FJiSb;I#UTcIa`QZwhsf7+dU+brPNtbLjp z*LvnPP22@4DxP2RQYoCjRM7bMH1NPgqcdycUFq=E3%?wjST}8{n%}++>>ErgTXyeF zS9`notaoeYr$2|%Zv6fjtMTI{ccEkdzFGISr%U(!ujE&rSZv{EAy<+0&&wu5b;^R0 z!ueG%wtugT3tG!sS9bh-$fQ@rbARkwkS%?`{+?iN=o76gwXde_`(vw>St=G)#m|0z zb#(aak4JCWeO;sebwzT)?Q*3Sg#rVCfa~+OSSQ`SmYZ>5fnx&8Z1dc{zgl^pp017K zoS69Gt6#^&#qRO9mH%vWp1$tNQWnJp8$3OuSPtLm7v`4%aF?SO;Cmv?Y_2FFXIa%%DwCFs~0yi7u znJ#88MS6|TGV>OlXfbdxId@^BR&3n$-ASC2D}O!vJUM7?o${uZaPf~fr)36T=j$yw z{A63*v9~dH&YkQpxQ}}9L zo84Nc=AZMPSp98n#wEqOFIr_T2%cS3_4U<`zu#_u_0RtI@}>R5`S1T3&q|yYRc6## z7ZlY6Zt^ubJatuApQmj4BYfl0{b~1l{qN7-H&uD$2Xx70`e_Dq>O{I_T2&VJ_2yv{T4(wg(7GkQvu zuI}{FxGB3#c*)A_OHU@>dMRU~cIo=ozXdwy9NMnUt?TJM8@;$fx_0Zzn2F|m2N!#~ zS*b4n6OnFGTmQvDU;p&UuZ?cvNx@U)6Yp=+-KZku{@gvv^|Z%xhsWH>`5UJ3e{=m> zSz7&I%HQLwW35ij|F-ns4^A!D)&EtLWiR!%G1kT%NnS4Kt~q7r{gsx>~q*JL6%cejZw$TLjC=j&h4)i z+84K9ZvLJR*bZ>v^O^pCx|2{{GRs&2`IJTyN}| zZd9h@CN~xBZTk`gn=x4i`?V{RY5_c>-YbH&W6WyJC&F7B||G&gpF1C-W9AfL` z3u2npUr&C|^QS##y88FTBcTu9CRJqSC_kM2?#9c;V_%Y84wfYv_1YdyJt}5%QD*W4 z^`+TOvy7${pWUQkTKZaIv87p2bX04es?hO=#!9~Q8w`tqW&>gy}j85cJT zitER%;s1TJbBVXvOA&j!Y`-5hzilr3n*RUgPKoLhWefIY=HF<2x%$UTr9<&Qt8*W@ z+D=&&f1<71(^!9npS$^q_Q~&m)SX*7U0aR+$hwpEpJy!Fc2ap?WW>8wKU-ElkG{Mn z?C9#G-Vgg#d8HPe^4C9ls@}(a@%#N3_Xj!hKUn6pedon-tTH; zWcHbA^TsdnzwQ2dMf@{w4Mn@M3wownidKfLKkiR4JRaJ*Y7NH{!}(g;E=KRT+8kC{ zzMU|A%9aB+L^m^*&W_%l)_gTLIXv;f#|zf=FKo@fap!TdyNb)*W-k9K(Nz~4mGH-X z_D5sgkn;_Jo4$$jI=)|6dtu$b0^VB(8egStIeGZv>xso5rtf-XyXUxrj$A1h*WTw% z_kY%ZF0AA()ePOlKYM?L%;a$S_Vzl~EANds-rIlWJ-6qLNPw3YYYXS*xWk>V7VkQB z!Q8MixBjccd$A~{nAZB5Qu)5XzprI|wcfRy=UhBD{`e0@uBG}*KPd#n`IpCTeenA7 za{gt1OQrlQmkRsYd~~@Ix;-oJ?k>?S#+m>A_-~o><cXHC_pLC6br)B#pMS)nWi3dw1kN-*#KPV;R?T~AcaOt{F(vL|jN&#nuBF?hN zpKCK(@FeiXjZ0-xuTSoj3tZ%LO}6Y!=X&qxRkt#a#VoGk{hREUe7x`IzrVk?ITp>>tD6% z3n2wx)@>2~8rfcR!{qahYsZ%URnIVR{M+_&w$Ws@_&a4+)%r8SXa8Jx%U`Z?+m&U_ z^A=V9*tCAy-u16~yhKa;)2IIY?{@Y7Kk*-Bm1o>fU$gkISpI04nrW8Euvikd)gST(rJA6l1 zJ}L2{kgn~*1-iSgS@S-ZyC!=!r0A5SxbmCdmzh6AyKKp+EOD~-YOcHV^Q67qO8IjZ z3;s7~sQvghJOARQ(9<5fUYoDEo^R*Nmp|#1>+3J>wXIWE6i(<5{NB&>Hza*m>$cf_ zGKNN*B3I2&wiY_-EY?`^?5!eq6OWI;jlZU9wnohMyXpk|vX=?jgqkH^+SzOPc2fU` zZ)Zy;M_MhFxV``@@qX>VeT`?=ILBTsyPo@`Bk0si!_WYBm1J-&5L= zEpa6K=Bm^Mxf33kFRp7|>OGyU^J{M2%Qe-LQ; zVp8=!w#{>W+!`XKTVL)>Q9JJ{-2YQ=R%J}EK-r^?RJHk;ej28cyDDDp|H858k7B=@ z=PVbU;HqccO6Ru8Xf(cWp1Ntp=8sRiuJa%L$g^nL+NfWTBm^t{BFi40&7WT19g^?% zP;Qa;%Jmz9!U|iCCY%mBn)BLw_b0^wx#zi0t+|aJHTOD9)rvNFx#^h1n!MuOPtRFz zeE9YL!&d$3gm1IVFKi9m+AKToi#`VjlcvCrs+-&IX&v8pZ_DjA<>-{HXP0?O%e8C~ zFbFqNTYEL9?e4akR@2GXRZpIqWZ8B+K=Hz_8PnQ|Op30o2wZql@|#mUU%!N5)9i__ zpB}S1!Z-ic(~nhpSFKcL&-niCX7|m_>5qlCc7JS_ue)GjmU)R~?iD}xUklau8lQAB z|7X<~JdNv-MYZ*zoDI3mSLglvR8sQ(qOD`nJ1;MR6>T#Eyr%jn-M;K+{Z@U|BF7@9 zPPPQKi9WMZY6RwUZGU@f%Fc{Ofr{38YO=?=l`dPo+P!^>>Y+@Jm(3zK_^+$=X9m03 z=&8-m_^cqid9KH9h2-^Rxi2rV6si^K*w&|Pvk#x0t9hz~>-N&*$1m0PX1c$q{{Js2 zWVKjoRf@obbSLXsE8ghe>(8oOT7B?*ZDp+W>P;PoZx%8bd!1oic4(aoX!b6;bHVh5 z)0A1fyk0$guAh6@-)>g(&-iu6=1t6h^pE?TW4BdgO~tguA3Zgi4lL|ph<$(IvfQNg zJA?PsWN?rjj-(QJto)1X4)icyn669 zyGlAbYx?%rma?0<(~~dUJQB0ltu&_KAnPxK7&nFH=1qmy&gE>7wN=^w{m9f8jCbb5 zJbEH{^-n_H{N-`Fd#jF?>mIeu=vubEQeg7(E!s|UDlZLu&0>6_AI+@tDL!j9^P1-0 zDQ?Fatez%aI^!KWnfJC~?zNo!Pcd8WtranIyfJazN$0LdUs7*OyyJ7v;_FKO!)mV6 z_eI!u&Wl>7`84}zr$^z2U5B5qi`{+2?9U5+j@0m%S9X`bzb4MVyKH)FeB#Hct}=;# zZyOyu{>(dCz(7zV|MRsT-wekEIf5%X%VN)kvwwf}qab!)5eWWP98*thU?@*Cl{O^&agtF!J&+%d^zijUI1xct@T(sAX*k4_ex zRoSch@=nXDpL0*G^PH}nD*188gr1*kj&BMvy}7a1bNQxj75(0pNvo6P_QX!s`#2;2 z7Td=N`>3@GxaX`%yq3{jwu@hyqW5N*z6gJ`BJcLP+?iiQMfg8@Tla0)mpikwUw1Nib;Z1AYbB?{ zR#!ARXtBJwemHDx%-XWaPptL&ne~c%mn&*TJvr%o#V6m%m}!e12ea!;eh2rD7iJyTDNA|!vg+JUzQQ>SvYU6YZm@Zj z^Z0eLyv7Gp6TvAmkDdr>zWln4dAf`LF4w)Y*bOa(*7?d^+?IZ+_@htkwT;=AG`9wY zajITt@cH23m;2e{Xz@wk>P4%C-u&xS?~9zG6ZGh4V*0L=nrCYxFROaZ3H7>Rp`sMD zu_l}C=B#I4=@$>VT5S3mn6*4eHe{`r=hZi-8~?Izs6Ae`=2zX+T}%D$K6BgnqgHlh zx$D%d_(W%or51;FZAta3$x+SZW>RB%ns9H{Lk?Zo29qUD3HGu4tJv?=?@wB~>)4uS ze-BN{bQSLq^ln&nKCH#xy(Dtw)j8R$%o9V3oK2-N^&A#OF1e%?D1A?CRjJSCXZLP7 z{beeR6rc6jI-~FMEcd&0>G=%{Ei?P(Jc(a5qyN#2;w|62((h!hcMdtzy>H3aq`d0| zFOSF^uUr}z9mM4CA1EAiS#iIlM3I-=Oiq=_X1+786`kjQACxrnZ`$Lv56|B9yt6rW zviq}{CcF6_ZJd*{cg2iQv(jyxs&XaEF1FpgZIoqv-qpB2>;Do}l_VvnH@6G&1>c%* zY}5PQ(IoKl*0+@96?Hy*_Hzs_Tj^DAdT7z~WQntpzrMe%eP`T+)6;a0?yLPR6qmAO zR_4OrKAO()yUTLF=1zI#ytiRz+_sd+mET3h$}^7&UR$nP{4n{o2RO^|f4#N-nbdcAV^iG~Me>b5n!dogJKI8aCH+$282jE^x8R>zdKsOV7J*`duq4;9<61 z{%z`t_>^zg#NM2}{*hyU?$6KmH*5~&yYu%vuXt-)r`oCFU%8l+U8ta zoF;T~iLZ3mRRbxGK?dn_F{ci7xqekE`6 zQcG2(uX5p^e)GSW9bZ$(?K*LtWcz8egALMg3)*t`{c2b~KUb&Q$#dDJSK2u?PgVOi zNVuwT+~7E|XRF{uGsOq>Z7IC&KiEBYn7lrBv{518rGSCn(JwdNmW4IkIQOP3?3{1% z_T<^KZ}{cRyr*>WPui1$WcArfKUcSS)m=IvWBoYm)22nm?=DFC9@;8c{_;F;|A*Vt zxUW4|U3K5=OH)qd(bU66i_^@P%oEt0|PR6kJ;D;z{$Ll#2W&cWh z?yIR@UU}E+h1#=;S9wY44 z(rlCME6utykJo%Vox9F=pXX+q$5z)lRl^l*0@isRUvjgp;@d%^RX2}a^So+S>#}(7 zyoyOb_>XK`>#1+%nd6ysdmdlsrHIq7jT4P_eX)^Colwg8>b`LMj)IP+IhG-_MdOp*)?Qz;x>CodZ)?5&GSY!Vc*4@|d7S4Bz{}VA|fvN3JzFSj| z86>pGStUDM%Tl`N)MKUr->W!8z+*ZpR+EaSTz)BfeDNM)_c(T4%gPR?2I`qlNL z#Xp3nL57zOEbMIfX_$1baU?XM^>9nnWH2v*Dkp~>Gh-Ui*MbtIC0CyqyM(gWYdptW<3e9dB4%E@>g`2 zzlL(bih{FSZkkmdF;Bho?A8_2%xSYtPda-aaxpMH$t^xvZQk8)U%o8ivAo|{TWG)X zRYP6y%+46lQV68IVirpT7Q9Y+@3F(hFGD6sS#S4235l#p|2_nk1$y{T|uW%j74g&DWDVy+Ungefk8=4zJ^v9Ap-)?kg2OuXn@hPO!lJZO^wwZtf3S>7Cs! z#5;rQ`o?L$*K_u*J!mxfyv;Y+YwKR6bNKR$y-nrQ%_}nY?El>2Hh0P4Jdbweu#~2G zirx=4uMNChF-LfQvO!5JbkX&SJsdaYtCv|zNdDTu^)G;PI$O0UX#1Xv`++*vTW?>? z)A7AM@$R-O#`(AUl5@??KgVrZ`tXXv)pgA-`^&5YwREdyxoNodEZ;cKQ+{jnAI?L` z56)ZcUMrq$XZ-hJYG&btizkhK2^2S(Jlb>dy4F3-59_1fn3X@Z3cb^>`}xPR`m)8# zo7cYQ{3`3kXmo!br~mo$_A9oTv;Aj3JVk4M+Nz%l-pfwTzN!3ipJ_v<-{xhj%+Vo zTNYw_S?5YyasbamkXP#BY1kJAhdJpF+ z-Tjtv`O0-=wbQx+e@!10V zO*Z}P*}hj$cIkv%k=ZM%G=HB-b<#{tZ)4&;5GrA_&a=Jr?X1)@=C^a?t@m>U{ddW3 zKgcOw-!wDsWU*E2a>u^hic6nZ{0i1Tddl7>IRE(TesxDn*XHF3W)e$YI2{46@!()e z?PsVrn^JrJ(qaV#j+AbPYtvI}YNxv@+}xpYS>Exy+6A2tmP>p%53f;=%@gnx^*Uv+ zc`pA-rW0okPA?Zfrl)#>@!{sZ>ff$!6g0g0`o5Oe%}I zyZqa8YxC5v-mm+;w&+}1;q^Hg4`->U$zBhck~q(R@$Kamw{EqsYJRuX#?+Oiur~74m83OQDl~lPnA8CmO|TPZG+O zHf}!2^1FpidTL~CK{dZbnwq2GwkMZ1n_pk6c6RTsb+I+`UiS0GluB*fmUWfue(m?U z-yVH`{Ap!H+8(vJOU@M@%j!~lk>EQmcy`9K$=SQl+N_G4pSj9d^9sA@=KB)rN8`ovVUA5T9a_h|WYiIaZPhGi9RaUDk_tTc9@9kfMKGs;O#uvqETuc_*oO@|m zpXX%0*M+`Clk>ODe80-mA3AA(ZAUXZGh_I=L(d9h&Y0hJxm`2uw&}}4!^}rFbFZD= zq1W3IbnGAt&jq%=+ldJ-7f-7BZN#zJkA=}ufu~VpC+Bp&&pG#x=$kJ!5%zlK(3~O6 z5#0V`U70}t56AYK?eLxerc zx|{3IJ~unr`RwqO^m(zH`#@bQ)LlXWTpVxi?iQbImV4>=ySux+7qS;d-V<06xmiuh zBx6DUtE;P*^W@*>w@-L&y?MjawUIYIpZzrDm#FJPx7F8Hl;8WgqWav=6Zw}^Qg2Ls zyLHk#8&A%Jqrn?K3#ZL?PyY17((Q=yt#!V$4J=v7uUg+nFli({*L0eLpW3uc$jB z*yz0AI@iO}D}nBzv#xWUpWMnV{^-Z!e*U@YjR!(=8fUII$dnS@`tpIwq_f2*b7GBG zx_k@dKA!ZeJL~o9jl%OED#Tc+onLZt&h3!dCZ}h-U-eSV=9zKsHJ91!FE6Q2JE=UY z;*WN|z9wwO2`R>=FfpB;uJ4|hs3>Kg7sGY$XlkW5qyz#c3h>Twf)@wXZtG^3N)tv+$xkhkA*3`k@Z#hJ-zUUpV#ks8@}bI zcbY3*>O0Kboo&Js_r*@u`y5l2dTQ}qo1HpK4Gq3| zn#zk53*49Ce?7xyA;uPA1$T}My1GTPqx%l5X~=tV=duikHhbASnnRv)1Qq)l)Vf8?Cl*g!?spmeMiKo+ik3=Dezs<=2_7TY_#l9A+|4Rg-Ah+{Tc!4J)@hV1Cus&)GQBHf66Nx}~4=KBTK&R$;U@MxOp>5YDW4`s`BO+6`? zac{@Dh0S3Xt6GnLlaMzoS67@JGxsV_ z_4@KC1g$wHz{1iPz+$1E_+0D6iDxr&7rj)x88g{VbaU>dZ9dx4^*OQ5Q!FbtOv^W! zu_5V{@2uQKA7ZR>>OHP|$4R%XK6dW&u?YFcY5Q8=Ewo(v^vB(!wT9igzx) zO*NgIeo5~~(8*Y{$j_&KO*1!6klGOWW}7DW;*;mLnBG>iKXY7B_4fAK<%aXlRup~{ zT0Gb1-H)7U^L>;uFH8MA=_NX2bH4xEj*IILwA}ukbmjJa_bc`+SG%Sq9XZe_VUeK_ z7q?4!FQb_5Ve4Wu?b*EZ?()@qJ2ppRtx!lz*Y!Q^`^5RZywoPvTwKGs2B)W0{QrIFv~@}2N@ z+veBLdR>Zxmv6dI`O_k%cj`CZrE|k|Zn4ijl~X7d_3Et0Zo$*J+m3f0|MYH&(w=|2 zZ*Q${+VX!zdg0-lZzqIrVS8`)JGy6%k$>Uygfm-OXB7SAT%zQPNQhdDOusX#w}f|f z3$ME}V{U->+Bwb3|F2pnopmMPkL``k%h~!Y{)v>lud|vZrm|vM(qfKcHT&M$=P~`8 zqn~aHe)@f9=Z|MAybT|`30o>rf3#q4{neT^vwv}w)qXSOTOgJ-r_4_3kAMD^ObP4n z(erA>*sEf?+1!JFU(kNP_q*J@x?hny~vH?og6E#`_4TlVX{DaQu=$gJ$8v)S+OP@=}+o=I?vZPd*{nC z%zEbP>Utu$cG_{5Cc_t>d~T^vyrp)2$=kvSXYL(Mc|9d_x6U(1357uR>|YAEayIin z+c@X8&ia(nTGO~&x=vR`&cuD%zhhDEr)bu)nlAD5$|}RR5B48*jo4pl+|~X0i*fs_ ztA#%{uj$^l=6KpvjrI4}Z2agJ+9UhgJbCx7h!d+LJC1#|xS1e1`z+5dv$HeLoevJS z`!+vvRV=@HY?ZoN-FHhi--XeSrzNeurFi)cpY~aauB)5Zm|cGGIcrhc->MbCQtP*s zBn9oVF3VxJ-K4QT&G$<9j`nsDybCrzxly8q`ho?Q5 zT6{i`bE%Ppo8`Nt_si=KZr}fRb=L;gS1~ume^!Sloc69i_^N(iQ(M1nZ=1VV^7m}x z4f~V#JDV;1^5^sU;rnZES1V&e?vpniE)TnzqN7)&A#FFO8M!`{(a} z6}0F2`$C_W*X`EnhiI|9k!jTqKWH__V3FD7m4Dbz7C%%zvHjWd?MXbPqFN=4X;M3$ zn4QmCzDd1uMsH?4$E8lsMdI-@`?cTMC}+;O|37<|AJYmGhNvs|dqg|a4F5j*TJf}# z{o?@yr(vYUk=A z-}6L$`gVCo{Tr4HGxy8;%-_9=ZSYK9o>=^R;f%jeu6}fJIR3^y# zgn6Fam%Qxpx#H$;*`kkspSL@DtM=!Ottm6V?XNs1RI{sK;jYhb58voht?4;BzqYN{ zf=Asf^6gpk2Z!cw+4g8gC5A!EyP(X-Q7CF+j8ol)~!{zB@r+Ki($+uQFHa2wya zDtn`N-UF7UFO9Px?`d&uskcGZgg?EHVKSyj(B7oJ}iQFmA)r{U5I{D9!@Qq2g;x|6oW_-cyVNd=+d$seI9_QPC z5Vv@}THV0Wp80sgk_g)kzZdPBA$H#Q$Dy;ImnA%K{rus_8BGi4`~KVAPlxTX;;D`M z`rTbK?u~4_{Dn8x2}u`MOPt<0eXgN=)ReIMZ*)Fa#W#ATy_mi6)&j-+eO~5my7G^g z6|*1oyBiQvtkxf5UR;?f+rOEk`+j%k`#YzdHmB{K`@y_vx#;C8o64zPJTK=uEsI}d z{`l(0<_%Fxd*|&*k&iQ(JhG%{DzgrVpF7f?IexUI5pw4B37q@P_ZGMx!q)Kn{ zu7kY!XZCp1AD$GyTGB6bo`GcGpTD;&-dv4Xpu1~6N2T8O&Xw>E&w+)V2VPxWZJ2n7 znl%kSQ25AT`LSHAB~Q={zbgp02ye|V65 zdE>M%+|~&f*1tcLI+yF?rw{*T6rWjdSeKx#dZTmt``w(Exz`;GKCBlIzeP0p+>iJN zPY+2O?)qK+fHN#y4&6Qj>X)Sys-7Z$DM_F z>Wl6ObY0bTnSAWw#+Ua(7j>ncsNL_TzjyK~j{h@%X}I}(`%`YqF0x^pa`ft&&+m#Q zjH|e&W!EX5ldMqBdt1J%tD5`X90M`_>ROR)cI@SSJ4BaX7F)*^!Kd?^VRz`A_LcHE z4^t+|x!n!E@TINT;XbSUhGSd*@4gvf`YTW*w}X>QZ$Gnp+|AIXj#J+8f8JR2#o|rW zO8H9-e>UeGnYjPO%FkuL_s?GaM()!asmB{`*Yz$--?C-T^z~|QeHNtz-Q89C@gTeW zi`x%Zg|2SYHnUm8sI*4x{BY<1Ozs?~kKU*M?rb|TL zSmBS~e*ZsM|L?PzTK}u}KciZr-TsKWa?Z1yc}0%-y;O7OzZ!p8Uz@r0*Yo5% zTW0<^zo)XI{u#H#otb&(KYP9T8*6U#c6O}l_3VwM+fVIUea8CkY=8E>g87mEZPRQl zMYdO;pSSvdVSCTJ^k0`$v&Oi{$#}$^MI3YRQT#Y zPV)0{J^lFkj@ti$6}jJjzxuPcf2Mwqv-$e=O09=KYUc`n{Iccc47EdT@CqcThkbC@xSZe_xG`UjP98os1J=yyL*a?gKZ|=l4eE?Nohv z)8Kl1y{+EPCzH0Y$Gu--e0AT_h@a2CvKMrFshPeqW_c_p-~8|GzQacn{~Cs>D&5+i z-=n{5U+dH*yNV5$t=744tNh-9@2`RaYfmrDn;+e`YwhfW{Z-eV-P&3lYV?wwNB+CT zu|KQ$r|thN5%(j-dyVkF-HCj^?ys2S`J!{8SN@X&#Rlc4G``ILAis9wi}U8IQZ9M% z?D}6=YJExKOXeR|x!vzYr!occM_2qbx0-pS^nu6J80qHV?fVvsf6jXB8>AWaOC~Sm zi@@rYKU%a>MTD#m&t z+9e@nNq6@y-oSnLV$Pk#8Q)HOZ+t(0@`u0O-HpBS4{zU=KQwRgdbiDn$rnC6V!QF} z#M+46HzH>Im^+2P>6*d!`}O<%)Gj)|d3n=o``t3>a~8@!`$YOG-Y(i{75Mwz?)OS% zdpiH?EIMoOOXnfmS)Ub|QF+sEYZ z)r-U=z8`9SanIt~nPASg*Yj(nw5`84-nt^9pZV?X-Q92X-W_nwJ@!_7?mM9)m2cUT zemUDF$CoUXcK(=S^Dx(O)%v{O()E{j&bx18V!cp(Ud>u7z1=e=t9{hFyy#NT%FEk& z_x(P%d|p@Dz2fy!+u!zGJkNJ@<}0zIzuxk@#}zWp+M2gc$VUC;5%Jm@bE{twCf-#O zro2C=%yr@KFU41jcS@`kJA3FxrLMt~dlO%*+a^9Yeg{YG@$=62YLYa_4(K1PxjY$%)B1M<5S5qf30kr+v_WDe@8v$ zKJ$N>MD8cMpxtL@C!NW3KWesqwXF2vVjB<6?YkKECH-R0 z^Q-gzoU8b=a$$!5{aK|s{l`Bt=gs`XBNkI_)%U_mI!GaYwP-I zM4#`^bPv4#aL4-iH?Q}ZJ)VEC?en_BPDMFW_Z+i7w!Ur4(agPm?y_I^_-$Dv@$BL1 ztI-10htB!s+}a>$>TfMt?lZIH^tS6;P$u;4@y4pOw8AKE9b}@q1=x#op5JIki>NhbK=E6f`InRm+{#{_*r( zzolI}vXmPRJDB;qEnWV7C40vFYu}3!rtQ-7RIgjtp;~+;H~6yp>h*`f4SkW9`kSgaj-ypLq@2e)kiU@rwJcU9IP|qe6@S} z`TN~pL-&7Au%CJ4?~3E`i@zWER&lkv{m091clQ>~-LX4og_&08qrF;}dKXT<6@R#T zPhH{JnI{8Hti_wFuOHtK9;qFvDyn{W#;)yeR?M3sa@)}C>9lTx_0jP$buS}d+}Oq& zHK)Mz+1cHKc{cK3u;&sIfGZ@bg}_;x}1 zJ}r$*m!p1KQ>Uj09i0~5KS}z2Q(m^uj;Fqb-S=iMkvkJB>wc%0b!AnnP=IWb{h#NB zS${q5uKxH)XKKc(-ox@zosZnrlMdHzUuA2#%EU^vx2|;auBU64W!1E9-M{17=1;4Z zdSBi7+G+K?qR?mO=B}>)*jsn=?XK7B4)dDdSx~OEHgqeGk45yu4Y{)+2iD z&NrKi8>7@$EqQtJxZu5wldkXCd$04z+lsyMf0r%Ns(zf^w!>#d2S>|OBag6mliU&? zTixJXs$lST#^EnbDULO_zc0KSX4%*@xvuNpD^2rPo?f8QsFHB&-fcBj+?&6gh<8a*bDo+Rc>VG)>`#4a88R?$+b^k z)-_BF@Y?-;a*3Go#mu19t-Id7N-VMBaZB>4?aPnuv+tK`i`*jVZTtUaXLnlCiIu$* z%Xt3%h<{kS}zg}GX{=C79 zV|5wP`kS{mnab~J+OL0OiCstdBks2$s!j8%rRJ}EZ~UxA_I2t_pRYa3%B3GIx8Kcl zHaFtc+=kcfa~6oU-}&kNHQ__|)#iht#pfc<#MK$<<>pEssW}yo=<%(%!2#M_%gH>$ zzTQr6_Zy=p&!4|e5qf*b;B>F~y^ceNer(P33FH3BxjVe;!?P#$8iB!cE`8&uS$O6C z&m`3gtEWEC;lgW7h=1GA?p2-h zGmUlD*L}?Sy!-gA&DR`hU*B{1#qm7%*^|>2T@O5Yy{ar|rH$(3j3=zJyI1b_Pk1cd zU3lZ^alzBt(i?vsmDE^QFS|;L^4aB+ElVtC#0qUkXWZ-9x#eJDVZUoF0D8or?5XZnw#w|Y;mXLU{X&w6X`Y`p9y&-MOFnf3FlyY2XA zzo-lk0-yB>K9_Dmkb=YcZF9_e_kUs1+yAGi=EuYKU&}AN{H9YL*|$@^rm42{>Rg}b z>j~dNwm$YyO|s(I!@qp>UENasw+$j-`cD=y z<+mRG_|RHy7`yVa(S5y*N2cz&aBsV`bXZ+)=Hd32x4&-758Z$5&%fFowN<%1lIC3L z+caF(I_*->cZr>PfJ>7Y`IB z>PBy4`THsHc%N)3i~YZk{U6_KKL6@T_Tyu{j{BM1Pc98x8`bKzqwFbD%_fJlPik#u zht9pvVjom@^_Z>CzNd^P^9)#Iv)2WEIozf{cjf0>hS8t4mgI78$&}jSU~;DQ$sCsJ zEghb_1(Ygx`l|&#IQU*~UE)+debE(x)#so)|ne)m+=;B5!uTE@yoj(0nfPZ$o(Ej_?$zJl)liu9eBze>{dhzqC&R-U;OWBb2 z^ZAe8M=s8=X`kf%`NNa@;*UiwY%+H^l#5J#WVE4=yq0)0r~6);%u?;AfoQxO?7T&Nw+6G3T)Rt;gl|$r>k3 z`_&bg%jmCl{QE9J*=2o)I;5{|-K(|My4>yIt;!jOuR>$KpNjYrz3R`Mb#e^vA}>|c zzuD(_;Br8C>bq4)@;IB?M_Qm=ilwwUQ3bpnAzUQ14 zd;7e_TP;9MX@x8eh(xX)wW^c6>HSeuwdTkZIM!s!d-tToS zbt?jGot)Iy%l*xYjy8$@xyVc7taJOj=Zk+!t_|FC%?tL)N)0eec%DU|NrE`RmPw)$O%G=DAKmGQ0a z-S+Dn>>nM9E_dn_U0wFbRHb~ut3Au^8vI*3v$IxY^~bk?f3Kc9eBh)0lFVmGoY##2K@$Z`aDX!V_A2au3`4rE$!AYbN(GyD2~QK7U>r;+9xnKtoS(e6 z{ra@0@(DaEvWSb^5qJ5h>+6r-CY!H*E_*RgZt)Vy%MW#L zS01}uaQl7S!SB&8nk}~7t$Ns#`A`3~?DeL74;3A4)wANpCrEN;bo<=9X6F7HSRcq46F zs;{tlne*PA_EG!!>Xo;xZ2NJI4N0dyKjPVK z(?2t+c7?lAfKjLSyjy2o{~oc_S$SZq*PhUD>%vv)DwCUzIiFl~i}R#P@Mf)(Jt;vk zVtL}%txGg#P3}Co#JPOU(}a|lPYfi6%GOnR~(d}1f-1qYlCPJcFU`ZN2N zi_2urewu6^9#`en74W&>-Ch2Lx7Rc-u+>}NC%dFCW%6hD*u{0rd*xos#(bLf{m5qL z`-iqZK6%-uXU{f%3)!dJyw>M$@8{V$`~IQj*?G>!UyJi!_RQaB__A_))sLNry31~! znQg=)?&~S)EO+if{KMe%XN}qVhnN}FHWtrJ^HGm&`uA16`JGX;$y>%Rf$l{wd+f5p zC+bz!Me%OF@^jwObLD^k34ffni`8IsPs@qf9kP0UMb2cG%~f{` z|6j;EX0yZNEVI`NRkd@!`gV&?oVR)2i`b~92F#T)<}7FKw0JJ>nq2ZyBYgLyGYd|C z=2JEHTWIXK;9qCPs(I0m#c$ocwA*#f%_N1YEvDOzenqW_&9Jf9ea=(D{x>U+UHo0X zwCTU*7G8gR`D4QQ2qPu^_`BKOt>uzOqyF6&UMJUoUF}|Lo^FzLQN)Fv?`>yToVy*9 zb5C!&+x<7%d-yoc7+d|?k|(!Sa{akKT5ijwn=jP|Jv7}AZ4{?_?)~~QgUTP$jn}MS zs@YWg$2UKos9Tl%h+A0j_LnO$wgDF(FBc8o{QvyDnFm56*VO-6E|cOe5E$rkr`$+% zdXGu5_gS6Gr&QNwY_9$qWp28@>hEmx%}=B5%}%>`*2vWNvdLLf@jFHL3&aBh141VF zPH_G^zw&(LLx$%v4uJx7pMTEze9ro`vGM(x-{+Li`#!VMu;^$|&#TK;>uWeUIV77l z#Q*P3xGQmDr>0xI0M}`~RcV%TYrJ-LMn~nzE2?4d&Zl1m9BMP z?f1?r-~7y4<96LyF2U#%RuY$mTCV%9Wf13&zq#X1!{pC##}B+r+Am@tGrO+JvuygN zf=!WSF>`Vj=sL2A^Z%%N+OgFmCc>*}k%rvV54dMoTV6u7vOc~;)3y~eL&%#Zr+qbk#Kl*LDc6i=|FY#+?t{gE4wyTe@e3f`g$n*Q^#dYicOnY9n z!|K_$*NH+)k3O}#e)wvjrRaKV@BMoXY~SsRjan_@^)06E-Jz7FK0?p$t}Bd7oz%6Xc~j^&rNY)V%?EFK zPdoc^nf)@UloS6N%;v6H{r#))Yo&WijV$x9FO!k4C;*uMYQx|Ayuw?ab_5}sgEBa3O*J12Xw zt$(W3)|+TdDLTCCy|rq2v)AFB2iJ4&n{6tizsE56cAaHSpu{2Z$Za|di_>cR^fn2W zWtK^9UpHfxc=hQmB^yl4r{yYx4Meu$0_PN~Sl5^H_P)M*EV)zRf%qSxYq_;jg6;i} z?i}sz*gvnOq(WgqpzxNw%OY{92`1O7KPA^l7YX<2P2Du@&(w}{iK>V+|GpML$~|BjhmpY+x(6`OF)F8udf?bFx29FKXfl$BY!BQZ6BE557x zeO=D1H`-TBeklID(?50pXRF=6uR30yw6*u*T=Om=xcR3{82$bIWA@j@e#`ozds*gG z*5lCos|^#*@7$i(++w;qaOL~U-zMF?Ubw3E-ND?q+ZO7?YqLtKmpwGxujs2SzUp@R~v0PeZNL~8Rkl&xr+dn@!u@AM}c%Ub^ zqxAK(w53bd2;|)h$v?hK`z=dMOiaMaAl0|Q3!PePX3sACX_S`}(cMy-J+aQr=>C`Q z-b~AHl|Hz-Ra(pL8gF0d>Sxh!H0mU zU&>GQ`*}6`{uhJO#kMiB#lOEAbY6N?H2?L(S1aapU7x%3e%uVX<(kEt{BkO$7^!dH z%(MB~^}|;J|7%F@inrHV8j!bNZkcwE&iT@%6I18NrByC*^1QeVJ(R&|PD6}oY3#x! zBF0OvYPyQba!z2tf<(j{gI3ShILo#4k(7=OW@*|03M4O6My)AcrQbIdqUA;?H{c7) ziU6&uWm7y*@+wr;fobV122ro2yQ*(mfQu}!>yUGVMioWU%;P0t2UrEu+?yu6dfOldySlg2PHRht{B#@8ZnRq8#iwj|P^mc?}C+xCSYK zOrOHQbgbmTvr+|R(I21B3k4{KEj+h)FUyDv}u zW*9CcA)fw!Qx3AFHY_UwPBphMsyHxxw`JUVrgvSApvF5p{db?b-~E7~C7k>9Ca5M3MBvR3Qer|u1! zX0B6P&2Ht`C_{8Z$RgndPMYR|^A69bU}aZMjTc(ISXsF5U8tbQ3&$Xp1f>L@1C6on z6Cb{q(e1$|qkYZ2n{D6DL*CCakIdO_P;xM}_$ia%x6AAq55tUJSJhwB68&HOQB~)K z1?THF(_QSo21=g}=&4khId)sceP6KWk&cpVp}6qFpsV8V!s@qoZ_d-1jqs1hf-OQ1 z)~08^y=k2h{%a{m&);V~vYe$KAE);(+Twrl4TA<_VCIk1XGw2XewR=y{j7cO*OIx1 zo(L)z+{@B!OZYo);`gHwnLn;n=)9WMw6}O!!Y#4Yy@?5e0z1lAy+~QZA=|jKHZ9@& zk@in(E2Exh?fG;otS9!D-K<^DXYWZ-^|0)0)c?!9*Zzl)viujF$kOCoNDx6tFI`an z$-REB?(m&g_C2Y=x4RkGEtbqbe8O|~gj?%`_elkC&wM#E%7WKCZ+`y8CnXMEK2m(4 zKNn{lx!WnytbC<{L&Avp^ZgvoJ7wsOwTw`z~5wBFsGpUU%2wrP3v zk0+TvQCI4E{#c2f|F*hK^!}Tpf}VkE{h0S$))&|t_KoU`###Vh3;+B-+#Mr z>BN(h?#Z72wyJ&gZokC`AMC5J3P@`&doq*j%KpnAE~oEjxNChN_rF=q9^oG;uZ&mJ z)!Ez4EElL2at(a+q*akw?jZNtv!$+F*L3c6+d6E!$cE8v^vo*$1KUe*&HY&_`D^|1b zACHn~y8pu~tCgMP|1itfY!Tco)VL&8+VIH&@nd^$OV@?>J-YnOZj8*>ivNW+aGNEd4Gn5ILGZTtXXs7+P>TW
      Dh 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°=$E{`C2F62^+JrF>6%Kf2WR3> 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 z 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 diff --git a/doc/workflow/environment_branches.png b/doc/workflow/environment_branches.png deleted file mode 100644 index ee893ced13bd764322cc4195945403731508c9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40210 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 WmaLuI`xqD)7(8A5T-G@yGywpL3eL#@ diff --git a/doc/workflow/forking/branch_select.png b/doc/workflow/forking/branch_select.png deleted file mode 100644 index 275f64d113baa4800fe6a49c366d5bb3c1237068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55352 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 PFfe$!`njxgN@xNAeO)mq diff --git a/doc/workflow/forking/fork_button.png b/doc/workflow/forking/fork_button.png deleted file mode 100644 index def4266476ad23531e7299ace79fa4e999b3d94c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68271 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 mItQ~l2Q_!87dnmq+3Wtw8>EQITQD#%FnGH9xvX diff --git a/doc/workflow/forking/groups.png b/doc/workflow/forking/groups.png deleted file mode 100644 index 3ac64b3c8e746317376a7e0c6fa2b1df9e7a4569..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98109 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 diff --git a/doc/workflow/forking/merge_request.png b/doc/workflow/forking/merge_request.png deleted file mode 100644 index 2dc00ed08a1df18629be937740f32ef35abbb87f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60597 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%0AIR|ww5_4Po@kr*ITR*fu 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 Gp$Pz?7fAO2 diff --git a/doc/workflow/forking_workflow.md b/doc/workflow/forking_workflow.md deleted file mode 100644 index 8edf7c6ab3d..00000000000 --- a/doc/workflow/forking_workflow.md +++ /dev/null @@ -1,36 +0,0 @@ -# Project forking workflow - -Forking a project to your own namespace is useful if you have no write access to the project you want to contribute -to. If you do have write access or can request it we recommend working together in the same repository since it is simpler. -See our **[GitLab Flow](https://about.gitlab.com/2014/09/29/gitlab-flow/)** article for more information about using -branches to work together. - -## Creating a fork - -In order to create a fork of a project, all you need to do is click on the fork button located on the top right side -of the screen, close to the project's URL and right next to the stars button. - -![Fork button](forking/fork_button.png) - -Once you do that you'll be presented with a screen where you can choose the namespace to fork to. Only namespaces -(groups and your own namespace) where you have write access to, will be shown. Click on the namespace to create your -fork there. - -![Groups view](forking/groups.png) - -After the forking is done, you can start working on the newly created repository. There you will have full -[Owner](../permissions/permissions.md) access, so you can set it up as you please. - -## Merging upstream - -Once you are ready to send your code back to the main project, you need to create a merge request. Choose your forked -project's main branch as the source and the original project's main branch as the destination and create the merge request. - -![Selecting branches](forking/branch_select.png) - -You can then assign the merge request to someone to have them review your changes. Upon pressing the 'Accept Merge Request' -button, your changes will be added to the repository and branch you're merging into. - -![New merge request](forking/merge_request.png) - - diff --git a/doc/workflow/four_stages.png b/doc/workflow/four_stages.png deleted file mode 100644 index 2f444fc6f7967772980948dfec8f779a204bf915..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20934 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 diff --git a/doc/workflow/git_pull.png b/doc/workflow/git_pull.png deleted file mode 100644 index 7d47064eb14176ccc23e472cbf1d9ea34f90d91f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167056 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

      O`AUvLbtM&h;jJ4nQ-Ac&($3882@->qs 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%0AN=NZe!u8`GuvVT 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
    1. VZ|$O?nqZUHox&n)`3h^>y*)$=7a4 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Ì{#q})B0<2rz`U9e=%(2 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 diff --git a/doc/workflow/gitdashflow.png b/doc/workflow/gitdashflow.png deleted file mode 100644 index f2f091dd10b1b63a911977cdc4c059ac2f1925e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184726 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∨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 diff --git a/doc/workflow/gitlab_importer/importer.png b/doc/workflow/gitlab_importer/importer.png deleted file mode 100644 index d2a286d8cac32caf6594537b6842ebdcfaedee58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40778 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

      T+zMpHC*u3lxvO=^A$P1uNAzw%89AmGhq9< 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 diff --git a/doc/workflow/groups.md b/doc/workflow/groups.md deleted file mode 100644 index 52bf611dc5e..00000000000 --- a/doc/workflow/groups.md +++ /dev/null @@ -1,71 +0,0 @@ -# GitLab Groups - -GitLab groups allow you to group projects into directories and give users to several projects at once. - -When you create a new project in GitLab, the default namespace for the project is the personal namespace associated with your GitLab user. -In this document we will see how to create groups, put projects in groups and manage who can access the projects in a group. - -## Creating groups - -You can create a group by going to the 'Groups' tab of the GitLab dashboard and clicking the 'New group' button. - -![Click the 'New group' button in the 'Groups' tab](groups/new_group_button.png) - -Next, enter the name (required) and the optional description and group avatar. - -![Fill in the name for your new group](groups/new_group_form.png) - -When your group has been created you are presented with the group dashboard feed, which will be empty. - -![Group dashboard](groups/group_dashboard.png) - -You can use the 'New project' button to add a project to the new group. - -## Transferring an existing project into a group - -You can transfer an existing project into a group you own from the project settings page. -First scroll down to the 'Dangerous settings' and click 'Show them to me'. -Now you can pick any of the groups you manage as the new namespace for the group. - -![Transfer a project to a new namespace](groups/transfer_project.png) - -GitLab administrators can use the admin interface to move any project to any namespace if needed. - -## Adding users to a group - -One of the benefits of putting multiple projects in one group is that you can give a user to access to all projects in the group with one action. - -Suppose we have a group with two projects. - -![Group with two projects](groups/group_with_two_projects.png) - -On the 'Group Members' page we can now add a new user Barry to the group. - -![Add user Barry to the group](groups/add_member_to_group.png) - -Now because Barry is a 'Developer' member of the 'Open Source' group, he automatically gets 'Developer' access to all projects in the 'Open Source' group. - -![Barry has 'Developer' access to GitLab CI](groups/project_members_via_group.png) - -If necessary, you can increase the access level of an individual user for a specific project, by adding them as a Member to the project. - -![Barry effectively has 'Master' access to GitLab CI now](groups/override_access_level.png) - -## Managing group memberships via LDAP - -In GitLab Enterprise Edition it is possible to manage GitLab group memberships using LDAP groups. -See [the GitLab Enterprise Edition documentation](http://doc.gitlab.com/ee/integration/ldap.html) for more information. - -## Allowing only admins to create groups - -By default, any GitLab user can create new groups. -This ability can be disabled for individual users from the admin panel. -It is also possible to configure GitLab so that new users default to not being able to create groups: - -``` -# For omnibus-gitlab, put the following in /etc/gitlab/gitlab.rb -gitlab_rails['gitlab_default_can_create_group'] = false - -# For installations from source, uncomment the 'default_can_create_group' -# line in /home/git/gitlab/config/gitlab.yml -``` diff --git a/doc/workflow/groups/add_member_to_group.png b/doc/workflow/groups/add_member_to_group.png deleted file mode 100644 index fa340ce572f0804186abc0454c682bf16ebb524e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138184 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

      n*8&a;I#_Zf!q&&xJ`Z*A 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 diff --git a/doc/workflow/groups/group_dashboard.png b/doc/workflow/groups/group_dashboard.png deleted file mode 100644 index 7fc9048d74d6f59798693bebd219060db1a82755..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107332 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ð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%0ATo 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

      %r?A-n^fD z_nWwRmDRM|f7**;l3y--_vtU2(xSy%FK?3n5oWaL+@<%ozQ-R~ut`lT^mpIv#;5mn z3gUES??|q%-7FK_esroy+WoErJ0!U``g~%X&SNPeET(%TBRh?^+IOpA&aav?^X)ut zKeu@1=6Ee@>3bdKU;goJt;WZ0UW$u&{W6~2cTO*Fw|vXvrK=~czo&3t)1k3Sx1g7O zbNQOZ`MdYMKA5)k{>P=?cGq3|zViE~xL4&BR}87l269rQ-XJ9y_@8usLh;y{)xlsp4ayU)<$h}>kjyS-SGW~Af9)8`JUzGcjJYiWy?w+p`);q{8S*ZHvEn|-T4&02BEaPpE%C#;GYEm^ac z{mZzqMl))A24k}4lIyj*Cy6O*zn(O0*`b7to(p0{ws)^z`8Ml_bNz$Z9H4nlZmTpblxru4H-&`jTkB)EYD}FI9`nB6> z?`!?5yZ<%2e*NB8wQ~P?E-o$sDJd&=KK0Yyf1d>XJ>tK2clFBrz`cF@*4AHp{rdT8 zP;lzo{he{^T71_0eQWoh)?2%-D*SgyVQu-H<)H8hX2+OuY6h40nceJGMuYL(ISu4BQ)$9aXm9>IeOp;|N8%3C+eNDk0-X(_TB_}w7gt0GJ62e2`t)k$>)@T&)=kT= z-2A|hE8svi>y@l%F|=m6$byD&&KKG{w5&Bm4}>}<)tW}6o?pLWU)FXl#*Fv;Lg6OG za-dF+L*p);0}6$)`*zKdMlGxvVnjNMUiFud(l zA##y;Af08FS?(+2Qq8N+|M$eH7L|D;)#Qy<`U}=`T)Q7S zt9^BB$bnl)f&6RM=j?3Lo}=x3>=&rm(Fn+93jd#fBWkvm^&-^PkOL!Eh`&Sp)|i`N zfBr}vkZ!s&Ro479B&hxhBuv;*7n6Q&5_-y6rMVzXP+UyRtMADpuk9gM+wX?%Ql1Ct zhl;FdVrV{sHkt`>#eSAA3>$Ceth;oCmyJ1GDBQD8J+OgEWPw92hk-|o^r<(^=oZz4 zIq(aJi-=_KpIH6I<%(94sLHis?eK3k*T9K_kt-&X(Qd~(FYe8?ppXJv19irSOvb56 zO7`~qy%>{B3q=*e^r305VLR7{e9ip5Ml#}PDTynllu=a1Y^G1Z>dw_cS6)3laKK^N ztQA~x=NE!PtuabCVZx4UD{cy+>-*8wz{U0a>C=U)EIYndvazr@?2XWXxZ|GA0fmj` z@v?or=zhzJU9e+E1h;^=sA%Zwe0zI)7FO2K)x7h3AaT2bmyxYA+j(X!MsawZd&Skm zV%@H%?bqB}9em~RD=E{gBPPOE9iQw32S7kJ6OYh!DO1e2&KC_}O#0fetEq`;#ndBL zHLDtC@ULFor*wWP*nhV~5+>|0+j&eo7#yg@bU4r?cZO& z_143aU^^WeaciCm(tP!>mcyEDtAj%tBAzOwHSDnJvVn9v*0q7A0G#L6BIg-UsyGlT z9^m+J&mNl@XP;&DyViTmDV*5Y8wBB8R5P0k}b#3{tK#wyi-hzO0!j@9#4tc>=3|a+@BcCGpJ&sq z^kZ@5?{hEit`}c4i|xmw5{tCi4vAq#`)<{-ZRe5h_>dLj^|khqxB!Fwsh|d?uTBTd z|EsMQpWZfk2`D;{T-P{DOhZranp{x%&reUa%-0t2N%uC|$ts+)+$8zF?vE;;>}mIu z?XwGubEKch-0e5@zIW`MN$}L%ibdiaGtNJLu~8*v)h}JW$p(qHtMecKeVZ9)pvc$A zB(j2+ah=LK-qdzG9Wm}zpY4_Te6QYE_G_hiz3HlB7B>Z0p@|sm;Rj2ZwD>nh$wr2R zggg~oRc|lZ>-P5PX8sl0cAfhBY*>DjA9C*Rb>O}obTK;L_vrEW>kiJ_8ZBu3RIeo@ zvQs_Ix3OW{U&FU2?N;0qO4xb+Z==$`JrA9U7y=1O9(AoP9R*T{vq;b5oOm!v3cBn;Da4*7}`tOgT~AKe72OV-oLC ziPprAb3YthrtEP}qUFSu^BaFfSo>6c2$KkHJ!Dez=bqn}xnC3xZ7zSjc&*r-Lg5Y1 zPXFzY{Aa&Id)LHkJ^zkQDHM2ZcfU#a=QZ26yN)LxIS`R~y5+9+G(}|-p=I;=6rGR0 z`8#{@_xElOuDw_ml^X1}Y0mDGWqAU-j`trraHBwE-ko0l>+>C+zvj6yzr<&?^reOR z@AfZOpHm&)UNrH?Q>z^7MQPfxEhPu$E^bp?*7_ttzGp`s)Gs^w z_|HDyA4SgvBX;Y440e0JcG^e(O?~_K7(SWjqhtGR_TLSE_J&@2U6dgzmhyF4^#eB< zz0;QxphvG0kTYs}^Svb~J4Qc9VZkKfSBG|&^DJz;*m6Vs9D z1|GL$?G)H7kC!D?cRjXP>ukC6Z!o98^9A2OY^*3Ku{l)K_waQ8Hjj>5EpO#(RTv-1 zl*pUNl;6K9&Z}zwc~$*d*S0%ytNNAZTz|IG|J0Pp{g2i4r_L)6(3++*ouSY}oJZbT zto&F_$*Ef{e$uZE5FZXua zW5>A{%0_;uJ9NdD*?&o!|ZYGs{``%Vq}#PR#xDwAXRn#M>MH2eim-|9b5m z^Z&Bgg4@0mPiR~Yn$HO8?#GKi@Jfo`-y~y?l7B%}y~cv&vsP?aG@C2y>V_(Zxm5wN zu^M%3-8!pt8=pP3nfT_+N*#x8i7E1C9Xnt5@6cXWlGL^3{dbQArZS8F8!%0L^)NGV zVn)yZ!>j&UPqf;=tl;d>?kI8DKFmxd;P@{fbUWA-=a8Lf`~j|)?eJ}xJkc0}5H+k^d?J744%7tYRo9`zsl)_VHd^36NB!`!~fH#6>xPrPkb>2Tldb>-Y&e9o`8W#uTo5PECyt&NX4 zG&HuW_`{LHdzZojb~qon%YSh@-?ejo)`9nIl433;uPBRBxT08ae`B@ygB$BDa^Ef4 zdVS;X(rYG%kM2A%O-A@^e%51yQ_EfmJ?>B5pQ7|V?fAuMwrx#rsr|9GJNz^cCh=~a zo+^3s+AO&vi3;FyBjmtGe?IxSOzpl%RU3q<5%0j-xq4EXzwHt|gMhI4*A`y-)+XJ! zWbO^+)n$wGa$lQlp7PdOwNAQag~7=W)lPh#J%Q(gBWD!)oUV@+@|a+-$kgrim9}32 zYg{FYw=P&WPy5FoPtSu3#52EVbd?A!UcX|iS%}K{(~W^^XTNRfyzJ({@0hk!<K!%Rn4h~*DkyMdZB+QKBCywSkBb;8?h%G&$Ujz@%`!l#Jx{GO#!^i@Zj?)vO{+iQOEo^Zs@Bx}F4Scj-jVQcPGIt8iR zY06fewTjiIzpk^iGxNmRy$bv@q8k?%x#i?!Z+W}uoNd?nYj2(1{PZ>jJyERul(6Hy zk(ZoRMA-g5XUpG*#Unmn40_{zwqdCw15=L{&zt@U9q%T%Zuf}VEYn%!b2fMD69+w~ z;v?H~S&}nmTseL4`~Bq#?oFpVU)x6}UIPa}I8 z<<2fn*^`xXd_&FGyxeo@N3+i^toc#i<>Il@p+-4IUfc0b^6U*&!onk)Km>C&bNB1iYSCnqe4Dwk<*e{}xgWMAu#A1}_mwNp{{SJIia4>JmkT3h^S|**9q-V|txO^-xS6h3 z7;ql9`nB!#?tjNO-+KQe=y$CB>)%(ZBlW*7)+qJayE|{S{j{&iS<&ks|5|swb85Wy zEX}X$sx)<`EZJhmrTLMW{{xmbKj*UOhiokyKRg$*z<9>B{a4ER)xmlzq{*+bQ~a z`v0DX{l0En{@&g&$8d^u+4Gsx(qG0*p0A~SV1`fXQLXs@S5^jdOq3T|DgSTfeUXo! zKVQCgbz9ZSMf+EaxK__lwo9ZT}+Iub;pE z-s!5p&kB5UU+ag)-@kT0b^5hFDb@8JzPPrUf6JbSYT2)PtTK*j1~xE-yEQmI(tdm@3^ZE;?kPfh zUeQCBwrpXys%*6iQ4y(7QQw)4zZ?NhY??zUxfCcwBSM1rV z1MVuJbQ7&~4>aV@-M43s47fQK65OEOxtgf8>@3os65CRR5T=arvmbttY8+}aQUG4@ zXJqTFeX>hjOzc*$&kkuL=A-XIcJzb0)o_18!@7Yh?`*-m&N5 z3WtqcYMYTvL}PvkX|U|Hox1DPS0`uZg>kD=($kgA&9B=n64Q-3kYRGmz8GUrX%6d^ zL$jNjn4ZrSt;xEzMN?iVu2GO5GUjzx;DOhpU4^oi+-MM1by7Ilz9s^5fMY{uRbE zef*SpxVW4=JUFiG*18^3-1|+TbxO8?=TElftu9!u&%wgRretCgBE70Ae10UB!~k(G zSBT1isYgUPV~;-0O5LzryD9Wtl5PFQQ~qnb3JN}i%GmCPWDP9wRpZ#;n54hYYi-n4 zr@+9#sqQDP9tmCcxDzQZk(n#ZLF2d|mxgI~UhT%U8d7AzfvG|Xevh~%&;wO&pvYc#KS@iPy{CTsRLw5(QzUx|d%4+T3Q2S>gyVp)) zJ7Y0-R@dgAM^$&PyAby8XUUQ!%MRZQEwox&^5_rjEP#8W>&3(Wz6k7J_gVkyJomLB z>nDAdcrt6h#`WJvLr;XCofT~8Kij|Sx8E82q&}JXo7eR`es_M=v3p5xs=oWr_%kQB zX6l!3D;{?}dlRT^8mwubI`!>u=iO3ErFo{#<|ypx2_h!^mgVM6_f*rT?R|Q1 z&S|@!r(`spBKQ4j-DUK5Qz$6BMHrfznzo4R!hE8k8&LdzlKx$@@8BHKu${Bz+uiJml_Wj~S&zo)a`u7{2 zY{|)uO1!wY;QL>G1wAL--BTmtUxl5i{v7?KDvRx1&!uUP9zD2zdSlUDzLZt0i;o%b z?D?)}W1tYVdVTFl&x7jT(~`@Jq(Y`%*pTr>y3XG1OOL~=>)jg*J~OVpwO#(~VMdd~ z&c<@iTej|=WR~*!PruQ&^V=Rw-*P7C?F-TKa(|?}!}F$1y=+vMtf6FGcCdr}_@e9+ znmY5oE7n;}UKtwuVZZ*OXij$eO&?&x;c z+LZqS?SD6Y`2Iz2&&OxaISO8E{*j|}ui|yELY2uf+bhCRHiq`B@Av(&V`}$1_~XQU znRShOCwt|_*!;A;ru$DO{=M(UD7UiXD++}#xbI$eZCO!JS>j3e`O1-zhdN%wl_wr* zQOt<+YxrF9$V%t;m+U1er>BbjuPf(uTPLRwc2;cuwrYDF`!yPN^P5cP>mA?jd9C`e zgj8pAd*4xso%MeLdYV_?J9cVvuHlMeyKNSClK(!DlU{yxW8c-Et0mdZPucD)wKuwI zk@6<-qHV$VmW>_Umdf7`?zh?DcFB$Pd+EoY@)I}wNPgq7@m}!6yYCOi-i>Mcc8+;- zE!UBm^UD&ypE|$sdYZJfz1(EC?=5w=r)TTGG`&~*(Yd6qL`zCOs&nb<$q6z)ME?Cd zuvN70=G%fDlTk|L73NH5JY(|pOw~clq7P_2kWjex?Mdu~O9CEpOg~+JB+ap#*7oFU ze)2UNPJz`GaqVI!{Qt0=Kkt2k=}6+myMoe^U1z53jWDT}+UK|3?N^ts_|iJHO+K%# zzwF+a|FOHGx|O9vuVuC-Lo*nV-^e~b8{2X@x{(W(wQ6Rp0ylIwkQMr6(Z z1T(Ss*4*BXdYiU7%v(}3VTy$KMUGxC-ngdAFXK;pWteXB+0ym4@7=}3Z)N-Ja%FG- zJkoFQ`mJbGgGJD*Bc~QU-10=WqWYSR%$e;E_ONvLYNf5{dZ|=rStRrGS&qy!vwEw! z-3K~eU(m6ZJ~`V=@vfq6(JeVntJ8J=j~(1_{(g?$-8e73MYCdE(mqwa@hR=-nP=Zp z>N)d-j)}sJTf6_Rj(@Gel3n}mNapQ(pOe-#-O;rE_Fzh`jHUZG1+0mpJR2k?UVI@Z%^6%a ztL(pyuZ_0)Q^nNyO%-`gO}mcIT4D9+F#FEqWhZRSw)favVz-~!ygl6eZ;o=(?sE5% z6`t=N%SM>w+kRrct+4D+_LGCPbBhJ^?f)+mQ!sNowy65M#}d`G#}+NMzH`FjU64Sg zM@6;fw>X|DpOaKAdpzIm%HClGC~5kMo60Ha+y;+a_opAsn3K|BRyFlB3JFKWg54 z)4=V1^L{(yBeM=Ut*w}PApX*;P!HKZJU-d>(0ud&3?B9|DTbT$c;{$qwM%FUHq*>*fy4w z=;sN&VhfCu&h+fR8D`0>`TAMHy!WCy1Ph6^|@cq2~lYfEjT~FH?`_IQU&JTL(5mTMLitDEQ zwS1$0p91EThJO9&a;CCQ@RC_=Pjhp;W4JBD+FO%emnN)^x+&cq**&kt^!GN&`F~z| z=A5-_Sp0Kw;pYj~8@J5KPWkX)-@Xq&jeZ{N_*}a-Y|eh0*UY*5r95}47Fop2wmkI9 zR{6QD`t!LqYxgW*k*`jNNIpZ1F{mU(+xR)!yS60kHBH1l1R zYN-#Z*59%Cob-s867#Afkm-=I+KK~9|7m|rtVp_*kug){lmBD&t&4X2W~pw7FcmON zuwl#dICO1G><`m=j$77SW^IdSWo=YTbiN^Oh_nYhO)|KcR;*>{kRt znH;-U+q`O(=>BWW2GwrbDblyI_Q$R7XG^tv!@Z;IO8kdOM^?=CnDgz=%aW9N|3r81 z4`~dJp7>Gz^0E5;whn9hT#nnfrQb?d+7c|iciGpwiAy&;ZhW05&64AF;N4w!6^}c@ z7S$ZPRm;T1>aA65vZoi@xZmEkRb1k#_}?Bak3GyUA3qX!IK992{;KSYvdlS+<=2bX zzrV|WW22ns$>jy<*~`>3ezETCw4agD zk7aDxoMn#*8$PJ}GWqo$=P<+nRSTzHHL_xBJJal8qh_CDVA8VDmpju~ShHQ#>+P?G zgMT(#EUW6-E6yw%6qfO}PVMcg+%*%2q#v*O*)Pp1!5vrm1(%AdLB?+1t7 zdcSI8=IuQbzFPbH;U|hh3e(mFY5$2k<344#jNViJ$?l+bcZf#8S<~ww5$&R@)EsWF z+WAojlte@{;u{v&1U7iGZ`+w!)~PrbiEB+A^lT;+kUdEkLRP4@*>DMch+U%d9T z*0E`U<_nhYUD{>N#4Elr`(*o#DR1l;rq}=3u&v2>%~bEzjb{b!ZdI`^aJBupbr0vq zM9v#q%K0zJPgD5#efO5o1K+>xT(>AV_xS9G-vl?_*r*g4rab$j!)@muVQn&E^~=Rl z%C37n*gENx<0n^j^}k(z=Jifgnfi#G-@PDAC`^6np*xow_HNSO7H_Vru%g}X?$)O- z_ib45?ON#0Z^Av-vQ-}*=RUq>n#awS?e{~pyXKxgx=87{>?hBkt2bmu+%{W!JJjCf z!lGGv%URt{*IKc?->0wXuVS&+X>Z8X3mHB$K3V*Vn9g{*k1yl-rUQFwpZ5u!nJ#)y z>(%QZotf+#N;;Rw1~L~#pW5%HIq%-}V`Uku-{rSo+E$#t;Euw^CXS<}xv^>~+0Og> zPjBDuXQi`jacyeV(fi%M=CklMKUG8NNd~-UiTQst{yl?5A}G?ndL6jI@>W^t4gbMU zDeoG6XL-Kx@|tmRX_Z}{Tv+2xgDHHxQLDerGGH!0ZqgJvZAVu9!w8=f=e8>77_rO_ zoq9%iQnm!&V@5OOoo?P@n$78a%gSf6 z&E{1sTRWz>unTpc(Z67Kd%wv1qx;t0KYZz1ny2_fA%|_@MRzzH=R0oPG{ZvDQ}gAA z|8bwZTlkLnPGUQBS?J>PvKG$?72n@6zqlH>be6%Rf4A4^{w~?i@#S5r%cpzHKl0+0 zSBiI?yY716hOQ6OLiP>m^R2FS+%w;%x4YL%ZfC{Epq0is8v`Q^Yv%Si)M;JFW}3I# zT53{Vq&8bK>&}}y4b1v=O7j9{e3dEQm%Ur;$xd#8Y+VuMAGfRxKffznt&E zfB9yovYv_P%>B!`NZdBz^>dSRp3-M!m^O*~&(kzz%WYr6U-|j0=qKjp03I20Ip(}K z4Pj@UK73Z!KgD%_Qn1ZVH_?07ml<2Af3KNvcu; zU|lWQAG-NxQu*4!d)q>s9oCka-u}1f$J_1qS6vkHzsmYW^vJK>`{us~by_qW8fOV) z1PJ$T;62YGW%3~|FJEqU`mQyuj9f8>jcU4Er|!LJ9j5fL##8^+h}vhr)#79GTRdMMbX<`JQ57~a{v3Sewshw^Q^7cKAlf{AJHx^JMGrI zySs(t*F^Njs^|V>+hVLTBQ`9&XwO$&p(j(nf8~CbxK$^tSMJVs71M^dHP_9Te``uI zRJq1+`5wPPc+**q-NJXHtz3j+{imIe&D$Hg&ui8M(M@R%U`Qy4`189RPBAFvoB74T~Jhul|7fi|Le@xM4vLNKWt=-y%@!Gr0!Wr z&b6@bY=;)aw-v1mJo>$KLB$GrPnG1qeV1=pY|;Ouuy6hTsnW}=RCjQFyA*#kdEL1M z6?&lkfuC4I41)Jw*>Cz|)xO4ek^8Lrp>^^qwSZ$)Q&*WD+k8sgK!Rt(iS-rn`)YRn z>DpQo@|SwoH1B%j!q*!^n--p*`=8VKcZtijiEAgVa$MAu`0<5^P{-@{``NYA)*rj)s()C< zp6PB>%#my7*YIC_ZMSNBu-~J#-p?K$`f4a)7xzhJH=F3ytdPrmXKKwkns=EV)ZcwA zF~7_7Lv_M$Ii5bbh98ZI9ye#TnLj;PdHDU?=CS5<4@o};F zv&YkJA4_QII=oAaQ-N=iLcY_cEPI~vFI%457Od?Idiym;xAf12zj~DxQJYGq7O#JJ zt#X>x%|!PLTlcCQejE07XGP+qO%C2Xm-cP`vd@#d%I$k+aYX0af<-xETGIaAYihPm z^Z8wxr`s=fXG2wc+1%>heY}cwx`s~gTAy4!Ipg;inIruY9b&Be6Au59En2lEqp$d} z;_8L(FP@wD`+2M7i}L93p9>F1*6j3bx|cd-LH6#Gi$88tvP?94w)E)ZX(z-^SnXk+ z9TISJ8rRbuZ||tAG*-{GU@Ob%V3rP7@Qjr@x%y80+7D$j_U{uiFMjE`tnkAC0cZ~T6@+kdjqgef0{o-M!IEVpS#)&I7u7xHEr zJzHHiJ?{7Gphy|*ZT~MmRq@{^?mhRAETjN{4gx#aihQ`YbZzOEq!kG{4h{|BdnFXs zEjE{4?#fusw2m>Xy!49Q^r}GTWe-HJXznaFH=cuU)Z4r_Ty9z7tG&U*k*Q2gx$5p` z7P)tqgQOz^zBuqqH=8h5jX%SB5v%sxcA1vlaV|X;zjqKlij!Sfy&iYIYU2uAv zqi$6wPov+?+`k2v-)_%xHgLP&7BM~K+$)C_7k@dMm%m;4*zw{k#%V&L=Eh9hFz<#N5}Cftj|`fG-XD-Q2rUv?{d(di=XKdlPn!I^nhn>8 z&#O3B^*`geWb#vXhK(MR+kfj$&7QBKefw}yd-As})^E3Os6D56*Wja^ZM>z^|GdAicDDE@TSBiYqY_f2CcER(4Ex@nnz z;jXzM>Dz>EMg0|6ShBG{p06_LeZ>7+QAd;Y?rK9u;^2c|Uwscuc0Xrz?c(;>`(G2# z=KH+oznW21emCs@uWN{<;zbE(r&K{^TLN+!jf;w|eDYy#a&FpU-|$tfJ2?E|$DOkc zYK}=u2&Q)LIdw3pc;AzGQ%fgJDpyqTXx$LwZTPA9Q^F*zgT77zEB=|RFPUie>GPBA zre4QF=ge=m`6;9Hc+2!8$^FwfwlA6YHzGIpiOQp$>EZ{kWE=haSrC)^HR@&EnMcd@ zq7yn|gv-;zj|SNIctU7OvW{O`WILcqI?GLmbG z=U&RqtiIEuXzyO9^5Dik_Uk7u|BiACeO0}*XJX~P==sj7x7SsinaAH~s_D?UOFtlD zMf#HUzl)#pXgV-*RWvt51)L~KW%ZkDrTX8F=VFk;N)fxdy1J++mE$FLS<#|X{p0tB zm^CytF}1X{ott>~)%C!u?-N#uFuuBb*Zc3J1##~8ui3x;`t|eG>PY>m7vk-gZTmX? z*7E$Bj`UVZPXU1-dG+3%U6G5aH?Tkm}LG#%7J6Isv@&B*!1YZb@!N%QA*_zUg3 zTGlQxxBoXQo9DcQ>&7znzZE_HEh^)9Y9;rjAo>htG*_Xw_gcl>>#`qkB8 zHFE6yG6x^(+fUuP=D>`Dn>JnR_FnK~YW>Ys36ZS-4=h+vbS!X1>J*MOALNP~%8c1c z|7R{00tL>kh0kZ*E-_~Jms($OX5N-VR;YzdENIcHUR>xo&~%K0F1O78^FeQXC#P(f z$b2#KX;Z4E>V*HF#Ve{W^5xcN?6*%!So!4CQoo0NMJ!zUryM=q11JAiKAauGXTc9% ziwsYarBMfVwe9+&2}zWpS?r-#>W)vp_5N4n{pI&gSFPk|wpzA)LcyJ||8iICSLcFv zFn|tq=mgCi9GEJy;h&WCoM7vilYF%s-#)6DV^`|OG~4&WuGE#L=k{4FUTu{&m2dHl z^Mq~v>$yAepU&Ub;rf$2SZn9V^MQ} z{rc5Uwh0>}3Vwci8uf1LpLbFw84S&h+ns)T*?>kO5tArz-Hp364@^C>wIUX=KopYm zk>^=qmCs+$B5kqtJGZY@D4Vm(y#H+BoI5yYh_b>O93Rd4nv#u@rVydBfPuBftD!Ta z_Ek~g1~fJ6_Bc2=9GLpP#TMq!2c}Fho^MR2H!*|Pi$h(6Vwy(4Z%{bzv#ds6=49!Qj=AV-Tl?pKXQI%Bmf@b=PH7x{Ck^)NjZq+}aQ22KC zW_R35;*<|4Y`h-B#n*x|d<=?jn0*d!xeYvGem{FN5vP)d>l_k$(o|$TW-?9Jk8i7* z8V-u~uSs|UN|KSSQ+sjf>C(`IAAf#=R%gh4m64L_a_f~^xL^UpzkmM>Bq}Oxo03&= zIQ~j9qnqH~ACJ=0(+?+YTu}M>S=5E?dlvrtb~`_6ZnwDpqf1M@Z>@SXO*cBMBCay` zlLRsZ`^NR(o*gCFqYF%~l@aS-VzDWqDt@R*VCuYaT#PEo6guP#PG`1mP z>8uYX2j1M0v&WfBzq&U#Cdu!(rd4|6=H~RRF^6B>H4Hezu#rE;fe%;w#DO*`h{wy+ zX0*1p-eP`pCH<>{wJk`O-jQ+~p&PJZ6%&t8c<4H@^TtxW8FzMU-0Lo?aqi5SD`8@< ztwZ^erY1S9wF=wWgJ){DLg|3QMs=^afaRW()%+ThM0u`t%PH)8HY>Z}*%`^@B_dU_ z`*39gWM)Y- zifV*Cy|mQZk1@$SbZ0kex^-B}8uDw`l`B`g<{uXZ=fMT9m;wU>1NJMPb81|zdO+dh z)k)tM+-KvJTCidThnD)rz1Y2Kb=PCNzY?IexX6K5p|rsM@siBT z%jSio%Yr3VEIZK3ExzTsx1mRjugAPNT}HOf)kn)y{rR}KHrdZPcmMwWko4Bp)^D{( zj~Sz})(@w!j_@$>HV^#%Dk z`&KbsH_hx6e4A{zr#5{HAJ@t(W1D^^e8ooNFP#bVX7>ih>$>e*sh0lfPU=f3W!Z3TNY7$(5x^a$j?W_T+ti+jafyPa}^Q^Yz;4$R`&; z%j1TA&L?6sYjcjstP^@r`nWbg9JFkMJA7g>j?iRa)d+9}#Usb@%iy#F3Sy{Z5zH&B zjBK5+4~0IF!L24Fu)*<>)}fCkSfT=|tJD!RKwcnf$&O8p0#k0&><7!j1T*d#%#Z^G zg$-!^P_kASM&;Abq9b0Iao_IGhr|5et}j$>FL-gHaE5Kxfml`UKKWbi&d2q4Sx21y zedfmY96>V~tMs?mC$&#L-v8*u$H_Zpq;Kp!+7m0kul20^=d8+{H|zFs*O*pmnccHy zJ^k*NbE}BC8_&^ohW(GvUTgF#UHkig$4cJ0Wz|pHJ#GJYyl>+_+Iv+hRv|Cvj>Owl zSK0iRHRN+k)KvdK-|TqGx6MiYGIL2PxdR|Ld&i8~K1lb4A6s7dBQ_m&jN#O50cP zOXsFXd@pxs;dkjh6kY0)vfE+H)Q$hQACjCNxUeujN2XqVn(puTKR<&cOLxp>DvfE- z?tJ}&_1PC_oPpv2#JsYr;h?oiAE3q%OCFq_Li%K|or%h5{{>YEz z)rrUL)4ViFm9Fh6HlGx(ckK53HAgj1YF$*>B`!DXhlJbLkZhLE1qFAFRF2wp>AjtO zBHi=nhEKNDcg^m)JzAMAf7mziTK%)AbFzon^Y=7Qt-dOCU+sn2134S3T$?}Tds|Xl(bKr#K`9=L^%brR6e{(sa_I`Z9ze$`1TaGh7zLjum^=re@4=IwY+^kt~ z3!+bN>&U-<^Ik#2{Q2AN-nqeX{+q;_-1vWQ&DYq?YKhlRyZJiOd`VuRTHT4fuGx7z z_}|OeH5@;`D`aAS?c%nigR;yQj>XGrAK~xRHcYwCxkk!dcB5sya@t?>P5UjwY(I!p ziKr+3=nCDm%3R?69c$)tk-Y7);m=nsdgbew@-EXP=dPgc)q-yQ#N+$?4SpR6ydz;M zmz`&-;8-{9i^utM7Mp(i^8BzAS>4v}w*Oi0RxuyT;~&@S+aGwton}*geDjP;f7D+V zuf6tsO{K_CWaUX-N|m^Z!|5FHz)J*4- zJ#f#5bD!7Ghlewx?mmcnY*6{gytd=Jyv*0FN2T9m#$O4$>r$6j z-P*sTe!J(k_s;9L8Erq{ab~6|`{PGmhxX6(v`&;=Tl((e_G8|E&w6ZIs=v+r2rt)_ z2?rkEWq&YJuKZT~Ki(Y2q{@Q1`~IKb&U5Vl?uBbibj3ejzdHXh6O%#Ji3;8A`F)RX zL>*IpSk8Pw>%GCf-&LmjtP+p;7Czo!=(dkv)#LV-*m9qsuhQkt{TCP{X5Vj6eD%%z z$b)TRjv5x_w>FyQTHlaR(NwZp^x}uvnSZ~u|6IQ!@i*_Ue2vgW3B^V?6RwwQSUddZ z+Vz}WUU&G`Z*{K*3l4jkA6)O>db>D!RQv4x&*>9-zpYWxpsg+YrJCB;YN23Nhnhdn zb1Pok-~PaT$RKgbo5@wd>^_H;g%s>QzcxGbJInUlGt;B*-_7azIKAxAXZikY?au$d zAKSe-b4t%N?%e{1T7iK3+jO>S97xE)*hc+e6(@`5dG=|4csKi(26opmMqb>WyS}va z9`oPDDigA!S6dp~vO(ohCEZAKMh!oO*VCOH%unLvJ4TD?W^$ZTN2P z?kzhrG+WNLe^}ol;^JS!{Jv-Ux6r${lMN~!t^Sd6-t*7G56U@{Yahq`WvJib$y(69 zC|cWCZQn0h9@~2dy*C;BTz9--`!oA)iJ##g7v|T6_$vI{w^2gNv#b4B`SEDuX&wxb zx8HtIRS%bQxxP%WCu{ve%PKyNlV)>%9`>>^jBYxSdn_?UJbP2}{$p#GJaYY0@@vtO ztB%gYt8a#>!WuWnydS! z%WbNwxAYA>y7BzmBfhiEGIrm$s*<{IYbCh7Z1VfPi?7Xc|F*Z8vGe%WsYipKO23#I(N<|AL9 zI2F%=)mPAtQC6@*e5sn@#o(1IujQ$3le()d_x;cQcEcUP2A}#O%KK+mO#c?Jea{!> zTZiwzlfD+rEs*WbZ2fRw=fxY_o^TlHTvOP1YyR}CwYSrr3)yTojz1Lc`02i3DTk)} zxd%?lUr+3bdr_b48L;i`gUA~>f6rDw$#h&`6A|(u>R+f#?ePMIhrBv7tIVfudD%8` z`}gAy(&HU`W^jdCPwV!$nIEhEW{3E+;v0Y7aaWYCU9v4hxPSY-pUr0Kp~o*MFdfswiN`MTdTul0MGe~fK2JrEUkTw2)v zK=}2&P4|!b9`Nq$vs4ec_vqLrrSFH3+Ez`Glt#VQRCdQc>d!LInBV_LTMy(+Td`q&as8_^2fjIP ztn@X1^Xr%WkF?)vYkVUX>~%XArL=#M-s!&6+T#3)-)b*!nR@!;Pe(WEV&mZ5vW;^3bu1VGDeCC`ZgJ-6aknSn#K`H#rvt+)L1=j^L*E;zk)Q&#->+es!KRUDn{ z)@HF2x`aPHce!jFec@a2R57=%C#?0$^YiCeRm!kgmN|bmcwP54g1_eb|F#DQrqw4+ z(hW71j|o3?cjZm+SzC=#>eFgjX2-`|Jt*)>2J2M%XiJlxoa+Y z)cjb&CGh>wocj9C^t&t_x;JOu;>xTRzO$ggoLl70!T+~{tX>?B`E=iT(@in``_=Z# zw&mzDKKeMLINP6xXY;=UsV5aJ-`yASRb8>?_Yc(^A6u^O_~1%~SVc2=t5xQYzr?Mm zdvQ5SpzQ1GUPWK)hyUGtU5@`he{b%A$k2P=AOAnZbB2MLhi|t=w{#bGm$lUNj5A?p z^OAjLnQb%uY5IRz=H+FP@t$Wdsr^5)<)`_w%(H2ij^x<)dUv>)bSz?v5olVZ!=-$i zgNONyLHGaXcV=4iFvo~RzB^Mp|N855H_unj`(CUx^SsS>%goDv(zo&ZPW(Ur&!6Y- z`dwfCxUByt;ZMS;%)+-vt{+VfkDIcOWrOCs$VvP&H=n+KwE5+~r^#{B-{+O*?a__> ze(dyp>3sW-Ju?FK89iHjQ|#%>dEe*NrtNy(`Ej!L`mV*=+K-;LT`ApR(>?q5@$6-> z68X{-_7|7=3O8O76cC#37rk1Ok%@&vK*6Dbfsu)Yuh+qyZ+G$hyG+~H&lG!at1Er{ z$NNWZ^0orqVz%>+sr_^KW6>*9cC)|b__CUO-DwO8$a-szMz}=+W3jq`FA>MFP)hCn7#3@V8pJCd!ye>>aG5{ z?TF5Xw?==9?(rwP-Tl_99rw$%rs&@1K+8`(Kd#)ipTzVic=5u#xSBWnzA5U3?fKC@ zV}333fp7;Vy#tN(KR zWB=>RtY&)!x}~F&Kb_3)TfhI?8@=!?9t%oX%3kb=x4Ie@j1-R?0u~uenk#ITV*fn- zmOnv!hwt?VTa?!QI`nvGH9SAQ{r}tbj~D;{@%G1?cKM9^vyXB8JG4J`GIxLS znJE_Pr5yYI&Ng@XzqnqmzV>VS}>;L{V z|MrV*v-sceo>vm`HNQP)KdQC=edOEKEnn{U{|o;Wa^%aw(3kx>yoS};W(&&eqU5Ik zJ#YUs{L-JDJ6>4FUf=!ZRfLXztl0E(|NUaNWkkQ5^)>o+Qk}boP4&h9Z(^2h-TY|H z|Cyr8dDe9*W;V>cIeQzw%$>MNn@qBb%=U`B|NZoN(w&A`67&D5hws;n-Trvq#I|D< zzy0m*?$h7PvA(YMdhPk6srPShJU4fFq(XoaQ|-4!^J4o?>X*-dUagXTdw1QYw|B39 zzP;(^JG+|=<~R4{+^e7J_e)Ku{%eC|D(@trx-}C8Y$(&A54uogLZweQt9W##I zmJ`V%J+0TXs$$u+WoI|;+^DL>&fD8{E@!J|-M{qwzWDe*Uw{0YpUQe*1cD zY3iMVpT8G>TfblQ|IfbU-S4;fC8#%^wEz3b?{?MwwplyA|Elk4i+(kVUXzbmKlmG5av{&0dC;q(rYQ`G8m6bB%}FmVtYiFmY{zSRJIVWg&i*{F?$4BZerm_(jj`Qva?O`Y zziBC)^YecAVS$L+dpm`5d{QF$KW>UT#jFBmGPQEa5$;u(1k=D3u z>&HKzOfn8nt(SdY>n$bx!@$4UZ=af7>C?|2k2GB^{B?72S@5i76Ys-=LADkJPnVmT{lapp`GR!}9St3>qCG4Q} zftUY*8AsYTob5JLIJatk>$S+6K8VT!WE!~E;FvP6VZslAZIv6pD!hyOnxq$fy(mfz z)ooyH4-Rl~bn>rRzFH7!KHP|J-V0XE-!Ah`{7#~s=Wf|&Yz4oWl@wI$6ngZWAa=m2 zC=P*&Ql`u9{xzlI1>X_{FXXki-u30*&@kZ#L-Q^f)F4-INT_G|_wY)0azf?*zm``m z+dUPs*RQ$j!&0@&q0)bS!zW>Mhg3Bm2n@Yi_*{BjxAipro_PIuf%ADWx20EI)qY*@ z=Yrrz^~cMP%sxI}B$0y(0wR!~6befP9vPJ~ZE;t*pmoMz!Mzj#_Iq!b=x90Cdj3M|*w z$JZ<9J(dE8Z-WEBfPm2V2Dcy=$w{iJk@-{g^cWBO ziiB5d@Iov>i!r{H4HJG$DB3NFRkq99!6PQ-?LrfX%_wCThk(Trrei90OYZzG-+b-b zwT!H+u4m7l-Po2Jz30;@?Th>C|G&7tK0YKQ#HDg)+8z7Ibc_VSA)ufTtMe&+!NP@# zW_fpJaJTIiGv)67eEGq_=HwR_7XAz^M)o2+%-(Emm{75PCEwe|$oz-9cJ0c@$+`2m z*F5*ul-HRt!NJ0*sj1aA_ZYD{`UJPcWDEVkl+QXp?#^zoh<~#tz3|#&i`knRZn|KN zvb~@v>%Ej{k#>5T?(drGYooV6V|t{cbMBbF88#m|B=|EqJ+kGLUG_IOH}`kV^EK>+ zWpUpkcbBbQP%)o%E?NYDqI$s>mX;%~x1KSx@!WVmDfO{n`ut_fmc<0@sr>w`c3+z? zNDaE%G;|pi3ny;-exQ+gvHyI#-yypco!eZzy}h?=+xG0->9+X>SRJ=uLc@d|6V4^x z2@ebuG&MD?78OZP{IntQuoCyQ_`07@&jqFL?efJMavCZDaT&{N+rt-Z+GNDWFDLW$ z>(|{n9%6jyiAANQrFk?vb`Mx%a)z`0<;`efQoMt%=%ZAy>D_EH1C_g?&lHoU%uTg|Buv%3jaz z744pOq)S37-A_)^`v0ccZ{y{(rIg)#rR0U%-@G>0|6cN!>1x(p5r5l#7V~1ZX>N0k z?2$4zJ7-fH)U)n{cx|zb>3*|WtKE)lNnXtzb3zZCItvO|%KnvqesJe_=y&G@8#fxV z@k&kMuKw)oo^r78TC@ds+vcZlR7-yvc6{D`qDtWX+W^s@#b=O9fC2^9O$|RT|NlCB zg`|~%p55aaC)WQz9ly8EzUh(g$JP0Nbn>EZZE_aO-&ySEW0PEU=f^(HK*`?1-@e9= zx6Kf+-}|vNPOEg?g!C=D`tj=fvprWu zU*7s(buli!y4^cU(c!@Yt~)iy7r*3>lYS&zUluuKy5!!k3zByKNEG}KA}{uB@9xZN z!WAzrEZn(J zA8}t-=bJY#+W+?V+^pW2|L+P4g!lCI$Niu7<6`=K(fFU2CntsMx^Ss-^W$Td(wBl# zWB&bn`SIiHWp2OAwQeUpT~vB;gWlWMFE&P-?)ZC7^!LqJt@658jeD*$|IUrPBq`u; z`S{F_XX^Jw@BjZH{aD}c#JUR-=C#FcI(`dFf3@nhrMpVUi2dEPvy-85k+4LZtwx&t zR-L>b_x4`AbStdnX|Mv*`mhB1|Cu#gx0n7~EqLOX;yJs!%h$9Qn!P!4ZEbY%;Sh$cU9p2 zk4yc@pT4{_OzSVt>)ZMLOwao>QKH$eFYgd>UiD~Auz%m{dsSIH?`7sDdD|F#F8{dr z_B?;v`qRm$S{^@ct}k3rBWt8 zn`RU~W|dvtyYb7)P($;+j%U*ZS2FuPsS-)guZ-Ni((qVL?%iaMJtfc9KNc=eJ6Tle zW1U#CXHQP(nVJGWo!8|qcS=Int|1>lIH>HamyI-?Tv+m3K^||kP z=jg}e^c}7DaV(y7@5?OCojU8H@uz&F&yF^v|ha_ zad7wiZ(H`ip4r?Uw)AS7glUq)^JmAVhaYcR8Y%y7flXS*@E;PHyi?E99A@Ajoe+WdR- zOGN0s#RAvgf6ZNEYq@5+m-K~C+?|{Jx2-}mSKe}&+PANwRo2sPOEEIFM=5Z3ZB{I; zGfofu^W~oUBiryfg)6!r)UojGXb`_HTM#6!f?UZqGOHS-JrdmMy|(Vv(G%|H)#FNi z?^HgHKiZ=oH?6udc8T1P-LF>9F4ejBTeI5n-uK7M_vc8OpN*08{o8(g>-3)6M_-2C z{QcBwIpfv0&4T$iU4`!2Uk~1)DpzUOTf6b_6`At?zt4ew4hw#; z%FWxa^RD*IO^bgk1Peot3y2(z&r($hh;Zd&T%2RpxQY*UVUe6V`n+1Q6`gg1TE+~qg5@aWUyPt4BzIazDC zz3%ru-tK3|e0L^xtbR0S@mJ-0ddZy*AGuQ)Kl0w+ZLZe4wo||Mg>Rr~!u@|Tp?^$6 z4h4xC+;LgCZBLajqP6OtTPghjqnjNL+|FuU2;!nbX? zo?tF{c3Vuv9fA8l-{n7^vr_%jP0xF(r_Kx|z(EQkiJKID* z&i`+%t|xU@X#cL$(t%+^f zdo_6Z@vrW7^5$z}#OMDwbGGoGVm0Dauo{#h-KY#rVw=Y$ea4?otOdajUR=CeeYNb}Dcv`j|NGqCdFKDR_2XaZ^5aLY zC|7*Flv;TDOnMRH$0Nml{rvMMAJchvYw`|bgLOTp*V`zTuVnSt@3x+v+qbHw|B(n+ z`oV&KlV!K8&5ht%?0@R3%)H+xf8~AYZbUmW@-1_izjsH)_2f^d?>_&z!SeRKuak4%@0)jj z+S&5&C-t#r3*2{6h+O@jVbfd*4tNCgjdbRCX+t=tt8<(1%V(0C8$XsqJ^l`OLS$1*G z3jf2NAt7$1Wq+?7i+Hpfd;8aAMckTqKO*Daly#ez{{33T z+{V-A7`ra?g~@LY0S&&!^?zRct4O^1tJ&ztkx8oFNrzfEFK*8lOP$F#%^^28mq*e_ z<@ufE{_{1owYziX{ZILRcG_mm)Xts$-|`<_TN}N2*REgOnV*}!c>aIdzpbxw+nv9Y zYxk^Ycs?xZ%zRqK5IZ`dOX+Bz4O2J{l64qbe-cGJsz}4aXOYz0isn`4W zPB-813QsG(uNG@N{l!xzr$^2=4ji>%s5G4ZR={jxG!{cNEEyF)D&~Cp^y$;0n&4D1 zf%H^kEXouDs+cAnbiVWK&<$svcV*Zt6cM>Fd51#(Tx@azFYYoqJ-T;yUzR&c2tw61 zHZeIpYO*O4LMm3^>K2r9b97dh|6V1F-1LX%R4y)#PVP@PJmKn*7>)OI6;$5ceY+Z~ zg9S7+6jbz1B&%aJw`#jX<@ZlMImfqxt(CMIvrXP#4pl-gAb8Yb*uH=Ct|Tp~V5 z;0_55m3xZ|$zP*)x`c$saX zet$6+)Uj@P8`Z;D81`3Z%ehl&N)T(|z6UYD-A2&B&06-t>#M|zZ|<6Q*$8AYsNP0S zVC-QI9yJNJvAxKG&?sPJvh{NCxU+bccOr6^1a4hH0&B|=_G_1~f^0+zVu(E#7PGV* zv0b%OWExhZhpNS=_}@H@c^kmF=hG?eiM7AJP5msdRs0 zU7Qpl==}K1N#*3{@nxI;o=$d6KC;5|aq^=HoAko(%|2=yTc5w~p#-?R4Vc3ubnH>i z^t;nmEnTX5ZC$LicKEuUTeogS?5!%zxxFoS`|;b3NYT=GSaAaDk@^4D-#>EtYxJW> z#(gKxZvL9{d!PU8N8$H(SpIu+Y-Zu*GwF}6vCr>}em6&0{`af?N5ABCI;Q+yw$dsPMVnW-nT~ za^>cpvuDrlykIeVHYg-vZV%95isXMZYa#Pv_W3*2?25i-7k$1{b!%UKaQ2x$@8=)& z^^R83ay#z6zTW%Ki_P!5*8h3wX{Z&O@p8}2!pC!XGglhv)&KwU<40-mVy*J#Z4o;& zVola~|JJ(oKEiZIZQRCU^T*$0tAEV2w*Ts|?#|)DGGT=azggPC`MYlV>vl_DlApzL zbnp7ws~Tk=d1bU*wKrs5UUs7C(Ys)?H!iicwO6iODY>6I7de%;yC!75JzaRURo%TZ zvikm#oVt%Mj~~n3Jn!D}Pg~YR3B=b~u^uth+4t$E_Twvk2g-l!6hE?kmGZr^%ZFxE zUcdbDVe$FStLJUyzng47c2nK0=Kt*dozd4*w`X&opPC#F0I+YUFng93G!kBV@jAAN56E>BeNl zf4uI)iBtr<$YqN3-`zO%Z`q2lZTr^SelS}THGB856~)WS*pB?{=9^XHcxK1P^-0H` z>vuR_l=7Y*C0hJHLjJ7o+KInzlzh?Xi`c!=&@3#!XA<#mxYx~xZ-FaOiLD8xN4QlkFz&ik%<{rBpos4}rsEj$n% zS6o!{A@}+5!=JxuylXuh{VDX;dHtJH_S{Zn)c7)Km(y=P@5H-P5Rub3N%Y5Q{kyYP z|K_hZHs9p`UGw(;x%GA7-_P!jSznu1n)mw^?``LMOE=ev|2ND}=6O5+uh(rMUubXa z#eMs=%fh#PSuG(f|MSZ3)}h!pxrUv^gVy?-8^_b?)$rn_a|@O5G^fyZ2wp3U0#*lySlupJ>Mgk15@nO znD$13Ix?R9kM7+$wKURPv5-IOdm}UZv1z(H&Gp`dyvmu6GFx<1;lrUPPNw*Xce!KX$&;BU}EA zjfa=65m30G%(`iTg>=w!^J1~1{_ks*?iC-EwB01f<-1^Y!$Y-QSt37+Qd3iTB#ly* z2cW^}qgS+(KUN^xa*+xZn&O$*b_&KwcfKfQO4UJ(By zS@vxi>r1a~ta!it4Qu87e*T)`v^yrnl_p>1<*vsW<%us3KllC~@6o;E^LiimO9_UTe$jcCSsD<>beHvu$~(QFme;+#y&Dq`w`Jt! zo^3s%?AFtfdwZMfw?n)Bz5E?=^V{^eD$Vdu3!U4!db&68iXsJe<6q$wb1G`)$a6nl z_^Y+>@|xsFkHxorzjn56X6>tg>PqGkuKP}Z$jdX_@Hn;nc6qsHk8{a{CWyf|{nQw8)wy8M3d8hWAQYSOJ)=q}TdwLV(`ztQp znDygQ`#q6R=5KG$2kyP={$PU$?W; z+1a^jcUpA1?zQ#t@=u>W4Gi3P`9Jq7n`2BULEqzW^TZGP_x5UXzwUiD{4Bn|ul2Lq zk*C61Nl!Ot)~0$_o0d(!xMZJcW>&}hn(x~S&s~{p-9CTE*WLDgyLT~|m~1_=RlX{j z=WK4Y;QycdiytkzsQYpCZLwvWFN?}mS)}>wT=KbR_WsIjlNeLeRdF>|d39>q&Y^Qk zx8#?XF-0m|@MdK>vUf{jsJ42-j!va|0kiyjcO(U#chCB&aIQ+o+|=}~fWY(b=?6C= z1wJEFyZ3_^7h9{ZzRRrtUc`^+dx@u!(D#a;h1U1-D$GA}$9-Pc`lSsOrzal1-M%>^ zO8)=Xh}d^gkqS0%Pjp1*&lWa6f4c7bs-FEj{`o%&S>O5cgQ4;TYgW0ss>(Yb_EtOd zKe~5wUzX^_bbWzca+BlV*`04cd-L16`8n0!zy8^lvv0Tmx7c|(@n-M$&G}k)?)~X$ zpO2T!f8IZHlG9aiw`vOO?%!5xBR8vwbG$!YS^N82@5bcg?@nv(Oy0au8+qDo$~K2@ zzDH9}PdmEAb8?r!B2%+9_l0_O*9OkJciO1t!8$jkx~WI=a{G9{_6mwl4V)Xhf2-lO ztJ~eKPH+sI`S;pQL(^;deQno7B>BB>f0jPWDez(|Q~b}1e?J~t^_4xfqf^y;+L0Dc zVWrc>KJ5Mrwrw*r@5z2Pr`CJ_nl(D+=cjGsyDlT zRsDCB=f4?$it23ZYySPo*|+<=cI>y*(?9*oYU(WQ{bv_lKl$wDwwzaX?|12zJA9XK zoBcvBDCPCd0^#3Qsr&`sKFUw8omy;zlw6PMLc3K;(=fVK&Cx>P>JAG!SpNOHEAEZqiIrc;`Dt=roYIEXwdi~ZL^E2zu-=1G>*^a0VAa-1s4enuCJ?8AF zE|#8Nb@xlM{wMVXn~LuLH=Dcnir#CZd~B`kh69j3o7I`$t5>aBw5R61bxr!i4-*uf z`HENGori9VLjyzOJf#iaUncvn4Aj?7cXf5`k+Ze>{%KdvoQF=qW^5a$pBEL{)Q?Ty zJ0_<`@0473>HX2Y)E1}%ZU92cP*_XJHs(Nqu?r>CIu?ji4rA5Z~Eu)r*+FlBOj6u$U*3>IryIKC7xDi-qRI~-MqsYmXz9at?W zAhch~_Boc$jDo|0c2GyIf>{gPD?;y_u*CH?O!#s2h2?ZCLBhyn8?#_f`}FvaNG%fu zhX)EAI+2^6D8yV(} zo_lIl=0(sfb>ihOZ*QC5x^;{1q3rj6VQ4eoFD@_l|ML2}{`ZC87IwRv!tea`od+I@ z2nfkL{r&XmQ$}W{=B@=6+#Q=Y%|s6D39O=rxXv?z!&gI>@#F)=y!^yBifrZ9*us{J zOCou}aOyudOxRJreLZRi8Wy(;K>g-X&$4g~$&r!Km<8u)1&7gO466o);sD=BPsR!J zS;Ma8c3s=Ht=8^5C!{sta9%{?{mi3bStwPMMFdm*zt;IK|37WAC_J>n;^_>-kGG8b zyDyqHe}7bV*6{hd`^V>$t~GpiW%J`#E3e8v-;%$-{_cVuzg`t5CmoH8dBq^V=@EbN zqvzb_?*Hqo<0_&*FWB*lVfxC#tBZF0>{AUi{(5G|uQL;^?_H1rXDtmUM#Vxwvo0m% z;nxQRTyyIFO#Jxd(XEOd7AfBs#y(Z647pC6SzH+N5a($-^-EYBam`}O69%GZx> z=*J0PW=mVXC4YWoyyW!#%B@GLcbqzSL2m21zc zd6S$T#ooCDS(6Zu!sPTwDO=zu(r919frny09(~R4S@vw&kH?!#4PSSv7Cv|8etc~H zA3M-Q-@k{mx|2^VICWQSWBva>>)L)i`YwLN-`+xXQ@qXX?bF@2_wD)F%>Qdo{Qf@c zaGvgL{n-McvgLQK#Rx7w#dqdybX4@>J!^Edv~KVAdj9Dnb8%)k#CG;j2alS7%Gf!u z>J!wiv-N*)uKl0HV|V`U$?Cm*E06c~cKgj2iU0ZW@5d8O;*VBm{`e!a$Hs|&~nDgUyxliY*)X$HU&Fy6kpZ)mp ziT!-h!$&@w|Vpq2HPtBKCidt$#dk*QpB}4G)R5beq_JDHvZ1EtE#OR!hJ0rR(?LWbW1DPuQDQx`s=JU*64YGybMXA z42|=&KfK?5u517Q@3$Yn^8c#-b(OujtT@8D=Vv7P6-wXa83nIHiAOXXDr2jbCQAeyot%w&-K) z^WV61|5gPjN0}VEyZvm3{+XK_ zet*iXGOVjOpZsz4o8s$pW_&Cud-Lqa!|8cvS&xJsZa=Q79&+^6)YFfW=kL}PGZ)p% z_s;41|L0KbT*i+-lV?BPW^$zs()azM!l+p2pQW3s3M*O_92yQN3jEk@U+X)k{L_yc zx2_0*yKrAkuDD!n`1f(6$rYFRc7pf+T|K;URbKGHNq>%(PCqKWDNuaYw4?vciz8j8 zf4`?&_u}LUH+H$wPcuJWwBM^?S8~>KXSS)0t-jc{zHV*56Z^j066&{!7C&#dS#7)i z?~M;`UfuX;rs&SEf$4K3+_#mzxphtAZ(DEY_Wh=@?{9fOihaz*lXY>6UEa>mA9rZ} z{_}0+k6U}DFD|_KXNT(a*L>aktN%YOtX);V?v3WXed!;cX@uNU7t`&!9W+74&?fKC zAM3}P>#KchJ~k!FvKlLc{c7tB>eVcsJ7p3$?x8(|cAp1dU$U0oOuzWawD55G``-IY z<{e%xV{D~o{rX46<)7+DWjBi-d;f2P1!zoax9;U_s}?`{wckeb-M?ptDqd`x`7z-6 z#NLlr{^%(6Mg09D|A_hJ<~r1Q^D8av42xaw%zgdQ+Dgx2ozA}> zKTaFI{9^oQ*>|6ggI`xaeiv^qu-#^}-M&BFt%djQ&lB8Tvp0^bSiOIBr{mnGp3S~n zN=iJ}%@8oJ{kOF+q%wNXkK^f&JEw0uGDBGX$bq`gWzqKxnXRfq)<+BLFFoz!b69Zy z4hwm!@|~To;MykO2&l}>lW~P42S{!|@KE3c)5B6}^XGYgXYSu&b8cQyiH%KtJQK#p1p-H%lGn#8yRnFPYd|K7&oRJSj%#{E;&zCdc;Q z`;!o3v`sV5*EuESZ@azK*B*{n?8PrsG3NbUdFWA$ z!<;y~???ONC%An(yKK{pX}p#bXSW?+nS5%|rx%=t8K`g zB5QtD@9&SEZgy;ivVVvFe#82__mTT^fc|VOk+%@$024UH&cjGv`!7;qRgY}X& z`!|bHTebanYUlCK-uyP!{^qxLuYcy=tSO)WCjLE^fwWJjwAa@d$)=->)HE&<%IM?$ zy7G5^<^L6O5f4&}t2K(fgNsc}a=Yt9ry8zM`hB(F|MFwHvlknd`mK{P(kT1)DtFGx)W9Jax_@s`QIKNA$47v=wA^O^re?AoSHo9@^|pR>C; zW&Uy6o1R}J?{>Qo49VW9edI$8HuPn1Imqg2$_^klYTHV`O4!IWiBcILDL? z4HI^>NXK7=3<9AkQc(HE1FcFBW`Uf&poO*Ni0Yjmt58>Uz!WKNOb3SnNGS?KRYyTZ z@8Pj<B%rGNRf?FezQL&KIeBUbMr2=q+9X#GhA_5R8iX1q(IXb;}d<;dI zbcEaBlyn{x{RsPEUL`;3o~p)_qsClgEXSJo{dMBexuE>k*sN-hb7MnuY36m+4dF~q zkM<@N2_Of$m%BqmpjGbLWnfn-2pimKc@Fm|3S+njoVh(u+(_B^8{V zF{9?xl^F&}2jZrt9Gi;p=yj8`miAPR(8uy-(>{ z&dY0l>8D%pUvN4(kH)BS8n(Jz8(4hZtc}_d%WxE z#a`M&TCd`b=r!nsR+ zPA*u#Zuu$Xes;rwdt6ht%HJ@&T^Dw1LT>imeMc`jimjMYQWj&ETk<@1R+z2e_VZCP z`fKk?39ky;zy69sZF$y;bBC+19lDlUc>j*5VbLwo!iyKruDt&1@WySa8FPw$oiu#< z)N*6O#WfK|A9D>?t}58-HvjLoir+I&s#>p!-+yKH4x3X}Jw;)ess6UlijIeV>94zK zdh6DrwfXmD&wE~fJ$>EXeb!$?{C@j_22D>gIX#+pr|J}P(cRdrd11RP%j-R^-xYLt z?G5X{&578O7W{5P*Q>(9Z>-OcykM+Ne*5QlQr_VXi$#frI`=0WJ=L82DROf1?MIax zRkp_oPF}WGjW;@Q?zgQ+SGo2dasC{>h5Z7v`>~zkaT4ylC)a&;u-UW8v~8N{ky*TN z|JrA(`F3CTIo&4Y!K{}PA=ZCpruf#`w-&$ddiBxp@1)Jj=3Z{Wu~KHqWjZTQpVRIx zJl@;gt3CVi8grliSyNt`Ue)cqx%s(UUU|yXnQ>nZXN2&q_f(CY^J;VVN{8wc=iogS z^<`%wx2TmrIxz8ZlEdNChQHpNezZhTboY)M3-5n$9v z>YwSZmWz^m+h6QEr}X8~w+Cx4->UfXoqzfBeSddKTi1o;czn0`cS$=)_J~33>;p!O zOh=U;_{Sc-EanAi>O!ij#zlfBtm5)&9^Q=Dlv1b@H>Y;mkxA*{&zQD<^PB1W@kmc~ zki#BTHD6ovW%Er{f8|FAZhkjIv^00+_K(}vZp=KoD8jU$D5m0Lq~W%tV4bQr8~eV# zG+b%b``W6!Y)w|@jSVmU&6vvcC~)%fqpjk8-5WQmJv*~w|7R=T*{_m(U%#;U{-`_o zR-tL&^kdy~4Y!+3EpX=gDA#@KnqlVsrG<%H3zH9jn(_C^sxA51XXX~hb9I~!`cPgN zW0704XG=w8&aF*~MT?D1bh;(KpY7!hJ%02{w|-CXvG4v*Jr90cWy|YQkTHA3%ctT& z(mI*n<8AEU?auZyncCYc-2cYTF8|@T2)ZF$3vq?$bsbMw2d@Berw=Ka?~bs2eKH~t>quhBu7+}m?sZ)=;P zc-?*e!^ugnrWC&Xvq{4K=@g0hy~z^$Uh(huW&F78%kggR$Ctd%_ZGgCj5SD4+*M_k z>R*|CG>L`W6i78%yriH z>SnH(_H}PY!~~g%@+=%*v>59Ty$U_M(g<9?LrZuI1ExrqZHYgdX6&}9-}~)?PPFt4 zJKfUr#~w|&-aGf(t}DN{{r&wvx&MW@{p^n}Hv6-(W#(Gv#>CkDU2@{lnN!K)?r)nm z&6sy>^S;A}m-qFneqZ17?Ao%3pEjP0rfTBt1KToQY}ed0$z;p2hm5bnk4&2K z-EY>ss#ASu4;>UNjLddEQ?W=<{QugjG)JlYvV=L+&o~WrN@uLIOpUs-*5l#5&-zEV zTok_avAzBj@5BjC?|0soUbr|QI?1`#J0yLAZ1BTxHzZQMgY$1ry!`0W%E?9PJv(e3 zO)s~ZX1|x?S?yvS)8N<7OgCDTmdV-w-4YY+mYm#`#eVF_#lJ~cg`<-myf|gMEw?)L z(gdNW&PkV^bbkEOwAC>0(-Vo=^X7+YZx7%4>cvXK(mNk4^4?6yxV201S9*U%Wt~Qs z)A?B6Ez9nTK3;zO%j9Fv^eQebu|GCTHG1*Rhf5>o&D;I)d7RX8nW?rv7eD50j(#lu zUH4X9GN`kKV^ozp$D386{^8WZZ!h%r>PKf?HelF%yZhR-)(p)(*1JwKY!ubZeLLsU zzfJ$|P9@+h`H<{#Rq#S<#Y`Jp3 zw0!aPHD3DHtc`mmqviYW{q2^GGnm$T<1Fv%%jX*lpPYF6R6b(vDFJC~y~(OgvxEAd zT3cPSPLqBW))Mnhxu(L3jJAWnDDk~#{SF% zDX$b4lk2*^zqz*NmbLb2_NveEU3)Y7%{F_kow+wB9NJp^u2(&6yM2$S^&9;!cjk(% zUAad2SZdST;Ouvedfn50z1gYVZK(X&ze-BF@|RX(@uW zz(EDwf*UMWOxw;Sm9p%X-MppJd(W0-n#Z11y;^qFq~zeYf5+ygKNTx_o?~D5``ne= zpF2t}Ei+6%di&h$3;S$)MR%uM)g5hzt*O6i~g=^TQdK2^3z?*B<>29n6Ig|%suTjjU6$oX&Oa*=$vge$$J@Uv?LXeo)Xd4f zU3~l9BEOw+H?4El_uDUd=yol{zfXJJ3?b)Jzuo>Ws!lp~=#S&>`gd)r|ECwVZ)Lym z(|A*5<<$*eiYu?I&F@+R$i?o_lG=9d z_@?9XJv+I@jx5{uCj8o)yzEE+*q^z_9=;Ya`V{;XrO>@>52K5oCVbi(fV z`!9C4Z@arNYNy;j-;IBE-pa^$`N?FP>Gt+FFF$5w=XLG6^6&e3f9IklhOO80&-UH^ zTYP=#`#*f!Plf&Blbl@rPVD)--M=z!Ojz@N?*7Y#W&#Qh3vRG{QPJBb7AS|@Wff_3 z5S#ecWa<0o>3ef-FTT0T;(h7mU;`WLXXp3n7a2y}d|>hPl6O+cFW=%&u}!>dybe2- z%q-iL@&Cp2ZN2lV0_SY9jD6f0xzT2N?6jjhR!%=w==^Kh>n-K>dbf9IyxYC|ulDcM ztCJsX`mE;adViwf&a_aSDy3f4Idj7Ug_AFzKADw0zr+4YoaFPpFCSI>xEJ~H$lvcv z=B5VP?$9yI$&yc6_rN*=8B0|?tEG#V=T1+OUw1U-{qW-G+Qlvd9J38zy0l2uI=tVyOox0J=e4IbNccO8&lu2HzXpa>xy0u z5mb-;cTM8YkvB7p|8Mko|MK;k_^&%weth=1@AZqPwo4Lje|vo^*Mc|Hs45{+$Ny_w zw7u=Q)4VowUftQQ=4YLnbH}_s@J_M&x0p~D-&Y6kY)SLAF{uxobKkz$bN!y%M~k;F zt}cr?weI)w|EW)ermeDgUi$plw%^Z|JkN7W=}(Px&06~Bht|%;e-#`W96oY>x!J7* z9UFT;aZc|0UnjSf$DhwX{cQK|l>g^ae{ZV%{`8IgZp_^~$m_@i6bb}bqGrts3WyXF z72P={XaD;P*Dg(oOPSu9CHl59de@~@JGUQSGu8cg^!hooHtj5#zo{;8VjJ5FtF7~= z@2`)xT4ULIp7-Mq<@0W5r)*AgDy`o6>e+qa@48vN-1mR|ikWb?uJ_yHWbx~7tNQ0{ z*;8D-k8kgHa}jzym0yF!>uBrs=>Q+?h2iKxpUPT2?1-9 zO7GY+cUNz_+s(Cgt4nazi%;ic(!~E>`h5MV;OWYD$3I`Ji*x;zd~DT@&*Gbtj(jm! zf1M zDe5R)KoQf^Sf{(;!9Vvs)eLz3EjlauTib?ZxtcmX5*ud!ep3;5UnDGjvH0@)i(iKw zN&dd3*JQo-a)OSkk)VRZf(X`Ke?LdBIT`}ls16%k(r|4|6kdL;konhJi=3lz zjyxTi;rlGJ#PoWet~NV%%p~C8lg!IWrvZ~>s znpOLP8&8!du&#tmoih2GN-1=s+8Kf*y@JEZKZ?rU1Fi4$bD|&lHU2y3t&RNKjn`?-al2h+u!~8+5M-qz8$Y&I?*Sr?ssJG&y-$1y9w~Tqp!2T^Uopsee3}*yo}%gnmnd4M6VIgHqT5Zte`B{U7?@ug2O;c9?wQ zKK5DVxCn>IKU(W+;<3+0&pPrC`-*@MhnQv^(f{-KH};hT7gWBPV>IPKE^ibUyP#6{ zQ2u^6_N4@B8}}p6JR=gyo(&CZAG!bk*oS>Bfl23IUQj?_`0_z3t4U}4kK^C5FD6*v z`6eH06fuoP;b;_&=0dc*F`5fU3)0bo6s?9DE_LAt?|h;E&tIyaNtZoa9`}7M*41|f z-44|~bFUk_|J?d+dF+25-$x1SlG*R-D8)>wo<*Ht7sMqwuDotaLu#vqoecptb@yn0F`@Tsa-{d!Bn~_`3Rc-`veR zuj||1uVdeE`mAvhdNT-I`~R85T4sA8Hm~mZoBA6+PN;pn*e(B5{_mvE`;OSx{QGr% z|G8Q2^B-fJHVi81^i@90UtaiYm-~D#o88|lO6~{ld;jsnA3@(oi`MFYy{CWi^WOc% z^Nb&V-TD9DbNl~4=U-o93U(#jxlo24=bxwg^`7w`@AGG+`EM$GF5~%U-bQQt_x0!R z-k)1rHu=X*{d@X%tF7z5tD1FJzKgH_ef$2u%m1x=edmf`HL*^>!~SFW{@-`)=bHWd z`eo+dWAa(%o!<=K+is7$`g!-CS=AMP*Qgcl|8iKr$jaiq#jj7V|E`UG9{D|g|Np=5 z|3AIH|KC^pe;@nneV+fff3|D}IH=HDOrj_Lm%N?-@5}P~e`oXSKKIxEI4u9~>6HK5 z-__2%9+z_6`zHVCt$MG&_od(Y$p8Os+x8izz2%?JsGd{zeQ|7N{njVD=kJ_vztae{b~o^2hDf#_IPCA3r;TE!yws z8%Qte{r~IftTp|1Kl|NwPybc3DR1A-GbdC3?O%TWzg6w0ctP{~dw2S+oBx0Rm9)Fh zzr3+}zOE){`?-~GtIz*^=65^(yY%~KGrj*D_L%%N-}G0io@r3@WXsZ-&u9ELzIXM{ z``}Oi=h$sF+|&JePR*?tyVm^lS@+Mb^t4-C{OC?Tdcc6(_@S=RB+&Yn`kc>i_|NTl zZgl=w_OHz9*8Kx!}__|2NuzwYB4;rDixMZZe6 zU-?#ZZp*&H?^f#j`=Y-;yZgCsp8c))TaEW^ubcO`{kvJ`{@ridT;smodsdKG^!Hcl z?&~|(U-&xb_K&xppWo~GJ;$uW`g@)+wuCibe}Y_``(w-Va`$^~E4;J$URF47V$HFO z|8%Q2s};JxKUa0^?*A`8FRB&B?K^wTTmSB^bM9NMdltuh`uk+xvEp~dX?eZ+bA5B& zq>seT-~11GlM5_~J=hHOjC}38T!HuRUVh(Oy8i3j;&=Bh8qZxncmLLRyQ}4Lh3d;s zT8q8*PQQD8&$gXr%XXieV|ac0vA_D=*MHsnUiR_j{6CCecb=VztyKCE)A)_)^Oa-8 zaldO~&$E5(+5P|C&i9wAS6wQ7))%W+y?NQz`DXPYlP%(31tpi>)jwx*Ip$eUsco@w z-0Npm$9^`y_$5SB zV)L%W+|JK^cmL?g(ldXbU8}rSoAc-&)???-T%at?HiYI-61x<;yK`r&WqR7>?O)HHwH8kQ!moT^nfK9}+cI{oY}k^7yv_tWP?Fewe)`V8dyZL} zf1kZyb^En9*FOI{BDwbV(X*-NW^8?a#`5~!XLc!dX_GDDQ*!6LEBc$1ox4B5@mXDw z+;U7e|>l66Qf<_akc;7=dFKU_3gLt^Q&uK{?og@clWb&)6UOM+f7`8w_hvU z`>u4Z{*?;z=R0@T6#e|z_igj_i~oOiTvOj~)>eG}&yuohPbzQDPo6&eH`YpH9ru#+ zX2;*WRlOgV@XUMuoYU#oOtwEuKfClt$=&krYqu8L7rJGiTmAmO?Je&*+1+=dic9~l zQTzDLvGU;7Osm(={z;Y3wVdB$d45OrTH9Hlm7mvcn!ls>;WhK}Tfd?%FZ-}g^3LvG zveog|cP=;WZnIRC2UZ{xhbXXa|3 zd%v}N_U|b_C4C>&oV+O!8^1^6?wVg6b-VKHQ}#0%lg(b66<+_bw&2b4 zb3HdD&dt1Y)&HCEue@I4^WW!}r<{k@Q5?vH+yleLZ-0t*+3vYJ=gvj-@+X)7uDgEc z&is#Svg_vhU$5W0zwlYlm9#HDkGDVh+{x=UO(5k|94OPQ z&Q-d7o_qc88sn;Gdp_x-SPTt}ey%0@+xwmwt)G8IZMxipJFlzGxfh-|((fyU*^?{22mLh47A|@At}}S{#L8nk_wTe^ZuaA^e$Df^$8Vn3JnJ#5 zt6ui}`ro?cS5lws>v^*K`i|o7#^*2onkkHJl%`<6!|#&MDaCI&%lv#FfBV15Z_fEU zudCk0p8ERc<*fDJzq~WuzB>18-n^aJh41Di$DZHY{jqx1k=I8nJ7a@Oo~756>@%Hd zY_$Gk-rShFJ$sy=nYC_?`|h`L{qMEe>&nyTZr;1T@cr!9*V5)Gn_|uP@5N`-?!I>| z=2_jQ>lJfvbNKl_zOtsU*mnNknXh;K-fek4W8cR-zdTvX>xPe?&9k!K>}eCPqi;8R z<<0E8V}G0G?!NvrXy5ncYW7~UxAjhbANMZXct>$j?xS@(?@YXCeZBJTYpc&Pd+VPa z!4~m%^bM+8ZSTfZH}3v=XZG2<$7ZI_`L%Oi;rCB}j_uvQbDi<}o$Jn9KetX>m!6h) ztayL7F_Z55Ob8JbUvDx^Y)y}%Kb$buKQO)yxY`OkpjQrgA&yne0 zERF4MW&1wsi7Y=?^I(6!N$2OLelz>(ZN>Yd9$T(2yyiatPeA4TH|qbcc1-qPclJSP z?X6$GVt>swGLQQ{JKy(ucI-9D;{S6#;;?(k|LYfb6o2acJ@d6$)#U6syN-Q7=l=c6 zP50t+rRzV=xo+{=-ECgs^@=5)H7^+}8*fU?eSPfpoZr`Cu1U@;pZ}+z*6-WyygADX z+&;;!e6PN9-u<&@&+a<5cd@B^@hhxF&OH4Ib_vJw{MOCCvW3&;@f-8{(|2Z7=Jl4p ze)8+&XW{fUpY^WK+Bw}K`Q2RO_dmYx^?kI*XZDi*J#PDb-eugeer{EsZd?2_u}F{i z;gikpURZBc`}}8pXYln|cjv^sJG1B5=6%1HZ(9Fd^<75p^)x0dkuE2kkzX(`Pp{bi zX8xYpx82Xo`MbDs`}LS}Ut;E8{F?dt_2=|CyS!iP-wt1X&zQS>=gxY=y8OvIraxD` zC6K#k_U}zAV;|2uKlkSB=h3(Stnt*dcXfiMvpWhvGFMfCK=9~9+H}gSh_8itC z?jpvn{?lXB_dDs8W#F%4uvTeRceGaqvmwDFX zuDso9&zkp>KYz--^ekt8#p5@!Pd_EE`M>+{O8+|9*Y&n@{@QInpJBZ7^|@S;=V#WO zth19ewoBjlwse0b*0xta_nEdAJ;jf2dCz(Mjdyai^xoL=d8Q}N)_k9Je$K_xZ^l(= z$8Nr^dwg!?>kQxP^NqkQm}R|J>Nc*KJ-_&I-NQAXPrisdczKPl-fPME)8hX>R}p$1 z`Pru^_WNEV^K)}^xyO_g)p=h|LfWGQX%z|31U_){$cU?^`tQ?D(Ad`gPoUkKAK>%8%WhUHqu;-sP<`v9)wg zGrhbn+xxE6FZR*8^gD7%#j)vr>pn}JFU^WFfBtOtYvZ!dFT2*izw!53S#iZ0g>=dppl%-(6aIK5kXz?cK{gYrbv@oFE<{z2vOy-k4XLum6p_ zAG4r3zbJC~&e=N`zrLn=-y(g}{Eza>{Xa#fzxym?Ue9&^(KDm;lDie>I<2GbV-J|) zEVq>BET295vsC)sm|q>S=Xd_RGq>h?ao(N3Yi7T`V|~5!{oA@{vFm={wGOZSz5V&V z)OiB7yFKSj&q*#h=Dz;ctTV>vWY0d$3Ala7*G_rowbHqki?^;knGyTR^8T@cZ`aZa zv!dr)F5Y?W?AvEgtg7~9V-1jg&Mo>D{^r|fPkybQE_HtA**iP$$2`BXzVO=FwV&Vp zd-iM2xs&Gqgyj6z?%n$D!=lp1H+>&{{kN}R*3zFsbEB_+wffFoKJPorUf+91B(sAp zcHWs;GwZ-w`_}mT3xCfvzNK@n>bs}!=ic(-BH6vWaXH~kTw;Dk-Z^8x*lX_dcivCS z&)%KKU$jp8{H=Ref4xhMdmX*|obBdkoBwV2I8UuG?#DH?jO^=`bsL$UoV&)lp7-9P zw7uQMdGEf?d-lw#@OrQDaBi6Q{Mb|cZ~M;Dd8Y1#=Vji?Kf8ZfW#05>thYRJ z_vvqacKz?V;OoXGSvUILmfWtk^WNRR=XU?Eve;Vd_V`St+x5NHJA2k`o_}%Iv0}eD z7jJ!jb-eU5)&et6IAi|0tM0F#8K1A1=gn`p*mUOP*{@CC)tyhvTlf6A)y|%0X?J!{ z&c0*0vuB?D`h8c|R%ge)em`seRh4=CXS>(-UV3w0{9N7jUhC!C3bQ9=%iJ(4yv=jY z>gSx(C-$tHe7m;j{jB_VTfUaAFMQTB=j4l;xW7B{?)f0~NMLQI1H~-2wBO{$miz51 zd}f-LckZQn+L@R~Ps(>*OP^*vp#|MTXXv;Si5ORqow{h_#R|F`@q@sc|T3h*=91S-&e~oUVbI~%)7VGuBgtR zxZ5b|dWHG1zRx?8{clRu z>C*hUpW_wE&+L7&>D`RNqSw1hu_l9g$`|4i@?Y-)H5P7OEzLh?JH7Jyi@86|YOe1p z-MhQ~nNYgP^&h%FRqyX8KA&Ry_}zU|`^BC$Uk>bvkzQ7Nan0=bV)yTFJ~ieow)h?S z{N1@)x7o*U&OU!{t-or%>D|+F4A0LseqO)({;YRrYp{2M=c!+~my~DIwfp*COZ9il zOXtp>U;Itav_7~xxBi~_(5{>LHshm4)vs&<${H73%cjJowJ~?~6!mMHU{g`XL)$cCd z`8?A&syZ(Azxmhc$F}~JKWBGI<=?|esuQPYD3|pH&)PfFUvKeF%lYMc|8J)iu9Eux z^Yi~L>w53ME1g^1`#kQG&WY>XS>Z`OP#N@HU6I0`&_oyxcteyo_nCq>A$nKxpiTaE%a@r7rn0ferWBiV7k#E;m{FMWKiY~Ih}t3U6*Nni8X^0%&ic3Jh=ySDbXRL*gq zS9`gX{rs)Ei}T*zJ7a!s?#kJ(f6jSwSt9T3uXw?9`|7`Q4y`XYy}lDv`v2QwwSM;d zJKw!>A77h|%@IFr8gI_e-gB;U_LEufcNKrX_Se+@`r6ppM|aPfIs1IhoSlomm*xGt zRg?esc5P;XomE--^*b@^KkhnLt#ZBQ@!eh3pU(uwW?P-#y!*}`_205*)9>ym&VF|9 zOeZ$WD&`$nCwVL8xlQh|;=47^>Nd^4_;pR>=i>EWchAZ$wViC4eDCVl+sCHwJ@z{8 zb8Xyp^Rv6vp8K-z7kPW`{GFcSly$=EUtcr1KdaRC^|ifsckQgq>)pLC)$gp;GvjNv z+1Q$%^Yja@h|K+Y%)R)YR(0|Ik9Tfg-LkIwb(O9C^+J@3wzzJG6B@@{Wz`nly_@1Bp9+?=;A zeb2m^)i}EO!Z*I&d*)lb|D)CWSHYWCM}J;>Quc24yNueE+p1?8R~@hX`gniswSH^= z6I*`%d=cvY{Q94m_m39Gd@lC0xnBAGS>LC>b!%s*@49|xY2`JucgDNteO|gZQXOmJ z-E?57+e_W*wUN*5On>gYZt?r|y)#?$*3Nt#dEcV=Sk(19x1UY_3l7rub?;}*zj)-% z-9laS@6zSx#53mXEc|S|{n+MZh0iO`&w3sA{7t#Z^~$sIYiFBd>%4w2WXdl7lCk&M zXS1_scYfTp|Jm+&pQXz0?%wt8&YwB@M_C+s$DW^MpML1BZT7oMyQ=3F z*FL^G=Z@a~dD&-Y&3`TV{?+rkN0w=S&zSGqcHatXOJq9hI#Z|qZ|Qa7@u${S$Hvdv zT%NiAe$iUbeLGF#&X?4Nn15e??0i;|+}+L3^w;jbZmGZjSnT=AW83G%|q}x94DOh4zcj=)G$5_R_Cudm}Gf6hHpi^X%C_J@fNtc5F2Ub%fqt%Xgi<>skIh z`(OWe%PugJnLHdyz?1( zj^FzF+}ZTJb)V0i-DNuO>+5@K%io+kiL$vET2_A8dmwP}meA|pg3Ys~%HP>;&b#~C zs`&BZU)jGu$2{t(d^YFi^S-R=XX}1OP5!*@^ga>!yE{+EpDx{BENA$5UHQ&;XDthl zt(pI^^826nXU_jvk@oB;a-j&T9BS4b(B-`r>wB;0S-Q>lS?~AUp1t#kA5QNvhp{to?vZN z$TTiq_NwOBnwf>!vtG~n)ARh7Mt!#LE2C@GeMR|4*}vZ1UHxx`+w-N>{ok(rx%f-t zzP|nU^f`Zb&ilCQ`fjO{S+&HlD zz^xM7b${y8ZOe1-Uf!H{>}LFR^1k_?mw&F-MEUnV;mZ(1v&-(&0ki0)40F<++WFZ`_Fp!W1dI9PQQEc z?%JDo@9r%>``yGwzV^b_beXsBKV2`n{;m9eqV48&<>_TR-Os;$H%S>=rMm0D;@-<& z@9diAZ+C07tHT(L!;>`N(+fP3|eg02R_zdsrwR=N~ zGuJ=II%HV0@4(Ww*Gu>Ad%1MhPV>j}&h9z=zR0#X^Zko`^J-81nR)hH^t{rQ&obU$ z`xAJ#WzW*IYwsVW-`Ti3ybtP0WG6OmKCt!JD_y_scQ#&I^V;tDy_$2fb6?Kge(lV! z_DAuyC9gg@Z#N6jzbgAy_No5fx60{7_ZL6c+uLo+ge9@w(=YJ;T>5>=-JP-P((RMh zm#6P5`M;*R{Ll8RvU{KIWShRftAB54wcgvWd$5*9^Wz@`UH*FM-k-GVuk_x=-`f3L za`QLMkM}omR-NCx{%YK9{cCGW*S`PrV&^>Uh4Oa69a}AT@4LJ9`MRsIx8E1%ug(5@ z`Pux1KP%5$--)Wuj#YfW_Pr(6Vs?K{WA*IK+ppb^65m^$HGkb-V^jC{wbQF#yugWk!8!xT;rN}?X7j_U_p#rv+z+mve_-xa`|QJ??|t93y)L!t{m-vA#F{qg z*T(u@_O`nJe&eruhr5u&4U&8goY(na RFfcGMc)I$ztaD0e0st_ZwkiMs diff --git a/doc/workflow/groups/new_group_button.png b/doc/workflow/groups/new_group_button.png deleted file mode 100644 index 51e827986586ca471c99999680f0688459124c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185406 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

      7qfy|%%; zuJquPf0Z-#Crs_I|MT+t$B65vE2{4?%{jyN$Ex?}efxRs`{qf-Hde^wUSP;uJ7X-3wD+;zA)q|ZvPqJ`RaaHw%>mFzUvpST~1o`;p4K3BZ0F^ zmR0$@TXpc7GuxlP@{2F%{WXaD^Gd|c##B)FmR9`PT|E(db{Meg?=cmdJ7a^c*YQvC z-yR-kaf@oc_xIO>tD1KoxRqOK7XJ8h+}TTh>AwrsOSqr;ylwr%{IH@jm#dZG-kj}1 z{eOBd<;VYAZKJL#s(x<%@qCeE#%f{*`!rK7D?am(x>c&D`lexGfA0Z@_+=Ke6K_5K zyD{;fT#T;9(%-L^aI|43lU3J~A=s2UpkrklpZllKAn2`upl1 zuU1bMVVZpBRjQ9fjsj1`m*TR8`~H52H(Z#!xvIx?S>fV&kC~<)zj%!=N_y2|<^NkG zEV4xGF0Mb;Ex0kFd>Q*P!D-i}x?ff0nO?Khm%KlRRj$%(!>sQ=o!vjqSIMura*^BT z+51~XB6ribInJIGY`W!porUY$kM} z&ikHyiM1aetDFKqgCtL%FIHEq2mpx&*N0AsC` zneP2I9x1Dq!fk=eXPof2QQ^3M&UtxKLWA&^mluEJeHN7I+RyVp&h-3d3tqM6i2V!J z&NaGk;2Syh%hUh%JdDi;8=9J!K58$`{c*{IMT(12t=7B5s>EJ4-OuRaN!f4H^_|_{ z-T6PWCF@LEXn@7##^OK8oG05%Ub z%T#&|^!!6kojN5IdNLy1%XyDTjw~BT>>jDy`Cea>4~55Xk#=*|dNcQ(^2>YI4$Tj> zpCXdCP<#dd%P)Jw1@>pTXj_S#JGRWUCroqI<=*(s!iLYgHDZcB9_T4F2}oIz@baL_ zpZy=cMSN?pF9~1&AjgUEp8th}JGHeJlx#V@`Hw$pmi_mmVhTUs+Q?q>Z=wrgrzf2G zpmT6lhsc@ga^-yy27-=TJ>;e>TD2w8SgCaGM#D#3dKbk?zjp`D*kv*8)svo+hpQK< ze6;xa*0E%n;QzUjOwL{=Kjj%?_Iy0?;h9HY*YSS)JcpIW6UAg#pLixY$*}&3Pm8dn z>C6+i_&SbScZ)rI80=EEb~bDK4p9lqV#TLdIgQizw@sRnzoF)$_l?=#?6#ek?|Rhp z*updA1vCoY@2PLR4uB0KKGFK`FyAOCpUkr+N~Y2Ey42HzB_We!};3s z1KdrNAL&}(=CpPD?oymowMhIw?|FU8PQT>zq;2_f`{K87`S*GrKUK^9u(ZZdZO;~$ zC#Ju@?w;`fw~+yYJnsMv$i{yGX?&&(m&rH-*+8g%E>eTi; zH`7i2Tb6ES{qbXsSpS{t!s2{#?ku*~nFSS^HcPwRh&%SEHgm@JR1?7+3pcEMY-#Tz zQgTN$D|`NufR{5AN{=2){eQISFk4pl+>bl<3r25Kdm!+0TlVsrFERenx+ho7+Gm}# za_#@s)3&{vDbcB3x5QNPi~DEs0ME%*5T*Itk;w!hiG`Pml##H$Y_&J=znXxFtRO^z_H`^NA6a^R1iOzB{t%3Yc)e>1Hgy z>cTe5X#K}U$EWF=KR(Va#Upt`I5wvHh;fWh7IRgN$+ua_6W8^93(Ac#cXS@(6P?|Tpb&AU8pDyDqM?VcEVqLOdr>C*>px|BZ9Ir>mL zJYjlp*X~tY%ga+-a*pr$z_W#$?^toHOrhEM39bdwQtY~!@zz_ul{xZV_}IZw?HJ6AJz?W-gAU%#=l*`+e?(5Kyt)@D3jeMq_B<~2!q z{$g=aU6YG$zw3VK-?NKon4sv~`61WwedpAz`_!YZUbya(^l83}gHi#vU_rz5dWD#` zrYCHt2RQx<>I>Ija^e5B7k(}J($VwJaa@ye3^LO{8meCV`7+;Q@i>VzrpVX5=l*SJ zS}kXibH@FRt=QYUu(JT(#S2a?X`QT89#ygb`}!BJCUndJh9{f)u#ix$6=E_5VvWChj=2F;(^(GgocQORie8{4Lj*9{W|JYVT0$N$jp zI3K_w#k8CCQC1P>Avqa7eQD)OeD9B~o1qfL6ng4v@dtx1ybn^ZEzAB=Wvdsnqv6@v z*^5J0hdCWu{qmaIv^^UY4{%$nrVAxRYgO@niE`ia=B{{LT%6N#jmi6Z?;4yx(5;l2 znVE5S*H(qoQj5+!=PokHJ02t=`NYZF`N2(rOoNaA0^j7-h}JVmyPt88e!k3h-}Sam zt+%Il)tdf$o1idNd)6bT2vN}kGiLRC>Qmh6I`!RlfyP<;81oa$eAQnb^Y~#@^{42; zrn@>HvvZxb7oHRLNV?v7BHpg&t(NRLF`ufsuT39JC#i(bJghM3bErqW-HWpkRb6Sf ztCaXU)O0;Xe$|+MyQ|5|uhhiuy!dU|W&RxouZ8pk4Zl7+E$kcJYrXiv3nQ0V!C`7Q zH^Wu&w{jHNi{Y z@wSJq8$W#A$M5O2LHhkcH~o_6ZA|&{b{#9;@STYCZCPI%{pZ8Af{M-GSG@aC_Rl|J ztD0PJ{QGFnQ*Uc5JXL}w%#2@qY|TEK8~yJ2`Lb$f?)P)E_A7oYR;&4)aPr;J7Y7fm z3|3!ooPF}gORK<#58e85?wD-;+W6MM+!eq1vU?Xh&u_nc*?U8Q8~?-GR{B!s-KR## z^n~93VD;wD437BkCvWU|7rH@5Ygu38{UZ}2K3!Zt!z5g#-)_qFq~N%_1wxa>|MZ2N zIneVn|KPt2i)(%Jx_=sHI9!)Ky4vSQ(2u9fJ_NUyI?m_({PFKT;}<*IIO2H@@oRf3 z&9Gef5ptZ;%&Th;8kD^;eY^Nea9{oThm-f+7Y6fwe(U#GEiu_cQ?-MLn{Lzqn_J z&TC$MMA2f_gf)dai@t5z-1jZ0G-kzW8>w>rEy9fJOvPFkyzR7_cbi$(_wn@9Jj;mP zrqYUEe5P(ZddYulcwI*m)4E%7nlDb~x*Vt~IjrvAs+Am>buwOeSa(_YD&Ul9p->yDf6}u%l`S+X2h-i@mg^EyibqK{#|o%HLCSUx7fd# z$Gd;o!V50HtZs@W+&^};>4U6Mp2$+~%Gky4_pV`D_{}uX>L+Li?vAA#H?}#v*!#Up z=h9-m1mp7j$sc76B)@;(u(Vdb>*DgG%8eYc@$a8y34FdfL%4nZwu{x*Y$cr8%N#PZ zOuikt^kPxyGoH-fVZxQ%Uu2B9{;gYTv9DM?sm{9Rfn;okNvGqPiy|e`axO0=C%Q1P zvhkiZv{7To}InGvpzt&`b@>dt^2SU{@u>Q98Rzt;H<6i+* zaZ5cp?hE^WHc1!R;I<|?dZVry^Sj1c0kJo2pZC8%HgWFi1Q}D=h5KwAvt~Veb#-;d z#YL?OwULWHrtOcNrN*`C%62ZsxR47=g4)ey-Z5kR@a0QOdwaWuPZ#S_sof9rtJIFq z(0Kgs(x%kYY?`0;CzpF4+U__Z=ZDLTj_1!mXa4`lJHJBNbK-5|{-0~2Xa7#^zI@#E zA+S+sD^oD+^p&wGBU zL^bC7P1>v5(xNZC&up8IX+-CmwYh&6l>U|8JH=ybbE)x*ug?RbMEH0G4}LrMSYz!o zmA|V6j!aA48@D_7cjJv;abih)u8$|Te72}*T9T_N*!tzcm5MT%4#%bsPpgfNIBodj zu9z!n?|psR@%rO)9{&z>S<<8Y$&zK#xo1N8rLs%(bG;wz>0ol#RDF17{dU&Gq-MMF za)uYp3J;y^-gGc1RdIojd-7qMxT<4^P0^%Tpk z_J3!Uz*nEtFsB&*3g&e|1qxjG=VrAzZTkFjwxLeV>$-_v%WI16UR|%WK5XuLrSrNb z8y{3yacFq`lnl(B#3!uk)3ish+faMa1h024^{1Y^3Ay9CMZC23MpMsKg)jd!4=mGF zs=HcWd9&wkgpY~fzBli$m8ImtCXh)PzSDFO#~TV3Q=@9Dnku+wE1e z>h6BrEU0iRhrg9aSarj}*yfdI=Xsb-U%u+-q+7eIwmMYQfB$RsW>H*#OYW{0O-`p> zgWGew_X$3iWg{)AJ$%mqg`$+gI^^@=Fh!i7ij83K{LA#%BBvc!zTP<}x+r?;T=v#zaF8sZir16W;`p+P7~0-t8%0rnMM6e%XC|#)s5k^?xn- zTg}!TZC-ER$?lpW>uc8Nt+Mm~wjJfiR{Yy{D6IVc!tX8Z9BJ=PpPKteUvL7)pFj?Y zPL_=(W>Mx_1P*T(d|CK=LuEbFS#k7GEe_}By}MEK#Ntw~;|ERe;~ROZu3v0g=_}^n z#G|2`n+fSWF)P-tEFvG_-=t8R?`&cb0p~{@_8yt6$f>EP&I57 z6u#)Kq4e#bOR`+p+w%+elv>m_8GYtEx};k4A!q&lXD5EAi6$ja?)Z|sD=6^j(W4oc zm-YVmkS^3v59#LqliTL$XQCc{WgT-&rnlu}Uthe=cA zy)Q=y?zlXkzyIraq|22gX^}s7aW!8uw%<`y>hT7KhdyOJ?7MQ$Bd5E zPFf2roveg>FJHT=^kD0nk^=!U!ZC6MfjjoxQeI)ZVy5w*D683rx8}R6aLrAb>VIT< zyQ|bGf#=O>SvG=)6-xYPMnn}$UDesz)8DjwDgPv{#XCaogl~&A-m~4FiOJ^(w=4Mk zsQG6n#CuIu3|_VVg!k5~5hl+HPRu!7;BaFDL#u$=$}@7z9>Lkmr)hMm_TXCSl#GEkg0j41{i; zIJU&=g2>Db!MV#))~{b1wq(8CyIGHSFZiO88uC;?+dC*+x9#axh4#~HY#3Ryb$9*T zdFW1Y&EAf0<_b5Ks?PiIq_C%3u~fo6_=EJsMeQ%X*X_28`0k{CT4nWZ-tY|%Cg(OC zQR&@Y@$s*Ss!yEGyx64XUKPppC%uo({#^cm;U|xz9n1NNePMAoR-6<$vi8^mcX5vO zj>*dte?|ZOc=`|Pg0C%A60Ya7bCU&YS0!Kk6MDmg+d}vDPo*{C@;wJ6Yh=!`7)e)k zZ0&XRV#s>&Ra*SY1Jl^celu@yZEia~%W0yt?JleN(l1Y}$$7!BeeK6Bi^RI#=}oPD zRi1uPPSZ)p^UA(MS=Jt=hfnNdoN>9kBz3)N(XxAOA4?3qKgUYfM@>kbmw$ zsi@C0Rv$f4CwHUTfHz;S_h|imC8wveYTqlVM()g;`e}l>5M$>7`F@8)sYB*@&RlC% zE6b&uCN6X|ovwo>;1-YA@ zKTKrr^nToO;ceqW#1Utf?rzxv_p;Hf3o4)uN0dGqUKw5w~g zX6ii2SH+cLuY0yFvt+8aoOp`4j{i_ZhfUSm9lxtKZ$7zWVe$gD%$4Cs4yES4cQ7qU z-fN_Jd{UgR^jkH)MfZrftLE>y7sc}GQAA$uIis&`jSX9mvG?Wab36*a zdoOl=Q)J}Lg(2k=9vwY!@U7$|F12TC=c&D8@H}&I$(l;g%-U4+DZ6!Ahx>yU)gQhnlp4i#eDzjJe4S>vdA-n0zu=h`7T}|-7QC!n zzm8)OfBWGlu?1grjFz!zypq=V_tQmv<`Bdl|Q@O%#-Ys z+ZU`4dzkP^riVYkDc!BEXQKYvL%(O2b4`5uMwflUKc{%ty-cpwXJ=`qwM>IJm-YKj+=8fBfD5^Y>;Ra4n6i|Icpxrh5%nSJ$I`M_H$8 zdG&N%JfiD%`N**^rps<#UbEJBZRY0C%Ue8WAGz_zch(WNVBtIANh(@WAtJ7>1&$#i zt^z5?XEuJHlm6^bL&JiGhUY&G?tG1W_ucOKxjXl5zuTPjPpV4i?%pCB;kW<$ADz-D zt;`9XuT-zjd0tlb>|a9qO9s6!RnxR5ZFv1aRjOw7;;jCUNkV3m^4@uSo8JyUeQJMT z{Bt{L-$Fr6zHMdFm46ie8y!0kmnz-3&-SHD9FIhlNZYE)ES#lKVJXPH z@BD$g%N|$!oj?8Kk>bUgcCQ?4oa5GBj4$3XS=mEJqC;-V^eS6ZeV*bkydfs@>>py=#{or->`k#+eTCNx{C|@s3J0JDSU(soi z{f3I3=MNvTa|=eUw7+pXG}YR5#mlHE{)H1FKg|8}dS=D4{X6~V{d=eq9=+N-)%Wky zU$2{XMm+brZmDcoZ~aIq_sd~hktsF$^RH*EcQxUN;eDPvr(TtfHC=~!N2&Ja(qiqb z|M9Q;-#o3)u;<(-axSG?bq;5d&_~JcePOk4c1_ZjUH|pltq=RR=yOW)vjyZobSd0y z|Bv5p*9BQ^aX!|5@h4VOY%XZ#cyR1HCM`1g*J@?Qiao_|_o<)iKf5c`NS~#}VX^Q6 z$9rLQn*}9B%n~1+x%grIJN2e4iTdMDwJ(O=)_u%V`+em{%}pDVzw#~l#dDzNCG$ha z>+|3Im>QAzuhTWYURLvt*oJO5iR-h27Vt|sZ!BB6<%@R4RePEJl5aZ}-SOf2y@7Xk z()I@d$B!Fc*!{=)%7i)w>EuZlYM+SkEIz1jX%q3~`hUj#@yXY_<|BlX6dhN?Y7sGSsCm6ha9Qo35d*$js;!I8ravx*-+HH?=JxwVp zXquZZ{WMmCUvfz~N8@dO2kG{%x0BumhsSV8ZwlWQy<_HmxqW}v?kSE+sD3W9N+vUu z#mjr$C5GJBFE-EIQ~Pq++&D!&!?-0s_KIwt&Q^L^sJ+o3kY|&S^2&u<`p@lS=iGZY z;kiZ3(JxoOtvHxUxK2YHFnBLCKC=vwJSDOyBV3 za%zO5)6J!aJxxwr;q@xd>tFe{;jWoXJ=o3GomsHpkJq7frJjYqza^hO z#~ktBnWtClKkK|MkA-LLDw4gzXIUxb_%Lk!E;8@$?Xn|td|baA>#fLRu1pX3b1INA zk7M`rZS(sNzfm=`m^Q2LugVWQ(Lyfkm%fSn{%-Kwt8V8bSlPIJ{+#}|?vo2^?w420 zWQngh=V(ybd*|~Fl_00-N!NnAH~xMRnDhUcug#_c^_{o(xyY$cb&-DE^g8vP==U=V ze-|xt4;Sx%Kn;1>@Ahov;KDU@Ii+se>#6W ze^qNy{!W8)-}&T+x3->G{-gF)#73s``|?(1f32S3Y}l~c`>vY3U)`Ytha~+U?0(B$ zSnxf|#g|xZqepxx#Xc}^8c5?6|dyKNd5QZ zIz3@V$BW4|Yd<(hi&bSFFcf3lo@3o59Cw-{zxy$rz&-DK< znsPY8(P?$|_iYo4ct*p(|kX)^z#?(55wIAf2UbIWx# zGC!GN_c>5nX+!Pz!m}rXw>HV^T`AGMWI1cCxt*Eg&C)ac6Dzvj&hxUI9afjSMI9qH^zzl(RhowJU%v|t&MqX-vZ_JtV^978Ob=m@j!*p&o3GbTyd)|s)94TuB z1ekbz6-xi}eccxR;lsWQPnWD@?60`6_>R`T8-J_6EqE4lWY$(gkMn2Ue{piL3;N%$ zwOO&^nqucZ_a^q4@;B0C{s~6E zD1X{${LkTjOl!ygkhtAH^7~xL^0Mv51(Cy>#cr*C8J47Z$Ai@PeV}jw{pO zI-6P3I=39jShG-K-?Jx83-Z34HYjB`d*|&|R%Z36{tgG1a?b+0xmxkNbSqPoSXvx7 zdAXJ@t%Eyt1CyptnJ*Qu0v(I zfknC3Wx40^20m)?HsJj;bzh^~y8h$cDrE&(m-ouwt6i{p*7^_U&3R7S)pGjV{bh`+ zJX7>RR_$T@{6A4g>pn|-wwm^59$QuP4i`Ku-anpCesZ+tVNIo|=(DK9k+GgJh2M?) zlP=y_T2Y;+WcN2yby@umrkV8>qTcuFq`Y-2)6PUUweJetF(EIk)OFVDS2r&UA76F3 zHkSSI<<$H~SJR&-Kh!SPS<0GxFFaqd=T3Te(O#`Bt7;sx<9|whzVo&AWYMX$Wjgnd zuV41Lrq8xkl*K#lRrh*Z9-YYcqtaz794}gZ<#c(ktSOQ`>+;zzSG}HIzi|C);}!Mw z5x-Ic4wgWyLBNx$Wm$em~fHLS@f4yYHD*ymbrI&15eeocTUk)++g6@xd9t z3w6YF;?hq(Zr-{6UUT1*rC%OykvXHRf9|^Ow*%|H*!$1h&p2nhZ!}Ml$Dw7syA$5a zcdVN?wJM`ftnU)@9LByfgJtnbi5HmT#AaVhvV0aeJKlWutettk>~9(i*lJI``hWWR zgrFlbI&<@1#@nhty!fFxLTabTefc_`{nB?t`P<76ICXXY^*ZDIBQw>!TXtsm+K*9B z>^O?q)shc3T5Ni4aq2-wV6BZ{sS3Az?Jo9u*|2-&r=&7XgOlqw-ts^D>W!uV@BH~8 zH6jzUZmx1)?$=n6@k!r6>q5>K^Ic*GcmDc(te^2zu-U)uYTR=VIiI#UczS!NefUMY zHNO`tAG5o_y?VdTfoS>lVXR-?2{-tCIgtCk&Et){opiHSN}0=x7KK0GZwLQ)aXaV7 z_t!oT=WBl|;aM~D|EX5tkIT=LR%l!ConQIcnO|Fj<@oFGKZ5^0o3Ss|ebMLR`SV}3 z-t89t@cpd#h8=9THSJFBT+_dHjmS(vCZ`2~925RdotYqb>D)~Dh+}z?zRqi>E?;11 zY`ClV=zHm@%jB`xz?kKN4LuFs+{3^x9{-r#lNTeZdhlZaKNHu?U(2?8y`FHe6Vib z5&L?=mhM-@Uz`{8D+dLYDgHX6(^HqCw4q42Y;E^~-m0QUSCy5!O_HKsNmvOU?!KNV z-a0+vpzq=%r9I0&2u*5f5Lhv*;p|iIROznTTPrT`J$f45=91QOAXojsw-btTUA3NH zZ2jj+PFeHz+cxtLd|3y2MR#>+&D&Q0bmcR{Gq2a$@7ech)3(0lS8IPv7t4RVvTvTy zl(W;PP5b2Um^<_NRl6;5zFSjs<)iN3PBHpBaoX!C>pt#Y=xec&@vhgY^A*fh%M-tF zePif)czf5H6_+MCNpRJ*oU9Q0ruThnYiwvYqPs8V}h{3WzwpsrRVs z32n236WNrK+54+JMf8pA=l^2mJgj%>^5USCTJuz_D{mZf)l8qdEj(h$!PT2SXQX7< z+QghK$~$`Y%0HV=Y9%GDtB*e3aOhiGoPpTIor?3_7R#+$w{>Y;?cyHS$`gy3WMgd$ z?mi5Ny;-s*G;j5?6G~D6t+U)KW3un6uhLxgZgqC?yl&%-S$733zDsr#+Ul6+ezE#{ zdVRj*!4;elHalaQc3<5Wm0XvVZT2VVYrZNBb*_x@_vx@IYrHSh5*$zeJ^bq*L`Jci` z)!U9OyHvXSM1<4sh#waY)ZRR5RdL7ZzrpwSQa_BjcU`+YJ@o4Jr&3Zei{DxolUo6@6V*9jh@~xA8yt9{nXjH_e_T|E%mYJJp zzX&y9j(z+_BmSwNhw|(66?cv|8mAPK4Lo98cmd?@gUweI}tk(bCrKZb^ zIyc?X;g~Yz$$}#jdW34*xfZSO)jjG`BE|k;G+QmslULtF z{l2QBwIh4~nbjxUZfENoOrG&7@b5?G_a3(+5A5>oe6`qPF<&J zo)-3UL-yr(t<;?lm8M2M-rBM5^40m~#V<`|jo%kqJ##8UjSL0?N2S?*FUx(Q8)j#)!WlDGNm~)BG zB`G+E>+Z!sp08d_`uXboB3~c=oF&A4Hl$T`XUdI@TG-odeePMD z<1*El-%vNtY(_oG|qbeU3y>L%7g? z^ISY4=f4}h-2F|?fS;3+Syf;OJCg0ntZ+hul4%gcY)3%&&Ty<1cO{$EErQ z3U+CsF4^`=mxZeQeJ2SBFu5FH?LRk{>AI<5#8z9j*&g}1m-Phdt148S^6zCnn|8vg zV*5db`H#33&$=JfIB939u!6qj{W8XiK6aa|o9MSh{0t>cZo%2xqf~;*DUvv51 z&jpSz*38Use%R!{t;RJ` zr`OS8dUomkmoJy@`R(#$t^KFyWw!m-&gFG@+qYMT*Tp0stiA1jV83R~xqC0pe@vQn z^JI(hjO)LXfBriEQLz2y#1ePGgzAv|stL7OE1T|SX{X+Lz~b^Hx8R8HW~RN)@-f;s z{FFt~gJj}A{Zb8_?wauS`lOQuPPyi>-iy8}X9je6bp5s7`X|9_{lS18(MLaTy;ym9 zL4NC(HVgjEs-7GijIIZEnl7`m>9q50Zojvk{odT`i!)8!qAot+ERhoIJE}aZ#&~I? zlLH4wW0m5AyUJ6Xtgd(mUKM%Nw2s;NW$@Xw$XvCAQ-?nWYibmIY3a}2*^<3zhq&Fc znwTZqS9C?QPrk7Fu&UJi#XD*_&d%OY{qnlSGEZ* z_U>c%?oV^x95Jc4d-W%cE7MY|UbDo!IkW!Et{ZnPmMqy_&Cs;RS}EgD@{K<~({JRg zytl_r;H_)nuCKzEe7pnXex%Hg+O#b?cdn20yoMPGhmG?lnZ9_lJHVr@Rx89gGqX`B ze{J&bTQ{mMO;5L;krU+cMb>Z82h~rXc=fEsqJ^q*b8a?#eeyC}j=}Hwh1EH`&u}m* zDu7aq029dfAWoL=fkmIc?MmlzI^85Y{kfU#KMTthAN*8)T#Q{~xo83(pGm$>xq;64 zfa{i_3zXl4cJK-JUS7EQO5pXTl>cpN3E4XQ5zC5;g#7QfvBd@d6nP(`x?5q7e3`ge zzI{qu*lXVv{Fm3Pth#y4gfnB_z8oa~bnN3jzr*udLh|EfY^j^CZeP5CuZrtwf#{p7 z(NUB94c*=cB}%`U^ImP?cKNf_TKe(PbFDk~Pk&j=TJ`%~0)Kqp`_s+4Uw+Abae7#Acyoiu?=CEWAFWZEAduGaLWP$y)^DQ}_-j z^YgG>5*FN9$*!lB9^n2(s#4#ndP|#Pt^B@jv&4${1n&@=rekN0yg2u?Ie51AnZu3p z*OiQ(E|S`M{Ni%!V}2aX{^uBV;^%h!3tqNZzIDojkSS8lsS{sH{C}bHWBSpeWgmqv zeM|hwpZVfiWdDzrkge;p9Sqd`C04Mx`PxhMuH7xpY*h=ZZEZ_b|W1*1iXhe{Wg1cGJ}C4(kuL@9xg->Tr*9d_QOHi;Z>C zsUO{r=*PQkc&YI2zaCTj!vQ&mql%hp8l%s`@2e}{?hElVb4i-F>f6lY)S9|m;cD*?_`<|QS9??7X_m=JYhpzj%XKZ{U zy_ILVfXvUUcYl1l&8i{y$7o*ma_3zqWo7T2op*jtx!6=|K@_eEj@KCm5OR2Q9yF^#=!u``c zl-{QZRqyqu<$NS)zk|FoLwncljcv{xpTfcC&-cxQ+ z1_7rfNN%~n#QEWD=ChTDJ_($702)~IgbqfFVNB6|J=D@XEcCcJtaQSaLpTn7T z79u}Ok6)O_c;V?hg~BrSp1QvVc?AsXVl9w4<&#VT9SgS?bjwRhSQkI){SKh9}_02(%FWl;l({7c%a5hb;q)^1iu6HPhy+3jsh4l$39v6SnL{b*gdsyv(} z>XWL<&%`G!oI9quU+YjakKgH7kIU*q zB3&Hrc4F^Jx}evhqg;kmY7jb<%-*Y4fhv2T0Dr1>x9+cX`^W5c_)Pv(x}l?&cB z@38G2$;}&ccGf)8x)-&TdH(sCeVO0S9a-+Z-_h@<+W~W#)5lsJ=g)08pEUWx#^Vw_ z(my!Np6_XYu_mdd>`lMrjW*T1a>W~m=gDP#IkLCJ(4t39;^r;M*7i$lyn{clzx!E- zbKkrj6ZXiSp42--%1p{JrF$mdw*vEv3tqgt>+wOg&|H_%UW6t2=#GaMq|YfQJ&#*( z*TCnsOq=NB-i+;Sha#+YIKMBtx{A+w$IF-pe%VDba~{5U)W-L7`G>35m}YmQ?~2hTt4kao~o%GqhRgpPD}2+;p<`+>Q{XA_}R9!s-oh+)vKbd zt*sjtH?miJ`FYG|+qQcJ-zsMADT$u!G1ob6AE(MAxyHShIfU}xhuzyd^>(n=$9i7Z z-6t=b&)ygDR*xNx@A3|TG~`^Rl0cn z&DrpM)1GNuiFtnS@5Fufe8=}TUD&w&!-+Rv*1uXm@8niL0g9RX9GXK?2Jb5 z@K1s(w&a|0Pj>q9;MrEmrsn0_79{_u`0}7Y{GZyJV7dJwRZ6yrbCivA|g`bI4*|Rd94wLQ+^`}|R*_-S-RM%N8uK4DF zam#4o8_CA%jm35|>RO7KwDe1Qxr1md*^Cm}PrE_(4 zwYK2)Wnxn7uYb?``D)0svpJi$X0P6~(S7~eV2#eb3r)q6 zSLbt!zc*iX$DQTA*2WWF81=Vj!`B(_gwqst7HksFEA2B?6Ky;ANX%zvuF-Y|IL)mY!Ho?gkXY<$e>E6AkqJQuBhv&@K4CQXH-T83iiTKAErJV2H zUVMHhY|bHvFYm>AB=g>C=A0_aDd#%;fsgrv6q9D3m(sLZyQ?exYSq6cJTCh6^HXW$ z$sG+BUvVYGMK;JD-|}sfYOI@1e1cA_v%&98q5z=yCuGfQQag1sCHeOX?49td)%^wE%ZQC+src8hLF1~_ef>BCO+rBQ( za=mD?BvnEnf%8)Ksgog2tC_2ftjdlkbfs+1{xA2!SMvgUuVc3N){vyNL9gcVc6b*a zT9LW=!qwR!iOxp*{+$my6x44&$8ej9m4i+j~IQI zlPJG_S4F`3@u7*f*N>kwou}4cmf(=h=b9Gs=S&}!=hky`7rV7cSZ=DCJtT<4mbu|IZN?fbV^<~_S4pxm_HZT+p4 zXH8EZmb}&cHZ16|@P^z!TG45}Z}zU<%wn_uqF@yFzCHTwWd-HWI}AZ1VrVTurv+s! zXX3WFh6hia7R&Nqu2v(O%gjyAp(@XgbKh@)jizkvmrl2`7x%sL?vLKycgXUIlDV;D z^tB7C?|g7huMZ0<12{Py|Ryu)Ok z{;DPCj?qct^>vB6cJluNF z`f~cJZTsCS>xC2eldHJS*j>0Ds;#ZVazoFXTcf8}HFQIC?ouD=IS#GwC$g=7%eV4? z%l&6>cAhq@*5*DK%DGSG*1}J9`KBAutZfBkTXpVAn-n?LbF z#k3Xc&Od*XBFS;`TxXMi#!23CfBE)Dq0uYWh(4QY^5FIg$-^h+Z+xoW?5%B)wrn=P z$?L9;eP3%%`NyAike|QJW8bXE-ILbJdj#}NWuJEGKtcThi~QnmSGI8c`Pg9o&!|A* znXmMUuxF`q2eNOUiQBdEc~apG1D0Cfl{d~PN^l7mTr!cd{nQ^Lf9qh3%D*iy>v7jI7}VyIN_uVfO=wA7wG?^Q*{q>VQx^uGJM;_cs%hsWkT{_*!#Zb&sZ7phFJPTN|WQJXK6_}}Ansn_*2cP?a4HZ(OAwfnL(*S~PqrOTH?YvR8>*eX`? zI{3rWs;I0--OT)5HWbhqB;yC&L5vMWJB@$|Wi8+Cdbv<^<_djD^;pq_Gi zf)l@PgUj7hY4Q)aa*ah7o^W_uvZmU4XBsoFO5UO{E312!>;0DhEmqva_dfVR@iBXj z?Z1~DXxvj@`C!GfX*cdYdi3bR&f@1)nN|J&byrL;l3FIf&QreFUHq8M8?8N4H^}5w z=>G})qJ5*gdhuEQ@(1>u)7AKoKb-qM@yx|nM_$c(wZ7{1o{#wte{NGZeD-<0hR#Ow zJNY}`Iy`bN&X>v$3ln2vX3l@Sb!(Y#y6^HGJ0x~WhaIlH{9Wtv)P2nl|KGlUeO-gq zo1?n~_gm&?XRo#cjXz#zGMx}3dc9@B1Od^csm@y_o%_P~wtUK}$L``HPn>-#@439b zdSz3eyyA-5jJ;<0MiM;NDz{Y53;X`?y3m$foAtF7bIsQKW=_2|efgfg;HN9UT5WZH zT5oFWvv$vVo$E~u-A8Q}NUP6_+gB6Gx&O`2)6Ls5S8h^Rvv&XF-IHXl~9s&@MQ`?s=*iAe3Q3yW<$Aw3?X!GcCD&J7$@#Y$S@%Qq`;+&-yo zR+)m(?4;lmw{P%&zq94RYOnP-%;qZREnMj}W8IZ2TAf>#OkEZxqknBq&gS(RjP0&! zVwEbUsZ2+2Os&>VT3?p4(<1y$-|=5Q$7ePuT9mL#T-m9dYtx^a7ZQG7fzPVCd|8`*tnZ7-jk9Oh`aDQ|`2EsS?^TDh zLo=J!8!=T$6)vy0+!(O0FDd=#@#D%iHZsA>{X(5A?N>fLGAF{uzVegGzTfYxRa8|I zA06pDwK^&}>at00K1-PT_Tz8j`4(2ZuKsxTmA8a_wbGx7ZKc{~inp^=*sFq=pKr4@ zsJdeCBP+iog3ErdEz@j&#_#`%q^vBjhb;cO?eq{pf}av)$5kG@GQD-}wI0vQm-$nJ(^^487D$1fk;C-u+_?|jFZ$%1 z+Yf%aR+Vh-_-eC&K~+pxO|MfrEyZkW2t#6aQZaWd$!BH#3EpK|vPf7pCx`{x~b zHkmiVky|(F^OsbVB$lgiY-(%#Iyd1O%MiwDhSTE08**=(nLfDt=H}+?rytM6RNg;t z_uJ>`-uL@{=T)$M{Zb{y`gu{J;187#r~UiV?#Fd6khXgs>hn74-L>k<_u@0Y|CD=U zHLp4TTS@rS_?z;sP3zfrm7O?taq8`f!r#1SY+rHq`d{n4KWlX&jtUtrHw)W$Hp;ByW}5!Dam|w-ztlr z;E`dJ2GI^@&KET`iA4oX>vjm3wf@vNxu+*+x^*JQZtE{CrxVSsnY_NJ?oRprWXYSU zZ$Qm0gZ=jRe|)_sXu8Sa9q#!ILWKi_vL=@+~sEKb>&sJLG*Qzv6 zd|WtP{k~kShuAhh)*D;v_%GB;)fs1N1&FlXeV*0l`sBq`S!ZW=#VzI1ubVRNweVbP z`rSUQbI0B4(tzJLE}A9t{run7AJC+~{>#_r+{t`hT4sT7_5ULczd#G4aw$fs7qUO? z>QdWdtA0%>S|PN2m63{(GE1H`<2L87io34}-PXRncF8eyg?anF9+~4TP+$|$_cD8K z#E+*FUEaQZtKGBV#P6a@kFG^M-#Pi2C5v0GlSxS0p~c3Z9#m|fbz}eb2BuBoA`*!@ zi~I}K7VZ1Z=K5sr?bVBqPXGSNam{{~7P}kl@7}JT)c;N^=hs7xcXMNFPq6-16gHgg z#4+2?UE$Y@xYcP^$(Q2)_dGoM)PK=rzKvWyx)&`U-!uQ;Tb;S`$0yDsM~);st@@;s=|wyg7wRa!Ge;UlszA8#>W(vcJ0@|xrO=jB%?-c*xw^L%kv_l?HWf)XAaM~>eZdD_ig9z=l%3}?F5^5^`d`uoL+az&d!WxXJP+zFOEae9*U^|N@?6HlrMD?+0XUd}mms~yO{D8^dK{O#Y8 zzRM4P1U_vz`u$<~FNK%7zmA+fXv)p>=ILp_zMSb%N!6vnvpToAE$el4aJgTllq-Aq zdewt%tGb@+D~Z+E+S;zZRpY+)u>r53px}$!+x4wV4B9Ps2sUilVj_CJ{MVP4p>MJd zJ-vMLL~(Ar-#+uQ{-+AO3;X{|8vokDbpCa>UgF#3+ybu6tLM)Cz{LAxTHD%*Po8YP-Tk=L1%CRVz&G}K4``1-@Q=dTHuJ9;_( zkM^-IUxKPU`_Mt;G)W7CsAT z(OqM0vik7D&zCO=zfM$5=`Tx}KIewt&A8P?eK{|6W*z$2`6Ajsy|FchpP&Eh%H>M$ zJCc5VdAazIiB9Au7Jj=Q3ctR-4u4zt`KYp%7T4|V`NwA%CSO<`zFzCw+2j4(_uNDN ztABjI{Om*V9<51jjeiO}udJQYyr1vw9Ss)t%B&sD`P&@@4H0`=91Ewijfg4y`V?m$K8_^o%KWHEOY*;lyH56CD;N7PUR^ZcCJ^ zZ>A>8jmy_3{*i~$KXT9*YIo@mX zHm})#mgUEvEl)zk&VN5}Z`0uv>(uI0XixvK@pLI|K@LvNK<0b8vAaax7~b8O>^{f7 zJ}y?ItE;Qv;UU%y!tg=)D*mo)f?&$8bkb=!Z7d;Ias5t6QT zJ7jC7?1=hWk)gvLt!jJx_F1=ISDEJY_b5#*7g6JR6Qa21(2b3;8=vp~dSkj7W8y!n z)o09S`5ykR@*`+LoR8eIer|O?4Z~SaUzE+YPLSyRz3tWg`HAoE9KUeXR5~!ecFmp+ z>xwOZ)SJwe)Ni9S9cHmJ>g(%&t)3Ts`g76d`!?sIi!)WftIL@`_u76hbvA9%8HY_rYl)WH8pI$Cs$J! zRg`q`y2nDebNBeW$1EAD^h~ zer39;{nszwzlSU3S5#Q+Du2I@?da-tGI9dBSKg!-e$bzvaP#+Po!zAeCj0jXEy{0< z3f5aN?flf~FD`6jcl{9CpCRSZJ176*?}-mZS>o?){yU-i!N7k7t7D9`Q3q9L zNio*-nky(c?7dk2@{(#qfBvN_x3u17*0KEHz3}HxP0FmC3)5Om*o7=|i#JVhQ2f<1 zcb93m0Kd%z>-+yV&AqZ*;@Z8d%+klsAN*y^8BzXBqc48%oj-mB+}VZO!}iU%vC;h9 z`y1T<&P_Y`DEfwBR{P>dKh@+KnQtnq^TkHq+PnQyfy$kJx0Qv<&9<&MS0$gj@6(lQ zL451C|NHRk)ahGR^TNI-UiSob&;Dj;%wFzy#A)lcGoL{V5tiNBw2go5d*8yMf1vJ} z@85RLde1FWj`&-O>&NkYd-YU5U#!wH?)}=MHfD;?PlbM3banC6>D4z6WSwn|G(7sv zG;sCYxvp<=^`86O(nN$w<1~i`)~!>fOo{%Zdr!#YgrP|&(;fGp_Y9Slne}FeFaFzk zc-6|Ed)W^BSgk&#t+=E1oeFQT55P#ys|owKkKvUk_{Us+;^#L|MpPu z`H!U^gicR+?z<({{FuHlEv$52C{cvhHiQ`%i`Du%;CBQffXJNtuo*Go^E$F-u+cmxHfjuBh3^i zwUT{nUq7tdlr(qK@9Wy7u(JSESXvy;vP66_O^IncJn?VpsT9BWj31V6-~RJ0|F&q) zUVjId`^VDtOv986l8$in$lJ#q{knFGrx;2mg;nuW1QR}XB!A!ZqI(0jC{`@JbP9aeOqBF`s9@YON+y2g#(B5+igmgnX3d>f78$2@|scV zg08)P=e|_!R5uQeMmE(2PS#JJI{yFcpZaylcX=*xaq-mUprvI?FQ&VE$t`&jv=FsG zhP5yYHnT*yJQCp7`6adMn~NQ9!m*Rjq6FWR{aN7>FSbYpwBTq1i-~^xOSl}QHAAn}+)m$4~RphpuJb2KNbN}*c zex2<3uixcr?3@+5O~=^Dfx|?HF}O_Z&9+>v)lUvJ#B1os^Bq)LD0^zdooSMSwfWp- zD?^Y+Bpl$J9g$2re~LQT>st3LaF2hoE1K<-naJV1*Hxm)A$w}`r>%P;%w(>1;9KgV zh+D_L3Tmk8SNr{(XJ_z5k|8`i{A+;Qo|^nK8x_9`T->hs((5L?ZG+OGbJ#0bkd$@Af`?_AE^8*R~CZ^UB(l7v*oZPQ8?X-3Eux z-%5*$f}AdMelpV8dR5cl+w)0@zd!Q{)-IjR(a5H7VA1-*-~1bFYwyJDS}XV5t>y6C zJvBGwj-KAmxZu9a#9y;d6uYN91x|;<%a~n+qTof$FE8K}NHDy9?_OM`q?ky>gDWShFQz}{TCjy>o4RnqogG}; zgylsPS8>kK&UE^$wqQ@q&3Px*g>2dw`t6xllm78fsn%24wSAw?<LldcBvn zuHnKj_y0G%^jgNT-~43wrn@&;LL%6=$!}8LrtX&$Z>gv}6>3TTH=29$O!UpS>IX@XLzdi6sR_)2B>keZ1&h8qfj5h_g9P7LEj1U;f85MU}*SWx-2b9Ti~ zvtOAjLtB-8UE`Yk25U4saF~=b&HAvqwQ>XRt2SX~=hL%tH|MMOtllsBaC=Y38IHzR zoEsjT{&uKrvFbMUZQ6W`l@eu5w0w(K<pJIaimB-3dqFnKkG3e# znzB;$1Bce{-MhEy?VSu0rP>DpOH$Jh{eL1@oH#q|;EPv$e{cLgpr{Bck_&7ZRe${3 zz^G7tF(_)forXenmhZeTGS?d4`aJrPRWj>dh|B$D<$h9oTt7YDcu>%r6-&A*n9Z?) zW9j9W4_>_B;OFO;;9-m5k!Ih0i0Q{1|FE^2e%5LB=;dvYmQ!1FHP^~NDEG4Jfx?>J z-Q^8$mt47Yrl)M~RN2bQ%$|@~60Dv5u5yZdl<)UD9;b0s1hW+mIEfsWe0u%7<+~N^ zoT2G%_xo4x%MHy`U8;KE`usy5KKn`Dc&qlqYuYsL2G;m(+}rq5)k{|7n5Q4}2`M}B zO(juw*72X>7q?f=QO{h8y*3MAXPR|<{p!`)d-m?V*kz}F%+GD#@_wzQTaK{Q{N&`h z7^w8;TI1?Bw~9D54wgSROBFw5_afkC+>N}bi8oGz?2y}cb}_$4MZ45F;p6`vN~rm2 z7Vc53i_*j_`oJlC#Y~3#&bM#gJb3o3@7?>KZR?zVn0)Dq;hetabVB0kZ?BJvFdgF9 z9hm$y^y{p`Q`f|N960v{+8;>!Imw9sevNsi~PFyV2HD=gqT=f=4cI zpY{2Q2y1-aDy}8INn5ZreFT`C9vox2@pyWxR(W~3YRt~|kiqJTe zZz(!6yOAa0!_&HRe`T+{-+JWRfwF_&4wfDIcBl+A6S?9isQ9yc?iHnltN3eN)e>Kx zFF%K8evh}~-cw$>wp9#m<^LIiZ?Ov2onCRm$6M(@lm7SochB$K-+H9%z_$ZsicRa? zmj3i}{gS)yxnGnXc9X9(Hf;THdi|R1d3UAe#l=}zE6HfqvQ3{}^3lf2L%{ghTj7V> z=X9Of%D|-aqiFxLf4r}rM?Ly?9&EwEZ;EpJq~<=eylQ?v&3iT0Rw!s;Y&p}^*7&;I zx%QIH&J*81?2R+DKXfd^Av2IM$F5esjWc-Rd=uGiRucnW`9&9*s4}UlDfeXWZ$5i0 z^ozk_7t^&N`Ry$eE^55FC45iiM^$z8;j?FblYW>j6)vBgJ5l?ZZ`0%)EM*6{O{$Wh z`zLFWzW?Tu+JXgB)qmyO=V;%vS|c$r$C-tv(>?L~5$+8izfEmiGwZqL{>9O2AAL`Y zYkTkrp(TEA-1@l8=bH6K zrB-tmFs|Lh|JHf>;p#xI^+$_$v|sxFo1xA5_rm%g*EbZF3a`IEJ3%i}s=eXUyR)ZT z3x7`6xVwAtnjmSe;G#|M1yb&rN~~MA?$qwi4=0$``M<*_7qx%ssij5FD&_6t|iiW ztu6c9I}e#E^De8Brroop_w3m-rCh&y>t=WB@0A}vT+P_JW@Suo)U}^$zFwR%?b+lT zvzM~mpEQYQ!IA*Z?N#mfR`p!ET)Yll^(KNPN_^4hCm`$=fslbH|RJZ@dbDA!vgw>kLy1CH3FUtiwdSW#BG`|a)*NlIew z&mK)TW`@CL1y7gnR^BcV%^Pha^D6#h4SoiU7xW>(|$~p3NGP~y0 zy0~P&oV$cmc0SkBf;Svq)9U*!ZMm{(+Ra-x9@PZs&*7EhtM0OYdwJDVuIC5t?Y%SI z^x$@#<}+I?m}cF%`iRemZ$%oD+F?$iJl|7?r?cJ{>be@8w8zD;>h|iMV~-At?0VSn z=}D^LcJMY6cGX{>_*7MAPEnt|&3cu^{svv2>p}^yU78AHgFm(=S3Ewg;!~HUHt*%b zpyPMU_g8$lt9-}q|1;bo4!O`_@#ExFs< z9`rId{wgw$yPaS7x@7*b-G13u zPls@DG+H+|Xc`Ot*1Oca@m|<Sik=FDi}j=cWh%}uGfyGz^JW8YTH*yR6Ux$|`c zqc!GPGnbaJo{j@;&^2U<_>-F0V_UyfV*i`3vwfRx?tHkoaAUA}N%vjG={lc^7944s z{ZhW(@no#?g6ao?H@4-fKYA~FIa=z!L*yIXodt5srk)O{%E)hJds6-DLB$6TiCf#+ zr91c71Vn2K)!y7aT|UjjqMd6;)SD*IQj#oRHQ}!A?nHwL>TkAYKe6@RSoE?}L3-*p zm8J7m?^*e%$Mxfrg|9v09sDj>2gk%GTeapFXlZv}zir*Wv~*oT$!xEr0)L^J+SA*b z>#S~D|7(hi{kYUf=EULcyq!m^HBwyey2igayUIg$tNQ9~cb=?SdM|MQoVIZG9gAn2 zi+wkh`-Z?r;V_q+BdI=zrIq*OZ~8E8`q`WJ_&=!VUz%2);rp%Q%du{YX;V3xw;s+j zU2FP8bhYl>XvXK~MHu-UIg}2HpEw%+KD%kXw%gajBX&i5&z|-?SR8*O`S9hxuS)!0 zUs79l_gr6f&%TfO+wzy!iqAh-fAVGWr#bsp==6V^WyJcPZ{c*Vj;^mZn|Ezp;#?Oc z_^9?}Z)=-}$nC!Uj51G{E(nw?1uYorXjrMiYoB+cQ6#zii|WPjSbN`@9e=c%t}*tl z>(lV+aDSsG-!uCwgVnWXyFb2)oU`cpZ$+hFUh=|BP7lO5HhehEBzgaO@t%0yJBP2X z4lkT~P4;6pcfQn>wZ%5Q<;e#B)zTTyl~maK9CmZG&$P<1(Tq`=s_e;eg`H7!yZLLb zp6vb1W$qJ=C4_>gu3sptFNqryp`rxf4_ScTj%=ndh;%&6; zyv2L=*nDW6&wIgY-iJMApZI>+~1DxB2dN z`19@hV#5>LC+(gaYJI!%!fPwOGOuYxh3|Tf*T3$5bYK7YtPWcbSwqG*?`Kb}VEF&z zAIG=i*)lSQSvLf1?034)T(EeXzIDf6%aZU%4?5$0`42BXXx>pcr&cC@&v$;E{vKDc zs~3xpEUtL^HT~lK>1Q^*u((%~q_^o;8-t;J!t{s7@S6?i#Efp<*zv=*W`j!5R^5tY-V%W&f(4s%))|~U{OWrA z(T|Li9|&(}=~g;_Nn82gkF&e=7k_=I|MAo!k5zYs4<^SSYP#>cp@K8~ep&LZFq`kY znJfPIFYKs#&AR4*@sG@x%pD8A>1^4Oex%3!;mkd<5_=gwFE3wwEhIj!b=jpuAFt*= zTKi*OMPh{BKdW-VL(_AP2FG6dcy#yw1>3ZPBtE|Iu6VpXD!Q@w_Wpy`|NjVWtdXno zJG9>2QYooc@LrUeykmOj*Uf@6zMNb>LT~e>rW?=M?Gt^! zcPq!l^-{u=rfAyu`hWA(Ywiig%%?NLGf3x#1`^Wm_e?EMdTRSn& zwB9O9`Cr{BasMxx$L#m}I!NsO`Jtj+M(3}V)auEbu2dG4F3&!#{5>hF->WTRP8Vza z?Y3HxFunZyW@oy-ACQ06ru^~$HO9wI4`sxA>)$Z``}VG6%ie&$U#Gs+s5)y_v(5Ty z&EGE{5B9Jhe^lpP`{hznrIz2}MMndF7+z-Qo^rh6>-BrWp|a7+`>qDw%a|$5S6kW}!laOWq!?zjidS-pR^}Z_U4QG3!K) z#AEkrRtNuGe?ZOCMM{;W#X(r*0MpEG7j0B;uIy&7IeqS&TiO1EH{5U94m2Bnu%5fZ z#X|LnYkq6ydB0uxlKinh{%$DDR(+H&Y_tFDQqNPHr<*R9H)pU9dJ}irnJsUB@7g|_ z^VJGV>p4o^y~{}b_%4;#>-FYGcW=j>EBU+i@*nRN|4!{z_D(u{`pg-ZK*8=Qrpxc# ziFwNT=Iz_Hbv@VilpoIBS}e8h(a%@1&DtS{n$|CTpgyA~{lSAG`O5Fxf^S=XaW4E< zm9^Ra=oi`8i`p~TS}(u6bueXe(84vdqfS^gPPgwns9G+6X5O9lD=S56Ha-{mCv}rG z-u{N5Yq(K?l_o#;Bn_6swFf`=S-0x*9eKQ0SN3B+=f4~O|CU!MTk+5RRdPJ%e$tu_ zuY<4OuQ_;}TYkki({I@t^;&6po25HP|^=5zAZ@D+o=cfDZ#|-86f3)s!pETtB@xDI%@ht65v#Xra$5QrKJ`-HCG|1iN z7f+L{-=qV(M2e3sPl)`&{-TX(j)LF^iCU|c^9T1te!KDSq*Bd?Lm>}V&o`KSWPfe< z`~?Nv$1fCLlG!6Np;=#i?Sad}mqY$-YtyzUE7OguOw^6oF!#D9bG&{`*Ut522mQ6v zo$LQt_srisVM-EL^2Z?YIXw|AuItYnFcow7y*ugk?8}Drxzn_M->my~aL=!ENuBZeccsR?zoygH&FHV^m2LQ$_|J6v z-%F84<-bq%xf9LKI^X*7adR$ZWt2CWREBVXau^V2NC#o#cJ$5C0nnsxZ zS?Q)bd*dHByQ*9e>S5aDXlnF&O|rx}?rAA!78bk9?b@?yh1xaSbB}+zKYJuGw|)Av zvx_zOd%A)(rL#LNNK6(7vZe*iGuX-XFkM zRUq;ptNH8vHHYiZzc$n=VfeL0>%cEw&j=rg+f!Tbrv_CC+or?}gHdFA16yS1^+ zcW1}{m+VL8oO-Y*!`60!T&?~utGNe0UG02fpKA4Ms~LNvhF9;wO(#lv>Pt-Y-roqC z=Kfx)LGbahMXSGmJ*dPpQ(a(du6j_&(~!OX<#((Nc~+fRRN~^E=XS_-U-$*(74ZV= zRK%6vEG*b^ZRUik2kJT9wyyp6&b*Z>_#VOYF6QS%o%|^(ka4m@>$hHCul8rt=WxE( zT91Vj_@7sOaSga5x2xY~?X2iShwePPdSKgG4PI&P-G!4I!sL|x-Fr9rX3wkezSi)~ z7qecoO_?BG`EqO5t>CcReio(*ENc1jqRqGFy2cloJ*l`dt9{qE3yUOWx0!5};|N)< zbjA5%xu2lUlWT4tu6AsAu3xYDp`$ZrPfktm+?>*R1qE}x5+(0={@Lp@U%N#A{@gn? zyj~wnMb#G_$z*YTW!k-Osp`%rCue)?-^TkTcxuX}N5Wse7|pjydB4c0#)D&@bk*^? z?KKiVXHGBZJaTpao?i@3CpJ%yYjC@FaJ{45+-WKQCjPzB-Jg`DaQ^$Dt&8K6OBpMJ zFKb`@f4u4aioyt+or`b%U%2q2#P)`|9mi82^-kE;mh~X~5^qP$(WdpwKTUeQJZ`#t zM_qiq^P>}TM^Z|izm==}uwr?%+Whdz?fsWpc7OQ!=V`>pTBfvf(mh_Y7H3`Gc|z6e zL+zLMuRlZ!Ia=N|U%`FMW-rJ5b=H0SYO6v&%-O=A{k%VrJNOvSk;Ucb6$>l0m;E&r z_@8v}`%KjctKIu=*%jx=v-r>L*I#`8VQKM1j%9DVb#MQED3PXfr`y=I|G^P^j}Kqx zG?r@Dvu}NUrt`&z0~Ix5IZ?l+ zRI%0wXl#3PNV%f;YQ4ci+t{>aWk)woI9~7}Ld)Pw(Aryl52kO({OI#TO!nyFg;(ZD z)*lZNO0>Lde}Z4p_+Hp&4XcRc%J+R2Z5E&1o&8_^Y;@bt;9U>z9J_8fKkQueM$TZX z;AlhP?<{*;-0gm-_t_YWsN2Omy>@%BIyG&5tj|vQSefI=dY#9v-~W`kbhfLm^{(36 zG0LykX&vs!G&U&an(JQmb$|D9Z;J=1?dOuy9_P!xm>P2F-2PwZYrZ^N7CJNL!;g0U z!}EUKsek+X;cW4!YC7N}YOXg|s)rY{pQ?XyH>>^_OieGg?#7Tqq5+gJIr)55#y z+x~q&7!F_g`%L1=y8Y5m*2lJ+O$`lCeCD?yKRK)E)0%nKMhgyY43F6mmb3PGW8h@< zq<0#dyguEl{cB^8^C>0DEPi*D^ts?Q&vIfEo0WC<+gNTnwz&A+V!IEPW;{}zJ16ga zr}V4w`0gE#{OfBt7Jk|0{O{z8SL@f8{QWbDCH}hI;g6=aXC9g4O<+$ud%tnVlo-`t ztF(;$9v)s_KHuUjo9-KHlx-Wnz3DStc(>r~8M`+f%hj*- zy_(J!w0OVrM==Qp{-;*kcC{Uj-mdiRIP(j;-TXB#=B~KWtocIx-2KyPbClYd7SF3o zei!dt*&|_)ret+1e(Cm;FMf${WPV$3yzA2Y-99;89fw@6EA-5~A^xp0eS@wR-|X)! ziD4_$7lp5JbDF5#v~te1>wbzw?o2%;wdafjO54p6lHa&iu(2wy+0B0L?O)Eq=mYw;2F2Cz{}h9!om3uz4)J5 zPTdgj{jilp{jH`;g2@ZytL1ZQqV9{?E|@scv(((P;p?JHJtY$LHyCEmjeeN6Kwwc= z>eHV;9)|pnUvRZV)OOr${(8^tls?E#n*`Y(zY_$ z2RB}E{&Ff>^!JWN+Q-Nk?T(gtEeY(`Plkvc)!1apePnx)j9#qM#)o%(j=a0y&OiCw zLx!VrdtF$Iyw7yj%d#i72-WDWKC!s>ul=X6KK(Pv4dTc*QosJM;#Z*m z9*4M=nafY?o^q|MBdTZlqE8e3Sz;W@jiw0oU+U-j{Fk?l=k20vANOzD+jimq*C(}E zM?_Wc9ebefZ`)Nf>$#o8>2s^+i5I*~S*KNfu0mVCVAb!!Rn}#;(?eVr8Cl)2cjDZ) zXKU{IeP90b+$vhZ<@c*k!iniwm6dwsa=t68-WJcBwdRzz)$D{k{~rp)kufpPcYo}8 zemg|2()iwrJ+EEj?S6PxG_l0{%@qF`!!Uo(M;SBWlQl^b<-N^&rzH8M9k83b!RA*7 z*X0Famy-J@Wb!j-uWmkQXA`w*X6d@e3LoA+y~Y1b;Ro}lta&B&@1*}5)tTSW2@x+W zUv4J(;=AHq>9CnSkt=^p+|yjP(r$X6{NhVfWp~6`vDB6Ab+QXME|@%bWs)as>-?Sr*-9y2GDnMl1ZQ@uF7$iC%k zn7``Ua@SiEowvMc?&NPdIDh}IKk66rx2)fI_0MOHwM}h_6$|96%D*@S)~UUCF12^v z;e{%D3=*P%2@byS(j#Z*5AQ>=+j2u5>AzdVc>mZ%>1~d8UH{~2sc+-l(tPxu5SLf} ztxb(`e3R1kkG@%}^KITc;hsGW4yI*O%scl)-HGF~Jk-orbbpU5Uz;z(e3OG+4m-^f zw+5xXc3ZGy$&x(DjQrFiQ~E#0?W>X8w{PEe#~(|}E-*;8ExP;UJkR3hGLCVcv6dvO&)C5_8UdrNQP&*VY{EI^9^2?PsrgZIzPl z|4;t!4l~RDum5(AbzhtH-~aPf)K8vtRcYZ6x~{Nj$-B~(%Yu#uT?tCP`tQoRSFV{` zw`OhKddq&T?p5xx%wY6er&T~rs z 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 diff --git a/doc/workflow/groups/new_group_form.png b/doc/workflow/groups/new_group_form.png deleted file mode 100644 index bf992c40bc2b08fc1d70783552871480a263bedb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106491 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 diff --git a/doc/workflow/groups/override_access_level.png b/doc/workflow/groups/override_access_level.png deleted file mode 100644 index f4225a63679324d1d6c4a1093163a8b0b2bd67c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157193 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%0D*aef+02awh+pKi4n#{9AD1 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 diff --git a/doc/workflow/groups/project_members_via_group.png b/doc/workflow/groups/project_members_via_group.png deleted file mode 100644 index b13cb1cfd9528a501d2ee2a6802f77ed365fadb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151339 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%0D*aef+02awh+pKi4n#{9AD1 zTiKT@E7tvcz5CK~xxWkTO!mzFxchZ`@VhJTkN@@K{`cJZmGIkjj=!ECdv4Olxgq`g z)$j7Z_R7uL=@oCac&=eq#{Eg+U#od9O_8sQYmN;0aryg;gZBR-_OJY;d++njZ)sa6 ze%i%oIEaY^vJnQWp>nj)2OxMrJ zxbgJA+wQv3scV<#q<((hUfq@TcJkcpFz>a$q86CE%RFf|&F{pOm5==c-5(v(^$XvB zwLkOZAyKWjhCaO(_l$Sn;+`73SaP22?CCEyri*9&-S+p^-jd#vRx6!Pt8M$^X1(=d z^sNmW1D2PZGc~dF-*PchUTXQaZ(19k_AR}&>sx~t?~G+ne{ad%&AM>)x#DFR$HSAi zW~D1XNvN@Te?NDBlf(txxbHh_7K=p*Y`c2EQ0m4^jcn~+*`1;Od$vVId$F%lc;%&> zIxDvz|4K*Td=2;KYy7P04`pWMO%meH6OX#}d`+R4%rl|e$Nu%KnX7uuZ=J0F&o=+f zd3&eqOj~#@M>|w{nTB(xFnj_=4{Plo6ByCx2?V0U3MeI z<(x{*$*iU4))sHgiJ!Nt{I$&4BK@2F7k}(<*z0T0og}?{&mI?6-OXEzf^Dw(9MuR` z*4yKz%R zi|MoJtDGyV{%$t^{y@z0O?=k>S3hD_s;*zZvV8yb=k~fc)<2wb`#Ddn!5OAEQ)h22 z_$T$0&nEiuo1-nKW@kR!G=1yYx~m0F?-r)b-n|*U`OCqv#J!<2`@)BZhgZ*UU$_6? zuP>)Ecl?X-mT8a>G-Q1K)42N6PxHgmX06Cc5f&FedvVsJPa1X?N^eN;ZsVW)=5}u3 zvZU&|O`X-vIghTdTYG!z-6b<`JvY6!kNNl1izd;QKi97HQ+~VY_pdcQ%d#@PwWdYw zzG?P3`|qXFSB6P*e1BLikhMO2rS?O>+nH8}!{%=AEPwX!`C!g@rEyy{abi~@`>kRh4s$woSt^XD> z^IKL{crN0xle1=2KJ|g~%W_w|olTlI~<->m(X!P9<+b+eyLY>x@seR<=Vr!P~kct2hK_-cezlZ^j{FQ%68_}WsDA1(g29acZyHA~I> z&M8^hQRnc3J@6Qtbk&EuZc7sW@8P|4J8!q{r2MU|CVTepe!tK9SAy*3(u1uER%Mamvu<9W|L@E4#ggaG zZ20=G`u~Q9b{2g1)QrA(?5!=S@&5Iw=ui5?;^Te0ey|Ik@Vm6kclN5n&t{qYIV+F< z@N{=>=j)yJGh$cC%3t5!uJ*6{H2I>=H(@^u#i%sqXr1i`-z4&f89$bt&2l=J(=OVj zF6!i&j(Z}rv_nN+UlGx~y)kI*12di8tduAQ-g&*=+Y>~s`gXX8o6KLmGhgr0Emh;3 z=w;mNW-s{mapCh`(-~pEv!YJcI8VLi_p{ZmE^d#GOUr>96=xM)v$_4RbXWzK&0e)x z^37Gt{kL*1PjhMh9x|QNar>G+-BiunkNj9;0)sWP7CW3>RlZz#(khRgHuF*=9~FlL zmzHII`d@c3&Eo&PM+dJ>X1#R8ds41kr+?WrrCexuUvDw z8oDp4@C|G8D!U!xzx{4(YV+Dsc9n6f{mNwC)5k0p9)0y-(cc}5o!et{Bc;!`Yz<8P zwC07nd`Q-vJ*8LKMZDjz9hMM_sQo#!w?k=Fo20Y;WmY zmE#*9)244}Dxco{YtCxEtlYmaU0bHhsUU>6LbIn8=&l zS@WY~8|PhfH{{#+{HmJJsaEau*Gq3|FD?{6nY}9~O7hf7x$SLBOHKBvP04)PBfeFq z?s-`5+R*u%OWrNGu|MYb(t{5J?*99^uXw)nz4yF7<1-Izd3|8Eq_TB+b8uX?(!Btl zqPw-?-iQBVwDUGPHF%bS)?zH0xtc{!S}DoW=JMvHla3pA*iX5AiGS(Qr>~5@`0#F8 zDtEu4a@yZj71LR3qi@_g7bKNf7=eEADs)~nCni_<@y zIb##ewRtmN)b6EW^S^e_em*7p_q89>x4kp}`_V%BpTiNqigoVCJ8f*{+1gxtbpBu5 z{Hi0zYBnjB{xG#Z;$mA@>+jPwL((Y!`R@CF^R^sexo@lV%}Msn4*n(gmi=~)&9S&& zyZ%#WpG=mr&m*fmGd2aiooBv2Sa#~+(T8G18}EFb{3oJ{=l}BRzMK;^mp-iK=s*Yw-0e4P5ca;DY1^;3%uY)rl>5%Q+QOufuZx|wb6s=4vD0h-1WCdAkMd>Xi5 z+IGP;zGvEx6zMEzh`sh+)%ASmt}U&xKlGa4*HzBjBrkCzNi8QXE^bQ< z@?bY#YX1Ch9DcHCU4D+> z`MlNl>TeY(_3LR?=@rMXI6h6K zRp)Kdu-@GKvU+vc+C`>)6`751v)AoBc6ISn^$6+C(g`#E)<%RF#|Xdby{ckmEt36t zmu}YWt$SH}9~C5h+}3+*-+F~vnKI!TS3WKMwsDi1bc**PsjUI~&T7T&FIaiyqsv_5 zg_D>4{h7H|_kMo9v~P^IfoQbFo&OJlr|0}Xlwv>qOgGb!+WO57=i~4CYuA;|^!t;z z=l|QO%QStjUCI@ex}#h8YPE*g`^Md3qVB($gGDEV!w!4ewA1gh5QU2V? zE9HChmei}*U46U#_pK9Rle=c?Utd%?S@&0MqRC~;N0rs@vNLP?o`gjAR>s`C)_!Bn zR#8i-o0|Ji&C9%b=5B^hdX@ClTl-F@$=~ko%xKg6<|}sg606hin<0YVq)db3^h&E< zZt_%KqtA7QAge2|xVbfK$>FtT>EAl3mz1=RZs+*lx_k)3@Hrupd z&oTalV?|n1GyZn%&APll+s0d>P&u0I{MOxf?jq-{ z?ZV}As%{3$@Q8q?#KF^nkQwrd*&HP=FS+{2&9N?D=hiP5dz#CJWA2N2Tc(-l{jlA2 zoV$ZvV6}p3-h+)CpI*pqN$+XiR<=RcYt7kjua7XQf8Vakke(S@nO~ZFUyDmbSX!d^ zpla51>Hn|h+)h-R5PGZl#BAgA)o)imf3YZ!by>AT{+-=pM}zL&GvbZ*pL!d)OKH1j%Hi5&b}p|r z3jA`lpBvM@>A1ViJeKp1qmMk^@bK4-#6@>LJw3hneM+x{q0%k!{lD+NFS!~T?)q0D zZd1xhA;radA5C8ci0@uvxUI0^*6)73O8v=Bp|u_IHWfcs>|OY1Pm0{U$)~f~r^iSw z_pF_MAbUmM>#Nh{0{gRLCwzuD#8aLlO z$fI-r;=EtdGHhJ4r+dylen5r6^VF^FH3~fphBhS|yiYwSleX*F8@s)=?{($9)Bi3S zUfX8*bV~3d$<1eaj*3~$+m-)?-!3(uUyk|yS4Ix`7=Fvt@9HxTJwNc2SHkS%Z}&GV z-q$)G^Gv_Dr}APW=l!QoKC(vN)6=y3`R{|#t|uFx|5FQ2dnlxk7N)y->c{p5Q+E5! z-L3FS3c&#d`;m`@RSEi&sXA_-bAcWm!G}z$&o{$>+RPsU#@SM%dOFCA6v1t`0DGb zx=-`J{C4LM@Se-wH|?*~vmL>I>^8>y-lls&zAo3%f3{%G=29j_tH6d%js{| zZ)w_J-hXzwojG6464m~@3n!o38SUL=XzC_x8oF42r*nP98}VH_`4irm&b_hRWAC;7 zLfmHlclX$BiuO)uwVmxNaaHHit(o-~%9nesef*VqRmkhlne*j#Kb46sJD#$; z`fdwaf9C!Qp~HJK&YR`l5!~Bq;nV+W)l~6ymp7GuOWU(j_v{75d4FdmUOrSERrY$% z&TV_VI`2NnF|NOU<8;rttYF(X{u|w^oZd#*MxQ^kZsyIH?X0V>t&2AKUG-3V^OlR# z9v^sLIy;vot$f4Qy-S^DAKjC(`7h7uX*C*m_5@mYt%{47nzME5LE|f{y_2@2Yzy}9 zR)0U^e^c6xOUB0YYR_Ct-S*k{t@E~9ylIzLCCx7rz4>$dtmw&|t3y|$+)tZ*_N-ve zX0BC7*-h%-oyxEmy~X|}Y}VR$Wx_WVBIo-VOr2!1b@4qDZ0_yeCq!^mR}so@Wa&1 zCMECrmdk$KpKdIWttqO%dp_m&7Vp>&E4QnK$5z>--j8`_b#l|^nCqusIGpSE{`fy+ z?vkEA3!kj~)gHQz^P&8-UxwjcZ>KN^%iovvxavLa^^=<`-(;}KT3@^GW*{-A=7K~9nJI>GJweZL>GIbL0|Yd+t+^oe513&E1KxzTAF z!e5e|kLT|2eRbeFbEi>V=-#^>w>}z`p7`xH^Bc#XT|Chb9@Z}PIUs2J{32UrirFZu{nDEm*KaT9 z;fwoLXWbTf_}lsK_P^&?O}VRo>dNxGP5*zquz3@3{I83ffVdLB{Lby&zON=Jc_($w z+wMHetM=EI&OZ;8%l6p3xVd?G#P=Cx7t|fj{d4O7TJcIb-+oeh*)^4T^OH3}$Ae4$ zeqHXORFiYta`@$Ijj&rg)ftxyrk9-NDCC z_g!69`=wLA|LW4~ypxYwe{J2pZ_UB`e>Ux!d)aSy{0_(Ox_?%Gv6lq*V1ksp5!eryMEh$v2OdX7fNcAHk_TY zHR)&H(OLFan|7If-W2$+;BVQ>&A*OKe|N1k{M-fpc~xPH-^;G|wY}}~yEF2d%Z0_Y zxeJeU@Bf?n_xRH3E8p%-Hm&{6z3qxq@1F0i=C6XSVjoxEyd>Uizw~`g<)pRUb<_Uc z-+BA%$5qDPnZNg6XD+R|m45KdO0jGE6lXoXx#H!6FMs#_46*(7E5G#VN%7UWJnifL zo(ukUpa1*1UAM0MxOC!M*6e*>Z0+PH9eeWBYi<0_;Iq}do7dmjb;hJ<_scnkyTAU? z&VO<8Yrae9r`_|GY-Hx;*FI`o)cxh!m*+W06IXPy%`2Vt_sYp7cl|EUtk(YWY0=AB zGTc|UT$g-xr)}n`Z*F_D%yLtXr>U85dTepb)M(1L_{E#%RwY04xt&z_yD@#m+`9o= zt$*vhtuI@(%+}UY%p@~k{+4y*H>cRF{QT#e!!vjO+;Jz&@7=}4y>}&KJ8m0QuF^mC zYQ^UBQj5};pS%90eqH|?)0cKpcdfPs{4W$=@#Lsxl)>A~F#gUJ*Ci)kQM-Ok==L73 zsWWY_bV^0HoqNIqdkyP)Hr ze@xK~USyj8b7|$I2@8Yef7)sqvd??@cjxuba?T%SFqO^tSbZTaBA|V3c=e3?sL{Gi=6rD*7EMOv#|@VvU^>reh~2W<%Nj# z=jSbTJnXijcKyOvyYr{TZLhK^o^O-4hD%(>Xnx1z8!m^LdrOY3Tx?Q%N_*D7Q?E{3 z@97b<`ZWxdH&1t`0p`T7wkW}ASr$GV_Q{)6MX6iem~@|w~(sfvEY|d`rIsR z_scFLwoS$^`^m4U4Lox45nJ44b2hngZMISTe)#Qy#eB`PXP*2}TO4_H!J2ii%{*e+ zr9q2ikA|C_3}&}nd0oBs)yn0oe*4_yH!1lz`GLvThnpw1U-%MIcwD!E4Qnz*Q&d1Fqdpr`Ff6U~T7k}b=>p&y(TyXpL~v;TKS@l;2B{`TMX@9FZDI~?cV39J39XEy(B z>&%CN_51I**=GJs`}DRla zFDE5#i*cQ3v}yLOUlE;IDR0-7OuYKk)m1jK>s6xY*|^TXEn0`KrTA?P&(nACNivt% zdc4&#G5^+E=iZlpR&NiCQ`;1`XYK9TmjdqewKlBvFD!rCoa=AD?5XUrtV0{hw(2aJ zompiln)&ViybGtMDSw%`ac|bkt0GBjvU9F`oR~WO#`W6GNprL-9|}KAc)s$~F+sT# z+D4nQ-!8u;c4_(|yPK6dyI-+w*cSHpZ}-1VR-)2`BN<=tn0iWb$)v%P8(CMdu8@jhGY8wcC}78=iv^w-mS&Q%eHQdFUa3!x6}WKlU3Q)ou{6%_((_p4Vpc5&&5a9+vGOZ zDr;u{KX*cZ-fi1!4zE(*2y}lm`e-<Wzp6*kRcz%S>Z<=IDjvd1U!yOvI^AEbeDtfc< z{DQ{w37-$l=ihcha5ewV+BZty8YlQzp0A zru=v#UG?M5zRPA`A2`3*yoTB4lip%GtGvlJHtKIasI@b9+LUHC8}0h>Zrg+E*f$UP zf5oxaesJu!`H{CtRb8R!$e$brJD1uo9*S=+iJ9%?_q?;gJ2vIRUcOxC8;*W6ZC)jP(%>|ZA-bl%D@Tzz%ss(R10%eF1?@U`4u`X=7-&)qTh;mZ)MC5;mn6F?{unL!W_dI8^|oaD z^QUsxH>z)0D|dL^?$UR`RjIK%i+-MH+Pi0SKF8}NiFaSU*lD-9|8nBnPiy8#%`slH ze`EW%O`A`JK6zDOntpJWtoU($-q!5J6-mMHeyszR9yIij7#s#_+0e7y?`oX`Ex32KtOaJ<)%gg<@ANacJg>~q==5-Y zxPDQcL-L>M=X>F|RKGdwX)%ixx3dejO>Jhsdc1t*@|FFk;kDZ9~@t?3;*Kr%URsa`=zG2eckOA|9J=f>n|KH=ZpGrLh)B` z&jY1hp7$p%W*3{c{EgkDO^)-beoxuR?YHFIa$Y`ziV43PW#m$8PHbi1aZLO4hIxDQ zpLx~qI=|e}>z=&Z_RRu*u|7qc{QI?Ka=912KlxW4edV~=k!X!+TNl{b$#(zsx4x0Q z|H8ECFBkuoGp*~WuQ~JXR`&XGku ztuW?!Zq7M@zhxI!&)UB%;Q#Lrno{?4|N7j0{465s@Y*jszn(66)@7+Ql)o~}xMe(qGYb>N+nWA_c?{{F2#9>c+l(d4_A z%25%+u>GFjpY~sJ-HIz_O8xgd7TRH55z`{Uo_b$KEJ;*uv%*&kSEDqh`M)OI{{EwT zdt=}8i{7U;y2iB4;QrQmuwqV^)r~fPFP)RgUU}-K{|=k)z460AcJq#jm+kfmx}>cP z;x|gRzbSs*wckQY^X;-@-7@Ai242UcZRNeQ{@cskT-bE@Mux}ovhKo{Z?CM}R=maW zQI>PQ@@0X9ymO@(0-=YsokjVz+wJdO)~PYcG^z2 z=8ygJAe~#*s$|8z_4nF-x7+OtP_w=AZ@FErt*Lu{&+6*7$6i0@zU}>5nEO!HaNgwmZkFzr-9Kduzr^40 zXk)yxF`D6J{0?rX%P2dWKy`R>SA+fMYMv9xTuY89cbE#CUZMZ5`Oaenx%2~ShC)A{ zblU!Ci#<`=U;3xLV#@8~=D!})7RB3qbDSCBJ=-jIRkHnuJMR83+mEm9D6FhG{(ElE z|A6-QCaRC^KXiCM5@D1&zVWG-_L9pseQH3TW(%p)`qsCUA(dC>nC5y z*7)$ciudJ?x5@MVX*VCaC&}KhsrmV)lvhUAzZV4^|Li%}O>R%}@m~q5@1K@!yLakP zE4OlF_U~Ntd;x_gJP!KC6*m;#IM_9u{H@SBori7F>4u~f?QT>)KG=9n=XT=ZHrKkH`8OK($gvx+-<+MlPx5A>?b9cpm}NY+xH?Rn z%=1;@&o{eCL2l1xZ+EWsOJlkBbJvpx2b-03E-u#p@pRiAHg=VN52A~IN1B?QP%d9& zmpkDQyZZ6gDZID)lxrE(E50z-|M+=ufn)QcUpJik_NK&EJUHC+{L14et@bxkn`P>c zOURiiRNQFU!+ZbziyiOpiGLTbO}WSR)Bz)g;AQ@vdVvoX?1udP#RBplX7Cp>pI83= zqxrb53}=6;g8wnK4No_6+$vDI)*!d?xNM*6pX0ZW@tb`=efzL@l9JD?lxzBhlKYlF zF_eGxz}-mBDYoedx0p`HkF`--yGjnQ%E)kk$vFSm{)Q79ztg-UhijYN*G%YaIdXBv zm6wc3uPSSg3tG?czWHG3;w5rLr@pe*DjyED;(eL;e8*(#%K^@wvgemCGyJttG-cnx z?>3r&CPB|9FS~uAIQINv_jw1*G*i#-?pvNW`BTI4`E|c$zX@Q|Ywla1&wPSi=rq5; zm6VMiw{APfUCGAui)Y=cg8^q3&-?6Ad*Q%$t0i_T&a`WsPgvW(;W4|g)r}?lt{>!o zuDtlo+oBDH4qsnfbY_XJy;T=-@ZZDk+uxffOgZrB)z#IDODFv072S0sbunM+iQhf; z_tO3EieF#MH=}Gb>zSELdGFn5KHsLh{k_CPdv%^~jCK#Dzula(;_;JQ_285#cb_lm zX)rgQWqGooXyN`XZ`CDA?&`m4=6C$tD{UV3_;IZRe{DYhzW3Izn%ch`2W_gq^0D^i zo|LY=hYlTj!M!qW{@&f61yzx`Wa zo%sK{Om+fO>tFf4`abnz%*VYg{vG~#|NQJaxu-SX_zwP(O zfBqeRj(?8xpMB>q7yK80_g_*v=ixtloBxIUg*Nm4TipNf@u!$>RKaVZx$S@MO*6`M zda*H3E!F3j@%GOblJ{6GbiY}v-unF8-#zWJ(^X$5u*=%BdBpn7$`QBCaai~K?IQ1c zx1HxrpDyluLfP+#(X2c3H&)i>Pd6&<}96PM<_I8YoL zbbrqKRAE;Z`6m9Q%RJ+jO!&1vO=YQ9)+ulbm7D1G>16eWYd?ERo>#xJIw@jnRx!`r zUQ)zun$GTd%j3!y)Czuly-b=n?H-ST$BmafYGpRfb9x_W8JTfd&gRc5ne+bZ~Fv0;llbQ=bj&EpTw^5ZK806O2sQi z5Br-6{&F&LW%e7``~OwgX*Rn{+H)M6v}@jV*oBPYRboC*eRv;WHC+7p#a z1b#PtEt+KZk#Ww0K=Gp4Qzq{8&1aYW#dSY->9xiCCv5Mvt34`bbDU3lN~W;v8%5=# zZKvxKRDao7JkwbyLwzv3t#?=iXTj(%1xgj{&$oT9xAPFXoY{-2^$y4F_;=kVz9CrXc){QP_m(^5Q_dK~NjT^DJ^Um8?*HMh_A&o0 z`3w3QJpNi8wY>Usj=9DDebMv(a|jr(7Q4Uj%4d6q*wbbnr57`-DR}cL~iBQw@V&hy_T`#$=AF4 zmS6FD_BtYQ!;iD#&D{st4yG?K)Hv~5Tt?DCK+~v1!lZ8VqvlSl4>bZoX~_(Zb_Y%* zb4wmcI4oDDkk4Of^gi`X@Nssvnu;ss^09vRW6uBWmD*T;#q-tT(~S?xCInBv^7eB5 zle&Z*x?fhDX6)|!{r2l#xzvs+XG>+J?~A_?PkE!BCQ@x%@kCbp){_7G?oX)Pzrl09 zVm`a&zMub=%T;PzRbS9<$U;O;{fxm9^|7^VT-|kt)>EnX?HvEk6`t?1|=HEfxH~)XQX?^{{|Jz>X zzs&uIKlq>jFZjoQy?(zs=k@=Oi~q~N`+x7}^Zfh2J3;tH?{--^@ zV)Cwe_M7GN{yg{iW*_mGyYxe=(Y_02KiM=SCx6+qJn;IP_+~b#4YBcmD?Z4~y=!&$ znvd~H_j^mHo@zYn*7aS;G#Mi>ttYvv(?(qXfj~KrFdNJvHnP&2Q5xL45l^rkN zDil{5z2M}J4f@4WxqHgQi()IcJI>?%l%SRRr)>U;*XjyiCTy&ff8cm!ac+l*tj5aM zwZ5;E%71&tu76*9K>mLCk{_?to!?wk&*!)MwQu43vJ0*Lr=FQ*^4qQ4-n;+gzJ&Q@ zlWLduZSP)}{9v0#_3am}f8~?kTQrv5`2TSSv#`CHr2P}g#See<=S%&G;5}Y{mO0?l zox>4{JdONMp39y(VUa)amxS_pwpLKi{QXm{Qa9zzkDoIOA6-BG#8klU@rm;ub%L3M-%^(8-Z?YWlJ9Z;QwB47bn3V zVDY~lWMunu`*Z9u)qj6Z&2EpMZ|Se#9k=|U;}!1f|3CaWAMr!s&VSoaCzSQ0!?)jj z#u$I8WcGOmw`pgVUtZgv9;#eax#`W%D?N-sSKeJR?|E>l z=f39~z3sS!ikluUd1iiQ&L4>*bN>8Ub~AsD=flO_e7oZAUvy*N_d4P5XHVJfopZh^ zUjMr1vu5#Rx0zKrH(caDb#I^F60065FIQx?{qfhynntI#Ouy3VzhB|Kyk;3^&Z2(* z2am1h?b1EzjZ$p)Etn~ zIsC7Gy=sr_hmRkG5Cxe{25>rew3@+;246AKTyg-}SQ zU}(PKYwpPd1xE8%@qY=JBww5q7xb*=x$5b8$Ik^`{KzMy&V1nO)8OV^FAf&hPG7!k z-Sku6H=Vv6TlsWq`mbK&jGxZk@fw=S?SGoOcpfn{KDUY~`K!`pv+}um#FLyjwWV_W zwiDPRJY%1!XTAE_ENFBhx6tvqBj=&8O|m5$8Tmhbv*F<4mo+Pq;ott4KP67ywql!dUKTooKyQ^0DJW&W>s(nY6k6xsY~J67wn_O;#a zIb|7#{~k8ysGhLh@n-6lmqtO~PnT|Z`YrhDhW0b&`jdnB>lNOcuRNV`|LflUQxxA! z{-P`qjxga$BktEKm2ok=k4QMnHK+# zUynFvE2Cb=_bItMx#R5VB@h3|ulqkId11j{P!8bxbLT+i)$`&H|LGr7y7T|~zHKeP z{}=q1pZ7mIN#^3wEB^}Di_ZJ+^r!vxa{Kc}W+&v||L8xfQg?Ee)g=W(^=~E8dFnr> zEDV`9JvsA_e4N#){`r39y6c~1s;{+3QY*EYKkL{=txwinR(m2b>9||b+vG13owu~+ zZh!rD5p(7KTKj{``M%aVpMTr(SN@xQvZBoYId+FXzJJcU;lZ4z&kc@o%sy>7{fA|{ zjZukZy_24^eWvo9|Jm{1l{UPYpX^~d=l|pCrh>oy@eD;ehIR^ln+yK-tMmP^?ELJV zb?<%i0Uk?~ps`?=-x;lK5N z_8hKd-BBU)?62JanFfi6?wXlRl3%C%;fVA6{4+csY&1Wq=&yWVdFhu~(>}e=2^&98 zO8q3TYr^#4%S&{EeEx_B$#2vqN z#}B@53`+U1a<)qSg0G-rot^*phYQUb)$@$rsyzKLXHV?)@4LPnd~I?5waV!@c{%A8 z-R=PYka zWA4{Fs(Zdr{oQW!=KqHOlFD|+B-;IY#E*$cKfYL6vuCH=%6?n_i;a_#1?I`~zi_mB zx47x==j20AYci+xsl_+$L%q_f}WCr|B)xA>Rc#b^7y)508(Y ze}3|D*B<$3ncy6OUF-U7=KMeWSN?H>;lsy@G5-($t$$T&@%4`5%#Tg;;ulLgpEN2; zS@Q6o{+<7O```V)G4o{aVMR|p?@#xFe}1o;@MFV)xQ%(o6JOR|m>RV$XXVw^;oV>U zy1c($w|D-xz!%=|<61z28t^VNWHajH&I8W&zxT~D&zIYKy0V~SbPJwA8PmkcJ@XAm46T3yuNT5T@JEFj{|vAZU9L2I%dxV zsCFz$Am`qItmfxqQuO$9@aFY}%Zc#h0zRghr525X0v0|jr%s;^joK9NJL`#-vG!|& z?5knc6(1HznP!E|zUi=X&60>-sqj^WZhcbbeD5u!8nik<)EAyVu{o7tYO5tt9zdvwxP*C{r&warjC1or3ii)lff8j9L?E&&kiXJiYMve6zET2BjUYU7WrdPVUO>fr+o4=o?@4t2>(|GFCyC%7J zo2O1)rK2C3nmW_&_etr}lS?O;T;Kjb`f~cdb!*goU-SM7nZU6ez~}M{nZbN%~PkA2BfmbZE%xXUGZLi@v&J?`a=CazkZ$jBO!I77r)K&=BdBm zOut&0HK}^tsZ+)#>Gx{>e&gSN{gbHltF_WBjE%~mWZ%!Sc0n|EqtI-tJA1Rs|9;J{ zzqoe$omK1aeoXD1`>pHU@1M=Lw(i#8`W1GA=YiPSV$%wTcwRY^0A{u?+h_OZojTb$ zz5B;A^L?wPYKLW9eB?Uo|FYcf`s#Bt&0Ksh?f1F&rB^;po&9R7APZyTVOIr~PJZ!~3#PL*y4~8Fzn+Wh zR@T3!Rw=WR4d-lg?r6!mE4N>yX$iLtQ%3s{{H&fz3sIA zZlBxRa<8AhyzKS){{L6&Cf)S7|MPwRN?*suyIV{y9dhl~`Jj_~Ys=FO)3V({yGjA4}Dc@k)b5^hSR_>)YLZ;_x&Ze<%_j=7P{B*_i z%a4M!ZvGE{xj-kNrnBq2&61uuiWhIsz0+J>`u6Jc*XyePnXm0Vz{4TK$@K7ayn9pF zg|)2=ulfD!OQ-4Wcu-^e{m*ADUERy`Y^%Rq{$0OlWBQzR^Z$Qw-}UB__hN;jT?~b~ z$$<+e-rAPC`n3LTm;F2b|Ib`-)~fEu!}yhJ)|{#H3S4(`^85=YmHn?ppANsWR>}e? zHDeS=_gp!6q^&$=S}xbtPM^~1T9mu8BfoQ?S}*3y&r z_TRW9^m}#n#EG^VvnuZ_xw%s;^!o(2b$<5A9bD7*taQE2XY!zY z9UG5r;M>{Ws%?k44kvmu-+Esc*!XpM^p*K{tG8vnl$O4i{`>3Q{p?Nc7?FI~vEgK} z&fyyZZ}097KYv@ln0c?gpoX=9X_Q}+s@e=kpN1W4GO9!j@~-TNypowF=ziLB#hIo9 z{%(7E&TQM}S5baCJ)F7t!-Bu3cD<plHu3J_e(b0ecSljH0{fbj`B4NGIP2G`mIuznB_#Qx87g7elAP4 z--P3? zclO_F=3S2$O1}G5ZS}VB=GtG!dYQNWDBu3dUd~rs<=oY++wU*bc3b`^VBOc^e+zfN z|1&qtoulNMZT*jVZW#;hs=sbmj_Y5TY`UrY%dPIg%^H=k0^Tl?5oju!b@%^>6 z*7Mq|pyB;tz1xC2({A0`Q@FRbJ8^H+*1W}fvAeXFXI^&R9l9+%J6z}TwnKZh^d{G8 zEZ=JN?agXF-TN!6S8(OVZSt5pmu*Gx=N`7dYj13K%wKzB^}6O?n)?&4T9s*OX}#HJ zaCjeY{^s>kTY^{SYKyI2le^#fSMc(Q$%ib=-iC*Tt$386oSNDae_3|&U7?;mk2yZX zT;E$=Ui$XdR;vuJf|9$tN~1QX^=fHr_pkQAYHT zMM&;>6Z`u6FBwW#hpjcK_>f?lf6pdrRnfmcKW}Z#zFzq5?fz>usXwJs%_LLg=R~hN z78$!p@`#RQ;fDpbhvm-nK2~S%o;vaB?WRL}b3MCso^IQ7@|u!d*jo$7lnzymS=;_~ zUG0pw*%0FzeESsNo`AK|MvRS%9T$YHd6>b|x=TKW<;RMc|BTF~Czp6$WlYlhRJZW? zqxN$PUoM!dp(@w4qhoVm|Jy~}`d7Aur)6EdbhSP6^@X*v6W#V}e>qXEAMUL+_05LJ zo!na&ui5#FM{0?luGQ;J|Nl(1t+=x;->z~=<9_8&k2Xv>Ui+{5*OAD%zSo-;dW&V; ze5O?T!r0}nwfW@^@BJ&P%kHkS{`YD9_s<)wg4YMF)7zb~!1MYG|IFsKJ9oYO{oh}> zO8CO|_BT(tw^Y^Wk28+$E-vnQ_n(QbF?MYjFY z*S|a~KQDhZ-PGH0Wm(C#xaWMDCxWh?Z{=J0l8bfM-+%I%G3kCc-(24rwPT%!>~Ef{ z6XbMFo;*7L^5Hb!FB_}p_iDSOe=Dde|KcPC-V1Uso8!&>?f%|k=feXpGCqA~cKKUw z^p@1iY+v7+2jt!^U9sPK>Tc8jQzNxP+M>!{ENWUKlpDJ}^7OOZu$Lb;Uwtd!c>5Qx zeCLv&YP0;XO2_z8BYP>8>We#*uUl$9dfe)|x;0Bnc)0G>m6dHPdv_;O|GwEu=XSntZ|5|XFR9(- zVDRIvi`<@XU*>+$RabXkK0hz}^R45r6~Ec0rUi)(N$BJ8H+$lCZ3%oV zw)MtTv5GXdqRNw#qW%PMaO{a?aT0m>R!RI-sB%D5(2~{be@!SVdL*gE(*8eBerENT ziSARbF6pej@y;pMsIaMMcIaN!)$1hF|E#^yC93`P_Wgfh+~T@Dc?x-Zzk0vAw$;1D z=y{Wq^!EFO+cy>4OqrhaVuvXAm#x;17z$6mdj9q0Z21*iV-BirulJuXeK&HkUGZkW z`cGxP_IY(OeGkv=`f$d=!RBqf-P+yp>t-fezx(|C)whp#O-t@XUW%_Pw>Wlhuhm_( z7i+!+J)HCW(xbCFk1ZVbMEBSIwf}P3JgXpJzxUVM@8g!5%{_myzOO#!eoa~XzRJ7D zukKsB>ig?`%r0%lTi;vw^66{q+9>6)$CP`AHdJ)i72g*Bvipdw!|#v(m;L|!XXYz| zUx$Br+)n?xJl8$NN`oD;9QD9%p2kg^f^?${{CnT3{@yUzZPiNF&eLArThqQ4=|-Bw z`_6u*rGNigfR}UX?rYHv5wEOr)>LijVcuf9tMtN}@MoEKf4zNWc0h05dzQ${GbKMJ zvwd%6$+#5gc6y)H<1_cVmN736UNQZ8M9sWKi`IB86s$eF$?UO_uu%4_Ghz3Q&wCoZ z+FDh^a(vm}Gsnb2HW~`b-RnCa#}(Eu&m_0tE5pZ0s@`wH7fHWa{Cw#}WBJWq69rxD zx&s@eHtb)Brf-x+n4>jy<4a8)7t3ma_fFo2lYFwW$)O_Jmul~ zxV^U`kDI7E?5X`-c6OGjHs3k5HO8CginCr`=4-vKF)59A`VFf?zO#I{+;F@5TJhrq zq3C3b)h{*8X8&kuX)l|r9iP3qWx1C1|65k2{Bk;5AAGQxI(^-$P<0U|CiiBC9p^2i zzBt`|;c|O-dN{A7jS1H?rjtG4=`Vi0UVk|*`v27KPw#a;R3DQ}e+4>osEtQ5WNo{i z`Vphq$9_I&=6`k0djHC~)@8R^7k7Gjb#2YLX=MBF#^Y}WQ-rTd+GKR>Du2DiH@fWV zrpCFCJu8>TtPHM9Ot%-_X|C$vv%7xx_t#Q?PRD2XIF`r${n$9mZs+88|38MFiu$>1 z+mr8CFUYZ8S3j(?hTH|oo!`K7o2ubwqA%kIwq$NgH__wv7b z&R?2!Rd46txZ0YCWp&k`*Z!LP;j@-*^$&F|nV*5aGWQ}yz2z>dZr{6X_PafikK0R* z%kFM?d;M9c@t421^C`Uc|H;c=;>F9acP@U*z4`pU#LXr97Y3hM9ld{}$M*XFTBTWH$+d?M|6krc z-EMLJ-H%+R{Jwv4JSXYbM5u4e7yNqDDtGgY^jF8X-(7CmdF$@E9g*MT?>XB>UwQNW z|L=HJilS*#s~JD=YC{pHJ%z*!fR-S_^w$vtI@nNV+g4s?iO z&uYONyHYpXt`U2=L~!w{=7W;k&bYka$Gj!|dtPqD{xJ1#@>dGvwRTFb=$erxx+1!r z>1}r4*GYHlR_&_#C$sjp==ocxa<7Lsv)$NwD=Xy9?IqjAbg%U>fAn9p`IB|#gAI+R zuJi3RtZkh2?Zv`RyxvObf>$1<_xH!F*S)i}EZ2BTV)CD9X1lL)N?BdG zmhbazTT=Tozxl$q@7lPpfAfCjL)$=&ZSl9xTwJu)`bht^>{rt=-`%F)z)=a zez|_$lJ$DtiKNGKn0|-e2-tdh^&zcCpVs@VUVHA|vbCZ6)~@20JbPv9{eZ6-w|zvb zr)7WJ0F){w{JRKKlx4f!fl3st8T2F znrWaLZyU^Q*7VuRx4v*Y+l{~8jWfAK1S<3u92CwmA7M$oU-eq|_c5QeFE;K86CS+n z5L8x@EeT(1wT)3fXIt*=u=BRxV@fAXP}Mti>QqQXgoJMS!_9O0-G6_5yLkVg~`ikLyD#FYMDP*${K{tbN)_+sE#kC;VJm zHtnp>zYUva&0W9g@A-(IhPRnmS^D@IZ+RZZNjUm4mOU~Vxn5Gq9a<3w~efg_*yI1XfJhw#piY3>lym>!EZbh!X z#Ay5PP}hmxyuZI9Zuz{`IdLQPL#9+BNd*3`RB$$5WVL=^7j<=@#p{f4vuLC#-C zWVdVmjaiWN_TkP8FaE6m8&Y2TkE>VuR%E5YH~ZD+WB&&F?)YdO<-7B(>#w)|b_)er zI&>}e)Sc!_jjDD&R`1k*=dpe1Lj9Xr(E{wgE7?pl?;R66oxj*-np@AGoNxbcS_?O< zS@q?A{mr;C7ePT+7eU7Ii&wm6uQ_9~U1$2Y%%8shvsRs)IZZNq*|OYKE0^WY`nGAy zm7J?rOtw#Padl-CbrBH=XGyKR`P2USz3+#9@7t$yt9w&T|Gqob=WW01%rAbo^SRCU zo#zj}sFpiis-zH>KhNlL|Kp9{;C!cuXoq3So_|tEnDsEku%HduK2N*=CI%IV@%3B z#QZO)T$rb*-EAr%z&ph7z@!aR~M2G8T1;Ue6ZnpO=x^h=|ZnECtH_wmV zX5oJ$s>_u0prb`|)0N-J|7-cC-)Pw+!_x1x<=Z4B+3sl;VYzj$58hsCv;DEF_Sr)B zz>EDX9t|uW3w{cpIDfiz{rvsQ9CPMIr|#2U5NjL#u~E5GRXIRD-~Ir4-fU z%E3$Sg)Vv!5LFN$EWlp!s!yQ*@r^B^EJt3nXq>DL*{(3>oae!1B1c6xEtoK`?(ZM( zjqCZAElY^p5N3Q!rXep-@Wa;Wnb*^1SF2oj!=bS@_Hb)!>%#2o>vsHlwR$V-sj2@3 z4gHfXUTrZ7_ zI0vlR7ni5?{GqK=T+fSVCZ}B%L`UxOtqxrDX}L*9Y|Ngg+HW!{>t20b|0g!4ImK#~ z3iCXrgs|(oGq|tJ{2V6|yX0_Qt754SChuGqoDcBtU{-SWr#e!rW(eTVjiK)crgbH9c! z()@Ew`v1XiZ#^qM9Aw|xUS3$Z(PqPGm){jCw>lTxELg=XV^*W_@B6{ui=>tRr)(;* zi@EO+X&4f7uknr5Wbeq?J&Q6gnm*?>EPHh4=8RmykT~PlqJKPdSo`<96#KC@qMbeM z%hV6cKb)QX{XwknjhD^s_bY^xm47|D7p?s9fRX9cfOR6L=kFC?pBpsm;KYjDhs7Pa z;(Z5|w#P0r>C27Ln^*hpdm{g5*jWJHH6PCSv{bSs{+O}ymjBVhM;93XeEKT0XSb91 zoO>Tnd<{_5zO|ia`}tokIiI_D?=_mA-YP733ytw6tDZa zOmUg}?eZh3&jMzWpUqyrPxaCe)qlMzH;kagB7jQ{b!%zTXQ)3bAPAV?jIg= zjvlW+q8nU)WXp5ABe8!Q_22E}E;c=TXPud+h1Cb?V%91T8H*3hYBm<({6clc`>L}S z?Rm1cwsX=U zrqy0A+gteY!Mjff&KzRvRA2Jm;NqIEQ;Z!Y3{Hqj?%egSbInG!{&US2mhaY^!ufua z{7=iJvkY!re6cnx`zY_k!+MV5OTWm7bOg_IFE9z;Qn$9%dfh#acej{X*^LU$Y&YK3 zvc>)9$;CyC7o6Ae246p=CA9TAn->4sm#33L7y0DG@9NBbZg==k!LBoRFYGjHdKn%1 z;G3a@#L9lgKkdB^FK6|hIBC~;!LMq7DhS3vLQ-*jBmv z+th1$6E#F~Z*Fouz53Uk`vun$dH3JnW%?-Or3PJ-6?wGCk|g`m@uS>6}8qZKk<`(vLHO zS!{gsX8gU8^YhO_ug#jNCA;=kyFYw7J^rBl``zOIf1a=ZaKX9WDJ4Z^nogt=_r6^5 z&%&Qw6#lqJ_8je*9#o7LOL6Ys=-Y?`X}dQ-Ulp{?TDikb2~uj?h|K6$tL z#96nQI$h=G1$Hjl!*TTZlY<&*s=GRJ^>i-VJ89nCend$jtaG`t-Byl`fBy=sIu@MH z(RtMWjOHENx6wyptyv%IOZCKk(oK0@wlAsKTQhcG~Lb&Uu8Z|>BQfE%H0hS zvZ{}7PPac28hd(!P~eVT3qN^B%I?e*zM{U({bQ-D(-WzMTVvmgS-;Zid6W7&Qm`mO zSjgJT{qyFzv#(3~SZ^$sjH{^>^^>(}>u78?G+4&}s4ad`rd8yW-P!BTNBrCA>ab?d zrH}pP*OER8hb!%v?XxGaeZr1sS??w=a86+0+>*wmICr-~bju#emzhaPN^Zu7mmYJl zY~K_RP{1YItSjWjE^w;bf8mBhEq-^Cx6BuMJMD?Qpzb}9l(%;n|L?oC-Sve3?Uvrm zYl1(z)YjklGBx~IwQ$|Gi)%ua5)QMrmR>uMd=ZlL=rf;~b z8g=oNlsU`S7yaKFvwTvXtGrrp?%EpPGG%|wdiUf73qCz$mS25_jivK}=IaehMXK&h zeflXac8>Bt(W74tLruPHTD3pyWX8vj{G3}%m`;7$VDwc$P>?Zo@{byesndk~v?sS+ zym;}`(^V^v@f`cHoU-y0Y z{Y+Y@`MCn8=Pln|b$aE?mx~rT-M__N^yYQ*jzs1MrB=Kjz4sjr`CF3JYaqVC9ScDz3CsG!PC&RPA>UdOn~#cwwb$zSUvlKO7l)i+yxF8R$nvz<$E z(Oq9{gYX)qG@G>_SMC2}HvJX*!Qd^dce={f9m`^0&a1CmX|7))(9bM(e(L+Z4LuBV zvpsir8~kp}cJYdjSM0qZwOv;vcX@}k{L!yTNr(3(PhGzvXU_JedD%9TgA19Gs+L68 zyF9o(%O?AI>c5p!k6+$qV|xA6Io0nry~o#a9scJ3udiNbqut?JNIf^r%|X{k{Pyzw zI&srg^e_2mmvwp{bt`Oqqdk3YZGf@+#eL3ezs(IicA4F*)Aydkk=VM4|K^AmE(%Ww zclmzi;Il1BA(gG37i3EMcQZX?+_hrkrXLo3Ps0u#-y({*I(Z!Wx!u-~4J-*BsLHeY~tFYom+v#GM1ki&W7 zw9&b5Rc-l)S-8%M{SV8OME)@I-7z;mM`mau#8ffVgL9g|MreZUR#IEl{fysy~VivyL!iQjkBNE zeSYrlDM&yy+DUK+FVs} zS9r@B*#~`}E^m^Eon=#QvrF;7e&&=|3mKnVTRf^vJV!4{%=l?Y^%Rz z{0x!Wd+ppknU=3Ri|=mti$7~P)sj8+*251E58t|F>1DChLdbUh~N{i78z|vCIF?I&jk}@Ac~){!Guk4s2tc zm#wpBov%=U?4_57f^7c2;r`T+%U>>;@PF6G@RtqQ?Jv|e{+7CBDPo)2IB~{|h&zSP zV|N5@>6scFb(r7Y#+&8%HLW%a*=7%=q(-k(!m5|DV6} zJx*Jc++#VS#oxOBjQgS>w!;1+Z^G->>oYC)i@5V7@_a%`hftT?p{DZEU`DTHujC3@ z-$`b)2vzS-&U29W-B!iGd3*C#&gOI%`;yz+c~{q8tbciM`r~`nE|0%Ur3O8enX@7A zk^A?!XY!IQn{$b&>vfJmBXQf{WoxHY!HSyS)P6^95NCB!OCzv>ehX)ZihQ&Ed8KSod%XDB}V(oOgYiJ?!scnzep-%+qfuL zZQK7%X`k1%Ru9j6jel&Sv%lsw?ln*e6YJHrQ#=35*Tbjdc;8*6h;J`@7!M~siG199 z&zW8ELTJmb=*Jr)#kO0=iFRaIK9{~CeD~JO0+U>Bv%gaPTOP0D_+-BD&k?ydlM5$Q z`CYZD|01cyy?sxZt7chv{=mFhVN?FH9KP$^a^~ASp_#LHr!G+Z?RC(B zb=AeNb-rf~&Qrg|epqNhY@eKtNfW#ZDqZS^s?$CltKKhjZ%?dWma|vw{vE}}XKoK3IBuL+_oJZs zW>8{CM7s6wFIQ#4ZmNfIztEIEaC*AF_|j!Dy8XTr_ia9XS?F>0o2G(Z-f}aZD~l>@ ztG{iTXc!TH{|Zx*vaag&fOBUz@4q4W&wj^DrGz!Rq9P}DJ`z6P@!^N9bY$1AWnaE5 z*Rc6$qILS~&$V5LpIAq3ndsj2U`Ml>eqbHA4Vb=k$%{2ElK!t17sze;x!l{}`DgtP z)7#~bl;77sHqW+NP+Gd$O)>Na`~QmlX_K7hh8+KXrMbMP26snaw~3$yj5q>#h91o4nDpb zC9blOI_Vw0^W9ls|6`3qkJ^-1&7C81`{@05 z5!&5%Ohf9XI<5UIZOpiF()OOEr?X6&vd`aox3uP)j9B~^J~fw)gkLkyf81@mdxDDa z!M?jnN5cxPM->Z*@n&{ED)v=TyZEc|h1B_)*QGqSez2zPpS^Vc=boe5@AvDOro6s$ zmwV&i3Gb{QEEE4w(!Y1nR@vT%hDuk&p5Oj2W>fx}b5H)7qYBUT?)`crx+L|~A(wwf zh5Z2uT^|n55sj+&ZT~U9u0?jbjpnT*v4!uW=RcZd`@7&%iJ^_v*D2Xwr!!{W@A{j5 zx;5%s>i%`VHuldyuHwL?;=rWa?7+UU`1bPq3U9=Glj=DKWF4>urKyVpYbiEm~~(EckEfu-cHlOl!FHBFFt*P&SC~@`hv!b^LLR(fZ)_cEl zKF1r~-+R|GRW6wRWb^c?{a^C}@;fhURn%U;_UyRu-uBqWIHi>EH03Qtk?vVr*ZX*| zlu38oV~#apTbCziU{F=kF>y~6>$KSW6C`>BzI9DMb7$?0-BD{eUq5{PY`xuwRoyG+ zaKGpioL;`&cZ$2p1tt!S&5ftnHb!mmn>iyO@6(f$W|rYhNuqA8rQ3?9?DKN|`TN(e zEVGGIC7YIc-8aa8_@?OZwI4k-bNPj(mmm4#m#`pc?#lZs3(l2kYHH5f`?&7!ugp*F zUN8UG|9Hr*EBQ4j;rqM08Ctwai*=T=-tS2Go+a4uBdfCD`z!rJNr7Ceuc@~`J(_*g zuTXK7*Q6Y=mBCU+QdMWG&WSt|{6~lTs_U!kr{`Qb>s&9VG1JTSq}h&YUb9J$r?J!t zH-6U5{p~yR>Cv;38-BT@pWW3fQF+pJhEb)`vl=sT(WzHoTsIGUePm7X+MGXo{$9JS zp>fIj$hz3w56)S?+rpQ0bNw~3jnNxEX#cq%TYk#9n)}+HNd=57N2a}b6WK7c|JlQ> z_UB#JtT|=nFjI8Hj;=+{KOXL1|LAT!pJd!F-kZVg69NUBZX`~36rUNckbKzYPWDB! zfA4O(UwF7O{fLWWIM0qRUVm?ODXG+b7Q5#)>F@)i+=mjMGoy7wR9(XMPkuJ*NluxV z-B$yHY_q(bHbSz>i=Kv8|2ncS{^P63>y=$AbF1Y0_q}f1f45Z9>YG%{#c7cd{~F^z zo@f7`y>a;-!T)o2%l_X}DPVOxM#p}q-yu{LWNZrSJ`n1ktNgCEgzw(W z+Q}SUi&Ho5$vC_FONP$LrOG4(lZAcFH|FG4Jh)7ls^(N#54WcB>?u{ME_K z{!sQ}teC=^Rqmm)x}Uzc?cX^w{n(n{DvvKpr$2r;UG7MPpw0J=m))~=Zkv++_s{=_ zk=lAmoNh6SeDfD_#)kj-qRt5FGG=J9OwoOGqmKFExcAYW8f|b2rv&%RR0szO(DpjnKcZN|j!(T@k_`a-L1{ z%CY40tA%FXzV>LvkyQJt75&k*&$BK+lH=SW!_>B5TlM#MFRrbPKFgHl<*?GnMk6sc zn4^Q&sqa$wA=6ahohvVI-_E+`Q_2iWgHPp(+xk9T4f*Ne=XZ@|>)YGg*Bf{4*<+*8 zxNh^@tYoj`I}>kj%bl&9zx?-9F)>-QM>(=|>O}UTf+%i9OBfr<6_PF01!{|d7O&uKe z-nA}x;IR1KC(Eu=*H826+x<7O>J-R5mp(uF*4N;ztc+KfZxp;bd-o43_lFyc`#WX# zeyjNXcDv!HOWx-N)MlSO`s2xEf5X&ADI#Lx4?n8UbD9|GcH{Yjy6l~ACV!di`he{S z%jqc#L!K<1d1F?ldgtV$SH)^Agl|}~UqAm(Q1RhJj!AYl<^H>pc_ZR~+H9U(wK=Nk zjBUHlp~&AM=bzqixBK1W*6~Z~^N&oKQ_>k z{#a{Exobf6PBVRG&6!8j<8Gb!^t-itXU{p+h`pMB&sep&U0NWKXkp8?kiKO(9^Z;lRe~I|MZc9 z@fRgXiW6g*;^1(TeOb09i`G%KVyjiDXRe=g_cc6sHB>45k){Fb!sv_%&I|wSJa*=_ z#{x}`6{hL4ssuMLJ5lc4{rQyk`Za=6tWWJ0%9-b{xNfn{h4YmxVtbxz>!%^m=9pMh>Yni!(mV%a-d;lWY2Q^`%tgze8tI)|^{oJgv&lWS+C_M3Y}33#VND zCc9&UcTvdxqZSJKeCKX)u3tM_=4kmf!;eg$QUNq)!r0DoN8rxgQ`1@x8}xoGah`A_ zdB2xS^12iWA%(_k-VIC-u0?O}^LqBwo>$H;IoB^VeEO-T64y-;vA?A(+lAb;!bA7@ zZ+47{U0QGT=3(*9mdj^LL&C*7#Fn*t7(Vr0^h!w3?)#;>t5dgSi`-B-#w=vP&E$1^ zS|7_CCx^YcC#@!R-`qT3=>(2iIj_cQL&eW9&d)Vdo&-;mb+7yw03Q>nTl@!8WUw?7#=uzRL>hq^s zh-J&Yo7e2JpeEqZiRXt)R35M}i3nLUDlJ~2x`4Cm=z-Vqa@9;fmwz&>yHio~;~~3- zaP*Nj>q;a3*L9Ko@z>V7Cnm1_%beQvs9S%(!E?AKOS>e9nYOII~w6;gclmOIUhLuoJ&wZ-s$8^%M}LsPM!yqBFz>2p2++Q6FB9n zp!53Xl++BaGPU`uT|d0mHS1CLni2JRZdPUy|NDs=x_`u;s!FS#JO5->NX3s^Sz6Jq zXJUmcw3$rI3&VCu>@Z}BiHS|rTYX5m|F0~+eaZX`*7)95?$n3dC5>Hwyzcw*rR1WC zozC3(I*%@DN?*KqG0J^M($n)Cucg{1Z7Q<)^kcHd`jV-A8&&rmw{SOR>TNu20BIJY zk-AL|l{>j@{-$@>KH4`cA;QjPn(HgJ&Yc{Q>yICG5AIsM?pwpj_iVm5qT{y2eE!b2 zBlJ*gien{ok@@YSQ z=*E%f*#KT^(7@uc;Hl6Gk>aSUSKrCp-f~AP<(%h&tHJ?XHmlYzQf3q?&}%%BYi*!W zwb~_0)#<*X(v`am;@kU@)ROqMPJip#_911*%%m+YQ_D6AiD^H7XBu-`tI~5ON8jB$ zyR*3Ohla{I@2s55(b3)|_AxJHN{&;|todTo>OCH87s}|&nzeuHnLYn%gbKbMcphKZ z9lHAZqS%J{YCL8+?^fij_#1ojzF8+&EF2vWI8W8- z{(Bb*Cc#h37FxV775tKS(WGtaPru*uqZX{&lfmlMz3;kFSlExfdoEb6$rP9_zTTgwwG!40AFpUH-0}0+MhTl0_J5k$7q9uD9ug|kc=EZ|MU{PFB2Q)XZI)*W zim!JG-MZ#!NLP-c)~;Cb;gU(m^SVNo-`}2_On+n~uRDjqeWmUmrf9Ek zu}8NRBo?xUt@$S^ZJyWGzumm)*7oCX)KeOFHyH`aRBsRXeOPxX+YEnDXo8&G$nELC z8L!c>bAsuCEznf+;E=$L?f(tt)xEo4sUda_7z+ zl?l?PQes)m&CL$BbsDmO$1LFq0EuBD%cvJ~y(CA{7^jj644fv_Od>+&zqOLspdNu| z0%XR5mmC2ecZRT8@6Ot_`<+OrtJ^1>l=(MMVopzPw&un_x#ZhXr;ZkZvJO(nA-E03 z99uXQKOQSRJ?CIoAwnEO@fHUrOG`^#gX_=rPv<&$#KgqZ{Od4M#S^JQ8ICL&lXtL& zif#4+b)C`5NI3VLnuFrT&7DSe1kBP<$#a}~bj>6Try*S3u$eQ!<4w+@9>}69RjWj=Hry6SBE@v{GJfx@RMJUm(se>Pn`QP_WI z$wubHO`PYOx&0Ox$wyybcl6nl5)sd@KiS$A{r_*0Li@@q2J(<<4b}HD;xYS&n*Tym^>ty~uL5gk zyZgL9#Yxn?jVRf??WQNFo!Q5aIp%LmQ_=m;smU5Ak$H7mamt*HVaFsd zE_Pd_lDXGz{thjk=vT9%L!K4g3zV-~K2Q5--_y?@zrJ!wnXl25f85}UycwUlk8Ixo zw10v*5hmjwy~F4J=Zw z4Q8Fvt(}cgT#dTX+cFM4*tE&0rL8UL{=V8DFBbPtm_I*0nB}XaVr;OGhV!#&E=yEY z6;D2!-n68}S>u$ydr%Y?-;=3~sg*Zo%xIeO#Cd}9u4gU>Y8d9*erFR~?|St`bmGkK5OHYr9)mDigr+ch> zn-w@=ZjZ^w^Llwd-r2>MW^9?8Q+&8GYqRJr7FKili1zxuhU~9{jV7qCXZHPMZmlcW zZC4@b{Vl>&N_|=Fs|RJ7^(QT2_g`8e9Gp`f`1IY>^u4=|M<4jR#Ki3C^FPlYT`7I_ zYudA-%S-Emmel)s9{6>4r`gT(H#c&1Y8w5U^jUn@zb$1dKR3u4tDW>->RR#m>H7;N zwk^DU#a2Ib&#&EfLr$9irtHq@rMYTr4*qjG9r~>KhovHC=A~)E-=uXH3EZxW)Bjtu zj6;a~>ra7#^dGj=Iz_HnOxOXRZ512g0szX5B>T1dA3fj zTa6l{zHg=h$L0S;_P>5I9NWBm)hSoI+a(8!&-=QroK-Nh|3JK+zRAoBKBBJYbYi4G zdd7V+HCnP}-ri%6H}2MN-kuRO(>Uzm{P$}e;vV&T{EOxJ_3P@P6*`m87rnmt#MJJ# z>ACEoy*wx07^5?Dvzxb0*`K{Tazl1(oB#Q>%$}cr^Hl0~ zi%qw)+Zi~^HGOjOWSj6Qm*=~mDruNKgU@2Ngv2&QCONTVXaCj(CA)m(DSC3oecR*J zm8T~v_fI%*V&aUlyGvg@STJ|RYhLT4eUCEx>P%}lr0C^-=9}@@EqaR)_ry6fVkbYn zA64J`vN~I+cti4*#e&;y+cayLwp4HZRKjIfTgZ3m^rQ{S*)n>s!~S2_aNDxqRNu{} z_vXCU#jDqDJATaI>fs-W4=$X$vFRBHUyAsm{2qBO{$+y0|f*^Of$fFmWn>jl7 zPTX2*x$mzgqnBY!7Ay1mSuLE?zcfWhitVc?SG-WI!Nhk|*)W>v$JYZbo`olVRSHh( zTlL|sVbQO(JCxJ}B0t6_K0FrF(pKHEtYcNZFk9c;rj9>nf9N@Ou5R3*IJxljR%XW4 zW><6{N7wx67L$Co_m>u1-)>gnUGvkTFLuN>*x%INSmH15GtFvidFt^=8#Dg#dt8?4 z=B!<}i}AW=^vTHYt-i9~qzxI4o4<27pc-8GI91T0&dBa}hUKZn#~*#m{(b0d4MY5% z&#GE&=Z>r`+IP?F$2F%4p1m@2`*IJ=no<;FzIncC^sf)<>92)!qBaXJJ5ji!`jf-H z^bPAx)MchWRZ(_5Dr_Y+xxKtC%GhCNpYyt-C(i!f`0s2GD&AMuDC!X58&+>$QMJkN8rox%OX zYxDVueHjMY;zk8bd9&Bp#fQz;tM6XQnYqhsrY6gD|DBA}kFsPw{PFw_hsI^&_`f^Y zs!C^GNZwHsrL%0wtH-g^MElEAeGCGQu}shWCUBif{>i`3%xpbP`L7GZvb)91Q+&+5e_e0w7A}1_ zuj-%wZpK10GyR;&<%OjaAGUE69NAg%^}q~o=ZX6s8gO}qGA*lmtZgIE&l=66%-F>LbMmhP&oiw2y7Hg@vwf(Wd~RpHo{QfHjytwnC(DINPd}BHXSDA}mL;E9 z>!WA(Jx7-H>po12ORCHa5;iTLS(5-+$uJ9_J#H?{Bo7bHKD2vJ{mp?LfA*gFNm zYH?N1!;b9#l%Hebo^Y+Z-sN4o|AWcB>H^oc>wgNXZO#=+-+k};!=?514L2MlKRE&-Erm3X$og9 zG+zjQ9xs$3%o6p&W4Z4YUhbP5Ogne({PE#1zbWI!O{O-fr$lOgKAmn+@nONY$cK-P zc2Ar|>TvX3dr4L10stS}RB~RF_r0}h6`oEs}^{uybZp7Al zvvbDhS4O@Sm0>rN9$@$=3375iUcUhTK{J2tiR_o>#j z^^12m+z{zBoP11qnX}@guycpmSM!|^U3%iIw#%#d;^bR>@yrJTr(vt1_ zWrUCOOwf#%yH>y3Z??lO5qZbNhk=3uyA#grxX2;?S&>lpOxwIR;??V#{3N~J%UjAPiRm0R^t|)zt8b#wy}$RB z1O&kN{$r}=?auoPxAso{U9PlvL%^$g@hj|?pEZ9v znVBf*!^p_H?I6=mz0|Wwf&$`-8hhmb=+68!&GG-nweb&`1rwgkWP8jeD0Az{_nO1m zM_+t5jqKNXM zRUbEQnJF^SfmhO4aPl#piGB*4pY47{zW?4`6j)*6%W~wWgk_$R+p&@h^CjiiZ>rQ= zvUG-FlwD-+#JWcrmy*^@wo}QzD^vM%3fq3h#fGJqGFqm|9-YOSudH}|Y53=_rK6k9$vsyQ~$!WD=tI# zZk}<(vc=vHE}kBiRDnut&0U3GW=zV2Ngbn9O9r0H** zCSMDWxw>AclT-7=WW%GJhOL)Ga?gA=@3DQA<(|9LHp+CDRr%efYKN`2_Vnmvu5P_C zSt;Mtsr~V+#JNX9?%K&r67N3#P5#2V_m{Opwk@^LNj|q{PSTYxj~1N>(9)lIzc%`q zoKm)2?d6in%7+Sb#JK-kOl?SKcgYld_VDWe-C~Q??sTaC|I6%j{BGOxxIfx%Wo5@3 zkM=)aSFgcXXx=liux@+s%8K6;XMZ@@S5v{h#eIkCbp-<(G3Kf^rA4!kI!C#M^egNL zpXYL@ZS9TSrRH6();}J+syMsm=&JlF4H5j+T3@AYtn%BRJYlih^Ik62K}Mq6aIxP5 zZ^O`yy4Ir7e4^b9mW5Vpf-fM%a)b7afL=G0$7 zZ2yDvAHTNcyfMX;=a;nZMW1yA&gXZmF3f-L9q{tDB7* z4*c50xa0RT?Thk9HJ< z^L(*ws;}J{{KhHl(9wuHZnpvw-UsgZ6kv4e`n1yuB}Th;izK!#%Q>)Zk)myXeN*zW zgej*P_w2V5y}#yG`^S53u8izvYo>=Y9oP_^cl@gDp9f|ZBIAsiXYnj zT|Ft+eouG&l#RI;^J>5B(|(}J9d*%^xABwE*(!xUdvu-sc5aWat8D!8p)I@rWxtI= zZNt6U$9sM&=S@5BqovJ#@p3AYU-eg~{c(&McF)?MZ1vK<_{pT;;^FwO|Nk`wF4Qa7 zS)su6Y)_B;_gr!7Y2gdzPHR$Ev-!iI$F-)xyTb6_zjtgh9=2@};@+>8CaqgmZ11yo zxAmzzdlQ5{dz9>-=n!eS%J-mz>B}-6owCOA-FzCiBKY%TJ@2IXJXpAD+ZpCOKPmAm zOC=tto!7lO{Y6ynr>#B?=9bfrmYhw#7#$aLWB0B{8~Lx_=~HIwX?Q=+=gqwtJ)695 zB|jItxa6~ZCI=GLy+ygTyU^;`Q&?oSHe%B}zRZ>_}T!_M#aOU#I?mwa7( zbj=K#_uJP8F5X{oW>4t6(?$|6#6x_J)Wf5x(#KilI>Meo{n zeGIn!$Xc0m?UQ)<@tF5+@u|c0M;Yn`zkAxGw*))BnB#rGmZv`YGpka3E$jN) z{j3&KdqeMc)F%C841aJ}zOJ8D|7dpRy`P^x?^qYF@NL`e?)^3MIxXeb9ebO9xBq$H z`=e{ut1tTe!~Nrv+>0xGxR0#3z0@gr`J<)c%Mb6(Se^QgA$MU(-;~pO%X!Pc5lFps{EBi~BF$2e)$O-|uX{@L`r_OBR+Phu+*oL(c%2xTmkE*WYkS zFY$>Tobcqp*`WN{cJ;io*A$0L>zuPl>&LAtiWibEFeGH#l)b;fyZwq$OMIQ^hP0&_ zoo^c7+htZP{FHRzslhdq3v63YCbTyuO}T1szR7v_^m8Y%UxH_XqD#wE0t?3 zn|o#X{z{7?4;HhBi&)cM^}Jrcn{VnTp@%<~EsfZFUQ}+@2e+-$6?kOt1itd(e7ia& zZf2M0e!XMYuigA;{EI=lu@sEznzW(s@Ug@m;@i#c`6#c$>%kKXi=EemUcdWm%*!`|jo>n)r zZ>biS;p4)qXJ#9|n$=cWZLvY%=9R}x;cM@%d_M8rD%YYH%lln)?A9g+zrD|Uxczrx z`60g?&u>TNUYc9Si?$0~J~xYL)@#}3&{s{StM`SZi?_rr%$xT6ymamF@?*bDi{4L@ zaa#3iwj$H~>GM{4I=|gy(8T{c1^eO;fw3tAF{7SIo85 z#x~X`!ySK!RzJReU`b2e#EmbWtorr$SBxZ|{8>@Ojdp!&^i|GVwmVGJDcQT5LE_hM z@eMCI{blY>?`jF<{_uv~-jiwdhf{}ct>11}^(3q&W$v0A^R*^b?^tu>QDo36U74tu zteFuaU6VRXgxcaZeqEZi-~YYetV0o7+fx(NgC1;}V|z<{Qip7loZQk|6&wCPozAGF z5_WF&cixKU4|V>0-THpxi?iw*JwCG@v;SlE%dIt{Z--*zHs=LpdH2drotdPmsgs(j!EC7#a92;}ugk7!8c`C`{6`*c;$Z$@_-B_D=clFiT7R4cG#|fJ zR^R+YS#LqNSg;*mn&v@YbCxS-&c9)MzlkC4?z(St1lOz+x9@vYaQ%`9V<6w{E@eC4 z_sd%f9e4a&=l$_byY!OWE6XAx7v5qucot_EdMWnq>!UaJms%U0wqCH?ME`2rl*_LJ zQoLi6UF|jGG*9mrju%$rm1ueOSNr4PP5E03E{1ea`}pXJH#cm!<4d5=ziLnuaLyX>iLH?Vv|qWM5CwM z%R*1RY3T7g`#bF6?D*iP+>bLW3X)|0#P~nnEgt94bjjeVUV!Zfyrgzg^*Pgk0 z>b!7Z;-|78PJx80%U3vepSCUFkPBS=@y6HM2XO@=(cU6IQBMD zV8xm9hbDFf-1+n(_{FnSw_oeF{)k~YroBI=yJNQU>nDHNyMNwq5}L@9wO++PVgD=Z zCqEypDQxWKXqL6}HhEdFcEXM~H|i>n3N#Bmo|qn9C+hEA@>Ddb@8u%z#+IiMJ2RGw z9Fz~|f5)@^@h8>xqm@^z*^Cw4xx;Tyf2C2h@pS^@uJ4mh3EA%PjqW=U_AY&WUx(28 zmO~LXAMU(;p|x-7Qum2FQuVd0Z{2$zwPl)pqoX3n1|B)9GMRSHmC;YLHziG(^{Rh; z(fqCj4DNkX7i?duuc3c^zU8%#*1LNpwbatBzh%6BdvTZFtK0m20dt#ca;FuBYiWo%;eWZie$C(g>n9rIGcJQcD>v0EWtbU%@QMmbf%t2Y9jJqrvDtULm z-p=yA9^P~5`}_Ox#>y8Z7&kIH&0KV2OQvw%{=a2!9|kJsE6MuF^lA?rdrL zboKROO;TWcApXYV4;S~X>5KAr2mgpvGjuCntKNC)=chU-9J^DYDP(`M!SvJ5ZwntzSGJPyh}+C2nRQQfeiiRafd=JG zzrM7YzMS#-qEOFn6()Bx{o{U?@5ReEW~7B(y|Q-U($x90-L?z==6>7v)J$x8cWC$Z zhnpr&{4q86Xy1jOwk7Y)*e)lRCo~2rZ`|>rvAN;w>J5)JpMPNWFR4OyGArlR=Z9_8 z5+eQ=_!h6(#^=6Z`VCb%n*;p6Qzp8YTE4k;PyF4+yD9r-s2+EexZwSALWt5cncE2w z{qHzl-{Vw%{5_%eR+5h2yUvqYTT85#3$NgM(LdWQ@5u4j-yc7&-`o9gI=|C`YQZ4$ zb=UX1ZSdR}wj%q)W3E2=L-$1Z=Xm{--YAD;C)rGq{sVK7o5GYZpEfO`g!t6HNS$sZ?$KT>3V6+A3v&FM@+qD_-@H6lX?OO^?;T$xTJFTxi)@@=G4Xq~MP|$bvDufm zo((;+_1xy-DJK>^PyYL^yD)dn_8D;k3p0PPsLn5Y5%p?Ospz7q;qAMFZo|t$Soq}V|QSF?d!bOk8 zZ!c#SGJAXMd9ir%nFV?lKVEP5n80}CfMlS=iYCi~r=m%#mPGBB46S7?n{b{b<>Sd@ zR=cmq%s2YmpFC}~V&8$Vw_cn$ffA?vV#D#l| zE#F;NEHix5doQUy>1*Ou?;nf(`D=9+*s&Wt6TVdPrIx?Ggy&_y^zod7(b_JnYwMWO z?hAxSpDSGTrIe}Bk9nQTni~I2(zidjM;a%55Or?2a%7h4!*$Zue1`KrrM`F`S@G@S ze&y^KkxSF+x+*GnO4t5(-{JNtAa2?0Rkw`)XWG=gG5b?FM>V|0gc~ zxcv6;)|^|{7OE);O%~pG%Q85H$EqW%vR&?%q0?i5my7pTS^PFzk-lx$9UUiS`Iy?< zB5U8O=>C$LCA4Rn(tnHD4*jeDH&|~ys@1QQc(zCz->pJ^5@o_lAnSdrAa83kSd3d2Z3{ z9O?P9PkQfOR$DFa(zlyc`S9OV#obeXd^zmDvF5qw+Wgs8E;ElU$kt&j*Ppv_*J_*U zo{3h|s<#;M-aq$OB)(?9rFD#e4_b#?Q`4xj8o7l2P))&7;&wrmib4v9I ziL;iEn|8JAp1O?Vj%_YSS?zzjxSEf=YwT_?Z};23!td;nU5_$#)_;~gclOiPIlK34 zTE8x@U2w7TR-G^VQzo1(j=UQGca5yg`DVRCIg-jPr)TJ@Dl)eFHXAs-3qSi}^`Ezv z5A}Nbd7a`;Rq0Hq3T1l4`1pUr>!kBBuMg~!&6M2o=i`^_`weby*57{b$DLh$$L21c zYVlDc?9}Jfi?eS1b9B8Ll6&Uc&Z|E*y2rj=8WEBhRa6ecQXGGH!XGu|bfnwb8WX$X#o)7px2Y%(r!Ewh&V&I_nYV<^P4(-?3-sSq$QL8;rxDIBfZA(H99lC-zcfvJGJ-w{J+}sDv~?5OpLJk^iO$H zL%FZPy9o}n6)#Ab+PpS6w(svX0WSH9W!t*>LXsK#wt% z&xN@(xiom2K3i3UZjvh!Vk<=fN%PtJE!8RBE3mCTld&vNO3&r! zO?iFif$nOt@KdIJTbk!Y&)OzEJ1I}-ccbcZu0S0l%kvEk6+1h46SN<%d$qJDyVSBP zl~KdoT)v{>%DnI2rddt0G83B|@^xL@nH9Uj&!rfhG|h{$-gqzk`JKCWw|-v5yD~e( zVr_23o9PkT75C=u@ZNXj@v@-m$|KtrY0Q&Pj}LcSwd&th+uYdpOLGDu0@%#sTJ(wdMYk* zBK8&Me}|c?yye&3U!AsAuJ_*okI=cRb*7#_tGZ|X^xa=rMK$bVxxzQv*1cGM{X^g$ z?sql662FK=KdW?|`XO8Wo6pkvz}mLj`AJu{27cGd>x_B5+otxI`5*N{(@yAe%jetg2$`Dwcc-oM z?;45cZ$GbowQAjukO*_Zw)xZQ9KPz#JRNtuI=esN#M#XSYi}G2dOr8=u{ZOhyEfjN zZ))S0+x_<9itC$iuCfX*P2Un(y7uC9?R%?orTu!vr_9e`75V?YGqBEQeB}OFz;e$Sh0ENeu2v^tx0(&e8c8_E?K?qrE-Yv>Z*|F ztL3ZB7QFKNDt>C^#-&#IZ=`dNzIfmBab8*OMLnCkqp=T*s}u4;(n~{D^gAomaA}sle9KFTv}LdJK;3E6iyzUl)FRSKTXP zYfyHoJ9Yks`L;((TSKFtE}!%F+AV+Xg#XJ^d&}MwpHCKA(cJLr%GBUygI%Bf4?K9U zk$Ux@n7H`$Ih*7jtmKQ3-F>1Vpw#c$^Paw&M_tdIJZZ$v^kSCB&c`B5U6r1mqA@7~ z&(!%(X+>6C_%~V4Ibn_OfmL6RD)bz=+I;0!f*GoN#+%EmP zc5m*DTk;{9o7ZYg@_qm2^(l{w`~HQ>p1RdkAf7mX&%=qWI=zP7J!xASr{~IQ*}tv| z``i3= zboHz5*_+?bemnl{Yq)&&?|*lU6*%---8Vk$zP|A%`$aLGGndbVmq^&f2@7b4{jz<* zre7}jY0Aw$_BD~Wo*%YIpMU??qsxa*wXTv6cwS2lC*9Fwu#E@k~K z1DaM}eP90e#({nM=8rbZB}ctq{rTEwq2I;FzTUB#-muI5OI`dghWh%7Qxfa$RgrnyYBcdxloDMpTFfEP22NauJyK@Oy>{tYma|gAA3|;y0Pf( z^2ZMg_ole}e9HLDchN4SDP!Ww$m45UpUMkmII~3E>sZbk%Gd41lsmOSO5)1XSJvUz zO~3rlWfA$@w!^&S-}a{u?ySq}tF+oaY0J9RvsT5;(zTYbJ^ut<6|!Z&KoKQgTl+ zhwV%ar?&g@#NU0)C$xoy(-QX@YWRtTZq=A3nK`F_k3?pnH`Cdv46R4bZcUr9-c9hs z$B&J_BxiZ_?p%?4ysww@7-BK~*(nYF9{DkMj-EaC$Jh9**5<1{92$-5FY$y$rM-IY zp|HTtFf_3z-uP7A=2Kps+18-#bUY#PQk>qZHP=nbW;^QLW#098QFnFL&%%)7XBE1m z#BRvV_VzW9Upu$q)$Bb@%7rhl?%ld5t9IJlh8B{0T7h;Elw5o$*q4e4cvDvWo{z$7|;fqg27`Zxc^1-=S7z=oX z7fjf}8*bO_2VU+7-T{leR1(4#5!%d)-Jjsq*Yfp$46pR}v3MN#$#Q3|ylS!vHjjZ9 zgg+PDATDsf@VM-`?m31N88|Pf8QzBY36pgAteT*&u+2VipJnI|t8*^Ly|93rQR%VGMU}6zDE{a7KeOMu90e>ESM6b-x&eJwDTLM8bm{PME6A2FD@)>{$@PWM_2jsnbghd4vK}F*DIw>z{sHswhCBO{8Dk#ui}&9|$4@bcx&O+?vnK+4*7K-GKNLRZ5wu%d=*d z2&&cbPFv?9k(R|HExzv{hvWiR0gK;N>-XyKK2dwK;B=Ot#1@}#JVoSsd!V*CcaR&m7bwx8Noypl*io8oM#66ex05 z%&>ZSvOG^g{GHr}7MDQBLgvQXr!x7y9slNX?a4p+c*pm5y9>Y1pLRvD;yuq}ui4y{ z7fe{ZE`3r_0Czno2hnog7E95o}Yh$PJ;e1Yu(%a|0d>( zTUZG$Q)lZA=IPtQ-)lY zM9fT15x0i*m${V>{{-3ESfnsv^32Zao8MQcimrJplaL+y<$9iwY z{nFkmoyX=+tmAK)bS$4QTl;p>&2*vP)m+u=N%3Do7KVIU;vZFIbtP*f-3{a=1%VXQvLnO&!U2c z+QM$f45z=#moB|Lt8{_sYV-Z755t?z`>fn2?eX8l_5Y)5vt2e$s5DeL;|}s9quK`* z&J|e)HmB*{xF*wd!QNk4!!&$xFKf)}tFFb}TK+-1Cwr~C-n zq3XJz?n>jNufIE%zPg^%uUY=E%ge9`=?M zEDtVM3ST_wdA`GiDf775!_PA}3(j4m|F)?i)A++V?X_Fj?wx75T9KK;5%cT(!BypR zHe}pMX;JU;i`h`|-mPM_Uh>^N=MBoe=hQiGdEfBw;QZuQ2Je;pzkWN*ePs8;&Vm=e z?3A41uG*IP)e0K_W=Y^Kefq#!__qD`%dc2sj_sNEk7K#f`Ug`Zj5s*n83|qd;Pm32 zs=fntpe^<_s6hFt5~UKAGI&pI<(HYj1;o?q;b7q2}0;E%zlS0f)ylwPIr@<%f1y%%N99y z=^(S?d;jA%?q+qw5I>~q04a>ErnMf-`6t1Li|imMC&nkv4?MOKD@+L&Joiy zck+ozu~K!n&QJd{Gjr+oE8f5EDr8Qp6kNT3Uc12K^Y*oEP4<5|4qJ8Z)UAr!@_9Ya z)a}reSR$}M`aZvk@0knhuNQpzmuOk0G3&4E|FTb0o0peYKl63F7 zPLtsZsapQozkAjic3}-|#<+8-s>i?ba2z>$H1YGZvjrt3E=#?p@|-%-*xJh4r19

      zc`MDKa^X4AgRpCl}-q1d?P@BIVyNi#fOemPR$^QJt|Xr5Nvg44U7 z9sJ*1ApGeh$9&lq;p<|`Icpx-X;$~D+pxqbuKdO1QI-n$Ex!iP~BSDcNJd@IY9Sr>}?^64* zBSk?hRlhvP<^A%)U>ODPT{AXrROnB*6mtKax8K$&TZN|^f9*ZeIpg=ioWP3)OOGcW zyHL1dv$@ae{)G)iQyN9{za3uW^7KZ*Y?-|rjFaCAYxwj{!^e0E`$>!W++V<#>IsV_MG^;awLtwo6W1`&a1lOOs98pJ(X250ET2dFpleeQ7=W|5e#-(mz8V z1i6|?$NAoB7redwVM{6dAHzTLJEm6fnDyRXI5AYnO)rv9fBwZE%iU{#)@c8iOX6F5 zbit3$8TTqA%1Tx@AHDKC=hfz7XZxD#ciBsi9GK8<-?z^Fz4NCTRpxRnKkeQ=(3tx4 z@u8bd~+K4-AbljclP5l)BC~IU2m&7_3F1z$M@f_=a&1X zwdyx#Sjs>7xKrIn{>;~3FfrFmuj6>y9~(ht{T}BV;>@a#w}wo-=e2nHipiy#Qt{_z zbVhjUF8u6sX{Tb*x!fc6>2mJ=@(OR#D@{xJehKK$mOpgn=zg!erl03G-F#f_`TKzD zpFeNaE%xb#?P6N})|AC~8S6pcT|Gg{AE&4O$f#=xVY@!v@cCuUjOg1HHJ&pzXR_w4 zo74SM@YBuZvM2rK+DXd3lB`^jQT3EpxI%`-Lha+@1%G6|eBA&4FaP^}zx6o&IWi$DRh= zmpt$E=bCMYe|TM6>Xled{`2c*cRlEQU9i37lg=@g2AL!4xGy&-@ZXp^vBR=}!LWM! zBGt()c>uIc7{_c{oK=nn}i8EGP$aLK7vvlm*6m6jYXw98?&8Oe%ZC$e!-u?fVl}PmfQ(P=0Z_f6v{QYe2 zT2q1DKlb&1h)vR!b$Bw%^48WV5@v#{`$S`=-*WT5&>uFf?3B@a{{f7>t5$qfJ8v%c`!svkea?-nO9f$F%%<^2si?B@%77dE?d z%6)EH^G1i_s>PSLSZ(9^uP)h9{PFaA!3eQ>u`<868)_ElE9u286yCh+#Z3nrm8*RE zrfXPdTs`oA=PCQQFaIyH4*9u#!}SxVuV1>v7B)5ez|l8GVUvQ-w{@EbF5ky*_I2TA z@2>p(+_c7LXKyX6yC?d_vPxv0U5Tv++oLyE7DsIRF8*g?YO|i~|4v=s)r-4MacOPV zn!uE7@hiz!U;fG&tJc)rN*}zv^rE&)cFC%+yW8u$cVv6?hC67!{oK86ZtrS0u5K3H zHrGbamLYO(A>(cT`I-fD)xMM#WHD}^Q&F?K``mB28wr<`t_iS$@9IjZzoX^gdGcYJY;LHb3dGaRpa zZfux2W6LXxUUhDJ|EkG6M?5+H6!7hvWy)##NXg*i)t@_DUi*C!7XQX7+0m$&?56nO zZDGOEsIs~358|0;2`3&7k=k4Enc>(zQ{m&%tPfYaavP?4@Lu|^QV>+6nA zYLu9=2|>cAJ%F{#JqRXFg57cg{=5 z@9-#^v!jIuT z^~J1#kB+d+lVLOyvbX$pKIDA)yE~10_kJti!Ipgb?AfEAo}QjKYgX5a6&gK@B9_`# ze>0g7$oJ-@QuV1RnwMTLo_YVldKkb@NG^_K=`In+~<@C&^Ppu3+a4II9 zCqU$>uCT@w2fjS@OfK7~gSRhtCf#0@kouZqe&A*S9Z7B3fYUK^o-wzFw@uPtkxo=NSE@)aCtnI_q?b7h<$^Uj=cNNWMbE9o-@*Ib6gjXNfJ=I!gb6#fm-aUIC zx)kPzmKeQz@vd1v>=c_Ld;hEe$+>^BwJ-La+PQbz`4xYko497p>9Aa*-}cviT~?oQ z;g9PXnfFyUNPkh{cyTiN;K`Gsy1TP{LQ56~-oMGYZr!C)3{?e^gMJc63JCo>#iPo=Z2mYw!2$ zm?Nz4-B-Md{ql?DS>@h#8z|xU(AkvS*#v;t+KvCtjfz{ zH{T4gkFtNFEH9o~xHaLmOLijXKCTNohhDtj_`B#Jf53q`1ueC9VzyS5hht0k#Qd20 zYPaHJ0kO}0~%Jh^aY&owh7nuL` z7BM%!`lWuw-&w5{Z!cJW$%$#sE0J@$eAYhs*UP&v_NKL#th>FhGCgf_OaAw; zxnp;oz-RtBi#AC~TyU{mtm|nV;%XE>EA2`AkvTq#C-XYjvCn&CAo}lz*$#c1J5~>_ zDn6RC&v=>laa{p}SE5$?`hOn^^NSAL_U5$0meOM9>x%Oej-7r|z5AuWy7*tL3&k1t zOP)4ZR2{wL#RYN2MEOa7*8liA<rI z&bBh8N;U7d{+p} z$LjS}mEvqG-&_~=FWgJMFpHnaZmMHmI{nyriS@kA3Y&7Jw@i5SyDRwNhR#}n>!u9N zaWC7%-sKg1lxf>x5qrMsti)TZgXI(04>=1@+*4|QNn_h8<)a3@-9l?8T`!to{8vbU z>*DWz<>#T{5vlXsxBTJO`BpZ9w0 zXOm*KJ*IoQFLjh^I(dPh-vqs8Qv`N5%=t}J~Tkdw1={TJJaRg*RtzqC`klG(JNEz2r>Pt(-)D-t)? z88*$44QTf{tL;DU`uZg|mrs+wb1ZQ0=`B~6>m>w)r7K!Q@^j&YvtLqT+^cBui4)WJ`+{H+UDXOlE$^Y&&p8aLpW))`?);fu6q$FJB>9r|LZG9@K zc=Oh}6)PX=c-{KJt7!efE@sd5>3uODH*GJH^Jy>pC4M91`c`YHti`%doOjinxIA}r z$G4J|CRLqvev`uAuio`4>HU|;6c76)YkH(g-Y!+~T+Lo`PW@cVReqJr+k@1OJ$Sor zx6#I|7m5WB%mdYx;Xm*=&*oG+-6bGAD?CHj8izdtX3L{8e)e1D1m zhefju0*jNF{M#Dtxqm;YabU0AZkCqDikq8KS43^qN=i;vWiCueP>9-QVv%gfFk!Lb z;wP6anJPpN!6`BO`q;BR%D=W#vY*?w_WE6eFK->LoU!Rs)xMr!_4mt**?}UP zUvIwIu`7=IU-GgAonJ%OL~dZ)oX#-+-)ie!b9eUGKA-c@{*w6CE&FxN0%r2hD`iT# zaAn^7X$5Q6wx4Twe@(%oEYwPsH{N7+Tu~}}|GEn044Jl{9LX!VcFo_}o|xhg@z7Rf z{_)VDC4FIsm~*8ryEfHr%5T@d|K0V%9Su!$Lo1ohFICmqOL!}oAK#N=D)0Ik8j^Ku zuf2m?(vp1Fnp-Mg0_IPsKlbi|hABA7hlmXu=GzD{T^A}lZ zE?KkT@?WPTy_-(5TmQB(Tf=j_Z*Aa&dC${T7Fu7~_&wvDT5QD2Q%`KQt3Q=(3or6k zpP#JkC;C+6-$4(J%?qBq%s>C9k~t%^Yp3?|%4^pTCd5}Mw4d1M>}!2F`{~iVeG9BP zRf_qpx19Z=xP0H4&vEB;jznFEoBqQ2;_e2|eOk{}FWYuyaj~>>|Bp={v>PI~-+M95 zf8%}LmHH;vUOZ;qZnezK;ohHhR?gePD(@vidLdli36C#6tvFh%R<%`HqgQeAyXVL6 zc`W?vcEj1evi|L)9JSncS48Dajofu)=h;+B3BTHYYmMUn~@Z0y1+?&!I#&k+NOxFKKcIcgeNCEA27^SpZv3b-A)tMS3GwXzP6Y?t5j1t zZt}~PZ>A@us@{vuT)I^~Eail#*d^_X@{>+~R!ro{vgDAx^6^C0jfP)q)?8n%D#pvv zR(?#c;{EO=6ZOs%tkArcv*iBNu5~@Z?^KseSjT5x=X&?-r=7+jUpKBOW{=rBQGFg~ z?gXw}_eolFF0P**Y_KC%vDoR4TR^R@eY4#Bd(4N_?D>u^=`u@E*{db_Qq=fWtFw|x ztosfRw;SCSWoF#EQ5jw*9o^=b3K!ZeFyB2*PVL-Lud-zkOX8-bELi%0Khe5bRX@?n z;nc+Vf@^zJ*Lt1()9vFcbg6ZDx5u72&T&^iSx*0zw#g)J_o=TB9GfjKCySZ&y;lei zzwh#;k9kGlaUOm?$v*wZmqIPR*7I8*uWwp2Thn64OYNGEXLlE5Z~u@Mg}=s{5~g zPX9i+amKor?tG2qkE2%HUZw8#d(xeQZ!P8)P2xG?uzmaT1?AG_CSN`{8c3GxDqZPn zzVY^gTIXHT`Bw$*T5WYO4OSQL3ffa!#;NlD;QX1cy#D2vf);Np`Nc6cS-WPRFk0z%HU}HO?7YZPS+2npE@PZ?8yH&%#P0oaKJT)iFaJ}iTaV){!k$!QoZMaRP``41$s7BrZCf_0pRAwcw`lja zhRv6|UnumdOD%u#ReiIi|b5a4(v_R+BAByrT50>w_QP z4fpN8ry_D;Ws11ut}N9F;i1>6!guTtv0E>fRG5+)e0k~2-Iq?h+M@S!UXlBmCsUJ7 z&aTv%)IY1$h@`_iWYD#>$0KwyZb&fCwR&K^f8UF1KKo|QD4OZyH=%GF zpX~u%&6hlXgRNVSu$ScIH>ONpsK#QHShc$Ke4K0>=NIF@-*5FEi~g#!VBbe|GqDZH zOOx`s{{CP6uKDoY-N`$Gz1K(?Ncnmmz1&&IwlS>UqHxl!wcY;gd=qc+W?AygFU@Js z+p4Af=S!vUO$DCv1$NebM->V?USU#)QInSJX@!VRqJ?$ooPY7QY++{6jZoKZ{ zfm!DbKF`jduu9M3=E>Xk2Y2W99SuwR*xqcj{wROl=Esg9O*7Amp?(PlY_ZKJs zj@e%G=7!;wRiWIA-TROANE$zQ|DIp4=#kn{p0$CC+dR!GOD1ab9Gd*wY+-lIPp$CO z=($NLr`pVKzKiCLn|IaZ>(S6cU1t9H>1nzRYYo}{A1E@;_xf}^?A$R!RhE@g9yh%) z`L)wz>&0!IciK;E%e=w4zBBsilq;Y3V|@O`PhkD=_onKC8z*0sd|PHwu5lzdsP^lW zW0R*Pt+?3P=%IAR@t3V>jP=jNNfm){er{TRZ|?T!r=2$J5Ej>UJapmbEK#>}T+L|; zIXT)Z_Z^hB^-xp}=GE@{sp}`b%!h({=sV zXP~j9x%>9MgL~%I2lZ^2H^cPne=pVljqgoQZqRcoso9~%bB~qh*Q1wDBm*vUF0?(` zCwAZLQRY+C*}K)2PSDMo*XzEUjRuZxz- zJG$A!rm!#V(B=i{mD}E(OBUX4#dbJr&Cfg8#-|VY|C_!%*XfPM>&+_nd0!=Ko0RH5 z(5n5uWs|AZ-qV)d`F1fq_Ahszc|JGtNoCjx@mY;*H3wM0OM-YGr`e%vsxS-WFec zu%Yn9^LyO!nTtA9=ilX;|3jrDZ`EWU&$|u%ePPF!=iUm~ox7yzOtkyQd+#c`jAi}`^vw8Wg=1)lv-yd2v&D~$WrL{Hb&&TSB?S>xr#pkkkubaNAO#e^$ zu~eTW&*k>IKL4S#bDs_8eBK<6&Bg6Yww?L@j4=*?*VqI-^_3e22y#K)Z{r|dNUtjOdmh{kZ&xCm*xAxcncj`UT zG-0Z9tw~9l9+OzCS@yq^!5Io(FLyY<@9O-1jP>br_g!i^S)KE5ygRu1ve=^b%{f0$ z`+B>4S;_t-VRdmxnXLG_XNT4O8a%x z_q}4mHUYi^-*&7_Ik(is%|pFBzlZmyocW$#j$djX&pY=()x}4(U#|A0*?%RK$%&=g zR30>a)3@@h*59^#zW>CD7FqAuXRV68xOe8t-T#+GEweeh{xp}SZt*suU5AtZShuky zWqrJHFTVFy=)!G3RxR9o@r$nZ#`+}w5+eyGHYMjn0@MABVrw(rd8_|-eY`D2POPv~ zcw>z-lWoKK6Am-IvRB>b@m&7>aPoz3KiXC2?fx_;owcj=nPbZmsH=TtP@pZ&M;S_ zW^$p{`%1&S`TaA&vw#a^I8xjfUljVeJ7)jZUU%`t$APhaUQs4{rn@iR8C$x`?bKoe z;a#)$J7tw!kvY3_ZcO^GZ#QSGTb-BG|1aOhqBVTl%N}I7JdF3CsQrA zfBnU>EPsCRigTN{*Jl~*yK(t+!0Ro3`)^!6{k1RHFzNB~74EyPiSG*X;JInqWHEKw z+!Z%(*{QyBOV+IM^Z9uB<*y^()_oA+dMVt1e=k$vGP{>hN>o)pyWnD~U`NzkCB5ZrpmhwgQ{5Z5A zKX(0-u0XE6E_Q3bmtG=vQ{>CnB59{zllOTUN!f?+er%oAp0_58t9_>THqO(h zrhZ)~{Pv=Dg{EZnQzK)oV7G{bnyGgML^cWLKY0>h{nPEO#;Fg}IBnvX^lk3F+p#@; zs>58X(t>YqBHw;+x$`h`b6Vn$4-W;{9`Ssd;qC41e0NvrR-s$V6 z+k*l}mj#_=^EJ8oup<4QTFki<6Z=}ziw|upIO(8cG;3GL^%J7|Hs*d3(s;E-&+>;u z;hEB!je8wun6cllpQ3l=$kxvuduDWn{JL{W>ea5w8GB=TAKH9eE?+R?nU_jwn$)-T z|IC}jUg{;hOYe?bd*N?yf~Q+Vm-;@f&C_2mNxHm;lS7y-$%}FQ7WJ1wr*3aM<`K`n zvM%O?$C;RN2}#ROuTJ{dwp9kFG8<}aaAyzKo|5*?OIcep;D+?d#doqT>a`|5Qx?rk zI%`pOtfKebg0276)-DbCl%_uG#Eu>E|G&wr=e!Q$lKLC8@pX_+#^k>lw<>1%?%a4m z%dxHSe|=)K)2e&V3)GHvO59bdWLeCAHhkjBIX|X8+kNobPV;-;CvElOo83{r{vLnk zsSJ^o$ITKC?J(GRL6IR=hXt=E6v;ZA;qw4&Rx? zJBqo`aP7oGi!h1Uqna#BpY^ssOyGYQrBnUUYv!fsbt=n^ZC-mV*w=pJO9(Ub#<(B(>=bB29R^Jb(C%;QLcxmm7$s0mXZ7zS^&42IP z!sf;Y__pQgm2aGPp4lg= z=Ks!9^^m|@_TRSI8;TB=Z{VHTE%xhJdgQG8^COx3DvA>Y4ym_!Df{%twM_gXM? z$v5Yh5jHoIo|!wF+ShM7-r(8DQ5!Ci`pCfgMEvW>1%lJe3M zK5jZ!y>ngVTC2hthMVL?jQ5$%zV>>~dG<`@^CJ87LZ2S;4?Xps?SKFC2g~c^FXYQN zteDXGE3<5V?w3i=kuMQWsL_|W;8e{d@JFJy3}mw6aQ2*=xF}s_bQJ) zCUJ@TyC;^Fef*>oXvn$a2aEEGS-v0rSVW5})|d)cJmcK+;Y|Mo_8$=(CK(qPK&uY+ z{ri<}5i0_qX~YMT*=Tzs&B;c&uTb^70B_@V<$s_lcyY z=zP3jv-I4ho9(yaz5Z@$jNpG>y!rKwOdYhQAwPH?bDzg+$0@ujIf*KhB4_Iy*d$S*p6u72TtJ$be&fj|Hyxsh^%S`Q_cN5_uC*M>hV;t2OVQxp=L>K=l4KF1@@>*<}aWTQajR^>Nt+ zUw`oTUsv2NBliA(5j%3R P;V((^JMFv_ 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

      i~SBaA_ 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%0Dy5%gKW%6K+xp^g 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�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

      SMd-tWIX!~XoOI$62L{i(OV zUEi?nT3Cs!?zXs9;dTGTR&U(3Oz8BkO#4o$Z;#D#inm-_bUfO6-TI9?l3urzYrn4A zran8_(0Y1rbj)@B~cL(3>yS{I0?z*dWHm2HNgO6`*Db?C#{O)|G^yY|jrJ=&7cO}|yob~d^ zznI+t*4K{x*|D|Mckc7=e?Mo$Og?F*z9%~Jc##WrnNz`xJfP{7X;|m&+ur@O5-<^1}*=@4wB=eGHDD{h0jEa_!o!qS4p0y2Hbs zTiHkXPhJ$NTX?+9aKHSv!~5PjCyQ+_i@AU7Px7Q^H)U4;O@5s8&&n$A=%ZWPw_P?3;DlmyR&okWv?gI*853(Kb})}XU?f-Hw~k*KVIKdXA)qR z_O{^6qcXeK>7mC}-8Nfo$O*dhvF=R%YsETHY+qPw z-QSxjEB^Vo@a@oA5w}N82OIKqf)API-O+RF-@Hxl_4mJJ7SF!t*4}Qux@{e3EamL> z!dUNa`}6OAzx^Ol?{ixON3~(yxT9uneOdjTTZyvf@z0N(<$i4Detm;sx9V5pvs(?< zZoMJ3GVbX7vUOd`rUDyVGDD|(S=sgc{=1_r=**+KwYmG(S8tC9y0h;5v!BOr%s6Uv z^6s zCmF6jToHt`CYoT+l;~u-QvTRiE}duBukjr}yyNR%tDNZj*Ea3DD)#-g&)Wi@-(i1D zb*Gies(Ej=GngT<-B055mF@r8@YBi|Ltqvv-i(EYxr-@hX~otNy)eTvyPwLifiuR$?}HzJy&JZUZop9JHK(; zwQJwbCmPn<=slBvyghfF{N-(8^*Zb1eY<9+e_ZqW*1u2t3Y4o7>n2@$|64q__|dV_ zGxMeA9sXr@{@R9H$F^=OeN!X#`Sz{rNuPuE{;;$XD_yv3` z=0DzED*L*6L!mVCWmj7ww~OvN5ATH*2x}Q zlfSho^Y;5_pKM*Tv{J2Eza)=oz5adt5{^NMUy1^1DcY}Jhu)mC;oJI%<2g1qYMSrP zZ{B*SbkegMHLL#?N9eqZsMmR2Hbdv^uLCWep0AG{Jsc5qzrQ_q|N7`l`;M;Jwl?a1 zR(E!;;p)FL?Dcbge?Gi1=X!^Ap9J>#n2>k{&7E1=;b!YT|FOKb?bfxA&s&qPUB7k9 z^Ru?}_x{V<#Qx6+QL&q5a=q{5%5^%1vo0s4PM&d%h*-;V3#mEM^Fin-bOTjjgeru_YI zTvtxq+v;B5$(?>)GoJ04Q0}nI^zpGxoi}Axe=VuI{XSio|M`#O?YVD{Pu*eq=$W81 ztb9i)?i>GzdUzfAW&Q2>kKEbGhO15AZU0*rWOLin%HMm3Uy#nMIR^KS6|KwGww#rD zcgaSBc~|_qZXf;qxGwtm-+lM_j_0ghb>wd{j`=i)I_@K?8KuW>9{FoocYEE9{-1Am ze9gV{YKQ5gKJQuSAAOGhC@#usKY4Wy-@25dWm_j7d-N#r%&)N9W{372`#a?Dcy8U?Qwe6*UE9;_V z%(V`Cy`v)LOy5b9X!#j1yQ(DQD*q|7m$NeCE=2^{T+Ulv z)Uz)9>SLp~t%leW_YG5~n<_bv%f!lKV$Srf?KO;!e(m%6_vcl2?}c(+$~hN(bIz+i z>9}R3cszQ+fYnGf%eeQa)YP-5P3C3lOfUXXoV{ePw(#&u{*bTK!ouan@<|zwP`+6x=+>}$M9FL zzryvFyltO1&t3j#=b5!1%QfZ;t=jocb^6bpXV&uURJ*?FO-v7tUh7-#D=CxAu5T@x zIsf#XsL<2bRWjH8K2=)R5q08n|%jQgz{LK}PERz1E~oP^yS0oF{sT9tD;J6y8W=6*_!nEHJImQ^MS4Gzx2877?% v+rAwuw8d@`*0BS44}NIKIyj5|`2R3r)t(2fYc&`c7#KWV{an^LB{Ts5BcZeF diff --git a/doc/workflow/import_projects_from_github.md b/doc/workflow/import_projects_from_github.md deleted file mode 100644 index 8644b4ffc73..00000000000 --- a/doc/workflow/import_projects_from_github.md +++ /dev/null @@ -1,13 +0,0 @@ -# Project importing from GitHub to GitLab - -You can import your existing GitHub projects to GitLab. But keep in mind that it is possible only if -GitHub support is enabled on your GitLab instance. You can read more about GitHub support [here](http://doc.gitlab.com/ce/integration/github.html) -To get to the importer page you need to go to "New project" page. - -![New project page](github_importer/new_project_page.png) - -Click on the "Import project from GitHub" link and you will be redirected to GitHub for permission to access your projects. After accepting, you'll be automatically redirected to the importer. - -![Importer page](github_importer/importer.png) - -To import a project, you can simple click "Add". The importer will import your repository and issues. Once the importer is done, a new GitLab project will be created with your imported data. \ No newline at end of file diff --git a/doc/workflow/import_projects_from_gitlab_com.md b/doc/workflow/import_projects_from_gitlab_com.md deleted file mode 100644 index f4c4e955d46..00000000000 --- a/doc/workflow/import_projects_from_gitlab_com.md +++ /dev/null @@ -1,18 +0,0 @@ -# Project importing from GitLab.com to your private GitLab instance - -You can import your existing GitLab.com projects to your GitLab instance. But keep in mind that it is possible only if -GitLab support is enabled on your GitLab instance. -You can read more about Gitlab support [here](http://doc.gitlab.com/ce/integration/gitlab.html) -To get to the importer page you need to go to "New project" page. - -![New project page](gitlab_importer/new_project_page.png) - -Click on the "Import projects from Gitlab.com" link and you will be redirected to GitLab.com -for permission to access your projects. After accepting, you'll be automatically redirected to the importer. - - -![Importer page](gitlab_importer/importer.png) - - -To import a project, you can simple click "Import". The importer will import your repository and issues. -Once the importer is done, a new GitLab project will be created with your imported data. \ No newline at end of file diff --git a/doc/workflow/labels.md b/doc/workflow/labels.md deleted file mode 100644 index 085b7baf5ce..00000000000 --- a/doc/workflow/labels.md +++ /dev/null @@ -1,16 +0,0 @@ -# Labels - -In GitLab, you can easily tag issues and merge requests. If you have permission level `Developer` or higher, you can manage labels. To create, edit or delete a label, go to a project and then to `Issues` and then `Labels`. - -Here you can create a new label. - -![new label](labels/label1.png) - -You can choose to set a color. - -![label color](labels/label2.png) - -If you want to change an existing label, press edit next to the listed label. -You will be presented with the same form as when creating a new label. - -![edit label](labels/label3.png) diff --git a/doc/workflow/labels/label1.png b/doc/workflow/labels/label1.png deleted file mode 100644 index cac661a34c8c393438130096b7fe78c4d996c9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5846 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 diff --git a/doc/workflow/labels/label2.png b/doc/workflow/labels/label2.png deleted file mode 100644 index 44d9fef86d4d32568d301843f674d4bda73bf99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16931 zcmeAS@N?(olHy`uVBq!ia0y~yV0y#Az!<~9#K6EHlThQ#z`(#gLWHZEKHV%^Qnq1Uc{2?;Jdx$e-cX$hP{o&ju}CtZI2ZRBrg zRA@^4@cEzn+?~&M?Yr(1cdmV=qVbxwYkL_O7#Mz}Rczn}FKw1NL73Eg-C?^l8@h zC(;7R3=9kkKdNMtQX*N`ukJh%G-dztUE$FtGrq5hTXWv$de+vc+-G0r{F!w5+iw2e z8{S`{)|%Dc%=~tbZQd!~;H^<>%c=^GGu}whxFW=U`=IXNaSK{mM zC4Vc|J`-KOsA8tw=DjYpaSIn7@?R~d4vN-;7k_ITK5D6K)xPSIa&ty}kn97Mb751S zoQc@8@k-9(h^>ChJw>iZ_ROAsCSuFMJM&ycX3pH`61RDyvw!Kb%jdq?TeI+8i-~en zx%47hwD>dfXC!ahP6fAmlm8n&)n&Grrxz8^3cE_K4KdX68>gja-`;pJ4tSpr( zU2{FnDq>4US=@5#G)9P9K054AT6;l!-Ib1xRc89PZ(q)Tv|)MoC$s21OXh5U*{{x{ zdh}@YcNyz_)hqp6LaRTA&CgI!>NGg-is>w z@#Ec8DM8cnn!26l!i)?I4GSs`yzdNr!5x<6;6OYyUYWvF%WVtIMgEFT2iZFEWknbV)G|GZC0*k+@55&WW^~ z{pC+qTE#dnnX~S?x{&E?|B&jA6T!7NuJ|lDcg>|-_Ncv@YX0GClh&RNI#NEZLTZ(^ z-xRrZd1^|Zs;okFPG3^*vexUkb|y$TFt)mN?;H*W1_qYq2M5hN=S2l1%-OhVOG2klx{e(h#wN6zf@Z1dl54@6$|30~|u$HLZj&y@_#ts5>IyM`XuiJO#JlGW?s zDRw(^b8+OPMdvb#gj8RZ?mc7hR!WQSy{W`m(W_TWOV8fp)7}#+bxJ7p(K+uK8Lk$Q zvu?ghTlC_d9}5EmL(>9&#WszqSErm7S5`*ez4uhwi2upYe35nYmQ4H^tr)hXW&3|s z!)RrrX`vFUZDwu~R#Wd(^Ys-ttr6>HHhbfuM7z0mf$mdQynkCNp_Jq={!GU*Ls?1a zMv3txAJ`==J3`||Sh=dSm5LT6TNHg)m4{80Fq)}kY8 zMA|xzbVh2r#BE-9B;e`$&M9(N=9-xcPyDrY4+~(#N-*&1u|2%9b<1}?bh-Fx?zCN2){A$F z8!R%tnYCzF^X#)O8?Ah+V-l}KW-WTQ>5|r>8)we6+?y^k?|^_{==9J#zlFs6|GHfK zw71m7MQ)q-l#RJDaW&gDqXQ?!rzi^fo;n?5^TGvG`U<{&{B}uMPg>+doy(7!&*`0B zyj*OZ`Ewo1jN7}Pu(w5&dNth$j!j(oS!iO>wYI4*W$R+CqKs`P>V&$8tUKAWce8Q-i783TnbW_}->VwKQ zhTF29FFLujbCyfnTBC5wP7llV6{XMS&UWWF5M*FrsMsR+$csl%aB<|ex_R?w99;7J z{m-1smvVZ8o@|-no8~=NBW&*1U%!~EKbg)w|A#Af+oTSUB`3XhNb4t+zU{wss^lgo zf62yXPyIWaUw-xMG}<)tv{$dXR)p)dOTP1EHO^hu?%X4~G*otfx_RQgYs{>hO%`Qs zJ{j|LimG4Kj(-Q{rOxGg^A{XC6Q!2e1d zzPz;D`muap#Ez*}1;t`U6Mn zJ^PnFIduNsPp{wC=7i7t5?}Cnd+73-Q!6Q6{cOAXtV7DWpr*+?sR<#1|59S4 z1O<1_a`}=vBP%CnR)NAXNe`#UZ#`M2P?xZCX6%ATLT&#QgC zbmPan?sJ}Hoo1gu$3FD+vyMe>_2%D~pZA}(^?J?be^;K{|NfM{+FC_V_3hf9uQn#S zxLgVO`|zB;m%eGSN|3L|>H3}C&*yRfudR72zi;jLi2+ix|2{f0-~R9q`5iCcy3r`>|iIz0tJ~ZV#Um zwdwM!SKA7|-g>0J=G1euzeVTX-%205mOPL5 z+sd-y`h7K@Z(Wl521}|k`Gj~F7#ucy(L1sw=3l|_>C<=ANv!|*X!`NH8}t8usXlKn zX_@xshpGKvzR)@LZ{IB2>i_2t|NQgwmr5xoyQ!+2tF)U_9J_yVh0~VL|8w6(+??@# z)%~a+OSV7yGgIwT+^T)D)dAHwOqp4x>``;AAttg#*rFi*=56|82|2w;& z;OFGUFaG>gyMH4}{dsoW-XiyQJ(X)}@}7DBm1BP9Z2NM8y;W7-%YE6>6`Rym*?A2A znZN9}VP{}q;8zalD2$8P`R>a78l|i9|8~6DzdKh|YHhT!_r2|>g=7Rvr>o2npC&qQ zmqM+PwyN3dn;(nyr#=lYiKs5uPVDILaCxGtbh12b|G%6&cSD;5GFuwn#r1G@|NXg2 zK0SWJ+<&iL3&+<@j4yk*{HOl8-j{{yKkmBRTE3Erfx+QFr$|yta`z`!`MQ#2hM()# zR+{NJJdWcr*HWD0cXN&ItH4ATmwUhR*H2KH{W0F{?9R{i!gb}ByF8OyU7lF~pZfit z)%@R0r>Dy*Dk$aG-W7Fx(!Z4H<%-5kL2T zTiCx-`&G}$&bFAoy88WGuZGIkeA#a7JJC>f z(ew@(b-wz42mf2FGub#@Yt^~kuF3A+fBNr!Ry!oHa>BZh8|P|XzpN}~U|^6?*!x@b zwZYFjGL`>%B*eZSn=RbB`}~vr>-$B-{ag;+n7`jLa?A7X@Avkf2=wsz zWbDd)yzkY8#2+_0T`%|V|Nb)F{+_eS#I${14oNrebKEi8_t0haqwjuy38@P{@o#D8 zj-4zF3?E+bW@l$}m+^wiJANMh22dL&&Zz@bgbyl8=*ym68#jKucm?FL{5 zU9)!W+WX!h5s8c)b3snu(;@&W$LL3?aFj7Vn1B57&YGV^-rn5D3lFYiWnftFpR@JQ zh7B8b?6BAvac8?++t#gHzvlaX_+TS<-u~Z5{#GYJNy(efow*qp3}#f?$SuDd86W@u z%Vq!XZ&TU@j3r`sm2@V~m@#8Uf;bZcgTaPZuU|(_lQmBBk>7UI*swX!+uJ)OC1t~E z1_lO+f{7C+>gwv&-WF3#Gk9ddS3Z$};X$E-SoiNgU(}s=7#J8n2;rrA!Ad{< z**SX3XR}#bXMKA=Iol#f&p1>ytJ5yDg7`Ef- zgH=aoYk#}}szeMFkCYryNln%4@K`p_zCNqz#l5bq$M>|9&Yt@E)3UNvTI^WR-G_Ta zJq#Hb7#zR+xZ_tPA-AndRq6Aplea?4r-fSYb=k3)g@Hjphr@8MVp@{qqO`B4?yfH7 z*;x85ZKBi66D+%R7#JFkOXjJUstL7scf9I3+FGrZcPDy|LF{^!O*yx7ED8^8D7-o8 zXm{A`IR{q@fjUb`y9CtFU03f~vF=Pn*xfscl}_ibef?~r^!Z+|^!G4>U9GdP`G>Qt z^#FCbp$)7B+M92#xtP%u%L;1vUwFP*Zru@3zSUPGf#PvH+|K{~XU)NNObiSO2P$pk z76#ndo-3Hdrree&!{-i7RDR2ib#&I`-&Q)p<5pN$_!SJ~`qgi2Wnf_7;pjh}y#4m; z*RLNxdi3iWbDXt-N2SfY)6@00Z`o2HBmO3efq~)I`~VFeZtm{xZsG2uwXYc!*+8vU z&h3*y<@I!dB$`ny2lW{K6z{%kHhb;TrAybY)djox%l?Ol+l_gI#l_Xdx_@6gY%oWe zU2*&E+J}c)SFF%zOLTH_`nCG@`u+c+7GL}lo)4;J4?q8GIoEIZ-G88rseAlE*`w;G$4ysPm*+6cZY~Cf21fPCCnKi4 zy}gaYusJX~T6*0<28IKV9TWua>?&Oi3R_}hkM~J7yATSG7|5r=sqnm+5UkyArM&HPn1nxBr>_q@=d%$iL@% zxw@(eg3Nd z{olS#tsNa}waVR={X6~rQC`&9(z$(o|3jNzyniXaZ;Ie?j*h%vd6P7JgdWu=S_ej0 zTy~7Ov3JIm!&(ds6*jzoW-fT=@-a)@`AO<(|LK*kudc@jciT>to+du^s^;dndfkn? zN{TZxFSe~&!>hUMYIoPEJsT%KdntN#X?3rw_aR~X+4t{tU*5AYqxYot>A3x-`mLE3 zdul%V86WkVwLJU=@9fjFI#bHobIj%^Y)(5nDKqHEvqjUVPq%XIoSe4uWKh($;-9DA zTx0%eyPxS|_Pyw>8x|Oxj@k1p;pHse%f{vzbK0lt-^|`=d?)UM!*ie)wCT;tizpm#i|N)cdnZ% zZTIt%r{bsgXMH$cr!CZv5N2aw*jL43f9}>PulIAmrS?q!8sv0olWqN#&5t4`UQSvy zX=<3|>p42v_oAOIz0rD9`jgO!#nw#Pz&|f|q6ddNVgx{(?kO&2_za;iGQt6W8yX#p^v` ztNr08#Sv@FAMg9WWCqKlDN{c9pIW_6b*UR$l&g!#%vJTeTc3V*(6jvWCr{GUsde99(>yECeS;OtcJjbP2h;?~=DmNV-Yb{%KQGzFphs zqT-!%KWLhS?-j!%CxmY4pSF1Y#zkaxrhR%>a_Pp9S2-(+gPsdKepwUUA`xjJII&~r z=N}ud-?WSQy)$OoA_b{KipQ=O6um#lou~9G<@V2SuGQOTrc4$~={~(S@B7(HbFV78 znCIV9S*5W)JpC9)ht2)6-LK|tusFN_NZgO&rH7{rsPCwMIN3!}apQk0H4 zHeA{s%E0hpM^y{Im;sk>TF{TU=;F|?OE2xs_F6rKd;7aOUuCtMulKiiI$Bq!zi{2iBX~7(&b*Zullt%Gyf>QQ zab;iNnx+-&&c(c)IZH{+f9}e@jzz-n?o@o*B&T%jaF}`dy%?2OpH2tAJ#4vpcITq^ zDQg#c3(PglUsnD;KKbjf<*wlL8~5v?gkhlf)Az4kk~h~c>CCBbI9mPleB1t6`>*`cUz-t>u#@EcNt{G&{Lr&zg$QFV{Gowdu{6TKWEwYED?r){R?czgF`3b!bh& z=8q2^xt_~0jr2M_N5uMdsjTz878b#qtG0=XZssg)Yd*(d+;Q#9<<78~-`3q*Fk^ba z&f?D(>eSjg?wre3G}_v+;%23;%e{F%5!pMPC;eDo^z0n-)7^VBN;@Xf!@T$Nw16BV3e zBDZCNj$w7=!%ZTEbAO)O=JRaRb>Y)yQr%u+awnp9@5{P6Ywoj4mu`5j*Y&xxXY;B1 zCw!_7&fB_aQEvNbzOacNE2DR;QP6kwQSpo4X0&?OiHL2*(XrpMy-lUfXZ_8s3;%NE z(4$pq(!Kfh07WMHt#O540Mf4O?yKb6;O@9kc;qAN*V zch2&Uv&y16rp)woRt2?C9P&SWzU$fb=1^14)-#dYiXR`_n--KVo-<>*z?(&&vCY6o z&!Z z2_LQeygX|wXzC}+@83MGZOfnWwm;9_dh2I9`{CIWRfITCe~Zv%U^p=0L5Y=Q+soVA zoK25Ztop7qZ)45!m0d!nR=$f)WE$qhObL#8$+_pH!h#U3^|8Cl-rh2e>1SkUSa|CB z=d0JR-+udT$BrHQz8<*zzLRswLzjzb+!L!_Hm?0FeB|xSw0~ylQ+J-5JjLOg@a*m` z{@FQaRl2U8jSibIz4HF{zg2&>t<;-oS8crdq}M95S+=vbvTx(N(9NeJ1-Ov zvbE9Me{D?Pyz}{W7f@I$9d74Omw5Ja`Ft@@Yc?^XO~QZb#zWpqPS2coVPE_a&d=U{ z=hc;zuI;J1_$g?)M&TtLPDaRh@@YjV}IO?U%1zIw|Mcwf@h+N1n{wS9NUBrRLjy&vUPSS>!7u zD0p;VSj3FUA3BzSCdU5po=s0W!sG06)^GXucS_rC#U!S8&M7TZ>bklmev#nuS4o{K z7M{CV_?aO$g>#d;0ciN>#l;IehCWHtW_9?e9((moz0y|n_9rp@S%$Txt`%#VI$oW5 zt8G)d%u1>2os4&i?e;{M@9_^nlT7Y88Tb4ay;w7K{rlR=%}X=B@igmAEDW2mdRFI^ z%JoZKjJY=-I(w|STikN<)f7$L;-EKcu9xzZ{^(6p+dJE=^x$mJz;%h4$@(J#os)~~ z>;eqDmwySF>GMo0e~s1dgz}AXjz^Y=zlpT=7thwWuGp}~Dr|ef<>Nm!W97Qv`ARb| zFmS9&%+1X`xDFI*4;p!|YJ)m$21gW+9B6(JqgTEmTcSlSW4q0x+74$n24``nGYUs{ z>ad%wt*rj}>1qD@yG2KCt-d_r@rhg8%_G^~^&GwVZSC!(k^=rc4;{px@rPGuoV^{b zXIHV2-|kZLn`wQ$?0MVoyxsY~{c#TawY)#w-5s0XMeTm+bD3F$nc>2Hfh0E7b>Ci0 zi=A5Zw`4oV+~cef7cg%SV-e z^Qvo0*NRB}pHp}64QG&&l6)+4!pYwj~XzQ6vL zM##de`WO5s1TW7E*9|JSDEz6}^X`44X>L@x$BOugv(=tv@vp7kA2W4#(z;i1=6R>T znX;*w*RKomaPfVf6%RpVIE$J@(1CE%w?>R_`ls zCT^XbHEGgLuhq?^lbx!o|C>beO_A8QBC#{jcKQ>m*E7O4q%=Lbx8|DY?PX8(X9_s_ zJ~#V&J#W5U{YpQtywl&dwu|U5pZ0#!Ih}|DdG7;e-}xW-!ea05?&)O_l^J(`t4nuw zy!boy_-%2qyrjCFDsS`j>o~l3cEZ*IlqWo%o9XrEY{r-8bAKE+GXG<4n;!XW=W|A+q0h@4n>U+_!t_ZLfFlrd@DzemJ-G#fuB2 ztGB9YTi4Uo*lU;B;=+3V)~O;$M5d@WMGtii)E*agy4Gb-XiOW z`36~Dd3E=`|hR!dzpdOXg} zTA6g(w``sBcEMPG=UDF7%h*@uHO6J$-J5yZ^Wc*?ncwH0QCZb_GUn+?slF8}FQxRK zx^S{{*Zkz|fBNpJafq5k`7SHI=H_{8_5NR>&sm&ZnjCnU-o5=@b~?7Jhi7Sv$B7jo zJ-a7tBQB1Wa5ebnCRNOuGJd*?v) z5sbz`a!)`1T=Hc1-Jlz}%>V!1uhwZVzP>H!@yFfeq8%L}Yt{#EpIfTC=C)i*(AOs_ zhx_)sr@nOi{nArn{=#K%mr0dRdAuanuCQ^-a?7&Q|6d%Q^nBkc`;ssEZMyE!ot^c5 z`xCb9y8KrqaRJ-j8@KNYaHwpT=3sS^Da_j)El~QrXxfB81E%QdwhJ#DD`x9H>}VEr z_S&{6Ua{SC*DQ&;P}}zL^GA+|KXaGGylpIfUw_fV<@GfA-1v|ke~gdLiPzg(ZN2jN z-^+h{cAb-DSg>6niA~u}Q*_3=zrh|&dg*fmcD9^)yVgXpsbj^--M=e*qKllDvikG?NlCvgyRwTmI=MaC^sTDv z?iYtA+vIM>OPcD4Xz-Y$HF zPw=k(IlAK8w9<}g-!1w+(O7N1e%(4JkKS5IBZrTNE^ZEg^7ESHluGYXq1VS--GjpK zRJ$yX?f<=8+?a`>!ePf;6A90d$&*+7nQ-x$TGl2h{!p&TrCoi7YEDbL(|y~0w&p#G znYQ@1e^f2gfBTr=g7_BrqNS@+vq`+BR@ z{4cv&_SKc0J34XqwJ$SI`s+^~0=pdR<)d zcFz^z;tX7TRx#kz``?@^p3C0omb`n^QZGvH+r#NU86OxnYa2FCQmJ%&cjoW!?fZ-O zOm%W!cCIGX?>T#n=c>~u3*VZF>`(r{xhQ1U9GSUOtZX%^+GCcV-|*)Cr*q;>7c^2| zO<7a1`{b)fTNuK$Rq%h^eihxBH=bto1k793ZIw4AO~w67R-fR?Uy{>e z+pq22Y#%bw%GLbR!w>emOqxz#yzRx)s$DMJ+9zYK`@B`}{1cC@bd3;|zHnuc@neRNw8JA+^wJaxkyCpQhrZ6_Xa7(7UQ>T^mqkAG3XaOSSpe z9jnD7-DFi&wx7PGb=C9z>gBWler7PC5C z>PlKBbXeTpcj)aqR@U#fo@cb3^W7K(a(2vRF_0+iT^4&(_3iiFGU>fy-(Osr_{Z)( z|6WN(hYJtAcn&-OWsa@u|Gs8hJgMZDrM}ANzuphp?)5MzoDhJF{uWqsg2#lRL&NA) z!ivW+>m2frurNGOZkcg#^~*=k2Itozo~R!>e{ zF*ow=HD~Gn#h|uc{(g&!WyiqnyEjk6e-v+JzqV)Z-z0hajF`6zP4n|#zP=W_`_)tR zCGza74EGLZv$JVlpZQk$`)#-M7scWli&=7ff1Y&SeSd$%AQ$O9qC&?22gtMbSKMUOVmVzkiFKv-Fjw*VLxy-O2Yo@9G=v zaDH8OV``E6&Z*MVH)l=U^_S=Az8@cN#coNsx+sNHu<%;{^*59D%(4&H%-L0uvi;$b ztry)Fc3lyFcIIO5vRlrrN55IVf2PLWx#Jdd>(Sogd$p!JgRQc5Rix}+__zDyqxqNh zXV^M=9l1J-hb_61_q8%tXvSB|Vs#H$_iK5pJiVT2t>wGs%k}oooSU!o;uD{(*G6eQ zZr{FZf5^i7t#e+V`8R2?nDuL6gO9f)%XgJT+utug@Ze)r1% z1F@MeUmVko-(Y8yb0=u_?vk?hH80mkt()z9A;mHv>BpirRkyD(lU}b$jygDrQ)oZ; z-;fvS3e!;=p8MB!#7tw}%@coRL(_^SA)3#h+q3R>zi|Hfs^hV~TV?IG+yC3SE9w4U z_YK1G(RnwvtlzUNRAB0qtqBK3mL9oZ$XO78r`6{jwpU?)egMM*(K~)pJr=(uSL@p; zZ@v8gwb0cmA^ibB-?i`Yg=-^2|v>!l@upjd*?C`}uU&bz2zeEEhxk9+Q%|3QCs zOTyoo-*_Z0vL-%$OVX?*cM49N5}f$@%(u74!eZa;c6Hq!vtZNP`*kb4Rqwv-`u+O7 zb9mUxGfQ_ysg=aM+r59r-IrN2|7ZOz`kQ)u-G1-%H5yt~=ISTo?!9Gp5uo_}lI=DhcY zdT-dNh^UY+r^Bzlx%jrN`yIpaqvstHgC?u=Z7wqxOxG_Lusn79f88;)z~yeGAU~*Y_GZ1!&$U2V9}WiuV>_m z|6032_ku&+_ElSFya|lFtme^rh$HoyPj1F_Zo|6%g!9!4+GFqj+u6(Y_NblUk@GVQ z9koQ7Y8 zr_Srf)ai2J)UH|=+5hvO-subDn(E!+qB6nY`+sqrp7R0R+vjiDId$J;GtXB(J11Cd zKde5%&9FSmfa_R#`upFJyH|&`-&PN7x%Y3n%Q~66aSd-j$IhR-Hj(v=N9C0B&nHjn z@9W8!xwoseHRKkNPeawnHLx8I4m+`Xr*k|NS`;M!fMdQm=Zg9-Q7uDh$SUE$HW zn3kRd_ z%TGwC-zoa^$aRz9u9-!Of}T&9=C7ToI!Q>dFo#!rf&o(zN5|*8cDma)eJ_>JnjWxo z?^HDx0YTGPo1#g+r-LHV8h-q9+IGFvIvfA-pI0x>_i+22GW&ka+_`^-ciwT=$LnN& z^Z9B-h^X=}ojCb(z2U~%>4m;}VJAG8zMSVc`E>oHeWg$3pRd1FvFJBnV}OwA$Iwmh zzNN}!m;c@s`(nLQ!y z-SLx}qLTI3XX@R6J%2lnKFi9=DvB|Adwa{`m```^XxiF!X-s(?q&^FH zd$nDAzwX~@Qt$H@uD`UQw*BFpZe>pqVO0SRNk%L!M&29y@5kSMd3;?*$Jg++7w#)g zSpIU6jJv({^G7FQvwxkr;&E5^OZ39~jU65y@7&yzg`d}JS7y1@JpSmME+exuSMBi4 z-;-9}SHAICj$=ptF72(t^S^#J=IiSyo?{v(vdZ|;Q(L*|d2Ca$G!~uOd6*4MKwTo$ zt9v&oy?PS3IPrAhHFps!BhAutv-OwsPP7cduJCtiT(XvV zQRle56epHE(zbk4=ls!{O`cO?s^0UdotF;${k?Wcer#!R!jh=^t6YC&nJSO1E|z)g zyEtU!senfxA4Q{WbUckvVgY-Ti%i?H&Ifuho4;CAB+_zZd*c9}G_r7nKt?#|KKvH7j`op*5o8#0#M zJ%1=qo{x>8qUS-`C4oabWwwev4m|$i`KU$GKz zycikSSYtXRtt@Ug9(ts&;W>Z$;>nLpj(g|5o*4W4*8WgEEzjliKRXqfQS9wr$+TR({yIPg=J#%;?ng$?+Wl}U0Wui#_>D!*ZQh+hTnd*O^>f%{?o0# zPufl?=liqr>T`zIXU(end;9*@Dx1F+c`G9RY_9)bc;0f^ORv-G=KsA}-2D1@;Zfxl z?z+E!87!Yo>tA;@;P%=&ndxo3%TH81k!Wya+CG_W@oM?^FYdEAyKIlji}_pOem?ik z^X=dBn-mwBy=(jZ=i9v7f9^lt_RrVArQ~q&=l^oszurl^el+&)?1YXLN3U;s{b=31 z+c`IOt*#g55j4G@adU&|fgSZf{#5)|lTga~TJi70&yVwN&$&^w52TThu?~|O6w|aGTUcu*I4L#Mbs~QT|_SM-f{=O+X zI=ErVWpmRU-}Ahy_VHasz++oY=uAzrOOv^Mqg5)^5IPDe#!BX3w*(WQSwCKPt|C zRVz~fF?g*F6iq)oHs${>b7t`yF$Osqyi2`^SPe!CC1(;$Y;&)F6UHZ@92 zpUD1e2cPte|M%PYPn0k$;0MLRhQe2kFU-EITwax@AYrNSxXnf|;m*g8jOUta7ju_sJjK@hg3V+bfyZif>ieFvaTXRb8@^jH@zXr%Bfb1n=KXfDd)CRI+rlg) z=BXezA&>FFLB%6HZpz|&FTEE}ZfkGtjrrnrK3C;&{M-NChD`=1e}q@(ecG?C{rhjy z8IHgc|L4gl_~>}VU3f2^tip7%=?Sat_Q-7&j{D<#Bn8zXw^%kZYE9>W?I`hEEZJ${XglczS(j3kQ>*c ztIC(cdHJ~w@+vY;JW07ZRjvPe`Rlgl&z$?Dg%zdbkMH@t_(-5Xi$!9;KwpL4x1Fos zt-d!qZu|Ma6F`xWyfpd#oDa`DJR2s<2+K_~eQ8O^7Yj)oSYu7C$+LI)lgt^qCE zG6gMh2b$=j`)X97FMDp~ZMUCg1)3$@xHLfH*M`sr0bxnWo6A9?7YuA-dFqS| z3=AZ#z61G)Yz>@Eu?!_ef8AbxT)!`K$GuA>hlSrn$$1^&DEuOvIC*~Ut4_g%pyj6x z?0e$!Yinz>vsa&g&RwR<@1P*i($;qD$dL}0Meg>$Hf-CrO)hNvmMu1$f*$?&r z_w4D9FCX8|ez?C zqSD5QH31qTT&}gXe;3QkDy9i!?yzH7U(I{clab-e`fJy&oj7qKA^c+b#EBEvu3g(- z7t=DsvE}{wgFj4F)L9uW?60wtf4}ZviHcZv^Ct~{;!CQggBjI z*4(by_$?+hcSAQ5Lqpw@y+yAcxc}yxx9i3ULD!X+(x2`#EZ`*MDrUD*b<-o_RI;}RZuJ0CgAM;}hsTS(3Bd{I@Ly~0C7 z@czGu)%%4%?_K^_`LJ{T)~%8I_IKUcLR#PU|Hp}&&%M_D zwBo~>_qE}2qIG}WUU#nFx9yr$v!ylz!;aNIuT10DUoq`{l=SJ9j1?{-#o8z(ADEj(3~{55*A`_(r;PEO)Jzohc~y!~&o#8z&)7x7vCymx0z zdfA@sPaoVoE#s=Xf5Prp_G07Swr$14F^=>sdDE zSEem3-BYPj`)}UQD z$#?g9xx-u!>< z2KW1?^%V!D*JOT^TX%#gn0LF7En!;eSka zo@h6V(!qlM>C%dVvAf>L*wx&4G131@++MqPD`#}AUoQ}t6jRcDJA2;`UBRnY;(tGX z+LnIo$h5h?t!@}IGcbHI+ikHhMCx6B?4LVd_s>+774B7NS(cN=!?SvSjn?WH&I>HVDQT=oBYzs_FQ(tcU=@$&k~=YC~eyHTLz_51ss zk4v+?*RJ35!z2AVJBOjOm&b_@r)I65Y8u|D(KYc;^sO24zExHC=byX3=c?Ji-CgO& zj{M5Ix2D{zok!l!CHKm=@9Sm#?N!T7w;t*5(y}dW>`-!R@tV&OZDqcA@8O4s+he!H z@;>TeV0fSx_(Man{ODDmD<7kLHlJ3VTmp{?K^c!Fo+L#k3b5VSRrN7JJVA zw?BA$-d4dt<=1ABdi%fpP49Ri8Tw|&@+7amIjPY$E>ph$x4FNs^XY5t;(u>vwq@&X z+jVSOSYJop4%=_5efR%<9R8N~kgC%Cv)dk=VP{~l5?*O^ocp?*&Er`%U-P;$?Y5R3 zeD%z{Yk6H%g;L(vd@~z+FPD4V+3``&UM-vaVMl>g;Cm%5b)}-YH_I*`H) zw;f!PCN}J@+!?uh=Yd8hqR{JMT*^@lS{we`Z!{!IR#{`1!6OXBr*mTPv- zbWuKZ*wy8%IA2}GE4JrvpE-4zymg(Lec%0f)~u7&Pp`PY|NG5GU8vV<{?c8aZtE_c zKC5$&=~7nvpC7XxPj$E6zVE=)84C}Wf4;UZ`MJ^jzvsGzk9#_`n%}wCZRUP+XMV?u zKl96;t~l|3?e)6_)!Nxo|33C6KM_{eyA-OlYD3)5>mU99elBvZR@Ys7=ih%jdspjc z_b(l**fBdk^yMsG^)?e(tcmN z;mJ{c3!!5+llSf_xTdk|OUCnW58AeF{aUhl!P2EqCr)LO{yv|tjFUO(<(w}G(-{~H zR>bZoa9n(mWp`J5lG*IzeX_TopFMo&(60@mc&qTMD+&b}7#Qb)&ILGvwdUqgQgZaz z;QgZBXNJWMRR#v0GT7q!Mel9o`W*yX)}MFnkaU?h#hqn$%Rh6YP5SraSr|S(C0Z?;B;lzh`Dxk@j9tG@P p#p-`*2%>C23J1BRfrQ-w|LQef-LP}2kC+Q`i>Irf%Q~loCICVk=`H{O diff --git a/doc/workflow/labels/label3.png b/doc/workflow/labels/label3.png deleted file mode 100644 index e2fce11b7a42be3d0b6c99fdf45f741b5ac3088c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19360 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 diff --git a/doc/workflow/merge_request.png b/doc/workflow/merge_request.png deleted file mode 100644 index fde3ff5c854f877e2a621f6b15ee1c6ed7ac5a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169503 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 KKbLh*2~7Yy=?1m{ diff --git a/doc/workflow/migrating_from_svn.md b/doc/workflow/migrating_from_svn.md deleted file mode 100644 index 485db4834e9..00000000000 --- a/doc/workflow/migrating_from_svn.md +++ /dev/null @@ -1,17 +0,0 @@ -# Migrating from SVN to GitLab - -SVN stands for Subversion and is a version control system (VCS). -Git is a distributed version control system. - -There are some major differences between the two, for more information consult your favorite search engine. - -Git has tools for migrating SVN repositories to git, namely `git svn`. You can read more about this at -[git documentation pages](http://git-scm.com/book/en/Git-and-Other-Systems-Git-and-Subversion). - -Apart from the [official git documentation](http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git) there is also -user created step by step guide for migrating from SVN to GitLab. - -[Benjamin New](https://github.com/leftclickben) wrote [a guide that shows how to do a migration](https://gist.github.com/leftclickben/322b7a3042cbe97ed2af). Mirrors can be found [here](https://gitlab.com/snippets/2168) and [here](https://gist.github.com/maxlazio/f1b593b0d00aa966e9ca). - -## Contribute to this guide -We welcome all contributions that would expand this guide with instructions on how to migrate from SVN and other version control systems. diff --git a/doc/workflow/mr_inline_comments.png b/doc/workflow/mr_inline_comments.png deleted file mode 100644 index e851b95bcefff033e075d76221c29f2541a38245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193311 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
        SYs60@tiXtVApegMQeEYqB2yy8=8VneoD)Q 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

        qK-!54+e2u(Wl>7a(*}0;(-dFP< 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 BZ1(^F diff --git a/doc/workflow/notifications.md b/doc/workflow/notifications.md deleted file mode 100644 index 17215de677e..00000000000 --- a/doc/workflow/notifications.md +++ /dev/null @@ -1,71 +0,0 @@ -# GitLab Notifications - -GitLab has notifications system in place to notify a user of events important for the workflow. - -## Notification settings - -Under user profile page you can find the notification settings. - -![notification settings](notifications/settings.png) - -Notification settings are divided into three groups: - -* Global Settings -* Group Settings -* Project Settings - -Each of these settings have levels of notification: - -* Disabled - turns off notifications -* Participating - receive notifications from related resources -* Watch - receive notifications from projects or groups user is a member of -* Global - notifications as set at the global settings - -#### Global Settings - -Global Settings are at the bottom of the hierarchy. -Any setting set here will be overridden by a setting at the group or a project level. - -Group or Project settings can use `global` notification setting which will then use -anything that is set at Global Settings. - -#### Group Settings - -Group Settings are taking precedence over Global Settings but are on a level below Project Settings. -This means that you can set a different level of notifications per group while still being able -to have a finer level setting per project. -Organization like this is suitable for users that belong to different groups but don't have the -same need for being notified for every group they are member of. - -#### Project Settings - -Project Settings are at the top level and any setting placed at this level will take precedence of any -other setting. -This is suitable for users that have different needs for notifications per project basis. - -## Notification events - -Below is the table of events users can be notified of: - -| Event | Sent to | Settings level | -|------------------------------|-------------------------------------------------------------------|------------------------------| -| New SSH key added | User | Security email, always sent. | -| New email added | User | Security email, always sent. | -| New user created | User | Sent on user creation, except for omniauth (LDAP)| -| New issue created | Issue assignee [1], project members [2] | [1] not disabled, [2] higher than participating | -| User added to project | User | Sent when user is added to project | -| Project access level changed | User | Sent when user project access level is changed | -| User added to group | User | Sent when user is added to group | -| Project moved | Project members [1] | [1] not disabled | -| Group access level changed | User | Sent when user group access level is changed | -| Close issue | Issue author [1], issue assignee [2], project members [3] | [1] [2] not disabled, [3] higher than participating | -| Reassign issue | New issue assignee [1], old issue assignee [2] | [1] [2] not disabled | -| Reopen issue | Project members [1] | [1] higher than participating | -| New merge request | MR assignee [1] | [1] not disabled | -| Reassign merge request | New MR assignee [1], old MR assignee [2] | [1] [2] not disabled | -| Close merge request | MR author [1], MR assignee [2], project members [3] | [1] [2] not disabled, [3] higher than participating | -| Reopen merge request | Project members [1] | [1] higher than participating | -| Merge merge request | MR author [1], MR assignee [2], project members [3] | [1] [2] not disabled, [3] higher than participating | -| New comment | Mentioned users [1], users participating [2], project members [3] | [1] [2] not disabled, [3] higher than participating | - - diff --git a/doc/workflow/notifications/settings.png b/doc/workflow/notifications/settings.png deleted file mode 100644 index e5b50ee249478f8d5cd3601e801fe7b7d93d10c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114727 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 diff --git a/doc/workflow/project_features.md b/doc/workflow/project_features.md deleted file mode 100644 index a523b3facbe..00000000000 --- a/doc/workflow/project_features.md +++ /dev/null @@ -1,35 +0,0 @@ -# Project features - -When in a Project -> Settings, you will find Features on the bottom of the page that you can toggle. - -Below you will find a more elaborate explanation of each of these. - -## Issues - -Issues is a really powerful, but lightweight issue tracking system. - -You can make tickets, assign them to people, file them under milestones, order them with labels and have discussion in them. - -They integrate deeply into GitLab and are easily referenced from anywhere by using `#` and the issue number. - -## Merge Requests - -Using a merge request, you can review and discuss code before it is merged in the branch of your code. - -As with issues, it can be assigned; people, issues, etc. can be referenced; milestones attached. - -We see it as an integral part of working together on code and couldn't work without it. - -## Wiki - -This is a separate system for documentation, built right into GitLab. - -It is source controlled and is very convenient if you don't want to keep you documentation in your source code, but you do want to keep it in your GitLab project. - -## Snippets - -Snippets are little bits of code or text. - -This is a nice place to put code or text that is used semi-regularly within the project, but does not belong in source control. - -For example, a specific config file that is used by > the team that is only valid for the people that work on the code. diff --git a/doc/workflow/protected_branches.md b/doc/workflow/protected_branches.md deleted file mode 100644 index 805f7f8d35c..00000000000 --- a/doc/workflow/protected_branches.md +++ /dev/null @@ -1,33 +0,0 @@ -# Protected branches - -Permission in GitLab are fundamentally defined around the idea of having read or write permission to the repository and branches. - -To prevent people from messing with history or pushing code without review, we've created protected branches. - -A protected branch does three simple things: - -* it prevents pushes from everybody except users with Master permission -* it prevents anyone from force pushing to the branch -* it prevents anyone from deleting the branch - -You can make any branch a protected branch. GitLab makes the master branch a protected branch by default. - -To protect a branch, user needs to have at least a Master permission level, see [permissions document](permissions/permissions.md). - -![protected branches page](protected_branches/protected_branches1.png) - -Navigate to project settings page and select `protected branches`. From the `Branch` dropdown menu select the branch you want to protect. - -Some workflows, like [GitLab workflow](gitlab_flow.md), require all users with write access to submit a Merge request in order to get the code into a protected branch. - -Since Masters and Owners can already push to protected branches, that means Developers cannot push to protected branch and need to submit a Merge request. - -However, there are workflows where that is not needed and only protecting from force pushes and branch removal is useful. - -For those workflows, you can allow everyone with write access to push to a protected branch by selecting `Developers can push` check box. - -On already protected branches you can also allow developers to push to the repository by selecting the `Developers can push` check box. - -![Developers can push](protected_branches/protected_branches2.png) - - diff --git a/doc/workflow/protected_branches/protected_branches1.png b/doc/workflow/protected_branches/protected_branches1.png deleted file mode 100644 index 5c2a3de5f7043225788bb65cf35652525a0bb357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170113 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≠gwcl>mU%qYo{m$glPx%-AKi&UldR$`n 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 NKc23BF6*2UngA9Q0Zae@ diff --git a/doc/workflow/protected_branches/protected_branches2.png b/doc/workflow/protected_branches/protected_branches2.png deleted file mode 100644 index 2dca35413655a79768911db229db1462e5397018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25851 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

      1. vr(z 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 z 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

        `KM@uBK+b>9!W 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 diff --git a/doc/workflow/web_editor.md b/doc/workflow/web_editor.md deleted file mode 100644 index 7fc8f96b9ec..00000000000 --- a/doc/workflow/web_editor.md +++ /dev/null @@ -1,26 +0,0 @@ -# GitLab Web Editor - -In GitLab you can create new files and edit existing files using our web editor. -This is especially useful if you don't have access to a command line or you just want to do a quick fix. -You can easily access the web editor, depending on the context. -Let's start from newly created project. - -Click on `Add a file` -to create the first file and open it in the web editor. - -![web editor 1](web_editor/empty_project.png) - -Fill in a file name, some content, a commit message, branch name and press the commit button. -The file will be saved to the repository. - -![web editor 2](web_editor/new_file.png) - -You can edit any text file in a repository by pressing the edit button, when -viewing the file. - -![web editor 3](web_editor/show_file.png) - -Editing a file is almost the same as creating a new file, -with as addition the ability to preview your changes in a separate tab. Also you can save your change to another branch by filling out field `branch` - -![web editor 3](web_editor/edit_file.png) diff --git a/doc/workflow/web_editor/edit_file.png b/doc/workflow/web_editor/edit_file.png deleted file mode 100644 index f480c69ac3eafbbfd85b30ca0b1324d824f89409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89039 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 z⋙Z{{C30Y<^Z$GRk~;@1EFK|9oQ)+;whybminMg@WSGt#cN~RoSlF_pofbb@07w z?(fegWWJsrU#(qz;bV#1sen(5{r4R>bbp$OL^BWT$(LSz;YI%@z5d*Mvv}i={#4#+ zd%wNv)X>&Geqa0AhWW)6H{PTktUoFGfNRcTP*+yYa*KTERM9iFZWrA3T9uidn6lgX zml*%JY^m6}^Z2ahc9q;?6Pq=(PBh;;J=^jmN1ot~&ovXQChVK-xZSRneV2^i6PYt7 zt(yKZw>vGqxS=GSDK2)`w*>vonq1sP6Dywxu<^>C+~yh3)z^INzTvgV>h5j3YfrPW zZ9nnW&5@yJ+H30sf!ksSoxAG(vhRFV`~LRk=DX_Vq17KODsCJxOZ_VWGq&;yjeh;5@w2$^ zOkgg2zRmZ=ygTidKAC+fsd8@nuPCmwno&~s!g9&|2FDz|s#hg_al6!OBXU{!e}9)h zFpFVFd(7fqqX(agiZ>Kr*ZX$n=0a!oFR#njuw}TVseOBMulCaME3;Vd9^amNIxYM% z`}bVICsHOFXP-`)Qh#0SaW=2bk~YmFA}fkFoK4FYZt#fg(yR@7ApYQZ&{R&g|9`*7 z^Uj-DRr3Der312yI$o{HN=Z*&sIdRQRhjmz9a}>e&kA=N+hgKDYh+voi<3UiVMR7kxt*N?%`7GB)Pc-}^)8*_od#o}RHA(#}S;w6yHVlXzM(O+2oG zPyYN*uDG}>f0v~e?t1v}_xn9vd=~?Eyj!+A@~o-liA47ahh$d->{455AM|TY`r+P2 z=3kF~rpskNu$j_0G5xcs*UzQ){=W6Bx65RHFPg$Qi${8Pb9-;&Jl6Z?T`OH%Pdh&2 zVXwrTn&{Olqmur4Y zLpD{Ftz2^Ubbiv|WovWh9($m;w6|~n52tB%uWvS5+SrIZkt%7Q#=`IH+!WzFeKO}Q zv$v10?Ur*$41Am~_4KXHp96O#j9=M=-Jg(^@b1o5an@E>-*;^?b6M1xnf@#cTOD!g zck1-GD+;l{L!L9eo%3K}*y4jvulw2M>D;gVC>W9@x^CY;zHiq46&@F6XI0yo{tfkz zi+#(+_kx}2`uaWp_`=rTJ+VNpbY3yP*UzOQIhDJE&+;zh559!q&u)_v)G-e*0{U4Bjz_c{4@Oo!)vm=JVIbL*eW=l44{*k{#&oL}RWEMqvoKJM8M6?<2&-IDFsy!2!_MR z=(nSYqQvQIIma4)1oZgyHEnl0{3}SJ$MnU`<@`omxe*%;r62yQDtZ5+cgc+m4y6TG zUnXpfn7MeKpZl-Iw;%W~8Gcio<#NMS^xv%wtfgwgPBmLPc(|Ng0(eZaY;&|2`L=RN z)iM}uDh>#)W69bpHQQ^eK^t#l{`G|#CMy*+LjyE&&i!g;3bnJb>-+aAw*vZWJ@827@k7v#AA4=}`b&iOz__xTMmrqbTd@WP#oX2{*II^}1+5fTN zpYA*3LDSSvv(;DCemEN*pZM$ZdWZLKYrJnwvY7k9V5K+Hz1q*JVZVE3&D+7=C{|>+ zbN82&9p6u;$3K4FdM+=pDB!N;s-M?qe7+zYaq`22SGxj@MJ%J3_@$c@)SKG3$QP~i z-S^XKj(HA;iInN=jP|}1qYJ9bZ(J%md(e5+@9)opmU{>Dd2LrKm)<&k`IN`6W=T!+ z@_A?D_1sR-rsmDVl{{vq&s0?0AN$`wm&q`jL+;fUDW6?W=S`kvH|3J-^_9wb`yTHT z*7Fyb5|nj3-e_9y{H9A)D*C-y>n7jX&%$hB0HOu{u{qXK< zO!2SKxZa=hE`lTE@|@zctKAZoKmR2oH}Aux2i%}p%jXN2);6}YWE5>Sj#%s9<*E8z z()L9_@2*?7vP8t6ZoXBq@F5HT-$d=RNSLI0~If|$#^gSawjsG zH+Yi~-{M7!rtEwv)qU*2!t~?MgmV{bR=l{GyK~VZp5Nc!9cpNFzInLU+GfediOk0O z>a(vZsK}m>^mzGbO5dG3H`;mRuO9g6kT4zE9Pk)!Vi|>W%uJkQOe?&3y zYswnu7D#>BmCP_LYms2buix+YN9O)B77fXt_)AG3c!9W0i1VlU^>e;Hc&*6pY6ww3K?tEGOs2;q9&a^&CnT7R6NchFiAX>-0k(!;e7JDN*L%Nr{Q1<$dtl+5Pd~qIkAM7Vqj>VwRZ}an zesvdEM75psSGSoWn-)^Bd*gz~X3=NPO!W|FDow6^(pdfBrucoMjwfK?i9Qh3CLY?Y|*`xw9j*9%|CM7>b2X+ zjYVIr*tnm*_1pKE@mj@E+b6F(v$%tdWh`@V7Vm3eVQ;)N?PRIQBi^n3svj z)%}TF^4`8A=GLd?;P)xAJ2m(2U%BpP$zrFKmp|>9^=<$2*xr~~R{v$>=DnGEa5`w! z?>SZ0C}#ebKRAyBo;~nt6<67Oj|E)^cpdGl3VrzSEtC;r8~t z1U_@7*w@$p9KO>tF;8~h)3+DD+a7dUr5_O#)AA%vlP4fB;PHendw0)jZQp4*lP8Q% z&T7+1#d&W(OyKKzcmL_HW|pdxjW>4ZzbecO+_Hwp?(RW_zct6V`SNg;zrD9Pu)^bA zh}ZLFdN=L%9hd8Q`gy{oez^-Z(g&PZrFuTsUwQkZFY}6>JgGi!?{1ZCaB^mR2K8USm_5Szg zbI)%6yAKsjcga|ns?h(({u{qbjg?+GofLr-h16xY@(RqqtLxmTU1k+{AOL~UL>!fD*Q)eYk>tz&duOAi zp1IJ`;B;kE_L6fc4Nhwt{1!K>Fod=x)qK5uKO*>D`?~3NJo}HBOqtD6mcNw2cKhYO zB3n}wzbkGu_DWfH@3hct_DKp3ikb?JNB&g%Z%piB5S;ES(Jnr(ex7LCT=RUpy#0^M zo+(Ya+wdjPIloj~FREq!v$M`-H`TMVBJVnBrFq34iLd#n>K(hxe9rT^=0da0^V#-> zDi}ov$2PB6!OE2b49T7BN8wqn_n&*yFUvR)K^ue}@) z9sQhT){|q^&z7>yo+7&>ok{N3&tDHVtUZoc`w zD*e}I?%bNN-FxoNmEN1GPyAL`;O$#FtEv4<<>%9T^dp=n-+ov3V#mTgzYYa^yu3Vl zr`Jl!uH~Nt{HnjN`F-<-Vc=fhRl9$F+r4??oA+&bqFx)9PgmSo$(j?&#~*F2{i6yr zG<OSz}ub0h=XlqAa|e?*i63Rb6y_dA#JkJHPCev(vMlU95FWo;ZK@S*gqb ztySr<@;mty4?1ThZOT2(R`&kpRbGRQUs878-CFysD>ysG*EwVU6D^$+r!&RmE)@p& z+7(#}NhBZ7Fk7r(-)`!>(B$@JNx4aGCI0@;UHBxQ?OdL}d%m)yoKTF)alzKj^B!ik z1TUWYbp|u)vL4wq^BP^b}U=YY|p7%Tym#m8*JBq{IscP+CewR zclP!5>KCRrpS!s!^>l*S?DH?&GlL(mUb)iI(UI}@p9SgB=QCD+oSXY$LRMJNTQAEO zn_FLP%evzwfAP8c*RTce+qm_1G}QjP@LZslP1d47fSvD+{o?0)R`zZehc0>G)V-E) zv`chBWwqMj&9{x_8lPHM%>Ui0qh#Inb;<=5&tlf=THaeace!J-mdmEM0*_X0d%UiW z(c_AAV794q(8~qWO>XRdZop*y{otv!yC1GDPdIbo-h`Z~D@?8}IH%23|7QKMPfGC- zhuM|>pFdw%=OB2mGDYafshAh4)~|ZZQpCd+WZz$?v3iw*-#JDX7q^7-_hi2Ky=-3_ zZN6yTIwq^RQk@%RFIXGOX|>Bv5ZPeq@-5zTt$Ud(>%AXoie-_9F1~-&{!schx7%(Z zp(zXgx2ia4c1~b9)cz2%8{&$Pbe?>u;l-~QhLt7~zEN2gZ2-&_9i*%^MnRoA+n zt60W<2*~quD!nZB=Tr3J;)yb)PbMtlTl3xill?V;7ORiX#6=#StCr8)a4y<-o_l|u z=Uc1X$`cPlVhoBb;_83bhF_2TsgUs}R>=DCrPKKd_Enj`gwHg(`I+sM^awWaSjYM@ z^7gvm;}U!RpUZx;XR`9dS2{r_0>0f8k1sFH@$2YkzB+%(W#79;_kP|cUHG%5TRLa4 z>W2@@Uavp4HQe{e)$7*Ml_ug>M4sNv})XU;ScZdgLnWv#kE# zWokDBJ0^<81%PUXE8?J{PalEWGbq|0c;%i3+D<} zM|+ei@1OPA?(%d6-Bxv*DbnI^Z|;_VqEW*CO3U`so`pY3FUqgkrfTVIUsKM;JeS4h z>4NN;5A;oMD{j|5y69*8=BVB$bDkUopL+36n`;i2jY{texykROU*79?T7S9O>q>yE zO;hPPc0SYWIw48X!*|l=Iez8PoNB6IAR%jYbYn>rQQ>IIlRT7T~3 zVVPvDYoRjbZn{v9mZn|;Z}5wUZ43&QuQ@6N7p&6Ic1=u_Tg|9<{lVndUv^r*%7~6O zU)#F9Uw&7~+jF!2ZhU4CD#{afaoa!L3XiG@uP0e~O?LaD)Mq8RT_tzsf#_Uc(Os(F z(+Wba_1$S-+1zIC@p|(4i9Gx(r>QLEy))vVHJ%1v%Hz*?3Gi%GH z^6z{sY^=sBJRb7#pIo~s`*+%rl8)3;$(J`<8uUu1zPq_wp82v{b7N_b+IP*JQ709h z`hsSqhiGp!oNLqgrT*!yY5kkmK2UtyA2ey@?RC{6VqyuOpXt7F?`7O{rpM>az2dal zOHVw`%&GbGUgPYhHG5>-`Q+UqA|zJ4WN+NCP3nFmD?cma^M0HD(m*wJ(WSw=;?s`^ zo@jBo{&<>hbmZNejVo84Igzqrwe#~9mTM<1%+=rT*flw~uy&hx#SE(gg+)rr(KRPZ zY%i9Usy$v*D4ux#UhSH?#9+to{3368WiHK_cFf;(MMUQXW$%L6Cb8%4w*^$foK{{v zm?Hde>9xf3_ey@WlsP42h$O6RntqHc(B#mvu*CuL-SfXme)NwtSkjky;{WStmC$v^ z=D4qK+`p8;D%$o6m*}ZgXI5-_y>W&Y!?)MXQHupbQ%yg7`sf-EV31^ebiuxTTsPgn zDXMCUJ!Gsah;Vta1tHzCW&GQo}os-R~4Nm=^`+3oZ;;u|PybK!vG| z?^;P@0;@i!%B1%bYC20kPJA73)TV3yoT{_VowXM)M?WxJ?EYXezx|O*sopae7n~AF z|E2tQo?hNg;dz%kJzjH0Y)auwJ3sGimST_;*G+Zt|KFtR{yr5yGuL|hLHAF5r(W-N z_PC{fweQE%=ko(2LpyKh?Uv2oYb(6@-hAGz&u&DYpXT%DGAqCR-w(PjE-jDSqTf0C z=3Z{OBV2Ssp*c$>$e8z1*DPy+B?=7J=FM&2J85_FvD4=_Sap9E({U;+p}8Wy*1CUbo1D#*#x0G1BX}*(n}jg=7u#2gU%hHt@q6!04eiwo zJO8TPuh9J$^NoMCyvN)%`+w!hMYnxfv`ixVTJDkjdOdefPs!Dq9$%R`UC#YaH4Ix5 zb^KYv|GK?}r+Ke$*wxc-^KZ@S$>H7)6t8YwQt{y8a(|1fD~dmc&)>_x`DD-e{r?1K zM&8WHEBAcSW1Y8K@axyFJHD=Czj^r5oc?=hX9GR@zc91kyq~{2Rp{Ef`#i7q)v6eC zpWpvQO-pNa!T-J6H(NC=kNP};??A?yUFYI-D5fN$=hd7o;_YKx;m0QcNbgUoD$L5 z?(sFBmFp~C+2!)dmG$)>wa(vnWX}F8Hk}PNrEkonVkioO12TY{RW z|J<*W)UZ1{NGWgcORJ7aExVWdIlsMV9`A4aPoa(1Gx^+M)zkkHeHW_57PIbBQ#J8e zzWmDj0|yxP7=C6B+kSa-;dxGV{`dySQpi?NnU=GzPtkGlpFKIx98{K1)L<-}yL-o- z?0G?fx;9M>A;y7xyOyh55Rsn#B5Q`z?=vUQB?wHM7qL>L{oZMA&d$3M3zjH&Y|TIK zcdewgY1fya=E--hw;NvY+$#8T-t+?t(yjCu-I|Kjf^DOxD?}$B);UD?IuR9%lc(@!TDj(wFy6-mKj@d-b!q);3FWr%s)wp#4~3wZ3oil3RIm zA6aeQHLK{toJEEw56oInJblT#b!~d{tW2L)*mCP%598gb`%rOide*j=kBirI28D*2 z^1bm-PxgOzvwNoDlNIaM9eWkJ`u3X7dC8B9#Y>NWlRa_rY~tCNOP4O)c+{LlomrQ^)6pxgPVU>ATg`TwdnZnx-#_Dpgp0fT=ILJbfBso}Z+>%m zIe${}T;KI#x-nPMp2yo=f6FRob~WXNi?~&3e zpylOPft<7ny~mdDAB$J@(m644!piq;TDc;J)*SU%b+e~iIoCozsAc_Pv9gPNfoq-D zhO%ysll2NRIj{kIqMGA7hVQjmXC+%P6rZuT)g_3vnzpwZ7 z-rSip>2tulg7mEs2A|i48x%fzy5`@)mG@ezm-!^d@B3mF%4a!u=D%D62}KRoA5|rn z7C#gCS6BB&*Ew1C%abn?r)q~K-2GKr@oMGrjRg;#?tFh>QnvWfn;*9}O-YqH|FWsw zTkP)vtJ6X4H=i{%aG2iyQF}6e#@B~3VKU!7y1#SIs!vz9u=>_Jd%K~#_|*f8-L$R* zv_1;Cn|8J|IxqLINK^5X1?= z;_~B9qzfL-n7C%OLF?JPEhF1`Ks)$3M&HZt|9d~}iBf!E>2)+CcnTXKsw1$~}jC_d+So!`ns*W=5N zW;V9FEf(Bt_p2v&euA{?+=Ctd_P=*IMy*q~S@Lwn%(HvTebXlR@4NT%*`N7Svp-&3 z9>3#UZL!qJ+qDI^F7K%Q#Ov|y-J2IKU*-Nsd=gJP|ML)Q#q8$xEqtbui=JsL*)H?M zV$SEE+ava0{Mj~Zkzs{LYv0Og&yFU$JFhR_HSeb7t-bv3>%T-czq=74{dwK({9`XZ zyKk_XDZ*0n{LJ5Fj$JmE2Jhz=SvN17QdVp9)x_Nx_McL`q!gfC` zo{FDbW8zZA*5k%pd`57=C!gw1SK79vZ;py|mG5=Cy+YdWo_?c4llQyWhNo{YmNVV` z9<*!DZ@ZPhi-ONO-Z}1cTa2YuJ9gXNInI~b7ToGA$;sRErD*=X|DLmj8%@8b>6her z1aEaKjyc@@?3?>}mL~#NR+#3@e+SyZ|GxOr{H9liX3u0&k~c<0RPFk0+_UHH<%Pl3 zmd}@4^=)fuHwp84zkJ=%lKVGfrc9fb@cLTrniijEx8ldQcN8i&H8l&$i?e5~xHRqY z>wAmYy%TeD_6b+S@7a;Kx7PpctzFL+{{DA2`_bE5d$}WL9)A^H_U4A*MMJ|i&kwcn zzK&GxJ=n}{JXvU}!L7a3*Cp5Af4)+5?*%EV5{WBWqQ&*O_cqdIPbTv6tiub-Q19nopsm3McSvc3KKyGyio%Rgyb z@%iH6`&{$S#y{N1U9A|#n4y!lVrtfv+iL|(mELFxx=uCy@Qu@DLKwUAT1h7lrft(a ze<w~}C668E)_>_OS-j|J zUl>gQJzM)e2ymHnuC(YAqId|<`A}(0U#=N`pL(j1X z3-|EY8o0Q%82-)VdDn2W*qUX@;lpz^^H^JtuA8;~-D$xa-@bl!Omz+IHpx9(__-8( zXoN#`z=M#7iNVJe?)wM*GPqkGq*atWVYzL_f#VmpFwL90$bWg*mz<4-cfG>+jjf*D z=st3JC;vX(1#2HFX8I*)*zGfZ^!U-kr*E$b&e;29owJ*p+NSdb%~PJ8tF4xw|NF+u zX49+UIp;roaJep7`>kKveBHrvhv*&8{Y=)?|Nj1@K-MVbM4{}|+0x;0d3xJ&@Bho^ z-+T9cz5g2vm*~%iH+FCd?|LC9E5VUm%3HH_AJ1XQGipCre{9?*|Al8&Sl0zsw}<^Y zru%%iFTAo{_{_n;72;b1EF1Xlm3dUo{#gI*9J9@;q}s>tzxncWHeT?45jtyuM%kN1 z*V|-oZ%uyxPgFb3dfV#oqitQXIUTWqF0&fG+;ife(6VLi|L3+9kJOgDQJX#C)49(d z7a9Soxi))}7aja(4WdGGyxc(f-H$|L*IRGmkH2F?hL3nMDx`aD7SU6M~lI#b^6uV%^Lryf#JZ;-Ds5M-CR zu>Ob1-o5%<*&7RXB>bzf`FG@T#gB;_Gj1>Ab?cYw)!+Yb;T_p01=R_$g8YYd*RK<9 z%n-bxEhi=>-zBuRM)~A&o$g~E@7AB%y5-N(txqJM$3$hGIkoD^`f3*k7MBHv!YedC zZZI^?^(bAh`OzTzxY?Sxop&~P*d!cCNX}gtV$AZby+R^Nm`jC6_rTNqy10EC1>>d% z#p=gbRax=b6c}vFzaOS(c1$+s+8WEO!&)8DAWDH2AY}epAlPd?C8P; z2ioV%-914aRg`1XrWn>+jA z&5csi)?9rdJh|7nYWbq<&uSTyW-z61VBoxF6Tws`a-jEarCo}6g`oU=miUS6Cp!%{ zuz!o(|x9bV^lWc6}vs!VZ_2wPJXZPdw^XKpT$F@$|R;pxa?aQUp4_+?SaG8~N`p<0Z zjx8;x&fMu(KEIA@dTg2HuF}_i?sAnZ>wD^N7wB@7cCOoV^ZQ<>M~R^;Ue0TCSg^6P zz2x+>&J!gUpKU&7!?{Os%hFd0OiBt&rL7G|4)3}oRJvKF=kE!LNh^J4yKZgxa_Yup z@A8c-%5x?LofW)s|54)Et7{6M_^jT$E_T;}uydJT7mB=Cw?F6Ry&FqPbuWg_csMqSvy*W5^%9GtnIwQRM#T|4u;9V$=We?0KAtMzD7`*IC=v3Ne2Jn^Epox_Tz7!-ZuERo3+FGNsYxW*~Yn+l^$KChn{ae=)Krk`@F)#muE`+(@yZ; z62JBEe)j$y(|cO=&eR>YnrJ9!zi-*}kA)$3rt!8;aunB8sNypG_V9P%Im_n>-`~Zy zu|8@Qk4gCPf41J4h1WmNvw!}#bJYGpnU#4 z&^cBG*KNNaepvGUu~6*PeF`5pXk97scUHJ?9UXY?!0mcF-um(Tlv z#oy|5KgJ1j`gY#_^f5S1Z`uOUO^>V&KFVl|NaxveJ3Q(79Q}u}=JFpdyfW`l6MN8e zxccF);=Y6N_5V6cr8gHI3UpsoaN6p~(TK$U?aB|n9%N+yb5CK-x`@M=Sxu2hCzR2@**|CLd%hH7__Jl<|XuNw&;sPT} zbD6WjlHWxJ8I4E1u1+u%`5vVZ)vM6KxTik%{fn;lg-r|2N4Na`_nxmus?;!SeOxcQ z+>ZMeH&#|f_Ce*Abp9T}^!c@BeKwyw_L%)MwfXWP zd4qLKpdeplS!a7`&5~6Wrfv=Fn+@8O{FmK}@BGLqDL#RH_7qWd<5^FW_MEyhMeW47 zlPe9TC7RR+S9UgVbT}j{D}3CraqEs(w{LKG*yQBsuKU&1z#-E))#BX>=fv~(xu&0O za`NWU5o4d@db8nfpRKRegQN4slA`=%%9fNkI{I)QQCqTTrE0?+)9#Hw`|}^%-z35D zrt#>rW?c!FMfwfJ{O=p1^{phWx8)sMWO{o;-C;GE>LV9#Y^=1sG+Xrmr+vI#*__{uS`d}niA@k*Z?wkFtM>?;6>D*T#p{4L?$tLde z*4+GdKNPO5i|sZ{es}oqcl(C2x3?toPV^*a%=`7^>#u~3EWJ*%pIu1Haf#BtS9UvB z!Z3-Y&+3)No#OMh6~FKD_fG!gC4VSr?mL~28?3&Rtmo)xfTBOn4v!XAHFKEcFbVNX zm;GKz^Bw^Ie@{l#)Jgez4v0lHe;NXo3KdsipY-U`0dD6s-+jyh4 zWVg4^pWne*JpC}Y`Y!o8wO_KuY@7CIp4hzHP(}H{`DNEQ_upqacDy7a=Yxo-(y@mI zuTnWH66YNC*`LZFy#95x@uS2Q4KF@d7QWIv{_x_)WW)M@OnbiFS`F&H_D-(Ph&`fw z_5b%%+COrCl^mY`>&ayQL#oqbk~*6H%q!&66iX{Pb>Qdox&6`kdqpSjpAn^FG_CYW zO{n$GBZpT_x?HOSE|)=Mz@&yF&R;nMGj6b`$eF$Q7W&r3f#sX(hf@aTMO@qg8CwrM zD>F7w(2=tjddW3sLfh^8v)WRpnca}RE_9oVDP#I0xAkGZ3ENpdzUGflzPsvX!3E

        zhS{Rg+j5VdxBuU?O*cBJ;C@_N;k@0E**1oCLTWz$xn0G$-x&H{c>jZYg5eL5 z9Q_{W0}q?dKWa7?a8Sr-J)CC##XR3pF-YifK*WUn9f`LqX7#nIZcTXfLTZzZiQxNE z%WVhWe_xb;eqF`qwdNa=j%w}s_$&Lz`Q(0OHML^}k};dprWVRhKAPlueO+u<>*0;b z$CZ>9EBjf!RGCx$uQg&rfo6_bd*PQ-lUC<{+m1Nf%7IEv2Nn>iV8!A#$BL;?FZ#;! z?2DRniv$@3SMV{e`~0cv&kUQ)qS8$l_kzQEJ;$Dk1)_GlWm)?qMA(=MZZ~}p7d^l# zz3G!|#gDV`0{0&#e0gau@KJ9;s*}Lqsx8Nx&gk6veWp8NTb5aj*nw<`FE^TV8Y>zyFIvxIUI+{bknq*ZXfg+4iFT5$lT!zXRSl z@)R+PJrVmUC_bGfUV)?ke!oOJH%EoQhpLC0SQ5E^9W=s8FTLL zV%_gM|DwREC03x)z#)R=n4A!M_tiv+6F1-36ddVxxX`qtWm(13vnM<9FUmXjTL{lJ z-ld>JMDIBh=Sfzs{I*W4&=w z+4}aoY!#1Z9T4A;@O6?ZM}*7?UaO7C>1KOet1ql8wc4{!X^EQZ;@a+I1gANE$ZO_ynkQ&8I~TJ^=2O9$D9A&)zCKc5Y6M^NJSbV-}q= z+gDh~nnf_z-DqNTws{hHMtFVir_9r$7ne<4@UZL6=LZMb-?`S*=$Pf5Ir8-XzwHmb z&%XcJzEMC^rq1@M_L|7;VutG^Y(BjZ=7{?CF6R1^j~|5i4@>Fq@&KnuaJoFCY-P%u&Z>K9_F=IP ziUAP}(sw84=862s)*gpIpbWGe}LI4H$)AgiNYtfnH@zxmP>&ESNWSGIn?=h3lsLWXa} ztq$P}GnY->SZMM7&SwE0wjQS-i$6b?%Nu^3z4FFZYxem1&yxkeZ!nv5w?Y~R+ef#%Kf>)a?XrDw~KUQ=QqFB+s_yqm3m;eHG83- zI+sq|lLP&`=S#M4ub;)VTv;qGf8WNXSg{kkU`**%O?4#bF-$xX8Jh+gjack#E zfj?``RXkyTvmtU#M`@Jcmui76Y>cZ}f3`aQXcjxN`|gKlPY-r7bnUU*5mk0*N9X*9 zTjj+TT-X@yz4-_8F~*~rCw&WlaV}q+z5U;eoe7d79z#7s4~jv))v3x9fHdfpPVS}Q93uvRCxQ{LiJ6Xizn=^ zl0NVcwiaM{$MlOocZNNB>S41co;iG}DE2VArBIM{Tg2wuA#acDX+7Njl6{S`LK8*g zyQ`1YHr#Dgxl{gJ;>)`WoY&suSp2Q4xNCSLbL)e3>hgzn+t>F>%w|2-`siJEpW|~eO^%8`8*beBa3l7E*gMBnm)S+0Nf>gheOHlEEyH2) zD4|`}EMM_a6YGcSt_K%Q(NQ$%xHL}nu|<9>Nvp-F~iUwkEO-e}Z( zIcuVGe_sDuJM}f1YbRV-#r#RvOoVj}N5tB;(?+`d_WM?~2VRTXZe#LT;ZuJ9at^;} zf%84pT)9!(kFMx;PkjEa#zMx=**w69j{hDHf zr?)jLe!czp;^Io)yj{PTa_-IQY@b&xEq5gGOX&5-KN1g5c(nb{tauLp9_dK42j|q~ z4;IPJdZJoohb?DqVI8?AZ09r-JQiWm&TxMSq>Yh3MAN?vsRj{hkjyiC98dfMZw zZ6D?SZ!(NaKG1!x@MFb;zTbtXGSicv&G$BZIz95n!>tL$g8VU=-07>sPH^4|e6m>~ zVe7+g?QfGSByQRIoOas3o}p|vv*SFA&*eFXGv+UgiQGP=B0^HJRv*;e!winz{sXTM z`@8038QuH;M)}XC1io8e&K!u(p7yxEvU}o-zN3t`zaO=&UgtP}i&=pfYrumoNf*EQ z*!;N@Jj3cc|6xgsyAKZ?$lF^`a(|)4y8{bfT-jtAmUF*hcYL+j{4?|VQf4zhm$hXP z=apt!p32{Kr}9Jfr-@0Ojd!yfkFq`aZS&#wTaH`0A0llwu;_Gf?g$LYXkS{XedqV3 z-!n|=HP`T2GdbEn;FoIO!VqS$wyc6lj_34?zQSZVSGUt;AAYW#@%4I8jd3}n*`YpN zL(UD`Gq}UOtUfUxcyc=H;g+YruFO@DySDsVP^2rk)CDyNkQocgIDBlr@reAeDOjTR zuzjcThg(bdKi-~|+NN>h%F5E{nEIop7Tew@?CAQ_kw3BRB!~EpC`WI!vs-zCNqTu?gRY%&FY8bIvNk(V<|SzIjX+@PhY-x-Vwd^^Q#snR%S@N zWX;(SwT6SuwtzvR^vFhu;>WrLKXnQ$g&SwM_{=rt4;I%wuIJ8E^j7bOY+lWm3pd^V zX5G!*SvJe`Q~bmV2}|RGv!~XmKcZvSA zd~t7=?ys_!ebR1mJ$+}R4$YM4{=e_1)x9}i@AUI*=B&2e z;s;wKa`;3Z?3dr$K3%=GW!pzTp6vN;hkutl{;!*xz+aVcnq4Mrc43=`!3*~T&zuiD zGQTrHQ%>nYld&4>`0Rl)f+|18!1ei5BzmfN>%Wv0dV8pracK1aSJxs$19QJ7SP3{L9A_YIN^Q?c`aFnb4XqWSE{v#in`3^0zPdmi=;7$G9wu5_rADsWX z@vtN}|C$ZzDvA6Jq0-kDo_~2*Mb68nr{=&5K5W$_qhN*)OPuYmkR364Kla)!zU4Pv zSZ>}dnde8={b71i@%iKP_|F$tR%Y|Oxyl~5T9or_@W-=L)<4{GtKiLthbQiCl`fml zs`2IE+mZwMUzN8nVAy!_mmfC#kpl} zxIS8V4wpKSph|em|=q^|H zbJ;Jq_rl)f^ptAu2^ZFA?)&kk_=v?Ei*GX?o;ZE3%{HT%S?s`j=DnS7{mi+V9Yt<7 z-Iy@BwR@dRYwo?8o_z%tY^hrgKI6@vaLI)AV`1Krn|C(+-dn)Joyc94$jQPuTiSA; z!nWt{9ItJA`{HgrN8Fz`;(y-Xwy#hz)ZsXkzfnPeXOVZ7v`x+1w-#?#ByW7Q{^yDB zq6+&WjqK+9Fm~<7FI?Hn|S-Q3N!A|aozBLwTx?S?~^^LCvKHea=3VM z{jvJ}zhoH?SX^k`HmM}GZ~Lyo$0xiCZ>xqM+HTAJZiht9`TLzePm3RXSd?6F|KA3Y z9}hR(c=-88;&$tYmaA4DaqevI&0Mj19mtRHS{%+0uxu=J?mv8Ls`kWtCcJv9Wpihl zH6MO@D9_*SlJ(Z3+wK4J)F0^oSIh5ERKxU#Px{-Bt`E20U%qIf%If@!*C{ZLaZQ+Z zO`LvC;{w6M8#oxB+|=#ZXe}tbB`Nux*_^7w8aZdr9o(wi{&)go?S|~rR&Va?6V1K7 z#cj`N&h1yTJ37kti!#oZ-ObFHlJ?f&^NxrmrrEv!YmJ%p>rG`V<#w4F-+OrPS5(u1 zugmB4tLOi=e-k;KbNXq<{>x2gcW-+*`Mmw%)Wv$Oy7PZVJ=kC^$iw!)cG+@}mnZT| z;3~j-I}faGpVzZ~|IDr%J1k_1uLN#5%w^xCQNnQ6YU|M-A0JPgc#*SR&O)NDU)-^s z*ZT9fglBUiGw!Yu<$H6Lzx8JI0fUx%4gA{{i2BWDZZ%Ul&St^vc!YJ$30{#$lOydP z^|{Ntxd}_l?R_3*vh~Ntq>oHD9w$whGl^lkX#>l4VZUzPe+zh{i;4v{L<+LoUy9y# zFnYhvfy?rB{db(?WtT9{W_7F=&=s0oaD8cb!WGWtho(kzurz%*dSk-W`Q4eu{~Rt~ zStfC-o`Y-iXF>Vd4D*jO-@mvQRFLKPILDUaXw9DB+*5r;^2Ux#;iOqAiy}9teGnBp z`1t$5sq>m-f8PA@_Ic)u+uQZ4O5U_AYErt9eD}tNT;s4cvCU?=w-z{ehiwr1nYj6u z0LL$f`ANI4wlQT3{50d9Ah9ojvd&?955xGW%+5=?xS4aFaA{} zSbp1Cyvq^!S;Mg_hvNtHhJ#H?`}s9xqaR;hzt7?HvzIUKt?Vwe;Of^bR6X)={nXPR zu6L!rxVgPwQSR4gF2U^QhH7%8#NO!~ zikqK$;ME4@2VWn)Xk>r1)R13!+X?>d*Slu4RMh-A+5V&Omi~(g6B*+TI&R#EShB>_ z)oXK_gv}R)Bl1_i%YQ8Ru<*E1*`i6Xfd$yuA!yhD!gkNgaLdh&Sy!_xgdbmARm^@SdY8oh^Rqhd#qNH%q0yP4 zpS_G*muaQ!t)9sf{)%a9SngtS6k+}I;Xs>dWpu%(Q00eb`4i4awm)1TH#gD0$2IXl zb7i-<@=8x5p~sUpWPSBA@%3|R|CT#(l0f^*&Ced3^shUU7nf_IQ)_zuqs0+y5xb zJ$w4pH0$F8uiU7pS!`{%z0c4vXO2u~dz$}*iWP=9+Hgt=O#cNYR7hNsR*}ofKm;8m z01@Po!$!XwjyUu3Vy`I$7zHO(XnYJ~4w_O_Xe1B;4W*fsVi+hTBcSClTy;5hNgV98chIkRQ!*6->< z_!A{GL);udEre6QI`)a3wS zd*3Qu?5%C307=Hqb|HT4*UG=*aCm;fL~!VAm{?XD8jVYh5t9(Vs$AGL_b+=tlQkmha=4P4ucdwi) ze`!6!D%6k%2X~bzkBZ#2)z5+wv39s#S%QP%b*T8Xiiq{Iyj!u9^Nmr855E3KDqBj{VhLW8941!RxH;x&N=2W$d%E`3 z{N8_IW2)DYsrM#L?XJ`|OLQ-@`^06_QEGi*p(__#Sw8Rf%W{QvTMG|ATNC3Gzkx5( z@~4Mq&q2l7TgtYkim&W-L6LdII@CAq#)YGYSyyjMxcAA|A}c|CiD-UOvp0r67 z8Xpa2{atzN^Q!De58v6gN_>8`J@M-AN5brj@}G-|#{E8b#s1^5@Zt|ArXEiW_`yWlN{XFfkfxFp+qdHH8c-GweC@M! zVqmN=|MvIi4)6TFH=XAc-_#kd;h{D$yDP=lgmr)1ko4&%v&Hj!<%QQ>-514ApSHCz zc0abV`S;WVlS*$Jq-UxbZBJJ&j^;DVJFiz3s<%3!#B`Z^{OT<#kNvloWwu#FSlRx( zXHsLEEcxgTU(Kf%tsA0rj!v&J%Qf6Lf3uM8Y_&(LF7qAI{~VV5>=Eye+J{w-e+eG0 zT2$MuX0fQgt?>M+GdeZa*{s{%pK=bGBYpR_xv>rR&SmMhHt0&Q9J+q{3)$WuOiF$H#-<~SnFBb`EfTxwX@UCX z>mOJ>|E$Tr#f^e%nPz5u`8oY%L_6o~tsw0`&3%h%_(#K~Sh zyiWS=vi-kmC3kJf>=Mtj-1=jmx7@!A0vhfzx0tWbD=fJ2Gqh~sk;4K`Lj2mV^?v{V z-KHdG)OYCn=I}??S+gg^zc5|HC3$(mvr9|wPWxFu{cu}xpCv=QZ+utg=j%z|F7+Pk z^ZY!e;?L_1ai&57rT@2Y^TJlp{1=e;e>7*$_qTgGCi1+yd90(^!+Y#xuKugiVGWOF9<&D7(f_mA)SDZS>s^M5@YbwP>!$BJwnkN&m+?#IYri!?_fqewfD1>f z;M|le0!N(f0^DrBFj{T%Ia+Mq-|+Z7y9E0`-^cq5%Cxks3{oF$|IB;&*@f(^=Dl^; z8X&Kj7^CDbac$gW@}`0BSS91O{mFb`C3}y*K0YUP=8x>FVmgt#MZ2%(IX`$mxkpoG zU)6OoLPEYf_-j? z>cvG9r}Zw?w?$49*9=mJ}Ke=0bkJv8j+<4^htrxz(Fq?CYzq}rN*?rH3G=-RTUN27?sZ z>IsWqHMQo|s)`efFKA1BDbaqGdD`cE-3MvA|GAv=_PlfX^76_e7W2zhG zRQ{d1cORI0N^2vhwLj}T+tdH!pmVjq{kNaYZMTj7>z)2&aLGBy>2<=fI-b(G&%UQP znJxB{X!zXsHe7Rlfj+1KYH(*?kovmrX%!Z=ze+y%Tdee-Zzo|_b6g%+vkLY)E|>f*>mud z(9wg%|K7)@JQrOQ8nvkKgvaYN&!f}pZIdN6c#Q5Ay)%%p-oZWZe}9JjVC|n1 ztj9D@eeeIzxBpyxwoKEfhligZ&e|xkT=8>AikjSns#NvN@HOm?#k*qV z_v!gItaoplYZp%XT%T{tJ2z^%+uCdo8y?4%%)yJUt+EI?RTB#uOH{zneJpYyMOh-VL6d zRQO5J)*$y@)|yjyBLDoH$ZS;bywyGAM8~|wF9IgQu19uAsBbEJuB@$o|Hq8>x&OXz zt8Y|1y(8`Ut+_8B+x}m$=N$Sng=J2CjQ!*M&s(0p z>S+HXYy3v?d|<{^9Zu7 zaAESMrp2>%i*B;%3FFq3$7szpwz)lc`Mv&V_~q$R*Xp0kToza6d&{|thrRiLfBm{c zv*XV?KKmw9k~6budj9|LrB~si_rH&?Y5Mf;4%3}4 zZ^UnG(7nB*=iNE}*g_q-n!nb6HfA(`jGWve@mM8wUT?wc&+$?l1vDMv>aQsV3iC_8 z|G2Td?$DW|(mh7eYsF;ltyf-W|6Ab5E}5ye0cw z1&438ix{UGT>E^?$Hj5t_N3E?_m^90b>H1^U)q~h0JE#oD5c z=4LdyPk(&V+w9Rk?|#1BEH;HRueI4cQL#JLI_1a=qxZZl%{Mk$pBH!&B>b4?daByG z*Ppp;JhFx2YYrKoo-{eUV@bvKhv#J8x+G3&O7jZJx#H@)c@3!N;kNt!wT!ybP#Yib zKIXFvwY}C}npE(|F}An;!ish~6FC!}ZB-7_r`?zu-SB1>MZ4PXpNVNa ze*dRr`?t3Zllfofy-5lA`elVwu1=~RmUf_0z;5y}fP9&T<}G z+H>&3iP`oI$9EcAzA>9q=c2#G!`Fmq)xG+ghHh_ImKndVWdCUBx2Nv=%wzvQbM4*n z@8!ve?Wyngn)lg=sLNb2oul+Z3L}w#1GJ;#K%Fo@b0fpEv$NYRi=QPtKGu8U>{(YQ zC#I;aS*?!EYzy=6@7oZyRxotgE^+N=iKU#^{`@WVwONzbyFKOUq63eetGsNIlsY^U zW_eh@HB(WalIs?Gchk!{?DnlF{dgg1W5TyLH!FU>-M%sNvf5(SsBJl&i~H@Q?$>^g z?L4oy>xI&n_xI%wUdWhgdLvDUKU*Mg%BH-GM~PE5Xh`EQRgh_`mRyiU&HKIIKb%yb zKV`+48HULQ2?rPsb4~ou=bJvSQth18>ork=0;+P?JmkBxmI?7M?h2lXrGf{oh-+oZ z^0iq~U{U!g#b<`WK>_BU|G(d_zpruUr270GZv8z1`Fp>L+5P`h{CM-`^LDodcl8TYjf;ZS?k}M@Kq;#~4?9NVrq=dhG*8ZPTezlPYFR-Yk8;?z8H@ z86UN|xIV4!(Xrgg*=O~OMaJgK2dl)H8Xq^D@?9y7wa4tDki@iANiIlX&yPpl+9Lln z3@*9;Y!#0?Ao6de0&Fcnzx}@*{;n^gtn2<%IM=LMc_rY;;rIJzH|g*H!xGo8p0y$< zD5&sc>h*=OyZHi7Z`P9Zv{}PtdRG}+)>B{#RStOkNHI1p{p_sP<8sw!HpFbc{r1H9 z``3lmMQ_h*Tm6YuJf>l;b-CDeH8Zno1slIs*zEZG?Y3dTg9B2DI!m}1|L&wC1gyxDwS zNnf8oJf@JcT@2;?TdHMUtzvc07FMkm!*j@U%^&c~zNs^>l_Ps+E zDyk-i`<|Se8yT@Z&-7oEfq4D7xtv`SmrlMd+Z>&@oB!Q3qP*rW5m zzr4(ze7w)pWsSG~-YYxOj&um7c12yxc=k(2PA`6&#ChA_^J@*ZWL*_|KChnh*0$a= zcP+HD+3(dpH#N9_X=U;BcM`RKWiL9&70LGMrqo8I-xwnFxlTx(^#7cgv))nL^V%<(-)WpN;KKEeYgMDt>_DTtKVxq zjh;JOMJ}v;-a9PgI-nuK6C77|RCqWV7#j;;kFT$tscQY@f^*^Lv*yxG3TuVtSH05w z^XasHYMi(DvuV1~r*e0S%)N6*=1%SN7qv-__i9e>&A6|qyh$$bRn{@*nuIgCCr+N! z`{;XrA9KOY{qEt~?^oT?`3PD~4PUT^+GPpp1r;qeQy%Ynz3#U9ImPZX@ALM2bOV*K z#m~+h+)?=W!PlzqD}8To%kBNqUZT6qHO6vDgZzCz{ zWB>ODuid{FbA>9GZqI1F{l4Nr#{OGALj2j2x7B%L8@^kxQFuk+#|iDF0SUjpUXSm+ zJZ1H)yq!$XXSdHTCaah~cUOG3nR+Rr_>6yLT6|}RfIgj+1 zTE2R;`r`Kn#!}hZ8&4-!NSJBGYG5x2uc|40G+;@r72`i`C3thqtp^9&AMAMSz92Jd zb5{9`zjGUp9R7Qk=~peblB@BUi^HQtWTf6(?4`xwn@)fA2@3ur(1< zf%1L*{toSZb1!U67B6{!k9%#@_TCr&ZtaSAl$bm5+Iy@4fuHs4$|#eGZOqzVb$NvGVgr9}r8 zEp>&D8yLIW7oLp|3F&aD``&B3 zLi~$egMMQ7q{CAd6*)7Zj~hzDPnSOv?hA@sSQ3cdomb}jIU3>eN#i>UcqJC-$$7YZ#`0UJ#1V3 zO``eq)1tTK+uvmLefawN`r_Q%yDC5Un!JvTjC*onk!$xUz02P*13Xk^L*?f*6&00` zk9l{)Vwvjp%d@hwo;Y>N=$4|g^5R{Q({{vz#v+WYL!KS``s3&G_Xdx@#~--Sxit9m zGu?vgw*3dPwz_R~4x1Kfa@09W=G~2rhXtm6E7v)G>Q(I2_o{O5ma2W+ptaZiJ9>yZ z{9sX$YdgP6ZT*st9fgnG4o}dSCDsAzPlVmbzrHrMH~gPD-_4u5zwdlE>GV3+{dLV* zo9@5Yj#_rq~1gZUo1nnX42a$Jp6kx;+2FuL)HS|NmXIUhM=jcth2Xo4b{}257n!Pdca8%B{ErN3W#|u=Kc^8^o?h^I> z_{KQdJ4JH-gpQ5>}}y~+3)UO z%e7AXJW5P$`S&vp6gNbgFZO$_dHk_8GcS7w6z;sUD@?M*647cAoAWO z%gsmL%NYMrnPc?mj8x9V+Rf7{B<%7)GkJ&K>+T9dFNaq7IXp_ddh_a$xkCKeOGk`4KYp}i3IERd)c)h!Z2fO1pMSHKcX)m6?W(!;Dv};H zJoBd!j%#oJL7Bab;!p)D?zxkCw~t?~bqkTR8vs z?(+A&tJm*c>h&}1xmsuY!^@K^Bw{}nyt}hAVq1>nIm_pBK1eT|7;9PiDP_sBWsfE} z^R3)$`v3L%{TnJiCb2X-etCVJKX&)D8aut%T_XGcemnp9%a6zX?x&~ezILfSq@nC$B)PT7nk`;%TzpQEZw(jclmp^)7ff$&Hw)XzW%c) ze0#(E`hPno9zCf(Kj!Y5S6}|F-~Z2QSNZ!sMd!9FFN;<|Yjoazhb>2(&s`SRiD;Or z9e(Ix!GiMl_g-9B=zN$t?6B#iiiqZh*S8xr)w=fVv90)ZvVBA8>t{wU171kmJQ4Wv z=BjvJxzAD-WAk;#|NJaA$i2mXWAg0H=f7^;Sh(Zux8IAOiN$6%I_XWQkg(J3Y_E=- z=-e%K)xL2~_uKdT|I6v``;qjc_ri&Fd!Em$zOXLVI;QUD)4qg3tZwNZ z!PDCo7Z~N-Fffo|cHP#<%>Jmy_?(8``&FT<9Tr-cn_tg(zx(|@Y1^tV9Z|KbCI?!i zCf}T2^U2fZ_nXaa6QXBlo}FbHv7;byuUPu3OZP#;4$J4)N%hMzlj zmX>%WpQ0ID@TgP$(U;5q>x1IHzEs=Be|hcpdr^;%-kYENaM$Z~#%2ZQ?0&y7 zdcD*BblBquUzs7r&hM!XCPxl0TBMYG?ws%E3nga^k58Gg`MQg%y6>zO+v;x*HXPS)yQQxbcpY zxR_Yd@jltMrNL2AQg`yoJF|c8y#K!aXj0?ZH16NKPf0D%dX%Uj!P3-lHA~aDx?X`} z^--p7Rt}b?JzEZ?Y>qlmt>yJc_49YH_|x|vz7JLRv{}Qq_r$xkoF6}2beDHsAGf#Q zlBc?B*o>g?{h!ZSgO0vjx9?ZhhsYC0HhLC**mPRYSf|t}I4w;rZ};16R;qHdo~~Yz z^E=pP$jSEPw0o|C3a~!7FcfXU6*aPbbwEl%G8+ z9v`!K+Sl@XmFi{h?sRIe-*f55-wd^9rz?LwIM_UKLcre(MGvR=K1#HhvZ}(jR*XL~ zwX3cqF>X(VqbO%cjr3!UzFkkWwq#sf<@SkR{qkR3xlaqf9^%%2uzY?U6RV4H>6;rD z1*9^LrYy7n_k(%;o=;pEQYbML7NQ`5C8A~u_z_y_gC{bs%net-{1E>^DcLI{=weI`wj?SpVzT(Zgj$v zz3-K@cR%sGzm)sOiK)jQuA9DZ-G)0SISqe&SonE^mN9p@-M5!^*FXJkuG)H3Rh`$V zsK)c5sf^7ZX)ar-|Xn78HM&x`PptNn7Zz-q2)UHg6C`F3|Jb_VW9 z+rRi|d`8rkjERY<<|QuzE+q9nJ%9eZdEM^^&HQ@%rhI)+etNpTxl7Ko!|$EzCtKH- zNNZ@zR=?TUX3Z#k^zgU0x2310UtZ>GeB^81-CdG@yws<4mZnK&u66aE86Y^X>35H$ zagVFT=`%GmDtL9-orRrsCLCYpJDZ1b-u21Ktd(j-i#$BKZK6c}{dnB(W~=$DlXs>+_k8-nW4+Sdr^^m7vcEape9b}TamuwVnZYtuFBW=ud1+0q-0|q) zBvtR8ZR(p3^V`e#&N9)QD6gKpWlQqS8}~#4PS4Vqc>n$W|9J&Vv`ywGF8tdotq@=L zbLqiJxq`Rs=6sp@Zodx8Z;P83boZ2es@mI@DihlMjm!{b#-{*R({;-Gj znSbEq$2V)vZ{Ba1Z|r*MzSHT`n|x;&F#6kmy<#VP@YD`N`Av^qCawG8bLVN=%^!CR zh1W9Q)T?Qmz}Q;yt=!JP&*D)>()M2-^AywWP3>%-+I!i^Izv*vEqa@7^tOa^b1W_1 z?RY$4?%Z4*IgMY%I)7frtKRpXx>d9L;J>r!Ju@wyInS?u_FRVh&Hgv(HF;lNUOs+f zi^kj=%Vd_{-j-{8Yj*O&+}qoZP7h7h2{~5q`r2AI+X%OP;k!y+CiTeM-9Br0HeLSr z#F;;2^kVZj~*;+pB{0+MfEd>@y+><6y?*F&n=Vs5pd?j2?MdmB3e5tmRxY@KGbjb>x2NK zWx#pc?=j8^HZK-5^C&j|?e2Ea3$iYK)zT@fF12<2`bQ66`C32x%-Uo1=2mb+b= zcDyA0G54hVfig?J3cAX1WygqYKC{Iy?a?Bu5SHiZBGwv5_I|nKef0XqIU;2mF9O~y z&~O)=Sg7Qz%dW{&7(UTP!hb@|PKRgtX8HH-{P5-aS|Xcp_eYay?D>~nr#GgmaRvPU zUjIM6;BnLZL&Eiw4e#u*KKbSA_4wvRM>LnuX=<0RyRpKaHTWOfag&>y_c{l=GR5w= zbK?0yc6pOiM?P&hAHcGp;zXIDx~fRi4o%04y-u(G{QTVe{7n77&+~ezu)iYe=*+19BZ;8@}N;n)yt(vH8gZK#on0r##*H0 zhW`J*@9U+{o2h+D`1w;Ng{xQDbG6@RbLXFN^?$#*N#3jZd{*er+5a)6S3}#Zb&m_L z-DAlY(eACcb4kTx)jJyx_)6O4Yo6F7A2=teK4E|2T&0)!3tLt1&(7a>Q{abtk3`@i zxrYUhdDrj#HtV9D2&3h_A9f2X&TLGHIJ`|;s|({6d&@7L|#SfC)?mHg!3uePWyZI_qn9AlTSNwA5Y;iLGs zkzGzB(5WxD?$}YL`3q&ZpZI)VaY17H9fyUfTEBVBjepE}{JB$XxyZ@YR$^L7C(8ML zYtHW$(Xu@DgJ;Q#Q|XefPHNM7KXa??bJx)6lQLc9axGMH`NM7N*9k*g^g=7vRd`IC z&}KX*d0Jin%-1V7CLf>1Is1L_x`!6^kM?wZ&dxhm9P4bJ!Zpd~S?Qe#Pu~}u6_JOaqpx$qKgi`d z8R?&UedflID{L0upYLgUExFF#S9$TPZ(5!0S5+ep{^fPFF#q8WGOio(AQo9=<~x!g17p6+zJlo>l3o-p-vThyIz zKOvpJC$U2?CgFnCQJt~O=5SSzIRuvj}ANQvJ0{1dYg83q|P^9%aHl<@TU(?ofj_ua!}z+ z_oAc4=WWw<=4f^pe`GDY>}xK0D6Mkcp_+piyZWzHEevZFvDtBBsp?wE{QNsR3foRN z9-Q3yNO-5wxdoL4jJk4`awq02ipp3N;bORL(WVdIkM+yPpP92rp)x??2}@Jz0tdH) zlOL(sFJG$q+V^z=*Ls_j10vZ!ev5LJJSbR+vQ*F2T zy#4>0#jm#5EvYzWX7R8^_?x8v!;bbXcZ}|4_&T<|P4x>o(XAwP({P!}WX)N@AC?3h zb-CF4Xp?5Z$IX$O(vrzP0 z!~>OHCso$u&HOX}_C8)w5~=+cYn^H~kE6U5^x5;+^@NEiJ(`Morv0>ri-eRqFcYnNF z(s1IeMU~Nv>xIm7A1U5{9J9IjvC);>nbIYH?BDa>EqG=v^`1+TZAy|Jyd`{BKuBbGW^Mpo+9HrDk{PD-;(JY7G35%ciUdU-Fb`G)eTs`{?> zm<=<<{O^2R5b9LhhHqWKYT;G|L}o# z)w->Rd?$9bZ?SrqG`HUAuKv!B#W#ZHRd@(?tve**daB5L=~Z^!j~4GVasp!>*e)wL zeAKjj-;MY)t(vWwQRhGMubr*&=Ht`D;$ADJF4VO6us!o?)`ys_rwqO?-x^!l`1$9i zMFuXf4_`P^^W)QFr7b0k1ddKO*Iny1Kg#Rlgznb?j%|is8eOxTR%-4E+`{wJMX}Ag z=#Py_sM@mv_lf&YZ<-*;`twp}cU{*c5vBv2WRJw1pztVu5WrJ>>Jqh_K?}4iaai>h5IGnMLcMkAZ+FL$>}%S>m$21 z^0(|-8glLa8KVN7%dbA{`FzfJ%?0n}9y>n9*_CHZJyR8Ev83UAr@ruS_2bgF`yO`) z7yBh?x=gk_>b&px;mWotdg+yq5|=#Qvgx0!=gl8`9xt&9*}!+!{*syLdtHBRw)x$wL7vuRiF9g(L|jnXG;me0O^v7oUyZrx4G z?;5h7FMPT1$n?&Ylt;%DZC!mDCo{>OKD(3o{@E>ZPwtzfEhuwX?S5|K&bH*AJM|WZ zi#~rYA`t1ePSoQ4<6Tp&n6G=BQNFTap;oRYXddX$p5=<&?TJb&K2Lw^|8YX|T<(I; zPt>^twiqpOs%p8iwEvtIp17 z*EWB5;HdgL>BV`Ezvb*P{(An=jP`|3*JPePynX*X?thi<{}oT1wdJ~()*X?R6&YN{ zA_trv?+?sbup@L@g@?G+t{X)Q)1$;^J$>BW!kxY^C1bA3$5tk#_=f+#@Bi-+=Mi4N zaD~T2Ws^e1v*KcFpT3xNOxASY4X4MEADVBZeLzRyCt!iAMTQp2uy}4%Q2=DUz zBt*3j>i*UWE2`^Z5!tlU%_Z6&0w^N>+nAp~F)R)JvD)Znu*}QMA zQD--uZ~4rld3KY{M}tX)r(%n`t}g6MKDQ-~_xsPZd*{s(bgq6fvsKCsHopJqh;vuV zv)#K)+UNwB&5P8$i>h3KKokh!s~%8JiWp3Q8p=iGSB^VS}R~FzTm>i ztxAWTTGjH{F5jA1?4S4PlIu;LVAsd|=a!z`RQS(7Sy}Dhx}E)CdVj^1E5}!Ys$i&|&_1W>*!BYp%xAPrUG7i*vbhx?O zQ7zbJ4M$*ZS9`rq6u(?hkd@)S#Im@=-tKmH{#Qabglu4I0b0t=evjH$^|x-#xjUWl z;%koHbpLuVb-9d0p?_D1%@gl_edegNR=I}5t(LbpZ8>q|Mx{vBjuYD6OMd@&+<)+> z-r8uNgZ)lQzXLNrUf80+xmM+<^5vu+y$d1-y|`yD`x?6)3){>kYx zZ~o8nvRRVg#Asl$O!{`?wDz9+VNp9C8u#Q$_0(q0YY4BpZXVUdc{(sM?qMHmFw5c! z*;ip+rycq-yS6P`ZC`Ib=bu~R+~nTeBN5X?mv-&A7&MbBwP^W14s0ygVg0>xT}{Rvoq11*gLzrCn|7Vqw?wVy9S3_Vgb) zawF4ZBA>5G@Um86SKfIZS@WX2zZ*yC&U&QCe0ch{O%I*!mL#vuUas4I&2ZMV_Sjn{ zu9Np4^|qT3ER!$!mv40z8hdxQ$B6v@zW={&+2ti3ju*R?cw-|X&GeKqTR}%6iTxKjDzocS zk@z_tHkrN(kHpDJT;f+3GI6zXM_q4`n{!Yi`^@C8x~F@mv~s%Jn5<3nivCcryf19# z(zQDx*sg8gGoxLEw=(|)=bmK@KBv9k8EuLw(NB#r3RZcNzGdIzy&_&`ne%*Bh<3I= zEaLvFYaGAJ_k!1?$(*~~ryM<8GLfe@TH@CFMTwOj2WRA-D>Im^8FTUIZ5y7}N8*z0 zQQpB3i?&LaCppK~Y0mg?Q{tRv#g-M%Qcm|AjHtR3qPDNaTFj?W&m>QyzPol_lJVWe z&cUgFd#@L5Zg_j*UuYax`|M0d_r7O&n|C?}hJM_zDc$4cr)lbPZdQKUv-tvSc(&(E z?QEa8ZDr)PPe+`i`Zw)$ntyRm`+3&SI}iPHo36CWrqxb6L-k;}aq^C~zKI#VtaK;*Q5#HkDn44tOXDcr94h(O$zpJMaAb`hS)$RF6%bW%-_0ls{8I zKx)$REfptr74{zearn!rhcPqXC#>^6^T9Vp{Dbkanah_mT>rw8=yv*W*AeGuC-+#g zKY2gRFXr;p)C@t-{>c>*oNGDOPpyzp-0-*H=RYz2%v_K1Etd+f?)dSbk4?9Ahr`1o zbJnHDRJ8C_-8;?B&*~DK5pw46UfGq4X0%^@nKiMi{g1BRsTW=Dg$?|9QD+L$JCeFJ zVmsE%r#vW;&sLzcAr$;3LBb?<)1A)_~Y!1gc8oDk7m}M*fV{9W|VKB z&$6w`cf~aA0u!EaPughgq*9HWFW*X7JD7{_m9^bFA~9 ztvsGK`$KDX)a^E9xmk|wmSP$`pDu7keGRy=_`>mB?P^gapQQBeoSZ*xl1%-x?s=(? z4+{3gCe15z3lHEj5~;kwCz2g0&eduo(U?5xk%X?u&9IaM=QTckvOVBpmU1B0{<3PL z_2ex(c&5*;e89`9xr^y?>)dI1BIj;=n-jCa?hmiAnd;|frgLg8zP;R2DwcQCLU7^J zjMTi-%S0vCuB%93|NMM&_usa^Cv$@PST`*@apb(lq5z8}6XI?~O`fyU^H8Vc?ItGa z+iTWXOqn`&Tg=Rg6J}iLIx{w=YE%SINUmS7+wgO`%&bd`>Qn!oEs5u~OnLH9HaLhcc$&!9e2^V<#FHJB(=WCIREceYTHa*H+US+Og;ai zV1E9YO+Fi%FUp*gIB&z5a@+g2Z8qp$*|Av5cCBMqd(4&#OpV-=1GX<( z#jxs}tq}ie=k;ap?#_RtsCz=(N?=n6JaCa$`I6ry|v5rI@@hTS{^a6y6l=*w7jeEU&SUZUFMl*E?b;_^|Qx6G0Nnl zs`J7QeGabBlF3U0+_lBKBHysbh!hq2K5XZ%jAAaDcwU^1_231G=q(c#RyYez>UP@2 zV{}YjH_lnS<6%d;j&*!Tj7afEPi>!sO)?t_7W?7A# ziMp(Ha&8IxW>~gW##VMdz9S-Z_~Egd9l|GNJ*UlI#FCs8u&d`LHX$0NnlX~$kY*?)7r#)hI`Ws^L0$-t6@**2$-eOFPpnKNbP@(Z)} zM5OsGI5DI1yocWkB@O(ySI=IJ-yZlL_>zIDjmeLHzA5=`gJy&jQ00)R!v!pQA%cJX1Z0#akZMiJ6p2Letp4>XSQf72cligycc;S|q zkgA;9CDHHaxBd>cd2(oSH;bJ`#TTn&m5u$I_=8yz7d<#4%NCV6a~j8%fCut+IX9l~ zJg{u4u&cA3go@m|x89|mHYt@i;zZ79G|aH}4t@JIrstBE>J_Gz`5X0H=WWZ0IuIc6 zxOn2U%%^WHK1xN|f0`-zN-zAX(I?g8Mu9%sx+_9V&!2kt*m!#Vk4WS#im%Z-0tPx}(bkg+((A7PBxX9C;&UaNP9$s?{?NuUh?X*5O_27{xcQTW87L zb#v;18KMC_DJsX`+f09d?wZM6+p7=Hg`EHM-m>_@%vY~g#ot{wv+md4@2_mG9RK_> z-%9;&;F{~H+d`KwJ}z_oY<1>FnfoRA7feq+-MXSdZ+f+dOmwdB_tIIp^$YuS-p07@;{IEZkk)(alI)%H9Az_V&$wyasK;bJCaX- zmAE0t$Rgmdpo&vONbVQwjW6Y~+m?M#t(rggmwAwh$d&dxS{xVN*Zw`boIg2Ka>cal ziWSFyh)(-@|CfW_uY)_jEf)xQzHV8Ud+2{{@eAk8ZX_^&f4D)c;)+sbmKA%gz>59C zf7#dkvUc&k{o3+U@12udw}*6p2sq5qI(=>O3*KqZs=Z{DrfWy&-4>R6wkXu}c35h~ z3ga-zjjO~%N|!A-YF^v5@RWXS(u3JreIXZ@8l~MY`5bh$Vb#f+r-Bb3YRz5J+CKH} z;l=suw14l+KJ@wJ^v!LrUrt})RQ=cJ`tq7zPuKXXXL3y0rnzm4OnCzs6|vy!sx|5+b#?Rz)*gTa=9hridq`fy=>W1HDawxzS1v|2ZX zE_@-(e|N`~<6k+Q78Z*i3B59#n>TaSOWpaF{HqVG(YhBCezY>|Yw;`b-C81{wbNE| zZCKSm@wvN#e51;J=T(nxnB0l44_~$NQ~3NR*(ZWh`?F3yk8+b=Ec)nc;*z@guiuC8 z&c9Y7ILoWKje&_np}}Di%OnxGW3sA~RQ4yydwaIG|61%`@1RxDY36IUw)2&!tmw#z2Bm4-YE#wSo>{7md@XW%UctKF;v&Tboczu!#LDNlw12ea z8Ve>DFlivkWmgG!eg34Xj{8hz~|QjD#xDe3;mw7k#HzNbcBo z6&n?sp8L@^P=oM9e8UHW`rQKkIyXNAEWDq){chUn>H6_!T}4}?3|uG2oSSW)zjeO0 z$(0RHOZs)yj2oNOZ(5;traPrZS74f zf|vK%e!o-v?dkORbC8>hScqs?4qPv$xKXExXb9!N8?oYh$gLwauFw8yCNx zeRZRtoRD1D@w&5?ipa)(V&UMQTW^X}IUzZ=_bE1vpbP{P5k`q?Az<{^;<#HPforlgRLI-^|Y6rzy^}%4(x~zudL$`SIbs5s?QKA0}?x6>{URh_%g?i>sId6(3Df^*$tL zQ@!4ZF?9MR1PrjgP$;N^fI06m~jY~KLqZmg*PDU^?iF^*#-t!YDCz(qTuG$cLEa(Zv8t8$rL6 zj$`xU1OvuH&W8@SlzQ^9qm;OiG^C)()Y9J4?)kD?h8-mzL2|6aAr=mPPJZEQs+KaN z9!G@VXp9faq~7So$sfKhCi7n>m*xMov$G=CMs4M~>3Z$>x%u|@Z*9w!&iVgF0uhS{ zR%4LRiYXro{`~m(?U;1F$eT;+TzrtTUA5A#wKLxgWvD> z=fB_gJI~MN@9*#1*TwGMbv#40-YL_YiVbb9=)W77FP6%ng!dm$|^NWO&^1R9o& z4<0UD#a938r8;N4Ui`nbJ9@^a^98XvFw{nmVS^!9bXPpO*dN_5IXY)1`+ zD-w*Nw{@epovAg=yR+ktNyAZx6;nPKTyE0zaxK4KTV5_VQ_S(>!P_eW7q3Y_Kd*EC z=K#_6%gg<@n_i1J%-X&)EJp0{qD}nRN~l?i58PjA*~IK9ShzLw^0F189S08|&f#8m zWp()ZUteE~zxMj~egFT`(00%G+@IIu>r1D$X$h-Z^ps}a; ze|KH%Zl-Tx{}vuR?97@uS>1n|`Mrw851QZI-@m`~#~o15i3%fyg%F;BSO zk4c-EvAIuziHmpZw_|^Pe$IWn^?KjOj*8hKUKJ9t2C7mke!2#ftPtgm)|<*2EFuS5 zbM)%UO5yih8$_`b)eKCo0ulRac4q4KP2%QP_nnoJe5^-vM^b?Eoa?dWcbmRXei@}P zGxzqkT*v8N4->n^bni?^mBMP!RMibhN4aL(R+qhOZJ#OT>q?V-Hl-+yxQKla)vizUPyF0pX%Gsg=aI(*>38*r~2ZW|=GD$HPb zm}qb-)LPAkhv&>YL5L`dq9#sIF{5h3<8vCTJQKHo92?uRPX-1CyHVSKkY)gfnnQ&| zPubNzPJU+Q&DGe#DS@e_{a^+sKl9~HSmh5ewX`=jt|Z{Z*saL~{26uV@PRGZ!(ju% z!^DIHEdovqe>>v?et%B;U|^t&Jsfl#DkLOkoEnV^P?8&sib0Vp9JX@vi|a%rfYx=- zjaYVVMWFKP@bz&9S6=jS@@u!wRL9n^=THb(d+2b#{l6P-y;7ly!GC{!eY>EUZ_~50 zv%`1fE|eCK6Vp2J7+YDg%4@-`miE)rbT>~_cE6Rs|F78TqVIRhK@F2*x3*2_<>2SO z_;@4MGFUS}_t4>}tywpp&#%wZ-}`0K<~tRSd)MaP-u7;P__~;v|E`)zoqMA#>~Haq zCHukx$D8M!V_6Oz4%qZY97}Dfu*G33C;$D5$GpGBDn4)P>pZ!(;Kkv?FE1~@ z{o>-{waLf($__9#)x0i(tp#Ae@%g-celt5iUzSgW#FXiCl~EfD;9{9YWQEwnhkGhN zziDKb+i}bW z`pU{+<#Ri&<}O+05qNp)Wz!{7r#UEI_m}s`X6cT)yQ|du^$}+IwJ}eEcbDaU50#Bl ztX*m~$No9Q4GyauPPVuIdi?h=zx|f&_v>!Yy`8uFZQ9WPG%jKDeeJ{Bbh!}^S``{TU>7oXa(@HiE^9M&Tay=dCuAYueqHzJJ;(_ z;-MDKvQwJNcO>t9)TQksuk!rTy_(Oy<@>U>-zn;zt<=8F>%oe}eVg+4{XAxNzovNi zzhAGt=Pg~f|C;wdrXomX=E&k@XLCh;&i|k1>vKLmImzcC+B)mB!B*YKO-Jhfe00yg zxTy8_;`sbqU)b~eooCW{I~K0p|L@mRxnF0D&+llx z?PvEh<@L?Y>38lnHh-8=ZBcbB|OnjTv=b8G(nd%So3zBlHE&YdE5{<4N} zuhz}ve%n*BZVMkSv}>q)KDYdi9Xp>)#@guZ>sDR%x$}A7uUD(hs=wuAUtbq{PIT@< zKezSQH=nn={q?%>ISb|G%U8bGI`8ti8#{a!Slw6Nc?L9i>not~@s*w6W1<~I_W zH@!M^xAa=%w|~Fi-@gCvoB8dc)4Hp#cKXe=y2@wyM4;SH z>euT1ODEm-QHqDs`pJF1#lk{zYM(xZymEY*|95u&zL_631YI?@k1XBquGTX1FsRwo z#5JX)V#O;*`xcG9Nn$}a3y;g*ogjAh{G}zHlNW@xx3m|obBf1yS=k`o?Y#(=niN5%d>q#vra8ov~b}nj;o)u>x-YA*;w`U z)z0G?hTNgeY0-j_&zBqrh3mVGRdHv#*JN*gxoq~XTG!dz!VQ*Q+nOEz`p(YH#TUQV zWUQEqvMA%$@>TyX-`8E0b*0k& z@0ZKp{(ir|yI@J==Co}I2br?3teCj@{I#?*GZI%F3ch^bRjO{z%9Z^uZ@t=er|$RL zJma$uS3d9gHu=S4Q~MRaKKtAMee!E*U*+A>>!rta@0a+>ZMskzpTGC(o9Xd&hP;JW zN-q{<#-7gcT^#W2?Cf;&I|a?rXHr4)ChzyYFkH6U=1Q_#uhi3JsuwnH%e{T==S$NW zx30L`|ND{r{q0$^+d6M|p75;oa-Or*ey`lMsBGQswPw$Ko-a$hQS{|{?Cq8NPkCPt z{2d;DyYBbf%ln>bzcO!Tk&={C4fnr_ndaTO5u0E8 zA?V`knBSMPeY%xj{rFOGxBE-Xrrv$$o-V%L`po(Ni^ctSUVnM9xWBCZ$?x!M=TgGH z?YdU>Z|l5YGm_$8zxelg=lWlt`@V_Z72oPG{nxrZCH)uo-Zj7b`Cj#V+w%WcUb|ff zou-ueyMABo#zoaj-fg!kGu?YGbmjcDFYhh-nO=HdXX?>eTCei|$S|@9XoxmW;^qI^ z-lX>K+NzU@1~eD*`(eBMCA(gyM*F`n{a3Rx&ys(8$y>j)|Dr+gS>@&YUxVD4 zH1_=d`@a7Dp;aZmzXMYzI-M@@{meJ7`rXc_eK+%$AMk&^j6p4S@_+gNKaLlD-o7;2 zK=s$&lHZk&I@M2|i+^5zJ+}PjVSf9Zs3W?uw-eiCeVl)n@GkZ}toPM|H8AR9gdSJ# zRgo#07T4NW{<{5QqPyJ5Uu-do3*2&7WZuqMcujl#o=4Bj&s$7TIn6-R<-LALW@7G1{-W0z<`L5eP ziNy~enqH4d<~qIg)u#G+FOt9C%GNLcyZHFb+^wmtkyW~T{{4C_*95P{=_x_82k8gKc7w^iw%;wvT{sx4!g8~{c~_pxSG`aaf3?)C)n7cWVj=g6t9iR#s$KrPG~2nIuXO$T zuBdHCCpyJu*Zcgu7ykd>_x-n-`E4G={jREAy&iNJ((1XZw3ehU`2EcC`JBgx?p#@R zeX*TR*S4D9Nv_{LVxx66mc3qc^-ZbI%voKJ;a;gyEr3u2;Oo1)x37HVeRb}w^{eVd+E%T6<;yr<%c%CUbWSY)-@l8pwTxTqeqB1G zYsJ2nYu&PkM~lv0`E%#|DyOct!!NgmyH2nPnfjzZ_WDV7)2g_yv8-ob8BbR8E$Vya z{>$3?dhx9-nR$wm{}b0Aa%3&OxU5n{^xezCP1j#LIc{Ay|D1VjYs{CAT-_mSS2Udc z{p3sklgmovi*=s6J8tqmsgSEhtF~R9 zK5Lb}=%FLIb{xS|r#i{cUEUY|`+BY8GCQ9T`(XRdu=QbA^8YybwZ`qwdAQJ??f&*s z-B3mi>AT#2luUl@b2@Nk*@E!;-K#ZauKxA=?sxb3mGvd_11r`&zxdkkyMJu8iiKGUt`N zzjA0|75~!QQu)CD*V|>S%D*PxyCbej4?nB|fKJ@~tPC3p`c+FpS z=x-v7#q5@KJmJDy!`KwcmB!*Jo+9 z%5fQesScc~k$Y=PXKm%5pBgfkq&-4|U!E=BqB-UF-S>6R!@@%omKS@-_N{s)**b?y zI5c#Lm&g5kRj=1>>Jnrv;o4l&@o@Xa33048ReG#UtE@gLuDbUj>q|r3f9-@zpO=Rf zubk!9t*Q~>!Fw{~>xu<_dR3d}Mm=5r`O-(NBRy@lH*SNB@ zxSsy`9B%S_p_Y4T@0B2D^IHG<{F8UXpDo?@F}!pkQz5G?mvpG<)NF$V{~jFP*Y(Wi z%4`4ivY`cTvsYz2U3Wb&YyU|RxmELjXz9Lv|Dc&a?(NrQ0ndKDUSEFy`fGEm5|i8A zm&4~|N$(8{(OkLk-$gOrOIuHE;eWQ(cTU~nw_JPcW*&0hpV2wbdEu^SOMKSqUC9nO zIDOVReW`bvKA)#HRh@l3Paya4vEJhDfR}cQ6JJe_De}D8|M#`xeAZy2z1N)MUOT;C zeJ}8@i}NATZ?4)$uWrBUU+RD5Z_szauSZ|(jdq^%bmg+_Rr>e2-ge)7H}T?q&X@1x z|4DqYc6Hoi$0KD~l(KC)pFOB;FTkM?u<7B#e;U{1%YU_aeLi?3SL)aj`#a9-H@)d^ zKXrIVc-vdh+}kDL6XrHoW-eR3;_`RX^|Q1dUs;sDr%DnVnB2;@iPlTAROE8*g=W){}L972vslFTZ1`=~Bh5Tsc=3+I7pV_|D2MwKw3S~}BuHb8$90jaj674;-K&H` zv{h`rtnNAGRQIxN-79B5)^IKjkr}6svNv38P`&)fM(Wxq+eVTX0iU~ne z!?~h@X0K8*-P`+Y;g_jBx730wB;KBvnzh>N%#~%uVeujL*Z1U!_Rjd&-@lJ7q)~=WI#sz88Nw6<+JTvF0r%E$`AX#^2##)(vtZXw{cArRl6(zYQbxTFIaNe z`M>+tQy;!|#=82}hpc=QP=6%U?drn5_758ttv+;K(1D@xk|-!%XD9F~dyCJ~{Bv1a zbL)%QD!vi#?+awTm~-z*YSyY*O){79&<)>^}17^-zC0{xx z>tfcP7qdO~N`9HDxAJ#j!{hettAqkXd$Q~@f{ykuZT9J2QeA|4qY zo1GR}=-&SjFx75V$K?%Qau_G{DgI)Mom#U>DWsc?dDXg4-Hk5&(e?QnG2e>A-40vk zF5h1*a&Kjk@$71=?wp5-B^Cv)pM_WbUnQ?C6Dsi}+Qg>koUr8cT|aV*IQciXzLL7M zGRtnSn`z4J?LH3^zx=rzdi-e--^$x=znitp|88MgdE2#}&7Jv-#ouKT*Y#s7UOe9r zy#I`e%FX%h^Vj=dJ-SPO)uFKU(tFcPmso9GWK{K!YpRIG%1L@rS0$8ecq-R&?_KY< zeyh!8U85(f*F9aXc;Mxsn6sX%UUCI#=X1a977b1Rop{}9+lzMFe^IL=TrTUZ=+F33 zH^;S%tMcu~2+*K$<5gBKGn*?bU+^~n|MY+UOQqk6XMbI<4|Qu-uvx>CI*%FDBb92b zIea+h@VZ5cS0}p5MQ#gPq16>~cKNc(`J2`{tbV0`wsqOV?7DTkES&6Y&V)@}-ryCQ zA{F-Qx&433$9Y?OcHZig3V%`>ULv+6+bhUKp{&X**vyC1*r;lj3r--;(LzMlDR&SK{P(~|Je zwycW@3c;nbw|%}kk1Jl}(92)Hmo0oE^=jR+4Vrh8Y-Z}EZToOx|H|vhn?svkJ-3^2 zx&C#`-1}M*;=3OBX`$F~W&PCjLD;AyI?(=YAllED|m0qEyq4BFW6|G*o ztw=sX{L-RE-(3zz-$!#N|IoVi;=+AcRIRvrkRR0B?%)dj``UhP`!nvZpYwn1Tj}Kz zA3M#e$G$JKpZyrk(YFH8ZaMnfG$m{|B01|3ziQuhFo%vZv?Q z1)uj9zf=Vskk8%qKYPZmu;y={<&M2%&uIqNoHn4E)7E*}s^$`(o6lTz(<^rEv zJShOmHZdWy`gLMYi^#dPzkXKqjq9|C+R;oqn=4EjQJR*qmu(Ku4C6lcMP?TJx%2ws zpjc?EGM=%{HM~CTz;eYqS*!M4n*F0|)sHW~!!J)+v2@*|mFBm8b*;OnrMx%sT9bIu zg+t62r{!17@J^l{bIKKvAJvCr|zn| zdFb$qjZ4>^n7eELi#?gEesk5a$1UwYzZ~s4>|d1=BC!0GQLFvMWnC7boNmwWoi?}W;oE<$ z<^QTVpk9%S%i;YQ1`8_h28ma8zB|uu$+cRO>!-|%w&YOTZ0vdwYQue?{y37NY5nNW|Jui}D)^XKozP-e3QlX=xRb;$h;JUE%U&E2_eMgJo9CiVOD5$UCuP|L>xg`Z?X; z#JZ8;Vd7CY)?CMm2myJ1(9%I6-GG@77it-X>|DC+=fbKlF9J(ucO7!JUAXG!m)*Xi zRjX1?Zgsuy;@19b**kacf*+M!i>FTD5)wTVVp5a)?#|BCspVX9fBtm7>2;CylaY%iCR9;En?wCV|U!2;v>QS)ie126^o#@8QI|etS zQ@Q!S%FIgkUAySvg^R1~&W5iva9C^A(tfdSY2~jF%jE(7*RSZmS$^UFzTfXoOZ{{E zF3iinIaHuu(s8H{&a4r3B^PD-s}8SU<*U16Qub*vIk)E%)?|1rY)e|b z%cFZ@#ymUSx&>i(4;@~y{@;bLsY_SsUEPw=6Lz@w@}qOc%YVLJxA$Ar_R|@r`LOT_ znfm&|Lg%}NE1SX(R_dMAf3x`bi?5GYOFVwJc+;W7NwJ`|;#5hwwAuB>!SOx9a;H9> zvwmOFUAi(TRNi2P{EK<(!va%_@9aBR2A-?<$q5=R7W*C8(!O!!4FS*)i)G^}9)8n> zd*TZ%=9@n*EO^|~9v)jdHM+&Man`*%snSlf-&rosR}$5mQ+h2jlV4YAn%nA?db{5k zZRc7yFP@uuNwi^zb9_In50?@4*Rw`W=LLdxav;hgS084IQMf2u6;gV*>g zii4NVSfvL#X!iGU`+tEKU#|OB{D0TWo12$&PrYP%SG~mkLaj&R!uZzhT89ohtt(yl z{pu+m{?9MF3lBSg72m(3Z`Jy%_Mw^kAGS%~db|DpykhxBjNsrqDy(3mGcWa)t)Ltm zTiSQfNUbPWNLs~;%U2dDgT_a-Gqc|9C^3w! zcCmZ^w(9qLuj@)IELiB+%=XS=QNEICO<1VTOD2c2=|6tGUcdWzhQ>O6)9VG+nZBKCZ6=NN+ddfVN^sq^@W!n5-oFD+ zn`|k6c4p?fLvD)q%WmhUa|zdU3p2T%e>mCSPIL8_pbg6zOiBftZp=M&W>ahXt$r<; zt-Us-wwHA;2%C1T+qd?(xUx-;-iFC}70D%xeMx#V7KJvM-iiIr^!2!pZ{z=d`+qOm z{_@M)*@)Gf*j#yiW4(t=?S{6htf^7DS_^-wh0dLty5qv2yTptDV`$44+P4;naAFkAE?D zR?eoAYIz)4CJdKt>Q^}hsrJo!=5fV|w=jCnhk%23Ktq7fN-l4>Tzt;*_!b4PEt&Tm zLVGhfa$iZG&8S%MAy```d*1#RObyJLVa!q#UUA>HSUEwZoagkN2xxK~POO_y71*2QIsr&qOI*}v+}<=I7BLCxB_Z6%=# zS4myHkgfY_VT1eB2^XKwHBRq~{^P3Hv5HSr%C&h?%wcEQ_3~^h|GwGyyZ&E)eJNc1_5a7;W;?BqU-lv3>b6(qyYye$Exo>Kl|b#~>`>>ge-GJl{VD0& z_p)^H|Ld=}I=Az^v%9djy8L^xZpRYWC4ZP~R)((MrLVam$iC*q!uBJAW5`5EP=ees^o%kc* z5PDOCCAf61*7YqG?e{WPKNS``%E`YqfA7lh2am%wuW@af#T=N}@Qmw9fUzlS3RmH+ z?fLO#Qx`p4=(I~Zf6v7&yEYyQ*lT&^aj9IEl|E}D7vCb^sTx&vYiF!k))2zo{NfI1 zL_NH9=`zpnrsv~Irrt`QS9xsR&Sz5Ji(3t%Dwg@qHhZ^UG*5F%$Ytp;-p^kjW^elt z&^Xmex>Y6X(}m(yM!|`*W-&>%?u~Mda=ef>JNFqAFYBzw$NS3!llz)YNdFwf=@V~q(cAA_1pFiuJ_^f)Pyw8bKh^^~D!nd#*SA zT5lSw{bzF#SIkyTyXa)b#aJ60@Z@*LzU3QSL^GmpM&?hb z4Zg7ALx^IJ)AlRVyg5W{X^*8=J~P)qg!a^{=o>cGaechfDKCbvKDT-zxVi z>i6?=-}gbXmf<_wOV%#!dtNgKS(KcCtp(7yD-X?K+MpaZAD+XqHZ(X{v#S1zUHrg7 z(RFj$S*=i)dXE)C0aN?A9))~d%Idc0YTZTVuD147Q-WCM&0578x^&sHQ%ih43oe^C zXMNd})+UiqiOh_gIm;9r&aX6oV-?pbX!Y&NtK}BIFPW`c_vz}4x3{*QuFw_9SyAM5 zetnjA>~2pZ%*@YjW^%-VhrUz_}=O}Kl8%Z?34H|w^A!ww_~bRfBL@T=O2TITDZg&Y;^7zyq4pDuefTQ zB-GK?zN)SJTzEu~`lJudU$sAI?YNYrJ9E`8p*ktkUmuKE%{-kyK1^KJYBH&8kBt92 zrl~i@MSEU1^ZR~Wz*_k2Zu$K?{4?A^bF3U9u?-(Kyjb$I+yk`e>MnSSV#*YThlxK< zFTFa=)P3G6BjdFmvi~$H+MHOmj5laLi7ds$Jk_tvjidpX>6 zwOG(1kY_kl+(EwCs(|X74L_!Pi?&CVhAAdpUgn!SJ9pd0$9>l4bmg42V;d(l`YzP+ zxB2LDlj~kohs$TVAl0xHSw-^loAmEhzu#MS-uC;BSI(i{@3-Ht+jd;8T1C8B*_nZn zC2Ix4!^8*N{>X9C(02V7*JP{GR}pKYwtBt#F}Y?#-H-T5{S%YB^%uN;x!QB`t_Qtw z=l8Tdj=vmq*Qg{u#6D=T{?sh~hdTrv7N~Iu$g%A^)zaSBc+(cLXarpG!3YNf#zTh_ zwyZAmLD&gSAP9m*Siy$J&AUQk#xzJeK}dmFEMlOb@p+n^Go-+WO>j%`^gsCf$&g}IS|sSy;#%)yls5;L$n0qn%xS;qPa~#^&dD_SH@xvEcDflxUI&AaskzLORgLNXe!AVSELfnJ%kK;D4R_oFG zowzn?>jJNa1E;2HpYBWgag6y*lW)1tfxtozM1UL>Q?Sw5mT~GIQu&ajyP)gv-8i|2 z=O$h-m^uAcd&hZRt0t}^DRD}DTrlf3JQOM_ew;PG|L1-3%O<|9Ch~W-WCmx078kSI zm%a)Ctr)txE_U~VzaJ7nja^0-FW-a{-QRD_h*uMqQTua9)8S6tS-o$MCM*`JTOuO| zPf`x+m<}F3{PXkk>n}b`ICVH?x5{mBp`!4?zHzJEu2au+B3&wGeDGWNVMFELwr`Ie z4-2E~Z)xAz^>l~r!^FOX9PnIIgM-V0ll%1!E^c9YCVT9w*22?A7s8j}Z)D-%Pd0qI zU+`h#zcL%>j=DpKFTG-JXL`#((fx7#?`-|ptE z?fLoN?^Ul~yYZM5r}g9%8NP>!M(dpKELO15$*cHrfSG^CsST6;tX94eT2bWF*#A!c zXwJ)dt7rU9kAKL*#R*>a1llN(ds=sUNxTUpd0hg9+Bvo^pb|a~qWuB`MpC;$Shf%$=ZXRxKyLn>0-6m_h zT666)thHsE6z5jm>hr&!=pC-Z-)2#;Hm@w}{o6H#dw-Sv`>lV2P51hi$JM#H?)(02 zs5LHc`aroZ<~(9+oO zc^WsFT3gyr+8OupfyxE&R2G&F zpI7$nX8Lm5W=Z3;9S^%sPuJgWdOhZ{Rq3lOx5_?0J6rsDp=tiTnym}7Zq`lf^f|vY z@j7VPlv(brDQ7#U=2f4axb)SjsoLSUqO#Yf%37DjvM;+T;2b_-@ko6Z@;^4btPl;_Po7Pty=G{?2p=(^K#YuE9SdP zUQQ~D{{J9ybK1`TSCYR(goeJ{ILpnUzt`+*`Cp%hb(_=9CjHMjIZ1Wh``4w5e)3%X zFKv<$@a|*XjZas@<8yE4?Or?kf5E9Kn(uaAi_W+GUe$5Aq{hnc=L=_c+vlp&V;((Q zTm9i6`(3?DH(&n#C$}JZP5l0US^mpE|9HFo{+*5HnU{`4{&? zxBXYb62G}tg?k=>LxkcsvXbIUMYI3Tot@{=l>GFxz^=n-wp1Y*dDpE zGI;LPcT2ZsU)TFRQ*L?PW7!bfb$?&{p5>=h)w8QUGy3lPlK6919^H}u`!)08qSnn{ z%&L4(s0EwudUpBBd$zmbSEp~OReZQ`zyIr>CgMq3-ao0zF`7K_S9hO(-OBa7bF6v! zK@)@m9xb5u%W3dJesD$2DSAQLdGEr@(r0(S-?v+5$A#H;t({!vCNY*@&u(^NW956l z_j}w<Og=k`4L&$rw8zUNmfsNdT1wpBbXLeHh<@7L>ZA9d?*yXl{jbaObNX$+ow$)+_kH*Mofmw9*&|{5Q*!r_32Sow-`DY=KAqO>7{*r%+vQ%pn|yJa zxBSIq(U8A?-`AJ_bw9Xd|Na;0R_e7A7XO}||Legc(E5V!38wb^4;mPmbFRmhZ`EG6 z;}GkFEUwFXd%pyIPi+5nIemU@*tYqO&1^g0YjS+mo&I}q-@{Jzc?DNr{@T9CZqb9V z;*3}G-p@YwaL?y+#l<;d#pe#k^!pxP{CjU)IagL~utMdJhwZyx`+yp_0vfrXcGmTN zcz;kx=fgSc_dCpQ%$oCWT6A8a`znRpJ39*B@xHwloge$|MJQv@n~leJnID+7CoVtj z>$A}OWuWu7!z)Y9+kT(IT5^<&U)1h}?*=A^R^e4Tmx^EUu3R-uq;3_H>+$6qT=TEh z|Nnh|_v7%TljPRtiWt3$|DX2j?e_a+`7g}xmIQ}amLB3%-=Venk-_V$fCy~S=Wxt|ub?bPAY z+1oZP`zn27dvW@$JxjZFub(>nt#?*byW82EV~c*8mHv~7{`j9Ucv)WT_OjgD`(GdX zcEGRw#>4ftDgAZU2dC-8=bh3osoQtUFuLN#nmXs#x3)~xjo5aDw=iyBk?X}c*PB}W zSJz+NA6i>}D|7iyg_v5eh0RSRtR`GRf13Djg)zpjkJ}q_Ve#9m;k(M;&-+**YVpdD z>-P5hb=BctmoK=*|2Z@sbd%wo$Hlz-pz9#a&o+Fk{BV$cx7N1I%gc7Q2Hvav9{c;T z{Qr#V_j|YB-p&Xhj+{G*RIZeyf$TVv8TA)tDSEBa&MV#*M7TsJk-Z;j>Sbu ztuwp+|NE^SvoQR-?p^(mv&*x0oi)3?qrmUs(q$DE|9(8aTfF+|W%m;M!1)*c1|=?A zw>n4UL)JyDotk@szAn|;SGrb&=eMQu*UzzKH;;a`-zisqr*Pf>jECB>?xE98x&O^S zE?Zu5bw1bZ(AXE+-lcDL-jlDD51b!jA0U6R_FFT*UBUU)0l)75|5qM4byZUW>!Drm zU)inAH7#HFYw{|OuLu1%ius)UdgIFac7FMH@7^z;SGDSQ>;i_k_0K_zhWR_c?1miT z5wHui-)g-qqP~oIaK8TE=Gn7-rUrBQepwcl9}=oN>6Xcv$c2mUtyq0X>(;-|^Z)NK zU&Ey?60|~8+a{!A!NLN5`#%MdrhVVuYft`iEIzUG-XCq7i_)d_JpUy8EuV^rTWH<+ zGPTRj=8E*=D-#aBx0aGwvU|!=F8=fHH&33s^&~@f-2eK+uK$fI7s=ZHGMv3FqwZ$# z{CyX{l|2pHeM_n|{A{pg;xT`-KYyRcE{!j_QFQ#+*|+zd`L^rcUMJ!cWsv#BW98M|ti_v-#^k9AB^rmVi8>jhRG@>UF+^Q=Ap-PY@IWzS}& zPqTHY|L`iEYq?0lYX0X^a`Wo{{anZ7zkV{Gtksma(F-Tq$pi#gq?{1=UMs)vMWx6B zm-dtM3Xe&CyXY=|b8h*)Oxx;jXR4xJGTF|ZtyS^(Oy!E}FWcqoBE-)9Qoo!Xsr_1u zBa~s;v|lk?e@o*<-_F<6Dz2w#ILXw+(YH6J7G^ z-;8|ui(7lcQmg8Db;BM!W6rEU8``?6IOy}kh5vrHN#|*ZANysuWw-N^s(Z$22D z+xT#&+D>{u|JnRHy1oIq!kVt;50`{dk&#mQrniE z64+}Q^0j+a!=n6ue>8s-IEA*&&fONd)A(|oiTk2ww>}lm6;-wgnX%}D!QBgIUAx70 zzLGt=a>lL~-delwdA#P`%H+2{X*oat?{9Bkx7~J~y}qm`jA7~SDMvZ@`y=bMcNZV{ zSN1&p{muAe``&4>n11>Gu95wg@MOD<%yIvwSHEJ+F5P+LfB&o#Rm(pZtbzc%Ohx7eKS<)|X z`+aEHnc2Bqwwqhqx2~DCcklU=dMQ_S{!PE+5%S$h%vf74KDfhf{xXh#Cf}9zcCOEhod0ayyYKr6<^CO9n!NsJ zO>IKtuU!ag4XN^VKfLA2B(i`1@^YT`<-*JtYu?#k{GfAro1KJTc@QSl+&F&*}}Q&GK_g>|eg? z-`D>m@$tpCp*L4{1@Kni&)fa>PC;htl$Y-=|GK+~e~HL9F>9Ni;+%iw9b*52?)&9R zty}lNAa-l*L35ch@UTljCa3^g3GX>AU||96R14d>$o!L(-^_KHc}8bdSDX?$t2ymf z+3j3&^Y^ox#I`22w69tclp*=ucf-9ESut1Q&+AUL4o%?p%S8T1d zE_b_`7_;kW!tR34b59>~w(p5tt)Km3L%#28(+%_a_Mectx^}v$P0sBN8|QAm$!C`L zt3Qu5{r2PToZ~eO~FQuQ)>I`4q(|?<$P6>^iscUm*aj|}N*7U`1 zdbZEsG}}%tcw07a>Ayz{>~A)udawDe{Pg+X)6bVq)wJ;uuXF$YUi+a5OZe4zQ21Xs z`{I%K&A!v^?Ocr_Y_7BCGY2U4IIWL4?EJN`wNXlLRhJp>{;MCeR;+1Lbf3-NW>O!w zzwU3+f1R&)xOn+Rdsaq8avxiv<>OnduXQ2h>!S5PE`K*}ZI{}&`jzY1)a9>NT;Cn< z;OZQxJ!^Z2Xy2}VRqK4Zcfa__{Zje7-S3>8{3-M5|5b|b`I#+SdNm-e@&|unO~nc= z>(&Vur)9p2;Jq8>`t9BB_wSZ1`v7W>y;ol4_x}F=`fGNNp7)<@JIz#C*XGv0ivX%*(~$s-D!m<%%^kXSK0q%dIUr*e?le&4{nJ2xr!-QFW}+>WCbF+}mfCJ!YY)tE_?*U;Rn-=Bjc{<>D8$(RA?> zzwm;y_Uoi)cSAzw%;M({wS6Amxc0?^nu-ym{NtB}ow0j#*xCN6(-%wQ*7m5K z5zc28pKWiCdXxG0>vjF#fxA8!T>qV{S9>IU!m{5AZtP2674B{8l9fC5a{s^bj%OKH zYIe??)pz$iXVk^lGay?ERQy2$)252Bf$2se!46@$UtF?lpRGEz?8>r*nX7UxN*~G4 zn2@(M^{njjx0n9v?26yN!u!>nxR(*4JX$w=zO!B9Kkc1Vabrmw^X{b8u{rlkt8Yj3 z&Ys!!!7ci>;Pe^K{>?6YveYc~p3dvfH&&f8zhAX2BYXbecW*X*_;BUk?VG)~-=H@UxP)ul%*?Yq|P+PA9aN|V&gD8t_# zp)Kt@@5vXxRNnW=;BL*1Pa*e%pO%NVwErvj&?}xSRxB||Z*%jIU8`i`MHm0v7$Pc?`;WKU_2EMPfJ>n*FVC)MV&`=acAXK{@bBC0{L6gy zU+le;Dt`RQJAUJV-|L&9$?@CU_sga4*O~J?Of`(5;z!l&XcL=1dG~a-zwp?Sd!fkp z_mcz0;oSUN13JZGJGZ&B@fNREOrQOE!~0pWZ+iFE<nLyFzm#j|^HQIeWt$W# zrgnU|&^~L`v^jfI5^sg~KC7Cu)#C5@NBhofI$OD7mGasRYZLUhP73&}kkzqX>_R~4 z>L|sBiCIf$e0%!=(PNk8vmo6s+vlxnGi6^SW)^f>RpL}y zbkB!??wk{$pSiL^v(GZG=z4fXbVl&})76=JUaZa+pVf=0+kBbY|0`Tu$$j=5)0_zI z?JN96R`-XvR?K+)*KoSsqD&`xhROT| zs~Bs4|M`6Wu7KCpu0zhbi;v2y`OnK)+1TC0##{Qu`G3g9uP4>#?`UPSDvjEDYQwC1 zE3!Yb{|ywJd-)>2@48cor=#{fX+Nx2P|TdwcOc`lw)pQ4A5J&_dlDAuC%esNNw9w~ z!%J}=%O$_l%!-ybU*?Oxw&C&G+iNGA+U!~UzpgB1{o1wH4`06}zWIOn%k8nh^}aoe zQ)lJmUw<>LeEY2}tF(@%M)WL|&|jMKaACZLi#Ee@zW6VzncT(iXsX!wtnIs+Bvkb_ zW5?Qf-J9o2uWw5AHW#_cZ#k{`*~Z`vPY*lm$}JJSWEy^N=ks~deO|>JS`&gjmM`3S z@p{^v#Q8VxTyAY&Wpw#Z!#*ak4`T9nw57#1*Kd#ZQieJ_($T|qx=z6yE z)$CP9rS%u*baM5Y@TY8hw))v3ZR_mnP${iFQ|I4#62HbSNc3Uiy6?wh4mpR;c`db~ z|D~1N^S&>|m8Z679dfo^U%z(QZw2rBm$QB4xqiF~<^4I|EO*v#+evwK_bqB?VQ;Zc z>2R3yAz=R$Q5L@$1_ybagF9A;&N|*F`&z4QOGb;9waNb(v&0MoUM#9SBBGHc=j7|R z-hA@i-R0$>&4q`YTUEG3P2#7Dv&&zl&tg_;MAN$P> za$(fwtd$DWdUAvF6)|F?3C9BKq4o@@niQ+yIWBSe1`u|_?Q*VEtm=}Fx zOY7&iH{aW7|F}9u*X9b7wbZQj7d#W2!<_%U-G1N4IpOQnU0UV)9xgnj8+s|raq`;j z_ipWN+j45tGtDbC<)8-Z%}T8wmtN)Ds?Fu7NST!*e4-@13z zcacXcCk3r;cW>Sj)3h+>#mhs^tmVHN96no@y}WdEuiWOdsw@81f4v%>H#LKGsa4wA zC$o2P_`WKBxo`1-<+Z=Ry^FsqUlMZ+(C6rG5JM z((j*}n`vG4CM`U7@9e$*9$zmzQWbsUpZ?#|^Jacp89njm(YyUyx7W{n(P4?DU*5)j(U7`sq?A^oN!s@RUM70*yS+_>t@=JW=CY_sNe!ph(@0m@md)>a= zy7KypIqPe#^P=ZMk2Ps>y$PN9<~={xT9HSgSN?2>TFdwM`u=~VThCr*ox1Y7_}R#n zzb};C&P|v4xAsDa@6?N2M#iSCM~bfOJ$!$)iTcuc##@;-Nz^XUI&?VZegDq3_M+ey z%Zh_p7u~v*z5eaGX1fO$v%L=gUtAo#ERNs)NaWwB{pnZ!G^xLm=lXuN$kxo(tvl^y z;jg>GwYjgiF1%h=!l-=ca97+~@a|j>(7M|P*-r5J>Z>6Rj;&%T7be(+{!59@4RbzZ zQa@WOaLd|5$7*it@Bi~?)xnU|DVa}wLU}X!+(NCF<{4*S)7c*2`pRqjPdWd|^|6!Q zJD-+YzREiEcc!1?*7eVQwkNyWr`hYx$WH!db+Y#VF3$WLk?(Di)AKIf*Snk4VY({% zeD3dqTi(BYab136Kflf8b@M+goBQ+J<#)g5&fd1Ay(vq z&i@ebJ0ouYLT=r!d!kfaeUDchU;h5q&iA(I+F|Q-ZtPn0;evhRuNl84{OZ(7TkPD% zZOO6!)+Q~MuT~fK%;oYiIb$4MIxo(?N>;Px`_#QN`nwlQad|0^K|$+ zja$J-c=@}(wP;#@dYI^X*xcFH{x|#-sa1>JA$^nZH9Zo$x zZRS1`^(oJ`UbHctbNbHAZ*#%dO@5W2T-&77{oux@sbj;3 z4O`X~g|@dZU3wH@#8Sn89n3&OF-`jgDES;;bCHDoCTjWEJjW!1zdXgaE4)W z&YK$>-+h^7mitPJv$p$R{rFN60Z|Chk%UYj%Yswi3Cul{&cJonz7%4=&Pjjg}kNcLT=Yya&=^0fty z%+gjRD{Ma;U|z=+cyN)NeAdy_Lx(NyPJpz#1U&RFJY2Xs=iMaNW&FIECq*yZ4?O$I ze9L@3sd;yrpPYcW2{do_Nl4@5hk$$qllX^QGB2NM(~>VfV+cA|L!9Z=^WbGZ8$lzL z3%BInzGhYW>WNt3Mb6)q0-_FWJbYj8w6s@#^_FV^FWG4jmiY9@*6i8zlP&F>@A-fI z&i-w>`$o5OpVyCxMHR5*#=x|bYf4JRiVN?LN$2ZWUw7-3y4k5d?}e6NZN-ZJ`<_mV zKD90L;-XgB$|n<_YVmB%UD4(I|42*w&N9z!?%-thpq^=Q{jY0f)s-#3*{-&qd?WcU zf8}#F*+gcm65nTzMIi{QD!HfRRIErmK5Kt~;=)@WkIU!tN}K6$^Vk1;Dqj8LVf)?l zB4(gd8`rLq*>%a_tCxV>v%BV%3QS-V{NRgnE-SeBxE=4PW3aAy%vg4CnYG&E0~TD6 zB>meCl?_i6o!e%t5_o=Q=HoWg^D_(&&oaq;)O0lU^t79x zBNW$&+{?DD@btH`d&ihpSomC9`Y;0)g^i2AA=<^<+Agf_w`F>K-AeiVlU1@+FBV?gS6lu2&F1rOc0Qk1d>@o&?{0W5(EGulMeDZ5rrDQXg(sS>~`bJ%gbxs`{m3^UR>DZbws}Y&qcdmFO+|OyPcoAdhNDNXU*^5 zY3=+~&zpX)>h;>Sk(<*T_i*wzZ`c$Jk6Ng^L6Phw0LrIkbz5EK<$l$h*4(WB`Buaz z>+4hbx*rRBLa%l;v-6j6uj5d{@Bbx-4{J=|=llCT=&&8hH|8V=v7?NP0jFE1_4Yn&2a z_wy)k=(_OraT``SgHDrh4R3=C79nC5%u)$maIB^M;=;54l9ur0^A%3y;CEiJ$se1y zPYJ9re3+P;u&kQz(BV~+o>yXvS1wTn8=a61O~-}h*dTjUP#xRAzyw+3hq8hWHOVOm z_<&Xl>OM?Nh=Q*qM3^9#B_6x9+TcZ|MmT;XJ_wTpV}^$b#0NW(z(WF zP%#Kesu8gb9}EiCgVr>{4}4TGWcs>p$DvoTm8pLoXWqLbR`W~qVPcKpHh2=$0_ifa zgip(W0=ZKtVsX0vYSYrJHOWy`_bRu2`SUqB_cZ9JC1~J;Dmzq2+(3*afl^rt=b3rA z**Uw{Uj6lM_nYHaS4`CX@k)CY-{jJ-7E-YINiYSC-p*};k3xZTKH=1Gkg>UuGo1R*~Nhp24-~Mr-u#(!ZNks)P-G{*~$pTc}`T^xnJXY5q;(TW@ z{Z3)KuC&>iEZ><)U)Swu5-|K2-p>q;iN;xa4iyqR*pb?990~zKOnMqJmY2lpzD4eQ z9NKZ?L5uL3Z?p5$Z2F&8zsvMqx9`@L16)W6sR-nOYLuiLV8k?wx$x*Q>E*U@y!q?u zpH7W*b_vzdvwd&lbY#-bM=~0aI)fvG9TYX;6H%fjOVyzxVy&LKI(R2=0|V1l2T-88 zs=&r>LB-61C@uk|u+yhcc|rrv#`B(U3ijIwim|O3 zfopXwEMW;`ffgtfSEG7CnPtn3F0t5^U+|8&s3HYMrk3_beI}FyZyMAfu+c59%ufpB9R^00RUls)SfMJ4 zQYh=FxL0XI%i;H`6Q}fb0%Ex*<%j=WT%ai(4bV9u>QcCn_=&-Mce(myf~>wE(aF|~B4 z)_k-mfd-Gqsso!+Pv^Y5vvb?GTiN1o1-9C61s#5qb#}geed@(;F-_K5ZWTXXuiwAx z!G^@cZK@gv6d|iw8yJ|T>Ns>noP1ydIsgh(fQ6(tx^|1rWI9sz_Lk^d6Hb0*(4=YU z#5B-pU3P1Nm-}7R6R`&ENd^}%tF|&ICT-ofXO0Zimo4HE`)YQsw#vD?t2D6t76*T~ zj9gYZXxUul=Vy_RkM+iiCcVA2_3(Frd5q9-6v~`)!#;Wj`L~tIux#q?F`_p*j z^L|YS514}7b)|&yZ1IXLXVIgkSyxVgj-?I}I&_%f;li?&TrLmwA~!8rA>MIX&)>cF?BB!kKK~)ZGoT`5mQKL_x>|ECvm+)|E$xkm4$r!i zXju*oRfh!`Oq11T#};+o>=2w;ZdtJ4=27w4FXN@49#v>?2xJAFO5c5J;SG2k3%E20 z7;M;>_k(O`5s5`c6R zW&!wc{XHUZ(=UlDxaj=NJ|PJz*g<_JC9qF~ZyH)^K+Sbf&}VGznDx2f)RZ&)*9)Fs z_BYSIsI-3h14p6Bw9O6&yMun8Z7sVMU$_H~12Ro%KaIP;Ctkg)AI`-H%ViK|KIo-76$_ zZHM1^PFU#hiUoA6czCM#*%J2)1!?x`NxW%~u0XRl10y()POL_xxJahW>9g+^9A35F zM=@!--fE{K%6%&$&F1LBVt0ZPC|pl;Gr<$-Os19&)6ct#uR)zPVKUe^ezI-7Fnb!a z)Ezn^-s)+pL%I+QOrYJaDmFTC`AP7rIUF>(kMIhv-+wRX{a){%K9*(h5Z?wi@XfhH zZBQ#39C`(2*i>GvX;*ejvAf&Id{%GY4dfJ@r2}$hMDK3%f0^;B*FrLdo>4;Wyf{t28&wD({C z*aKIj$=xHhHOueF#l^<+k4|)7H%oY<_w*pU;67PcxEUOBKI9z72Gha7^pitC>Dl6A z$uMJ&K{{ws6OAs`Z3RD&EQM+mEB^i>*{{JO#77&&&3lGz!y`nl>76+b!j9v zR=&pFk<;lQ=%{JoFtJx%W@=Ux4Q{>Cg7hYAS`o0yGBt-Z3=*FgOSaUb279T#SqatHK)ps}F%3iZ zbne?nN4s-(zui{se}89jdi9@=$5+1!@Oo8QsJ-&^(Su5$=0SYIw>P1T3-=kdcEs*l z!zIZnxVpan0S_dYJT@>qOgsR-^`PwO)bLy8_iH9^MK^S*ChY{^W47pj&tJd z)k2^3>wk8azP)wT&-(3_LuFzwE{ew#G_L&gW!LL(Wy1yT%#^E_}Gu#w&g6%F5u}UteCP zp5OC&-R@gYr^m;=wT@1mpRn=J;Zt_+me}8~{eCyy{BFtQ+)XFdmL-^G<~};oS$5=q zc*dUJ?{>3%_T23N9&2oHsA6<-sbYg9Vh)v%h7Se~6)PT2lu~=md}v?o?^~c1Sa}_v zUR+!ZS`A!wH86`SQRLW?ZSVL0zZdc{baj~S>l+&vm%g}=xHZ?rqzbgI`Zt&QY?Gh% z-`+9Dt$OtD|NjnIWib;i!)rG>7Tq{H?}$|O``C?%;??R>ou*~JZ}!f`}jd{@Ao&B#q-k3PVW18=FIt|saK`* z_XyVg`FMQ8k4N3@Gt*|R{IZMR?uSB;l&RJk)9W#b4_n3Oy{P$W6aMYU9p;5E`R)G* zyl*yTjW)Zp@6V^xKa$@yRzFP7-}f_3!oIF1B4whh)Ax6GqieM{&b!+osC-B~zDDr; z`Cn~cx%l`0d^Y=ly~(mUo6jlqW*6EA``ebr1W!C>`{~TC($`|sB9c0Tu125syBt4{ zS?`Ye_i43mSMBsK-B^@ly7ugiTbsT0=GT6Ud~tEHdql%a|5T~xf3ENUCwjIpuHYc6 z_xDrYlMXAk%Lujc%gfdMeI4Jv`MjNVTk)5LTc5jM)xG?6dVJl_Ns|AY6sO(1cFQ)k z{`}v)pU+tru1Ri{EL$mfrC-+CET;15)Q8ui^Ly?0{r~s-vGI)BZ#N(R58KVQ{^aL* z+2q&^T@6(y*Gpgj?tOXL>qxM)S;Yo;pmrOCo8Fk=i{p1ihjG9KELyv>w+V%Irarb z*M7ZvSZ#KW5a@REAB&Z)+1#mmz4mdN&JVi}2bc|cp2-C*{{MVl^*a^Em&WI9gqL3y z3R-&X$BnYvxrZCs?QI8hg&-aZjg{Ig|gf1E=-( z+gwcLEC7u*TFm3vrnmderh=oQ;Xap4kNvn?eqZ*zt*!kXPTuut;U@(S)qcM#&S6k~ zGj;lp``PPurt!!HE4TP2Tg}z4UU)lyzir(7YM4ytR4Cxp*7$B1%cu$flKJY|LY(AtN-8sbw>2w z;zNfg`x&{+X=-cTzN&$VOJjk9G7AsC@vE;~{QcJNc6_+t%zxC_xYW{jVa{8|VBe|N zQoQ%4GxIRXNiF0Mjcd_nDF~TVXv63dRo!1FeC$Hi_jj_))3#W0KVN><_WPa0&u7i~ zK?mQh`Qas6_b2Z_17qUfuh;vJU;P~Or7>Viu~3I#$ffxr8#YGre4nNDZeHE5ml9-i`>;(qujBY7i+QUo&*<;{a%nvI5})c6H2(c~ z-2eFe2K6l|>{*A>R#{3KZ`pF#?6s58yVI@hTlYP`WfZpZ(4E5LvdQ;Xgv93UeER73 z@2lbQx}oC2TEaEZY^T8~p=2ci&SoM33l1{1wa;V^SpQ){!-KWk?{%fyz2EcsP}b_T z(|#Kot4@B<8qj{BJs|C*>hzxV>8n0JY?qh&Klec=m;0gioEa`Rj_Dl?`6{?bpkV2P zjtPCQ)*cm$)(Jaux8iZ{$Cwt;Kjv%aJx_X`RHn5o(J8}ivCu>>BdMv=rSo9xr8qxI>x%)hsDGHPA-xjNmorG59? zZP7eyGFUS1XkYe!slKp~>l}w;WgN?LmK{El>9_P6Mb|GbDf;Y z9iDc+ub}Jmr#t%l|9lF%no!oBwu<-r?fm@}nyXk>*7@{0^c9|2rqh!=kMnX}@P#`? zXAi&mJiF{x=Hng9y{1fDvSMx`it0N>5sP-MF>n!-In#?N=(rB({pG zasByW8JuzXOSaZVj`bNKpFiF=S#_5qHKRqMMRH5dflK#_KmICweC+6{!;q@`;?HE6l*jj)dmc1sc^l!HAjyWwX z_vx1P`#r{N^(KeRmTeI}BJ?KFSK`N?&*zUXn0)NZ&wqb^A3t@rNH@R2W2*dPgWYP1 zQ+u}hMW1Usyz-F2*IrZIb{mSx_#oxi_!jfYyu zHq8Z~QY2uq!##nC`z7MiX3p|^dyq>5EV{rUo2ji`a%xp;dy7owUt6txGn{5^7hEN{ z?&6Ad$_{7Du66Eyxoq~M{uRfPXJwoDBrWbXNu8CvsgZSR%9q|_Zd%%Fw*>tuZ?ak? zk@?j|{CP5${_HS=+G$++S|?U?q;RR{_S=5b2#rc*mb_NC*vZgz*(sq@msT9{QS`Ys zE9=;sHU%Hnv||3Kiw_kUL(EDRe=?rA$=GoAvj+!eO*UEeV$VctLV?2;`2vexv#nxvD?s>@tK90cw((jQ)U@c`l^Dg%EO0qOtY(U zqYoW^^ZVh7#eH41Yp)@KN9*sr>UWW|g3i`%C=~GKHL#0lQ&?*o^;YihUP$VCcvAiU zcC|;r{!@?N$ld;bZD&N{VG~tRaMc^&(3k}ZvxQZy?KxEwm))3GbV~E#_x=BCw>}T} zW!so|>w?N|u|%r|FDtEA89wH!JsRR_g+67IyWfZ;)*b&<=Cf2+TrO?-_H9pNLbe); zPFrOzb+tW5&#C^hng%G-g-*YDK}%XLZM6+(7p1?*iNJ-Psmg0#d@%6!^*jIa%Vq!m zsr6e#k zcCC0cjCG%hOf7 z_v?onM=edu&g&L!fBI%td*vbLKF`a?D(_{!DqH*hZ&iEy%U^4b{Ue zq~p?xfF)g%eCj-JcJhVxX}Wk{-Oe(74WnoBUjJpk!?L%w zwdYoz-)d^JY-~k6^aiXI5yYnBaflgTdpF z^&ch(w4GYLCDAQ=_OcJw*G_tewyg}(mR=*cY);v&OkvxTZ_;$G$5rRPxVbq!I81KS zMb}##t)+J_?drb6^ZiIw+m>%_?JdnMEhbHtGQo#!Sq;wyRG!%KM5JyjPv@lw#hA6% zx;XfMDlE`4G1UrMIl((SQRs`{kJQ75r&)W3b6v5}zgm_lWfxkesqmzHO@GB9PW2E3<_hbE79d-CHr~s9cGqRmq>aaQZ;7qH!1B~n~iHF;c z{wvNio4FBE3|vrSbUtFX@uw1`u_&UUpHMMlOkr$c&cK&^-UriTyH=huqe=g;|a zsI)+-VyS$N*WsvHCS~9LeO+HK`+sh!!)3iQnhDRJKfQAcQe<-3hR*G|yn5X(t+sh4 z?`EoU#8p0>dcdTxEcCpv(r@EtV=x)G}leYEoQwWK$$d*qb@k7aZA-R-f73C-YiU$YGi0 zHWr^2|M&a<*WFps7CS4GB_Jm$Xk}omJBMrXt~XV$*NXq&d*^)i+-+xezTnSJ5|R)U z*jT6heS(>H;$)$9;hB$ns@mFpRMWO+|2nW)LE%ZH;k6)!<85*|eo9J9OS|2cod3^Sa)wsk^SA$7vL+`*S@PO?AKl%LjU2x;aqCIUFQ4`5c9HnA zH&&fJ>`vM9{wj6r1aYNCuj7n-UA<2Cp`!G!CB6*>kM$XLmAn)>o;B;9zrv~C$CiPL zlm!lVS$G6ryS?m$w5MhSvGVX6`|q3gFwyGmWPdwJZMKybUZUZD`WPl`<>Sm-VUcr_ z0 zea$)#DqT&V8fAOfd7X2^iDi0g_D*NYuJhCIc;Pi;>RVw)>Dki*V!ak$`n>VD+-Xs{ zx}Q&{7y4{S=kxO4gJ%9Dg_}joGs*g8?LSF-V0zI;>nDy?M~jeKXmT9xx4FpooMTfkHo1}E0g zSxUENw&{ds&9DDgx#xKf$JDaeclY*IANAV3=et)#i}7{OV5iUfwh12J_}E0WuH{gR z`_xsu){E*hdp_AM@De#*bUD4UEcsYZXYG0GX`8=0T-8i&dN3#ZX>P?wt3%)AY^$c! zN=}{orT_m^sjYkRtsdDPXV-tvy)5~>-S0Pz-y5LCE1#f&%Nv0-{Y4;uEI9B)C86Sm zvE^@{m}h;5R=f-LGPSk0 zwZD~h-WLZhxIx4MW3HNyNB=XqI3GFp^=PXyng-5)M=a#?-V;nWUu9WKTkXatjnRXPt?H1#OBQn!RJ>YsTE^{4@g_$@g9@)kaz-xkwGP=&Ce(QuesE`TKVbw*4ugiqlGUD z6n?7ucCQzt?|_IZD4Z=^c`Ne6K(PV#{(^H%Z5^d-UrWHQ<1(2JHo3Uhqk1vOP*7B8 zT(D&25ww0@y!kprQHUTYz`pn*>|WsTm*rDi$Mbp8ht_Pq_I}qqPpAc4V5K@K36((z z|7pfNc(oeTW@DG%!sl3U;+QtOd`^c&E5B%dJV@VyosfvEZn zalx*!Nb!-df6InzQE#ocuZN@}hsIspprm%KHlWf8ZaX8Z7FW$jSB~d%zwfU<*2kN8 z*3>y+u_&~r;WC*E4z|m@Ue=KG3JN=eR*oeC6T6&O^DUpy{w^16bBP()CFji2-mV8l z3P>H;F%ZImofBkt*@b}5MhIUaSaW?rDQd&!-pJpp(X@iN7eFmNUkSOm^1G#pyIwBi zzMZ!_cj4g&-TM1Dw%;l8j;Q%~^zba5pxET%xcx4hmw3W3H$rR74b1{P_3#eY^F$9m+g%HWoF% zUM_#Q`~5!d&F8GLdEQ)$um3ACVQbFob-VLsR6d*e_;ptf=oXMeVbQswW_L?27aZbL zzf!X@xzAF~=FlN<1RjH8h&=Y{`V%(K+T_z{q^8+uNwu2d0&^s`6I#>5?mlZ z2h47GnArI6p=fxFpx*vJpDJ3HPK(mg+3}z$an;IYT#Ma$xz_LbgTd~Rj)Q2VB(%qSN39IdzFdVP5B_j}Uy`_EauKJsCD^1EHH*X`Jsyvh5y>J4AT z!m73}?a3>}YG18fzUcIgjmggaa<-3lip7>(Joh6qaXzF#MhedaE>O%V*r;UuIxPQB zzCiiPTxAvOd((o(KTl@FJVgAJRd%txZ7w*&D za>420{QrN_XB3~aOy=;I@%7E-^V4|wkM~N8f4iN(|HrSV)8p;-%?rrAu)uL)_4juV z_3M9n&q$wF`Dkfy#g4z8RXlVV5;tb#3I^k17 zIqNo^(t3DWe}9kIWglbT9Zx2CCta{CdUC>`;K2clRLRw<(_@UJgd~D`J8ld6+ZYBm zbeTK8TUocN>q(Jv?XqzDMtl{dcd^yRO(+)HGriR2LdSUCJD->l`<4 z-3A>?{o(um|F&~#zunBeb#%wmHqDll5JgZ7g)Y|({_2+DHub^A<8spZt*26nxWKUX*P6}ey6pWQDqgJ&kE={wqq4+M zwEDd5_nwE*vwoeH>R)qxMy>5}p-qC@a<|<~d-&sVfB*XP(sIit@Vyqv`1I@ZIcxoS z&00>s+(K0x$f7#kyJ!8=AG3`sF+dd^p%UB^WKUpyC1emCvk*kXZu%F+(>M1T|U3g z%5Ssp)S8(2redHoJf>?sIMv!NowLF5$Fte_Nh_w`JYurW?d?(-JQLDubDv7)*SVD6-jG)7H?IzQ8}W#M0ron z&22Z+W`DR>{eJ3No0PqW?*DyPUN}qla!s^ZS!q6kK1}#rJa_*8KhHN_n)LGUm+rZ% zHuqlmJh%KFXGrKKwv=tQpU)USd^S6uFMUp-Tg>ALVe3C^FrEIm&sxvs%LV6;vvkcb zzFc9x_j(|x6@ZkX9T-_ZaY@LfEqN7MIityV+4)U7J+}$UZ0t+S0@VTed%uRw;W{%V zE~@&F^R-{f6Ba*OpPF3ja7|gqJa=ZVi`o5}&o|P4-P^QLPT_L3{=OfNb{tFK;*a)| zepU)PMdy(2_B%q?zei^-oys(Ohr!%gyulIa6MVfQUQeiBF4W(3AnLI5y2C#?tY$X( zBzGAwz5oqII=f2EzAg|ImX(vY>2aU+G3QsJa@(FAI(NHe@tXZ7W=%4~5;HTwJ*(w$ z4-;3-QSMQivg*pEjbFL=Z~8o4y?$R;aCfxXwZF-K_ZK~UcwD|-X1Q7LLHDU~r;n)_ z__V97S!`w4+P-G91!(bXNyRL_nxmrOE%)|Tw-=wcHTUCHo0Ae%UUofg-S!7f+}l9g z$p1cQ=6|Gj&WAm%*7cC*s^2q=&Q^7`Z1Ks@i>#axcb-kt=jb|9n?LV%zjvB%SF3i* zVCf`pu4yYBQXfme+CE72;e|6yZSAZr?QfKPIF7&DUw)_19W+UHy05XSy*+2up?9Zz zj{7D`h%cA=xPAZMTm=PPak-*1v$EGoYJcP4j0T;{V!zJt#JN*z3}-kQl}V;;f0*Mf z-E*h-ylr87@-k6jzh$z0mp87wwQ=p#_O%B$RdQdQ=q^*}60_XUS2=yw=R3vcW552r z5%pA2(O_97@9~mJTVDE$_&i|Na?514N|!lojR?zTPL9O zcvb!LImLdf8I`hy=M@~{EG$pb`WzNt`}M}`X_u$P*Z=*x;db8cqjMWMpK5J2iM80> zCVzahCdbu=End5Im-B{4t-JpHX8QcrUh{hvd4~>_q(pI@jPTxA|Nr08JVV!+FE6(& zXXy?3y;1D(48!C{X?izJId3M;TzQ;Ze^0^7J(bsNWX$to=1BQ|jXQldDz4_^(F18( zEptPngBm?jpM$2~X6%}q+p?r(){jf^Qd3*j9PDt+TA5@J8oO-1@!uKqw~EPaD@nX8 zaV>PosfjONKV79D{j>4GR*X8(p>a*a!$h~mahIoAKJB;vCvp8p@?Gm|-;%|X%S6)H zlg+pjvvd{ZteJy#cigZ0J++J@Pf|{3m*5@U4F{Mu&gzrxzA3R}>#;Ts>o*&m_oz8a zCdvm-eaS95fo0;`G~57cAeJU9#i9+6(KyWsJ6@{t@ij9 zOYTI~%j-C$=GT6^X%RY0c17j3kc3NuY}3B+Ox%S;dD35m%4% z9bGB-O19?1!Nj*)uj~DN^WiXmKch_WW`FCqTRyy6z5dw!z(@}Vj|($b@!UN5^Tp!+ zKIv^sk~!F3iicLTbhG3vpHt+uV3mP?#fb+`EqeC<|Mxp+KS$)uG@p#=x0cVZlX@>N zz0O(rgzA;0^J90H>B@SWDovejqrWUY*!JZ9;Jqi>3|DS^r~KMM=-;EsWh?w1J`4?y z6)m6Sr)R?*Q;@w=x#V(v&<#h7u$iI6%ENEmzjxl$c3pSj;4sb&96N8EX?}GuYWdnA z-s7($CvWhct{2L#qbQ@8$hB&PMoN16s;8e!e*OOWeE#uQyKS;ri~ii$nEZHSh~2hp z7V`f$+>^gt9=up+0+-{u(Co*hF|&&kCg1H@`gCW-v5=rg$D?{K``g#9o}PSJ@?Gl( zfx}mRNLrhpH@ltl(Q@0hpbC#0-t{X?RBhHi33_c?y$4InMG(|-d8%~ya9_oYnB*fJ zf`zrtWd?ECYqxq$S2ajpp1jODSTJ4NPocFvuPbQI#&l@65Ron#`veVa=A1d?Tvm0j z=(O%(fBU~8zrMZ}7mLo>xI>X+_I3l_nJag{*_EU1ci_VYi|F%fK>ZX%k7YpvldN_^ zg~iO)_B(vD=WTfQaDt+1~%Y81S zLK~*)tRiT5;D(Iy#W*ao;4W_B+{1@2E_OG+>%7ewn-Rf%4At>hR!hoVv$R=rz4@aJ zHbq<}Q3pU{Cl`}1yw-+Uj-=3JCAcp=na_9kQjCD((zuWT?m@ftJFZ`kO?n9vXxz!y z%H-`d%-CPxuoygSAZ^RGcON$C$y}iRx7o`JTcVMi1P_m1G0@0I&KHRs zcXySp{=F95FYl8w)#8yh)45Z2JNMz*?f1AIAMaoPyZLhqwsgXE#^5kd;>M$5+|l`a zOF>goGxGQSeASgy5%K(kzy-%%A$rnGZ{y6#`z-?!J<_v2CN?qv@_Ia<-Vt)=eo zugKDf?TW9U1N>+WYmR{0ii51;pr+(=OPlM4ZSAFe{OtU4GQYmPoy~o}8M8^n$SSg8 z`GM5wv0~Gr^LFl_cL^tl0hPIoq#=t^c06_grxHf9t~^U2VUgD|r7c5FUCCjI67;CFH`)vpx&XRkWFt zwQA)dyWekw=hgrFX;AXwg6F%^W0L7Spz|zm&=A@aiKYaVjq^ycy4gn$GCNR zT$SdZACLQ&z6;s?-R;Y6+v`v2#9|5#R&;Ue?NEp*I;on=)zWYO?}vokyoyJiZ(sVY z2(Q0&l`}qO@&V9F70{?j!M)1ot;+p2MmoFSY)bt7cKiG%GOyR~uj6^1zw_y|g5$E~ zA$yOlTs}|g@L@(~wh-HGPZ_^f&A;~8M)qgrjfvM!{l1f3SFsPNkHE;P#tljp^2v)2 zJ0IH2DXg~THQ)5Os+R@FB-2}X&F^f8eeS6bT7h+V`~AA;k1;H@_iH};{&=~3{wcZR zdwp%cUU~TY{r>q+W@Ij#sb=%*#o~u8!hYb<*4@8i`45+sE;!o#`P=jS`rpwz{(L&E z-PZne&gO>?w_Ns<{?YzCa9v=cMctntUE60axBpu7=;!|rhxtYQr!PN0hauld=HBVt z+^NU1tkSps6L_|4RpdPP?8ozpL#_R{Rx9Mxf4iA}IR5{y>l^OZ{ce3aEqdM6Q_hDf zqpq)uJ*>C;&81hFmG#Ru?2D?7}Y*$c5638qi=u&9q)F{+~`&XAFKv`|ajo`F|hU zD~|g-xBY&n*t@*`>D2JH-S78REAcK{pSR_ro1snOt^6#I$d5Oh&u2}#U3xt>`KwZ` zLPynuM)pHT#p7eRDt}Dc`~6;ZJE+mjX7=U#zu)isk1t_(bR)UH_xjWCbGj8KX--q0 zTN3o+)#~+0^`N1r1JnOUrp;9Sr_<`O*sZrK(c@nA`Q!*;2W$RyTkW47+GTT2)8@~k zZha=vw3yke&QA8X+xg_oc|Q9;A2uA5%043S9W;)XsCs_u)@$=VOwe54;#2?UvAp;4 zXX#%ae!1+g|5vBiut|jJmAhPJ$|A#KjUlIV_k29|achs^vD2dAF@aXcV~Wp;{@o3 zZvD2!eO9Zk%+LBhb^GIxH9|Y?SG``FxO{F|*TaVk+vTh-o)(WtXe{`8HJsg!9dvYg z3p1aE0*}1io)Vr~n|C`NgI2bQ9qW}Af4i&vy_|jb3Y#<4@s)OqKUqAtYr@58FfdDZs}pA;e&at1#+CFI0@_(+S&eNwIXeAc`_{+D~7 zj3j8!Fg*J8alie%CI8=Y@<-2hJA0mEE9c4#?e%+#EPlOMoa|tec4me| z(EQSCk%gyhABy&VY*qfN@NnnE#LmM9{BhBz5KkYS1W@mW<1~bX^;PB zi|3a9^FB`g{&~Z#A1lAzDLey;)YNmKYwcwwKi~OW(q0ZRowuNYY4UQ=q{;cMfe#h0 zI;`LKD=V{@>Dn))1kh&Y=-A_Z4XvvVPkX3n5;E`O(M`6Or{(W>*k&PW#M(M%d;0l# zg|bdgQc|`fEA z*528BJuBjYLDzCf?%Q+DTW@E|jlA7&y|%mlxV+qdenhXE@|^`uuP*!B_x|^t@Ex>t zHp}AL`J9_weEgjH-|rNkkKlDbnv&gH=#k(%H8)GxOk==}diZwnQxZ_3ia_{WZJa?fPiO!MFWZ*6Itp%ikNkUbFew z$|oV84EN2e`E=6LqKl9JCG*vs&*!Z3dCqYzjr?vDI@{>m%j?$f_Xyklda*d@|BP!V z&)vCMFy}kpd5vh_@Yly(=535RYtY)>Q?He^l44oZx&tg z)K2))-YM4pTR%?z>$B?Hbj_>B{I@=z_dKfdK7pWYYY+LAQttTo^89}y+Fz`!Y*e-^ zyw$C_AmP*y9S1iYA*X9#nYDo-g%KQE%lf)8A({CF&)fZsxa>(EfGn)~BAUS#6p&DX}Ll zpU*MgH-G!hwAm7M%RWq)p!>dd>({tV>y<51ysEiUf6AVg-@vBqXy2RpsHHt(`LU|0 zExk8CY`9gMx;|RdCTFK{MfSm5tMH}!HCCF{S-5Y_a_C!WRtHLS*S)Tv`W<)f^8BhE z?(++g`@NI5gR}DXz=w*~OE+zM02*4aD6hG==k2!JNmGN|+uLL2YhDgfO`EBVtObd5LkMmZ>?)f`Fjz;;`JNDv|!~ezn|Oxzj@_hqWAo1kK6BWH@7+S`A)F?s#xvw z)t0@#zqLJlD{GCky2OEz)d~_A>jNJuF1!uekzme~c$n$X_Nie}ntQ%pi(dL+!YbV+ zVX5o`8|xxhg`|XE5m{m2J8_j_(~|Q0wdQ$B2Su(Hy*{<|*vSy@YyHX0;@7g1xzwh5 zhG;KcxiII{p>x|>LKeIC_suRT;7N47#j`X@Ve-0IU7It-?<;w@WvnL8vGT89A?DMY z&}h(qp<&v*Ou6(`zi#L-=bJrO*paNBdg$(!Jk`)8KH*Q9TkdbJWJ_*6VC5Tr_VRq2 zww!H;Z!CDhry4cCPxmeDC8!*O7Zv2cGDI`dY?$Ar&44hs4Xv1fF`^#lM(o zc6xdZldIJ0NvVhD>M&=oTzX1r8OtVPqsxw*sXv~-*?gW4G%cNHdF}b5)0VHF8J6zK zzP`?|BdK@S7Dd)twT2{SwpG(t6g`q^;fa|%O0hP^+wG(0+Y ztAv4&!lu5|t^b}ZOnjbl?2dl@&(k~dFW5(HQKU=Wq0qBiJWyR=5?;I>ty|NEY-qlJ}bUH{aA6xyGi5F z+%3l0r-cP0&KjN8`Dk_X)iSf#4d?W;)+f&0Eqr}q&THeduYC@{TuqC}c z>?$5>64o3z^Xr?<=fx_HPd>kL_Sp?Le;NO@$$amE+=B#6^SfTzlT0e0Jq*+KrsQGjrs&m?N!4f|ib{tUUbOGBUk9{5y5cToP|- zzTSQFmfD4!wzJpfZ(I3G3%Lse9`1Od1FpPRy0y2n-kXKBFF%6`+|@bJ*3SBF--?4cdovqw@LO!<$a)N!R`Pc>KeQ z#r|+bB3ikfGyw11DVPv6Aepl*8P5~?KQvZ)k;Gf8G{6ev;IqN{oXQf ze&E%0p~cT@54tebZ2PdM&-&etveQ={?>ukydd(s>tUkh^PCEcw_7f={d-tBB|Btmue|-fN4d{l`tO}n@z4Ix2j`=g zpT0C!KQP;&@q1Bp^ww;_E6chf)0;&9#Xx8k4y zz%Xro_!z@I?Yq%y=LdeRSXR0Abz#iB=kuP|&U#*KdVa?F>Ur1R*-FcW{o?UozqaK4 zR-5ld^Ev-W9*my_+R^jzyznvY|J7$ruODgn+{|yMao26$`FndFTb?&QYg~5gcig(? z^G{!WXZ!xS+q~c3B;eVzu@5wYc41H8L&bQXKFen_HvD?E`glP5%M(5aXJH?pIQFVL zXE9Uq;$E|^hoB8pw`;%OJq)^7X7ZhNyWdHz7Jtd?c!inYMnG@hk4Hf#4vTNz`~9AE z&aRis3^y#?AJSCd!==z?`|U(e7zoT-xd~<3u?@(rq`AIc-Y=< zdM!e^?&iNwr}dK~P8R2`-TK^HFF5XJ(y!z8|2CFn)w#+0+5i1=>HH-LYhw= zSCdMXIT7*=G#kBdn&GjEosYV-y`Im=Ubpj6{r9)G&2u&$75gaPBzdm%R_5}nUqrNH zSBI~UOT1tEomal@M`A?&-mi~JihphSdM&ygv>r~T^h)5zsLDB?_e|d`n}2@u1DlX6 z!BfUti{S$lQM*`b)hZ%$w_ZK8qww*f*zfP|K28^$+FtqI_I&NrpFO8O`>c-5emXV0 z?|e)8ub8v4^Mi_s_|$F}V7B`~JUgRgQo9dHQ+5z31oBZT9V1e);zl zyA*r=&wK8F{_(`pf8Os$n_ItM1}%fIKm4=&*O_$hZ~7Xm_WFOeDVNc%RWnf2-}PeA zhQoZ;N9?O5rhnK&Q8hur{Df9wtT<$`OiBizCQb?fJiiL zpvuSN{)!J1^jT)-@2mXdWMA~;#0Jnhj)0^S6BL)OT)~pF`K(#=p6Y9gyFZ_^KCHX_ zj?u(pXN=FwnB7Qd1}_oNPh2VZ;A+st6I;RiQI~!rdh|nol|x2I=b8K~1EH2Nz~Oxw7@! z@)(CH$7kyQ04=TC@$1#}8m}6+0abZD)?>*x`HvPr(KF)cYUpEYpSM3KcNCr0{GQf?Vf4yA%|36LN-x3~Q zyLF2t<7;)n4SWB7yS;W@@^Nv?eIna=_!mCp7E^SnUZ(qb>4eNaO^qjeY^%TZycSrN zC97ov8q_|};M1$n@yb)nIiu!dOv*%8H7=u>LB3ykFDnH<_SOmQu8~xKvf|3AyVYyk zSos!Lyo&lAtfz45^`0k_ypQQ$S}FMNL+UKA&0n6*^^#guoDuRGw0dfzRrgop=xyIv z!YU6rA3AOO{f=>fs5f*-W$voo7HyAr>O1YaA|V{IRj4Iwc2fMio#DI1;&*Yr<^0Jx zsp9>`|KIP|+vgQIKYctqf1jlDq^LRCd#4A--~O!gsi*kRKTsQB(Rb^Ic8$5KK(Tf+ zd+T@ORnyX=-bL+^U*V#9$7^X^!vTYl~Y%f12t!Ysny5~W4rNynZ z*|}=J&ctLco%$&L$AwRO?pv;#<$v$a#nqtc_3X%wCzu; z$mMA(*TtpJEq!Fq^5ajdIAiYC^Y_mEid%Pl{^`p1d#`6eg$rbMTR%f{0#p5X7!Ur?c=Sec}y(V=z&azGOYK`FeI?I%-dyo;DTS>py z{#_&YFmY|$R2~k8nYU(21+R@>cQoSdjHut2qZ~rIjUT$svhv=)^32QY>*FKJ@0LE! z70AfldNpie`TKi~D`(rJGcg~#KH1;SlGDAKX|>Hm#ae}ig}=HU%n6ufpoTF(vk5*x zvtq5Z+LN7Ozb>792~nJ*|AVM?Yd-qi=Rl zvX;Tr`906~yf2T7KDm6_=Yn-!-$UOT+nldf|NY!~>HZs_(7#f3FFT~x$ahw{M{8=- zGVrd-7_Eh%3{sinXC$E-mOIWu(MX;k43YkE^kfzA}trT`}>+o+e3%+*StXZ(`>E1ctZ66^G)}K`c z^~67CgjAdmm%AqR=kxskGVlBJownaCiNak4}F43Ow`(8>iL!`^jqaGnK0rD>v?Bf35It&*yW6lbc02mN#^)a$dE(i-Vuj zT|)b&mxr0vf}oC93yXS9^;a%Pkv%IiA;56jwOpTvPP3Y3ottcK^W+Z8lr_F5+6-?V zv($>!_J43-%hRa2vlVSpdN#JjMV0f5{{kJGvH5a)d&ss;#~#F0zZJc{Iwg~3UhwI# z%$x$9hvuT|_t?GNGWXoX?|+XzSA1{1?B4QYCFR!~eJ)S?yyyPq>cv4jW_`Dr3aTh7 zwtn~9b=~G+;_2s;{`w@m4Zb$xiE-~M=YLEsEBAyLZ<@pK-uB-kP+B$KKV7@`aMhok zbDrN@xd6KV8q|?3sRQ@B6Bi$Hb^;yDu97ElsExHHe@*k(Yti{r4>_;ew!&_~Mz%Y( z-|vP)hmtcy(ax1yZ}J9z3ekSLQ~%fG=fAeru zvcJstsPf+X%0q{3o}Vm+=7CA&Tc5|hHE!&!`Ellf<)(KJzu&KyH+OxM&a&gBzV@ox zZ)TsXcV4ns11{HX&p&TF4qunUWwISyt}hRKsCbYwKI>-gq*Y?8_-2}&7FS{d4?{7x z>NrQ`_s%!u?VUSuCZCtaVf*y?wPkbOP2IjRO)UONgn9qU%dxx5dL2cwuPo)&d|}Ke z(tY)F>n#04G0hVivoC$B`N+56-$U41fG0b$Kyw7P{fYN}uRmUR_1ENUs@mnc`~K|z zey`dvWc9N%CU(bo8@Z&f2=E0hbe<|7za_Kfa!bJ*mowAz;to&$cr`3qm#v4TV@-18 zTKmeJ8r{beN+%ZU;^JMS$tnX8`W__x03$0#Ox&G+i&ylD8ZjDJ(%nr`X30QmjdGzUH zzl}qAo>ji9k=yiA-UXgLd25B{iM8Ku&MvokUb*b*vBb6SpL#vsAXl&VeD8Og z`O-+UQWx%kM_=ZB)TKAo9Q1(MFi9_S?<$*1C1i{@z*9?s@OK-`3}GFO3^t`CpTHs((Ua zbhu_+ zuww?H6Sne$8l4fmZmD9IZ|7WPodp^h3y!^@EHdK{OT^Y-zg`E5(t{U?HW6tIHf}b~UbIPxYMJz>GvAf}6;$6@G|Ao!8Y?iRs zDBj9iz4plvx_JX-+|Qr)4E+zEzt>mzO$#xmb5;{ng%xL(R75;j zTZwgiP1E7PhYbhXX};X%#)l0KG5+A)yr9|uQPOAx>;M%tM+STdFsA=Q!HEfq3*-0K zCI0#Gk@edZtZSV#3^pF%F+L-px8p$*Xo_&x#XsNo|L=VcURx0YTFdTVYF(^u6KH$r z@WaFH?TyUrZ3~^-%bXZ@V_QUaA(FM~>nqV;-`~rN#n*h?b+_qZV%sLUhl&fD*?75_ z*?2bm+K_kn3f5&_AwmmYfwq_N*Z%qfUOOi}?P22F!_I!@SyxsV}-r#=C=c}S8K5S_CFd>-9y6VddgSA z&YQ%q2U2u&AMRW(@aE$5CKbp2&>)T)vW3AhrfaMw!+8sK$0Q>3lzYs zS)1CXEr%S|fhzyv4R|%{+*+R7_3)7igex1HSa|q(`MIT{=7k|d;j9Il!8=*Yz8U8H z$L2OJA<$}8os5jiC~St0dYoX4TQ5FPdOcQr+3dVs8{TfaU3To{y(ZQWj9kFE}vh=1?nC|R6J}wTzfjPp9?yPwVZ@X}A0F<|wF_^Z_)qxqAJ+U5T|H4xQBmW!4SXqOx1pZog;s<@NRT zme!f;5jhCTT3`Tbj~_Y=8bkf_@B4m!`+q-@cl>-dJGtRTR5fU)>C5Hw<;w1sUf*yv zEc&Rk-p(hJ41T}a-2U}iwEn-}|Nq|q-wK*@NL)5Et!ux$QHn>!gGTm8=a6YcQ8Of8pAvG=$d)1G3f{xgW zD4g~y==ImA-Nz>?ySG)p+o`_i@3-3*lR;~P_y0Vb?=;`8b`{?%Q2PyZFMQAOpq-VV zd5QXepXYzHIjytV=SJr8xrca+&lp^++yL4UyZG|;_@FJ#5K4Trcs?)>onrrV3^=X1;3K>JAxA0KOdcXxMt zXjr7`n*INN3Co@~1q~~J<~feO{A`o2m1usi;<3T^JH^xeDqk+0e(e6+eZSu|emorU z_-A0{jxU$I-Hm^_pRUe5CjQ;mqxNcO_|f#kKjaLPTp}`;PCfK$^?JLLpfo9d2z032 zefOB#m<4mMpn=Vq9l~a3K?{KEgzA6azJCa`KC{_snd`wYjtMl&eI@*vw zEi#SMr&;aJPtcZQW~EhPoZC32a7b-dJiT`NJt;Om8Hr}aYvC#~(k2-JJXijGXt!?x zZCq?j=ue)p$;V>nlS$skF1$Lx%-<8c?rGK9yULF7_xII4Hi`IU4Vs(^kFPaln}0iZ zd#uHy4rQ%N0y{uU+zd^U&wBjwcwtua-3{4MR*!%sSb=xA)L4zeKA&)DZ zRs{Q5s`^Q*`#jkS8V-B8l_hG=w6epz<}F9XqSt(}e%H9*^+k92-tU*9R)4v}(b;eF z>BNtyb!Yzz^$Ci}RlnI-_|{wM`jk124R zk+o{2*YV5d^Ioo6y-upx_mEo;r?jP6Yj1@8&nJ^VN(u{nmO3V`YhAV}Th8v=jby_! zpncY$Ezyhqx=H7XG<*J<_5BuT0eQuTgY1VvtI1a9M1C&b|My$>`-$=YK23i(Ejn*z zO9^PZ^L5odb8@%c%&O$BT!XyU30xFi2|Vz@pgD5=hk^qQj2lnAS+n_^R_LCmwP_)X zYd@bgPn_r~#`%0+b>7NNc`q(31T9nUP`q<9eZH(VXJ(66$OFN50uq;w^~=j2c4Ts2 z=3oBymg&Da0lf~B1G@e#J!Z*ydeh};**oKQR^KkaUz_~(7H9w*w5hv7Lh;!->-RFw zdRmt@h34y?cdqAL&2eCc(QeTAyz>g1B}VUh&F^)5pRT3JX&Ybla_NpTxYWoZoS@j{$r2vIgQ^Er)|y8xtGdc zty!Zx^H65pzUT9*k3BEH9$W6p{%`JrDFqWYOjIzOS(qOITG?!hSeJ z_bu8k^dFco!K`)Cmybt;{dHtPXLufoow{@TWIrp-e|tb%q}Ru^zq;{e%hNsApUr96 z2ATtWEa4se^QUF)PSE+HJCv{Z^af1bFnz()0&Mw3*udt@jqBPrDb1bf^D5QCc(%p7 z-f(O2vP*qk)`#Zjs3vkH%-H3RWp#4h!UtC;#_{PR$^_gW}N97v>%{a2(%4oVI?J{MIUbW-#4efP1l=9q)&sjci z0nI+KEoSLuNo?76^V|FS|JGrr1A9F_crBFmyuixqw@y@h*uFbvHoa&5d~SK%A9d@kdu~-9zmFLF1*cez1rC2fd)AhLHgbD%Jl`Z*UMVlD zD6&v8ICgXIg%@+n?{x;}ZdQ~!E}*l~PHt*pi`&YL|Kx+?Eaj)>wRCO2UswI(K{J2S z)w`g|nLk(8Cg=3msNL@CJmrt|ND4Q*{Ig!09=_JdxV2sL%jtRY(M^X#e1H6S+<%-m zV}{+Gs1xO1F1jE8%CPglNSz>;(6S`wQbk9(G@rGpr}Qp&b3R)kk@D8#+9I9nr){xV{o*W%sbvv+1b zs=V(nw;Zj7+`#k}l)8Rg)wWR)NV@CHwBVXq^NKGgI2O*(@}4m%cTMwglgnPcr?!~f zop#D@)#rVGzun#;CKo(o`P{Nw5feQe!gOuce63phwcAu|qXI|LTem}6%c6rNkMDiL z%fC`8MXO@lRv!MD)9!qlF|9V~tjo2IB@caEl@oJTy-Lo~ZIr%R$kMj|-`DkzMbf0E zF37FSQ=e1d6tjJO(Bh&=3MQ@XEcGGUX}3WK-8%2Tx3~KE^I7kCu70Y>&M?=PPX$4oA}LCK}%D;NLDyv0g-=a(tO7{6WO6V9=f<4+Wu-=CT*D*_9x zvQM8nT*5u4-PiL*==7Bve4vwEjIOPXF1wlP-5%I@ zY*))y9{!I?E0lkn_Uk?Sjn{k?f99IK?y1szKK(~~4ouJ76Y^a!&QSLUXt(s5cgcT` zd9A%u?EN}EsBy+JkL@=6jam=0xcE6gbKKd~d&>8kUy79e-&C0mX$t2j@7tE+!6T!RLjcc?OX{9P$_sALa?&d+6|ayWcu~b5%u>ocYWA^41D&SbDeg^0~uLoivu+ zFuJ?_mYQ-*`+*4y+ImfHgj$%I@h2*Ct@^jBwS8;M`mNQAizdaEao&x%u6O&=yWL-T z_%9!mW68<<-0$_iDJ1vAtOk}EmbESYCR!FVZAG!ti2L>r*F-Iav$>EvH*n%V76{f9~N_Ed>GQOs~L`lE3{f(Zl#~fMXFYN|1O8Fv{KmLBdzyEKl zm(lErOTIF_ln&m^Z~y0mgwJL^mDlD$x+ktY$eF5rJSg;J-`O=AJ?}@gwdbrmykpU< z$(on8M6Emf@#-PxvVHGvZ_oeoEbhjd_6gW3CUFCsGd9gtZS5_QAsvD?rEhPUzWa9i z-ASKr)c_@#B(BU`Ta-%|$8a3o*y5A(Z6jz~2dHgksG+Q(q!I%<%{L?=>ekWezJ@ne zG&gi^efNSpH23@6^7u99lGBsSd>2ObXL%k{buwq#7PapBErYc0$?sY-4_TbC{eCC$ z!~{jdkf+Z>o*3%RP%!aT&8wUjb;vnx_O(a9udc5XU7j0UXlQK1$%n9DlJrzUM28k z*@uFCKc979Usms9`8>kx@XWejFCW|fdy{V8z1<;Hn^8ylo&Zx3pV{)nzb;I6WzUYy z%{*oC`AzxV((4s|^Ynwaa;j{8m~;Arf$#LR>v^jTBCRJE&iQ_;@{n`i!c&ud6FJN! z_un+w@=<>BH>55XxKrP#8Ghiyh6NucTsHEZ(WP(pz2f!S?Ox%F4rMQ$8rCHm%TjYQ zOtU2^JnE3rvO7kmQ;(@>ge(wzBM`Lg^`>KTjQq6=0)HO664_+rq$&3Yv^@6u*~Ll| z3%U|ORlCmG?K8etJ-uhgvSdy9iM(Sb*EU$cTCq5(*O|`h-uXSielyc2trL|k#GL9F57I4J4>zO(^ z$=QUqWm@SuO3n@!kQ35MjlTDK>oxW!W3zV)CiQq7c(Wz;mxHJrW5(XwFD@=l{^4#K zx6@Spb?w=#=ZmGL-fb~ls5If#p&ajriBZQVoCt8&{8dNdE%=P7y?UQ%^4(SA~Nn4nHe%?l>%b5MDv&!J%E1SiIT<=d# z5tG~Z@tE|+q)(H)^*Gl|^t`GVdLyT3hplK1E@`kv?uIS^~i z)ZX^P;ty%C)nPK^%)gTXTcpt~1XW9CL1&OX2OlSS_FE5DBMykDTv+Vhzw7Q=&_Lti zUAB@~&k$SS&@EDkr$i%?2!sWmBmf;@u>rKqZ=P*+ z+s|jS*RRt6Z}n!BHOUB&Fi2=vm>Ao>N*!{>J8JEuq3+O8@#o|5cDveNSGF=;{IKEN z!-pRp9zJ}ak@@h2h0d~Pkc9SRc372{g(4s9Qg7d$ttl@CX^B6pt6z*Ut}a zFO^<256hV>0Sf&LSKC2jAusOkE}wU}ST-57cfR1mgM$n6@9*3B!4{h)hsG){&_HS8 z&ZpB>-`3>i=jDHGHp6Bjwv3SsT3`I-KkR0Xb=nb?H}ve{vCfI`F&;i#_8_!+<-YPO|KOxDV!hd9;e2$bDSoeoM=cep?+y+I4eK{t|ET+9Zg z$h>_&pB22_dcCds{a*9$KdnADg3c4%b02&}A!r(?{8{v@CGSCVL7?U577rSj4}mtC zMc$oljs#p9lb%Vy_s&CcBxsrdZ+ z60q&a#Dy}@Ji70^Ll zJ?nMF<-(4hka3u*)F^0|n+sZw{o`S~yw<)srw(|9PMun_N&Q$~J!qTart80v7G!Vz z_hjpd%kt+!&sKs)uD^e|>~H^cZ^`Q8Pj{|=xqQA|&F{C{*Y2x(xpX@C#Izd)hk0*b z<;Rjvzls~!tl6LWvZt4WzxwMd(QkLl?|*pME`My5)3U2V?{fBjz4q{^cs!50Y-z}w z_|qRYfKIu1aG>$w-tYIiMLSL6%I_2&Zv`z|2vfKFbV3=lBEfKi_tbXKxdRrUt=->i z;9I+|?tC^&JEricC@42Vw?8)&?z`+~y>^-UhS%$MALBA@(m$keuJGeg@##%2zd-lV zfR{E4R0Zj}ulRm|ng7V^CtpFM@{eqV53Jq)@7KjgPp8N8!8UoTy)0h(p#XI5fpq?! zLK}9+yP(T3Y_l>ee@#9<^Y_i__j?a7o1G{1zW3jq`u~3~8n7PueBQo(&5|?Q_I|si zUGwRry6|6}^R-K#oBn>Y`S^lK&nMKzfsRGEk+HZpX@*VNn;VyYmfx@a{^4f&{Hsn+ zHX^41aFH3%(C{#kamC9iy^+Wq&(`}+UV&8tBdFnt$}sC+v0@I`ldS`Z8SyT>>EBB@_U<{=2Zt zJonkm^uF`i+wYcj`>p)=M$Ko&gzB7%1sJ8T2xwlbC)*|)wDxMxS@Zig2D;M~^3U6T z=K&w4ex~`=e)Ib^n?>Y=?g*#|ihX^5zkbomr7fQNdpIl#Km9^E~QQ*YhfT`b(ipOuMvPcvWt;;Ot*SaNF^FMxx%hNrJ4?c#@Zo%u)7Z#0+4mrO|Shartzg@N6D@*4%D~4yKRP1;*E4$6|*$idS zwKp3t^?2x3>>nh*GZTj`&aewmvZ@K<)=Vk@2cu?@-!a}`(UjFx6bfVNc zRU<22e2yu)zSm@N=;=kDwOZPb|C#on6?PRN?8ZbF&`rFGg=&YL-~J3=8)Ygk$F}*{ zq}KNTzpn4UQyO3Ubt-q&qwZ-;+BP8uVpAR-Zr^SDzfaYs=JQ!|-^~|41&hR7T^W3Q z-JVZg=GFd=bEZYDkJxx9balGL>ouEWJXY4qZxx9?-6wqbuz`GQsi;;+!RaNvS zT-UUj6930%_kw*t3IYz!WxBiIMdcP78;yN$11o0C-aKta_P5NWiWPeeQ!CzXy)IW; z;gx61e|Vnv-zAdMqr&_uX3Q5npDl>E5E{%nv4-JcV#_~QMVpXw-X^hBt+8W+nEZ@IsfV}@hioyQH_b77+u|<2R6eIo8v;%* zmoAC${`%@_?uQ2l^V}AuUE-BCJ0tr{NT>ap&i3&5+N-Q#Tq~=-zkAEHzwq&~olmbH zoY!t=%)fsBzbbL7towGljn`J5oz*KjXUdwtBF&2e{1lg_{XJ^`TX*}Nr0w_XcHb?( zU%M^wFq`@8z_-^ERX;9_y75`th9|rK6-RN{hn1Jtl`4IIc6Rn!w_d5dvXy*37we{V zs&4;q;rY%jF>%!~-(Frm{&wfe)GxcH`~B^U-?#4H#h$Ra_jHtHS1nFGzw>RjWZKc^ z=mF!PP|MWP{&KU;s%48r2^_&)#tpW~5VUtB!A zRa;y8G;1=~d6Uz@xnFd-_&;a)2lz)+tT+(b2s&i-PTWK;S8@HgH$EaK)TZ4z!A#gLt_MDqSu3t5;uN3e#{vlE)Yf~MZ<-x!9DMcL z5vA7~o?j{|YF(drew|%#ZB}quS=lMKJq)nBO~IK7L|oE$sF+cAIimNtcZGyv;KH?5 zc5AeGdUaNO(|B?DjR)&eu0JJQoB5W$ys*$YF<}8Odg-DNaDb_$U9d@5&aFeb@G7h5 zwV!rwj$5CX@Bcm5cedHtv%9XuO?!Q9ZSilftexhp820fI|^+x=}mws7-2T-c9-QN&$bKs5B2<(x za=0jUHDc;r6@FKTFF^(}}#qCu=oj`HD2Qcel6e zU(fcMuJ@M7XKK(=ubT&(*(b-XKL7IkJlpD`wXe5ckK6owe!boK4+d*&_Z>dG+;-LK zijR+$CHN&PM{36J+f%(v*}d<_J*$_ccIT&Fzp)~A_cl;LILj<|*7~v!Nw7;gw3BCV%fSLcs)$sUSE^X6jzlHN|EeQhMS9)*n?!P}C_m@5H zHQ$wbJS+b8w%pvGpPqjEaF~Dh>tA1AKfkq#VO`$sioHJ{QYkC+w1Z5XFnRwf6gT>ZCm|q zOWN64J0}=xYiozqFZY|9^ZMFaP02z-jN~tp3rZxv^@ATSblPtHe$VCBtkq#_jadDa z-Fh~Z->`># zJYM(frMh@npOon--O5mhWs4GgzF(>rwbPt&>0j6OdsVCdembqMXCq^r){|N9^mljt z|9@uX?_#32<;>*1_r>PdkH!6VSzljYFMqhmuKwA~^jr7;|0_4&T=411$$JkUo;AOp z!*$_GTj}d-H!Gjdeg5j=-{8ncZ*I@qey{3u>zt`tp+)C67eDtC7x?$#F#o!?(yZn~?eLs(F(W!iMW8=1jgG|*gmrlQ9$`zZs8npN2#*2%K*T(KH`}X;~{qcFX zpYNt!@Aw?jLv%9-k9tj!G;J zyM>au-qUmnjk)Z9J`om|do^L&wYAZ+r|F)bX?*_8jlKuYm`u*D)nb~(` zi_T(oU6^`zS842psS!o9D>dXD=q`_PV1Amql%NeznMwtj-OGE~R*%NIyR> z_x=9=`(B=v_#eY7ZMNlh-tM<6p3SNM_jBFb&W8)n7ys9w zISy*QwEUgb`61wRoT!WK-!GT*US{XHKAb!4;IZ>ts$Z>Ken;qe$f3i*ewIhiN?p-8 zFjYHzSHY*b<@Ywey}kW--r5Hnd}o`L-AtW6b6vQ!>FxXr3mm^4WS2j3=y3MBoyYua zzlO}VuirPjbNS33`PwfNGbP`?y1F{HqT~72TUT^=OPdE13{r^+^8`?-d|K;Un-}SYi-q#`4l9g_07px0hkcD1ubj<+O8M4zlKLjXFO1ql*vLNo^!f7Jf zHX#Qf&Embx!JPbGqwa3@n`>3}bZYpno7G&8wtT5L+9kR!i*;uD+|p^>=eMk1`0eB6 zO^=U!2&h&HTOD?`wf*3lT}M7_aBAhsn^_VN#LNHHs-T8mTrT>M|7bPf5srkP~R9|@VJt9|Bj zQKqbikO*t`%6SEAK3rICTiM#~7_Z^b^Il(feptbZzXHPEdC=r_=rG5AjR1_Q*VU)t zgTW!b(;*crRQKPCU++KPF7LjBF6%WN=eaR5I&*7ZENp*s$y>klH|MJ_kEQc=9Mom^ z`+7h`c2m&as#0m2iVd>^SIjIq+{RnnzJcZYC7u(YW^ijVmq9hW8Jv0k`tS#H`6m{RN`~9};e(m?0ZM@QV-Z*ZJZ=ZUEy&}=s`C(#2b%=XJ z#fk^P%MD&1d3koWd33LoX-xgg10rvoUrNjUvYCGV#)ZFE>}PeZx;#5|$>F#yZ!EXh z>Kf+qS^D!*Yc2?#J;im1mx6?q?)NkP|$#qViQ^jd+x))^%JV(xzEYzIBCY?5g;fl)lK}nz_xFO1=3T7yf?v zKx*!VwfNe&>V2SWR6BR&2ZIU~UCFQm%L3kCSm^9IKZJd5hTFYqy3wCh7a}!xcZs-V zYHq$Iq{AP!V&#SN+cnl)K68kXnQcdduj7qtYolx9=WX#_rLI4JkCuOVb;*VvzLt|` z4KljZda|x9`&J!tTey48;d!Uib5_KCo%t$w_NL97`)|$?$I@sK0cDK)MzV5lKQbg& zTG_2R?ZGUR7Zva}@WS$&6S=%Z*d}Wc_^XA?T4?4Y96Q#WbZaF$k0kukA3CS%J5BJX4 zx_!G>SF3|fizA1CoZAYTw?b*&40ctt(TUr$PiT&;sZadLVXDXHk_VGqgDw-Q1a_Df<(XPnr>taFo@ol`iI$VBf;I^E|*{0dk zwq{+`x*wGI{nK8@2-}xAoAYPyz-$oeJpnYvJ^{bLXyCUxVC&tO}~! zcq?|13#WC(hXgJC?%3I#X7a(#m4X;KSRvp9*r)|Qt?j9&rfdWqE_}F+H~0R&+C0lo z6P4Z9cumzZD|r#{{mApV<@0)FtUm^6tLUeO|o&-{0T6twd$ArakslpPMqj{@+g9Z#R;+ReyiSl)w4=;X*}Bw-m^L zdMGz`&g9~^E_so#HhTLuyV_qjj`d2ft^NJ&+P2*2-;cWWb1p1!eAnqcO(%1zc6eF+ ze1pU$-G~hbo}HOF*?Do&(XMMtJcVE1*tmG*xdj?eyi?s4pWiE2`z7%A=lTEN+%hPC z7i0bR%jMilOFYerpZUx-Om=JBZh0ut5lffJVWJ=?bF4NJmD~5@QTMi@r(WV*t1|i> zS_|&i{m#{~>8a0oo4F#gz4PJ1b(wc|Z2bD_s&?+_X~ny*A82HL+r+JRLNF+6=a+kX ztKW92&$C!HoomxsK|aA%Zt!+JJU?=61tpHVlUIHyczCGQtoB!l`D_D?W_JEE#Uz8z z8w}doqvUK84m3nu7ST|v)A^zDFtLSsI%ac@q4B@ELxse{fDo3l)_Ir#gx8dqYpt~eA5n7Bag$d@y@_;;7QOwx_oQlKuHe{0K0*%?9G^J1g- z*VXFST57QZuq#)y|Cu;%+OcY*XJK@=ih#AuJ!FUUg?XP)3+AygFG!DooZ};Y3kDTo-G5xqVy3dRC z=YP1cd|t`co4+6K5Wwh<3Rv`kv&ZYz9z>_*VD5c%CnN4xYq?(D1G zotmD${MVOH3h_h<6ipXSgj7^~JSu*BhGFuW{QLXz-XET2ntkg? zr|{i1hnIR!cl&V!TSO@o*nnH@vuASgfAzTa9n>=2R{y`wJUPI7dg%l%%rOa2p&!q9 z$T@yx@(#Vp4;Ri_%^X;Az%wlDn&Fmt(-FfE2-chzpu)Yc!Kb}l&`t{Lh`}5NkdiVZ zN{0++URbxZ|F_Qr6;?SnH<=YZIl-}YrPa&>f4|?)XXlgIz$vW8(1H><;80ki<4`ff zXy$)zBS|@}HPF)e)c%8lv6cl79K_}LBn%Yd%OwnxTILp?vs~Br=1tD+eYLySMs7Zq zc5Y6lb=jK&`TqTC|I)0>-)-6bexLR6ztZM;IdiScw^gS-Gw9bK2{>yUX8fZD!}+#;w2S!n-}6{cdm1kN0|eQru5Z zzwS||dQ8QSCzJi%0&Pn%+6D&-L1W~J?CC}}NOgnMuNJOD-`?CzcJGtn+-tU;+t2Ey z%I*F2{{yEVX>UK;ExsKzJ$T>sDVo7C73TT(Y_!AH%m`f{clX_n$9&hnt&82g z>sQHHfBU~F+~Rs?0{6e$o^^GVjQnhq%t^n?cNRU3xgj3kR25hK*0g;7>-GEZ{rhp; zK5D*Q?Hf?vk4seRhIIa(#Om+ww#MzPy7}wt>${~~B2PhM0lUsGy(A|;;nGs?-39?m zLskZP%069vA-MI!1^21hpahK4y-_d+H9n8KEj#3_E1Y+2&CJo4EIV;}W@3d{HA2MTPj`kGb!Y-W0r z{>td>>!SHUJ1BNvFt}-Y^3`>oW1vG!)h3I_*Ican@*?r|wYA-`vm*Kro!Xdud{_GW zdwZ*OZ2r7h+@EuLn(jJZS?jVA#>b$Y95N3RlV;b>H{Y=?Y;DxLdG`N)EM8rHYfI)j z+1%UPwmv;Q{q|vg`!{-5kDKh??AXkvw*x$(oON|o9-E3We{ksYDwF^MRWcJmMdM?I z;D?DvyF}M|PFB-96SP5Ggta~D-RevGYOBR}*#3CX{Ozpy{Tn-<&wG7nBP+Mq4R8Iu zPu2y#SpK2l!UD&QRzlMiv=3Zbv-h}M^_jD8tbf1Rd^ZR*%zjh(!UY3*VlQcdyQ?nuT zZ&A#)oSAz+9OBkq3dF9p51i$ zUz673W4*Dr{rzQ@azbExOV#&xck?R0uU^0Jm5qtF zziMQKL`y~I!-aRYd|%XbrTkvy@v|Fx`1udt5;kLL{=F(5G;UH};Jv{o`t-7`KC$PQ z?US*u+ru5+yeM*Nl$2iuA&;nfPb+DRPO4aOz}q`%{oZd;+u4&grJnA$`<0QCZ+rIN zc&~{*xbU0mmCUn_ff_6S zGKqp*DvzA~!p-;O!f}xsZ*OcoEPH0*BGp~9){4jX`&C_gy(J{#X!?7X`FS35cvt-8 z5@mXIL6|jVXKUTZ()mTFH1p!!-yWAZ<8tM>{>~>t+wB)jQ`8ReG5Z{Fda^LT&&97% zUb0i9OtWN)D^~2)^0$6#V!pZP`nuSSR?Rcp6CW=86>@sHy8k?x>a|U0wq{=!lKaJD zu+9-wjKG_z0uBs~i&;PoNRgR5{98@JH=naAf0rX|mb1ZYs@BfnsiJ>YzAzA#{j@N+ zW^4U?C;hWg!5fyLIJIJN)Ka<#n$8_ab28 z(QfhG>enu%p1pH9QE^u0a>>eHbEX}C6*W~Wbk&aQpdGK}zn|6q`}thYC1i$}&ikuI zv1e}t?^wnhAo3#9ZLuHwz5Vt3SF5l35Kx-^Y$0EKV8OD(P9neN*8ltISsm)Q(r$k_ei5O?ejiTM6sA6Kv6S9I{vEYs{er-L~8KWFv7;`ORK?995oDE$AM zJ3BAiF8}4baO1SBV2rAgp)rJ&gFjf*`{6I2wsuG3ts-HLiho(h z{jT}rv*!o*R+h-+0>|~2`mXUX{$6r-Tkh>7b+P3RN0(-bSbRQX4C)tdOFcc!eDp=flSp=m81}-v<`rpdM8-C%^KMr5K}?pu`34j;g5H^ax<<+%U2z zfee^1MXR+-`14&AqlJ^4hA<)f`JFh5tPw?7!o~hm-2_&wRaScU@&)#gPud zvU8TtckrjDr{Dhe_IB>sS*D==@a>Js?Y}Gjn0{P;e`oRXyS3l%TCU2uvtwiFyE`|Z zotc^Z`T6Az%Z@FIDMQHdod-wI=`6+?suTTjJri$ji%o zKL`81*_wK4N?~F|-cpxNp=AqvRkt5F^?cSIDeKfzBI5VX&Ne?UGA|6;KE1s;y`MWM z6sdiB^DmsGyL2hDD8(BH@MbIxrfP-eytuIN zUFUi0_cqejWjSwNiu&#SbV}ROr0Uz7%(JshjnCShId!V5c3tptzip+j!}2Y+K5t}~ z+pv25zFQ(5Z*OfqJ+J;>W%Qnk!Zm!c#t8=)vM(%XkU3%crG>H z?Pa9t=}$A$=XJ)$ZO@C9wk%q5x90O%JrkcY-%Yzrn?K6`|IvQ(322R#oNd*OU8S#! zb{xC!ow)SQSDm}N%lli~L9-dTH#Z&Kx-$8ApI*YB)A9c%DcktuY(BsFSbXs6Fx~R= z^7Vf%UR}NPRhB#QO)-XVt>GV?(pQ#)zphYil{eAjlBW}ENMeSEC<8mLJs zQ2X(yxLL*ph3`jHy{BzCHC21}{%rq)tlVNdQn!Cx3LWARPXi6`Sooy6B~RCjjj{c; zK5n%`Q1y$uRj=2612x&ROdtDS&-gYsjdfej%}ek0evkY8;V^&l!-eNf?e5M5wN4L! zTC_WJZ*MzmZL{b3yy}<>%T$T76Nzq#}5<&d|V}AMi zKZV!h&F_{>_MLBcmvz$L-{1YKD=gB^NL=>u+`0PS&f@2{Hl?0^(<&ZUknAGwKYg=* zd;u@UP?ty^s1*9G9{g}&+JUt(JB`XNbfoRhwBMh<|F4;t+%fxY-%PHoIeg?p!1WA! zd)BI-k=xb?1Z}=q_xr7RdGy(om`y32vtKUTD;648^-}fsm&^XSkB)S1Ty}Pb;o-B7 zxYOi*#XP<|m+Q+Fv9l+poPD``ejcb{svEoOid((BG`|1O`ksQLT#`r5$7Zs)uhmpC04a%@bF>$|6k$aR{OqQ zi$1p}|Ng#p=O0biZQrW?=BDZA0LP8DmhZZ9zx;0L^xFS_zkj<|{XTMg-rYMvuSzW2 zx3-_h7!h@N2rA1r^c#uFWzDxc8+SS9(1MI*vzs<0JWKqO>@F*(Ws!4vS#NCF&D63} zn#*T=OS-ZtbE|9OoUTJhK0ZGF+~Q-T@y{*%i2_jHvYEaP+WcnA{spIY6h4k=5EF@A zY|Ch>t-nuW3NPQZmGS%c@k$yUkyYDV{XI{-Yu~R|tMf8TS9kU`qf*=GU2_iKI*i%IUhn}t zi0M9)hu<_?|KF4Nx6haFWib|%107~tb}ce}=giVu`Tp#SGIr*`nv4k(7x2j2-Dxdy ztawq}>tBA1y{i7#<@s-Jrq3@m{%iO9&1RX0i8th$x%jr~FZ9di>vHmZE5E{4y_lOn zf5$^MX^Vmdrup~oM6ww3i@tj`K|(k2+L~iWKx+>Y&&##6->TjewKXfRW=r<HY5a z`?5i|G_f|%DqV58-Gx^t#cs9L;5vV8U92=Wf9<-DFV7vh*>G!pfZ_r^+rWsK z(J#c~x2FYUr7fQp$!;w8^{2Pq&LeNHu1Gz>B|7=6O-RSAiiECp{L@NT&x5v4Qy(p# zTQ+NUAImYu%2TpxcC%Rc#q0iP_xqQmYb30;1|ao_>Rkcy=<^Be<~+5T>t z*=6-GV!83^jLdau3}x@`+%(I%kpP-*KiyaU=Eg(ayY(_eBWBH z_;kUU|K`%^aj(AJ4SulnX5}niiTZ@D^QLyaUOZn;P1SzxCl|LdskQpr0hjZuo4tj) z`CKnH>KR>}l&Y)F*L5i9t^CUCnj5a}4S_dMHE&oMxOp$o4p|{EyHY|-?%CCO&FuWg zZV8;pxzgjyy29;j62wpEv2YMu5gRHE#qh zSh1+~?H2d=O+s&Km!E%`&?~6y7BSbV^o~&U--`>Cy2bUsO$(k-dB67i&2w|DeHEuq z`>j<2sxfBoT%HhE{o$ob0&C7LKgZ?YtV04;z7DNf_c1eM)6Iril@>WS48)UOJrIj6 z{`d2_`r38X-`{SbPyR$c}H0Smzx-fu$bB(ZX9zohoZ&a-jaDa=i(w)!7Pz|tNM?p&$lXF1?mTxB_3kg{eIu?H<+8@KnDM(?K7)3??{ZeA0*I!w?jb=j-OA8$TCJ3IaV@BRO?&)a*s@355M{F@bJd$!!?(#X7_B|b3cAx z?W}eG7RaFwtUUrv0m$&rV8`Obc}dftPh>T^pby}iHR z{`@YHl(#oGAMcZ~ob<)&>=f>_6QCIhJ~^9;E2VbVTWkY%&9{A1_cCMip#w|3r{8*V za`M}G)$cZ**5ChU#msh43kWo5A_tnn`ti8`@T{j_D|<~_8>Bv;?0Q%E;=;lu^S!r! z{%Cfr=GT?glXq~SwY3_P1r%&-*i7zEPtmf`30~Io_4W1hQf4_BzrVdLK0Q(NNa)I- zqiuY$uV$@(x+?j2U$5<{DVo7=riRCz{FninD*-LQ3h+1`)qH7Xu=?#?rK|Oucdv79 z=ga%H=+=USf{%}me!EkA{wR}btAFgSl8w`JqjyObX1$lr-}7+Y#he{cTeBj+zq|YP zxP1K<>HIwxbvIut-j;j&+BE(6JbwE>8?KwqtoXKPLCrjE(H9>dAK&dz@b1pevfppF z@BXmCf4<#DEit{A46aXpc0W^Y@2xIBQ-67xuU^iVualkgc6R>0 zjm76}ueZ+5x(*s{Z8~U}d~C+F+n~DwuI;a{7oVUTz3ohE#IAOxwHva(+-j=%w&CHU z&oNn>^Iu+FJ^gh$YsdB2^0~1U4_o!taGzSad|no4nfk-kzaF2~-(NES(wYNrZ*Q;e z=Z*bwEjs^Z`uy57P*qpE0kpF07kFjaysEFSZYuZNJaRfYzwXyb*5ixadW%j!5LH@b zaO}|i_{7>*)@B%!&yC4~3N|)krsuDxXxY?!JSv|1^wd;6k&uh`N{!RcZGkmkn-0mG zwesQNFZF$Vtk?IUYuz;6{eM24&eO~l5LtDvTW{Bix0{!L@N{k8w&(x9-^&;!MOyu4 z*;d}p-M;ff!1=`iA*ZXaUfca{*Xe!#|5aDN-~0UzkHy&^^Jg! zmFtd}wO^I|R@vG<>*`A8P!W@7p`Sioe7?mcqFPHWx@%qJ>Q~BVL+)-&c3-zWvFGXg zzoOUf*PwSs8vk$z$USq{f3kHZ7ynk1(qCU*=3R>mVB?p2<8&n9Sz^uQ#XJ|butY9= zaM|DfEz{~0P$%@AlS{sPTpV)#8@u`Wv-9)cr)g!m-FBC+O^N!q zYS9OS_1QxFt(~84HnRsZta^Ib@nYtQgK^D{6*IhMf3{A!EGn1P^D?r;!h2KEDb3|O zW-dsdSGkOPv#3b+`lAVL$scC@X>0G<_@|E}4!yPJ@D9{#?(6euYd20iQ@|J<;MOOT zS^fQ;?uQQnjZ3GgXYb6)d$@3#VD`5J(53|5tu{YzWv|}~YJ0IZgATk8T^)ATHhOp2 z+c%)as#-Q@UeEGrY3E{FzvEF?MEshFjfd?1d~p8$Ucts^>DiyMn_lwp->>=Xd-=?z zJ6*rx)$QUdpH3~i8XCTH>C;!il1sF0QhJ`2yL`ZyhTz~gHexdpm3y@$_N}f(-W`kY zcetKEJ3Bi)``Q}K4<7=)U!RoOn)=auQt6>}-(vneXy%WR-pUinnDocg%E9&E!f(!B zIB$mdM;w^Z`N3fQ!RMc2I&;sxPtZH@!C>RsTj_znWwP>5m$c#tCx(ZKZpR#!9dd5X z1Iej)evRBpby zBJgnR;-%MTxxN(M^s}v<_2-*J=JU^Ya#`7Y`Fe5F(>-Z&_p0CT4cl8)dU;ai+!<>H zs&8ya%=0;>Uz!F^rDn%4*INA)Ot@K8_r)m=G|jEp%O`L#b2~eqOu=TptvO-rT^a!) z7wCeaVR4Q?YUToNp!}6Rzy3EZ$zSD`sa= z-n50^4s-L}3YcB}{atRalxb1*qs;v_cb$znOa13hIBRaBb0VGJ`BUY(CO-b!+Czt& zTaQTPTUl1$-j*A-H7nG7-4>hL>+50-rH)1XyBD9B+=J1_n;_44=l z`~jkgXBv89ae}_Jwe{8MyI+gOWv$%Qw8XicPj#*H=6j&RzFeMle(S;|k8g4xE>2m+ zYZV&pz4Y)e6WMb;8-2bSeRoA`62yV(<2N^b&f4tx@u>Umntl6ffA8AMpM7mjrm(tS z$>syo^kStR3I}7X-s4bcIPg)$p+X`tKMgcNlzIQKS?;YJsRw5nu2_27%A*x?#{-8# zL&JK8hYQzVF^rjh@4WzhyB ziys3>iS^9EKCt-+)aufYyOVZ)Uhd^(zMEaU#avf7UR}un+PR4sx%|9SZECgL>8&rN z>|d@@znZSW)3$P(<*L`!-`-@Vo}RXKqO!YNY4?=Zwm+Xte%ojLZi7|ns~Zmwx4#7~ zw*?KNOjLG{i3JV&#qVx1%Dkikssw`e`R|H*aCzRL7jxDeO{`z1KCj|XYrDVQ&y;l*cGq2W zrOoPU-p^lGRr6jvCR~CiIJY?DI=_s?h1PavHl7pTbuWGVXZ3VSaL%6}AHSW_UJsi1 zet2uygWTum=6*Y4e13;n)}22O`RfbnuWuDr_dD}K-?8S_WWV(JeO~VIKklf{y}snu zv!JD3H&5&DfAeq8uUD&I=6KzD^+{4Xb9ZE$meuz=#h}3&@VM>P>~NK}9;G=?whJcS zpUt()_GhgeqQ;O}&G7Ky##5Dh^e#VKSeHC+?%cN*FWu2!iLz+yQT&>+m-RcIPF|DI zc5Gkm@1ni&FE1^P-LPztycEBj&5SR%K0Q5sd!B7|(&j0T^u3<$Jap?Zw{Vz$r;zHM zH(FEgIO)#MuDLyVy1&+6(X#y|J%=C2t@38u`L!}4`peG}skX0~25zQ)reej~FJE!r zubQ+~+3w1x!gH^023OWk)rmBE>9f&YzV^yrC+Ea~3+cb!gW5$*=j7{tC>~D+jn#hp z^ZER9Nx5G?=9FCW+*beppH2HD|NYOe%?p`Zduz_@g>p($_kF1R|6+HT} zPCj4!^sAiD^9sM?-lfIU`yL0m|!-{XK_i~Htm8=h58M=B}>HB+k>;8On z-whgs4swmXzAZO8dSA^>+dm%;zq9&laAB#pc=pXrOMmZvb#cwo=ku!dzBw;_U;Ol{ z-2L`&Y59r=jJtomS{=)<=%xghg_wSv%xb6W8a$a77Bs%SyZidikhM`)zs5oajLm-j z`0-`>`5&IwE#BPUzh62(Yj@g#SL~8lLyN-`idObo|Jo?``*# z9c>e9SAC!VD=0Vb&W??{zo*ZyowoSw%U9gK)&0mVfWfG?%R1 ztv@D3D?EO@xT@*fi`Pq<;`X{XfBW%mw|{lboZ#GIBj>G0x9gX@-FiJPJL;Hy+8K%8 z51RRlZv3k8{gAo&yy?mO^(0(6|b+YUF$#JZd>7Fx9t1-_Hy6c_u~<_ zv`NN<>ZG$rRzNxyS79BC_O?2W>`O~JLEAR|Cdi7gTCO~oQS*B3_85V{l|icF99b_H zHtkLLHX*I=h1{=)rFVCg>fQPC`~LsDTZerfF0bpj%)j;5b|)5AuUo%!Zf;6lXJj8gXFiE#J3-1&A9AJ^#6wEaV3B40c~%|Uf(sX z_w_8$>YQc1vtvF~zTf-(R=a$i1bAdGb8>(GE6&&Y^FK~rSGYnl19U*{-5(+IL8s8> z$z){S>5(+9k-L3+r&BA}GD$bbmEr5>Rm*GE{C>51{hjvOUm>~c;`i_4-g)&IXe6gM zz4z(K$?ChSE?pJ3`})IXx|6Q$`lcBb&l4uAKt>o72v-ZgynSSSxv%LIO(7Cz0 z3d*mp3SH*ll6YnJ`+cvcIsJyDnc7=2X)k_n)yw$IYknsoYj$1Y!teD-oWEy1xSTdW zyXKgG&FwE+KRxQ!FN-&R+}-bgqx$Ce-+kwQ-%Zc?u?L(swyDe3u8Qw^`4@8w&a79T zW9;4^3_0$W7xwbky(#Oy{rIAJU7-OwNHr6@>Y5#~u=Lc8MCn_b-5pPFzh5WK&Hq?F z+I~ZJT4++mitI1Wdz{w((Tl!jYm)4BbUaP<|>2T-rukBxVN$#Jfqw?hs#y; z-HNravG;ckEN8R+{Cd6qZqAbL_v`PQY-nE8;I!Gmv|Cdn@x16Yx%-KW<@HQXE8eh) zGhRMTC-PC6SJr$_(bie>>wabGEV*!8q)XF<7cz~Y7C(Q(zfY3(FQwYKOh8A|%P?-6 zb}2h;{I5kHU!Ud9mWhRxeqtU-O#t*2LSz zKP`Um(?4`Cp6lY*e^;w(j`zvBmo98lIBO7+u_pC2XyoNiT-L9}@nRY;f*pk7i@5n~ zYre#IPuDy9QEtzRMcsGSc(BgUvitk)vYdSSe6x1RUv+D_*99{yiQo3;x&8l*xwp5; zUR6(w7p}SWrr1~Oez{4tU+wbv6Dsd+zJ4rxZFv>{@0$A`EBF8I;l2Mo{Kj>g``?x< z_J4f4=-XiN-H{ zYu;Q5_TT#R^Yh)20kgI)S(+7Px25cDl(*Rwj;rA^4PS-x67 zXr(*v$=5p%%?YlIZ)t6>($|=Bwa4f0B4@_AOt;?N-fpe0`}q3rsLgg;?*uX~PFs62 z&hgRzKj;77`0(&>@fYt+A1)ksfA6_he_q|M%B*6h!}tR8^k#qNH&NL1V2`@(Z4_x6U|i~p5+|-z8zhS+uU9uIl*flGL&#q0#1T~?n6(&Di zn6^$cfxBzkugqm(YKIS-->(6m(rW;b~{MeYukMJ`|I)Lw6kv4{vXKrmi6eN<-yM_KU==8 zJpX;Jg3X!Nf9JiJef!3T+WME`iQzGYu4|(9rf)gx8gOXeKbGrHxBE92N?e(K`^@1D z&x7oL?qRRpSN^*vwYB}_4{#Z`WhPRC2|N$R3|gV=y!G2#Df7HJ)mDEKKnqHvH>de7 zDbY{UVYZpxgz-rwrb;gVkG`2nZD-#k1gw13*+tYfRc zS@QUO<$Lx0ZSdB}+O-MF8c|W}YXzE9PlH>apQ`k>UOayDd+kHve=6T*ev`gp6!bQH zRqBdgsRv}s?>tPC*DATLFSn(&X`9}K-(HQLH79i^eEfKE8y{Evqy2d=L_*JA3Hk8w z_Itax9}B-_7H=|?&j-~gJN&+J6>Jq>%~$5711*ty-@P`j6Zy7k?XROV@;kqOd>MTI zy|vx@^7$Jd{{F{R9S1FqAO|uezCT#f_q?Pw|C8+M#J@-3bBv9P6hIwS{ZuWRkcexG zT)DUZ+|TzQAY<9yYuDDt%X9N@jq%?9HvFQTE9kg{oMnsre)2k5x6009UB0wg+AODl zeO^Xq;HKJBpBC}_R&;Gwyi@o4t=@)IQsl%EsyB8%*c)3PV!8#1okUtLhBjoX~R_5H(x&FpvI7}feL^e@=8>ze>?SCb~|=UIlUg=%C!f4nHh zajQSnap||ftJgSw?OHhbPV-u^nqPO9+uEJ8%jGlXi8=I3X@}mM15-Av=d{cHw$tq` zXZGe}Eon1WpDz&z-Sh}lPQe<6hrj<7{r2_Ta@$qPvbC>-!TaT^FQn)E=mABT*HYWW z+GB_aI|N>X&7Z1ebA|sA*P@bJOVa!@uPvNr@v=RSwM*;Pf8BrWGb`BM%1h+ft$$i- zRT^@d`>XT5e=kg2bv1pKw)~y2$YGOvzntEeGp9}!DK4!mxV}bc?wL2go#)JpWt__w z7Vu;71-IO*%f4q-2OOHGy~cLm`E}0&6;`DOFf2-)!R01plJS5qJz&F%1x~;BYf4-! z<*M9zf8nhKkoi5#_%W^aO;+3ZLZCC@*aH9gtIk^GIJ<5x6p^X_`E+_-Rw`$wVJay>*}g^*?mlktS^3j-+bQgHJ{tXm$&x+`?dOa)Uum% zZb^qa=51(?%d1`gFKGYIA1m})eXVXr-nO2i9e(a?!nNN<77sMn-2Zx-;q6?BYshu{ z>HLZppcdJcd3%oa*S%aiGx_v1U1QmriP0ZFa=s2`J^Ab2#Oq~}2RA+4bMO7W(Nd1`?_)K5?}iZniIIw5|&1_pZ~h6{g5;(*RAJoBD&L#y*$9R)x7X!X3gBh z^Hcl2t>C-seqQ9vix3OJ77xejl8Tlz@7$Z4RIeZZw)5EWGuMwVUl+3Osy8cj&YRj*H|O8FAF_YXh2Ku! zue?#28zXl{?@MNOL2rM5-N8i*%(t(%Py9R2tGZ_0*UaL$wv{z&KWFxzHwCBR?_Oqg zU*az5M~P^>7B@;%J)rVQ;`Bu4Z z!}o*_XAmCl!cv7_OEm5}Z=SkkPk?cUiE{YnR+Go2-`?E(`Rk}tpwWW0 zuFeZK?7h#u%9iWb7B7eW5`iy3z3T1xY3+QnT&2h7p141otMvE<3uvcG;|eH(%KVod za<-jR_ag7|vfk*T<@dj3zbtz6a*3dwRjBd<7QZWn5drpl=4%}GiPp)mG-Pc&q!DoA z-h0-o^X~tBS8kSj%Vaxi*R;v&qqm=X8@uZ1z1F>RR@|S>RlWa$9n79RAbY;~svUN= zo%Sz1ZZp%Cb_Lc(AI>=)j|04Km=yPYk6Y#@``vZH0~W5^zxOTxZFamBwO|G7AN5Dy zmo-&~7pOyxvbYDHr@ZJh3^vfXDq`+-T%54#-ObI*r|L#ubL*3dG%(j`DfbMYzijn9 zCl8m&7~`M^f*U?u5PlV*r;TN>t;&bB5PCd^EVpCh{B6t>gV8c9-Q!o8`f3>(kMvr>B>jx%bJO{JgEo zj5Sdz`FPMJL$jve%MR}>d3gym$Qi!$n0sDr*fJl<+uQTw=k?FIed9uRkmPy0??H2a zzU@waX&;Bae#5~LJb*NJ<%fWU?y$vx85fIES_4B@g=}2t+`dcQ?){$6Id5)k+_-$c zQEC@tG2j-K9g&;U^p>1LTMC%^{@z}_6wt22m9_J0zs-d1uFMNR|M&a-e69&?{PJ?E z!{sk;1>MX1CRx_1q+qjx=%%;#_umJt5UhT;^LdivqC?KD{-9x*-G24g_sZ4(`B=j~ zt&{)F?PmrWAish)&-7dg&)@U0t$N+zcK+Sd=a=2e{C0?2KVo~{-8ai-=M~j|$*KCM z=-gKEJ#*JFxBvhC-jxWbep++MQ~l=i`StS_`yZaSJ8W&#wY}Blzds(Ae|tX>`C7zStJe?k2R(~lH)Kj(pdLDEj2yAqw z?A^}iyAr}{KV9qSRyzch>PBxnV>|!Y8oPA~p^pRpU%e5$VC{o%*P`=F=ZAlk zl(u^u`By>t>i)dDR^pqo*R1OOSl!h2wN;!!ToE=%0bQmWzyiuwZ01DuCI&riDpay z9r9ry*;1GIaG}#;(5$Y>=fdNCvYyp`-*-J|;x1~L8&$S;X1~A9N0+E->)3}2`PNka z|NGrH|JZ^P?#Ax{~CwNlao~Q(iVMt6$0@$<7dzkwppFhBE8#JuiJI1b^6Em zlK1y{yk4-_2wHT*_d9S!G<+~{`ry;r9+hSZ+LT+Y3*D6a=ghtz3M#KYfR5eUwy*a0 zv0ICmuCrR9dc*sodWZGXDZzJqOwY!ISgeYyc)#a!U+(>Vwqg03n1lPi3W!3^!dsK4 zdm41^PVpUWoewiFWbrW^ZL`d@7W-5Ikc%KWoYBq-{a z9Jb`(|Jt*BUe&6z^X>1SJ#b~srGC3#C$^l4X#b%BUoyGOaKX|`vjkUc{Bw|9-hzAn z#)YpxaUK5pFQE2*?f1EV|9n1gn5-LY_qfNnh~>q~FRmHsg^aL@9+m=HLB2n9?j&d{ z@nWvzCZnP!9_GLGf*&Tfa*5uV^mxIKmi8#A)ekiOJxO7;DSdTiqxSkem(H>UZ&>_v zop#uog3#YB6ZXZf3wYh7y{;p6U3JZmhwU5d)pv()GJ9TXuPc9DXE*3j5r$Vg*X{jw z>&8P(t~K{+KKrhJdcCr>{iTHT%L2Yb&TmsA)<&6{$C+A(9*nK2`0?ek|7~c8ynjWl z!qz>Ob~aNAZ`|PE=KosR+P;48w^`iFguQDD=6J>b=rdo3wtUE8fdP1*f;MQrzyHCi z(A7D2b`-vQDG~r$Nq%ij7l|8w@qitRFx0~sAKRx;J z!C>R=k{4amwr1^jm|D^jwa@uc#O*l|`=`Bz?B`M4#KpH&J}DrGb4?L9|7BCNOAp@& z%Vpi%G)*u&-@CO+OUgTVxu30;4Ue?+ubLZ1HImtyTliLUb~&9qa(R95OYZw0kCa05 zA1pFBMBKpR8>+z%7d9;i9hEUT-#qu$6DEzf`aA0W{)(trAz91i8nR{o?bqw~%gtW7 zLU>m51{cQpeh$|-w}85T?WGwvGxDnW)E-Qz<9NIo1ccYBf%q;)^@B9AbhoD1cv#+iWH`hIQ?TvBkqFd(!&P(V#^>ttI)LNzH z)|=qz^CHi$o7`@me=o;0>&gbuDxTEmAKUv|Si|gUXRX^fkuQDzhk(=5N8!MGFIjFuHhf3bMXw6c6xUdlQEw}2GjR<|_1Txjw=U-&=@86Y zxq-?0ucU3&7Tvf#H=_LwK3}ItMA?a|L^;| z6&D?Hdi!_zqS}vF>gKxb$-Qj`T3dfx*x$RZ{Ozr$>pb08JpG+um-}s{_ur)s zYXTR$<^6YSUH$25qS7ZmuZV=FmzTekl73n6jhA1vMf=R)8UnX__ydpL&1eL*=$Vaf>%DH(YVSVuon+x|p32 zKV+`Fw>CR;Z1cP28(00#v(S!4UY zZh734_q?-U{~f!$-&RME9a(B^{12S zGizsTOZ0L@FEByVEtQ-Z*B%~dWPZD9^}0=7Q?-`zc7HH9`*7i^+gmaxgSP5FJ2yA` ze$8iI#iUzp+M?)U8P2}cfTeGj9)7$kz$@=x0&6l`bDkK~$R%o&AuKb(^ zI`jy1;=|UTibc!vG|vfrE3?%L&b-Q zf%1p9$V2p_C{s{kJmh@na7UZiRg7K#3``s%rHwy6eE84Y7xQNhqtf$g1_lNOPgg&e IbxsLQ0MR7cf&c&j diff --git a/doc/workflow/web_editor/new_file.png b/doc/workflow/web_editor/new_file.png deleted file mode 100644 index 55ebd9e025720ed108f16d5b6d61926701510c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85526 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 J7ham(>V?N<`{-XpF6=^JpW(P;xk^;6Fj^2 zzIJ)}N&mm;?*At?wq-xn^#5d|kzG95kJU@+=Uj(@C8%@8Xa5e3}v4xl(0M zVT!h5Z^+IKs}60ftX%Kyey{eVdXz4&nCO!0?0+Ae-Cg1yvBs!(Vd|ozm6qGjFT8hY z!S(ik1z|?po%PiH%eidR1MXB-?%H)YYo+yKC+oT4+?!qZ?V5Be_DxaRWLw`KM=!RwIcvd)(dz=1po9|(6hFeP;w%B{S`J{gFh$_{Hf9B`$<sgzoszQIwq>2yFAXbJ z*6sBoQ++lTSZ%D`=GT4$HmC7lL}A^B^JUAgam-QPu<%L3;+L?B{`6#J*r(OH z_q1=7`*E3pyGx*BtGl@b!egeiH*@^xZLmpO_0}`EE;v&Qc7R%*a6w(czS~A>%8+qR zh_(;XjE}hXXJ)~bas1fpkdUz8>Z^J29$ywmcs*RoWq)ev|J&VFnH&GzE}9JTtOJw? zXMK|CF?DMA@5sJ&VxN>=_RHJ9+sSSf`()SjqK+Mpf~I&h!)F~X2(mnS^yt*7Q(9VD zHS4ZBalO&l8FJ7%x~cN^y_Y*oSLmHOE#{%wsZ#{ zWIkh7!=35sDk=#N%NUP2?wmV?r@p4qT8RDjepdbfuYa2=mN#6py5w^y;$Ebk7i|Bh z9;ZO~jw7x~>%}-i&ibCcbz}L92_MchK4y3Mp3u{K-E4+QugL_H$tKgTi)~UC^|>eY ziS4C_=_1IK!acPE78?24f~SgqGR-YzEcM-X&gyOb);nwME|@?5^!bqwi`6uTwcoBS z_`NRKRBJ1!*|Eo`;UAZNwm?@gE7M-*lA_Ngx6(?#M8!Dz&FOMDE;wPkbMIL##qE0> zt^C%m-~{=r;XCJr_=mN*PMvz;3L)YXI!gRG=zhu-9n24W@w8}uwH(};9q#Wrt)+6T+li$1HMzChL_+1pp(= zZX*VyK~oS6g{`ZTmLScRFfgVwKH^Fj+y)+agrqQs1EGwMxWbQmz}7y1%>bRRbWSM; z#g5fXM?}|kO+-3xmXT!+Ylrq6*BeMvW(?m?Jzu~MgAxxwQ(roV%#iKa0h+>H zCGir)bCC@@4n?-)qSz7Iu;UQn0Ng!c=Q{=lMqN)A#}I`FtEe8Bj_c+U)s|`@u6#@P#!T3J<)Qj)?BN5;X<30T>i{??L6yxw3^J&_DrAZTy(TP}r)! zRV)>}V;NEs9I$5X(B88-7CyrQ3jKYcSr+fLu8~N=^}&zv5!d@1ad;L3B`tkUf$$$e q*@0n5VYml$P&H^$4AqJM<^QJ%Ge})1u3}(dVDNPHb6Mw<&;$VZGSo%@ diff --git a/doc/workflow/web_editor/show_file.png b/doc/workflow/web_editor/show_file.png deleted file mode 100644 index 9cafcb551091a8959671dbedc113062ddbd7da7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111479 zcmeAS@N?(olHy`uVBq!ia0y~yVC83EU{>Z}V_;z5W`A~rfkA=6)5S5QBJRyx_8O7U z>&NEb-1l-Xv!@4#Y6-`}#T-gn9kNH5%8ux*Sg+9~Dy`MEqGPXOM+0lXlJEDNI5U@g z-!}W~wwd3{-x-}w^JL-_V0{16E>3Y~(es(syN&->p0jj{aZ2a>|1snCy2te~jCDU^ z7}qg`H)tOaeZW<~x`PRg`;M!lR=!=uvq8ggVSvNR00$x08>$XL8VTYoH$<2eI3`SC z5}Cx{A;htba}meZ6)bDYGPZJQuvllU(tfz|x?`fTW2&iQ>TNBVxV;>cmWpuASiq1_ zEZY*qc;hAeyoP)7TvMgAw#qrq-Mu*b{l5?2xEZh1X_#{btlqoeTE&7@*H|3cJvJQ9 z+w8pfn!~1B3zjV8?EA>s#1JTQvtBdizu*5jlbXp7OGD91>G$>(A&vo>iQ!raf~qrg!>-&~v*DJ@HXTQ|r3+dv=^eW5%-$-r!c_X< z^Ofy~Qd;^`niQWKOslu#PRiArvca)3>G>AcsCi}DT@AAy$T4V}f;%jTiz z)P|P0a0QiR(q~>Vcu3{X@Yx!`S@y#AszGEA-v`gvoLp>tPbVBqto=~%&{@_`@AyN- z_Vz!E8*#+}*dGrqr=XN9L-0WHpjN?yvEcWo3g-P zRbxhQ;PQ)3jDkWgKYmvq6b}1wM{6;?3A{ckwg?KIENyj(gEjrrjBhVd@8xwmB}n zX7pm^iqrfzH%{C<>EDHlr#~u#s`>b1mot~ked=e&mzrW2%UR#lsyRDmo_xZqa$;G4 zQ;=5Trdx?yZUqE{u?aWYcqOXsI1!*Y(a!zVrWAD!4TqJ%&YDqzuM`h$*5F;)y}xa# z60?IYON9TMX#$J79GyN%u1aV=mFghICNNbecGkaRF)cdwQQS+fN$*`ZyW?6c`{9J^ zP9YTs^tb}FMFd=}J1V)DqG$ZwpWMM4ZuI1w^Y)ns9xDDXz?$^I!4Aq81>p{_tR=Y` z4d$^(dxwWHXPK_b);*!W)?w<-wn`RGEu#VtKfAE-4=%DUkBX->=WIU^yy4(t8(Gop z`bN|50u0It>kAod*;qmg0_>dHlvq}_?c|H(U|OTzpc37;)^+is(366ij^eW#_9d$+ zS?n|S^6^^1VjCjl=*w<1g~h$s`DX5mS=-*!-MLeF;-TVy6a22V=w;ewH+f;mYDtSN z9zs*1Y<?-`uLEhzRWcZ#M}pI#ohOaJG3gqF3oKXEEy?S{CWKuBB2+PwKK z;asw)NnxRo+icmTSFdWUHan!`A;4;y6X1~a@__ok4SN!vahB}ha25P_jcdhc{zVnP z-%ltibL8Z1?%OiMYr$662!E5b#$PSJFQhelO;ONbDe=tdKXXNSL$u44Ta3n6om5tM zp7t=|JD``b;7h;r@@(}5zQ^k}%yP|8JfOr_HkGSPO10Q!-oGuy6(=4(e3{M}--IV; z9;lCD{N1oTVcRW*jH@d|-=5IbO#cuNvQlxS#@xulMU5LL?POI9nEgcfo%1EXDGR3P zd{}#;rSf~cfm{@O>)Iw$kBwSa8Zw&QCP*;65fJZtGs#Fqa!rF1@6@9_YZo{y2s;wo zf3JJdpPHIaU-LCoO;%o;^WtAl`zg1tf~pasUN>Asm44l6&^vt0>9Hu!>Lo5~uX1gT zs$6tz;o_gCUp6h*Ev~58WqGLnJoeHZoWvj4uW#7-U*u8!nx&o_7d9Pq-mKvG_91Jx zZ^;#Nkri|4!S2f-vvh~7qdAFatTsJ&@yL6iRo9ktctgR{T3!I#a&iirn z@f`B6&ueImvUF}}Pifw+^61^g+QP4*%?g}eHJ@M4|516EamvjMZmk1(?OvN4xH+!` zv_`F2!DO}Qv}yUm(CKv=>!vOUTD5RePC&p}msOP&kJg-8d1_s6@RKReTqj#wo!=`k z{ldI^%!Ls`y8X;a&qbkWa<(b;fzTo1)BqM97 zxfkS_+SF%BTK_u~rR&US{3m4VguXntpReK@ZUwQuXPGUjr1FE~z=6EmvBUqmS^*ImuExEs&ku?|;ELhm@|e^y>5)^;oh@I3EM)3uwfL&y&a17c6vPm^f>0z_(4za$ZfmSu4fnH3?peJ)L-GgT#VT z7fz{&hl?j&*y$_rPSRY;UN^RL>F$2V)mIKBnJYUjJ#?12`q8h2CqG>7*3dkAI6m7v z@p@xT%hBUXHbzXL0m&a{$(~rfCapIhL`QPgwl!|oU+1|mcT5gQ2yk3@&3MAgjGaOC zCq4xHdmDM(W(jXp=ayAh12m=tXozgM{dSGEcd+v|XR}h<%F11uOZAOrpFQO_$!l%y zr)3s4Ih#^ySW)8jtJa16@kUNg&I_+=%r4D8k@}RYfK|_j^@Zexl#Pp5Okj94jk|b4 zO$a1JY%~%ie%PE^wJIPakZbW>wijDgY`x7moA*Ms#hRM3rq(H4I)>%)2c3TzmPUqg zg;j8gMU?+xJKV;~H+@ltYs+-;w(@@WhzaZ_R-(`TY~T`IleSQn`BqE9nFI4)+*g#c zv*J_>Ha%0uUG~n7%f4R!$nj&2Z)I6_>oMfl{j>ddqwYdrbs*yn*H=f@IMw{0_`>Rq zS;#77MXo4~1nY|$OA{MjXx)#zZX@!xtcB(GgH?jcA3h&aU9objL4$`vfXGp|e397P z30rI&-8b(Pn~-y%`p1Sxz3;YM{(I;0`^@?;@l95Gt!Rh_CpmAvLcJE5BI8MK)jGAJg*Ia%q5;XwT`324D6~d{K1vFUMO$p{J&1868*orZETp{@BeRC7q^9lYw51I293jZQd6=8-K-YG-4*`$ zWU~K*x8>=H*WWRpllHxN^oBsslD8GFuFkM{=y#|1{9cdqKF4*3Cc5L@uGbG%E}kMO7sI&jz|s{B8?W`n*Z=(*WMfk20|~M?)>G_zJJ#%p z37M6<;gQR#OEvwnEidWRa}YMV`~=>=W+nYjAWG zU9)3bHIv%i0?V@Zw;TWdeEOsGuVBxZ#wFCHT!^O@OnZEe)zRjZ^n+y7yxE_;7;-rx4wHg_$tX5Ir273WLDG<5!+T3AF+0w!;Oo*FwOYtCs;{r96BWpq$ocKL2F+|BGY<9>rbmBKQ z;S!v*lBrF1|G~Ns`V6KV7cvX}uVCD<%w77=&+qmTocYGjq_q z^>FP4CN9xWtGogu;`nxl9(^VCtGfEY{oBI(tV~1X{>|83r2K6CtxhlQ1xr49mU#ua zT|ce9=iCsH`$aE1d*9$$mP=dv!KAIm&lOtFrX8Ns zZ+FDK__^bvW0%!~Ca9ilv-7kysCeL@qN=KBV9 zb*(j0D7PV_(QA{#>J3f?A`8<_=LalX!yM4LfkED9-$x^!4&DQe&h8r@ ze9x_TxRZUs=2;8cc*9P%E!xA>Qt{)ky#fdOrb`k#zI@?n30vD9x4t!QdCRE)R{wZ= zojW__i>K#0`MK({v`Up-+v3;S7w+eB{PcT=l?R!Y&RVd1vFw+bDsSeM9u}Ep{`PUQ zVfwiopXzs(XDWWCy12O+?Qj<;czf%rg!MbUA3uLSTqeE#@LBV_9e$m2U;CIxO?xG) z6`3y8?mdxVVfCqx_x4tQIIZ9P@o+!)!mC;zu6Ir4;O1{Xn$#MkX>h}$_80dIi-&o4 zejiYYII;QWkp~|(bT)lFx)Zr$YqEf$T<+7#gQ7dOh(7r6;ga3{KQDGL#WV(s8hoh} zYA-GhSQX5yZj>v_bME4fa7E39n;4p$I9FUTxIRPS#nymVCL3n*1aOCCWOpar`XOEL zK;B`MW61=0Ica+t+uJP*uSGPTc_Z`X&8(JHo1CuQa9MkK!KNh=59c)oXl>OH&OM=} z(;Dv}p|vVIFgBQZtCv$wgZZCYn~8DBhu+B79i8QTbOH;n%2qM2`35C2mFA18`&=rg za$2z_ItxznKI=U5=+0>pQ$!<7b}kO)QPf-bxwEU&cec_Lt3Su{y9Z_Wb>3ec|PnH|6X1{nAQGN{*QQI#Yk&vzCdzmQsBDvlofQPeX1FI~?XJ zs5p_%9{%7`Si|AN-oO8RTKt%+fYmQ_!LH}R7G56$);BE?V(#T7SnZvOBB*BtP+ zU0}muXFJUuOw+e9$;idYJimVVvaq7!!GbNm7PS&tJsMg$_db7lxxMb)^b1*A4Wf0X z9O9Vk*M95Pt>XQ{`&`!@;AGXR@;i9(&f^uAI5%iBwytP&3Ocatf+fSELu^aq&RQvJ z=ekwg^8FARu~3M2!>m;a!dC-U*(BI*lRr9p+QB^CVVjcZ<*&P&=P22ZNihus( zS?ycIcb{!ywXf?wvBKlct)0U0H9tk&`sG@0AHRR@mBgiUsm~WM=gljTFuNicS*EZ{ z&-=BI!;%Fi&)4t&$0aE#$-%|tR8$ndWQoiXZvDM{Q%^BU=ugc%ebBLSN70Q`iy1`{ zyT8j>sEe=b-)`;}TddkA=Y4$J+ugJFoc*yQ;>*js%&*P!T(5n6qqe?YbDe;sVBcxB z@5fK=zrJ9_jweAjE@eKBivCvqdEj&( zlfhL`QL%8Ypq<>h13N<>+;40DvS#_^teeUPsfXu!Bv@}}uM~^k9dPWr`A&VO!%jCp zZ`^q7MST_@~xq)hGUHLu>k@2~s&OIclAx|NmHpCRav!Y%^sOWH`W}vTO@ zoA}>2oNBx)A##^(z0GF}vD*LKb@98|>fR%Ex1Ri}(f{9m>KO=Iiy4-@=SLQ*uI)tN{e->(urylw|m^6|drqe+Q=j+S>8 zF4R_-GJPe#)UI6uPoF+{rggvmzpPpAtrkvUwS+&i!im-o_vM^>VikYRd8=2eQeb0OY zPSvHU;$K%z=}&zl`+f1AMV}VgiP=?vyC($;H7~?ec<{%3xpXthaPbBO{-dp|7hZko z=*VG>x3B-U``I3qeHXqweEg6r<_*`M=noTSttQ>=D~{WZAm|iX6P}o&yQMsutR(O zn&3@2=jYu$apugg@MjEXPckyISu~zm7rVRQ&ySDwsXFVdRTF-kaQ?oa{=Ukx(9lxT zeSZ@br~TXZC|>^dQL}~~#>o@s&E}qcOIl#%7b;Nk_n{!X*5%5PgxW)P+F!c?nc(%+tk4=poiD9z8=b#e1;pNa?j zsz01DK7S}{tJBgTOKaWBMe8(AuQRXhU8=WxneOS|leRnehGodhpZUk|e(!h1DOq6__v+v#B?QxB< zTOOZWE?a7^e|5){2Z8qbVZditA#38^=BO5mU*?-WnxvRcqJ5quig0BQGC5 zvEo|#rjugvYRbA(4?b%+ut4no_xjX!U0(i|cKhA?-*xo#WQ8Q1^0~b~-`-{AOJ0-n z&+eRj%+255axkGGY;~f-&A_UH@CO*hlYl}xVc)qr!7lFL_|^d?Twpr&ZVuDzN*Ewx9VHb zI`3M=7w7j&a3@WtzwnT@&_kAj@*#3CxSh>SM-B{)PwBxt{uC$;=bu@`Lx0%-`-xu zmF3`sYM!jsf?8Wyy4Q;Rb9B^LZ?fQ&lH*(Hp0&HnlHeszsK|;lA(~hpLBkyY6 zH#~RX((>k#(8x0{Q1SY*cEkE(+`D$vt=Ou`uv*fKRbiK?Nydw(Z!DYJH!a@a+-{-s z=cW2Lw;5`ht=YSb{?2Ao-XAzk-Kn;e?`f)Ppv}`~eb>rM4TW--Mzw3U_gUU|Gf$s1 zSHI%NyEBp;+}sE4v#&iqW_bP4LHBuXZo>E4=I~eCkf}X))ylkQC);;FiT>>T9djL@ z6-!R>v;BSdy20C{*Ec3#zgN8TrQ3Gb{9>`1?~?m|7YhC^);zwHg+Kb0&Dn}Nt(uye z4>zVP+iQ`r^5e(91)zDK#?K2KiXSNUE?%;PBl6|(gl#hfWrW!H`Tfh@M+C)iIG2hx zIXMa5-X^={mT`5a5C5c@l9?L%+J*P*FV(6zF1@ki+k&b{ai^Tyo8%M~A9nQFeq~(0 z@S~u`ne(UJp0Be#|4P6kT$3RrdbwgR;#=mu`3mTZxM&$=un` zeo%2C2Pdz6`r+d1FX!a`P`Vr7eaLxN8atm%LqmhZ@+j4%sv4SliR%t8IN;FI+G<%J z9uUx=8@+AIj7^_@yeQ6m-Y2WEdPRci4~@0cq}r=0DjXJvS<4pbTG~mRGHxw0|YeaZ5r&WlwmEIM@k{@WEiV7OKOrs2<>m?PV}-CbN%)`)4> z{eN7(&1bq^tc1^!h+QQwD^1z2l=Fxy*}R#4M_T{S`;%3w<`TU-QvcMxaSiZxb#h{Q z^ytyVdGpvdd*58KXpxdc51Sd!u6l*#Z`ydJ^(`7Aj0?2*p31tX;%ZrsF^PLzsN43^(%W?Sh;NXqj)#g>(Uo&l$4d4=sSmT!Q zHLAmlm1QXt*IM-w$F&=a-n!*P?`MjdD|9tWo~3LzPtqTUB~djCul{ySF8rdB*t;m! zZyyi;UCFym?80-rO?Thkw5M?P)uzh%wJi&$^QTVsUspUMKBA#l+U!u)Hid=G>?JSf zoVe38rOYQGurB&d-0gre(MudJ50@VAo4aC#hI>qm%%sVaZ?ZSu+0c6L)0$uDqVIO* z7j1qmd#UamyUmhY1;y$6TjQty>lCeDf9$yYp3eLKesIg5`@84f>&XreL&N!80|FSl zyib3;zG^GahMmiG`S<1sJW5*p@#ORP2JM1|DMO^?Ctnq&?8YN znY8G(!^)5aD^|2Dt>4XbNbsDKZPXwRVd#N#B1}DqUb=y7yewym@jvvVH_C>s{W??sfW9p~6#v zY3pNRpLc)AdCv5<D{{f5z`fds0y1`R0Td--VsAd%p08goRlizb0Vg^X7)! zbY95=Up7VQc=(=9c)otko<}|Vy4`qo%j8D6KfL_&{(}7ZaS|2^k|DDdzTWjOJ(nMm!Lgg~_OUIA z@;7$w{Fx&s?|t6lX~ZI>!#69lE-w?c*0269e`M4B@B>L3l{7R2%;U;=XP*x_QF-^* z*%Rl^7N2`Xx!>`Jy#jSaKiV zRyNUjv_&8jsAE*@rIcrokZTK7w=3k!-LJlrYu&6(1CWg8l9G&*A5Nl6&dLtu0x-rrFo8H0FJI<26BBTbujm&dLm7;ocW! zeD3+)y*$|-OJHjO)*DuMl)mrk?w)h$Lb27-d()i<5CqRRUC1#a>1?k%F4@DkO^ z^1ZRG+WehFy?96(r(D{CMVA-?-*c`$$;8hYu^+~%R;%JiLP3HvjyavUG4Q7q86u_r+!)Jd+ky5vA$IKo)#0% zBwjfqiOch<`D%ZCNt|%;?o1EnDF+orCFYuDi#@Bilb4*yvSLN^B)Q<_en-E&)W5>0 z@nu2X!zst*lM+6BUcc|SX*loUgHx1w_6W>a zRJ#4`jn+c*`2JdUK1CB14wl~>`zE}exM<(3_D^QdYkslj?f&Za=63yrx$;dDyq0pE z-}^(V?ETI2*VeCp_VDw0yMwPZ1X9kNJK4JY9`oH@YMY+UpZCqEZ)xg=?Q(OiwzaSC zH!pj8lYREtKJm0OERBng%kATjuiwt_`1rk!M~{Nm#O-E`ulp^0>*(=EYp*XmoF~39 z`MTV-8;gREvjj8?HEk+>UVHSLqkK z?6og0?NpAQHmB)+&Hv5Ct7?89m0^43<$c;gVC$}14JZ5Uo3omk_goY2w=2=VecX5Z z-MbkdZ(h9KbD;VA-PS#Sm}KmVdhY&FDa+#bnqT{W@%arkOBeHXZlA86w)ZQS(jn)K z+28G^MfqhuW0~GBW80=af9AO@i!E;Nbh!QFG5|vK_ zWIQa-Jd0mH@9vFN|EnK{zOgUp_`7%GPba=fGuPXkU-Oft?d2bKcJ@W(=ih0pUy+dc zw8(k(uPiyCf+dw+pL-chYv+A^aj$jn#eWIsP8Pd7R*3L>yv|JG##g6zhu+0nZ~pxI z$CS(u-@YAN@>_kwl+<4~i?f>>-iXJ~pM7iT^2<~HL&g~X%;qv-mwWb9#@(+>%-h`e z#e^3=zRTWw|MFX4a`(z&%?qz>1*E4xC{evuZtrNz4K1yPvsumS=gSwzn~AVF zn_gB~6)L@rW2eC0+CK{fShn$A)Y}x2QS`u6#Pa6M6X#Af)Hghi;JhJZqcY+4zF_gP zHD32HeU38Jn0eBm03Ok8dE=f{hE9`r{K-i&^HGsEJzJZl*{UI zV`FkUtbC(hQ|j`hpj+PFT@h8LOU*7>oLH*m9+zjfXV0Fw&-;&got~UFNy9LE7ql*H)(7<_`zmkUetWQ|IfabD!$ph^nv2RMTv*oEayuH_sbqW$lUkI z<%>1fPQ%vhyLLva*FOMja^S$O`PbilzMHi<>Fukn z8#>EkENd#}zMgTX^NPvS`yJeZa&hHvLn|KKvwl6bd0%wCT)lqvz1)=xs+-TwHe0yi zh02z)``dZ=pT2M8KH0cK@e|(-7S1#cfu5ivV(Sje%I=-;B(-VRGLdHt@+l$L6OLaC z=}=>>I?k@37Sw%8in(Vi)09^NGj!zwUVO2Lo6?#UY`RX;Qiy9YtJ6-&u-PqMn|bZ5 z{1@zEQ&I`(2zz6_hj}{xTb|%j)^G3a`hMKdTa&lQmr3PfTgQcjik~k6^47Eo2=LZ= zXxrF+<&^QYZ&~N;&iHU{BDb%@%0uFd7PJNhIZO~~D7aMpf{Xv|<>}(SWmlY+W=#7W za8KcCe`WTw(>s1Hn?1MBY1c*x^E{cl9}nBDRvy{XH+{NzT=m~l8=J~amzQc>H(bIW z_^V;*Ee2sVza!h$-d5-;E4!S$bw*%d;6a8*&vc_Ntj!kRW|uqp+RrDK{S7~_{r+0S zC-;&=`WKYu>B z=jm_tkj--avpxUWiVb#}`BeUS_&bt4t!QVUtSM9062+x&j&1EtTu^Xov+*3i!{Ko? z(=0!!+5R%QWW4EBYx^g&mH%!VpWlDzPPqt+N8B7U*4Jh^$FlSHy|>`o-lqBF)$cEh z%WoK7+<4NFA?saxe)8vOZ!5kx?|gIoQ$)<=X(t)Yo))?@_wheFv-&dQEQf&WdUIbb zslNP2NkCfouGIGXwvwvqb9&A18_e4IBIfcm&Lg#df4ci{Th;wMJn>GZaeOVK?CtG` zo%?MMmn{78X*2(V>n|tFtCYDMKkuYW%5rY2@=VE@Gd|w3?$z^}(08xP_QQve<+gKP z`S1Jq>hp)sUk}>y+Z}vnyjNC9;#FL`Q`<%3`#&cf4DH%HmwQXE{JwuJmS4&8^4-;-Iw>daA6mnECl-@31f4DE07RU`Ni? zW09w$^eUYL^#9%voZ(~Ykum?ofeF=?GU2?O4Y~JsH8L7D_4cwluCJ{wGZ1iPI3JRo z^q}Wbhw@^Xf^%+p)9>ECX)AtEtIE@D>whPwLju>=F-NP}>$8XKpKvT~`%M8MvAzu- zJeDk%byd`rmO6J$U*m*xMutVPOOSxgmv7%vUmp7RuaW15;EAr@?BfjSwT=xvUnC5E za2+=@Tc7@5YDv*uH=o;Oyw}uhrd3I>R$B6;RaO4n@ObLn_7J-hzgcWlb!+}IT`=6J zef#>t=IX@lHz(fM%3iIwull)IMOD?tzrj+9jE+`$x61b>pSSEg)03RDe~QuCpw)pv zAt$!Hyr(_$?rrlWsey@h#eG6sR4u&yLW`Dcdw=6-q;b*dV_VnQrM))WnA0b7V|#a_ zFVmJMX^TF)HEecPKmPH8(eLkX5@s5g_2M!;SU% z@h@y`qDpGcHnwM9U*mW_&NgxDt!NpAwzif9`TOg97Vo)ZBjaOvV%_N#D>O>{-te>r zHNJU#d}Hx-y&pe*DDBKQGP-nm=H&@7-R}J|iM_?=$^&NA1ie==n`g{h7r*Ky%CySp z;^rdeye_c|VaX1jb!=-ACmQ@}d-VC|=?%|3+4{Ph&w#WY7w(#zPive3+aT@9{ zPW7t4p=#=IcU$HwvkN7+ZF7IlvEX;zEvxJv(-*n5AYviOThs@{g5Rtc^-YV!7ap>SBk?Y#ZMH!aU@)|j7N;gQ+@#6x-eCHd3g zhPgI2UwE!;IHsxIp!9c+g2Ymj;O9xN65dD|c@(v_Ke?p*eQNdg$GhL};=MBGpsZD_ z`714(g7b5E@&di`YtK1X&dxtOt2uP_b<1`Kz7wh4`%=$&7A*+eaoD-Y>|9kboA>cK ze+%zU$@xCz%dZCu?}W4kOwR}5>*Vb$G+DOy3mbE|$k&6; zHi(MU zJ$q`Nxh&P^x4dJjl%7@)AW-z_lZ3>y=9t3u`@Yzh$rzon1~nmjt6udDuCnK=7d7tdPh%Wn7dO8+m@d$3N?x$sqr zufUFtKb_76^6!;1@85s?<+&-_zkXylj=c5j>vq2seyexqoF%>L{=A$X@#*#_tKAzQda~p?T(3dw?uSdTB{ovo- zH+DN0-fCWc;4s@Z#|i7bzfX4k6T4g{b5G^rtRw0rYbI~=d9W$^yxp0-?v8x{UeeS1 zFN?|vJvr@BoS|UPK0$fXKa-HdfpXO)IeRW!MkbpiT<_E6IU-cC#^2lOK8q*khn;3! zmUA}ExAd%5{hFR!(Axg#$FA=_WlhpW3h!?26qOa;ZP>1Pc4E($kS{*3-mhu)eBM6K zx$4`y)6W*|_M84?1zv{m$#J;_`dwQN_^wzA_dA9!7 z7<|3`kN>OveeTDMS(_KU{;@6p{*vz|NY)BC6-Q2BMmpjBkqxr1S= z*Saz&rD~SFzb0!}XQvZ7GvULk(E96@X|Jwq6!vD`-mRo{N_)c0nT>bm#H1I?ta^AY zsJH0W_I&^SckbA^xz@9HMQxtG{Qc5@wbjX|geN;L6SdR`{!p*K=hzwRPhYRR znQM~h8eZY?e9nxEGmo?~350Li$J!LeyYz0~gRYVoUD;!A=hg@=GF)^hpflF;XT)B6 zQR(lZi;iU+y)3-m^|^uWs#B*0Z?Chhi~JzIN;|9Y_ucXb)9+tfyl4@}_q(OqCR(g2 z-7KqbvU%t7PT^v#+A3vvwDQKbdh4n$J}w>8+2pG9WzMcVbnNZ!i~1|Ym71Fq){7>t z-RgW{^+S0vw(e8nFL$zf_}^^Xb0{aI>KMbt<^(<;hgKtoNnX6FId9@l?R^>JY|39h zucT<5`RPiJZI529^14(1o&~fN>6}RlQ`eP)@6OK5e>5|Fexi9$eEnzL6)TUtxVYFL z>q}|Hvzh4zDJKMK?DFOEcIV1e&vwX{c-d{U(%#nY$Z z2Ko1vdw68De|>GPprLW1^03D8&1YtORI;1--PFcr#c$usk75oV=D%MpyH-ir;9DPi z#933z6N&B<4vDS^*rm4AKIqq)>chQud#fKTeZKr!q1>qhC-(m2TKebG{O8N|x6R${ zUl(|a!MClq_u%1Q4(AuiKU=(H%axZ3#qI5198I1#&&&`N?d+YsE%9yJ*)`v0XRo#S z`9r$7eag9?mk+5fpJOr0`N@hUA~{vr%Y(EcZFj3&dUkdD#>&@x+x%)jOt|Fc9$TyG zJ-_t*0U0SNo+92|PTo!J2OSyLEId7vC3p6>Lbb0-^D4eD^2l4YTs2=JHKY2QoI_q* zUGr{5clCpw_V)2Bu4+yDFgvR%J#^>E6@n*UFa2doU;@pD`C z&G&a6Dmvz`di(Rvm+OifU*PC&ic|4n`A)(;o{u2EdBXS#0Tl;_LmReqe3T={CF=Z;689Q_R5@bPOd zofCB0{`aHkCA+VDTEZ)MX6a{jYp$o2U$1P|e{|sBvE3^QD=O5&h2q<^4~Xu#B9g&p zqf$_z^Hrd^oaNSulh34B=Bx;0-}#f{+{L|%Yxr->sAJi+CODC0imTE55$Ee4kT- z)9KWMwF^bEo7%7VMwJ;{n!!;MHf8Ff^ht+XAIp6`cz9XfV#NxN?@w6HK3Om&zNqb+ zpWJ~ShIJn%>`K18pL5!z&HZ)tyCxi;H^pYc)p=8rpKtT!;Syf3*5AA8o5J_y)mppW zxT#cl^v1_LOgzVrv3YZS zy}gr@-&-fY>kqH3jh?&p?H-%G7uMI?Uz_97H)oE_vml%K53TIH=HJ^Mk|Jk$PfC7(%#e$2);!3sPG<0rxWwjC{Hg=a1}>=m)v z(x09>ZPTVrk(SG=)$g5~w|@Hnty1&P{9bkOQ}pw!J!f0nxBQ=WY2C);*ohVP0l|!W zQyTog#n}j|Cv@~PN|oxaY2sLYNjSSq*3ph>W6@u;FMYhnQac4dT*-)t=W5<4G-oBW?yg8J2x>rmUU}Xr+j@>!)v$xvO``orv$%k&fot}>T-M)Z}+W- znYi!&H|;gwBx6^sb6n6G&@vVwHiyUm-%MjseFHUdF(s|jip!mcBQdM+p{kH8f4rzzdrKWnv+hv)*NcVd)9wZh&XXMH9yR5KR@yM*v8^leEj?8{ui|7?`1Xp z7P;pMf7ta&&lY9d{QjeTWAFEd;@#zUY;VrormwHQJlnrEkL}xA|H4Dg-+wyw1zOdA zwT#G&p8RfhL*Vr}EGOT62v{e7^TtMj70WE2&k6r}!0-E4OB?b|lmlkrI znHZh=`Iss1Iw|q{a*2Y0Z|tVal(DROv2W_7+?VN7l6?4_!Ygj%KX~fLu55XW>+|Oc zcmAhXE&YA&RrZWY6Q^}ux}@}M*=qe)&F$}GXZvsOZF{h=di&E$my%?xHi+;2&6B`y zzV5?>V{UwB-mLKnYo1V|kgl+_JJ_lyIr+VPMuzNj=0-=a#Md`=&K8#2m8I$IOfg?VursXKY$wI5T&s!q3rva72?*O>kP$+c>`N3CFo<^^uKRf<2)+xJy{ zC^~Zd_~PK@esAVK>F}{F6LIf1xwqz1P49H6(w} z&JPnd9eYu=yz*oIv91}v8KNzfwuo-Xjc@8-*W=8e%eqF(I=g97od$DOe?ZOlpBiF$ zH@W3+TvXR%IL!8~art!dlDc~Vzt|tm|0{Z8-8c6o?V<;-whJuUsJt=O#>JDdJF0ok zo|-4A>5HqMZ{xUfZPR&?$pS3Rkw+db{%x3cr9fp%pVPUGJTg`@80X#--{-h*14med zj?%7@mpz|8`J{-6CguA|eA+X4LAP(4;60tKkrU1cNX%QJc8phBE8N8<`}xBD?R?&K zu`MS$G-`f672omfR<@vwNX+uvMTLQeYW6mg+~T@U`}h4dc)9T8n(R-fjnfqD?fXq1 zMQkeJTqkEaX(#{5ZM*9JR+TBQxLp08617E^-l z_Wyh*9b@|_YfbEKw)4LAl4aG*oOgILiuE2Yd}FZq(Cx3RvgK=cPTMK;(rH278h^WA z3U>cLS+h-yarO({d*R_in>42OSnKkn*y)^;gj5z!N$}!bmcb*p&-{0=&i~g>rn4}5 zu5$Ev@aC!cy|s@&C~>%dee1{0pPKOX$CT%$G;(Lg zY=5$^wBKFrZudmxwnv@I;~h>dT)cdVuD#h$yK56?U-~WmYL>6L))Xt<^Q$%gSD(Cj zV(G%q=N~?t87Em|xsD3q{h6~8?=C%zyeC(CUsz|!uclVkpB`^6&1KZ$ z%95E>l#svp!-tA6tLCYH*jTcKQazvRFLZt${AKww zqbY`^3GekdxE_j>FWSS@-oD)L?zEwJTOK!A%l@17sDl!Y2dvVt~ zQ~s47J-tpjKI>5ap80->%C{oNvYbh$w^aAPJ8|lSQ(-1&vFfsAa@Ow))-7b-86dSR zpzL1H^X2m<-uvVfGX4Lx+wZO4zjF?+@aWZZ?~w?6U*7Wi!Ar|Yvz7(C`m|qG`<5La z|3aCCZO#{#{ppJgFLyAHHSOw|D)8mr2eGXuPOm@oO-Os+k7{nCPoE2Gx0`vq6Fncd zuC@G4&y_6B{jw_@H)^qEt`>W=j73#W-kj;>@3O-Y$u6A-dG`78JdAYEE+1TDjg9&E<~F72r4|< zby3;y@zUuLi8ole#U9P8exIo4bd%RZ-t0?Q`N>O5e^ef1N|{u}ZCUM?;zi9a@I7yh2RU0Ka)8K1?HzZd4~@0-!z z@{Lo%q`;u=XR6{d+y6pqzPSlx*=~LpbI{rA{J(dr`y_Rk6g^{uX|H z=(W_Q&#y~91hn-S-=Eie^|egC`qLLT7RqL~IOe$*Z45MFl?z(_WP5zQ;QBp=-KEcR z{VvR2IDKBd)Rha58{3yJSheaFqshtM?|-yQ%`~k&&a>Nm`S|TnsrlWPITcRU%QpV~ z^mzIjVPi{a%{vbl*4X9G{~_@D%$++EwtLUrxzc-6_KDvL3%pA$rJCBmRBo;~IDO5+ zlXv-T>P`j3&HpH~tNitun59>Ej^3@*SiX1n^}lQ0&scF!?dsi{?|*kj>|C`jx;5y{ z%hVGe-^6UwYHvR~SG2|!l)00_7VP{mp>L*~2!~wIVXme&mhu&0ihExy`jWis`{H)K zSI@jnKfkbByzhkNypvLy0a~l7W94`9DIRprO4?NXJFV>f&3mi{8^5H?KD)E_SyyoO z9AD>*`A@XYoIRH%B6q1Uz}K$GQb;2CctmvfojE$!cv>&z=%-b9NL{qGohxjaGUNHI zeQ&G!QYt(OCd#;r^i{RJ7Vzo~OM3jewf)N;hm}v(nM!5eee+n-V&2TYC;yyh{62HF z(j)V!3BShETcvUrIDNJh!qx(mo9^V*?31x?aq%Ff)t$yy0Ew zwV)3H?-<_H^-dR=zJbS#tLXpFUsetKWJ=D3t&8crb?esWUxBwS{Ls?Yo;Z8HD zH?P@7Wz~pF+bo$iHDq@X->;m7yVgogzvTYqr{`YL7rP&JX|GF|Z~w*8WxiuOzx=_6 zhuhD+w#?6XEDmZ>Jds|vd)G;+0O5-!+b{Y0-aC;QR`7nC&-0#5uVW5x1N>zRq0i|VJXk1 zE~@Qk)X>v+4ZD`u(%PQ*zfq^;?LA@ZvK+_KQq2-8(?^S=7iQP!gp^4uXeMm!ezSj4 zRR5VvL3_Tw6?$XZzUcW`{{z;$xO>c0RWuy`b9=S~2`O^6@E;Yv5ODCo;v=uxxf&L< zFtFCmE7|liW^;INMUhZ%U_IK6$3~iI?rJ z%%2~Z``7$<&TD?BgWs+~KL7l$7d=^Pclb{#X61kSOeMrT_u`}bujY0?S)tr6Qkqcv zHXY-TRQ}blyX=-`Bl(W2G(6(z`#l zCOW42Z^gI8;mhm~%Va!BnLNAEgr)gO)P#3i-=1jt`>;BH!)L!fmsOiR6rFF1$JJfF zxzSS3j4h--$j`h~^!vWu`NzL5UcYX0@3I4jt@CzEZog;3W`6%!#*>Q?0l{-Nn)fHZ z+}+-{FxNmFsm37)Hzv6>;ZQbS9T&bM>DqQDpF6*-jX_N z^17%?+n)LzUpIH#-G_=-IhI5H1 zqlEXBR_)CRj6X_W%AYu`pK|Vk<@@s~3nn)#mnqQ|{@I`4=K&RBIX7>%}J|0+@cGmxp@}e2H&)BYzQ(U^~ z*H89Ep|d5X`FT5B$XJoq>wjjeTFLvX(;1iSne&*3WsPZANCH;HOWUB6$mTvdxcKe*S8p`|VpBOPOu<)?8Ru>wfJ`ziGRse(Hv< zZC~>bI$vsznSLd3mdPUV!Ye0tXl9;fxwlH|^hL#u+RckMl|8ZZd1bxAFKT`bsHEAd zqM1A6oA&j#DY30zGd*8V{yf1-z5LasxmTwyanol1_O`9wL7}-zWZj1eceJX@bDcw0 zXM|0kIM0{kMNs(5bFtM%2Dv5@5yvx%=1*EZRYvKF#?nf+twOIapOp3ZAHFX4r$scE z+@*gSsxx=J-Q^Y+r?)Nl_PM$cc?EBO@8kRaKHnbMWi#*BG4=m_mvp+ly$W%c{A8?h3*}vHiEVzfUMl|E;2Gs62V$E~(td zk0R6`KaRY){L0*%&exxv8rwg84hZi5d3EOd#J|UMePh>po{l&Dq$OihFyX3xj>e0B zjgOp|+f9~V~vu{6{|P)6PVUNF#EvY$8hH9 zhYJx3U2YLqv!1+M{PDA+@;^Uvq~jV{>N_TWaYm( zwera6`#O#bVZBaS!_QZrN6tOU+C6R2f&~-q=BTQFJpx)`vvk?Hn&-}CR!>B(tluAfAjr92 z#@D%M{=7A9bE>7Z8khf^zwdmO@t)rYV?@NKH{Gcd&f70qzwS@_RsJP@*W&BS1+pZV#1b~49_U|)Ww zy;HR8{!ZOKC*h{7+@&8W?%Jjmkvl3hneV(6eq{KuZ=--JC%?};rcGaiZN7g=mbhU* z(~^Js`akWaty1Nuc{An-YVb?ee)cHIS2i3Iw$Z%sy<` zXw}BjTeQh|CiBEOZi`rsY{`9IvVNzx>(&n(OhIQ|EMLr<!G)!tzxO(t!b;M;+u2+}5dHue{i@rN>Nuw6cQ1FaNN}E- z>0_D`+m!S1t@XzCl&*Sixl8*pV?vHkT;#w1ppNZs%?}e!eOV&snYdMjb=P-sSGKRW zj%{zBU+=JY^YjObSNm0Nxc{E~{(JJRW5(ucuFfAO$TY8X=i7Ad4om6FdnYf}?rh%t zY_7J=l3Y=7Q6=TK9IN$xlb77e%T2nqY1gcx3v(73o;)yXLGkXEzH@DQ@2pIpRP5!@ zzn;dsQ}vI|x^WaX3hN=){DbEkEt;gc0BRvg&1^>x&m&v~_vi$zPn zue*D~YTnUVJ5|)xH=pmECUxJHmH(v0f~$+F`{gWV%{sL%f2X5YnV;FW_jmjA?(SBy zR%Z{K7}(L%lcGQM-;clL)6#CPjW&02x1JTJ8@p-C(R2H2*6E8>{P=bH@`b(GNt4&V z-hO{}^Zx&l*PncywaMwaUaX*)V4t(5CJ&$0`kSY`rj+A5Z^*zhIu$MS_j-J4XF zytZBtBi$(A%_yX`{o$(u?Y5Tg58J{Is@+mpRk~u+ih%6kLwVs2kDs#coo>#PW_(49 zx9D=e(gooUpMxCNUv}7Z>%rPT+jqkeqVY_0Ze>4N5i9FCd?Zm*pzXWIVZ>&L`=$ycuzs4wqd6S-GP z+C2A2@p<3FlT^Jwd`J$y(c887arWh)X_+<8x#aZXe<{D#@s>@K=4Mj5lJofc)B5CZ zb1K(Zyt(Xe*Rv$9&#$25P4u?6DSdjY8r^$CRxIQ?dUMxVsn^@?+-cKfd49steS;@o zR?esMx4zE!eKXu|dSXqCPTcH|GJE#Quz`4;LQE@YS_eLFsX^V`#`C98SeYQFt6 zFTGTB_n~5M^Q@aTCI4C2em;3UH}Bm4$jyxM_1~6$zGJ>@;-0(5m-!sF6+WiCaq;5C z!dI*RB>%iW!}`6q`h#2^xl2}8QaWZWo^Y>d!sCK_;`b9TiyfEF>iYFSQPgT#)U5D+ z3AVlW9#*A2&$#bc^W)?5(p|~Hxo3XA-zj`pPyWoSlpui%bIt$Xw$l9cD`R9@855Z@OiEm;`XXbyoBWCu8lgBmpd!#K@G`gH%A~hqqk6~){t;xI1 zw%D#ddPwV6hRLm}y9J->I9Y^ZirzBm3N$;Xtv36lRX(Z^GL!*jnWUWh`YGPvcex7^a_omd+*Kc=c zU%O<=AN&1%lyLt0eS1%M*hlW)RQmc_M^9Iht+-kKy(3bYUtVADpE+ek%f)@Q)sg`@ zCl`oEF|+ZsM6FGFw?6mwcFWz3+n-oGv3l=&cX{>YtIO8atDU}Fo}HAWq_jwBL8)Qw z+nbwbPu;Qj#f62+MMazRXN06)e|$@((9-H>)Pt>Wvwik%;$9@$a4d#U=a^XNBvW+Vd!2@dww2y)3(~?7whxUf;~^ zU)Z&b7KUghY`eMO!mEV=6$`dp>A4^Fhqc>{b@53aXIIf(bt!f zI$3plO|ANhS^3XDS(KS0ndRr$YqLTvI{Dnu&3DiLjGBM!-Q&k+8)O=%{L1^sd11ol zwYyF=NKJmZ#d+b=mCS})b<5YUb{FWMb^e5}YsS2Q$2{FvPrb_C#kSP4y}f;t{`sb+ zMVFUdGBY#yWwcoD$dgSfC$3FdU^rR0cgsQ(wx%^-T|Ei}cK_7V(JGRY*L4r*zBBpL z?U~Eo?B18U^7f{aDM{ztyFP3PD4Tn6qhN~dV4VpGvxTM%qUuhLDTbb}fxvvMEDtxdGxy-2Oz))e$UVq(%#(qhwKD_i_8#9#ySf3`C1E{#PB zNkK|VN?N^_?(U4;Jo*1~+t;$`(^GHGh&0>xys{!8{hjUiIp_Co-Zj6Ld7F)NQ%{~n z?o0!Tvmah4e>nTc^+x3fgQmmE3(9v~SX!&SB|lDHZL%~6SNO%oUvo+%?y}ujv+>5H z?4$nfYi`Kj61w&y<%zXT!H!-7sip^$es#1uwzg`X(z+Xdl_TIQ|I_=QQWHOI+TvZ9 zd~R*sipm$=VRZ#||MwgOt!=oHUvT67~Np zzTOTOZ2n~55MO7>JlCr9TiIppKm4utwE3>Dk8T%_t6@BEW6gPzS32p=j=~>__s*;T zV|XSnJrH?4H9O&`l2*98G`xAyo3{xQw3e5R?nXrs;Z@Fx+Sf2L-f^w!(|Z;Gk5 zwvqjLMMfco#$7%N0iQPL8L#!N=AUBYV_PR;y*)ovuygLNZz1;41uSg`UQTG=XFX9Q zK~q=3{@=5w&sN5_gf9=gdwu$h869%ARgZ3LT)Z@C@~-BOA31+~y&gYt+O)8_0?KM; zVzs}&1e)^q%iFh=y}gxuecj!N?RmLdqn^Kv=wUhQ@zeNz$-hb06d5($`{cAI#grWW#?PZ zy>+r%bK*p)lJWh<3l}&nxZiZ}@HbtYyEtY3WueBu?R`qOUbv)Wh`gEDYnb~o>`!h6 zWA^cd1uuOs+|1S3P@Q1XzN*JEx{j};idiKw(lp|tXV1bT@?F+{%$G(!4=WW^_4)Yv zw${zuoj-V|W$69n|9aNE?C#%^u3o7e5yuY`1ujZLs`8`kb+fR3{l&|fv zKHl5B|GO~N4qmqM z3e){5FS=}MrnHMLJXV~=+_+1P|LOL^OM;O>Tb@?;UgO+jcE|f&Ba24^%PMZhQ-@y_ zsjqr&wdC94D-(J;b*oc+BFmH_B`t4G(i2;DO0tlp@4(Ax?Txo1@6L!^^et*z2IFDR zT~~hxO(^-R8_ktHIc&S)%0oeQo=g*yl9EEADokV2N)I3V8ZzO)$HOx-W=phKvzxj_ z9CW;q&=j2Cbo`}*Tb5J|pLoI+C8eE)Mr$Yj__Y3Q#NycDJUKOgi)?=wfG(@W<7+|F2#c`EpBYs>ae6 zi#S|%^G=>u$uvE_&eF)}QYg!#tKqRrKmFe-l6L>`(>bQu*A>jv!nUSfKeDjQ{%Q8l zXWRZCVDzc^p?K%_{@)k&IamA4|0gLo>j#TZ+G|eDi=vfc8vNQ$z0a?(F_rqtc`1vp zJg<2_dda!RcYbzf9nO6s=h498u^>utfz6t*?akeajQfQb*nF`L^7CL)2{_An< zbGz?LsQrPB>9PsaSH$x#DmkFaeCy%4)9nx5n`UoFuUBiEYs#_haJ7KYl6J!@9NQ0b z3i}jT+FXck3SGAT>IDAfU%dM~j$MhopO~=zoyLjt?T3XL{hzHr@aeGI7TH?yCe8@xpL zt?lW_0Qx}Pg#2!OwuM!D1GTuyQ}Sr z`jlM_mu@UsVm0$$%=9a(dpi4^(!#=4Zsqw~>3hzVNyUMww3p#&V(jk6ck*ME9V#QP zzq9!6&7@+$al7zbX5O|q_dELHTDbzXaV=HZ7e ze$NBDuN_*r^;U<_T8p|r6)^<|SuI|#*=$hw$i-*2U2y3s?RzatjrxtBCZ@jl7$c;> z2t_~o8J;T6XA@d+mqmj=`}^Og?>rh<{8T>p=yRV@vpplU^Ld$~x_|$M2?Z?AmmW$r zc)Xm4``(Yw3g1+}ITXCE+mM>3Tzp+kqW^tU^7kqW{+uScpC4Y_{UGu6f^{rMIrH@I z*}aA0{0@$JYB_A$X74RJuK2JANvST*bdq>*qW#>05`zFaP!yb z?+L%x)n*8YcTRcI=8<)Uc{&kV1A=6$cWv={p@Av!UoA39pu6gzOynNs5b-VpM9V_Es$#m)XWKL_+J|5Hg z`~80T`!)9WwIxk|zUXJ4{po_dh$TDc1O_N#n9^Ru<*}elc!ABDyWgkpR%R5kn0Vm# z-?b+;Jw3ea`r(AFUWpDb-srV>YZXMusMTx|i7w%tC>X@={`qc(NUrPdUx5a%Y<|3b zUU_44vZ~J{Nu7Uw%h~Vf&0vVRvy@YA=R2hxM*U9t3_Om3KPr!^i98X1aL4X0!*=0F zK6TJ6MXdEU_lyjVgbR;9TvU$O^dwy6`s((1vbR@0u*t4r-eZxX{|IbcrSG2NW+4jd~YFloB_d(~#m3+p> zST#NcILFK=%4sLIqx)ks<_`49(ofR>N#Qx9pulp%pxgKP~mQA85^gRueokvqBFP)>kx`^1og@S42G(Z%ccwCY-i9a_XJqqX2X z$J{vn>9_lgXQ@4GwbpYFxL4>R_4Y(@)r9=cgVS_xFF1Y9#izz*k<^lem-6)ridrlu zd0!|0e|Xr#-`l+NMdb(~h?V)-oGj*cepAOprU1HFZTjWTh0g5{c1h`9z}A{9Ieo}%WuJX$-NUMOyF4kbH9;k>0Hk5{!CjN8~)U! zZ{A(_uluORNbh^;hO03tT3imkyq5TUnQy^spA+9^6x!$t_ch6wWKG~`-^^erI5A_62={8fRnt4p zrZPQ}dfa+G?eS;T*AFHr*cNlx@F{34v%6LDhPSxHNJ(m|TTM~%lGLY~ftbra_Gs%gKrBJ&M$4h zEY&+bZhlwcc0ZT@#%)TUE5vdtEkC>{5}YW~&8fe?*?j*z#>tvYeC}*ZVmC-yi5y^7 z=UF6ZxWSoAZtuUOBWds5I_@nES{!S|Y*WR}HRr&&z3mIlXDztS9M;X}*~w|JV{XCi zPl*%0q%@2E)MK{U`1RwnHI+Xy9>#BY?R&xVz`P}Dw?75gD@vx%E9UHbGHU|6cF?WT zw!<<_GTS-LBo-J)9mziQw#?~$q4WAD3;B%SXS`neWP9G})Q5T(Tf}1xc+RSBF|uGu zUMIoae|)W&=A(j>`rU^02Wyt3rzGBMiVwMac$LJI_E5)}*Wr~23ZrqBYr=PaGWF#Xw3};VVU#!5bXY=RO>KWfo z$IS3OSYYw#%KDJrOD7}p+YYP7TL#!)X_|fRb?fS1Tb&$lIja8o@+{!V&R&BTUpUNO zKP%P9c8^~-ZAa44c!~c9nopcL<5cF?D5G}rd}xq<`= zc${&6iR71=GYxjf6ht&nSa$v4!s+vleNp`^kaFSR<7(UV{7X<}&2oeEx9_<(}~o^n=1vfSJKrszzpg}A=|>?X6bQjhAl z$F@4V^F4TZefhyYfu7x8_2%5(Z@(zE>c!`r4eXH>@ATG%AP6SdD(FEX^Z!) z84_o;f-dmAobtwPLL7VdUB>iA;Y8o4N1fl(A6>q0ejw4{#6_(N|9?gvd)>A(pLKTn z_=MR%;fU+v57%d%o$>oMmrVJKf)x%@>r@WM?6=!w<0fKJTJW0p$G>NnRrqV=`E@s4 zczUM&Vn&m@)ww^>w=dkkJH`KNM3CIPE`j^%s38CiipE{;4;C*JSF%tOim$Qe-oGxs zwJkUJ!}oP-e-yuUYl&{YxH8xMPVMWrF9fa&JYzEdbhawTqKx7E9y`g;;r~}oY83Vr zE6Kjf*KGampr!4v1(AE%Zj|N7%l-RcdM56twGyvdkK`Th>tEipZq{RGy%w|MO=ZV5 z)`KrDIHogvnp3u;$E~8r%A&OF#T_e_ooh8VNG|kV(eHl$CsXmY+_rluEw>*t#mHS< z!g}HG8uLT%wk@vr%HH$qN3qAs>l}X5<+T6Z>tS7eJ=wm;LPmrwImk%oV&{os=KFU7 zSnp2DzVz6oGGg*OvFl!-w!4Z0IvMJmaO~!Eh5MQ9nrck;>;Ey!pPSj4x_g_3rpDsP z=9D|7pWj;SPWF%BisA6>Iy~j3@y9pTlS4mGHappCxFB19PWdwd6&6>==~G#o_cH8s zWYe+U#9i)N#Zb&?l#^d9~$o#*yQu`$f-|iN`82vl))-<)1#K#3_E!9b|g%H z)M>D*Il;&+@#{Y28Gm0F>HJBzza*>ou~q9+0PD-0ycb@7`B3r3fKkHwLyk?|`PvN@ zr5k1(Zd_1sCVs2fXY(A_U78#>-MC}aw9{;DPjTUGM3$_W*FwQYC`ds{Qi^M}t!^a+VdUo@^TGmDWliv0;bzy09N=eQ|sq+4PV!n@G zAC!^n*}lB4Wo5D5@eOv)g+E_h?BL~hzPHgQVh&q`>x-8%A6i%+POt{8Ns)PfZf5I~ z0OMcgeTN(LbT2F|HkPn0lla6i`QC!6jtU#S9lU-!O7*6;>3kB%<38hf@kiQ6Bbl-n z8#5l;t+`z+P_>vbZ#j3>%6g7Ymy!cHhDtgbEQNXe|IEKx#n_}s_^?_XSlDc;Bem^; z!I}Tbs$%Qo`(>tcudn}L@O0t(!@iXfx9wlukq5Qf5G_4egL%sQ13e3;A4tA%Fk!2L zsX2GvX3l9Z3eNm{XMN`9Q}-js)D+Cr_`>JZ+U?r@vf)irjm+tjNA&IgH!V4$Qu6wi zq~%M=4&F|O8HyYQ77s-#B~lu-PxMUvy*>HL-R+7V>~{+4;$`ma;o57x-DUYT-G${Z z9~4<7n9f*IYs6q(VkK^qXI@ezJV#HsBKm@FB}-rR2H6aT*4 zW{Hi?fA+R?OwWQu9AcF|9DKl?xG~~Ek;T<*XT^-)Tr#yh((`3cO^W5G4bR?}W=y-l zaQ9YegY$a#2qzw~GjrKD-)q?1&gWWI#n$5|n^1fx%k1FNaz$%<`GXTDT4bF+&VIk9 zQGEHn?mXVbA1}lvZ>+f|Q}X_foZ-cb8(1O}GzysWta!#@+wNKcG$?7bgpXeG{4jOkeU6#`qcf2XYXrYTvlvt zl6i^a>*L7}3U@3lW~yrD)O#TyBgFG1!?Dt%GGe;jt2^2_qxiV8Tk`X7vM0`-a9X`g zlVcm(!5lN?v(uPaq9*>}vDkdw6dCfDra%}mYgzc&RHp4Ck*yfU%9Fr44@`;<0|E&1Y$k{1g~CAoGS zZ)U#aFmF2;n$R9NYxRw{8|K_@ z{xsp!hClKW^BmC&FGz7#+Ie92^O&Bi+F=VLi#Rf$&O>|V z*E=1*mV0qkWO0hflY=5sJ@du>_gq+z!1KzU;pOq*#1Ah7vUuChy=0o>H}&6~%*~1# zIxMU|fBwk2$Y1eb?(_?*0ww0{dR~?yceDMP3{eS-jPg=uNwEKFgDEJg=@jcktWW+Y=?E*}Ly`v~B!o z5UF!w!*j)rkw#*AkxbKXx9Z7SD;k;b=uKv{JjbLH{m(jS@#2fCi_1lxJab-u{qW0z z0}sBfkZNNsP`30slc-DM8H9@=_Xm$97Wl~%Zt z)E4?aKhPf-8-D#2*h!;d>2N?e*oIEvZ-o;$vW z^|PRiP?KW%Tvp{T1qYdDb9UrU>(LBerl7i1^4HfFoYU_z_MdFna!2OR)+|=3E9?8^ z-dY`=Hj`P?`9*(;ZlolUOxVT#|&GhgZ;{#6(9~6{{-C?tJdf=3_x9!K1>t8D>pDCr>o-;{- zSEA&@4jT`y{sYd}@Aqsxtk{G?3iLt*{6t9P*VRSN}j_LCGT`a%(`jN6@9c#N`x%ZUXn&KnZOPqTzA*7{TgIdi`Cm-pJXOqh+v%?m}-v0LD+D2`zPh1JxA{JbJnJ9awm2fOif8OKNc$u^RD8u&C zyv!vU1(t$$w=nMe_p$nlw};E?G~JM5k<8#EPVR&EZ*PC_J~#Tpwq$ly{@9&nEYeGR zJH2NqFbi3(xPF*%u2-^|^&F1gz9WrmcxtS^Yw!7SG1`NJHE#FoFqO85iTvzAn=dC8 z-wI_}Qc`&C>{-_;H>*jLgeD4z_U#W_fAEQ=_6PqcMy}#%jC)UVY(Lz2@NU(ExyR=_ z7Bq5)waYmsF8q=8%||Ehm-ehBOAfsJs9<3saj|e?M_<4DdAq%Ww{}0S|Fj`}|K_D- zN=QRi6JS*_l+nQ7=$f1tyy*g;IoBM%7WVc7FAJ471={ZUd6E6am1VL~W_etj4|d2} zmmQLk>-u$ecEa0dy%GB!>2Jxu$(3IAn)Sw8gI6j_0e2QUmO7Qa{37r)qp&*QLD@k* z=CY@9$9`__Yg0bodtBdAc<*hKc0(Hpv+c6k=6NnIAu5NQl{O?lFFWGqw!rgoic5Rz zgYTlNKU{kA^u~m|_ILM7Qg`+pf9iBzY^~wXeeDSv(#Js$`xzpN{vK~Kr^y473g^kwiZj5qOFf|pm zw6x5)vLbNpEpc<<3Z}@&$SLhojHeDCurJud#0d=|BSi{B)E>O zIvW3Yy<6prVs1_T>_4B+@M6)!!1+VqgJ}D$(;^);E~lIuKuOT%Ja@k;nv=lX6^blg zLhT|Qrca)QE=~=S3z7?4e0-ueXo?RkkL;Td?2VU>D6%fH=eR!CQiETU|Mj`c=jKjA zb}xkOAgd4{R_M_f!7j&QpF8o>gijaz`-PTcF|=`(w}Q2`bUVMiTU?x6j9&QJyB@N! zI}au}6ciW;2@4B~iG{gqvZURf(mtiVv2v3IwpPFu0j737*`_}aSIDwVnlwqF-r^6~ z*B9*lg+N1m$bJB^8>KuPl=!yi-VS39Kc_m~Z9(PdXFU#IE-O1#dQ`qx?%sJBOQ<@W zRo+ngI_$}lCs+2g79U+I#KFt!+AXH*agv_}6c&F!NEC8m>2Sd&bfms zNp<;}yjd6x{05d5hNp>dYxy+z{}$(K@@w+{{j5?bhRsEdph5TtzS@r`Y4V@ucqP&v zC>JF6>$&G69rQBUfk`ERnKMA{+JV_&$5eymrU{BXO}y#&^w~2dJ-u~r)IWG&F<+rk z%6EayrwbV-PP=~m;+uY&b@o}d_QQdhd=DQ!^ziZu`kZrf6YJYsTMyscTdg=TzE|4Z z&C!vOPu42rQO?Tu7oeR}`)wp{13GP6gIA5WYygJWW*(pe*8 zdA8M83XeWr=%RWmMoB4EuajfS&aQ5+x6?9? z&-PJMVJA zZ%t9GkuuF%vdApeFVg#P8}HSho5U;kJ2ta%aB&44KV2zQ8aeNT+bQS&H42*i%qsk< zF_Cs6pAx6!Gs&m~%;h*yAER<-U*_dyT36;Yqo?v$T8#B44_{jwt*ox@&Z#HZro?rW zQ^vB$<*Js*O|??S@^^PurYzvtns#=UX5qHv<9wmN-1+kL~w+dJ4O;N0}D-dmQvac^7W?y}%SV6Lqa&sN)$zl-*TIR`$QJU`ww zWLoJJ(aIOnrCMwL+G_AKEAT&c)|dY_O*dLeOUtXa!_wn`Jj;{WYdH3w;?bRBYilbj zZJrmhpLNpz7X|3a+#yyaK(KO0>FcokTbn!_CPrOq2%R;@W3AJ~^iP|w{rdWPFQennvvFHiGVl zjtc7@Bi@KtT{d6#&M$iZS64uj|E~`J(`FUn)@w|A#^UYXqC z+lw^U1uJ%}dUmKY8-xD#mV?-zTk97r1yU z>Yc86I<;LXc&XVEvzE?pQ7I`)xOyUYm#q!gJ5^^@{_aihmML4kZf$zw`ef>c&r>5( zD`&h~WFw;YPpo4~d)>5l?XWcgmcNDOopEIPr}iMfQscGoL*371@9*8cfBI<+dbt?z zmNUdfPAq>$P|akeQ!aHsm)+>9nJkiAf702rb=v&rUHz9%EsxX@>)0{*+zBPAr3X)6 zTH4bV|GTWPWRw{o=N@1nO?@25CB3J*JcqMCM#J-8Mmsjo3 z;P-c3k@G%S?pLIoUfdpu+TY(&uO!}_XD=7($J98XUC3!)%1I#}8H){bRzG}*;lR(F zAyaLp%xV!5R9kv(OW?&VscXMXc^|WUm+;ZuQr=P>3gxPova6OxTz#7q<0LcPQmNBM^Ig=tTqb3>N*>*>7x#I?mJ`mIe9Cv1 zs+LAcoyp)0R@oI$_ik!Q*2;?-zb|K*WMzL@t6aHCeZ#s_hl2|>-~R?R7@pRqRs6|R z5#XrQxV`X;U9b7n>1wF08jH0otGwh+sj1%bKQ+g*Sj6+B=tuRtZLSKZG*;V8N#5Fb zY?7~4x%clY+*mOlBMJM_t-D>fpHn%5^ic2zpHb?dJ7<+J>y7IZXBdF{Dn(ff~4 zUlyHNS~^?LSMJm;l}Q09s|qG;eRFqr_{os9w>K3C#YG(!wRAtSl;ij&zEg)cP15>n zamx9W^M4!9IZM4b0_4It)8blCOT7hrf*SocU)aS2D}@v_m;(QWq-7L$CR}Do$^6`D zA`)4?DSLjFon`o@>sw02|L;<&o@jdVSE}B`&tD{oRGEr zD1&C-Gq3oRXXjrhnn)B}oSCa_d;R6S2iLdm-tarXN>BERoTJ#~mvQGj*Xz%{uCjDt z>gj2#!noKuIT}^7%aYDNp#~!-7>$74sbx8DARBoj!fJlBlc4 zwe|7xmpoiwDg1Ji4r>!ftJs26Sv2@pvlK7YFM4_8yg-WCqsi{>p;hZH+aA0u|9=h3 z8FBw!$C8Q*V3+JKdg^s`<=a`=>l$z7th-=U|G%1lU(A+$M~c5z$vQQk$+)H<#=Lvk zg2Wn^iI3%K>lrr{adX>FH#_94Q}OB8LRGm>*N@fC*q5;O`(A0c68GK9I@M*WO>EiE z`^CmQDV@u=A;>%)~L_a^ZOzZ8*KL5I{?<{x!=i_nyM^DDTw>NyM{%2d>_E~w?Hiu6;aU}lwBO7@BG@Z`y z^x?~$<%)`m8COfOz+{m zPpP=0{9gBfy!5xK`_h;8S{{q9e8zeFo$aK?*YoFwzS`=;X6wfLu0#9$%b+LwGL0gv zDrnYZeZrhJXmZZ7WIT2F za&`04$SxPTU)r}Wl$(QEc-yD6+sS|$s{w`64hXLB{PbaZeBHs@`TKjX$5s1^URvwD z*zDxtRlD+q@6YW&6C)k>KmO;_ct=M@yPr>lPyClCd3$T?A@6Tf+wVr1I~|$T{axnptz7p1!V_#~CI6Z6pJj;}|5qzn z7a_N{sEQ(mU#>QLgH>>GP0QJvK6jyzD5x8X8vQ^Vw$XxAr@SW8D`uh6g zZ@1s?n=wOT&+m7;p9*!{{=WRt@~O8AR7~AZb{~0R!1HQa)3lSW%FV@}-v0Rb{j9)E z#YZkdX1ABCJi2plZI?^5?w@SwlylMU-wsVO-TmS8EZGy=Eic$uiY-3>s$+tJ@xMD8 z__@P#ob&d{`o3~~_(^fDfLP8)I~Mtx-{MJ1P6m7Ovun1OC|}F9XKBCOI)%+}$B#2* z6FQ7?=lIC|+xyr+Z0()C=Hr_a%%m>tNnA6_|61&{kB>j;-YC|PHIKg{JSpk->shfU zPHj~*RO5O6J-2zvuZ#CG|J|%)*}v{?C-<+dq1Evpu7`cen%(pHw^-daSv~W*U)j=O zxi|ZJWTc(eq;1KZ)bROS#?nj0TNU4Idu!jf@p-B92LH2%ombxM`umM}<%b=%83OW+ zo2$14RBPFNlRX=9-0Q82px@kC>WMDjW=Z+n z)Q3v*xjTPNTXFbQM^=1g#orI_By67?`G0Z32^UMhV^^P-9SnV568QhxqK_(%-XA}C zeQN4W*S?vbU$gD`d9~>4t;N^pwyH1J3Ho36U=^dq>gdf%$A6tVoVQjg;nLdYB9-xW z{QUc^<84nH&D-}f=S$A*4Il3RU$(Hj#Ae>aZl-qb$;Wxa=S%1A`F=Kj!mhc#uU(U$ zA2j(|IJMLwS9ItACC;i$mup;R<8OvT|l<2*4=oDiuc(w z!P%3u_m|#pjcbgUWb>!wpOnwv!l^>FccaZ6{N~A?{(qCX*>QbPsq36MSvFrUDtRzZ z)^001#DCgsajX}Uih)no)002;-#+*C+Ir!OKR)#=-H{d%?lXJ0RAHc^#Fed*OODMw z`|il!{67m+darEEo+GjJ$0?hO4-Z!ST=#jRKpW*9rRYO<5ZFzGV z(s+}u?A3bxyShg{dHCq6^`5V6s<}U>aaXTA9U3Ng@82bvoV(RA zu0~!ik4^n+SE>|y7JUf$6maeH<*v6s_WRcdW>0?p_GUB}>*BKMd?(akYXR(^TINg< z=(IO~cld_^&5x35JCPaZzpk`wdwh4WIrNy_X(yZ%Xu^8>P+{mOCrI-{@cSL%1$FKH_$ObkOvmdB!&v z^IWr8^FqD(`9w(5-r=qKgt>Ejb8m0E`mgueMp?7`doqcMiKRK$8*l18UC4j^l@fpb z|G(uP6}etsTy=jwx}PxLly`U6!u0d=Zfs8H7t@Pbk;VAs_4V~0EerOjJ^%Oj`~6jM z4n;*qZ9I}p-B0(wSlQFVqZ7ABqMctpY`wR1$;{}sB{S>({d~TP_g4cW^Oc5Xrs`HsJTx?JCt57S$U+IKZfV={!ji&f8NzUc29ZoB>B|g>8nak zWquBGo@L+hMd0Vc-s@?4!A%#;lU^Tvxj*UO{OC}T$sA@crF15GZQpOn*VI@&{%URYk6D}d1O>J%=x}`br0Q{pT$bd~rwchI?vDE@ zHi_%^6JF;8Be8qRohNpG{dv<%qwd24)#Wt_CLfgp>y++o;W%g-&7bsVw!K#7uVZ^# zGxrM_{`iybEg&q|v)lb^Xkh!TA0K{;&e&KmH){QwXlbQLmD-3UXC7bY57ZZ*-u{!7 zucxwxO-F6AwyCeFFpMhAT(bTi2hhr6$f?VP_+P*K8kM{`$MPe0eu^#1;^_ulD`q}4>P1=qa! zbx=T4{c*~t4STA;vMO(ioX0OIR6AQly6<6aRN}i&x>}pU+c+GSpI)nE<7(9{GF5T@ z)9ddf7yi?|6cD}KCFGv*DtV`7-5F;2qSMyif4o=aX=0>3r%fNM^i*TyTr|;MW^1!U zP>|3Q{`Pu~0J&cUYxF*SxS2k`wL{^hiAs_Gt!dpNdmgq)Z%8>Qr25+|@6HO9hwSn- z4Q;&tech{nWqK^UUVP4yJ#2O8(vPgHtPgw5?=_rEIrQ=I@xs%(+ZPl*KBo0PKJQ-> zD|f-Y%I6Q4&CY8wk(nTW=;#^myBkjH?dA~_6r5p@$iydO(U5q!ZKaifl8LK=-Nz%s zUH87;@cEaxduAE6()jGEBOHX(4TxoMTYWw5d9wj4x zVLSd*V};Gl$%{K}1oM>c)f~^&KX-6j z?Qz5EOQBv(SrgMIt<%a}y)XI8;>)48zOC^LpR2Gb@7MmDT3VlH|KII)^_I3Czo};B z?GyKQyg0LH>u(dyir21t4T>DBr?UO~v)sGjxN7!4oY>)H09_1x3+S}tNVUOg<7q?P7J(P)smX4q!e_`Jjw5x_0!)| z?|r$O+20$K`D-`d(#Ol5?+d!U^XH*?J5my=-(NeW#Q!uQbCuHZQ$K#~Ts<}C+Pmc* z@e}ivno>QUtZ}*AwLzp%Q|Z^V?y5)g!uN;24_}h#GH0YNvGF5W&x;6rU} z-}KThoiDjhl#bW`UoTLb_UinP)USS~U%AV9oR>fQdS$b$<`>mh$;?AOZ zLM`gjLYk!yB9^`4(H88Ql&AUiu}e>SMX+@QM@>J z(k|VXCy%zDu$x#Xq^a?J!48`#9;OegFSFY237mOLMyb|iN|s>j`t!eJ@9W*|n0}1c zoqhhSD%HEEyG|YEl{Q;(;>E?q?#ebcdxGv8p1PI0voL7Nq|ALnI~RQlaCtS=|4cyU zUR0$1P+JFeM_e;wb^}3W3|ndbJIVYtbC)*pKepx+O_ZQuJ=2Io%jog1zwRX>%u|5%e>`|HOCC*l27(C&vB3{MxHKfB)VQvl0cm(Q7x-|c=M z#uj^Ik=d~x$!5o9wuir7uh;*?aoX;Qxtfwh{+^F+Cw2;PYFzAA%3rtdSC*)&Mz2m+ z|D#VICc4W7ezy63r`VNG*1Bwsm+!O=*NN@=`~PfOHGRg6AMqFeTK(C{b>o`98vj-e z=T48Qzw$pFoOWF$cBgy4+>5)rw|80D$Y!2qa$c1FG*WP-Ce!XMi?&W$q~R;#65wfT zBPrBbTDD$nM@|6y)Fw@5sWO|t7nM})TogRk+Wm|^C%!XilFgrrN2yw?0;Ol!)cjoc zFys1{{psIRJ_RhAYgfC*VDIJf48ge1@jK&A9(?ra!zXw9;~&r537XHna<01Rmzv8- zTZL7w?(#nUD{i8C_Ju5=tm7FkZ$&+sDpskXdHNEItF%)1(q*xpf}KS@SLCNyl`9pw zybzh*9`*OcC9})BV~ytRDb!G_-6UbZ{?^0ZEbX^*x=tOg{QPXCNA6En@6`77HdCyo zMR{$r37&LM&)MbP?eG7?xr28vQ{z{?8rSWhn`vvbK7YxZUvJwB-oLhA;XFC%Pzcvv zvnR8ZL{l?@BL2mSRcge})}Lb#>Uy`+M|h=L(b^q0Q@)gXCQq-mt^Is+LVD=2EAD#E zQDJc_L3O3>xx?m%3IeW+*i?LVc&{iVs98NdUZ&>Dho$$f%l}STxN5QHUn(2qW2$qy_VRld86L)9C=9hN+{EmcDwR@RwoZDyZ1eq8Xos?-Mf3$??X-Z z%GG>ue4nkv`1||&^^5pZJ#KxR9$&X|my74FjZ3t;w@8}j$(*y_Z*b_v>-GD?R-O#{ z9gw9oukzW<9X}p*huYeJ8bc+gr=AN|= zffw5}RZl*eWbyOb6`gLIDeoQ%-=DpH*{9xDpek~v&T-GZNBQ?hFARF^+Td0G_|m0m z+P8CW#((;7D?M%1dwwPN=X+x`K5YGXqMAFTWIfNR!w3Fu?=(h<);v(Oe&4Qk`tbd_ z-@Z$A?-!r9UG;3Chf=46NahP|{?y%{n71$4@$cvJ`C6@(c6M_4`+hF7TE4?(%1@Ol zUnPNV{*`Ohw~CrpY6v<+ZSK4EccW$PZf##VFJHcg`|JPLotbML?kexa+<9$n^y=zr zD<%G=2m3pm1!perve4;Wb^C3gl8eiuYGF4en=4%x`+fA4T(^AQy5gY2iNkARr1#Y) z=1kn;5qX28J-w{(P=Rj+)pTH6VdmDE4m2>cyCS44%45ujt2}B&VQf^EQ_#8*Tc0b?<~~?W8v$p8{Sr-uruMyH;y_ zTmG-w!b*+z*_mIJYE(lbtV-f5%brUq^S`ft%)aJ!Sj3%}cikqD7u!ry1U)sIKW(@q zFX)H7urWvQ(kO&^eG@q^54hf@;}~eKHufC*7M1tlB8*ll@X=)ZM`P9Pg>{qrV^ zoQex;N8Wu|IMY}1`B<> zH23h{*yT?nUTW>lxLS7gZ`89Jg$knEZT_2DnfV{$-ah}iZP=xYOZ`$lvu(U5Re$*1 zUydN}fLE5&N>6;Z=-jmT*{tlYlBxQye;)0(4&9#ma+U7gt*IxB70x%A)m)yYTDoV; zMGZqQ*EFxm{GO|)F67+(=(*=(xy%R3&XbSr`?Mi+vBlK@*R~TLo~6?s2XFp#C0nTU zNBwr*&ztl;<+A3U-kRrk3 zPUxswlDE}iFR!;JgLIfnFK2DCnesyV<*Gl|qVrdB%sD&T{PE&`yF<%-XBWI&I(?N@ z`})1#W@SzIbS2n-Vcg!T2_oU1KPMNbpPjXI*Ozy=viY(nyqW%EoDD_<_1eqmj#^{K-Swi8s(RIl2S`c~wpjpt(#!FHkEicL}Nw>~yb zXrJWv|JUpF)3qN3Sc&&nCb2c0QS(^bKZVV30*gy$Q1$cI_ETggPl=ro-O>qwQ*L#*PXGU z>9-zB?wkPoZsmTk-Pq`KmACttNW`gGx*Wmk>f++W%GDl6A?_J+*wf>S?foxk;)Kdz@kV71l% zlbYQdO780MyuB#%{97LD&g1jX#jjoW`3SFbf!lAlR~DXs{Z5}c-lEN}U~^>AlIttm zzMY=bt+(q%Nc*&xe}hjt?@Twh`##lt(fRGO3nHbLop9RnS#6)Se0|=X<=4Xg+`J;D zbJlxFXD83j=RzM}YV&*Fp0VVocd~frlq+tYpDt|QyxE3ZXs`O?kWU+Q0=DkWI^Q$r z^SO$N?S^%e+k@T*?33?snXWjWKXZ%H-Q&_~E=ku99x`Gup1)IQ;=%Ii^6RX$_WyX)9kH)wXV;~PQYA%mmY9~myAzo>?aJemlhs$J zNneU_wKDg9p8m2=`@8p(g(i6u+cYn=xUwnpuYSd;`)0x0{x4@9Y4f$%Ov&yzFy;AD z8)v24ar1Zb{C{H;^u%PM=VQIMkKgXm33@uSzdo!tIHf~Jps?)a0=`v`-~X}a&Mx&@ z^Abk1CN`wp8ar5z6{YOfiIepEl?-*%-(`pR0#y!|`M zC#p%QKVI57|N1-0#_#)nUOs(d!S%$7`PWwM-Vzrd@qVpIrN(>j#eA84N{>9GgWNwJ zhLfAseXF|oJu~|_wk}F7no}kByCfq< z#VDjt-&5|?>q{=~N@Yupw|7)an!3uJic-yuob@xKx6?)FUfoB@AJxwjuYQdF9TzZj z6XU;%V-~1M;ED@Vs20DflB?Cfbul|Pajc%G?5^dh5mfl?%}v*Pll?aCt@;{dqY&M`4D zQ{7v`+B|cuwl6z*_|%5!x3VX>X*;RtX^C8Vx#P!#d~T&67cbQ#EtRvEohYnibj zsAX!ZeSDb`higJ;O2?HcQk9e3q~$|zSez`MqQbxRd+L9stu6c495g?)_J@s<hoJuY-~h>f6A%u&*9?d|L%RN$o0m@Ij>wDT;4Q3j?{{>)HIV( zx@w8C2cv;S%YVVCCks0chprAwytyg$#m&vjy>cfifknQtEY;D+1+y$Z#)= zykg4~s>JUq;uXy2>1{Uq?1iq|-W#h|?q1&e`MiDn(#u|35F!3XDP)xh$((|%)iSD{VaOiYp(TEVufR+gvO>h*W+0<`2V_Y`t#Yt zm~-WI^-?bX>l1#p>@>4}b=;L@&%D`JG^V`vWbV6^B{@$|Y!7(nFN)tBt_pDMuo2PR zk$jx*&xgbOtAf{iINZ;0&Yk`B)z#pYC-e9JHFJ5C>726Agkj>NAD0Xxtj@A&{hIJ; zLzbLX+|oxZOp5$ZKdW4-`|#kPXuQOE71YHCptXpMLMy~ro;8&O^?F@!tfBqSC&EjXE)~7mY~qo5bCc>azqzk!W3y!9YQJ8c@a}+o?H9qS@9%m+ zE9bH+cT{{#`ttU+xZ32C@!vZ>PiUC#pzvhjiJz+8(-IyWXjJh%dii=0>ZvxUy> zi$Yh2U5%3Sa(UXuE3GhbN{^k+@yTbMPrDqr|0&=Uqen==?QOZt_s;I|k$&QcJc0pd zi>f`yFVx^(Icdw&FJDT0W}B@&((AqI(}u*udp;H1+f#XCPi1lEaWAgol$4aM)7m!` zto*34DfpY1sHkga#6$Oa>SF2-_$xK;dpzl{(OYUc@rv}+yk|0S+G{- zvs6~O$Vu_Ag+33sq}Ua5NuGn<2BQ&o^-hs~7kt`#>nrE)(z zH#hp>ZiS1Tx=~v=R&;!J-~N;|m-Kp!zAmNzGNkOKbg=h|jW7TuZ;r zl8LrCaw)@P)s<5YZnCGoYVxnXdHLj1lq>?#4<_e?feL}t_DS<%CQ0a=erI}6!#9-4 zQiGq_b9ymyw-VWaD<({#YW%D|sa|bPW{AgwXta~ z{1SC**6dWpVHIP&0LbHCju#(6uU6sC&r)nu`edN1dp4N+d&Dzc%ej6>jvk%*vqH`T zM@Ts^ZJh}k-MqWhX3g1ttM6_&)CI&bftLw(_oY;(zY&!Tx%d0vV^3Hjg4+*eEC^z8 z(ply;_kFbyC{^5-Q}e?WRRzB|1LW9V$o){xojI|cahK(sX*gnIfe(uY|LK;Mf7k=% zrp=c;4+?&y0u|0(5yzsz&s<`!!OzSx?J}+`A0o+k>M+B?Wi~tl5q`KbTR*?Hb#X+m!&JcqHar4Zrw%hTKHY*`1R}FT-5Nd_IIPedijHcGQsj5NvNm!v+sc(I zFT5<_ns@xMV^ENgRoR<}RD)W5m&%H$4WAbwdl#8qrxNh^X<}5A)V#W1nKBjy44j;t zaVC82%%ARESs9$THR^B2nw;Q3xoN$^{kRH-75iASw%GXi`yYSYZ@*4u;mw?5>GNxs zDeyd$lMZ{8_^${DH-tYY`x6F4o+r%;@{_;0B8b3Zh{&?B!yhH!~{_Z~E+l z!#dxK26mge%4i&wk zHDP{>mVEawTUXXQ`Qx{_+qb+vZMxNTdg|OF+qECVT(8H;&f{MPTciUiJN|ecc&eu( zsP260%B!!fXS1?D7woq6ID4k~^kcV@2!k_f&G)zcKI;EEz}}3h*4p&j?KzEeR=AyX z{@Iv!a*}Gr<6d*WgiBkq!)^Y2IINW$Sr<_AbZYpNkS(|0?)ZGp+A!e&!`EGB3h&o` zUs(M7+>S4oyqTw+i@E#sVgLU8V-vT`5t_gD-`rUWOC2w+I1|4A53l$2H%|TAcm*Y; zSfU%5o2yOSXRG};UHLQnvE7>xWuV{{$v|GHP+u8lu&;453T9x$l;%fIknSS)gkHh>Q4j!NHpfr8;;Sbk8 zKiVz+vu@|Z`TH;K^u9hhukhfWoj?9;_V=%_*Rhf5l{P=fD&FhjwK?tH_ow&PM(%yJ z)*e12g;;$h))`~NS8kne znxb*&(4jr=GqdwI%k z-}iiqov67sO?gt%VS^>^+;eX47A@I&LiO2`+lICOq;w)T3-A0{wl)7|{PJgC3!hrf z{rkxBT}>w6t)(gtpK(|J`W(iZvrbBtUsWmP+M39S&1t-GRWDW7|G2!!OU28j?uAI< zj=H~9HoxC&o?%g_l(*-j+n4wE<4-!zbk0&NdwI$AXY`AE82E7s-dao+UM`CHIM60 zpI?7ad!Lqdda3n(t#3c-&)YTI{r$BtfB(O%-&X_W*dFc6xwnN=e$RKlxSF3=C;P4M z+`%qa$KvSd_{!qvz1g#>WIo+HCu{xT#$^BM*7+PeoZ0ywEsM_AE<88kg20jE|G#^4 zSiV?q|L=gi{J!-m30|9@?fCR6+s`8WNn*R-+=6!-9=@usj*8Oadvm{kzWCoI*NXo$ z^DnCVd+2@grgi!I=B;J<_*s8%&x{*4ls=!F75`_y=ZW*@?H%Q&mA`G=p+9FbO6~5a z&gd%_XTHb!mbvzypLW*k8TPNc**ZTg=diAF^}{)Fy8h3F{+8u_RC*l$pK+$8Sxli{ zdP#PqyjwG)HQ%zNV~4ihD7Rqtzgxo>r6T@!=Au2^3v6^$mU(-7|JGl&b&rUD(H@sS zXXaQ6uMS^-tXqHIiaLiYmmWUJ7i^rY?jQE(!^-9JoK8>EHLUuQ5mW#7>x=8_=Uat6 zn_-aXGuQJbZR!HGG%JZ2Not*xno4^hJNN@|mob zZ?2m=`#^@qEH15LFOda*WChb)&u{C!u;gC-%ICLQKK*-N|Nh{@D>*JL5&!1z{oK&E zD&z16caO%FX&0*BhdM0Lc%iS=(G`^AAsi485Gb%aLeSAggjMutSJJ^Y6W664@ArQ9 z<5G1HI#oZfbMrl&-6zvdwz2HDY-fIR&$|5C&duM??fER48M3)&iuSxuI~LCWt9jA= zQR)e1bFXvtKCA726fT^i8|JWX|DvvySqEp$HF`4HJ|*M6^wO-Ehn^Xqd-?O#_Df%n zwH0M|&#LQB(w6&H`$I7E!iS>uUkmQ++M4~O?V9!;tA z-%H)p_5SAO=xKU!I>-BDjq`qgl{PVP^8NDg@TcGT#wn+s#6MXUeaq`7m*|=Dd#6@S z)lND4>Z)77`nbhySJnlaA6;0pKksdn@(vOGxELw(+-IAfSyg>mab~Wq_qwdYt!rX8 zM-{w2J6(T%%-{XlzDaOmH`jWp$3&%P#V6K#+uQOCucdE0kpFtx*`l*sbz{Y5 z{{HrMs_5xyC%>+ZlJ<6UQZm`KXye20m-#367=$kM3JvZT<+uOwL-=R)JDHmsYj?kV zZu)XTxTkVc?QgTgYn)oU zE^P=@=H%lud%mk*+-|Y|>FIh?U%bdTIp2PN!qu#`>Tg-g-``U07S}Zit4=*NZR#=K zS+lInbMI(eUiK&J&hy)MYPv(#2L_*-s$U;>e@(@Yb2Gm4GN&&**Dm)WcZN}%W=DHF zzx*Wec*#ef^IvQYkDIolDKKbX4eLRzFK4&A?>;tREz8FZH$%@peOGO@e8u-4A0Hb% zc`ELDu5-_iR|22UEI+&7cfQ_3!H36;1Ydik|NQc}UqwyrSPygg>BC>P-F@!&s?p1V zQ-e`;0n3yIp#UZ?h1mid9z7I}T{rRA)>BI|O8dk2P0f1Bb^3sx?wRLn))up|dZygF z^Xd2{-D5@*x0I@ZC?&p)mriYreSsA+fpIDO`{d88_RF!%cz2Y~G zH!%)nG*61lsfAzBQBIYu zI`Gms{p|PXZ!WVxWN+D=`L<|flxN@kJrQ+3vU_>nmroASntMsvSn*|#&DVP(nIVg} z+`0Ja{@2ah>mmc@m?s}}yIK39L!|SJ^7Xhl&v}x@Uu{kwwr%e_v1se=CkZ)w9$w#5 zS9$sTnt)AHpDqlxk+CXSaoSaK!Vcy7KOc`9RenmDT)Q)9sn;{(O}gJ-UUr{ln*B_O ze}2UyPEr25Zud9!RzJD=vHnDK|2-vDuBXQL<@&m(_p9qqYdLcHnC#B5)~AyKJ>G3d z*z6ssQQsn{v$o*`|ErIIlb0r~bV>_Pe%=@{b9d5ioAP|`ooli@uYWavW22&9W8my1 zuB~8tT6`+=#^YxXFHOJgR+M}>>zRd|-gg^&N4b5Ey>_m;_tU9kto;OPk{9c7< z&1>>m{(Rq*+3Qznmd8yGits+)e?9!8z{U@!&)ZKfoL`f+s(#7+X16QO2M)__`QBWc zdifZy(Wl;rZX$=GxDyL6HnARiyV>RBB%{JZERnlXHg24;I%exCll+hC3ts0K8?yZW zmAuR(w`?iP(=(dIX@6CH*YEMNDu0{C_dDm$aiiDk?Ux=k{XdzBl}ln{C(rZqHug6< z0y{$dZS5}X5LBPzHQ|w}mqg>*jEjqcc6bP$l$;V=ko@=Y_xnrY{{A|qJKN~l-SQ_M zcLXhKtxj?*jwn^sDBJVcPkG(dRk7}7`L|T0&DTty9xttRw0pY2^RKUq_jkHixK38f z{3f{l_Cx3R$>wf-lUCGEQu<3RD3;$9wehsN#=Kro}e7rlq-^fYlkYSQSt(?IN z&y_K%kt)ya`XvAM#avs^D54v6<_qKL{p#~8{mj};89v-+wcX2Xg2cb4@kKUv7bVoDYRvJ^%a3$lHCAO5@RNglXMOTmPi;32KQ;aGbnn~G zOqagyJ()OlTHXz1{n{_Hd+Oiu-P~jy75DE)d1hT?rKZ@_@NaTbfDTx>Mh z>kaPK)YUH5a+m$&f{8?TCpx*Wz@C}h3nh=-*z4KS+T80?`D`y&D*Wld%8F2Mtm!Icjsor?Ut67 z9XdiMPx$mW>nvFFbYWM!X1n0Jo&5bj0$+t_Dek>xW|iNw@W*}oC)Jhf+`U)67kIyi z*Nsh=zg2&k?&RgW|N6fQ^Al^ZiTwUB=uY{Mezy<1AIfVVu%DJ=sCPK#JX>Pzqr35{ z@fCWNt8V{~nO^(j?0la;N1s=3o3fyuNoRw%LGeei%Ks<7x$U^K<@E-hn(9q9)$g|& zW&bq0x#RH$mnVFN_E9>T!P;9MzwIne{o!ox**fXo+S8YQ1^&{Ov-?$GpS-c{s90F- zl<#i)bw3_|9DF3#IfRRo&oFOW1b3grw_SVe9{H}%I~_KsFv{uN|KItK)qcIYka%p- z$JXcbCfe2hmh`saVmdv!pWh%U==|@h(~Zo(pLR0#&&>W*&-M1llf{Kar`K*jnfumy z#`z6WhkxaLxxs(t|M7k1w>ZLfgeu2ruOiql>1bf34+Uh`T&Z|)<-!vF8yUyQA~Q~tj) z@3h}Ve(vMb+3eN(ZS78U%$vvc_JpL2&U)VJ!>J#Cyt7{1< zF5GL7$r_+zJijt&!s=MRj{>V-GyavIwyX5D=XN>USl`O(C$o>u6*o^hCbXv0Fr(FW zP3U}yA2YtZDBUl(L@-4B%>3t*Z*NjR?flM^>4$PZuYr;p>qmj|M|yW{)tOcWY@BrZ z@65-R^4%A%x9v}4u{&n-w&vMS@gN01Uz;u8Cm6Pfsy=#nMRWhD;^uf0o(+0W?gdNq z&#(X1x#!C%0p%OJqve(@f17E`{iPaSFM})T39_6KA3tncoxQV&{lT^~yJTPQOMjpH zlIyE!(jgt?N4)P!=U!PiBWI5Diw%s6>n1YJjXE*4bh2=Z%3M2Tejep_@qv{;zG*+* z`F*+f#T7Q6655wNtNu6NT*>DG&jzL?J@fatT+6$yzy5pfVUXE4{IBO-l4F0zdF##3{6~*@uUEW(>hD`A?`-)y8){!(KXvxEPdvx$ zwBD&<`8V~?_smTz;XLBpayD*#oi^|4sZ-ehy|m9gWG&S1VZ!Ops=PjN{{PGpp)Yf` ztDT#cTb=y$>b(KUYb~`EQ*zL-v1obYA%k<=>wVZ+@g0mhaU9;e8WIuiQ zyS>zV!=J~W%&#{R%Sb+6`=)5(Q=689p{v8B5>Ixu^M9%K(9549^WbXKAH`2MS|oSq z_gB}idGM}#tIQ)so4CrirQx&VYhSXSoT|Ou#>&9b+KN??r#$M2yjRr`=f2}slY3j< z*;Y%M-{HS6pFL^e1@jh@dE!?rKXfkdQFyhw!s650i<9;{e6l?fv@!qv@19WAL$jA3 zG8K5eVa{gOg<^bR55AVn7i>_b`Hxp@(s=UYOGkTz@vSF@Ck^=*tLmABMQz{dd8>TS z-K#lAoOKv;Yh23xwy=NC#f zi}+Y@Bszcg#>U^DYWGe~HrV&^SAb^ZswsCWE}#AMp}F>)Fn?|C?&FLL%BP=#Tx?>t|D90tA*DL}{Qlp`Qw{Zg{hC^> zazt>`o4fCyab~~gpZ7-LN$L!<`pJ9DUziP?lmRZ z#dVWBY_vG{f4gz_Z1C5ZE#jY+#%J&g*GDS~$L~F!`sK*ax$O0-;n%eDk2tTe`}aM1&YPXnqdy94 zPu1zl5fTym)X{#pjd${?soJy8&#hlGqoZLVDDQlG5pD1N^HJcX_utawnh>FaMN-g}#!Zhkx4tNYi|0%U*11?ySGBn||Ia|D5vim#xve zmnqzq=?AkWy|<2w{@!$FYVO=H8y5wgs5gI}7?!@eHhI<6Rh1(Ah1%PgqCPQO1*+Bj zn|Wrg@$DUNg~bKL17o5$CVh6baZ#A{^|}0~Z`H}R_qcWTKl^VR?zY!j?dW%ou81Rw zR#6`>WG-#>a9<>-b8Lgw5`n`Xnm4|eRGhSqvBJ?8rT@Wx~xdBFoUqWp7j zPU~d#ERt%mnaz4jR^zQ&+M~5^|J4>oP5io3JkIFd(T?_a-z6vVw{>hj*Q8w>5uvBN z#p-BU(pSZF@JOEZT#z_SB^M8k~<`KaE8PpzmF4iuD;*@eO>3`83nJV2(F5+ z_!)X~y8V9lj{(VYRkC5fT0#9daDB0WWy*p2mIm|fsn=dA@1Ld2zNmlZR;x~TL4JN0 zdGntvIg;NmEB(yADfaWr&nI8!>ZX{?`*L0C=d-KTJ<fzN&*Qo%4ddxK6OGf)du`p+`t%js)Fn@!PVMn%U#k48WqH%; z&AUGe9Z!7f&U1X;c9Ti7*V)*&OsYh> zIKp~6y7K$S+c6KH+Q>Fnf8X*`I_1oQvSZcUYnK$Qbc!>Tt8dHQCc?kmZ?2Z_Y_rnN z<^zr%a}1N)_Wb+xI%s3kQIV4&a}q*qd@Ox72px%4o-nk55N#s*UgQjCmC2k&;x-HBZhsG^uaSl!M>5mawwdzJ6_ai1~C^ z`?kABv=rtwZcpm3UUNUpQGWU62&PjUSEH7&b+L~k>W{*4F{Yrd=3$qkoM2a`QGn@n6CBeb*2Z8cphQ3 zT;1Kitu|s-Z{2U*pZB+3mu!6hQeDoxNu@Js!zAS}71ark6g{Kne7|t)vGOwIn+<~e zci$VoyYTbVQ*%S9xvb%@Pn^(r`Q78c$RkD1?6$pTM~-mn1e@LDJrKF!*Wpm9j~{Oy z)c0!bnzy#}va+1j-D#Eo`0Bo8P7Y|F(PJ|?*R#LE3xc ztDKm4a_0G9VgBc5W~J)rt#x=U!Y_C?u`j#!&&S7Vd@9#gs4#v?sa)|W(anZ+D<5(@ zrSXlA!qyheYpmj{cSebJOMVpaKd8vB(!O9(&9B!&kKJq@F5MlRaDcb+*rDD}N4Za) z6cc>ck-sCkevP5lp#zz3__r`cXh~67z5R`GXJB3Qo|{kX z9sVe9^zLP~AaGZrKti zflK-6>n5F#+o9ds@ytd`_hZ4iuD755@qbQzqP*QB+|9-DBdV`yGn2sfz zt53-mpP!|hV(zb+nsaNz#R%?Q$9<1vy?t_0_|uo-=FNL5JmznR%elI&x8~o;ipN>L zVNcH6N#@^KE_mA`B1!lZOOTC9;wk69@}<1WMpDJ+H#DfItycdi@OrmtcG&U`+YSeJ zwd9thn8LZ!+IzSkeSIib`_=USG1jBD(%t^Q&KUlcf2AF}>;CLV61Rdjhv`nfa5Vno zgma31`#wEN*ttC0eDaJVV(~|vUsv@Syqc#flYOqV z-gfH5`t;K`)NgTmy5v+Q-pMaAQVfjyef$6izl+PJwbhHCK1(z05r2GV>h0dNgHnHg zoMd@f|2*_r$)tI0t*o<4_v>~{tY3d8Pe+V%_O^_>d5`VhirjnDH{Yl;ey?Z=V@$8D zq}D{8Z=L1KXDnI&B=p15`2GL(#@+j$*jV$$$G!8^^fl9u$XF`c#{G4RGWG1M^oZZJ z-zMa@%L|u3UMU-R;Fo-`EMHCux@L-00XZDlk5rqftu1X?h zg8OD{3c2>)M#H^N{Y1NeX~EwQHydYcu9?mAs;KvhM!d_S$B&*~^-uFEI5)>=O}uot z`My~jo$6+7b(7n>d*_vPAu-qT?&fcj*t&DmF7E|fcB|Uv?TnGy5t*<_IkEo9%Olx* z=RH0OoZcC<)Z2S{-ghq-mzK`E-_J!W`%YT$kD2Y%uhQ2n<_UMAR)?*AXUJ`!B;w?A zbJNo&_u{_KOtzE#KXFamRTcl+~NHP2H= zx7d7H+W&=dVZqr|q08)d=m(#8@#pT5&Y}+w7$^5iI!=5f!p~Xgu*W9p`@{vT4|!jo z`}o*Sr2fvdn>Q4G`nbpU3kCQ zN3Hmp(vFi(Z{?JQC+0mrC;REdV&*dvmQ_zW_L%>Y{k%u!$C1hF>K-Ni`Hnzb6xyD1Pv!D* zU(@~Vj{df9y`-M#$xSlJ_+acm`}2l0mB4=Uj~AwI`~5lQLNR0%7}k1lC{s*0dN?mv zYL?HDDMv1+r+`Kx4U$_$GzAiMcsIWIoKo5G;@a=8o)9$@`|IbzHr(e(i zGZ8CNu~?`eQuph1(7|2(TkVf|cGP~~XL7NluRJ#X{8PmnXR}^HuSG7ce0jb&UOcU|*RNqiM$5T-YkS%rtX$w|^Y@;}%}ND7 zgD@q#q<0q*Zf?^LQ}c;e+j!jXE^3opgek2-JCUH)v_nL-Z6W;WhQzrMcqKHewWdo)Rbi^=z4 zz1aDG*Z%)*T)Zw=TKvS1klP`B`Zk5EdzWfGpRwhLbKk*7`Dd2=bZQ9XI#oV7>gkhx z(b7vjg!fgwW|aJV*XCyNkB*jBmf7vx_G!-_9J^nCWcp^GZ%gM`HuoG=Sb5TOvz(Ze z&U@ah{HCR!{<7QaO|cit7fVU0YvHKp-;zD)5YwkOH;X@A)bCEYwTD+N)_OPJ+Swt- z&n~R^F(okmyx~S6o2jQ)O)+s=wqI5GsPmeob~W`qordk&T1}iviT!ckJr6py`uH3X zpI7T9;4UyhpwLFth*kJ={{4M>-D-|A2`UOQc5cdj9rpO!&ieay(;HekQYS~m_DdX+o@-dN7TNZI^D-QIgkhruk|J? z1^!=WTJ!Sym7mfnfAqV3=eU{h{pwK+-I+8|ZL@Lfo2wmN+}Gb2J<`fu5x%tL%i9Yk zt@{c$viWQi=C^H3`sn$osruc{<0(Brmk zw+H$s1ub%M75$RIEB2zUYPG#>?U(Jn5${@C+N#b9z46|A&PBf?*t4_K?a9}z7yM&R zZ9K9$Y|^)w@{bql`aZN<=gqUJ>@8ij{Ll}@NRCG{i6Q4QM4nx()5~sEbtZP)m}zb^edCHVT2Chl@UON0JVi6u$H%3s zG_$N}TX%|1NZ!7mX`MYiCStaY8aI!AG7zY}ZZ)+*$V2Uc2*2?x&d4Q#0-gzrU6E(# zpvi8E!vc;Np+|}ZIXW)cnvXqgo>;KBusH8Ko_h0kp*UB}(Zk%TE1qjNzVTNGc%=C8 z|FyNT%DuBqrpkT4JO8g^CO>LH51IQrEwm%$h_j31Z*|>U9BtqHqmKXjy|=6V-=xc* zryN-7+)z>J+ATU+NYyJXV|mV*Lt3G$Q#H#!@w{CUwhT2-fDMmqI-sg7m&Q4(&uvA; zjH~ZDwz*^T2gK^VEFm^N`iAoT;U6!!2UN{K?!$srz`Z?9b-|;=hP>Xcc1EVvS5e1% zz|jX)o+8C4%Fo;qb@VVp0-#r+*9=FX6Fs zlM={nCE=SUSL{f9Us(BZdhaIfXFFt~|1CeFH$!c?-%*c%f=Mh-&nYJ+s;X|P;@M1>U zdD6queIiprbcNp6+jn$Zwaq8oUcXYcJSI@b;mMXLj0^z_yT&z6pfI@G`9?vmZ^kai zHoyByJ5@bDsmV>8dwKu#1;jO*yPgh<4Kf&0tSyf3hPH9p3 zseShKQ-Xd9FR3`VdD7<(emlQko2_c$KH<;CikUu zrEOF6=U6+iY{lcZZeOt98rSH_{d<4ba#KNdPs{UjsuR;6sa72KvfP%oZA!m|+I2Gx z)zZ^bCkRz4KYh}9xk$q>aNm4e|GGJw{noww(&7@f$4RK!X=%tr4#|5v{dRHAv#ky* zdU7K1-;bbg?{BMni|bFCX1-<8g$n`kejh8&^kfDvt!d>7T3IAI|J99+wX@em?v2XZ z^D=FI-}Pp2vO^7_2ba_)+$&8@yExqfac9$c06AwAIFY$ZHu`+z;9FY^T4$sa-Ydv)B zK6&qm@u!#Txu0}J|Mt4~iTBBrCzDt#)tPUFOZ0{rkkdGH&s*D=Wj#FSok3K3cn5OlQKm zySsju*nF>fJ?(7J(k#>Yeg1D3^sIT^B)wP^GfPfsQ2cQ0g5sqWg~B^m9la{v+p+xX zqZ8(Bo_DLJpESL`ZBNGAQ$5_v%jdq!o?XH_&q`C2zgE`srH!6;cl+YBHPiXi*G*J% zJia92LZGHtiI)!7+yDy3O7jRN^it{0-&nLdc{$A?wGN{N#Bcv{NS8$if z&fp~#vX+Hb?Q^CU7d;PM`t)0givQ2A&*!K7|5w{&`Y>14O3F}w?WDj*iBZ>gUU*-g zb6?Ni@0Xw4tN%Az!&D_Bud|xFX$N2?>P8)9xvD7rf8j?CJMcQkHm|ObSg~Sz2rQEE3uwjbr?r^PV7CKkCo=<$RM8$GL_VOqE{F6`YsZ4o)kGbgA8jpP|oPt*Q zXx^+e2vb{crINmC+oT^&SD##&sc=#=eW~Bh8lxStmh&al)znVSKHPTd>)QM&XQj=( zoSd5OT;6)S^7*@)d!q$-3iH>+EbW?ORjSqcRPoT`cXxN6S$AraYPYJDRTP)FrqWkw zlPQzc{b!x;legDf>OFnptgYF*U&U`JXcWrr>D>SpM13<@-N#Y z^LV>rzWKTLw}pZh`K)3-eQ2(A*^F)OZf;(^v$m@E-`le(`?=rD|KDQ{w(PnYdUk2d zPp(P&^>vXuYi3?q8SNjoHbyc1+#JLEfqh4g&OF~IYpeB8P%vnxSEy#-rX@em1;-xs zo?>u6_vRkYZMk=~Ht2+`m~drPaQLCahtHOO{P;0${qxJbm$2m)g;1t<)7sa3Hd_;| z{`=co(UOKssi!2ACDUiDYi8#^aqR2sv$J}?O0PTW+9g&R+kXD~nkdb}!a^Y-AtlgS zovx``)j93kzbZXS+(^IA{nB%xi?%KRBom=y>S|5k4i_l}|mzl6(gTZ5`*tJ!?A?G(S`Y2Tg%Df#wtL&3%i5Ru zOw*6fdZin>YRgXl46doG!=^g5a?L(0;h!D0)+m|VOx1hZq*tcdUgzdm8vhNKGB|zs z$B!SyGw;pTDRH#kptrEW-o=tohv@0M^v$AG$%iBo3qo1EoTk>F! zl91BVZn0^594%As@4Gw6*u>>rYm3*-Pok;uF_UUGC+wcH_MTUtTiApnn-@-ce8-ZL zTkPj6!TXQo^y0Pz)Xg>v{lzbn;$n8E?!c({G(@!IdFA3C=`IX`p1_m_uOTX*}Q+x_iq|2W4Et+b9;CAsqhsV zYx8oF|Jl~vVGr6CQ+fILix-EVEv$+D-S^D#yz`~K>x!P9K0PJAZd$7MbdSGn)4k`} zRHod$Wm@#+hT+S5o2MsM{P>{Qe|`4^!xhi5G+++wXPNWb%VoX3ooqf&R780a!{(Bc zNy#UQe#e&2o*Z$12hW-Hyv^qzyGH>(A^C+EE~=8NF_f;9mo$ z#Jkr&{gOWC{62SYM@7dD5pnVCmgCCqkIq+JG%M><;Gz5eok|6Gla#~-UI zKAa+Gdy!p0FtYx3^@pqC^Jkmgx%pBqJo?3D{`>XX&GYKQ%HG|0SIFDPwjtr({j}cv z>km9TJuj_I*I%!A^-|RP%M2~f?<(KL?Cg~|VJTspc;m{yZ`M5lv!_f^nP2l|p<$1c z$TEX%ixw?fQoOy|IMyNLqk)6}!8JN^_bxrH%M4n+>k4Q8^k(n>Qzmn!KgroRYg29g zoGJYr(|#TOeCp#1+aim13!dl+sJ42CPkh^c{?z>Fey@PuX+^6NTs!@FCK;!@C@B@4 zd|n%T-*-btXKBQmh{Byux0O9RZvX16`I&Wx{zt_<-^KmMLL>J5+suD<hM!bxAh5gP@0XoziMmD#U(2( z=gH3Kx086i>hRx%CP_B}GD}>OcW$cW4!>P7L*TK1;D_&$m(S*PmPYq=c22vP-#dj% zRQu%Jxx06i&8tYrzq=>W>R#pa*PHYA%~CktCp)#e`fmQKvi05VC)<3xwU5ox11P+e>@fEm;@Knl#4km7kDww0pj~T$JvD=YMODL~);+YwP{*$6xcx zS33{775I4Ds2Hxc4qoGWysz%K#Lp|MCg&KmF8F>fI$tXA%H$2F4fn12o+%yH#&2tN zK-EcziI-VJTkhO!>*HS-AFE}Tc5Zz#qx_!V!q${)`~gP~GfX^p>e0j5&T&&#Y?u?Y zIAMi~+zrKc|1O)9iygQK6gUpZvT@f zgT6lXm^Z2Di^$DMhnF}`Rr(aO+bA>WNn+F1*zIzAdoH*=Y;RD#d$^y^fS;@7kfQ$H z1g7&=&F7UK`Ti~aRQYJ3abwrtkG4PGd|tQh!{g-ZhwL{hgG10ONXoQdMQ`)oF0a-wQju12EOyH zT&L;BDy_YJM<;Z3csXa$H>DkS{pNgFYO?>ARPx>zC5qp!3FJRYoT?QX9Pvx>-oshl zSLbb3Xxb=dTm5cL&F`<_K`ROpGp|1^E9Pj5dwMFgM|{5Sy;p_#^4Y(HKYl#6m_Pjf z{Q4Ox{5D@Ui0HhqJgIg4(63FUvuFE+u9+BL`LHrMA;q~a(evlG*~&c0JjHjezwBuL z{q2qE^^L6NsXQefm$>}vk2oK(?P-;(e>GDi`+t1hA4h?YRd=piUoD(;t4cm_`un+$ zk7cQa*?dvEVYJO_nqDeThtcL06%q=!A|q{Lte#5W-25nCbHe@wM~=u%-&&oNa`Bsm zWsQbg)Kx9D+-&jb50+S1)|f;&af?hd-r0TXm92VeXiSI7wB1fgPF)_0o=lUmbXr=w zxarc$m-{zL?Rj`aW`>2p^{rWNtynHUxmo}B<)&quAH}XVGe7yXcU^&O`%I(VrthY; z``iC-dhPz_y1a3(z{$f0#pFW%tXOM0U;X2SNOu0e3)k;a*}m;{LQL;nd9RHd4L`j; zZ$G=|)El1!w!13|lcz6TZ2nPTwR8F&u1E5Jew{vlOw_u(Vn<7B+sTuY)m7XBCfHaN zOvv0<9c!~De0_{!KW~*0YZ8lVnTmk#+KLx-dl`5O*M?#A=|9X@eh?G>NVaYIjO9&R zrNXi+dJ-c$ytSGH*X?LIq|`URx4UENy*H8dk`H+m`L~DKJn8uUd}W0&|J}{H=VzE* zU2~XI-0fgj|M>#XV;yQ1=^F~Y)y~EJ?kk^>Y@-@ixc>NF-!FpPK97DSziDEBFmrRd z&zk>sf8~mfekis-e|c+M)xVn}5078q-O#t^^}KUxduFPCobWnfMat=8ysvv#TeNva zy#1*x_s^_$R%CXy)`rb(_V4ch-gGbhPQm<(aybX5N}A_s%RSoJscrf0?YXAyX&xRc zKIWY{v*=M`Lq>Y)M}xAzNjDAOa^Eac@woQZdxC7?@+a$CPd~je@$aRrmAN~YSDJcu z*{eA2Jf!mLh@_?5l<;Y9J0{zkAM@%IEB8+N$0a1<7Bq3rr-0K+m)2x$irlol=+P0* z%GbS#lkDpmPfoRddRX7gEUZgRH%(}H#K&_ly?o}{q}0#)^4C?IKllHR?K@O;yNrNCjW|A<~&k#@;f)@pxcK+{WU)gtTwV{+uxZe_}OF1#SIrl)%q6bM!cQ4 zBl+?%UbSm>i^SLMICn(*TSWa4=Opc@>CuyB+}hS#UEfn^x=#Q!+Z(Dq?eyKbyJxv* ziu`KKm>zo6`5hyh`l#EGu< zmXPj_6Uyax?rI*r@Tl(T+1cks=jm>)YtWKo>nI5mSn!ekqMW)s&X6{o|TAxl; zRBk)DF}VH7MCtWY-{nf3JlCtO^6^ckrSz=muFy5A`}J?DtnZz#b2YkbqS5qN<%5C~ zgH|Q9?75_CDe0MY^w+D;iroX#%_Dw05(O zHE)^iW0-C~(t6WfaiWiB-OY0gwq7~f+;}GH-Vx{1Cv6Y%EIZTL$(c6&s9jEojZe1A ztM912cF-`=e-4YI&ev8+o97uME}4_K_5$;pTjJfDCS156B3Wg~6uCXE_si@5D?Ifk zO_}k+NT-l1|F2x-6;bC4H>2v0I8U1RK(9J}KKs&)jY-R_cxv5xCF%}NYhRNtxW!=2 z##Xa`w&`Wl1o#Wj+7&9@6Lp_x7IoSw|Ixy)4JGBf+ax(dY&&=DTlYPapVPnE{>J&E z-4UHCo?9O&9(uMdH#*i*)MA1`R?q&^>oeY%$}Ov3Z1r|?h>g$eiSh0!r5`_h_?Elr zUAz2}jMglp;&V2YkLPZG^5y2_ON-oGGw<%178AC2jmlgrHFbYg&xMy#Q-4kB{dD9- zzDl?Y=gzICnS*wuxW2slQc5%Q&wZbh^Bfd+J)9iBrNZ!KLA6(Lbl>yirbRzqtMytj zM*VCQn7<%+dY;-1O>5)H`+i?bQQkGYL>m5PPEe*$t1uKU|bse{HamxafvZvOY@ z@C?)MwNC;+Cmr}RyG8R|l3Zsv2SYcf^=|(idC3PomOW$iw@Ga}x$AmsrS)!?l()OK z*0LA#%&B-GFlCy6f~=goT@UperJg=j z{k~_Cl56*=Uh}(2F6u_Y!u|Rd7B_Z061vn?sxOu%v06bua2oe(=W7Sf&G^1;;=9+b zue?s*y`gqnVV^=+{|@Hjw>M@;be<4?D0J=8s^h{d-tYSv_3iy#_3!t}_iudEd~i|g z=hW}(VlOTIy;p7Wrsb0&^G=(&JDtB*+rw?Tr~cA1*F-lS)<;n%>sl ze!B7R@298F+fQwqZtgX4`N5m!@z;J|v*1{)Iq5`Fp;hgx^~YH6b+wx<)RuCYoEAPy zM({|&k)v~2Z0|kt_+>NUa^-@q_LnTrUO$YCwOJxxtmZT2$lc$m$M4y0Dn0JEbJNSG zo6?TP+}xA5uw?)1G|f5s)8}}4O<6MMpi%O_s>@Jp8EafxZA9I+}Z*>I}+#N^{k)YSt$ z(vI82?5^7CGvDke%QV+L&Oe^C-}|*}_F3k+?3`(@-^g4{d!$$;#Q##;G3@8ZU@7z5 zw4|s4z1`wA1)l%kt?5?LwF#*E^{`sm=vGeXo+UZo(na|%OZEQRi!qA);1DPqW*u_s zEmiu+6)B#S>S6YnjaT1X+^XV1!-O-FbXn!`7m(*zZw7T=iXEwUauAe5HRlLEE zTApcbe=KTFnmqmP`p06T*~bSD8~twIDR2BC!#G8LtGaPowWpjwgmKXvQKpT0PimyA z4@JjrP;@pnRJm(x_xqx%EwJdNIPD*93@bGy`?31lDdD~b*T%Lo-Rj! z{CF%RHtlr8&ZVI>vDLe-A1?KqXOVbqbD6DYtjH1XdhXivUTG<@X-aYm)27{f#QdvT zxBh&xuD`Ws#iNxK$zA&n?>#+Tf4_fEP2~IHS`&s_&FdOY`0R0Unlx1}_}EpOed?Ut z$76hIU5+}}yT?jBPZj?-Ay4J#QSU=-bA{>)ri+}AR*}A@Gbz4)o`$c~l_@7yc$}0B zbeNWZOSN7nR=>YbM%&cpjRXtFVk~_o$oOBQcN;_AWzZguJB8uupn)twf#p8`T(7N* zQ~mqPewvb9TG-1iUG0p!gl~Gpm!F&RKSejc4SinWt&3O!B?K^ygr8h-1}*KnvNk&0$;ruxV`l!< z6%{X})os0S8~a-5#I#2b_tpM>ayx(j)K#IYr3wpveR=8T@Fncf;loQyUtbGa#A8QNa7~-sA7t=H!tl_4?Z{7I{nVfpVb!^ zxf)e}%lT|6)-l(*eAR+A^W)>#LJMHsA@aFXMY*W^E zwKE=FJyjcdCJ@ElDNKzy>T-uzvYjR^n`2pgtd+z2kdkYcM?}PoGjpx4ceKB~z1>`_ zP3C<14ujxdUtTI7Ja~}t=;}v_4j;3g;&HG8$iWdpN*tfI>vpu5U0b--X3HbR<7=a~ zdZnG4lgan~+S=Jq&dxSpP!VdwqY<|@26xI41|>)VJ->$&{)0yI`|bZ_upD`Oyx+T# ziM8jc;=7X^z1-q@Qz}0{lU%a5`unsA6DBk~3jJuXpkiwgEC4ZF+UTP&A@`_rx!Dc_ z{n%YsYI-(wR75QG5}jUQk$8y3vf{&nCnqPnSABak^UzaEfjP!bHasr7xA@^Sk5RS2 zkVD3{>PqQNnU5boHu|RjIlt6zo{eVMip}rNTx-3V7IJS(=479lMn~ra?ysxOytij( zSG#y}%L`N7bFu$6vlzwN_;`3s@SLo6a-y>P65rWoLCbt3#cQ->^6u^mUFJJm&C}EK zSm@5`@9!pAm%q!InETV-deWB17#@bFfax-gKH~fvHRf2AuHsH<1}zy&O1G+?i(T$vrzWGkBVQ zyx!)tvtCyxO?bR+_dBbVaeH@J_SrY;Y00t8+Hh?>q-e(Cvnh(KEiyN4PEUwGhbvy;|?<>Uxmv@ovl(>T_!D6 zkU4hrDCb6j;-{xnCr+IBtXhY+F!&r#w=;L-(Zde>=4<0|r#frF9U6}m8wB{~*6Wz0 zUwi6s+@fTEpq5%uq5i3MWOBNlR{3#f;Eni?%uA z_G34wqG~>RSk-%4%Est5X9F?k>Y&c}p)Z(mVS!^?Y538@3?1#FS|KMkNG}o9gi2#` zay)0w-Cdy}HeaTOS@oapn9&{qa*^MMsvWqC_BMflj|R>LRqI@i9%eXnbrtSFWAXz{ zPb-CeG-xQ;nuRl4HZ}+cd^Bk22({r+h*=wjJ18EogxK&XB#H7fbA+!B!x;`77NC_1 z9T9`cdE%W1I)&9$^z{6MgoK{l*;y>UQnV@(6eJGclqM*<^Ko)>gLW8uR8&;V>b2im z)G9OI!ck~@uBc_9(%HxVFSEC_duROQn)LkJZk6!4yCnOZjvnT5|CQgWCC4VPE^IAo zw$)>5oH0WpabEnclFXB{&DXQAv&XlDrJPZnt`n)mD`j$G#;HvSy3?!vU+RvjT;k{R zb4j_&(*Hj$FZVyaG5L7P^>wjAf`W>Hfq`+_mR1kBEx(<;E;L8I{|N`*L>bHGOZ5l; zUyyu$ZqC%=<&&R$`S^I!_Q$f5-mmkMyj3mAZ!D62>J%uVFyb=Bh*5`c@#4ix-Fl^N zMwx86p;x-`NznWFs`mY#0zMk-O;!syuB@~!c6S(;n9hrfOoH8qUmQH|<$!cee&N9V%ko#5q0Z zZo06aXTVFNpdV8gN?vmpb z67RkBFJ=Foaz1+aOW#Zfx&E&YPfgWcTJ!VM^Vqcf<+oKWbhbyy{;Fi&U}rP8Ajqr6 z@Zx!?bN0SR5A!&$e3Zx#n03_))=UML-VYWDpLlWf^3it}AfE7k|059Ugo=#k%d|#gGzx*|sPkxfnJI+{iUpNqg~w5!v_SzJ{lC{81G3Fl^_aeU2Xf z(i0)8|8n6}!{cdNDkP#dO=+2?Gjma4y0GxmFAJL|?MU}OW@0t_%A!Y!W;+8-j8}KI zJ32ZRz1@0!nb(JY`+pPm)&BPS|L^b8oSU2MF56XnSirgC&B~V6R?ki$)g@k2wVb4L ze*S*HAJjly8K*>l;)D}Ap_*N?Yb8MAZK zah=L@W)sc!1uk}besy=n$0W;=7ZZNk)c^Z)X-j6X=i2}0xK@R)*L!+u>gSoSTjgdb zyYub*_v`i3H#aw5S{rTt^2*A~tzj#lBQ*gZ*n1y{|2UyH=Gn}9T%T`NeSKB=r|R*s z-cN_P^-s(&OjgOix98KR)B4^oFD+e~eSMvHjr<=`Zv(T4&1t?}uZ_>^$L!b;>1^=) z9M{qN|K8r&8C>@E*3(x^e-m>Za?GAx-lqeH#>iy=45q$ zGx?AI_4oe?;u6)GvS`(oTO~JBr+coC+uJiC<8|S-&XYII@7E~X{K$1|d3|H!;@3wT z6n?$i{r*%FEBB>0_N4*;bGP4}mbrMwHsyVn-c`Tf8~$$J?{^|P#)}lc-Lp^+x^nvY zx!=$BObd1?%V*B@eOv8cy1cZ;?Mv`$mxRmybO{w$(V3*(kZEC zC;9JhZ>v9i_%Q9<{SArE`)^H|sQ&Zz{(k#^5o&&OUYueAO(sj|ySTcZ^w!_|#E7lp z&&T7v6K=1M-`|r{cHk8_hUeFQn<=6lrsMki+4=eT$K+od9x;0U!)LW}ihlavnW0C* z>wjK2?=DyAA~081-iY)4{r&gYxp0uBhQOo5eb01LvgiK}iZM-ZWD5HAQ~YU3%$hfK5C5d+_H8h*oIc^f)}@wB z%}?*#+^qEH=kg~UyiH|re$miE8TVEk*EV;3D`uDfn@9Q1!mp7lR|8L*>eZPBFJpZLw zohf|$Q^0dq*ThZ66(16IKI+o$@yNKH^1AZx*XyhkFN&2-k*oa@c>VwCu(ew6_kN#O z=~?w^fAJN?C4b-7|2N)!>YmHi9=WAo__KrGIrq!i_EenMZ@jAD{|#6D&{b1n%I}tH z{wSU=yvL?N(8MMXn3U4^UDd6E=gtvxft@Ng-=Wt-uN8(NW@mRwmMf4@gFo;z&G zn+2bet}j9qvW-_bVpdditT=YadhMZ_-b#_r(&Zm7RKA<08+|6`=k@q{-_>6I_kU|o zs}P=?VLbZ}hnKLLkHOpRtv_p$l9Ia4|H&$`^82*CzN3Br-*2;PJ{}ccw|e6?=Od|o zr=&U`dD^7RtABKaQ+d&@{B_o|>t0>aJm`E{?y#+ULDJvHD+_Gy$DUZWbHB|cWx1-| zwqMS2o&6@Eb1%X@>EKJ94GLd^vUpbZKZ;AYYCB%p{_AvmmjJ)vv_zj9his*-N>*$< z^W^)3J>@;Zb^7n7&3Tu6?qTR(LL&JK$#0)0inF|j;{c(s@=<{9kNvpF=HE%7R z-Xfx}=%}bzRCKuNrhVELmAAK_bDtAAzM^7AUW)kpmN!~*pB^MXZ)|Gl*fDLE#9?m! z@O$d>Dh|y#e0q!LWHr4HHT_c+b}#yNuy2Rs9Rs^p@4bJBa2P1e?DxN-__^6*4HMduriIEV|%6=!~B|0oi7)Q@)zp59a%J& z-}cLdOzBc3k-G19%hR?`d@smfsOV_(`_tP~gDQQXG-CaeOea)9jJg}+x|Le8BvEk~-&C4?PmqwrS_&DKL zVc~HTdA%OtYFR0kh@A)qeBaPXPdRD z`V`LG@Xq1N{97q!*F2k<-gDxRnueU|+UV_m;!gEPCtW$B@@(@Ob+>-G+-DJMI`37z z)}3jb-j^xel=S@E+^5%~^G)5@DxMYOe0+5D?DvlTGix^%ZGLy2!)V7*t6tWcmn-)F z{j4H)Yum=kbARSP(v!QC#$x#Fln4*IT-}ev=?7eYN9I4cdnDpe?A&V5G31-&9A6w1 zU^XwkUEY%DawhqBpJd_3SF6{Xy`Fr~&(n!=A20NspJ!V=YpdjI^_B>2r;TX` zJ}{s5t0?4o-850zU5Z&`&#t=vf6F(|dvLzj{GP^@qx%IPZYWyvzoY2wt*yqThqt(P zi>=E$Kim9#&(6Zf$0U#K6RZDu!*t#5iWASZ!`DqYE?0f#&$5j{y?uRV$#c#}9)4i^ z{XsMTu0yGbjWH{OR5$NiwqL?`gWPlDo`eloQh1xUs$Dx?a6qDISEO>XkK@Dd-wv|N z&v+l9ztJpZ&nKUS7OV%>@Bep;!F}b+sS;&2R8gpq%GLzQh#CPrK&W7CL?FlTb^4{CKIuYU!l~*WVq>`sfq0W=hSg z$djQPC%vivp4%C}%VkmCUSFx#ZmS&v)t?GZcZPVAr->O?GI5mGC^SJr(hVrBh%9i}D5kI+t%5HGnytjY; z9LuVZQ~UqUJK{TAt6jY&kL7F<|Ch-Zj8e~7zSPx{TQ>cMtBsv?S9?Tv=$eR&Z+t#X zc*uHm{*^UX@3dOUCHSPxdAG)#7|JxdVes;=x_6&m$Oiz~{Zk~BpGdhFax@b?u42v61|1*VK zJGuDt(hvI16=!dXaqDW|^QB^Afc+tZ$E}?WTLqTd*F4*|o6Y-3(i;8D$+|vMX1F9W zp5hh^ym7mGUX>ufpq?P7Zu&ac*%b$k_RR=b8^8ZvgzKZEM>;!B8yC7haM_}2#y?p! zZk0$GmZLdGB{=I1HSB1DwOxt%KlX+Y>xBJJBi{6OFC8L5s#z%qo5-p-)uX2Qp z->1Ag{rp<)%%2LC&2hA*Gbub)lYA_3_a;jyJtcfOx<_j}pR z+1J+0l(DP1QFA@>Q-;~~uSAzW|uP5Eubne;qqqip3f0leL zy5oV=+0D$0xvqJx`5&RZ`JjXBAGx1z1LrV3SU$fl>so@u;|+C-dShl=37RMVc|N~h zN?Gb!<+|NBht9`Ks;q|F2vXiRn0;ePv3=Y3Y;quD45k)L)Zh zsr)3je#v~5cmK@ytrUD;H(PI`z2Brs{&vciO~t3)O`kM#V$ae$(eF>pQ`GnVGwJBF z%}Ta{tlcw{mGbknS#Ot5ID2=u#Pn3Jb2UGgK60ObVqSQ>(RJP5$D)PyS1gp7HzDV0 z%#LF7ld-F(y^%3-;M%g&lk46!$8BF;y|c2n(DKsS^MB&TFq^HF!Mi@Js+ge{BmVut z8x6TCrDJ;X`~~^zw!L$bZ4A3~@xW z;tZn*-%qyhZj|3CY!}>{p?yDCU07&#gqreE=WMO>_wE0FnLKli)lui~c1CU)>`8|D zRqy8SyNY#WrU9+rJNs2 zuaB3WIX$cJq(m}PUqz>>(qzH1OA^^W37Wgh-~I4a%8d(Edc33F~HZM=N;);;ET);T$6oS*+l@jLsxBe|!x zD|YqA{CC=q6tjJ=u}Kst=tOOtn*89f6jP$0q2NW4iPx%j3CeLde*Api-hB4oJM72g z-`J||_sM(1F$u3caD z_g2a3axPQqyte75_XR3Hy)h^9rPG>6iMtA7?==Q0$nERaC^yKtv(pz_3c_+l5SoR`k<7D*~H67;4#7_z-PDfiS@m(SE~|bQd}PZJ zXX}LrN}0urmrvE)9esMbzPYewiI3#Sk3seXMJG$GPZ zSO1-`-}-gX-pzyk?%*skb)Hb?jb5KSY=ROSzHDr*JaM3r`TS;^BUUexy4!PljLjDr z+)uAN(q?10BKP3omP%{slV`q01S_oC5O^-8YlHEZ>s-roPADxgI-VNW-O*&;!7Dgr zUf}cf5=Z9L+}e_oFpZ#1EmMgsG7O$_2IPLuFVV!SMkrH2(5Pzoj z+r4J-WP0hWHtLo9%YU-_i_$CnpP_0v_y1UM0@1-m}hs-yfzd|Sm&3a zdaHSLd0OY{EmKRiv-zuirEhiqE7BL7xbdCyhs__q<;q9S->@z*M?pj>D*E8e#q+oomy*FBr=3+aSNm_beT8wCgp=gw-P&XsY17j; zjrqNL_4mk+1=auCRSLs5?VIRivuA&Q%T#TB>-m4o->DuC`Sr!S^Iuid5x;*ok3_Dq zD4X-9B546jYpdtV=Wzzp+S2>w%^xKmN&Witg8Io>4Vwk54PPb{-LBQulKbVQ#Vu35 zvZI|Nu%rFl5>>xF@0{kUf7vlXiDP4Pn*0j0eG0pCj%0rbG4MYw)ia&x`9~wyJC7M# z7aZ@Fx!6%3oT1LNRR57;len;$nsUm_M~>&#>3`iE+{MxQpv{|ck;?xxqvP+m3V#a- z*><*f1k6iv5$a}ZJTL5C{&52P#!3fP_Sv!)am#juPF~Y$_gF0P?1##kN%!)Px~R#A z?Ri=g!K#(W^+?hBZf0lu9+3@?Toj%xO+9K_r_8Zx$I}Bd>ki!#|2W~-je}cC4GmM3 z4jno2uIAvZ-$zeNbo*EwW*1LYTUwBKsO{(i(Z3e+I(h2_EG^qR4JLcM&T4wit6zC% z9=Ak3Y%Rd)ozw2NZv7}8YIBB(KOwgX+9zsc5ZDp$(O_+hW`v;8{UfJNiRr8sSb68} zw9QQwFV5`q-aT{mZJu@8{&LLc5I?hd=6l6m8x#8%9EzD^DKjnY%)uL1Qsd6u>GiE^ z>DyQPdsh8#<$xdB(<-|wJ0#qq1J1g`>>Mj_mfpm z+!9(Suvl2fBKM*3zUNXR+Hy*hl4dv-cD3hNC~SND?(8fv!%1INU+cvmbyiRIf25cl zeXDz`^8RRlv8($&oagyC;fU%HHJj>JOSCT=DaGG>n18CT@vrK``6;WG?X@i05z}^A zTh49UUf)G|x$4nXC8epU=Vt295Bc*Vcyb7QxE%@51KY1KV%$_&AchWZ5?;v z-Lzf~gEw1lvM3)pu_3JFUY@R!z;5{|SME%k%OCr%H{xi^F-^HohZ4(Yv>WT2$vyC? zsCbbi`NG#GrF{x#|L%qq-(R+o1y)C$|MjLy*QRfBj1gV)CZ{3w-1DcWkMtZ`CvZG^ zwaXF1**PsICG+?V&U>78K7C*Oqky9LYG0QGHO_0VCY&$4dO%n9x`>@SN1FIm@sATu z&OR%btIIO;f^lKOrA}|dzwNy51UN3vVb)hu*d{E;{Z#>9yhm zC50lscbYN%@3$c4A*bs#I&`<6(Z4yvm1iUCMHWND)!pq|rdNt4md}{JX=d(GGZtC1 zJk4u|c)kZ8apwA*bHsv0AjWEA#UYCZOKB(J&-t(A=FYqLbiKqAUmKMW0qNfyvv$N; zA9cPasA95ZBS$26g5?Rf&HEoIJ`d#2+qKQ&Zr$a>P04?s7AihkXnfk}bK146oFB>y zcJ9_aJjHaz?%PJid1imsc0ARS+tik@<^bpSgk$r44@{PG`}gUg)V_}PYq^ryQ9R-~ zjoqdjPI7#l@SJtpzCUug2d~O9&*%~2-`T&WQu6(mqnVmB^rqilLUGcW)0MMLOgV#hu(f`3-Il9<@aN~5N3@SPEn#sN zo$@JvzqX-$jsC^^D*Kr~neLC`x_jAmo9&l|Io748!g-!qi1P1!u<1~bedO{>rR=1ou;P3w9Va@j$TzgL3Jo@OL z@y18*uN-kcA|DraWbNV)4DL6!DSpx_C-8WT=uD><-?PG5o|kF zZ@Ar6k#l!J?joT$2ack7Ize+eg9~yK?pWMiA?TmjVyYY?7$+%w$9i3-HqUcIGs|UtY2)c_S63Hgna`4Cv-C8aqW0_W8?fj_g1-8(E8qiGeww5TuV+# zEmH98-qRhj9V$E2qE4Hw+4y7o@)peqxhQY7=g$hO0)BxIrWbfzYKW^K<-sU635xu6Jr`YaUH^&^m zj{@A@x4O)Qi`}m2ed+vt>Q_h8?V>6j{+nx-*|CJY7Hu|2ncTBvdgp$dKcf6E&A-nv zJY&_c)9&x_;Eo+%BhrkXMHUOLiTj)F#&F#kga^>@6TVFu4WEdO!3 zJ^QDUT#<~DvEGS}IX&X@G(Q|%-SebZQc*66)q98jF@{vMUL0OH}uMI6Cx@t$|tB$1D*cE^2 zV0p@Cekk_LlJ{pMUv9N|GRLNOox!`~Qx;qZQ1*K#ZR;hpEvIndNkK8SsmE%QbQHJW zxqdix=?TV%U-gVP3KzS%oY=WU#d7ux4ff-E-+Nt{B)3mXu4+N6MI*-%=UL)YdFRcN z+t6t7ZNHY>BdeU)Ucrchk6R4ADn1AsUx>AF+4K3C*x9`gQ=3es_-)o4dE{`|C zi1f{K?9Uh%u%__&=(tEfJ~wj$lVkVU{A|H?gNgGVt&f;AYlcfsW{dNtU7HlUpQ?zp z?npA~calln*Z#os{*PqcO#<>cG3L)EaOmVX6!+L4z5nlKi{`oPM_UicOfqfSI;E(q z{fOd{y=Qo5&fnD7@2x2lAuV`XfA1s3>&GWFZai4wFz2YM_(GwHI(v`C%l+$Wzve1= zk-u(Dq=4hYHf`P4rbmpPJ^0i6RENctHpiY$YpLKcx7bjYR(s@D*L}g6Gb)#DSax*vS+0h2Ij84I zR2M~;wW&LFE9Pm|uaVxm{*Q5#&6lsc&OL7W^km|Kn4P{wB9_I+=4+j^Zr3^a+;9Fg zWB2}Fq4FCAHPe%l|60wT9AZ=A+-}jx(ehP@S=6|^PQuKR$zu*fXdJx3zO?eU;m=@kem?1VW!vY=&7Um{wt4(-g6)jEB5Dj<4yMi7WXOLxi(5bH zh(g&)jVt}7(~YC`zbgGm40Su>yynA<9ZN(bBwri7+AOwuo9~rYj^h=M3zEwFErcUB z6vmbn?&)k_`L+Fr`WN}v4lY_;*UH6}_^S2g-PXqMZQYNjE#JNC)yh||UTuHB_Oz|f{OA)^6}iIv zKZW`|a^|&PY5(`!@r)Ald+)mDwQn~c`g-&HB%=oh{wu9BN~>5=q!VwSDf~$B=03~5 zjV?*zV(WU+Pd_>{=TLpI?5~NRuEp2?-Q-jucg`w|#l-=P7Gw)%tgo1{U387E#{;*D z^rhd$?anEkQg8{eGK=ibIx@*7H|c!#D~WCGTcziPSH7O}e3$H1yVb(4-L7qJiP-FR zB*Xf3Y_H` z?jjFd=X)|gY~25OX|s4$OABZMrTy%utt%G$JbEb7FXh3g~KCcb-Oo#GR zt)ET_-ZSIyKmCq?n!QJy`c2egSY%r)f6db`(Rp|2i1Vq0`dweIMW5fD{dt1_yTchy z(%q7GUfz^u3a>omY%#B(>sv>A%=K?Yjw*+5h%cM9A@zu}S&-X;>j}z86woF_i$z-au@~bU>!8_k?raXIDd`)=%i!T%o6n!|YJtivF*X9X# zX@<@+fr^s}9W$~LPk#F!68k^&fA_{d`AW%Fjmw9+LJmjZLS)?a?{ z_Vnp3ft4H7)FlPy&8@hy^}5tl|LV$;Bb7q@-HUZT8XOdR*eG7gBGSUH#@!+k_p6Xo zEs;I%z>*wyh6B4-EH+wbHo2mMBRRfRAV}bGk8y3v{?Gq^p0zpjqxwbVv^}L3eUI1j z{JM3Dzu#5i(XVa%vhnNR^)-FALO6R zR$ZT+dgJ4k_FYjGYg>!W|(%C;ri zX4f>h`Mqy-Es(f&^3}=8KZm_99rKvAJ*BXpWvUK1tQ44(E=*)mktda-e`_=_Y`fsRX~IT%>FV!CIV85e+P6+k?ht3= zRh!F6w>?*=&kL13skbf9%8%ugph6`7!?PT%XrM?EiG+i2D1ERqrYm9rc(uWm?M9#c#Kl*;e^JU-s(S+Fjiy zFK-6ln3enJ`@8GrcY=(Ww*IR)wr^QlaP9ZI<+`))iRMH;QcM#6y?o<+IZyo?lh-J- zZdj)#7qug^r+rRoq(oO#f%&Qm!4;Z}$E>BjKL;o!3Vn8w@Qc6Pz0v?27L0-djms1c zv{zgc&1t{FaSiG)2@(Fz_R8Zv6OT_8IrZ$ylhS<_PhGx$&R)MG&vv=)CNAFSZ%^dw z3vBB)ubBPvL~_=(V{Ib*Hy3>Tl!boWkha*JwG$R=py+cDSG(|b@AsJP-|v^(%2l5!mA1cETL01Y`s1I^ z=l=e7+idGRgQ6wBE2oBPZEIVhcI{{JdE4!;@9r*-?e6H+Q!}mlt;Kik2;(Egj|T5& zto-`1qfJ=N2Rx)hD+Z_8F>em9*{!69qIFCLM=xcx>__s{k!qnnPtoYORY9woX@yjBXW!k`sd zD+ANR5_h?mRW|=BOeVeex4Zdw$Mv|6$Ls&^Req9pX^E%ov>wAxnyW4l{wfpF*bd-@Nj%-z#1J{qDQzs?%O@g@(z( z+r|jRUHkhFaP&5@6xy1;WmEkp!C(i(c!RJID_Nk1UH*sFBaDwK5JL|>&Kf@ zExP5~JZ;{*k-PBK73M7$2bNi_2d0dtU-R-J!Wo7&?enG2BaE00HcOX67?v=*%#~Y6a&9++V zFK>SJ$H%4j>mq9k&Hr6=mzM3mr49{wQ{{l~j}%n|_JBDA=KL zLEuqhO0@MKgU)u@z8G=1i~yrx1{2feI~9v(zdNBU%ak`ch|4Qjrtm2zNz}XA{{*FU3>#>-TK>{jQ1o&XdY# znMc_sPP7%As<8BBTaOf^FbZI165`KhFkH>i+0J?>^dfSI`8qRv?62irzVl(*6*J*Q zK1@^Qo88%vIb+2_sHzKrEGlwh9#M}H8w*0WK+AtnOgjV%DBRg`{pIrIZ5o@~ANE(j zefr&O3cRopadvo=Xc$wwQiz|sW%VMcXTVV}HH+cq&n3tiE zH3w>X2@_*yJFCQ6` zmwKW3p>Ck;@8ZBBHS@qF)0%gE^7i{$vR1v{_dCx^xq0=KZBd==Ti-13D!uj|>O*kK zQM!=H;%9MiXYskhcdysq4qKQX|D4a_z|P10@3*{qc?hcXLJ!No`~QE}ubXyj%8|nf zBAzxm$D+M*#Ta4L52N4--v=%yF08hzoZ^4`2}aJG#n^P`K5&5nJymfnJvkPgkl z6DlGS*s)m0&m^{J&Q#TzI;T3?tl!7TzYWxdriuk8IXrB1HXOzbkCIxZ@c6r%@)enq zX33VvoPN(0`0iKjN-2nKCc2=6QnvTVVWx+xGGO7$C@9dl&ild7=h5Fxb;K9dTn#

        UbV2n72!LXsacKl*I+1l}*f>Gpsi5+u^_Cd{r}wpS z1-{#1cX2AnT#z4{L2)jy1vBpY6blY<>K;mn5=(WO^3g=aCsGX>m`WEWfC{4RtjfKN|o6f0BRpCWF%O9SzzW!~OmM`2oZ*UIy4zd$1!+}fd z-|z1~%3UGw^p;_`CoB}z!QKkQ^wui%4}U)E{+61?9eC_^!G{O0)-M%;2A~7Wt4W}o zz1tTvo_})+EXs+Ta@p(U{r##gm7CArs^^`n2@gd9uywtd*4=V{@M`s3>jw6SCn_4q2}o;c!q3jQv(%R z@1|lDS_1A2{LbG@T_k*rou>TE{d)EBsmp=TKv7`wbzSi8$l?6`f3KCkzjycRtE;O| zmrprzSns~;ss+%hqN9Ps#0--0mbYqre|uYK-kJACP}d4D3Z7612!Hf2B-r<9-tM<% z=D*);-aR!eYUSzjRhZ_eF*<>2rP)QZa(88VJBhSvn5X?;9SU_$fHPC6w%ocspHAhS znxd&HBCPILa^B{1&*S%Zca^SIT=Y#`_2Y)WZ%UAQNgWQ>96hqPm8AM4Cf03onsS>l zbUCQz1htWhg;!{Q6bQUv!!O9G?msW))!vE9?z_tG*Iw7%@t`U1Zt3;X3e7UiCewmW zjtM-h`G?jBq#l~g89WVMq;)v(F_r4eDGAwqy%PLyexxPi$K&$#CAQVy&NQz0+wNtP zV{eT}0t!q@0-g;5Ph-mp`PLsckv3c78uI44{w4=mcwSRr`mY>t{gGng>Ez>mr4_Pj zy1ouF_H}!tO|zza_nA}qY$mrnyAVIO`x4UP1+AiC1?G24CjWl3 z`TVIO2ZuS;?{?lj%x@oaOS$lz<@1v0+^wOjZH2QLjU(HR99CMf$_HiuqhLl7lZum~ zqE}eQr+>e#kAupCyho0UmO)!w4!N9H)>iCzv8a1j_PU+RVoh$S7oNBMUSeDICFAF~%cF%MAlf4y$E*sk{rZTN2+tCaR3roP3%mtah%CCZzy9>Tw%NJYmabZR3ZAq~%o=xz z^0V{Hy^*VU!07&I^0ymPG=uL5dFwoUHn;rVA*bo8a@&@tm-vM%Y&dInd&mEO-}f(F zHK+F5&Ah9j;cvM@gJo}dJ~$%mUs8Uj(Ea6`#KUbnYro&!K6mL$6L6d~&Jvce+oS4T z6xCt$TS{o&8iA*?lEWL}fix8q`x#DdrjHcoh5m8&&^a{A(`JrE;i6=Ny+5DLes{P0 ze(C)Be>)%N+yDEq_u-p4H*77ywAix9>;At#ix|Gi3R-sL z@T`P4L9HG(Z-VYF1bg?ue-43JJ{?92Pi1ajbK|J_#H+EO2qcUhd010;zS;wO?(PzKQ^c3fS5emW{iF z`R#u`5q^I*OnYPgtCh>kiq9CjpFPE0y<*}~=WqVbJv-j-`@KqTO7_~V)2!d^czmbi zvTt~4q}Bp6Q17KJIb19C$A^dS?p43n4ehkMmpVOmSCD9SocKJ^?{|v(^~<;2Oe@x2 zwbmfA6Pw$HuKzRK|{%e>lek=uX2+x@%gLxJ7@Kc83Yhp2**pMxn2N8q!=XK!qL zxs*rxnvzyl_Vg@`*D> z<*I+|<=I{Sex9Yz@qYRDlg(o4em;G7JAZ#}sm#O2>_YpLUzacmfjircQUW`Ey;^;@ z^7&l#j~m!@LR&aG9Hz1ea7RAwk(d~FVS%IWqJ>UVRfa6G>^|AN*;KovtJC4Iu!7D^ol{Sprf~YJb#L+kB^6LU zbzs@00c!V^`6zd_i^mi+`cFtYRyUEOu0{R%R`K|njc4a&A8z9<{{3!u{=G#dHNBi3 zHfsz6M6YYIT#L@Po&PiTQR4Ck*Iiv5SUwmXxgDT*N{Snv&r1Ek&8{0Aj~+6z%RG>) zezQ?%>)UO&&&k$&IQVv%$Ba+=|NqUe|MzC|`FCM)m8s=N1l^x#y?;KxzO2GXNa*k1 z@As{3ByQ#xuG{(S)Bos}+AkN~L4zis5u$%me}8{3ul@C9Wre2G)| z>2t4sH?F-B`eyTayU%hPRIb0czJC7mqxa@+-4tK<^XT5M*P`q0`yV^S#I5rn^2iPI z`!$b`>PrOieO=VoGy9y;vA@&f>t4P$|E96j?oRf`+^&`8oHOs$|F1pYvsN|3T<+xF z>hFD)cjcXJ&F@t_zVz|dX9KCZd?Jj3E2c3dDgKuFH~)F@>_=_T?$<5tm+)$kQSgNT zsEu~yPRAp~-$MKT{d%pM)zNAFZb$NNO(C{k4#WR{K36Z)z9#VS-JZ{W^WV-?(Xs#g zCHU1!W;ULJ{eR!)-<=kn_cCo}>a?z-%3W`EKA*Sr@w3_acICG+m;e0lrt#K8gExVpZmA|^7%i^q{o{a)4T>Sr_4 zZFVo&c>d+1ZvA&=cM6=hpH!Q@#akxr%>>Dre?xZq|9F4l#_O_$tzw_vB=r24x8?c# z`g?PWPHFx-&oQCnPnyhpncsK(y>+*Sh%n2lfZF1soDm&GVbfCVd=#br-QT<-sS-Zo z=iiT(JsSeg zefScUy>_ct`vlWp^8bIdi`R23=es>G^ql9&-b|M;;IhAcsk?mb7IFS$-iK3*1%#8|E}b4%bX>lE&*NmLo`;nuKXR;C*ehpy>+SaY zb%w4#lF!-w&H;_vy2-C+1{I46lMh@Cw{FjvVcP$8fBotArxvYo1cy1Omic>7{=a8z{BmzxRgU->AF^4gK5ug7%zdX@ z8y~xhcFn)Sc;0f)%SrdzD!xDbI(@3|pEJhiOE}6Sr-j?dSQah${==&)u0>t>z@@Y! zyDkWyS=YuD0?fw-^5XcwBzFCENK+pU>OhZ+A(L zjQc3CP$tmo>}3J5g2cY$(+ykd+&NQ{_bjKm;KjoBs`K}jJk0g@FR*E@$sXB{ zTye?0re5}*HfuVfLF2qvW-(+lBMq+vyw+ZA1FH}j1z&*si7t0L9w|PYBBqu7g5&)W z?iDX;-+b_Lis5#iA~^5cz3Tk;wj%G^+bq%_E~)UJ8R&jUe{+ih%fYA9qSuw!{FVr^ zQ)2ynRZ;2DR`bI=#y^rZq|dt?IdtL1Zo!58>#bNOoHf6Hrd+fHUk^{#&He9U!;_fXR^e2!ruEsQ$aaHWFBWxIE#y4-bZ+^*k8hvGXH+B!J@WaH zJ?p6;zhLOeIkH?f9jAW3+1xK)R`u;ox6u-AiK786zdcElWp6d5|uU8+K z`EV&)`JOuh;hZ;PtKV*wUHI~gV6~i3R_)c$@SV%&*X!zmfZn-kswO)i#FvE|jMdNd0m%$U0*Z227-G0_A+s`g*E3Dn`;4BCl%_}!sRMDZ) zo-X=dT8fGB;jTR&o_n5|$X*}x$Kimpg+sy#qi>s?SvdDD7x>g?^=ieL;%Sj-GcVieWWv5hmt*PjE&^ANlowUaet+;}xldkUh`|WmI0grS0 z&-ZuBZtI?(pi%vXncwDumrj$YT+tWqzeoR7X0|odT=G=6+@tC2{6hAS+IP-m`2z*> z&xnS{T;!h8k=4=EvFj<%L*1MF9asKnr~BNi2x^n7<|wS-UKT0$Q9%Dh{omK|OOq1H zPO47-vDb5Rk7eVp39fg0syp|JZSFB^Q@q%%yKTn%**cE;Z|l;|S$@A$d^<+z=R#-B z;Hs9V--(HX@d$NaIcKl3Ea-P+3`qm$BlIUM(wj7 zSX698-rF83bLL-~6`=g$!N%6-(;|0lPuRKXV@9&Rqp{OO&odKJugrbjI!#sPrs12Z z9mgY$d}bWsd&3-YE`$A~;h9Y?wk>AsCYsz%UN3Y%g~ODIx7u)7WzVs$_LH@&A7>oV zK4)Wm`s&Mv?eb+U2WLNA>9%Ok2Yj&IdmJn8MG(|T)J%)c49tmrn}^Y_Celg$C&Ox_=k_$ZJ#oyBfp;oK$L zQ=^7lKkWui2 zYr};Urzy?3K2dYev#YggJa<~v3@XCGE!$Vk4Mz?${azV()OkW|{ok)~6Hea>KEFXo zXxEcT-c^bd|F2cyNhxJdVo74SS6=b?BY*x{o%b6z$T%raR^n6aja1z2`B7lK*C9vk z$e@D972h&cUbDD-LA{ z1|BYWyd_(0@`D1Ou=z{o_Rr`Oka}m?aXm%iUf%PgUF|0yZ#tGN=KSq4&wKGh-#uSU zGO=^`pm?Z9=hPea$dfaQuf>+%4ZC-wBKlFO9oFka7w?S(4+@*Jv@{j9&nXT+QSzEmv%=bhX*Jy5+$ob!;(6`tHn)9tA4w6 zy8pY0TO>YyIBS0YOLah7+k{BH9-B(pJ4jFTB~B!_EgO_oU_vZGf$r&|HmDwCU!jP>Vkeo zG5cb6PqO)7r`BSV6FiHd;+SOm4%6!~n}v-2TYr~4r0E&`;Jl zjQeAc@wpdA)%P$RPEmI);pFtWG5Nhy`jn8GsA{7i+fW#%KrMH-w|T9VcIk65$YD%v`x9iKFB zb;aX*1&4WayE+8J?7Ul(1Y9Ghm^y&G56(BU8bJBRdS~PjXXg%e0m(o? zLBWtiXI4Ko*z7MYmzct}?wCOJiEUjKjoTIfpZ))--}a7^V292cZ=H=UubxhNlxV4c zbVEamgqmD!#kbH+7Z9r`Vxtor5`=Kqh?ij>?oe`VCki;AC#1>w@5OD??|5q z3KgHWgja*SxIXFaA!{-H$jwjo zwN@wuKev&aKJ}H##|=V?pqb(c-3*E+`)wY{$hQgbiY}VNJ)aLUk0rn;xFR2%LH4H! z^H0{eIe$WmQ1Y>!kCLG$b>{fE2+eC|kDcMLIOaO&uH3j4DGZNwzdmf2-{!R}Xl3;0 zj`oT}N8enXA;SOhleAe*#L`t27nkgPr0AsZ`}I*N$;F3LWFqf189sWL*e?4_c-@SL zrrSOo;yxa>bm|0=c_P}^!gd7&*{G<@*zn4xZGyX5>gFv^OgukM*eiJW!`Gtg%8Y&z zN;O9W-7Q#7+e|z2?aa=OhLbth4Ie!OHEvFQp7>W*@bYIV$?1nbRBSSD_l)o;D7uxo zd}`O)rN>u_YJD`wU;nZ~P@r)W%dx)Fydxdc3{q#ps_q636G?CfqGEG*yXThsb-&kE z|9ZK+RxHM5^C1=fvNspq<==W7nwZKV^n7mlJpNo?Yx`~1pF7&i@0L!VoxAO(me^bo z{^al1SG(D?q|WQPc0H!JSDELwj`x;MLH^0rZ$nu`Di4T;$2?@?laZ(_`IhMUal#YZ zj^xT7J09Ejm%a)6bhWqq5PBt@oTA8g{Nw!pf6})fWRpHJC(7#C*6VS_pf2g^;!7;= zB|c90{iums??ma}8O`5srpvpBWp2)1zxNuiyxpEJ_y7L>{+%-|D^rL++cP*7G2RVc z?qFgJ^5eICM-J!g03DLx-_zJ0lEI=x%w`z!3*W-gR=wW)bB(Oo9-{>HX&`G?2SBAvo}DrS5+)xFkv>EjaxJuAZ2svbSO zrr<--^@GA@GK(v?+T@Do%ogGQcp&BfKCiZn89C|mmMDhRMLm+T`OT*C?I9?^{#Fmm za(?qZ<)>SYnRlGJ+0KABUoHGFCh;6VqbZv}Q&R;c9yV)u#Qj%KRCeEHB@j4q&F+N{ zw_23ExM22MLuucGl_&1irbPR``<#}#;eJ&0cbhk-=C!x*PR=#EHc2l2YK5F!&4+`0 zA20RTsw8iII&HOnt^M_w;-hAopLZ;&xFOf5HPg}h*k^+3oM(I-Faw^LTzWwK9Z$#}VRy58R@GVLw*+N%r0Y8^Y< zw>qpaf)_DR#sSc5*8_(M6%mqpixed56I0zd)E4<>sIVQ3)-*A?nz!%gv#I)z=J;Q` z(D5koOWCnlKVR3^-*sEDE+ky&-UNmdI%($* z+dN9t{brM*-H;+Q{oA|BjtTPL6d(Rdln;L-`rFz`@nrRxTbt!mmu8>*3@rx04J&vH ztB^%S?pR^g^*|y1#~V}+$6t@mw=KWqsXoC#^J;``z^TGK@MJrySL zOkN)nKIzAvuh*iN9=^0mal3iWOeaBQ&mYOh_8u_(bffnB-RACa7-3cmb+K`{qDOP$^E)>qoz!c z3Q=D!Gev~ovL)wq#m=KridTfyd^BYJf@GYgJFj-LvHA1ia4nPK<}J3O+E>3W>eefo z9$#1aazm?F)Cs}5Ia?$?PT1@5k%ce!NQa;)r!xQPn*V>l->%?Y{`PXj%C}GJrdLGp z+RoJm4Sv95NeML31ezbbc){b*!`JKgzdJGG*VpUu(>o?kE&cg)`ubT4)sp*uy;{Ar z=tsWL;u%X*C;M`rKC_C0(?USnIa}nTf$ovrG3^R9t#WfzHhR39e*CB5BSpF5igTj6 zCR@uJmUgyRcnckpOXhewJ7<&U(Zb-~ijL=MrAD)p`z&h?EwI`4e&6q^^|qUJ*58r% zIKfEZmEfDReU{H8w!d69``OB%qsi+2^WL=aNIp{Yn-gL6?SyiFNp#Le*Q3Rj4SVe} zi{IbdTidkc=kxjZ*KWI&wf5Z93W?SrcC>P;!@-qFh+kVN>px?!irgegvGp3?G)$B| zIjdiU3SathkX`;qi~7QeXQyS)-23BEci!~avdmJRLyR-0XoHTcdfeK-;oh9f8jln^ zT|e-2Z!|IF={Nmlm}&S(@!^vvQ3okB=Ej%ik_uxRIp>N6K4{Lds=-|^qH zEfF6ln6)!KGdivF_(riwzwNIVi}NPBiWR>3KO@y$rm&^@K_k1Dy)oN|MLipv`K(S9 z@)}D#3YDI9 zNU^lW?X8;nZKIq_q8Ye;2)ze&xKk>dT9V zH|hn~U!EEsXZh-m7yHuA_MX+Z^Y`0ol}Psc7)j24xKW~t^Va>4E% zh7*E5|9KCZC)oXF(`m2chyKp1e&;EAE&1qSla2olaqE}d5jPY|tB)%<$XY95^4aCm z2RT2kx~DF+*7Gl9*>SWqX(o5rnmZ@=Sv>AB_NtEp&BQF79w&8~MHaR?1d#~@1SV8O zJSfO8`8Z+keGctEuU4;*3XINPyY)^ZyWESk`L*9NX1(9{d)@h0R%vHuggu{dx9oas zdG1&97Mpc~?`*dp=Cl5hohIoSq%q(29UG6t1AcDd;3=oC#NUlQr|THpWScL zEy{0MzWr`l@p;?tF)L@xOq+G`{pyb8*_OXQ9Ol0(SN-OqmdU&guM!WpZME$EEfx5& z*ZiKwU$f_Pihpf9^Yv2CwoOYNXE4sTnz(mo^!B{9emfucS_%`QA9DSI+?)yFC8 zOrCw&jcDb7W@s8XOq9UwfUL!x?F*bVZdSkF8_g;9XRbh!&E^lY4&Ck$|Mha&>~&uj z`Q0#(Yf;fxyd&_C2`Ze16@n&uTy2W|=>IadB~N(3F5LZ*Oj1?i_Pc zNGAEHbHyV~FOIB?&*!Yyi?eaM`gU2(ulu!f_rG7S@AjJCyK(C9HOx#hpAwM2eC^tSgmK5Me_jev%r_2Hcj0qN^DKbw_3?VNLli-F6OH2y0WKtrke z9O}J~e@X~S&0EW{_>Aut(`xHyKVJl{-ng;|o~@yb1@pkYt?g2QHZ0;vq9=I|J<*Jm z5L{XJ=i~9NDT2ix*tic*Jv{kd^?Tdxf4|+f{&s?!_ha@&SMje+oK6gKWeXQ1aXOx` z>wX@Q(czhr^X!g6&8D~`&bJQj%j57l#`=&|PGzFQhT6|(&7{j`WAPW=MK1-0L9 zroVeSJ-)1?bm7BVFQ&yipU<-v4wU;i!AY+AjiJ7W`g_Y?9o6momil!Z?Ad&QdD7>X z#m8L4%vWd3ny$WI(c+xd>ot6AkB{|cUry_DOh}!7))NeU;yCrtcMx4GQo|W}g1{+wJp$n_|v= z>S~|T%F!Yop>gk65Bs+xhl@8(JEVBsx2wIQ;LXbEcb0FAkrh1P@u0aqeHv)yE9Vz~ z;^e&ypCwAIe?FOP>|DEc&7Mb!&lQ&yofqtzb6nu5;0o$mh3^YD`?q{GC0RpDR;NG@%kHm6I2fQaWy=?S4b#* zMk3pMndHA;uYZ5oW*9m7ZB<3=$4&C@D#gka7crf5=I~Xiu`=1Si=&?Jd&J{%o5gv1 zzh1kv@T-d4BiXhWZWem?3R?u0SGEXQ^#nL|XdLoW&F-)8m>Ki?R`&X@hhi-cc3KHf zJ5`$WDtP6-%>C*|o%cxVCZ6He-}7MI?sr!2W2b+au~^4O@Z=BQj=G(DRV=rKJzBW6 zF(B^M&ojp7w|xAyIr+n}$2jA93bV^O>b$+~T$W->=uX+oU&iM@!h= zoBJkkR(ZZ-OYJS+{f6@{^PEpPrFPQC=!p&gf}2ZVYXRO?*yTK!=y{@YM#9m)R6efn zu02dEo1s|?+(Q7dVe2DjJKFGk+}JMB8E`|tcS5Ai%8Eqyj)(FKx3qLVdKtb}a8XaV z$p7vi&OcS673NIp+5eO$@zLk=_TL|#s<0E1isWxIXkQ>IwJ2BO6>q*vkkO?>Y!f@b z>2A5;Bx-v(>uf`zLx<7VG@AhNZ)cs?s7|rW-G4Ibnxdwh-lh{uaW{B+t3~2kn1j#n ztNs1!W9Nd%Z2uE`av#?@>1^LsXg6=dmHur9jQh8S+wiPsRIX6`@=*1J?UBE35vJec z*3Q`Y_kg>6?GxvdoU@n3bDVW!(3}23t($$`aj{8x-)-f^HNuhB9YJfwfO()X40n&s zo$aiPLN5M)es#JCzo%VufmXJ+f^H($y|%MiTLt)MPo0ahnjYK-IO_u%T-~b=TD#{P zQ8MfK!Xt;@G%9@DU^+YHSdq}%H@n~O^Q}-{c@kR+S4=T5|uhz=Vn!?P0fDG+VBkZGQeR&|UWFcXdc;(3C99(prFf)FRvd11>1^+}SWTD9f}VPV;qNpm^l)_j}dntFJsLoROOIYX7~e*E=nr%~*WcD)Lcc`@*~~ zZcm#t*Ut*^|3BWXbJDq;FLx^M-!+@h6*;%@oMaDmhpuG;cb*}6(L}a!mpK2)XI0PV zmT!Ay5!Z2Yg=OI*7xStwFD~WZ-Bnr~owsx8d7fK>Y9BW!YnY!mRgru4`gNK(zy6*N zPW(MNXE!9+nJ8a2tyliN)d$q41*KSc(sf`tCAcE{qd?)iU$57f+yDEKyxL5t@A&DD zEu6x4mQIhm^~&5vVEgSnYxB2TE{oY2smO`-?O3U&@X;W?+ zG|kVvYB79h7;eq1Ne*|r+Jk*fr&hmM*nY=bfA5uLkH6hampA`LFd}an^Ecdq25y`(Ss`t?#e!91fk2wF#-{)*TpW*x2Flqhq66BTc zkic>XR|(kuNYOxl=My3G%u7qmV#@E=mS0~TuK)e%^!Q!b>-TOu`@Z(qmqHc(88($g z3u~1=ZV1@p8~$Va{kqqDRxcKWy|w#(r&yIKwTDH`{29mQe}8{l8}XTU&n>@K*_SKJ z5w7<6&zjBWUWG;Hnu6vs&A6Gi24e*10ydUcVKzs&wS6U8POjVi?iGi>TFU!2={%34 zTR`hf#9t}-K1!Te61ok&jRcAA4u^{@uYzn;Qhq+}w=XllUsJ3lzlZCi-jf-#^LA-| zosoFB?PqeANoTw3rO=y@WQR$*3a^O%IAOw**XwrcO+9~Mq4QnP6uKQ~E#GO~?Mvh~ z-_G0p^TIQw@3vDaBEEbG{fTJ=M8s8SMf693i|;|r>HU8`c}v?>h)gnQ)j9J%&#hI>>1^M+WaTD!grhO6W;w)mwL84Jw|DpM-|u$cmCoODvF)bX?3|!aHhcd6 z`+fV5UB(54?Z>3DJ#5~*xVY>!dfyBZzYQE$L_tf;c9*_>wpla2{_oe^O=|DAT=vTY zEd`OU`QSLaR?u^jQ-m>R=#<=@>yE9`!l=0+o>IDS5EMr$nOyhU_4j;es{U}0Jv#C5 z>J9n#_q_wnZ7+83&-;2CwAfE9B7sp~Mr`MOMe)!ZMeO})v3?ja4#`UkmVwM{VY=7; zN7^{8r~1dk_S02Do7f-S%3l9gEUqH4KIURvyAXf2m0#!#Tv4wsup;}Tfr!BVACI`d z9})K7vHgDC?x_YH<&T=U^0w1kyO#AKE`Yv9Imn{=O&L zA2%pxzK((hBBTsOBDbntFnE;6!6s-Z!k^8nyUnJvedCf6*rpL^>W0N-heNo^g$a)m z!x?oyZdm=L<&`26c5^StF$wYCcGmqQ)7d_8K?%;Fo2~*HqsW_xv4$DRg-QVyphk_- zG^#1eQ~CH|cK*IXP&vG}`n%qQi09&af4|$kyOEiFm;Jww{d41I@~t|!|Nr0oa?l(! zXbx0&-;YN-*HxXfe7?i{e$D0Bf`hC(&uKq;VEum2<-2vi-@g0txWBykyluJQ^njU4 z7hbab`?B1Ar)1iUgR-Sp0{7{q&n=xMZC$p;`u(2IMc3D^`1x+__IpL31qHYBcE7!o zU;q2|ov*Jtgx~FaE?53~?e<;CeU`^~B@7N+t@`)l>Gb$JEu6wN!4-LB@9)`ejsy)n z|Ni-W{@pE?{a*hs-4bftX0>bG)*W%1-e(71_-FfR) zm3%YabM1TVx?|!M1*XLboA36smN~bJ+7>=?DZiOIeJALo@w4XlYx=hwReN*oq~mU?t-pLpc()$sVcXRThZdG~B~J~$lD zo_=@9TmNnd|35)xw;hxHtWM6Yez!Ak>C~`OS2;V@oVWkKr~1vt<3)4Bj~x8}h63pDero0`P-f>k-D?%ZoEHJzoxUo{cQHhpX-&MANDGJx_5S|qa|qP z;9X&Vn}__F%YJSZvi=*V1IiPhAdCNFjhT9tM4>WOF9A!S4f063ddTV^cfZFZ&qxeox!~<573; z$@|ss_r7Zp_WK}jY2|H`GeuFbTL1W$T3f@F;vWsR)xYYjoww`L$GQEY70fe5&#Jtg zRrzX8X-?qNYm4&c1|IXXe*47k-;d<-`?cS9u3R>2mGP$y7S?ymNxJ%taZ6*A1CN5yx;$S-{GnC(<0LfjnA3{ zYhP+95nOh4bGrZc!~FI;K&`d2#^-I;+SLDe^a(W3xBsl^^_X?;{c>whJ*bJ<_4CuA z|I2y$7RqdXzyJTe+8+GLYnu5Zu3AJ+aL)#*o6RJ4Y?T*Qg?|I2tcEXm!|lN8hatKb}Ho#boT zWKhTV_m|85-hYGqY>wpC-Puw2Z&r+TbrHfeUM89t;n+97V|>k`qKT9?pNyjET0wZ|8;e}(eYfX+L$}%55sv`dVBO|Ka~i>p6*2j!mhaWyt1!EGL9&O(c#D44O{hez6?P~-#yl(woaH4HG`?_$=oOwk% zmd|{A>6v@8gDi*VGQP6^sz;q)aXl}H<9IIg?*7Ne$9G#kpR@UFh2OdInCZI=-D|#H z4gWW9NnNB{btZG_<`ces4?oPyJ}=QEsJQ=G-~`k9Wmnf^%j?hEnqz9kthINR z`^(!;vz(sp{Ap%bp6`TG{pD9T#W)Z@7>EA#uL`urWOVo@uurdGJsempAv?_Xjc zk8aJki+1l!ukpx;=W&0&=q_)0%=&ZLtte$3kj|C14~=codJmUsPn~(JBjDVYoo0L9 zAKJO?Qq-zTKfM3R{q|W^vj1pb^y~E5%rpOgaCm07|LwNhUgyuQdG2qq{I+TG?S$jY zV~t~sx0cU6woBvYG@GZ#*8D&G@AU6C5AGCwPlzz{i9CNn?OIZ0tNrWevgLO!u9wW) z^U=*dzx8|0(wzp`ek-q5JM8?r%=UAxt>4|9>=EW0^q$%-yHv5LHsM^0fsIYme{d zdM$9wWrteI+!LR>x1RiR**|`z=dZnv;Nc_X*`YQnJWoN*z#ZFXZ=5d2)Ysa7>(Sr* z`rosy|9m+7_sQXXm8bRh@3HUyyGgF<#llN<{5pre-^$iM?tCa`|KD$)o%rLVD>?$$ zzRkY>=UDsVjq3$dH(4A2EjO;uv1H8L`E*+G>UFzT-FN5teOUhA1NlWQ6J-jI2rkVI zkiWJ0m{j(ZSI)E7?fdoWl3n;8haZOukIO!fXP9xPa$-#N+pV>~ovgoHaIUSMU-?Y( zfBLCJe&c;X!fn4VdF%h&zj-@rbIy(;+GaceftavjyjeCvBM}uYm-=?bCjeah0j{{|&Kd(UTF_P4*w ztt+8swmUW4(`t+@`t*al8Ki`~BB@ zGLtx-E3aHb|&xBeOXywx`S0)`cO`P*)$^%h@)v^=uw0chcD)2y$$ zsq41g%If>taCiHjHHGJI|IB>rDa`+QOZ(@Cvggb>X4?EdWb6HT%FL7_x8AK>K2Iz3 z{z3Vq(sIJ{mfD_Wvur+Z-16N2Q(aH4^QNDf z*Hh*lTot(-v}!T;)}-ZkieCTUvhVEYHyu0Kce2$U{KcU-{j15bU)|NS${Qj!*YWj( z7A@}Wkoc{0YF2Q>>9F5&0hxOx&w0AM*z@t2bX~Pp^!|@;o?0HUnPNJRSWh23Gs8kd7LJ~FZib7U~Kl< zt$)0=N~`pdN#K_Zok5#qjNu16cqE^;{h%6`+M5d>CUX|bu(|iJ~=(} z&QZ{2n)ilI)iYdv{yOA5ZF<$Z_TvW@_uIXS&zNcPvpwK2H;a;Dyh&xpGeQ3R9S_;! z)7Ks6Hm(*tB*@sN|6_xTjcZB5r)RFSFPwJfvsBrf3z|l{e?gLQLj9f%4|$y@3EoP2 zq}Z)h_x$Lz+S3s>2Gazuf!5Uj-(V`J_wzyT+j_Bznw3lcS7shL-B-6|dV7kpg&05Y zk@#Ev?mXNw|2`%it>BiQG^KSzW5gkeMelz!&Dy$gLuLG@PhPhLyxjZc-mY(VIJ4v6 zs<+~kE>D=z)^7B-{YJOP5pMP5`JW`!D__mK_OPdvMZSge7ISjku?+R^SFc6qzZE~f z@$VU>wp~j9HaZ;O?rUd%%)DOu7~3)1-VcWlHBDDOrkVTfXvycZ=HK;?N-Pq4uJCWu zd$~u#N=(TU9_vVYEG-jQHtDF=GpQPh2m2IydZx>}SRMB+R`cX3|Bn6U)Z3$Qu%o(Tzv2T!HVN;Z zXtA?p@}Cw>RFgZ_w-7W@)Bf^2shCmz&tr9W zXFG>cPx7z+vX*-#Uqt^`*crTY{y5=t#k0cmAI?0gd%ARP^33Nm-*1fSxw<4m(D;7X z>H98u$27jPynUQsp;SEo#^;XbA!lYOypHo*oxbV)=QFJ~&*STUrv5iN`{z{crgK)W zfAl-r{QhbE{hLy^&ZE6;l?R=ATzwomwih0>J!9i&zv@JlnXM>CdA?)WXKXptziFiC zJ&ip6=hWWz3rDSHZw1CyH|! zi>>4EnbO(NT6jje-{z4xqfe2>gsm4QSQ=d4ye#O*pHcwvbOjgY0bDp}kw#WNcbngBSL47A$ zI>fil6gP=85{!Fs+NRWh_Msho+}b~8EZ6a$bG%U0%mC6}N>*@w58qZ!N%x&lroa5E@y+j* z&zz#mTjI9HFgLbaHl({q9P4T5a5!Z@Z?&18M6yhN+9LbcGRJmFE@F9P{5`=)=R%)n zS9|5H$y<+YG>RxT(EB`P=24Bc^^?xOov}4!slmGq=ac7o%E(vmKiYSD3%|xU8}9Em zKFO0r_>*r3`dLcu zYmaERlk|G{Ys9;RJc+_6*+P46gD-Tt# zpD~*DkazkW^Bx0B7fv~z8pe(6@Am)ux<0I$HBe4pbx+MK#S8(xGtBq)%)hkD&fDh6 z>#!fDM{hNAIB0Cx`)2crhp%g+%I<%wkZU`n@%1U=NtZqb!8Ebti)}lOPQPN}{fWOn z@#2~5`PGq+wdMF(_x$?7B`LK?wKn;X(6uRbbE_6>9|#9K9ZLUFw47rS--+tDd)DWK-}dPS+TU5hpXLoY^d|t?N@Qu z=I@-ZtW&CIZp^Rwu)sMY-SFfLp6{nOX3sWH43cKp98koNiB=HEJ&{6#v8wC8nCJ>o39={oy&i>G#EX?v>YA-iq>nKGVAGokyL<6KDD2{9CmL*%^NE=*v}qGdw5A zc6Nq+g!hJX51r>rem4}9Haoto&>xhHlOH7(^){>X%1zid?{sjQ*y0)B+Te}M=|aQv zOHwK$ze~Svx=|SI{c(eB?glf}qw}KHUS6eXp8a?J)%6=+_ur@%&@a2keCe7(<*~4e zoFJQ?x!jS>DR=c{x8B=g*=Z_$k!9h>#_oQxZ+U^-A2&=Zj-ORA1C~suq}LoxiRN1@ zko4^OhhI;xEs#0>^`nNHgo*N}z7-PlGVj=@eJeb9ZA0a)mC3LB!G-vmn@5~)^XvRf zU@(mH-?QS=)RqnW)fz%^$GN9U#y^|ca>?dmMd73QZ=H`ZPiJSJSF!NpqPC1g{p)|y zxR-5dPp-(DRpAklxkI1#_-ug=aZdgEJp~)pS@Qno=T zwDooS?f+G1?&R9PvEbk&{byxz^Bi>6Oq$p8htEGQ;7w|8yI_+Jw@#di^X3V%EbdNy zhuQPz{o8(&>z?Py+5?yJJYV^1NW{r-9IlAl_~Mab+QJi8JKFE8-qUh9?Y6to8uuWZ z9RK|SdIx?i{&(_-aSV50`}&6!tYOM>QOCA!*~fQ#%JTVW7OmzzvL&jcy+$X&C&cI( zr`W?Q=Y>AEJfHC({hr&N29?R*4BR-B*Qm%n(roY$mO3P?INfZ%>T_!wJI=dKGAe8O zYOe|K3kc?%`EuQU1%vvMycLOxx%C`gg=Xj>{ZZzim{};XW_BCjwjw zUx@o?a6TqO|JR%Q;$5$6=A_I`^gMsa?BU+V=WMn4=k4ZI+x$P{)+_aNZ{6X&?LW`D z?6!H7IPcpB9{=da2H_jaHkwAyGukY1bkCh*YnE!A-Td&q;dzz5{+;)8__`#wZv~aQ z6OO5Be!G%2H_R8@XsPRstv_kR!|*PCyCrgF>U z?~LbfDuYpztU#FI>*Y4dI{r6|o*p~5-Y`4hl=trUH@3BDY7XM#KZr**?N z<$1PDI*_>)wiZCuY{qhZf#n>o=`s&YGxd*5Gf>UHv9L0J!*%XQtol_Q(K>n`8&hsI-$7Bv7Y!H)q&~6hS`@izMdnQuo?CKN`FY^_|(_ z)ABh?h+mh*Y7P6t_B+)zH3ud=Qml7A^6Xy{-(!nCNgsP2H#1fnd~$60zf^wn8mW&0 z?_+j^D9auDQtjT|uJ%g#(1(l7m2E#~YzX+hBQ^1KMO@K;r6rGZJ3G1`oUlFkO}Zu~ zdwse;!jFBY2!s{J(7K0j;0-bab^b{b^gb*%qnsPaXPNAe@n zxf|~|KuzL`Z%fw}PI{DxNISPS=jea;>Dqh$jdISJ9c!0XNPLbtn>0!FQ|NBL)ywXz z`C1<)opfD(<97u?pNb!!K29#qN{oDzcxJQ4>$;V0HfJ{9%Q5+AaNcX&?>8`(OX}#XP}#Io=TM-Oyow2Kpt^_;yUn0Lv^ zA-8{F$_$B8zqa_ty3Q4%-THAKz-3T=f5nU(aXHI9712(Uzg5XS%Ji5K5ha!rw`!-K z?h)r_%-?>b$h(;x)JwnG(ayowajPQj(OVIzr%GK)P7xXIKK94;?p?lhWV)A;aB;4S z5x0FR^Sh$oTt~Ml_lCYPU6Fr_du`_vPqQ`SxsDH~${hGr?LiLEHK#<|>`8OYP`LIcws4KBpQ zy!Wh`^hi-(rf2FF@hcnp&jjmBUh13Pn7ULgkojK6)vjGV*@xOB>=QjK?!~rjQA`s0 zG%vK=rb1BQhQYo&kET@#w;lDKSovYogoXbF)(Yr;`cm9eapK4GrSl8QobEbp-fQ(S zL%F42JZO*eWX?K?|6kZ;1QsUUns|)Mf6|TY8&1YP7YfgsUjOmC@&1nVvmB*PTQb*I zoQPOrf9Nf%z+Hik9|w{?_f*EKeoxtSVS>cR3qmFlci%GeysgTyH8IvH&3dNxOe;H^RhQlTF)Xo1VldjB%OQI?0e>~n04Oe zBhE*3U2c9j>~U)b@B8C7%u-Y@d+tuty_R`(O7xTpiE4hM`SM88<>+CX;zYqmilyDL`OgITFaMhB((IynqwY)0?8^SaV^+I7K3;H% z`o?;6vHa=JXI7}l9kYv1zV2Ue@UvZ-&(?4o9rOLi);T`Z__)ELamBgrX`s{j%w|=b zI9>Bed+tN!DKlC(>Kc6PbErwOx7uVasN~S0+0Ev(Zj%_l&zjxu_wD|E$l2uyWB-i< zkNP%PI_c`@tXOQrAIb9Qkj3c%z{=so>ycV<}b7PE2At|RIhyC)272e)VR&e(#}ZK*S8#+ zm@4M>Csp3=nV6j0hvk1eUUw`ue0w5Ew3=5~NW#4$XVZL{Br7G+zeo1=sWZ*9)akov zykYO7g{}V{)}H;FUwq_1BlF)IN=G^k&&@f$&*;q5j?9_@hmy2Co8=Xgw*=iVDi-T5 zKc?Fqx~FaDb!SHt5&oU?Z>*nG-CLIuclhwE*9uX$?3Ul@KXdp@q007!`y&n**H1Xp zA^suDhX1T~%Wv8K&~=CHD$XqKnOO8l@v(0H{?A1Y_Q%i3Z#%B=eNF8NuigBYk2t^M z-LqeiFVS5-+4JLtL&`S~H9X!?zq9<~n*^PG-)?2cHKgTxtP6e{!F#mp#!s{Ccb!l3 zWo9x<6mzs!R9>+AbrY5~Zv8vy32OAs*!u24+{1kd_Z~@}{Bbn6mtWhv8s>;pk2+Q0%)7{4Bb-C~jkA@T0 zO0UI#&A5;`FVwZGeNVj7q)l#5n^nJy{!hBEtlinZ=6lk-^&4NSzpH&zdi-E66MRnfB0j5}LwUCJ*wvj5yW!(h+c3XbSUoMM;vO!+L-6VWs^ z+UCR2zE-npd8IcAdjbTCjyIn^^w-ME=E=h&PR#E$3d*1>jg$EChHBAw4J`yP> zz~QxJ;)bZ|nW`b3u4?-E5^?o56JD}!hE)htJcDFjrQi7>%_)0Byl1-nJ}&k6f0oCb z_U1VD<>Ms3usoiJt>O;9Bn!LuD<3haTP?`1DJ|IbyII`CSZvi7M*TTynWfv! zZgpow+26h|V9V+Gob^J*#rnh*2HekP)b$DS{|qq5yJMk$d82P418E1#KK z6c-h&{lFYxlq0Dxdv3eo;mXbD?RM{Hi}ssgsBV;3aq-X#>lTA~%xA7%?P#CU-Y#1` z)5vb6xxOlg@t!A3E0?x^cg)!z{>f&^nJtB(y%ioaZQMV+dX##2(=qj<&V7fYdtcu+ zp1?2J!)~|cV_^IK%g65+U+ug4M51eE{^n=%BK}>OU&#|V<+=Lf+jc4+<|Ms46wTiq zE1Yuo^vPXnzvtagetu|8DSPS%8S{^K)^#2@ZQS*o|C%7U|8pq!v)N-V{faZsq@USt z&XQdEl|Oq~fK5-V_fb3U7Y=hkMNZ%wKJC)lpaYybP|IPVYYLVKTpQox6zs(Hv zv{`cI#`EkmzcklZM7-O3`cvE*6m-LC~<1-#tZuk&7uhuj}IFZ+8%?ke==`*JuT{K~O zt(Y2zZ)P07Om{%za#rpWYYHaM__g)9gw1pT_6kdnv|zt!$0eSnHkCa{Y&K z9;a_Lk1Y3IHGzlM&wBo@%W5{~KZG4_);xRb_W8)%rLjGR$umpeOBKJ9J{G>?s$)c% zkM*Wsmd~W_tpCDZD|0S%LptB1{GRPmlHcv`ZNBqAalXMhfhj%WZ__p&-_h)UYtG~~ zlR1?u@*mxFvfnV_Sybfbz)7aX5}$>Wh1DY6tXC9QKmXxnBRRcBC~xep2z*a#S`ysIu*?J-T1uwGsn$J$Fi!QMX&bPsqcIIZ+o@; zdil?BDr*e3%rJGlwpZr#KCxoO^BV80kLi7nO^=%Q&EWnGsrKit*J>s&Ka+Ah`L}wS z?$qaz5}$oe74Ls4xm}U@S?D`$JD*#(^rw0HNMAY@b<5Op-L2B7z^B(9)phP=Uwgii zZ}U3;bsuMRSI9kPy&u;-m-}{f-I+?m*Jo!GS*WePFFAh=XT|o6^VacizD_=F*q13^ zJ0oWKQ5)l=b<)3UQu%sg?T^Nozc<`i?DV@LTAPbB?lz|A&<|iR;fEx2t1hS#9=;t8=Z zblL`9hB)De?m9LP<0_wu%D>8vGi~Rm{ z!Uc5R?P}oz+5NUvH;gCrT>F}#GD%UBagpL}9RaqZ%O1SxoGyARuK#V$H>=I-)gMn? z64=r@k*E9bDzp1FpVQnIe=AR9lG+}-qd3GAe8^6t6KLPC!1^QT2Ol$nr6FYFA+Vy2 zBU{mxr4<&br$o%_{`^?=@XO1~$9+w&hJ;R^9NKW?@SzK<5|9E65^NB%kq>mH-oqJ& z$#)j_+eMkq18sxjm9yFLsz^mntSx{Qb0Ixs1!{>B=&Zz#A~nBWF26h3-)<)N?X1;n zpMj20tLIC-Q~7*u-oKyE%TMcWpL2NfMvlqP6YW<0|NFlF?n(9eZ?@e`livPr*Xw82 zJG*87zFaX0t9a?}x7+9Me;1iP_vx`d+1KZ+ z-|yjD>z*FJW|rNK=ku!XtlfU^6=)BudBTB)b9r6s^s%gdo$CfVUN`UVuAR&0RcURn zxUs*!9(2^w6o>sEk4b~}h6?dp=f2pw_XGMG!m@?4o~}Rj`~Cj+X7_7~&2w%TY=6J+ z_cQ$kUB+QCg|6HGd^)|m_?+eO=|z`3)pu^cUw0d{0zY(0RQ>X>%j}@rzODcN`Fz*( zdd%b22&5AWAR!3a9Hb2nL@62bygA_0JF@p5GI@U}b$aZzvxdiIKH0ocS{(lMMkIv+P2+R<`( ziRa`ySAzZD?yUd$box8cPMJg5@9*vPPOtxR(f!?V`TCOLv!>JS%`!n(Nmsw$``xDa z+~2F~>#n|B8&w{rwgVI(l%|JlpDD+d!wH z?o4C5@p*mz{e5}YBGYp(Pg_#)RoD* zQ2DE&5WKpudcNI)`%c==D}Q`EF28&I{(ran<9}IY_NcxSJ|=nmP{F&M&(B>wZWV!L znfWd*(1En^wO>QOA7JJWIa}~{>-Dm3olPA_4s)r*SG`o-{`s8s?#F%B=WM^a5Ql5DHk z4BF#znBV?RcSp2oD-nY-`D-}m+Jx81L+2DSM`53LqU z*6a<;kym&kcC_=^ z{WZ4y%5KkIuiyW!>_#HH`TISecYzk?=I(yG?cMDBeIJ$XgvZxDWsMM;Ghy#9(6K#E zk8D1ldCY2`bEHGC?*87hX1C9DPpIJSle4`wx8M+G+!o8nJ;r|uGao5B@jG1yEsEWC zJJ0&PY{mDx<-3c|+g^XK+3}!tZtb_5|Em6&moE7aDy)8|D9X6c{nXLEv9#{l%ybz} zuW6BKlI1rN+bbVVc^y-7(e>VD-8-KJ3SaH}{qA#VWbs+ky%nWzw_XRu@k!aD6N>Y) zrzx5#%}|qQE;B{rN_oF>Bmu<3;L^Et&;6DL0LuDJE@seb*( zKZ3^vISpMtvWmxCsBTv}_DJ^Bj44<)e>m6*t+4*MA?A=s3j@m&}Bc74Q|ajbs*zF)6E_p+!y)LQG#A-ez9tJQa%xOGE> zPFTKc6_5MCB&w6x5Gur<*xph3`|bAaT+3Z8oK3R(D@zO`}6F|}>{0-rxzh{;?! z)$3%+nmzXaf1ba$SWHn||ICt#j^i3Pr%&b#;qbnfvAB27b44dTxB5qkr}ri`Yv&gm>#wDC~6>*9@vlO=}?3z>YsMF5p z@|l)t_5VK4Ul+f>ZmpNPPuZUzAMJ9)^Bwy(KA!YQkxAvcv&^AvLz6xH{kGpC;@O%$ z8XlK<4BAitI)HlD+U@slowfOVCO2xTyA6-OUU+&-@S&AE%QDW}{a$ms_WNDq&AP&e z&Qx}^Uy%$HeW-Qq!=EK_9pNb}?xoGn-6O6T=4rF!+#CLm2jWtb56V@)xv2NiU|P8D z@kz19+xR8YD^5RBJSD-&E7oJ&5^57V`H^CcV1cG`rsuql_S#=xG+VzP|F*JE7}5|x zCL7mzEYLf8*dWnshRM-M3mA3<-Pk0w>yj^zjL!FNT{`xH*HtdssGfq0g{P9hPa$iAo-p-}p zza084nD5@RA?Q`hiw=jLr-J;+uYGQqo{YaytZ%}S_brsimf!P7Q@Q-iLx=auuiXdQ zzID^D@=>Sy9&_d2; zukLs5{`Q5P?ZRq4AC%M=$#;f$s5O^MdB%DKI5|x(dZhU9ZbwMRqAR@@qKsICSM_>C za(|rQbGl;sHuW6KY2jOwHN97@hbIz?A)%7kj*PWwY}z6wwC3IVTYzX+4}3-+vrn2vY8fE zY6*p{vgLnVwOs08`x1o~lgT${EfHC$c;!Ls^rw{_4m}s#%%X+1JuwxE5@_@8c-PEt z_u@Ejrx8c1n~Jfr_oq|Z>)#ybx;gD*U(Z_OdA)Py^F$wGF53V1n>J^mnAq$yUwm#D zJ^cJ;dW4_N78iMrRSP4!R&-QMb+=K`nLgoV%8gAQ%|346h`ZXeG=*c&*Z3Uy2#K0a z|25eKXXiX>Ih4QYq+0F~XO=hqc0Z3)pI7U3F>85vzw-Iqf9f{;s&dcvMwjlvsDd2A zRWDq4q$roS=Y+Z~x1fNakcZvE7R{;cX{Js54|jH0FWhld^yH}?1&<$wo&GOYKbhBF z@p|IXnM;I0ON>`{Jqq1 z5HHNHX};}TM`OqQlTVbzcI7(FNzGT|`MrJr-`tnCTFQ%cniLKtOuIR+?_{mY+g}y( zpZ;(3N<7_CW&hy-^Sf=g^NRoe{;nT;iN$O6=hOQ8V~Rn6p!3mS8@~?Y`AgpVZ}oOO zXbM}Q+u5VK&$CMI-`Dl^Ul+bq;pEzzpldUCiDt!)X~O)HuY0b(ySux(KNwp>^a?Ym zA$s%oyQ$%EA0N4IZ8MjVbK;8D^WP+Ou-!$Wg(tbC=bYv9Id*eq?ENqB>%%oC8|9Wc zuLW-Tggsm6-2SUrpi+QOFr7mkbUMWOJ3f(bOe@}Qy>4|R;fQC;DQ7;*Bf8seB>ju| zw(#)ni+c{#{dmY8&)2rX;=Il09~)i7l3P^&NuPJ#!vi+x7BJ_WHfgZ2517>-$D*nh?$1dhF=;F70(6 z9-gZZP-@xyJ>~tqy?^8SPwVfm(OhgGH}B2lj)cBI`&YYuJnH`ae{N!%#*SH%<6qt3tB^7W5MdK)?Y7k<^< z(R^IVEbop*`*WFv+pf*8sNj_}I#T`QW?{-pwUgX8y9`;J&sjg661*p)J)`C5wV4yL zSk8Fs?L4BmEwNi~*NS}og%{tXSAd3b_bUf&;+K1*(pKRW`(cO5W&Qf&hkLiF^7fm~ zh};(cYS+hO(!Y65ceG9W!_p`axMxm<$IZ-AwKGzI`aYk6vg0~7Z589+d~5PG_7?HW z>~CT-{fJb@~6Q^w{Hte~fc? zZclnO7q%AQY~^ILwM&fhCE6rRjku3+MW&`q(`ag)mGr1yc&6ju1&&&Qj`tG2FA^2@ ze&e=OiOcm_?Cm8b+P6zS?tIX*-ubTP_g&|9-m9)jJhN@{_nmhApW7asEIl{#Z%6yd z|EG;+GcYo-a0nudnmv@_)yc{QayMURV6>-+9a5-~V#E|B`LbzP_&Z>giXFg}=YO{XOsb z)pw6xZ=P58>*d3rzt&u@y7&L-tm=+e&tJzUU3xE9vv&T!pB;Y-ZC9>=M)#|7ho1et`G3~@ibtK-?D-2*ZQg7aiu)Y*`2VLJ zmGRAXo2$Q{Kk~-@eZ_I>HfzV{e{XI~J}$85_v`ELUA{PjeFpcU7PpU)oZnMcLH^~R zymp?``w;bU0v~c1a0n2udO}&T=3iZ%st<3W%K{4VdjJdDa7K&mz*FIeLyDqqB@8}KtVuUfWP_3qeOx0 z8Ay=<)w!dgLPAB1zj=q7Ff^7R5+L^+VLftKVPl2F5z|?q=tD>dC^#tSDaf&Pf*pv6 zV3>+R#*YRbI&y4s24|LkzNUPN>}^tvbS0Kd%px#|9m<cCihuBYv`|C%rC%yf5n1&e~fIp!J|>= zW5M}(wr_9W|5sN1@8|R9oBn)RZhzO$^68YFa=+c=ROI#v+Ww!0VQ0ccrpf*7tHai2 z)&IIY|CWErA@cp*9C?EZQ!`gXVeJ`3@yJD<as4e5~ZYZCAGc@t`^P^fX=O_n?mUIg7_ViX7`|P8a>( zEuFt-+EmxyZNkMtA-{xBvgszxvZj_1hbd%iUhL@7Jrc%f9AYi_cjupIi6q<)ep6 z+s_wc7MVI*4=j27uusYE9|IX&uU4FO!|G%B_o4xh-Zn6FQ_P_5Af{stkyY|mj3v|6hyT0GfSF2Xv`t|ko;&R!p z_Tv2}avoUq_O$=iJ^lSo@%ayHPk#RQWxMA0{OEW0&(-{VI{oABa}#lHRX`Fwu%wKbJ@w<~=<#_Q)lk!p2lkvuKZ!A69CdZm4=G=@74FtHwS{#elX z`uR%CGGbKYXy6Q;l=DFJaCr{%PTB8x0X)C%o3y#LQA^8VYhUn%Ik*{*G zazVNJKOf(6$NxAaz|C*}=flHdzV~~--)sEb9slRihaaFxmAC75zmxj+X7l{NIn~#9 z-xGZ(#;?4lO$b`|B8m>5kc2H2KUT;8UG?|d_WiOm`mA29c<6WN=J`|qYv1jB&Q~sW zum1mEP|GSCbg&EPkmaa)?a%CX9~u>9*2V3$I)vNt8Xq_8_pLlVP513Vc6l3x%dnO> zxOFURUG}E>PxZae^U5x|iu0ChFSGj|U}N*(^kXb-oc0L^G(K*)Z~EhsxBgb?{5^#n z_4&20qi;VuJG=e<_Po2d>i#^I-wwLYN4ECM#kaGv*Jb{_J#GK@z3;aw_gO58t$5h_ z_F8nl>^rA7i5vg_zGAM|-QIrTnY9*X%Y%{i(Z>zwQNPs*|BeAKapbb=De<)TtU1IYAFH= z?*{@x9mfyL{oVIz>iRdzvD@=vcfZ^9y3JZJ{o{uJ-+9gNYQ?OjbV@tEusyLp z=T+a~o5FY;>eku*H~0A8&)n52Z|twfRp&-;PCL7=;s@wN(DyaZtq@V7{Jd|VbX9Ts({a0R8_S;0E$5qG`D0>#jmob}9oYMIYH9-g z?SGAVt8Hq&Ty($fU;pcJ_=hhQJF>5@3;%Ny)PZ_#|_y5z;&KYWq*}z<;W#DD=X5)tc zzkZ&tx2u``X=eJooBO_PUC%o|^Tz(tpQ~1{%ZlEXBgyl7Zkw&ixA~wWVD`Sv&Cjm? z^H~1&-SYdke{Q;p$C~VUYxz-GPA%lD3TD<`bzsHE4fhQ#xI6Fvy0-n+w%psdUM`=1 zPjAnML$&2fc0Zp?23=j4RsZ|;{aZKF=ifEUy=8Lb$iMx+Z_l*D%+}?&{xqf9;OS&(9umhyRl8?v(#%urNyv zGcSa&x^=f}H>Q0o_?G_r_+dGY{U3Ytw`|S6zOBFR%i_20_P+wHKb=s%EgBwU*m8L4 z{OJ`2504&hUYRL|Y1S21F(H2bmTUL#-Pzw-`TgD9!{SS9KA$l@96dFBeVpv>*Bjy| zS5zzrKXxCpkd^Ub@|NTe-?z5%Thf_#em-|gHRR;Hvfr=4Ocb9vbW&~RJU=AdU-&%H z>8cNAQNNO_qg^}B@?*iO>^HkGBVP#A6q<2E8%w(20yVu78%@htFimX%wXW2@ox)-v z6UfAfgkIT3jE0wjqJmskd*@!G$rw@#8bBtBMI^gp=2s7}Lz32?!Aw{h3Lq0%uiX#? zl{u)T(5TnY!lZFD*3eS&Xo5t|G8_VFCi$7kV8r+EhlbBSuTh5ms7`mXJtUV6=oBEg?Z6Fxulr9~m3% zagX-6K{exO2?;76kaNdq8xpAk1qIG%j~h98fC6W@_qa#fkf2zGRuH2lB&ZNT&H|$) nBvSGK1x_OqllJ3>^^8)j{x4s6JW*s|U|{fc^>bP0l+XkKdOGE_ diff --git a/doc/workflow/workflow.md b/doc/workflow/workflow.md deleted file mode 100644 index f70e41df842..00000000000 --- a/doc/workflow/workflow.md +++ /dev/null @@ -1,31 +0,0 @@ -# Feature branch workflow - -1. Clone project: - - ```bash - git clone git@example.com:project-name.git - ``` - -1. Create branch with your feature: - - ```bash - git checkout -b $feature_name - ``` - -1. Write code. Commit changes: - - ```bash - git commit -am "My feature is ready" - ``` - -1. Push your branch to GitLab: - - ```bash - git push origin $feature_name - ``` - -1. Review your code on commits page. - -1. Create a merge request. - -1. Your team lead will review the code & merge it to the main branch. diff --git a/docker/.dockerignore b/docker/.dockerignore deleted file mode 100644 index dd449725e18..00000000000 --- a/docker/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -*.md diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index bb25bb677ca..00000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -FROM ubuntu:14.04 - -# Install required packages -RUN apt-get update -q \ - && DEBIAN_FRONTEND=noninteractive apt-get install -qy --no-install-recommends \ - ca-certificates \ - openssh-server \ - wget - -# Download & Install GitLab -# If the Omnibus package version below is outdated please contribute a merge request to update it. -# If you run GitLab Enterprise Edition point it to a location where you have downloaded it. -RUN TMP_FILE=$(mktemp); \ - wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.9.2-omnibus-1_amd64.deb \ - && dpkg -i $TMP_FILE \ - && rm -f $TMP_FILE - -# Manage SSHD through runit -RUN mkdir -p /opt/gitlab/sv/sshd/supervise \ - && mkfifo /opt/gitlab/sv/sshd/supervise/ok \ - && printf "#!/bin/sh\nexec 2>&1\numask 077\nexec /usr/sbin/sshd -D" > /opt/gitlab/sv/sshd/run \ - && chmod a+x /opt/gitlab/sv/sshd/run \ - && ln -s /opt/gitlab/sv/sshd /opt/gitlab/service \ - && mkdir -p /var/run/sshd - -# Expose web & ssh -EXPOSE 80 22 - -# Copy assets -COPY assets/wrapper /usr/local/bin/ - -# Wrapper to handle signal, trigger runit and reconfigure GitLab -CMD ["/usr/local/bin/wrapper"] diff --git a/docker/README.md b/docker/README.md deleted file mode 100644 index b7e8b0db7e7..00000000000 --- a/docker/README.md +++ /dev/null @@ -1,88 +0,0 @@ -What is GitLab? -=============== - -GitLab offers git repository management, code reviews, issue tracking, activity feeds, wikis. It has LDAP/AD integration, handles 25,000 users on a single server but can also run on a highly available active/active cluster. A subscription gives you access to our support team and to GitLab Enterprise Edition that contains extra features aimed at larger organizations. - - - -![GitLab Logo](https://gitlab.com/uploads/appearance/logo/1/brand_logo-c37eb221b456bb4b472cc1084480991f.png) - - -How to use these images -====================== - -At this moment GitLab doesn't have official Docker images. For convinience we will use suffix _xy where xy is current version of GitLab. -Build your own based on the Omnibus packages with the following commands (it assumes you're in the GitLab repo root directory): - -```bash -sudo docker build --tag gitlab_data_image docker/data/ -sudo docker build --tag gitlab_app_image_xy docker/ -``` - -We assume using a data volume container, this will simplify migrations and backups. -This empty container will exist to persist as volumes the 3 directories used by GitLab, so remember not to delete it. - -The directories on data container are: - -- `/var/opt/gitlab` for application data -- `/var/log/gitlab` for logs -- `/etc/gitlab` for configuration - -Create the data container with: - -```bash -sudo docker run --name gitlab_data gitlab_data_image /bin/true -``` - -After creating data container run GitLab container: - -```bash -sudo docker run --detach --name gitlab_app_xy --publish 8080:80 --publish 2222:22 --volumes-from gitlab_data gitlab_app_image_xy -``` - -It might take a while before the docker container is responding to queries. You can follow the configuration process with `sudo docker logs -f gitlab_app_xy`. - -You can then go to `http://localhost:8080/` (or `http://192.168.59.103:8080/` if you use boot2docker). -You can login with username `root` and password `5iveL!fe`. -Next time, you can just use `sudo docker start gitlab_app` and `sudo docker stop gitlab_app`. - - -How to configure GitLab -======================== - -This container uses the official Omnibus GitLab distribution, so all configuration is done in the unique configuration file `/etc/gitlab/gitlab.rb`. - -To access GitLab configuration, you can start an interactive command line in a new container using the shared data volume container, you will be able to browse the 3 directories and use your favorite text editor: - -```bash -sudo docker run -ti -e TERM=linux --rm --volumes-from gitlab_data ubuntu -vi /etc/gitlab/gitlab.rb -``` - -**Note** that GitLab will reconfigure itself **at each container start.** You will need to restart the container to reconfigure your GitLab. - -You can find all available options in [Omnibus GitLab documentation](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#configuration). - -How to upgrade GitLab -======================== - -To updgrade GitLab to new versions, stop running container, create new docker image and container from that image. - -It Assumes that you're upgrading from 7.8 to 7.9 and you're in the updated GitLab repo root directory: - -```bash -sudo docker stop gitlab_app_78 -sudo docker build --tag gitlab_app_image_79 docker/ -sudo docker run --detach --name gitlab_app_79 --publish 8080:80 --publish 2222:22 --volumes-from gitlab_data gitlab_app_image_79 -``` - -On the first run GitLab will reconfigure and update itself. If everything runs OK don't forget to cleanup old container and image: - -```bash -sudo docker rm gitlab_app_78 -sudo docker rmi gitlab_app_image_78 -``` - -Troubleshooting -========================= -Please see the [troubleshooting](troubleshooting.md) file in this directory. diff --git a/docker/assets/wrapper b/docker/assets/wrapper deleted file mode 100755 index 9e6e7a05903..00000000000 --- a/docker/assets/wrapper +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -function sigterm_handler() { - echo "SIGTERM signal received, try to gracefully shutdown all services..." - gitlab-ctl stop -} - -trap "sigterm_handler; exit" TERM - -function entrypoint() { - # Default is to run runit and reconfigure GitLab - gitlab-ctl reconfigure & - /opt/gitlab/embedded/bin/runsvdir-start & - wait -} - -entrypoint diff --git a/docker/data/Dockerfile b/docker/data/Dockerfile deleted file mode 100644 index ea0175c4aa2..00000000000 --- a/docker/data/Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM busybox - -# Declare volumes -VOLUME ["/var/opt/gitlab", "/var/log/gitlab", "/etc/gitlab"] -# Copy assets -COPY assets/gitlab.rb /etc/gitlab/ - -CMD /bin/sh diff --git a/docker/data/assets/gitlab.rb b/docker/data/assets/gitlab.rb deleted file mode 100644 index 7fddf309c01..00000000000 --- a/docker/data/assets/gitlab.rb +++ /dev/null @@ -1,37 +0,0 @@ -# External URL should be your Docker instance. -# By default, this example is the "standard" boot2docker IP. -# Always use port 80 here to force the internal nginx to bind port 80, -# even if you intend to use another port in Docker. -external_url "http://192.168.59.103/" - -# Prevent Postgres from trying to allocate 25% of total memory -postgresql['shared_buffers'] = '1MB' - -# Configure GitLab to redirect PostgreSQL logs to the data volume -postgresql['log_directory'] = '/var/log/gitlab/postgresql' - -# Some configuration of GitLab -# You can find more at https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#configuration -gitlab_rails['gitlab_email_from'] = 'gitlab@example.com' -gitlab_rails['gitlab_support_email'] = 'support@example.com' -gitlab_rails['time_zone'] = 'Europe/Paris' - -# SMTP settings -# You must use an external server, the Docker container does not install an SMTP server -gitlab_rails['smtp_enable'] = true -gitlab_rails['smtp_address'] = "smtp.example.com" -gitlab_rails['smtp_port'] = 587 -gitlab_rails['smtp_user_name'] = "user" -gitlab_rails['smtp_password'] = "password" -gitlab_rails['smtp_domain'] = "example.com" -gitlab_rails['smtp_authentication'] = "plain" -gitlab_rails['smtp_enable_starttls_auto'] = true - -# Enable LDAP authentication -# gitlab_rails['ldap_enabled'] = true -# gitlab_rails['ldap_host'] = 'ldap.example.com' -# gitlab_rails['ldap_port'] = 389 -# gitlab_rails['ldap_method'] = 'plain' # 'ssl' or 'plain' -# gitlab_rails['ldap_allow_username_or_email_login'] = false -# gitlab_rails['ldap_uid'] = 'uid' -# gitlab_rails['ldap_base'] = 'ou=users,dc=example,dc=com' diff --git a/docker/troubleshooting.md b/docker/troubleshooting.md deleted file mode 100644 index b1b70de5997..00000000000 --- a/docker/troubleshooting.md +++ /dev/null @@ -1,63 +0,0 @@ -# Troubleshooting - -This is to troubleshoot https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/245 -But it might contain useful commands for other cases as well. - -The configuration to add the postgres log in vim is: -postgresql['log_directory'] = '/var/log/gitlab/postgresql' - -# Commands - -```bash -sudo docker build --tag gitlab_image docker/ - -sudo docker rm -f gitlab_app -sudo docker rm -f gitlab_data - -sudo docker run --name gitlab_data gitlab_image /bin/true - -sudo docker run -ti --rm --volumes-from gitlab_data ubuntu apt-get update && sudo apt-get install -y vim && sudo vim /etc/gitlab/gitlab.rb - -sudo docker run --detach --name gitlab_app --publish 8080:80 --publish 2222:22 --volumes-from gitlab_data gitlab_image - -sudo docker run -t --rm --volumes-from gitlab_data ubuntu tail -f /var/log/gitlab/reconfigure.log - -sudo docker run -t --rm --volumes-from gitlab_data ubuntu tail -f /var/log/gitlab/postgresql/current - -sudo docker run -t --rm --volumes-from gitlab_data ubuntu cat /var/opt/gitlab/postgresql/data/postgresql.conf | grep shared_buffers - -sudo docker run -t --rm --volumes-from gitlab_data ubuntu cat /etc/gitlab/gitlab.rb -``` - -# Interactively - -```bash -# First start a GitLab container without starting GitLab -# This is almost the same as starting the GitLab container except: -# - we run interactively (-t -i) -# - we define TERM=linux because it allows to use arrow keys in vi (!!!) -# - we choose another startup command (bash) -sudo docker run -ti -e TERM=linux --name gitlab_app --publish 8080:80 --publish 2222:22 --volumes-from gitlab_data gitlab_image bash - -# Configure GitLab to redirect PostgreSQL logs -echo "postgresql['log_directory'] = '/var/log/gitlab/postgresql'" >> /etc/gitlab/gitlab.rb - -# Prevent Postgres from allocating 25% of total memory -echo "postgresql['shared_buffers'] = '1MB'" >> /etc/gitlab/gitlab.rb - -# You can now start GitLab manually from Bash (in the background) -# Maybe the command below is still missing something to run in the background -gitlab-ctl reconfigure > /var/log/gitlab/reconfigure.log & /opt/gitlab/embedded/bin/runsvdir-start & - -# Inspect PostgreSQL config -cat /var/opt/gitlab/postgresql/data/postgresql.conf | grep shared_buffers - -# And tail the logs (PostgreSQL log may not exist immediately) -tail -f /var/log/gitlab/reconfigure.log /var/log/gitlab/postgresql/current - -# And get the memory -cat /proc/meminfo -head /proc/sys/kernel/shmmax /proc/sys/kernel/shmall -free -m - -``` diff --git a/features/admin/active_tab.feature b/features/admin/active_tab.feature deleted file mode 100644 index 5de07e90e28..00000000000 --- a/features/admin/active_tab.feature +++ /dev/null @@ -1,44 +0,0 @@ -@admin -Feature: Admin Active Tab - Background: - Given I sign in as an admin - - Scenario: On Admin Home - Given I visit admin page - Then the active main tab should be Home - And no other main tabs should be active - - Scenario: On Admin Projects - Given I visit admin projects page - Then the active main tab should be Projects - And no other main tabs should be active - - Scenario: On Admin Groups - Given I visit admin groups page - Then the active main tab should be Groups - And no other main tabs should be active - - Scenario: On Admin Users - Given I visit admin users page - Then the active main tab should be Users - And no other main tabs should be active - - Scenario: On Admin Logs - Given I visit admin logs page - Then the active main tab should be Logs - And no other main tabs should be active - - Scenario: On Admin Messages - Given I visit admin messages page - Then the active main tab should be Messages - And no other main tabs should be active - - Scenario: On Admin Hooks - Given I visit admin hooks page - Then the active main tab should be Hooks - And no other main tabs should be active - - Scenario: On Admin Resque - Given I visit admin Resque page - Then the active main tab should be Resque - And no other main tabs should be active diff --git a/features/admin/applications.feature b/features/admin/applications.feature deleted file mode 100644 index 2a00e1666c0..00000000000 --- a/features/admin/applications.feature +++ /dev/null @@ -1,18 +0,0 @@ -@admin -Feature: Admin Applications - Background: - Given I sign in as an admin - And I visit applications page - - Scenario: I can manage application - Then I click on new application button - And I should see application form - Then I fill application form out and submit - And I see application - Then I click edit - And I see edit application form - Then I change name of application and submit - And I see that application was changed - Then I visit applications page - And I click to remove application - Then I see that application is removed \ No newline at end of file diff --git a/features/admin/broadcast_messages.feature b/features/admin/broadcast_messages.feature deleted file mode 100644 index b2c3112320a..00000000000 --- a/features/admin/broadcast_messages.feature +++ /dev/null @@ -1,21 +0,0 @@ -@admin -Feature: Admin Broadcast Messages - Background: - Given I sign in as an admin - And application already has admin messages - And I visit admin messages page - - Scenario: See broadcast messages list - Then I should be all broadcast messages - - Scenario: Create a broadcast message - When submit form with new broadcast message - Then I should be redirected to admin messages page - And I should see newly created broadcast message - - Scenario: Create a customized broadcast message - When submit form with new customized broadcast message - Then I should be redirected to admin messages page - And I should see newly created broadcast message - Then I visit dashboard page - And I should see a customized broadcast message diff --git a/features/admin/deploy_keys.feature b/features/admin/deploy_keys.feature deleted file mode 100644 index 9df47eb51fd..00000000000 --- a/features/admin/deploy_keys.feature +++ /dev/null @@ -1,21 +0,0 @@ -@admin -Feature: Admin Deploy Keys - Background: - Given I sign in as an admin - And there are public deploy keys in system - - Scenario: Deploy Keys list - When I visit admin deploy keys page - Then I should see all public deploy keys - - Scenario: Deploy Keys show - When I visit admin deploy keys page - And I click on first deploy key - Then I should see deploy key details - - Scenario: Deploy Keys new - When I visit admin deploy keys page - And I click 'New Deploy Key' - And I submit new deploy key - Then I should be on admin deploy keys page - And I should see newly created deploy key diff --git a/features/admin/groups.feature b/features/admin/groups.feature deleted file mode 100644 index aa365a6ea1a..00000000000 --- a/features/admin/groups.feature +++ /dev/null @@ -1,29 +0,0 @@ -@admin -Feature: Admin Groups - Background: - Given I sign in as an admin - And I have group with projects - And User "John Doe" exists - And I visit admin groups page - - Scenario: See group list - Then I should be all groups - - Scenario: Create a group - When I click new group link - And submit form with new group info - Then I should be redirected to group page - And I should see newly created group - - @javascript - Scenario: Add user into projects in group - When I visit admin group page - When I select user "John Doe" from user list as "Reporter" - Then I should see "John Doe" in team list in every project as "Reporter" - - @javascript - Scenario: Remove user from group - Given we have user "John Doe" in group - When I visit admin group page - And I remove user "John Doe" from group - Then I should not see "John Doe" in team list diff --git a/features/admin/logs.feature b/features/admin/logs.feature deleted file mode 100644 index ceb3bc34927..00000000000 --- a/features/admin/logs.feature +++ /dev/null @@ -1,8 +0,0 @@ -@admin -Feature: Admin Logs - Background: - Given I sign in as an admin - - Scenario: On Admin Logs - Given I visit admin logs page - Then I should see tabs with available logs diff --git a/features/admin/projects.feature b/features/admin/projects.feature deleted file mode 100644 index a6c3d6b7822..00000000000 --- a/features/admin/projects.feature +++ /dev/null @@ -1,20 +0,0 @@ -@admin -Feature: Admin Projects - Background: - Given I sign in as an admin - And there are projects in system - - Scenario: Projects list - When I visit admin projects page - Then I should see all projects - - Scenario: Projects show - When I visit admin projects page - And I click on first project - Then I should see project details - - Scenario: Transfer project - Given group 'Web' - And I visit admin project page - When I transfer project to group 'Web' - Then I should see project transfered diff --git a/features/admin/settings.feature b/features/admin/settings.feature deleted file mode 100644 index 52e47307b23..00000000000 --- a/features/admin/settings.feature +++ /dev/null @@ -1,16 +0,0 @@ -@admin -Feature: Admin Settings - Background: - Given I sign in as an admin - And I visit admin settings page - - Scenario: Change application settings - When I modify settings and save form - Then I should see application settings saved - - Scenario: Change Slack Service Template settings - When I click on "Service Templates" - And I click on "Slack" service - Then I check all events and submit form - And I should see service template settings saved - And I should see all checkboxes checked diff --git a/features/admin/users.feature b/features/admin/users.feature deleted file mode 100644 index 1a8720dd77e..00000000000 --- a/features/admin/users.feature +++ /dev/null @@ -1,47 +0,0 @@ -@admin -Feature: Admin Users - Background: - Given I sign in as an admin - And system has users - - Scenario: On Admin Users - Given I visit admin users page - Then I should see all users - - Scenario: Edit user and change username to non ascii char - When I visit admin users page - And Click edit - And Input non ascii char in username - And Click save - Then See username error message - And Not changed form action url - - Scenario: Show user attributes - Given user "Mike" with groups and projects - Given I visit admin users page - And click on "Mike" link - Then I should see user "Mike" details - - Scenario: Edit my user attributes - Given I visit admin users page - And click edit on my user - When I submit modified user - Then I see user attributes changed - -@javascript - Scenario: Remove users secondary email - Given I visit admin users page - And I view the user with secondary email - And I see the secondary email - When I click remove secondary email - Then I should not see secondary email anymore - - Scenario: Show user keys - Given user "Pete" with ssh keys - And I visit admin users page - And click on user "Pete" - Then I should see key list - And I click on the key title - Then I should see key details - And I click on remove key - Then I should see the key removed diff --git a/features/dashboard/active_tab.feature b/features/dashboard/active_tab.feature deleted file mode 100644 index 08b87808f33..00000000000 --- a/features/dashboard/active_tab.feature +++ /dev/null @@ -1,24 +0,0 @@ -@dashboard -Feature: Dashboard Active Tab - Background: - Given I sign in as a user - - Scenario: On Dashboard Home - Given I visit dashboard page - Then the active main tab should be Home - And no other main tabs should be active - - Scenario: On Dashboard Issues - Given I visit dashboard issues page - Then the active main tab should be Issues - And no other main tabs should be active - - Scenario: On Dashboard Merge Requests - Given I visit dashboard merge requests page - Then the active main tab should be Merge Requests - And no other main tabs should be active - - Scenario: On Dashboard Help - Given I visit dashboard help page - Then the active main tab should be Help - And no other main tabs should be active diff --git a/features/dashboard/archived_projects.feature b/features/dashboard/archived_projects.feature deleted file mode 100644 index 69b3a776441..00000000000 --- a/features/dashboard/archived_projects.feature +++ /dev/null @@ -1,12 +0,0 @@ -@dashboard -Feature: Dashboard Archived Projects - Background: - Given I sign in as a user - And I own project "Shop" - And I own project "Forum" - And project "Forum" is archived - And I visit dashboard page - - Scenario: I should see non-archived projects on dashboard - Then I should see "Shop" project link - And I should not see "Forum" project link diff --git a/features/dashboard/dashboard.feature b/features/dashboard/dashboard.feature deleted file mode 100644 index 1959d327082..00000000000 --- a/features/dashboard/dashboard.feature +++ /dev/null @@ -1,37 +0,0 @@ -@dashboard -Feature: Dashboard - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has push event - And I visit dashboard page - - @javascript - Scenario: I should see projects list - Then I should see "New Project" link - Then I should see "Shop" project link - Then I should see project "Shop" activity feed - - Scenario: I should see groups list - Given I have group with projects - And I visit dashboard page - Then I should see groups list - - @javascript - Scenario: I should see last push widget - Then I should see last push widget - And I click "Create Merge Request" link - Then I see prefilled new Merge Request page - - @javascript - Scenario: I should see User joined Project event - Given user with name "John Doe" joined project "Shop" - When I visit dashboard page - Then I should see "John Doe joined project Shop" event - - @javascript - Scenario: I should see User left Project event - Given user with name "John Doe" joined project "Shop" - And user with name "John Doe" left project "Shop" - When I visit dashboard page - Then I should see "John Doe left project Shop" event diff --git a/features/dashboard/event_filters.feature b/features/dashboard/event_filters.feature deleted file mode 100644 index ec5680caba6..00000000000 --- a/features/dashboard/event_filters.feature +++ /dev/null @@ -1,52 +0,0 @@ -@dashboard -Feature: Event Filters - Background: - Given I sign in as a user - And I own a project - And this project has push event - And this project has new member event - And this project has merge request event - And I visit dashboard page - - @javascript - Scenario: I should see all events - Then I should see push event - And I should see new member event - And I should see merge request event - - @javascript - Scenario: I should see only pushed events - When I click "push" event filter - Then I should see push event - And I should not see new member event - And I should not see merge request event - - @javascript - Scenario: I should see only joined events - When I click "team" event filter - Then I should see new member event - And I should not see push event - And I should not see merge request event - - @javascript - Scenario: I should see only merged events - When I click "merge" event filter - Then I should see merge request event - And I should not see push event - And I should not see new member event - - @javascript - Scenario: I should see only selected events while page reloaded - When I click "push" event filter - And I visit dashboard page - Then I should see push event - And I should not see new member event - When I click "team" event filter - And I visit dashboard page - Then I should see push event - And I should see new member event - And I should not see merge request event - When I click "push" event filter - Then I should not see push event - And I should see new member event - And I should not see merge request event diff --git a/features/dashboard/group.feature b/features/dashboard/group.feature deleted file mode 100644 index cf4b8d7283b..00000000000 --- a/features/dashboard/group.feature +++ /dev/null @@ -1,56 +0,0 @@ -@dashboard -Feature: Dashboard Group - Background: - Given I sign in as "John Doe" - And "John Doe" is owner of group "Owned" - And "John Doe" is guest of group "Guest" - - # Leave groups - - @javascript - Scenario: Owner should be able to leave from group if he is not the last owner - Given "Mary Jane" is owner of group "Owned" - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should see group "Guest" in group list - When I click on the "Leave" button for group "Owned" - And I visit dashboard groups page - Then I should not see group "Owned" in group list - Then I should see group "Guest" in group list - - @javascript - Scenario: Owner should not be able to leave from group if he is the last owner - Given "Mary Jane" is guest of group "Owned" - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should see group "Guest" in group list - Then I should not see the "Leave" button for group "Owned" - - @javascript - Scenario: Guest should be able to leave from group - Given "Mary Jane" is guest of group "Guest" - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should see group "Guest" in group list - When I click on the "Leave" button for group "Guest" - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should not see group "Guest" in group list - - @javascript - Scenario: Guest should be able to leave from group even if he is the only user in the group - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should see group "Guest" in group list - When I click on the "Leave" button for group "Guest" - When I visit dashboard groups page - Then I should see group "Owned" in group list - Then I should not see group "Guest" in group list - - Scenario: Create a group from dasboard - And I visit dashboard groups page - And I click new group link - And submit form with new group "Samurai" info - Then I should be redirected to group "Samurai" page - And I should see newly created group "Samurai" - diff --git a/features/dashboard/help.feature b/features/dashboard/help.feature deleted file mode 100644 index bca2772897b..00000000000 --- a/features/dashboard/help.feature +++ /dev/null @@ -1,9 +0,0 @@ -@dashboard -Feature: Dashboard Help - Background: - Given I sign in as a user - And I visit the "Rake Tasks" help page - - Scenario: The markdown should be rendered correctly - Then I should see "Rake Tasks" page markdown rendered - And Header "Rebuild project satellites" should have correct ids and links diff --git a/features/dashboard/issues.feature b/features/dashboard/issues.feature deleted file mode 100644 index 99dad88a402..00000000000 --- a/features/dashboard/issues.feature +++ /dev/null @@ -1,21 +0,0 @@ -@dashboard -Feature: Dashboard Issues - Background: - Given I sign in as a user - And I have authored issues - And I have assigned issues - And I have other issues - And I visit dashboard issues page - - Scenario: I should see assigned issues - Then I should see issues assigned to me - - @javascript - Scenario: I should see authored issues - When I click "Authored by me" link - Then I should see issues authored by me - - @javascript - Scenario: I should see all issues - When I click "All" link - Then I should see all issues diff --git a/features/dashboard/merge_requests.feature b/features/dashboard/merge_requests.feature deleted file mode 100644 index 4a2c997d707..00000000000 --- a/features/dashboard/merge_requests.feature +++ /dev/null @@ -1,21 +0,0 @@ -@dashboard -Feature: Dashboard Merge Requests - Background: - Given I sign in as a user - And I have authored merge requests - And I have assigned merge requests - And I have other merge requests - And I visit dashboard merge requests page - - Scenario: I should see assigned merge_requests - Then I should see merge requests assigned to me - - @javascript - Scenario: I should see authored merge_requests - When I click "Authored by me" link - Then I should see merge requests authored by me - - @javascript - Scenario: I should see all merge_requests - When I click "All" link - Then I should see all merge requests diff --git a/features/dashboard/new_project.feature b/features/dashboard/new_project.feature deleted file mode 100644 index 431dc4ccfcb..00000000000 --- a/features/dashboard/new_project.feature +++ /dev/null @@ -1,13 +0,0 @@ -@dashboard -Feature: New Project -Background: - Given I sign in as a user - And I own project "Shop" - And I visit dashboard page - - @javascript - Scenario: I should see New projects page - Given I click "New project" link - Then I see "New project" page - When I click on "Import project from GitHub" - Then I see instructions on how to import from GitHub diff --git a/features/dashboard/shortcuts.feature b/features/dashboard/shortcuts.feature deleted file mode 100644 index 41d79aa6ec8..00000000000 --- a/features/dashboard/shortcuts.feature +++ /dev/null @@ -1,21 +0,0 @@ -@dashboard -Feature: Dashboard Shortcuts - Background: - Given I sign in as a user - And I visit dashboard page - - @javascript - Scenario: Navigate to projects tab - Given I press "g" and "p" - Then the active main tab should be Projects - - @javascript - Scenario: Navigate to issue tab - Given I press "g" and "i" - Then the active main tab should be Issues - - @javascript - Scenario: Navigate to merge requests tab - Given I press "g" and "m" - Then the active main tab should be Merge Requests - diff --git a/features/dashboard/starred_projects.feature b/features/dashboard/starred_projects.feature deleted file mode 100644 index 9dfd2fbab9c..00000000000 --- a/features/dashboard/starred_projects.feature +++ /dev/null @@ -1,12 +0,0 @@ -@dashboard -Feature: Dashboard Starred Projects - Background: - Given I sign in as a user - And public project "Community" - And I starred project "Community" - And I own project "Shop" - And I visit dashboard starred projects page - - Scenario: I should see projects list - Then I should see project "Community" - And I should not see project "Shop" diff --git a/features/explore/groups.feature b/features/explore/groups.feature deleted file mode 100644 index c11634bd74a..00000000000 --- a/features/explore/groups.feature +++ /dev/null @@ -1,147 +0,0 @@ -@public -Feature: Explore Groups - Background: - Given group "TestGroup" has private project "Enterprise" - - Scenario: I should not see group with private projects as visitor - When I visit group "TestGroup" page - Then I should be redirected to sign in page - - Scenario: I should not see group with private projects group as user - When I sign in as a user - And I visit group "TestGroup" page - Then page status code should be 404 - - Scenario: I should not see group with private and internal projects as visitor - Given group "TestGroup" has internal project "Internal" - When I visit group "TestGroup" page - Then I should be redirected to sign in page - - Scenario: I should see group with private and internal projects as user - Given group "TestGroup" has internal project "Internal" - When I sign in as a user - And I visit group "TestGroup" page - Then I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group issues for internal project as user - Given group "TestGroup" has internal project "Internal" - When I sign in as a user - And I visit group "TestGroup" issues page - Then I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group merge requests for internal project as user - Given group "TestGroup" has internal project "Internal" - When I sign in as a user - And I visit group "TestGroup" merge requests page - Then I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group's members as user - Given group "TestGroup" has internal project "Internal" - And "John Doe" is owner of group "TestGroup" - When I sign in as a user - And I visit group "TestGroup" members page - Then I should see group member "John Doe" - And I should not see member roles - - Scenario: I should see group with private, internal and public projects as visitor - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I visit group "TestGroup" page - Then I should see project "Community" items - And I should not see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group issues for public project as visitor - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I visit group "TestGroup" issues page - Then I should see project "Community" items - And I should not see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group merge requests for public project as visitor - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I visit group "TestGroup" merge requests page - Then I should see project "Community" items - And I should not see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group's members as visitor - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - And "John Doe" is owner of group "TestGroup" - When I visit group "TestGroup" members page - Then I should see group member "John Doe" - And I should not see member roles - - Scenario: I should see group with private, internal and public projects as user - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I sign in as a user - And I visit group "TestGroup" page - Then I should see project "Community" items - And I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group issues for internal and public projects as user - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I sign in as a user - And I visit group "TestGroup" issues page - Then I should see project "Community" items - And I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group merge requests for internal and public projects as user - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - When I sign in as a user - And I visit group "TestGroup" merge requests page - Then I should see project "Community" items - And I should see project "Internal" items - And I should not see project "Enterprise" items - - Scenario: I should see group's members as user - Given group "TestGroup" has internal project "Internal" - Given group "TestGroup" has public project "Community" - And "John Doe" is owner of group "TestGroup" - When I sign in as a user - And I visit group "TestGroup" members page - Then I should see group member "John Doe" - And I should not see member roles - - Scenario: I should see group with public project in public groups area - Given group "TestGroup" has public project "Community" - When I visit the public groups area - Then I should see group "TestGroup" - - Scenario: I should not see group with internal project in public groups area - Given group "TestGroup" has internal project "Internal" - When I visit the public groups area - Then I should not see group "TestGroup" - - Scenario: I should not see group with private project in public groups area - When I visit the public groups area - Then I should not see group "TestGroup" - - Scenario: I should see group with public project in public groups area as user - Given group "TestGroup" has public project "Community" - When I sign in as a user - And I visit the public groups area - Then I should see group "TestGroup" - - Scenario: I should see group with internal project in public groups area as user - Given group "TestGroup" has internal project "Internal" - When I sign in as a user - And I visit the public groups area - Then I should see group "TestGroup" - - Scenario: I should not see group with private project in public groups area as user - When I sign in as a user - And I visit the public groups area - Then I should not see group "TestGroup" - diff --git a/features/explore/projects.feature b/features/explore/projects.feature deleted file mode 100644 index a1b29722678..00000000000 --- a/features/explore/projects.feature +++ /dev/null @@ -1,116 +0,0 @@ -@public -Feature: Explore Projects - Background: - Given public project "Community" - And internal project "Internal" - And private project "Enterprise" - - Scenario: I visit public area - When I visit the public projects area - Then I should see project "Community" - And I should not see project "Internal" - And I should not see project "Enterprise" - - Scenario: I visit public project page - When I visit project "Community" page - Then I should see project "Community" home page - - Scenario: I visit internal project page - When I visit project "Internal" page - Then I should be redirected to sign in page - - Scenario: I visit private project page - When I visit project "Enterprise" page - Then I should be redirected to sign in page - - Scenario: I visit an empty public project page - Given public empty project "Empty Public Project" - When I visit empty project page - Then I should see empty public project details - And I should see empty public project details with http clone info - - Scenario: I visit an empty public project page as user - Given I sign in as a user - And public empty project "Empty Public Project" - When I visit empty project page - Then I should see empty public project details - And I should see empty public project details with ssh clone info - - Scenario: I visit public area as user - Given I sign in as a user - When I visit the public projects area - Then I should see project "Community" - And I should see project "Internal" - And I should not see project "Enterprise" - - Scenario: I visit internal project page as user - Given I sign in as a user - When I visit project "Internal" page - Then I should see project "Internal" home page - - Scenario: I visit public project page - When I visit project "Community" page - Then I should see project "Community" home page - And I should see an http link to the repository - - Scenario: I visit public project page as user - Given I sign in as a user - When I visit project "Community" page - Then I should see project "Community" home page - And I should see an ssh link to the repository - - Scenario: I visit an empty public project page - Given public empty project "Empty Public Project" - When I visit empty project page - Then I should see empty public project details - - Scenario: I visit public project issues page as a non authorized user - Given I visit project "Community" page - And I visit "Community" issues page - Then I should see list of issues for "Community" project - - Scenario: I visit public project issues page as authorized user - Given I sign in as a user - Given I visit project "Community" page - And I visit "Community" issues page - Then I should see list of issues for "Community" project - - Scenario: I visit internal project issues page as authorized user - Given I sign in as a user - Given I visit project "Internal" page - And I visit "Internal" issues page - Then I should see list of issues for "Internal" project - - Scenario: I visit public project merge requests page as an authorized user - Given I sign in as a user - Given I visit project "Community" page - And I visit "Community" merge requests page - And project "Community" has "Bug fix" open merge request - Then I should see list of merge requests for "Community" project - - Scenario: I visit public project merge requests page as a non authorized user - Given I visit project "Community" page - And I visit "Community" merge requests page - And project "Community" has "Bug fix" open merge request - Then I should see list of merge requests for "Community" project - - Scenario: I visit internal project merge requests page as an authorized user - Given I sign in as a user - Given I visit project "Internal" page - And I visit "Internal" merge requests page - And project "Internal" has "Feature implemented" open merge request - Then I should see list of merge requests for "Internal" project - - Scenario: Trending page - Given I sign in as a user - And project "Community" has comments - When I visit the explore trending projects - Then I should see project "Community" - And I should not see project "Internal" - And I should not see project "Enterprise" - - Scenario: Most starred page - Given I sign in as a user - When I visit the explore starred projects - Then I should see project "Community" - And I should see project "Internal" diff --git a/features/groups.feature b/features/groups.feature deleted file mode 100644 index 415e43d6ae7..00000000000 --- a/features/groups.feature +++ /dev/null @@ -1,150 +0,0 @@ -Feature: Groups - Background: - Given I sign in as "John Doe" - And "John Doe" is owner of group "Owned" - And "John Doe" is guest of group "Guest" - - @javascript - Scenario: I should see group "Owned" dashboard list - When I visit group "Owned" page - Then I should see group "Owned" projects list - And I should see projects activity feed - - Scenario: I should see group "Owned" issues list - Given project from group "Owned" has issues assigned to me - When I visit group "Owned" issues page - Then I should see issues from group "Owned" assigned to me - - Scenario: I should see group "Owned" merge requests list - Given project from group "Owned" has merge requests assigned to me - When I visit group "Owned" merge requests page - Then I should see merge requests from group "Owned" assigned to me - - @javascript - Scenario: I should add user to projects in group "Owned" - Given User "Mary Jane" exists - When I visit group "Owned" members page - And I select user "Mary Jane" from list with role "Reporter" - Then I should see user "Mary Jane" in team list - - Scenario: I should see edit group "Owned" page - When I visit group "Owned" settings page - And I change group "Owned" name to "new-name" - Then I should see new group "Owned" name - - Scenario: I edit group "Owned" avatar - When I visit group "Owned" settings page - And I change group "Owned" avatar - And I visit group "Owned" settings page - Then I should see new group "Owned" avatar - And I should see the "Remove avatar" button - - Scenario: I remove group "Owned" avatar - When I visit group "Owned" settings page - And I have group "Owned" avatar - And I visit group "Owned" settings page - And I remove group "Owned" avatar - Then I should not see group "Owned" avatar - And I should not see the "Remove avatar" button - - @javascript - Scenario: Add user to group - Given gitlab user "Mike" - When I visit group "Owned" members page - And I click link "Add members" - When I select "Mike" as "Reporter" - Then I should see "Mike" in team list as "Reporter" - - @javascript - Scenario: Invite user to group - When I visit group "Owned" members page - And I click link "Add members" - When I select "sjobs@apple.com" as "Reporter" - Then I should see "sjobs@apple.com" in team list as invited "Reporter" - - # Leave - - @javascript - Scenario: Owner should be able to remove himself from group if he is not the last owner - Given "Mary Jane" is owner of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "John Doe" - And I visit group "Owned" members page - Then I should not see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - - @javascript - Scenario: Owner should not be able to remove himself from group if he is the last owner - Given "Mary Jane" is guest of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - Then I should not see the "Remove User From Group" button for "John Doe" - - @javascript - Scenario: Guest should be able to remove himself from group - Given "Mary Jane" is guest of group "Guest" - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "John Doe" - When I visit group "Guest" members page - Then I should not see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - - @javascript - Scenario: Guest should be able to remove himself from group even if he is the only user in the group - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - When I click on the "Remove User From Group" button for "John Doe" - When I visit group "Guest" members page - Then I should not see user "John Doe" in team list - - # Remove others - - Scenario: Owner should be able to remove other users from group - Given "Mary Jane" is owner of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "Mary Jane" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should not see user "Mary Jane" in team list - - Scenario: Guest should not be able to remove other users from group - Given "Mary Jane" is guest of group "Guest" - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - Then I should not see the "Remove User From Group" button for "Mary Jane" - - Scenario: Search member by name - Given "Mary Jane" is guest of group "Guest" - And I visit group "Guest" members page - When I search for 'Mary' member - Then I should see user "Mary Jane" in team list - Then I should not see user "John Doe" in team list - - # Group milestones - - Scenario: I should see group "Owned" milestone index page with no milestones - When I visit group "Owned" page - And I click on group milestones - Then I should see group milestones index page has no milestones - - Scenario: I should see group "Owned" milestone index page with milestones - Given Group has projects with milestones - When I visit group "Owned" page - And I click on group milestones - Then I should see group milestones index page with milestones - - Scenario: I should see group "Owned" milestone show page - Given Group has projects with milestones - When I visit group "Owned" page - And I click on group milestones - And I click on one group milestone - Then I should see group milestone with descriptions and expiry date - And I should see group milestone with all issues and MRs assigned to that milestone diff --git a/features/invites.feature b/features/invites.feature deleted file mode 100644 index dc8eefaeaed..00000000000 --- a/features/invites.feature +++ /dev/null @@ -1,45 +0,0 @@ -Feature: Invites - Background: - Given "John Doe" is owner of group "Owned" - And "John Doe" has invited "user@example.com" to group "Owned" - - Scenario: Viewing invitation when signed out - When I visit the invitation page - Then I should be redirected to the sign in page - And I should see a notice telling me to sign in - - Scenario: Signing in to view invitation - When I visit the invitation page - And I sign in as "Mary Jane" - Then I should be redirected to the invitation page - - Scenario: Viewing invitation when signed in - Given I sign in as "Mary Jane" - And I visit the invitation page - Then I should see the invitation details - And I should see an "Accept invitation" button - And I should see a "Decline" button - - Scenario: Viewing invitation as an existing member - Given I sign in as "John Doe" - And I visit the invitation page - Then I should see a message telling me I'm already a member - - Scenario: Accepting the invitation - Given I sign in as "Mary Jane" - And I visit the invitation page - And I click the "Accept invitation" button - Then I should be redirected to the group page - And I should see a notice telling me I have access - - Scenario: Declining the application when signed in - Given I sign in as "Mary Jane" - And I visit the invitation page - And I click the "Decline" button - Then I should be redirected to the dashboard - And I should see a notice telling me I have declined - - Scenario: Declining the application when signed out - When I visit the invitation's decline page - Then I should be redirected to the sign in page - And I should see a notice telling me I have declined diff --git a/features/profile/active_tab.feature b/features/profile/active_tab.feature deleted file mode 100644 index 7801ae5b8ca..00000000000 --- a/features/profile/active_tab.feature +++ /dev/null @@ -1,29 +0,0 @@ -@profile -Feature: Profile Active Tab - Background: - Given I sign in as a user - - Scenario: On Profile Home - Given I visit profile page - Then the active main tab should be Home - And no other main tabs should be active - - Scenario: On Profile Account - Given I visit profile account page - Then the active main tab should be Account - And no other main tabs should be active - - Scenario: On Profile SSH Keys - Given I visit profile SSH keys page - Then the active main tab should be SSH Keys - And no other main tabs should be active - - Scenario: On Profile Design - Given I visit profile design page - Then the active main tab should be Design - And no other main tabs should be active - - Scenario: On Profile History - Given I visit profile history page - Then the active main tab should be History - And no other main tabs should be active diff --git a/features/profile/emails.feature b/features/profile/emails.feature deleted file mode 100644 index 19ed949f6ae..00000000000 --- a/features/profile/emails.feature +++ /dev/null @@ -1,26 +0,0 @@ -@profile -Feature: Profile Emails - Background: - Given I sign in as a user - And I visit profile emails page - - Scenario: I should see emails - Then I should see my emails - - Scenario: Add new email - Given I submit new email "my@email.com" - Then I should see new email "my@email.com" - And I should see my emails - - Scenario: Add duplicate email - Given I submit duplicate email @user.email - Then I should not have @user.email added - And I should see my emails - - Scenario: Remove email - Given I submit new email "my@email.com" - Then I should see new email "my@email.com" - And I should see my emails - Then I click link "Remove" for "my@email.com" - Then I should not see email "my@email.com" - And I should see my emails diff --git a/features/profile/notifications.feature b/features/profile/notifications.feature deleted file mode 100644 index 55997d44dec..00000000000 --- a/features/profile/notifications.feature +++ /dev/null @@ -1,9 +0,0 @@ -@profile -Feature: Profile Notifications - Background: - Given I sign in as a user - And I own project "Shop" - - Scenario: I visit notifications tab - When I visit profile notifications page - Then I should see global notifications settings diff --git a/features/profile/profile.feature b/features/profile/profile.feature deleted file mode 100644 index d586167cdf5..00000000000 --- a/features/profile/profile.feature +++ /dev/null @@ -1,99 +0,0 @@ -@profile -Feature: Profile - Background: - Given I sign in as a user - - Scenario: I look at my profile - Given I visit profile page - Then I should see my profile info - - Scenario: I can see groups I belong to - Given I have group with projects - When I visit profile page - And I click on my profile picture - Then I should see my user page - And I should see groups I belong to - - Scenario: I edit profile - Given I visit profile page - Then I change my profile info - And I should see new profile info - - Scenario: I change my password without old one - Given I visit profile password page - When I try change my password w/o old one - Then I should see a missing password error message - And I should be redirected to password page - - Scenario: I change my password - Given I visit profile password page - Then I change my password - And I should be redirected to sign in page - - Scenario: I edit my avatar - Given I visit profile page - Then I change my avatar - And I should see new avatar - And I should see the "Remove avatar" button - - Scenario: I remove my avatar - Given I visit profile page - And I have an avatar - When I remove my avatar - Then I should see my gravatar - And I should not see the "Remove avatar" button - - Scenario: My password is expired - Given my password is expired - And I am not an ldap user - Given I visit profile password page - Then I redirected to expired password page - And I submit new password - And I redirected to sign in page - - Scenario: I unsuccessfully change my password - Given I visit profile password page - When I unsuccessfully change my password - Then I should see a password error message - - Scenario: I reset my token - Given I visit profile account page - Then I reset my token - And I should see new token - - Scenario: I visit history tab - Given I have activity - When I visit profile history page - Then I should see my activity - - Scenario: I visit my user page - When I visit profile page - And I click on my profile picture - Then I should see my user page - - Scenario: I can manage application - Given I visit profile applications page - Then I click on new application button - And I should see application form - Then I fill application form out and submit - And I see application - Then I click edit - And I see edit application form - Then I change name of application and submit - And I see that application was changed - Then I visit profile applications page - And I click to remove application - Then I see that application is removed - - @javascript - Scenario: I change my application theme - Given I visit profile design page - When I change my application theme - Then I should see the theme change immediately - And I should receive feedback that the changes were saved - - @javascript - Scenario: I change my code preview theme - Given I visit profile design page - When I change my code preview theme - Then I should receive feedback that the changes were saved diff --git a/features/profile/ssh_keys.feature b/features/profile/ssh_keys.feature deleted file mode 100644 index 581503fc5f9..00000000000 --- a/features/profile/ssh_keys.feature +++ /dev/null @@ -1,20 +0,0 @@ -@profile -Feature: Profile SSH Keys - Background: - Given I sign in as a user - And I have ssh key "ssh-rsa Work" - And I visit profile keys page - - Scenario: I should see ssh keys - Then I should see my ssh keys - - Scenario: Add new ssh key - Given I click link "Add new" - And I submit new ssh key "Laptop" - Then I should see new ssh key "Laptop" - - Scenario: Remove ssh key - Given I click link "Work" - And I click link "Remove" - Then I visit profile keys page - And I should not see "Work" ssh key diff --git a/features/project/active_tab.feature b/features/project/active_tab.feature deleted file mode 100644 index 05faad4e645..00000000000 --- a/features/project/active_tab.feature +++ /dev/null @@ -1,124 +0,0 @@ -Feature: Project Active Tab - Background: - Given I sign in as a user - And I own a project - - # Main Tabs - - Scenario: On Project Home - Given I visit my project's home page - Then the active main tab should be Home - And no other main tabs should be active - - Scenario: On Project Files - Given I visit my project's files page - Then the active main tab should be Files - And no other main tabs should be active - - Scenario: On Project Commits - Given I visit my project's commits page - Then the active main tab should be Commits - And no other main tabs should be active - - Scenario: On Project Network - Given I visit my project's network page - Then the active main tab should be Network - And no other main tabs should be active - - Scenario: On Project Issues - Given I visit my project's issues page - Then the active main tab should be Issues - And no other main tabs should be active - - Scenario: On Project Merge Requests - Given I visit my project's merge requests page - Then the active main tab should be Merge Requests - And no other main tabs should be active - - Scenario: On Project Wiki - Given I visit my project's wiki page - Then the active main tab should be Wiki - And no other main tabs should be active - - # Sub Tabs: Home - - Scenario: On Project Home/Show - Given I visit my project's home page - Then the active main tab should be Home - And no other main tabs should be active - - # Sub Tabs: Settings - - Scenario: On Project Settings/Team - Given I visit my project's settings page - And I click the "Team" tab - Then the active sub nav should be Team - And no other sub navs should be active - And the active main tab should be Settings - - Scenario: On Project Settings/Edit - Given I visit my project's settings page - And I click the "Edit" tab - Then the active sub nav should be Edit - And no other sub navs should be active - And the active main tab should be Settings - - Scenario: On Project Settings/Hooks - Given I visit my project's settings page - And I click the "Hooks" tab - Then the active sub nav should be Hooks - And no other sub navs should be active - And the active main tab should be Settings - - Scenario: On Project Settings/Deploy Keys - Given I visit my project's settings page - And I click the "Deploy Keys" tab - Then the active sub nav should be Deploy Keys - And no other sub navs should be active - And the active main tab should be Settings - - # Sub Tabs: Commits - - Scenario: On Project Commits/Commits - Given I visit my project's commits page - Then the active sub tab should be Commits - And no other sub tabs should be active - And the active main tab should be Commits - - Scenario: On Project Commits/Compare - Given I visit my project's commits page - And I click the "Compare" tab - Then the active sub tab should be Compare - And no other sub tabs should be active - And the active main tab should be Commits - - Scenario: On Project Commits/Branches - Given I visit my project's commits page - And I click the "Branches" tab - Then the active sub tab should be Branches - And no other sub tabs should be active - And the active main tab should be Commits - - Scenario: On Project Commits/Tags - Given I visit my project's commits page - And I click the "Tags" tab - Then the active sub tab should be Tags - And no other sub tabs should be active - And the active main tab should be Commits - - Scenario: On Project Issues/Browse - Given I visit my project's issues page - Then the active main tab should be Issues - And no other main tabs should be active - - Scenario: On Project Issues/Milestones - Given I visit my project's issues page - And I click the "Milestones" tab - Then the active main tab should be Milestones - And no other main tabs should be active - - Scenario: On Project Issues/Labels - Given I visit my project's issues page - And I click the "Labels" tab - Then the active main tab should be Labels - And no other main tabs should be active diff --git a/features/project/archived.feature b/features/project/archived.feature deleted file mode 100644 index ad466f4f307..00000000000 --- a/features/project/archived.feature +++ /dev/null @@ -1,30 +0,0 @@ -Feature: Project Archived - Background: - Given I sign in as a user - And I own project "Shop" - And I own project "Forum" - - Scenario: I should not see archived on project page of not-archive project - And project "Forum" is archived - And I visit project "Shop" page - Then I should not see "Archived" - - Scenario: I should see archived on project page of archive project - And project "Forum" is archived - And I visit project "Forum" page - Then I should see "Archived" - - Scenario: I archive project - When project "Shop" has push event - And I visit project "Shop" page - And I visit edit project "Shop" page - And I set project archived - Then I should see "Archived" - - Scenario: I unarchive project - When project "Shop" has push event - And project "Shop" is archived - And I visit project "Shop" page - And I visit edit project "Shop" page - And I set project unarchived - Then I should not see "Archived" diff --git a/features/project/commits/branches.feature b/features/project/commits/branches.feature deleted file mode 100644 index 65d8e48b9b3..00000000000 --- a/features/project/commits/branches.feature +++ /dev/null @@ -1,43 +0,0 @@ -Feature: Project Commits Branches - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has protected branches - - Scenario: I can see project all git branches - Given I visit project branches page - Then I should see "Shop" all branches list - - Scenario: I can see project protected git branches - Given I visit project protected branches page - Then I should see "Shop" protected branches list - - Scenario: I create a branch - Given I visit project branches page - And I click new branch link - And I submit new branch form - Then I should see new branch created - - @javascript - Scenario: I delete a branch - Given I visit project branches page - And I click branch 'improve/awesome' delete link - Then I should not see branch 'improve/awesome' - - Scenario: I create a branch with invalid name - Given I visit project branches page - And I click new branch link - And I submit new branch form with invalid name - Then I should see new an error that branch is invalid - - Scenario: I create a branch with invalid reference - Given I visit project branches page - And I click new branch link - And I submit new branch form with invalid reference - Then I should see new an error that ref is invalid - - Scenario: I create a branch that already exists - Given I visit project branches page - And I click new branch link - And I submit new branch form with branch that already exists - Then I should see new an error that branch already exists diff --git a/features/project/commits/comments.feature b/features/project/commits/comments.feature deleted file mode 100644 index c41075d7ad4..00000000000 --- a/features/project/commits/comments.feature +++ /dev/null @@ -1,49 +0,0 @@ -Feature: Project Commits Comments - Background: - Given I sign in as a user - And I own project "Shop" - And I visit project commit page - - @javascript - Scenario: I can comment on a commit - Given I leave a comment like "XML attached" - Then I should see a comment saying "XML attached" - - @javascript - Scenario: I can't cancel the main form - Then I should not see the cancel comment button - - @javascript - Scenario: I can preview with text - Given I write a comment like ":+1: Nice" - Then The comment preview tab should be display rendered Markdown - - @javascript - Scenario: I preview a comment - Given I preview a comment text like "Bug fixed :smile:" - Then I should see the comment preview - And I should not see the comment text field - - @javascript - Scenario: I can edit after preview - Given I preview a comment text like "Bug fixed :smile:" - Then I should see the comment write tab - - @javascript - Scenario: I have a reset form after posting from preview - Given I preview a comment text like "Bug fixed :smile:" - And I submit the comment - Then I should see an empty comment text field - And I should not see the comment preview - - @javascript - Scenario: I can delete a comment - Given I leave a comment like "XML attached" - And I delete a comment - Then I should not see a comment saying "XML attached" - - @javascript - Scenario: I can edit a comment with +1 - Given I leave a comment like "XML attached" - And I edit the last comment with a +1 - Then I should see +1 in the description diff --git a/features/project/commits/commits.feature b/features/project/commits/commits.feature deleted file mode 100644 index c4b206edc95..00000000000 --- a/features/project/commits/commits.feature +++ /dev/null @@ -1,47 +0,0 @@ -Feature: Project Commits - Background: - Given I sign in as a user - And I own a project - And I visit my project's commits page - - Scenario: I browse commits list for master branch - Then I see project commits - - Scenario: I browse atom feed of commits list for master branch - Given I click atom feed link - Then I see commits atom feed - - Scenario: I browse commit from list - Given I click on commit link - Then I see commit info - And I see side-by-side diff button - - Scenario: I browse commit with side-by-side diff view - Given I click on commit link - And I click side-by-side diff button - Then I see inline diff button - - @javascript - Scenario: I compare refs - Given I visit compare refs page - And I fill compare fields with refs - Then I see compared refs - And I unfold diff - Then I should see additional file lines - - Scenario: I browse commits for a specific path - Given I visit my project's commits page for a specific path - Then I see breadcrumb links - - # TODO: Implement feature in graphs - #Scenario: I browse commits stats - #Given I visit my project's commits stats page - #Then I see commits stats - - Scenario: I browse big commit - Given I visit big commit page - Then I see big commit warning - - Scenario: I browse a commit with an image - Given I visit a commit with an image that changed - Then The diff links to both the previous and current image diff --git a/features/project/commits/diff_comments.feature b/features/project/commits/diff_comments.feature deleted file mode 100644 index 56b9a13678d..00000000000 --- a/features/project/commits/diff_comments.feature +++ /dev/null @@ -1,79 +0,0 @@ -Feature: Project Commits Diff Comments - Background: - Given I sign in as a user - And I own project "Shop" - And I visit project commit page - - @javascript - Scenario: I can access add diff comment buttons - Then I should see add a diff comment button - - @javascript - Scenario: I can comment on a commit diff - Given I leave a diff comment like "Typo, please fix" - Then I should see a diff comment saying "Typo, please fix" - - @javascript - Scenario: I get a temporary form for the first comment on a diff line - Given I open a diff comment form - Then I should see a temporary diff comment form - - @javascript - Scenario: I have a cancel button on the diff form - Given I open a diff comment form - Then I should see the cancel comment button - - @javascript - Scenario: I can cancel a diff form - Given I open a diff comment form - And I cancel the diff comment - Then I should not see the diff comment form - - @javascript - Scenario: I can't open a second form for a diff line - Given I open a diff comment form - And I open a diff comment form - Then I should only see one diff form - - @javascript - Scenario: I can have multiple forms - Given I open a diff comment form - And I write a diff comment like ":-1: I don't like this" - And I open another diff comment form - Then I should see a diff comment form with ":-1: I don't like this" - And I should see an empty diff comment form - - @javascript - Scenario: I can preview multiple forms separately - Given I preview a diff comment text like "Should fix it :smile:" - And I preview another diff comment text like "DRY this up" - Then I should see two separate previews - - @javascript - Scenario: I have a reply button in discussions - Given I leave a diff comment like "Typo, please fix" - Then I should see a discussion reply button - - @javascript - Scenario: I can preview with text - Given I open a diff comment form - And I write a diff comment like ":-1: I don't like this" - Then The diff comment preview tab should display rendered Markdown - - @javascript - Scenario: I preview a diff comment - Given I preview a diff comment text like "Should fix it :smile:" - Then I should see the diff comment preview - And I should not see the diff comment text field - - @javascript - Scenario: I can edit after preview - Given I preview a diff comment text like "Should fix it :smile:" - Then I should see the diff comment write tab - - @javascript - Scenario: The form gets removed after posting - Given I preview a diff comment text like "Should fix it :smile:" - And I submit the diff comment - Then I should not see the diff comment form - And I should see a discussion reply button diff --git a/features/project/commits/tags.feature b/features/project/commits/tags.feature deleted file mode 100644 index 02f399f7cad..00000000000 --- a/features/project/commits/tags.feature +++ /dev/null @@ -1,41 +0,0 @@ -Feature: Project Commits Tags - Background: - Given I sign in as a user - And I own project "Shop" - Given I visit project tags page - - Scenario: I can see all git tags - Then I should see "Shop" all tags list - - Scenario: I create a tag - And I click new tag link - And I submit new tag form - Then I should see new tag created - - Scenario: I create a tag with invalid name - And I click new tag link - And I submit new tag form with invalid name - Then I should see new an error that tag is invalid - - Scenario: I create a tag with invalid reference - And I click new tag link - And I submit new tag form with invalid reference - Then I should see new an error that tag ref is invalid - - Scenario: I create a tag that already exists - And I click new tag link - And I submit new tag form with tag that already exists - Then I should see new an error that tag already exists - - @javascript - Scenario: I delete a tag - Given I delete tag 'v1.1.0' - Then I should not see tag 'v1.1.0' - - @javascript - Scenario: I delete all tags and see info message - Given I delete all tags - Then I should see tags info message - - # @wip - # Scenario: I can download project by tag diff --git a/features/project/commits/user_lookup.feature b/features/project/commits/user_lookup.feature deleted file mode 100644 index db51d4a6cfa..00000000000 --- a/features/project/commits/user_lookup.feature +++ /dev/null @@ -1,15 +0,0 @@ -Feature: Project Commits User Lookup - Background: - Given I sign in as a user - And I own a project - And I visit my project's commits page - - Scenario: I browse commit from list - Given I have user with primary email - When I click on commit link - Then I see author based on primary email - - Scenario: I browse another commit from list - Given I have user with secondary email - When I click on another commit link - Then I see author based on secondary email diff --git a/features/project/create.feature b/features/project/create.feature deleted file mode 100644 index e9dc4fe6b3c..00000000000 --- a/features/project/create.feature +++ /dev/null @@ -1,23 +0,0 @@ -Feature: Project Create - In order to get access to project sections - A user with ability to create a project - Should be able to create a new one - - @javascript - Scenario: User create a project - Given I sign in as a user - When I visit new project page - And fill project form with valid data - Then I should see project page - And I should see empty project instuctions - - @javascript - Scenario: Empty project instructions - Given I sign in as a user - When I visit new project page - And fill project form with valid data - Then I see empty project instuctions - And I click on HTTP - Then Remote url should update to http link - And If I click on SSH - Then Remote url should update to ssh link diff --git a/features/project/deploy_keys.feature b/features/project/deploy_keys.feature deleted file mode 100644 index a71f6124d9c..00000000000 --- a/features/project/deploy_keys.feature +++ /dev/null @@ -1,40 +0,0 @@ -Feature: Project Deploy Keys - Background: - Given I sign in as a user - And I own project "Shop" - - Scenario: I should see deploy keys list - Given project has deploy key - When I visit project deploy keys page - Then I should see project deploy key - - Scenario: I should see project deploy keys - Given other project has deploy key - When I visit project deploy keys page - Then I should see other project deploy key - - Scenario: I should see public deploy keys - Given public deploy key exists - When I visit project deploy keys page - Then I should see public deploy key - - Scenario: I add new deploy key - Given I visit project deploy keys page - When I click 'New Deploy Key' - And I submit new deploy key - Then I should be on deploy keys page - And I should see newly created deploy key - - Scenario: I attach other project deploy key to project - Given other project has deploy key - And I visit project deploy keys page - When I click attach deploy key - Then I should be on deploy keys page - And I should see newly created deploy key - - Scenario: I attach public deploy key to project - Given public deploy key exists - And I visit project deploy keys page - When I click attach deploy key - Then I should be on deploy keys page - And I should see newly created deploy key diff --git a/features/project/fork.feature b/features/project/fork.feature deleted file mode 100644 index 22f68e5b340..00000000000 --- a/features/project/fork.feature +++ /dev/null @@ -1,16 +0,0 @@ -Feature: Project Fork - Background: - Given I sign in as a user - And I am a member of project "Shop" - When I visit project "Shop" page - - Scenario: User fork a project - Given I click link "Fork" - When I fork to my namespace - Then I should see the forked project page - - Scenario: User already has forked the project - Given I already have a project named "Shop" in my namespace - And I click link "Fork" - When I fork to my namespace - Then I should see a "Name has already been taken" warning diff --git a/features/project/forked_merge_requests.feature b/features/project/forked_merge_requests.feature deleted file mode 100644 index d9fbb875c28..00000000000 --- a/features/project/forked_merge_requests.feature +++ /dev/null @@ -1,40 +0,0 @@ -Feature: Project Forked Merge Requests - Background: - Given I sign in as a user - And I am a member of project "Shop" - And I have a project forked off of "Shop" called "Forked Shop" - - Scenario: I submit new unassigned merge request to a forked project - Given I visit project "Forked Shop" merge requests page - And I click link "New Merge Request" - And I fill out a "Merge Request On Forked Project" merge request - And I submit the merge request - Then I should see merge request "Merge Request On Forked Project" - - # TODO: Improve it so it does not fail randomly - # - #@javascript - #Scenario: I can edit a forked merge request - #Given I visit project "Forked Shop" merge requests page - #And I click link "New Merge Request" - #And I fill out a "Merge Request On Forked Project" merge request - #And I submit the merge request - #And I should see merge request "Merge Request On Forked Project" - #And I click link edit "Merge Request On Forked Project" - #Then I see the edit page prefilled for "Merge Request On Forked Project" - #And I update the merge request title - #And I save the merge request - #Then I should see the edited merge request - - @javascript - Scenario: I cannot submit an invalid merge request - Given I visit project "Forked Shop" merge requests page - And I click link "New Merge Request" - And I fill out an invalid "Merge Request On Forked Project" merge request - Then I should see validation errors - - @javascript - Scenario: Merge request should target fork repository by default - Given I visit project "Forked Shop" merge requests page - And I click link "New Merge Request" - Then the target repository should be the original repository diff --git a/features/project/graph.feature b/features/project/graph.feature deleted file mode 100644 index 89064242c1c..00000000000 --- a/features/project/graph.feature +++ /dev/null @@ -1,14 +0,0 @@ -Feature: Project Graph - Background: - Given I sign in as a user - And I own project "Shop" - - @javascript - Scenario: I should see project graphs - When I visit project "Shop" graph page - Then page should have graphs - - @javascript - Scenario: I should see project commits graphs - When I visit project "Shop" commits graph page - Then page should have commits graphs diff --git a/features/project/hooks.feature b/features/project/hooks.feature deleted file mode 100644 index 1a60846a23e..00000000000 --- a/features/project/hooks.feature +++ /dev/null @@ -1,32 +0,0 @@ -Feature: Project Hooks - Background: - Given I sign in as a user - And I own project "Shop" - - Scenario: I should see hook list - Given project has hook - When I visit project hooks page - Then I should see project hook - - Scenario: I add new hook - Given I visit project hooks page - When I submit new hook - Then I should see newly created hook - - Scenario: I test hook - Given project has hook - And I visit project hooks page - When I click test hook button - Then hook should be triggered - - Scenario: I test a hook on empty project - Given I own empty project with hook - And I visit project hooks page - When I click test hook button - Then I should see hook error message - - Scenario: I test a hook on down URL - Given project has hook - And I visit project hooks page - When I click test hook button with invalid URL - Then I should see hook service down error message diff --git a/features/project/issues/filter_labels.feature b/features/project/issues/filter_labels.feature deleted file mode 100644 index e316f519861..00000000000 --- a/features/project/issues/filter_labels.feature +++ /dev/null @@ -1,26 +0,0 @@ -Feature: Project Issues Filter Labels - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has labels: "bug", "feature", "enhancement" - And project "Shop" has issue "Bugfix1" with labels: "bug", "feature" - And project "Shop" has issue "Bugfix2" with labels: "bug", "enhancement" - And project "Shop" has issue "Feature1" with labels: "feature" - Given I visit project "Shop" issues page - - @javascript - Scenario: I filter by one label - Given I click link "bug" - Then I should see "Bugfix1" in issues list - And I should see "Bugfix2" in issues list - And I should not see "Feature1" in issues list - - # TODO: make labels filter works according to this scanario - # right now it looks for label 1 OR label 2. Old behaviour (this test) was - # all issues that have both label 1 AND label 2 - #Scenario: I filter by two labels - #Given I click link "bug" - #And I click link "feature" - #Then I should see "Bugfix1" in issues list - #And I should not see "Bugfix2" in issues list - #And I should not see "Feature1" in issues list diff --git a/features/project/issues/issues.feature b/features/project/issues/issues.feature deleted file mode 100644 index eb813884d1e..00000000000 --- a/features/project/issues/issues.feature +++ /dev/null @@ -1,219 +0,0 @@ -Feature: Project Issues - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" have "Release 0.4" open issue - And project "Shop" have "Tweet control" open issue - And project "Shop" have "Release 0.3" closed issue - And I visit project "Shop" issues page - - Scenario: I should see open issues - Given I should see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - - Scenario: I should see closed issues - Given I click link "Closed" - Then I should see "Release 0.3" in issues - And I should not see "Release 0.4" in issues - - Scenario: I should see all issues - Given I click link "All" - Then I should see "Release 0.3" in issues - And I should see "Release 0.4" in issues - - Scenario: I visit issue page - Given I click link "Release 0.4" - Then I should see issue "Release 0.4" - - @javascript - Scenario: I visit issue page - Given I add a user to project "Shop" - And I click "author" dropdown - Then I see current user as the first user - - Scenario: I submit new unassigned issue - Given I click link "New Issue" - And I submit new issue "500 error on profile" - Then I should see issue "500 error on profile" - - Scenario: I submit new unassigned issue with labels - Given project "Shop" has labels: "bug", "feature", "enhancement" - And I click link "New Issue" - And I submit new issue "500 error on profile" with label 'bug' - Then I should see issue "500 error on profile" - And I should see label 'bug' with issue - - @javascript - Scenario: I comment issue - Given I visit issue page "Release 0.4" - And I leave a comment like "XML attached" - Then I should see comment "XML attached" - And I should see an error alert section within the comment form - - @javascript - Scenario: I search issue - Given I fill in issue search with "Re" - Then I should see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - And I should not see "Tweet control" in issues - - @javascript - Scenario: I search issue that not exist - Given I fill in issue search with "Bu" - Then I should not see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - - @javascript - Scenario: I search all issues - Given I click link "All" - And I fill in issue search with ".3" - Then I should see "Release 0.3" in issues - And I should not see "Release 0.4" in issues - - @javascript - Scenario: Search issues when search string exactly matches issue description - Given project 'Shop' has issue 'Bugfix1' with description: 'Description for issue1' - And I fill in issue search with 'Description for issue1' - Then I should see 'Bugfix1' in issues - And I should not see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - And I should not see "Tweet control" in issues - - @javascript - Scenario: Search issues when search string partially matches issue description - Given project 'Shop' has issue 'Bugfix1' with description: 'Description for issue1' - And project 'Shop' has issue 'Feature1' with description: 'Feature submitted for issue1' - And I fill in issue search with 'issue1' - Then I should see 'Feature1' in issues - Then I should see 'Bugfix1' in issues - And I should not see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - And I should not see "Tweet control" in issues - - @javascript - Scenario: Search issues when search string matches no issue description - Given project 'Shop' has issue 'Bugfix1' with description: 'Description for issue1' - And I fill in issue search with 'Rock and roll' - Then I should not see 'Bugfix1' in issues - And I should not see "Release 0.4" in issues - And I should not see "Release 0.3" in issues - And I should not see "Tweet control" in issues - - - # Markdown - - Scenario: Headers inside the description should have ids generated for them. - Given I visit issue page "Release 0.4" - Then Header "Description header" should have correct id and link - - @javascript - Scenario: Headers inside comments should not have ids generated for them. - Given I visit issue page "Release 0.4" - And I leave a comment with a header containing "Comment with a header" - Then The comment with the header should not have an ID - - @javascript - Scenario: Blocks inside comments should not build relative links - Given I visit issue page "Release 0.4" - And I leave a comment with code block - Then The code block should be unchanged - - Scenario: Issues on empty project - Given empty project "Empty Project" - When I visit empty project page - And I see empty project details with ssh clone info - When I visit empty project's issues page - Given I click link "New Issue" - And I submit new issue "500 error on profile" - Then I should see issue "500 error on profile" - - Scenario: Clickable labels - Given issue 'Release 0.4' has label 'bug' - And I visit project "Shop" issues page - When I click label 'bug' - And I should see "Release 0.4" in issues - And I should not see "Tweet control" in issues - - Scenario: Issue description should render task checkboxes - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit issue page "Tasks-open" - Then I should see task checkboxes in the description - - @javascript - Scenario: Issue notes should not render task checkboxes - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit issue page "Tasks-open" - And I leave a comment with task markdown - Then I should not see task checkboxes in the comment - - @javascript - Scenario: Issue notes should be editable with +1 - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit issue page "Tasks-open" - And I leave a comment with a header containing "Comment with a header" - Then The comment with the header should not have an ID - And I edit the last comment with a +1 - Then I should see +1 in the description - - # Task status in issues list - - Scenario: Issues list should display task status - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit project "Shop" issues page - Then I should see the task status for the Taskable - - # Toggling task items - - @javascript - Scenario: Task checkboxes should be enabled for an open issue - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit issue page "Tasks-open" - Then Task checkboxes should be enabled - - @javascript - Scenario: Task checkboxes should be disabled for a closed issue - Given project "Shop" has "Tasks-closed" closed issue with task markdown - When I visit issue page "Tasks-closed" - Then Task checkboxes should be disabled - - # Issue description preview - - @javascript - Scenario: I can't preview without text - Given I click link "New Issue" - And I haven't written any description text - Then The Markdown preview tab should say there is nothing to do - - @javascript - Scenario: I can preview with text - Given I click link "New Issue" - And I write a description like ":+1: Nice" - Then The Markdown preview tab should display rendered Markdown - - @javascript - Scenario: I preview an issue description - Given I click link "New Issue" - And I preview a description text like "Bug fixed :smile:" - Then I should see the Markdown preview - And I should not see the Markdown text field - - @javascript - Scenario: I can edit after preview - Given I click link "New Issue" - And I preview a description text like "Bug fixed :smile:" - Then I should see the Markdown write tab - - @javascript - Scenario: I can preview when editing an existing issue - Given I click link "Release 0.4" - And I click link "Edit" for the issue - And I preview a description text like "Bug fixed :smile:" - Then I should see the Markdown write tab - - @javascript - Scenario: I can unsubscribe from issue - Given project "Shop" has "Tasks-open" open issue with task markdown - When I visit issue page "Tasks-open" - Then I should see that I am subscribed - When I click button "Unsubscribe" - Then I should see that I am unsubscribed diff --git a/features/project/issues/labels.feature b/features/project/issues/labels.feature deleted file mode 100644 index 039a7d83cb1..00000000000 --- a/features/project/issues/labels.feature +++ /dev/null @@ -1,47 +0,0 @@ -Feature: Project Issues Labels - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has labels: "bug", "feature", "enhancement" - Given I visit project "Shop" labels page - - Scenario: I should see labels list - Then I should see label 'bug' - And I should see label 'feature' - - Scenario: I create new label - Given I visit project "Shop" new label page - When I submit new label 'support' - Then I should see label 'support' - - Scenario: I edit label - Given I visit 'bug' label edit page - When I change label 'bug' to 'fix' - Then I should not see label 'bug' - Then I should see label 'fix' - - Scenario: I remove label - When I remove label 'bug' - Then I should not see label 'bug' - - @javascript - Scenario: I remove all labels - When I delete all labels - Then I should see labels help message - - Scenario: I create a label with invalid color - Given I visit project "Shop" new label page - When I submit new label with invalid color - Then I should see label color error message - - Scenario: I create a label that already exists - Given I visit project "Shop" new label page - When I submit new label 'bug' - Then I should see label label exist error message - - Scenario: I create the same label on another project - Given I own project "Forum" - And I visit project "Forum" labels page - And I visit project "Forum" new label page - When I submit new label 'bug' - Then I should see label 'bug' diff --git a/features/project/issues/milestones.feature b/features/project/issues/milestones.feature deleted file mode 100644 index 9ac65b1257c..00000000000 --- a/features/project/issues/milestones.feature +++ /dev/null @@ -1,30 +0,0 @@ -Feature: Project Issues Milestones - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has milestone "v2.2" - Given I visit project "Shop" milestones page - - Scenario: I should see active milestones - Then I should see milestone "v2.2" - - Scenario: I should see milestone - Given I click link "v2.2" - Then I should see milestone "v2.2" - - Scenario: I create new milestone - Given I click link "New Milestone" - And I submit new milestone "v2.3" - Then I should see milestone "v2.3" - - @javascript - Scenario: Listing closed issues - Given the milestone has open and closed issues - And I click link "v2.2" - Then I should see 3 issues - - # Markdown - - Scenario: Headers inside the description should have ids generated for them. - Given I click link "v2.2" - Then Header "Description header" should have correct id and link diff --git a/features/project/merge_requests.feature b/features/project/merge_requests.feature deleted file mode 100644 index cbb5c8eb39b..00000000000 --- a/features/project/merge_requests.feature +++ /dev/null @@ -1,241 +0,0 @@ -Feature: Project Merge Requests - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" have "Bug NS-04" open merge request - And project "Shop" have "Feature NS-03" closed merge request - And I visit project "Shop" merge requests page - - Scenario: I should see open merge requests - Then I should see "Bug NS-04" in merge requests - And I should not see "Feature NS-03" in merge requests - - Scenario: I should see closed merge requests - Given I click link "Closed" - Then I should see "Feature NS-03" in merge requests - And I should not see "Bug NS-04" in merge requests - - Scenario: I should see all merge requests - Given I click link "All" - Then I should see "Feature NS-03" in merge requests - And I should see "Bug NS-04" in merge requests - - Scenario: I visit merge request page - Given I click link "Bug NS-04" - Then I should see merge request "Bug NS-04" - - Scenario: I close merge request page - Given I click link "Bug NS-04" - And I click link "Close" - Then I should see closed merge request "Bug NS-04" - - Scenario: I reopen merge request page - Given I click link "Bug NS-04" - And I click link "Close" - Then I should see closed merge request "Bug NS-04" - When I click link "Reopen" - Then I should see reopened merge request "Bug NS-04" - - Scenario: I submit new unassigned merge request - Given I click link "New Merge Request" - And I submit new merge request "Wiki Feature" - Then I should see merge request "Wiki Feature" - - @javascript - Scenario: I comment on a merge request - Given I visit merge request page "Bug NS-04" - And I leave a comment like "XML attached" - Then I should see comment "XML attached" - - @javascript - Scenario: I comment on a merge request diff - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is wrong" on diff - And I switch to the merge request's comments tab - Then I should see a discussion has started on diff - - @javascript - Scenario: I comment on a line of a commit in merge request - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I click on the commit in the merge request - And I leave a comment like "Line is wrong" on diff in commit - And I switch to the merge request's comments tab - Then I should see a discussion has started on commit diff - - @javascript - Scenario: I comment on a commit in merge request - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I click on the commit in the merge request - And I leave a comment on the diff page in commit - And I switch to the merge request's comments tab - Then I should see a discussion has started on commit - - @javascript - Scenario: I accept merge request with custom commit message - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And merge request "Bug NS-05" is mergeable - And I visit merge request page "Bug NS-05" - And merge request is mergeable - Then I modify merge commit message - And I accept this merge request - Then I should see merged request - - # Markdown - - Scenario: Headers inside the description should have ids generated for them. - When I visit merge request page "Bug NS-04" - Then Header "Description header" should have correct id and link - - @javascript - Scenario: Headers inside comments should not have ids generated for them. - Given I visit merge request page "Bug NS-04" - And I leave a comment with a header containing "Comment with a header" - Then The comment with the header should not have an ID - - Scenario: Merge request description should render task checkboxes - Given project "Shop" has "MR-task-open" open MR with task markdown - When I visit merge request page "MR-task-open" - Then I should see task checkboxes in the description - - Scenario: Merge request notes should not render task checkboxes - Given project "Shop" has "MR-task-open" open MR with task markdown - When I visit merge request page "MR-task-open" - Then I should not see task checkboxes in the comment - - # Toggling inline comments - - @javascript - Scenario: I hide comments on a merge request diff with comments in a single file - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is wrong" on line 39 of the second file - And I click link "Hide inline discussion" of the second file - Then I should not see a comment like "Line is wrong here" in the second file - - @javascript - Scenario: I show comments on a merge request diff with comments in a single file - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is wrong" on line 39 of the second file - Then I should see a comment like "Line is wrong" in the second file - - @javascript - Scenario: I hide comments on a merge request diff with comments in multiple files - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is correct" on line 12 of the first file - And I leave a comment like "Line is wrong" on line 39 of the second file - And I click link "Hide inline discussion" of the second file - Then I should not see a comment like "Line is wrong here" in the second file - And I should still see a comment like "Line is correct" in the first file - - @javascript - Scenario: I show comments on a merge request diff with comments in multiple files - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is correct" on line 12 of the first file - And I leave a comment like "Line is wrong" on line 39 of the second file - And I click link "Hide inline discussion" of the second file - And I click link "Show inline discussion" of the second file - Then I should see a comment like "Line is wrong" in the second file - And I should still see a comment like "Line is correct" in the first file - - @javascript - Scenario: I unfold diff - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I unfold diff - Then I should see additional file lines - - @javascript - Scenario: I show comments on a merge request side-by-side diff with comments in multiple files - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I switch to the diff tab - And I leave a comment like "Line is correct" on line 12 of the first file - And I leave a comment like "Line is wrong" on line 39 of the second file - And I click Side-by-side Diff tab - Then I should see comments on the side-by-side diff page - - @javascript - Scenario: I view diffs on a merge request - Given project "Shop" have "Bug NS-05" open merge request with diffs inside - And I visit merge request page "Bug NS-05" - And I click on the Changes tab via Javascript - Then I should see the proper Inline and Side-by-side links - - # Task status in issues list - - Scenario: Merge requests list should display task status - Given project "Shop" has "MR-task-open" open MR with task markdown - When I visit project "Shop" merge requests page - Then I should see the task status for the Taskable - - # Toggling task items - - @javascript - Scenario: Task checkboxes should be enabled for an open merge request - Given project "Shop" has "MR-task-open" open MR with task markdown - When I visit merge request page "MR-task-open" - Then Task checkboxes should be enabled - - @javascript - Scenario: Task checkboxes should be disabled for a closed merge request - Given project "Shop" has "MR-task-open" open MR with task markdown - And I visit merge request page "MR-task-open" - And I click link "Close" - Then Task checkboxes should be disabled - - # Description preview - - @javascript - Scenario: I can't preview without text - Given I visit merge request page "Bug NS-04" - And I click link "Edit" for the merge request - And I haven't written any description text - Then The Markdown preview tab should say there is nothing to do - - @javascript - Scenario: I can preview with text - Given I visit merge request page "Bug NS-04" - And I click link "Edit" for the merge request - And I write a description like ":+1: Nice" - Then The Markdown preview tab should display rendered Markdown - - @javascript - Scenario: I preview a merge request description - Given I visit merge request page "Bug NS-04" - And I click link "Edit" for the merge request - And I preview a description text like "Bug fixed :smile:" - Then I should see the Markdown preview - And I should not see the Markdown text field - - @javascript - Scenario: I can edit after preview - Given I visit merge request page "Bug NS-04" - And I click link "Edit" for the merge request - And I preview a description text like "Bug fixed :smile:" - Then I should see the Markdown write tab - - @javascript - Scenario: I search merge request - Given I click link "All" - When I fill in merge request search with "Fe" - Then I should see "Feature NS-03" in merge requests - And I should not see "Bug NS-04" in merge requests - - @javascript - Scenario: I can unsubscribe from merge request - Given I visit merge request page "Bug NS-04" - Then I should see that I am subscribed - When I click button "Unsubscribe" - Then I should see that I am unsubscribed diff --git a/features/project/network_graph.feature b/features/project/network_graph.feature deleted file mode 100644 index 8beb6043aff..00000000000 --- a/features/project/network_graph.feature +++ /dev/null @@ -1,40 +0,0 @@ -Feature: Project Network Graph - Background: - Given I sign in as a user - And I own project "Shop" - And I visit project "Shop" network page - - @javascript - Scenario: I should see project network - Then page should have network graph - And page should select "master" in select box - And page should have "master" on graph - - @javascript - Scenario: I should switch "branch" and "tag" - When I switch ref to "feature" - Then page should select "feature" in select box - And page should have "feature" on graph - When I switch ref to "v1.0.0" - Then page should select "v1.0.0" in select box - And page should have "v1.0.0" on graph - - @javascript - Scenario: I should looking for a commit by SHA - When I looking for a commit by SHA of "v1.0.0" - Then page should have network graph - And page should select "master" in select box - And page should have "v1.0.0" on graph - - @javascript - Scenario: I should filter selected tag - When I switch ref to "v1.0.0" - Then page should have content not containing "v1.0.0" - When click "Show only selected branch" checkbox - Then page should not have content not containing "v1.0.0" - When click "Show only selected branch" checkbox - Then page should have content not containing "v1.0.0" - - Scenario: I should fail to look for a commit - When I look for a commit by ";" - Then page status code should be 404 diff --git a/features/project/project.feature b/features/project/project.feature deleted file mode 100644 index 3e1fd54bee8..00000000000 --- a/features/project/project.feature +++ /dev/null @@ -1,57 +0,0 @@ -Feature: Project - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has push event - And I visit project "Shop" page - - Scenario: I edit the project avatar - Given I visit edit project "Shop" page - When I change the project avatar - And I should see new project avatar - And I should see the "Remove avatar" button - - Scenario: I remove the project avatar - Given I visit edit project "Shop" page - And I have an project avatar - When I remove my project avatar - Then I should see the default project avatar - And I should not see the "Remove avatar" button - - @javascript - Scenario: I should see project activity - When I visit project "Shop" page - Then I should see project "Shop" activity feed - - Scenario: I visit edit project - When I visit edit project "Shop" page - Then I should see project settings - - Scenario: I edit project - When I visit edit project "Shop" page - And change project settings - And I save project - Then I should see project with new settings - - Scenario: I change project path - When I visit edit project "Shop" page - And change project path settings - Then I should see project with new path settings - - Scenario: I should see project readme and version - When I visit project "Shop" page - And I should see project "Shop" version - - Scenario: I should change project default branch - When I visit edit project "Shop" page - And change project default branch - And I save project - Then I should see project default branch changed - - @javascript - Scenario: I should have default tab per my preference - And I own project "Forum" - When I select project "Forum" README tab - Then I should see project "Forum" README - And I visit project "Shop" page - Then I should see project "Shop" README diff --git a/features/project/redirects.feature b/features/project/redirects.feature deleted file mode 100644 index a2e77e7bf30..00000000000 --- a/features/project/redirects.feature +++ /dev/null @@ -1,38 +0,0 @@ -Feature: Project Redirects - Background: - Given public project "Community" - And private project "Enterprise" - - Scenario: I visit public project page - When I visit project "Community" page - Then I should see project "Community" home page - - Scenario: I visit private project page - When I visit project "Enterprise" page - Then I should be redirected to sign in page - - Scenario: I visit a non-existent project page - When I visit project "CommunityDoesNotExist" page - Then I should be redirected to sign in page - - Scenario: I visit a non-existent project page as user - Given I sign in as a user - When I visit project "CommunityDoesNotExist" page - Then page status code should be 404 - - Scenario: I visit unauthorized project page as user - Given I sign in as a user - When I visit project "Enterprise" page - Then page status code should be 404 - - Scenario: I visit a public project without signing in - When I visit project "Community" page - And I should see project "Community" home page - And I click on "Sign In" - And Authenticate - Then I should be redirected to "Community" page - - Scenario: I visit private project page without signing in - When I visit project "Enterprise" page - And I get redirected to signin page where I sign in - Then I should be redirected to "Enterprise" page diff --git a/features/project/service.feature b/features/project/service.feature deleted file mode 100644 index fdff640ec85..00000000000 --- a/features/project/service.feature +++ /dev/null @@ -1,86 +0,0 @@ -Feature: Project Services - Background: - Given I sign in as a user - And I own project "Shop" - - Scenario: I should see project services - When I visit project "Shop" services page - Then I should see list of available services - - Scenario: Activate gitlab-ci service - When I visit project "Shop" services page - And I click gitlab-ci service link - And I fill gitlab-ci settings - Then I should see service settings saved - - Scenario: Activate hipchat service - When I visit project "Shop" services page - And I click hipchat service link - And I fill hipchat settings - Then I should see hipchat service settings saved - - Scenario: Activate hipchat service with custom server - When I visit project "Shop" services page - And I click hipchat service link - And I fill hipchat settings with custom server - Then I should see hipchat service settings with custom server saved - - Scenario: Activate pivotaltracker service - When I visit project "Shop" services page - And I click pivotaltracker service link - And I fill pivotaltracker settings - Then I should see pivotaltracker service settings saved - - Scenario: Activate Flowdock service - When I visit project "Shop" services page - And I click Flowdock service link - And I fill Flowdock settings - Then I should see Flowdock service settings saved - - Scenario: Activate Assembla service - When I visit project "Shop" services page - And I click Assembla service link - And I fill Assembla settings - Then I should see Assembla service settings saved - - Scenario: Activate Slack service - When I visit project "Shop" services page - And I click Slack service link - And I fill Slack settings - Then I should see Slack service settings saved - - Scenario: Activate Pushover service - When I visit project "Shop" services page - And I click Pushover service link - And I fill Pushover settings - Then I should see Pushover service settings saved - - Scenario: Activate email on push service - When I visit project "Shop" services page - And I click email on push service link - And I fill email on push settings - Then I should see email on push service settings saved - - Scenario: Activate Irker (IRC Gateway) service - When I visit project "Shop" services page - And I click Irker service link - And I fill Irker settings - Then I should see Irker service settings saved - - Scenario: Activate Atlassian Bamboo CI service - When I visit project "Shop" services page - And I click Atlassian Bamboo CI service link - And I fill Atlassian Bamboo CI settings - Then I should see Atlassian Bamboo CI service settings saved - - Scenario: Activate jetBrains TeamCity CI service - When I visit project "Shop" services page - And I click jetBrains TeamCity CI service link - And I fill jetBrains TeamCity CI settings - Then I should see jetBrains TeamCity CI service settings saved - - Scenario: Activate Asana service - When I visit project "Shop" services page - And I click Asana service link - And I fill Asana settings - Then I should see Asana service settings saved diff --git a/features/project/shortcuts.feature b/features/project/shortcuts.feature deleted file mode 100644 index cfb68bf1f50..00000000000 --- a/features/project/shortcuts.feature +++ /dev/null @@ -1,52 +0,0 @@ -@dashboard -Feature: Project Shortcuts - Background: - Given I sign in as a user - And I own a project - And I visit my project's home page - - @javascript - Scenario: Navigate to files tab - Given I press "g" and "f" - Then the active main tab should be Files - - @javascript - Scenario: Navigate to commits tab - Given I press "g" and "c" - Then the active main tab should be Commits - - @javascript - Scenario: Navigate to network tab - Given I press "g" and "n" - Then the active main tab should be Network - - @javascript - Scenario: Navigate to graphs tab - Given I press "g" and "g" - Then the active main tab should be Graphs - - @javascript - Scenario: Navigate to issues tab - Given I press "g" and "i" - Then the active main tab should be Issues - - @javascript - Scenario: Navigate to merge requests tab - Given I press "g" and "m" - Then the active main tab should be Merge Requests - - @javascript - Scenario: Navigate to snippets tab - Given I press "g" and "s" - Then the active main tab should be Snippets - - @javascript - Scenario: Navigate to wiki tab - Given I press "g" and "w" - Then the active main tab should be Wiki - - @javascript - Scenario: Navigate to project feed - Given I visit my project's files page - Given I press "g" and "p" - Then the active main tab should be Home diff --git a/features/project/snippets.feature b/features/project/snippets.feature deleted file mode 100644 index 77e42a1a38b..00000000000 --- a/features/project/snippets.feature +++ /dev/null @@ -1,34 +0,0 @@ -Feature: Project Snippets - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" have "Snippet one" snippet - And project "Shop" have no "Snippet two" snippet - And I visit project "Shop" snippets page - - Scenario: I should see snippets - Given I visit project "Shop" snippets page - Then I should see "Snippet one" in snippets - And I should not see "Snippet two" in snippets - - Scenario: I create new project snippet - Given I click link "New Snippet" - And I submit new snippet "Snippet three" - Then I should see snippet "Snippet three" - - @javascript - Scenario: I comment on a snippet "Snippet one" - Given I visit snippet page "Snippet one" - And I leave a comment like "Good snippet!" - Then I should see comment "Good snippet!" - - Scenario: I update "Snippet one" - Given I visit snippet page "Snippet one" - And I click link "Edit" - And I submit new title "Snippet new title" - Then I should see "Snippet new title" - - Scenario: I destroy "Snippet one" - Given I visit snippet page "Snippet one" - And I click link "Remove Snippet" - Then I should not see "Snippet one" in snippets diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature deleted file mode 100644 index 90b966dd645..00000000000 --- a/features/project/source/browse_files.feature +++ /dev/null @@ -1,160 +0,0 @@ -Feature: Project Source Browse Files - Background: - Given I sign in as a user - And I own project "Shop" - Given I visit project source page - - Scenario: I browse files from master branch - Then I should see files from repository - - Scenario: I browse files for specific ref - Given I visit project source page for "6d39438" - Then I should see files from repository for "6d39438" - - Scenario: I browse file content - Given I click on ".gitignore" file in repo - Then I should see its content - - Scenario: I browse raw file - Given I visit blob file from repo - And I click link "Raw" - Then I should see raw file content - - Scenario: I can create file - Given I click on "new file" link in repo - Then I can see new file page - - @javascript - Scenario: I can create and commit file - Given I click on "new file" link in repo - And I edit code - And I fill the new file name - And I fill the commit message - And I click on "Commit Changes" - Then I am redirected to the new file - And I should see its new content - - @javascript - Scenario: I can create and commit file and specify new branch - Given I click on "new file" link in repo - And I edit code - And I fill the new file name - And I fill the commit message - And I fill the new branch name - And I click on "Commit Changes" - Then I am redirected to the new file on new branch - And I should see its new content - - @javascript @tricky - Scenario: I can create file in empty repo - Given I own an empty project - And I visit my empty project page - And I create bare repo - When I click on "add a file" link - And I edit code - And I fill the new file name - And I fill the commit message - And I click on "Commit Changes" - Then I am redirected to the new file - And I should see its new content - - @javascript - Scenario: If I enter an illegal file name I see an error message - Given I click on "new file" link in repo - And I fill the new file name with an illegal name - And I edit code - And I fill the commit message - And I click on "Commit changes" - Then I am on the new file page - And I see a commit error message - - @javascript - Scenario: I can edit file - Given I click on ".gitignore" file in repo - And I click button "Edit" - Then I can edit code - - Scenario: If the file is binary the edit link is hidden - Given I visit a binary file in the repo - Then I cannot see the edit button - - Scenario: If I don't have edit permission the edit link is disabled - Given public project "Community" - And I visit project "Community" source page - And I click on ".gitignore" file in repo - Then The edit button is disabled - - @javascript - Scenario: I can edit and commit file - Given I click on ".gitignore" file in repo - And I click button "Edit" - And I edit code - And I fill the commit message - And I click on "Commit Changes" - Then I am redirected to the ".gitignore" - And I should see its new content - - @javascript - Scenario: I can edit and commit file to new branch - Given I click on ".gitignore" file in repo - And I click button "Edit" - And I edit code - And I fill the commit message - And I fill the new branch name - And I click on "Commit Changes" - Then I am redirected to the ".gitignore" on new branch - And I should see its new content - - @javascript @wip - Scenario: If I don't change the content of the file I see an error message - Given I click on ".gitignore" file in repo - And I click button "edit" - And I fill the commit message - And I click on "Commit changes" - # Test fails because carriage returns are added to the file. - Then I am on the ".gitignore" edit file page - And I see a commit error message - - @javascript - Scenario: I can see editing preview - Given I click on ".gitignore" file in repo - And I click button "Edit" - And I edit code - And I click link "Diff" - Then I see diff - - @javascript - Scenario: I can remove file and commit - Given I click on ".gitignore" file in repo - And I see the ".gitignore" - And I click on "Remove" - And I fill the commit message - And I click on "Remove file" - Then I am redirected to the files URL - And I don't see the ".gitignore" - - Scenario: I can browse directory with Browse Dir - Given I click on files directory - And I click on History link - Then I see Browse dir link - - Scenario: I can browse file with Browse File - Given I click on readme file - And I click on History link - Then I see Browse file link - - Scenario: I can browse code with Browse Code - Given I click on History link - Then I see Browse code link - - # Permalink - - Scenario: I click on the permalink link from a branch ref - Given I click on ".gitignore" file in repo - And I click on Permalink - Then I am redirected to the permalink URL - - Scenario: I don't see the permalink link from a SHA ref - Given I visit project source page for "6d394385cf567f80a8fd85055db1ab4c5295806f" - And I click on ".gitignore" file in repo - Then I don't see the permalink link diff --git a/features/project/source/git_blame.feature b/features/project/source/git_blame.feature deleted file mode 100644 index 48b1077dc6b..00000000000 --- a/features/project/source/git_blame.feature +++ /dev/null @@ -1,10 +0,0 @@ -Feature: Project Source Git Blame - Background: - Given I sign in as a user - And I own project "Shop" - Given I visit project source page - - Scenario: I blame file - Given I click on ".gitignore" file in repo - And I click Blame button - Then I should see git file blame diff --git a/features/project/source/markdown_render.feature b/features/project/source/markdown_render.feature deleted file mode 100644 index ecbd721c281..00000000000 --- a/features/project/source/markdown_render.feature +++ /dev/null @@ -1,132 +0,0 @@ -Feature: Project Source Markdown Render - Background: - Given I sign in as a user - And I own project "Delta" - And I visit markdown branch - - # Tree README - - Scenario: Tree view should have correct links in README - Given I go directory which contains README file - And I click on a relative link in README - Then I should see the correct markdown - - Scenario: I browse files from markdown branch - Then I should see files from repository in markdown - And I should see rendered README which contains correct links - And I click on Gitlab API in README - Then I should see correct document rendered - - Scenario: I view README in markdown branch - Then I should see files from repository in markdown - And I should see rendered README which contains correct links - And I click on Rake tasks in README - Then I should see correct directory rendered - - Scenario: I view README in markdown branch to see reference links to directory - Then I should see files from repository in markdown - And I should see rendered README which contains correct links - And I click on GitLab API doc directory in README - Then I should see correct doc/api directory rendered - - Scenario: I view README in markdown branch to see reference links to file - Then I should see files from repository in markdown - And I should see rendered README which contains correct links - And I click on Maintenance in README - Then I should see correct maintenance file rendered - - Scenario: README headers should have header links - Then I should see rendered README which contains correct links - And Header "Application details" should have correct id and link - - # Blob - - Scenario: I navigate to doc directory to view documentation in markdown - And I navigate to the doc/api/README - And I see correct file rendered - And I click on users in doc/api/README - Then I should see the correct document file - - Scenario: I navigate to doc directory to view user doc in markdown - And I navigate to the doc/api/README - And I see correct file rendered - And I click on raketasks in doc/api/README - Then I should see correct directory rendered - - Scenario: I navigate to doc directory to view user doc in markdown - And I navigate to the doc/api/README - And Header "GitLab API" should have correct id and link - - # Markdown branch - - Scenario: I browse files from markdown branch - When I visit markdown branch - Then I should see files from repository in markdown branch - And I should see rendered README which contains correct links - And I click on Gitlab API in README - Then I should see correct document rendered for markdown branch - - Scenario: I browse directory from markdown branch - When I visit markdown branch - Then I should see files from repository in markdown branch - And I should see rendered README which contains correct links - And I click on Rake tasks in README - Then I should see correct directory rendered for markdown branch - - Scenario: I navigate to doc directory to view documentation in markdown branch - When I visit markdown branch - And I navigate to the doc/api/README - And I see correct file rendered in markdown branch - And I click on users in doc/api/README - Then I should see the users document file in markdown branch - - Scenario: I navigate to doc directory to view user doc in markdown branch - When I visit markdown branch - And I navigate to the doc/api/README - And I see correct file rendered in markdown branch - And I click on raketasks in doc/api/README - Then I should see correct directory rendered for markdown branch - - Scenario: Tree markdown links view empty urls should have correct urls - When I visit markdown branch - Then The link with text "empty" should have url "tree/markdown" - When I visit markdown branch "README.md" blob - Then The link with text "empty" should have url "blob/markdown/README.md" - When I visit markdown branch "d" tree - Then The link with text "empty" should have url "tree/markdown/d" - When I visit markdown branch "d/README.md" blob - Then The link with text "empty" should have url "blob/markdown/d/README.md" - - # "ID" means "#id" on the tests below, because we are unable to escape the hash sign. - # which Spinach interprets as the start of a comment. - Scenario: All markdown links with ids should have correct urls - When I visit markdown branch - Then The link with text "ID" should have url "tree/markdownID" - Then The link with text "/ID" should have url "tree/markdownID" - Then The link with text "README.mdID" should have url "blob/markdown/README.mdID" - Then The link with text "d/README.mdID" should have url "blob/markdown/d/README.mdID" - When I visit markdown branch "README.md" blob - Then The link with text "ID" should have url "blob/markdown/README.mdID" - Then The link with text "/ID" should have url "blob/markdown/README.mdID" - Then The link with text "README.mdID" should have url "blob/markdown/README.mdID" - Then The link with text "d/README.mdID" should have url "blob/markdown/d/README.mdID" - - # Wiki - - Scenario: I create a wiki page with different links - Given I go to wiki page - And I add various links to the wiki page - Then Wiki page should have added links - And I click on test link - Then I see new wiki page named test - When I go back to wiki page home - And I click on GitLab API doc link - Then I see Gitlab API document - When I go back to wiki page home - And I click on Rake tasks link - Then I see Rake tasks directory - - Scenario: Wiki headers should have should have ids generated for them. - Given I go to wiki page - And I add a header to the wiki page - Then Wiki header should have correct id and link diff --git a/features/project/source/multiselect_blob.feature b/features/project/source/multiselect_blob.feature deleted file mode 100644 index 63b7cb77a93..00000000000 --- a/features/project/source/multiselect_blob.feature +++ /dev/null @@ -1,85 +0,0 @@ -Feature: Project Source Multiselect Blob - Background: - Given I sign in as a user - And I own project "Shop" - And I visit ".gitignore" file in repo - - @javascript - Scenario: I click line 1 in file - When I click line 1 in file - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - - @javascript - Scenario: I shift-click line 1 in file - When I shift-click line 1 in file - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - - @javascript - Scenario: I click line 1 then click line 2 in file - When I click line 1 in file - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - Then I click line 2 in file - Then I should see "L2" as URI fragment - And I should see line 2 highlighted - - @javascript - Scenario: I click various line numbers to test multiselect - Then I click line 1 in file - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - Then I shift-click line 2 in file - Then I should see "L1-2" as URI fragment - And I should see lines 1-2 highlighted - Then I shift-click line 3 in file - Then I should see "L1-3" as URI fragment - And I should see lines 1-3 highlighted - Then I click line 3 in file - Then I should see "L3" as URI fragment - And I should see line 3 highlighted - Then I shift-click line 1 in file - Then I should see "L1-3" as URI fragment - And I should see lines 1-3 highlighted - Then I shift-click line 5 in file - Then I should see "L1-5" as URI fragment - And I should see lines 1-5 highlighted - Then I shift-click line 4 in file - Then I should see "L1-4" as URI fragment - And I should see lines 1-4 highlighted - Then I click line 5 in file - Then I should see "L5" as URI fragment - And I should see line 5 highlighted - Then I shift-click line 3 in file - Then I should see "L3-5" as URI fragment - And I should see lines 3-5 highlighted - Then I shift-click line 1 in file - Then I should see "L1-3" as URI fragment - And I should see lines 1-3 highlighted - Then I shift-click line 1 in file - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - - @javascript - Scenario: I multiselect lines 1-5 and then go back and forward in history - When I click line 1 in file - And I shift-click line 3 in file - And I shift-click line 2 in file - And I shift-click line 5 in file - Then I should see "L1-5" as URI fragment - And I should see lines 1-5 highlighted - Then I go back in history - Then I should see "L1-2" as URI fragment - And I should see lines 1-2 highlighted - Then I go back in history - Then I should see "L1-3" as URI fragment - And I should see lines 1-3 highlighted - Then I go back in history - Then I should see "L1" as URI fragment - And I should see line 1 highlighted - Then I go forward in history - And I go forward in history - And I go forward in history - Then I should see "L1-5" as URI fragment - And I should see lines 1-5 highlighted diff --git a/features/project/source/search_code.feature b/features/project/source/search_code.feature deleted file mode 100644 index 4f9dcea249f..00000000000 --- a/features/project/source/search_code.feature +++ /dev/null @@ -1,15 +0,0 @@ -Feature: Project Source Search Code - Background: - Given I sign in as a user - - Scenario: Search for term "coffee" - Given I own project "Shop" - And I visit project source page - When I search for term "coffee" - Then I should see files from repository containing "coffee" - - Scenario: Search on empty project - Given I own an empty project - And I visit my project's home page - When I search for term "coffee" - Then I should see empty result diff --git a/features/project/star.feature b/features/project/star.feature deleted file mode 100644 index a45f9c470ea..00000000000 --- a/features/project/star.feature +++ /dev/null @@ -1,38 +0,0 @@ -Feature: Project Star - Scenario: New projects have 0 stars - Given public project "Community" - When I visit project "Community" page - Then The project has no stars - - Scenario: Empty projects show star count - Given public empty project "Empty Public Project" - When I visit empty project page - Then The project has no stars - - Scenario: Signed off users can't star projects - Given public project "Community" - And I visit project "Community" page - When I click on the star toggle button - Then I redirected to sign in page - - @javascript - Scenario: Signed in users can toggle star - Given I sign in as "John Doe" - And public project "Community" - And I visit project "Community" page - When I click on the star toggle button - Then The project has 1 star - When I click on the star toggle button - Then The project has 0 stars - - @javascript - Scenario: Star count sums stars - Given I sign in as "John Doe" - And public project "Community" - And I visit project "Community" page - And I click on the star toggle button - And I logout - And I sign in as "Mary Jane" - And I visit project "Community" page - When I click on the star toggle button - Then The project has 2 stars diff --git a/features/project/team_management.feature b/features/project/team_management.feature deleted file mode 100644 index 6cda225ea7b..00000000000 --- a/features/project/team_management.feature +++ /dev/null @@ -1,43 +0,0 @@ -Feature: Project Team Management - Background: - Given I sign in as a user - And I own project "Shop" - And gitlab user "Mike" - And gitlab user "Sam" - And "Sam" is "Shop" developer - And I visit project "Shop" team page - - Scenario: See all team members - Then I should be able to see myself in team - And I should see "Sam" in team list - - @javascript - Scenario: Add user to project - Given I click link "Add members" - And I select "Mike" as "Reporter" - Then I should see "Mike" in team list as "Reporter" - - @javascript - Scenario: Invite user to project - Given I click link "Add members" - And I select "sjobs@apple.com" as "Reporter" - Then I should see "sjobs@apple.com" in team list as invited "Reporter" - - @javascript - Scenario: Update user access - Given I should see "Sam" in team list as "Developer" - And I change "Sam" role to "Reporter" - And I should see "Sam" in team list as "Reporter" - - Scenario: Cancel team member - Given I click cancel link for "Sam" - Then I visit project "Shop" team page - And I should not see "Sam" in team list - - Scenario: Import team from another project - Given I own project "Website" - And "Mike" is "Website" reporter - When I visit project "Shop" team page - And I click link "Import team from another project" - And I submit "Website" project for import team - Then I should see "Mike" in team list as "Reporter" diff --git a/features/project/wiki.feature b/features/project/wiki.feature deleted file mode 100644 index 977cd609a11..00000000000 --- a/features/project/wiki.feature +++ /dev/null @@ -1,88 +0,0 @@ -Feature: Project Wiki - Background: - Given I sign in as a user - And I own project "Shop" - Given I visit project wiki page - - Scenario: Add new page - Given I create the Wiki Home page - Then I should see the newly created wiki page - - Scenario: Pressing Cancel while editing a brand new Wiki - Given I click on the Cancel button - Then I should be redirected back to the Edit Home Wiki page - - Scenario: Edit existing page - Given I have an existing Wiki page - And I browse to that Wiki page - And I click on the Edit button - And I change the content - Then I should see the updated content - - Scenario: Pressing Cancel while editing an existing Wiki page - Given I have an existing Wiki page - And I browse to that Wiki page - And I click on the Edit button - And I click on the Cancel button - Then I should be redirected back to that Wiki page - - Scenario: View page history - Given I have an existing wiki page - And That page has two revisions - And I browse to that Wiki page - And I click the History button - Then I should see both revisions - - Scenario: Destroy Wiki page - Given I have an existing wiki page - And I browse to that Wiki page - And I click on the Edit button - And I click on the "Delete this page" button - Then The page should be deleted - - Scenario: View all pages - Given I have an existing wiki page - And I browse to that Wiki page - And I click on the "Pages" button - Then I should see the existing page in the pages list - - Scenario: File exists in wiki repo - Given I have an existing Wiki page with images linked on page - And I browse to wiki page with images - And I click on existing image link - Then I should see the image from wiki repo - - Scenario: Image in wiki repo shown on the page - Given I have an existing Wiki page with images linked on page - And I browse to wiki page with images - Then Image should be shown on the page - - Scenario: File does not exist in wiki repo - Given I have an existing Wiki page with images linked on page - And I browse to wiki page with images - And I click on image link - Then I should see the new wiki page form - - @javascript - Scenario: New Wiki page that has a path - Given I create a New page with paths - And I click on the "Pages" button - Then I should see non-escaped link in the pages list - - @javascript - Scenario: Edit Wiki page that has a path - Given I create a New page with paths - And I click on the "Pages" button - And I edit the Wiki page with a path - Then I should see a non-escaped path - And I should see the Editing page - And I change the content - Then I should see the updated content - - @javascript - Scenario: View the page history of a Wiki page that has a path - Given I create a New page with paths - And I click on the "Pages" button - And I view the page history of a Wiki page that has a path - Then I should see a non-escaped path - And I should see the page history diff --git a/features/search.feature b/features/search.feature deleted file mode 100644 index def21e00923..00000000000 --- a/features/search.feature +++ /dev/null @@ -1,46 +0,0 @@ -@dashboard -Feature: Search - Background: - Given I sign in as a user - And I own project "Shop" - And I visit dashboard search page - - Scenario: I should see project I am looking for - Given I search for "Sho" - Then I should see "Shop" project link - - Scenario: I should see issues I am looking for - And project has issues - When I search for "Foo" - And I click "Issues" link - Then I should see "Foo" link in the search results - And I should not see "Bar" link in the search results - - Scenario: I should see merge requests I am looking for - And project has merge requests - When I search for "Foo" - When I click "Merge requests" link - Then I should see "Foo" link in the search results - And I should not see "Bar" link in the search results - - Scenario: I should see project code I am looking for - When I click project "Shop" link - And I search for "rspec" - Then I should see code results for project "Shop" - - Scenario: I should see project issues - And project has issues - When I click project "Shop" link - And I search for "Foo" - And I click "Issues" link - Then I should see "Foo" link in the search results - And I should not see "Bar" link in the search results - - Scenario: I should see project merge requests - And project has merge requests - When I click project "Shop" link - And I search for "Foo" - And I click "Merge requests" link - Then I should see "Foo" link in the search results - And I should not see "Bar" link in the search results - diff --git a/features/snippet_search.feature b/features/snippet_search.feature deleted file mode 100644 index 834bd3b2376..00000000000 --- a/features/snippet_search.feature +++ /dev/null @@ -1,20 +0,0 @@ -@dashboard -Feature: Snippet Search - Background: - Given I sign in as a user - And I have public "Personal snippet one" snippet - And I have private "Personal snippet private" snippet - And I have a public many lined snippet - - Scenario: I should see my public and private snippets - When I search for "snippet" in snippet titles - Then I should see "Personal snippet one" in results - And I should see "Personal snippet private" in results - - Scenario: I should see three surrounding lines on either side of a matching snippet line - When I search for "line seven" in snippet contents - Then I should see "line four" in results - And I should see "line seven" in results - And I should see "line ten" in results - And I should not see "line three" in results - And I should not see "line eleven" in results diff --git a/features/snippets/discover.feature b/features/snippets/discover.feature deleted file mode 100644 index 1a7e132ea25..00000000000 --- a/features/snippets/discover.feature +++ /dev/null @@ -1,13 +0,0 @@ -@snippets -Feature: Snippets Discover - Background: - Given I sign in as a user - And I have public "Personal snippet one" snippet - And I have private "Personal snippet private" snippet - And I have internal "Personal snippet internal" snippet - - Scenario: I should see snippets - Given I visit snippets page - Then I should see "Personal snippet one" in snippets - And I should see "Personal snippet internal" in snippets - And I should not see "Personal snippet private" in snippets diff --git a/features/snippets/public_snippets.feature b/features/snippets/public_snippets.feature deleted file mode 100644 index c2afb63b6d8..00000000000 --- a/features/snippets/public_snippets.feature +++ /dev/null @@ -1,10 +0,0 @@ -Feature: Public snippets - Scenario: Unauthenticated user should see public snippets - Given There is public "Personal snippet one" snippet - And I visit snippet page "Personal snippet one" - Then I should see snippet "Personal snippet one" - - Scenario: Unauthenticated user should see raw public snippets - Given There is public "Personal snippet one" snippet - And I visit snippet raw page "Personal snippet one" - Then I should see raw snippet "Personal snippet one" diff --git a/features/snippets/snippets.feature b/features/snippets/snippets.feature deleted file mode 100644 index 6e8019c326f..00000000000 --- a/features/snippets/snippets.feature +++ /dev/null @@ -1,28 +0,0 @@ -@snippets -Feature: Snippets - Background: - Given I sign in as a user - And I have public "Personal snippet one" snippet - And I have private "Personal snippet private" snippet - - Scenario: I create new snippet - Given I visit new snippet page - And I submit new snippet "Personal snippet three" - Then I should see snippet "Personal snippet three" - - Scenario: I update "Personal snippet one" - Given I visit snippet page "Personal snippet one" - And I click link "Edit" - And I submit new title "Personal snippet new title" - Then I should see "Personal snippet new title" - - Scenario: Set "Personal snippet one" public - Given I visit snippet page "Personal snippet one" - And I click link "Edit" - And I uncheck "Private" checkbox - Then I should see "Personal snippet one" public - - Scenario: I destroy "Personal snippet one" - Given I visit snippet page "Personal snippet one" - And I click link "Destroy" - Then I should not see "Personal snippet one" in snippets \ No newline at end of file diff --git a/features/snippets/user.feature b/features/snippets/user.feature deleted file mode 100644 index 5b5dadb7b39..00000000000 --- a/features/snippets/user.feature +++ /dev/null @@ -1,34 +0,0 @@ -@snippets -Feature: Snippets User - Background: - Given I sign in as a user - And I have public "Personal snippet one" snippet - And I have private "Personal snippet private" snippet - And I have internal "Personal snippet internal" snippet - - Scenario: I should see all my snippets - Given I visit my snippets page - Then I should see "Personal snippet one" in snippets - And I should see "Personal snippet private" in snippets - And I should see "Personal snippet internal" in snippets - - Scenario: I can see only my private snippets - Given I visit my snippets page - And I click "Private" filter - Then I should not see "Personal snippet one" in snippets - And I should not see "Personal snippet internal" in snippets - And I should see "Personal snippet private" in snippets - - Scenario: I can see only my public snippets - Given I visit my snippets page - And I click "Public" filter - Then I should see "Personal snippet one" in snippets - And I should not see "Personal snippet private" in snippets - And I should not see "Personal snippet internal" in snippets - - Scenario: I can see only my internal snippets - Given I visit my snippets page - And I click "Internal" filter - Then I should see "Personal snippet internal" in snippets - And I should not see "Personal snippet private" in snippets - And I should not see "Personal snippet one" in snippets diff --git a/features/steps/admin/active_tab.rb b/features/steps/admin/active_tab.rb deleted file mode 100644 index 90d13abdb13..00000000000 --- a/features/steps/admin/active_tab.rb +++ /dev/null @@ -1,37 +0,0 @@ -class Spinach::Features::AdminActiveTab < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedActiveTab - - step 'the active main tab should be Home' do - ensure_active_main_tab('Overview') - end - - step 'the active main tab should be Projects' do - ensure_active_main_tab('Projects') - end - - step 'the active main tab should be Groups' do - ensure_active_main_tab('Groups') - end - - step 'the active main tab should be Users' do - ensure_active_main_tab('Users') - end - - step 'the active main tab should be Logs' do - ensure_active_main_tab('Logs') - end - - step 'the active main tab should be Hooks' do - ensure_active_main_tab('Hooks') - end - - step 'the active main tab should be Resque' do - ensure_active_main_tab('Background Jobs') - end - - step 'the active main tab should be Messages' do - ensure_active_main_tab('Messages') - end -end diff --git a/features/steps/admin/applications.rb b/features/steps/admin/applications.rb deleted file mode 100644 index d59088fa3c3..00000000000 --- a/features/steps/admin/applications.rb +++ /dev/null @@ -1,55 +0,0 @@ -class Spinach::Features::AdminApplications < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'I click on new application button' do - click_on 'New Application' - end - - step 'I should see application form' do - page.should have_content "New application" - end - - step 'I fill application form out and submit' do - fill_in :doorkeeper_application_name, with: 'test' - fill_in :doorkeeper_application_redirect_uri, with: 'https://test.com' - click_on "Submit" - end - - step 'I see application' do - page.should have_content "Application: test" - page.should have_content "Application Id" - page.should have_content "Secret" - end - - step 'I click edit' do - click_on "Edit" - end - - step 'I see edit application form' do - page.should have_content "Edit application" - end - - step 'I change name of application and submit' do - page.should have_content "Edit application" - fill_in :doorkeeper_application_name, with: 'test_changed' - click_on "Submit" - end - - step 'I see that application was changed' do - page.should have_content "test_changed" - page.should have_content "Application Id" - page.should have_content "Secret" - end - - step 'I click to remove application' do - within '.oauth-applications' do - click_on "Destroy" - end - end - - step "I see that application is removed" do - page.find(".oauth-applications").should_not have_content "test_changed" - end -end diff --git a/features/steps/admin/broadcast_messages.rb b/features/steps/admin/broadcast_messages.rb deleted file mode 100644 index a35fa34a3a2..00000000000 --- a/features/steps/admin/broadcast_messages.rb +++ /dev/null @@ -1,41 +0,0 @@ -class Spinach::Features::AdminBroadcastMessages < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'application already has admin messages' do - FactoryGirl.create(:broadcast_message, message: "Migration to new server") - end - - step 'I should be all broadcast messages' do - page.should have_content "Migration to new server" - end - - step 'submit form with new broadcast message' do - fill_in 'broadcast_message_message', with: 'Application update from 4:00 CST to 5:00 CST' - select '2018', from: "broadcast_message_ends_at_1i" - click_button "Add broadcast message" - end - - step 'I should be redirected to admin messages page' do - current_path.should == admin_broadcast_messages_path - end - - step 'I should see newly created broadcast message' do - page.should have_content 'Application update from 4:00 CST to 5:00 CST' - end - - step 'submit form with new customized broadcast message' do - fill_in 'broadcast_message_message', with: 'Application update from 4:00 CST to 5:00 CST' - click_link "Customize colors" - fill_in 'broadcast_message_color', with: '#f2dede' - fill_in 'broadcast_message_font', with: '#b94a48' - select '2018', from: "broadcast_message_ends_at_1i" - click_button "Add broadcast message" - end - - step 'I should see a customized broadcast message' do - page.should have_content 'Application update from 4:00 CST to 5:00 CST' - page.should have_selector %(div[style="background-color:#f2dede;color:#b94a48"]) - end -end diff --git a/features/steps/admin/deploy_keys.rb b/features/steps/admin/deploy_keys.rb deleted file mode 100644 index fb0b611762e..00000000000 --- a/features/steps/admin/deploy_keys.rb +++ /dev/null @@ -1,57 +0,0 @@ -class Spinach::Features::AdminDeployKeys < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'there are public deploy keys in system' do - create(:deploy_key, public: true) - create(:another_deploy_key, public: true) - end - - step 'I should see all public deploy keys' do - DeployKey.are_public.each do |p| - page.should have_content p.title - end - end - - step 'I click on first deploy key' do - click_link DeployKey.are_public.first.title - end - - step 'I should see deploy key details' do - deploy_key = DeployKey.are_public.first - current_path.should == admin_deploy_key_path(deploy_key) - page.should have_content(deploy_key.title) - page.should have_content(deploy_key.key) - end - - step 'I visit admin deploy key page' do - visit admin_deploy_key_path(deploy_key) - end - - step 'I visit admin deploy keys page' do - visit admin_deploy_keys_path - end - - step 'I click \'New Deploy Key\'' do - click_link 'New Deploy Key' - end - - step 'I submit new deploy key' do - fill_in "deploy_key_title", with: "laptop" - fill_in "deploy_key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop" - click_button "Create" - end - - step 'I should be on admin deploy keys page' do - current_path.should == admin_deploy_keys_path - end - - step 'I should see newly created deploy key' do - page.should have_content(deploy_key.title) - end - - def deploy_key - @deploy_key ||= DeployKey.are_public.first - end -end diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb deleted file mode 100644 index 721460b9371..00000000000 --- a/features/steps/admin/groups.rb +++ /dev/null @@ -1,85 +0,0 @@ -class Spinach::Features::AdminGroups < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedUser - include SharedActiveTab - include Select2Helper - - When 'I visit admin group page' do - visit admin_group_path(current_group) - end - - When 'I click new group link' do - click_link "New Group" - end - - step 'I have group with projects' do - @group = create(:group) - @project = create(:project, group: @group) - @event = create(:closed_issue_event, project: @project) - - @project.team << [current_user, :master] - end - - step 'submit form with new group info' do - fill_in 'group_path', with: 'gitlab' - fill_in 'group_description', with: 'Group description' - click_button "Create group" - end - - step 'I should see newly created group' do - page.should have_content "Group: gitlab" - page.should have_content "Group description" - end - - step 'I should be redirected to group page' do - current_path.should == admin_group_path(Group.find_by(path: 'gitlab')) - end - - When 'I select user "John Doe" from user list as "Reporter"' do - select2(user_john.id, from: "#user_ids", multiple: true) - within "#new_project_member" do - select "Reporter", from: "access_level" - end - click_button "Add users to group" - end - - step 'I should see "John Doe" in team list in every project as "Reporter"' do - within ".group-users-list" do - page.should have_content "John Doe" - page.should have_content "Reporter" - end - end - - step 'I should be all groups' do - Group.all.each do |group| - page.should have_content group.name - end - end - - step 'we have user "John Doe" in group' do - current_group.add_user(user_john, Gitlab::Access::REPORTER) - end - - step 'I remove user "John Doe" from group' do - within "#user_#{user_john.id}" do - click_link 'Remove user from group' - end - end - - step 'I should not see "John Doe" in team list' do - within ".group-users-list" do - page.should_not have_content "John Doe" - end - end - - protected - - def current_group - @group ||= Group.first - end - - def user_john - @user_john ||= User.find_by(name: "John Doe") - end -end diff --git a/features/steps/admin/logs.rb b/features/steps/admin/logs.rb deleted file mode 100644 index 904e5468655..00000000000 --- a/features/steps/admin/logs.rb +++ /dev/null @@ -1,11 +0,0 @@ -class Spinach::Features::AdminLogs < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'I should see tabs with available logs' do - page.should have_content 'production.log' - page.should have_content 'githost.log' - page.should have_content 'application.log' - end -end diff --git a/features/steps/admin/projects.rb b/features/steps/admin/projects.rb deleted file mode 100644 index 9be4d39d2d5..00000000000 --- a/features/steps/admin/projects.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Spinach::Features::AdminProjects < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'I should see all projects' do - Project.all.each do |p| - page.should have_content p.name_with_namespace - end - end - - step 'I click on first project' do - click_link Project.first.name_with_namespace - end - - step 'I should see project details' do - project = Project.first - current_path.should == admin_namespace_project_path(project.namespace, project) - page.should have_content(project.name_with_namespace) - page.should have_content(project.creator.name) - end - - step 'I visit admin project page' do - visit admin_namespace_project_path(project.namespace, project) - end - - step 'I transfer project to group \'Web\'' do - find(:xpath, "//input[@id='new_namespace_id']").set group.id - click_button 'Transfer' - end - - step 'group \'Web\'' do - create(:group, name: 'Web') - end - - step 'I should see project transfered' do - page.should have_content 'Web / ' + project.name - page.should have_content 'Namespace: Web' - end - - def project - @project ||= Project.first - end - - def group - Group.find_by(name: 'Web') - end -end diff --git a/features/steps/admin/settings.rb b/features/steps/admin/settings.rb deleted file mode 100644 index 87d4e969ff5..00000000000 --- a/features/steps/admin/settings.rb +++ /dev/null @@ -1,47 +0,0 @@ -class Spinach::Features::AdminSettings < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - include Gitlab::CurrentSettings - - step 'I modify settings and save form' do - uncheck 'Gravatar enabled' - fill_in 'Home page url', with: 'https://about.gitlab.com/' - click_button 'Save' - end - - step 'I should see application settings saved' do - current_application_settings.gravatar_enabled.should be_false - current_application_settings.home_page_url.should == 'https://about.gitlab.com/' - page.should have_content 'Application settings saved successfully' - end - - step 'I click on "Service Templates"' do - click_link 'Service Templates' - end - - step 'I click on "Slack" service' do - click_link 'Slack' - end - - step 'I check all events and submit form' do - page.check('Active') - page.check('Push events') - page.check('Tag push events') - page.check('Comments') - page.check('Issues events') - page.check('Merge Request events') - fill_in 'Webhook', with: "http://localhost" - click_on 'Save' - end - - step 'I should see service template settings saved' do - page.should have_content 'Application settings saved successfully' - end - - step 'I should see all checkboxes checked' do - all('input[type=checkbox]').each do |checkbox| - checkbox.should be_checked - end - end -end diff --git a/features/steps/admin/users.rb b/features/steps/admin/users.rb deleted file mode 100644 index e1383097248..00000000000 --- a/features/steps/admin/users.rb +++ /dev/null @@ -1,117 +0,0 @@ -class Spinach::Features::AdminUsers < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedAdmin - - step 'I should see all users' do - User.all.each do |user| - page.should have_content user.name - end - end - - step 'Click edit' do - @user = User.first - find("#edit_user_#{@user.id}").click - end - - step 'Input non ascii char in username' do - fill_in 'user_username', with: "\u3042\u3044" - end - - step 'Click save' do - click_button("Save") - end - - step 'See username error message' do - within "#error_explanation" do - page.should have_content "Username" - end - end - - step 'Not changed form action url' do - page.should have_selector %(form[action="/admin/users/#{@user.username}"]) - end - - step 'I submit modified user' do - check :user_can_create_group - click_button 'Save' - end - - step 'I see user attributes changed' do - page.should have_content 'Can create groups: Yes' - end - - step 'click edit on my user' do - find("#edit_user_#{current_user.id}").click - end - - step 'I view the user with secondary email' do - @user_with_secondary_email = User.last - @user_with_secondary_email.emails.new(email: "secondary@example.com") - @user_with_secondary_email.save - visit "/admin/users/#{@user_with_secondary_email.username}" - end - - step 'I see the secondary email' do - page.should have_content "Secondary email: #{@user_with_secondary_email.emails.last.email}" - end - - step 'I click remove secondary email' do - find("#remove_email_#{@user_with_secondary_email.emails.last.id}").click - end - - step 'I should not see secondary email anymore' do - page.should_not have_content "Secondary email:" - end - - step 'user "Mike" with groups and projects' do - user = create(:user, name: 'Mike') - - project = create(:empty_project) - project.team << [user, :developer] - - group = create(:group) - group.add_user(user, Gitlab::Access::DEVELOPER) - end - - step 'click on "Mike" link' do - click_link "Mike" - end - - step 'I should see user "Mike" details' do - page.should have_content 'Account' - page.should have_content 'Personal projects limit' - end - - step 'user "Pete" with ssh keys' do - user = create(:user, name: 'Pete') - create(:key, user: user, title: "ssh-rsa Key1", key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4FIEBXGi4bPU8kzxMefudPIJ08/gNprdNTaO9BR/ndy3+58s2HCTw2xCHcsuBmq+TsAqgEidVq4skpqoTMB+Uot5Uzp9z4764rc48dZiI661izoREoKnuRQSsRqUTHg5wrLzwxlQbl1MVfRWQpqiz/5KjBC7yLEb9AbusjnWBk8wvC1bQPQ1uLAauEA7d836tgaIsym9BrLsMVnR4P1boWD3Xp1B1T/ImJwAGHvRmP/ycIqmKdSpMdJXwxcb40efWVj0Ibbe7ii9eeoLdHACqevUZi6fwfbymdow+FeqlkPoHyGg3Cu4vD/D8+8cRc7mE/zGCWcQ15Var83Tczour Key1") - create(:key, user: user, title: "ssh-rsa Key2", key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2") - end - - step 'click on user "Pete"' do - click_link 'Pete' - end - - step 'I should see key list' do - page.should have_content 'ssh-rsa Key2' - page.should have_content 'ssh-rsa Key1' - end - - step 'I click on the key title' do - click_link 'ssh-rsa Key2' - end - - step 'I should see key details' do - page.should have_content 'ssh-rsa Key2' - page.should have_content 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQSTWXhJAX/He+nG78MiRRRn7m0Pb0XbcgTxE0etArgoFoh9WtvDf36HG6tOSg/0UUNcp0dICsNAmhBKdncp6cIyPaXJTURPRAGvhI0/VDk4bi27bRnccGbJ/hDaUxZMLhhrzY0r22mjVf8PF6dvv5QUIQVm1/LeaWYsHHvLgiIjwrXirUZPnFrZw6VLREoBKG8uWvfSXw1L5eapmstqfsME8099oi+vWLR8MgEysZQmD28M73fgW4zek6LDQzKQyJx9nB+hJkKUDvcuziZjGmRFlNgSA2mguERwL1OXonD8WYUrBDGKroIvBT39zS5d9tQDnidEJZ9Y8gv5ViYP7x Key2' - end - - step 'I click on remove key' do - click_link 'Remove' - end - - step 'I should see the key removed' do - page.should_not have_content 'ssh-rsa Key2' - end -end diff --git a/features/steps/dashboard/active_tab.rb b/features/steps/dashboard/active_tab.rb deleted file mode 100644 index 0e2c04fb299..00000000000 --- a/features/steps/dashboard/active_tab.rb +++ /dev/null @@ -1,9 +0,0 @@ -class Spinach::Features::DashboardActiveTab < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedActiveTab - - step 'the active main tab should be Help' do - ensure_active_main_tab('Help') - end -end diff --git a/features/steps/dashboard/archived_projects.rb b/features/steps/dashboard/archived_projects.rb deleted file mode 100644 index 969baf92287..00000000000 --- a/features/steps/dashboard/archived_projects.rb +++ /dev/null @@ -1,22 +0,0 @@ -class Spinach::Features::DashboardArchivedProjects < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - When 'project "Forum" is archived' do - project = Project.find_by(name: "Forum") - project.update_attribute(:archived, true) - end - - step 'I should see "Shop" project link' do - page.should have_link "Shop" - end - - step 'I should not see "Forum" project link' do - page.should_not have_link "Forum" - end - - step 'I should see "Forum" project link' do - page.should have_link "Forum" - end -end diff --git a/features/steps/dashboard/dashboard.rb b/features/steps/dashboard/dashboard.rb deleted file mode 100644 index 8508b2a8096..00000000000 --- a/features/steps/dashboard/dashboard.rb +++ /dev/null @@ -1,85 +0,0 @@ -class Spinach::Features::Dashboard < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I should see "New Project" link' do - page.should have_link "New project" - end - - step 'I should see "Shop" project link' do - page.should have_link "Shop" - end - - step 'I should see last push widget' do - page.should have_content "You pushed to fix" - page.should have_link "Create Merge Request" - end - - step 'I click "Create Merge Request" link' do - click_link "Create Merge Request" - end - - step 'I see prefilled new Merge Request page' do - current_path.should == new_namespace_project_merge_request_path(@project.namespace, @project) - find("#merge_request_target_project_id").value.should == @project.id.to_s - find("#merge_request_source_branch").value.should == "fix" - find("#merge_request_target_branch").value.should == "master" - end - - step 'user with name "John Doe" joined project "Shop"' do - user = create(:user, {name: "John Doe"}) - project.team << [user, :master] - Event.create( - project: project, - author_id: user.id, - action: Event::JOINED - ) - end - - step 'I should see "John Doe joined project Shop" event' do - page.should have_content "John Doe joined project #{project.name_with_namespace}" - end - - step 'user with name "John Doe" left project "Shop"' do - user = User.find_by(name: "John Doe") - Event.create( - project: project, - author_id: user.id, - action: Event::LEFT - ) - end - - step 'I should see "John Doe left project Shop" event' do - page.should have_content "John Doe left project #{project.name_with_namespace}" - end - - step 'I have group with projects' do - @group = create(:group) - @project = create(:project, namespace: @group) - @event = create(:closed_issue_event, project: @project) - - @project.team << [current_user, :master] - end - - step 'I should see projects list' do - @user.authorized_projects.all.each do |project| - page.should have_link project.name_with_namespace - end - end - - step 'I should see groups list' do - Group.all.each do |group| - page.should have_link group.name - end - end - - step 'group has a projects that does not belongs to me' do - @forbidden_project1 = create(:project, group: @group) - @forbidden_project2 = create(:project, group: @group) - end - - step 'I should see 1 project at group list' do - find('span.last_activity/span').should have_content('1') - end -end diff --git a/features/steps/dashboard/event_filters.rb b/features/steps/dashboard/event_filters.rb deleted file mode 100644 index 3da3d62d0c0..00000000000 --- a/features/steps/dashboard/event_filters.rb +++ /dev/null @@ -1,85 +0,0 @@ -class Spinach::Features::EventFilters < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I should see push event' do - page.should have_selector('span.pushed') - end - - step 'I should not see push event' do - page.should_not have_selector('span.pushed') - end - - step 'I should see new member event' do - page.should have_selector('span.joined') - end - - step 'I should not see new member event' do - page.should_not have_selector('span.joined') - end - - step 'I should see merge request event' do - page.should have_selector('span.accepted') - end - - step 'I should not see merge request event' do - page.should_not have_selector('span.accepted') - end - - step 'this project has push event' do - data = { - before: Gitlab::Git::BLANK_SHA, - after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e", - ref: "refs/heads/new_design", - user_id: @user.id, - user_name: @user.name, - repository: { - name: @project.name, - url: "localhost/rubinius", - description: "", - homepage: "localhost/rubinius", - private: true - } - } - - @event = Event.create( - project: @project, - action: Event::PUSHED, - data: data, - author_id: @user.id - ) - end - - step 'this project has new member event' do - user = create(:user, {name: "John Doe"}) - Event.create( - project: @project, - author_id: user.id, - action: Event::JOINED - ) - end - - step 'this project has merge request event' do - merge_request = create :merge_request, author: @user, source_project: @project, target_project: @project - Event.create( - project: @project, - action: Event::MERGED, - target_id: merge_request.id, - target_type: "MergeRequest", - author_id: @user.id - ) - end - - When 'I click "push" event filter' do - click_link("push_event_filter") - end - - When 'I click "team" event filter' do - click_link("team_event_filter") - end - - When 'I click "merge" event filter' do - click_link("merged_event_filter") - end -end diff --git a/features/steps/dashboard/group.rb b/features/steps/dashboard/group.rb deleted file mode 100644 index 8384df2fb59..00000000000 --- a/features/steps/dashboard/group.rb +++ /dev/null @@ -1,63 +0,0 @@ -class Spinach::Features::DashboardGroup < Spinach::FeatureSteps - include SharedAuthentication - include SharedGroup - include SharedPaths - include SharedUser - - # Leave - - step 'I click on the "Leave" button for group "Owned"' do - find(:css, 'li', text: "Owner").find(:css, 'i.fa.fa-sign-out').click - # poltergeist always confirms popups. - end - - step 'I click on the "Leave" button for group "Guest"' do - find(:css, 'li', text: "Guest").find(:css, 'i.fa.fa-sign-out').click - # poltergeist always confirms popups. - end - - step 'I should not see the "Leave" button for group "Owned"' do - find(:css, 'li', text: "Owner").should_not have_selector(:css, 'i.fa.fa-sign-out') - # poltergeist always confirms popups. - end - - step 'I should not see the "Leave" button for groupr "Guest"' do - find(:css, 'li', text: "Guest").should_not have_selector(:css, 'i.fa.fa-sign-out') - # poltergeist always confirms popups. - end - - step 'I should see group "Owned" in group list' do - page.should have_content("Owned") - end - - step 'I should not see group "Owned" in group list' do - page.should_not have_content("Owned") - end - - step 'I should see group "Guest" in group list' do - page.should have_content("Guest") - end - - step 'I should not see group "Guest" in group list' do - page.should_not have_content("Guest") - end - - step 'I click new group link' do - click_link "New Group" - end - - step 'submit form with new group "Samurai" info' do - fill_in 'group_path', with: 'Samurai' - fill_in 'group_description', with: 'Tokugawa Shogunate' - click_button "Create group" - end - - step 'I should be redirected to group "Samurai" page' do - current_path.should == group_path(Group.find_by(name: 'Samurai')) - end - - step 'I should see newly created group "Samurai"' do - page.should have_content "Samurai" - page.should have_content "Tokugawa Shogunate" - end -end diff --git a/features/steps/dashboard/issues.rb b/features/steps/dashboard/issues.rb deleted file mode 100644 index 60da36e86de..00000000000 --- a/features/steps/dashboard/issues.rb +++ /dev/null @@ -1,83 +0,0 @@ -class Spinach::Features::DashboardIssues < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include Select2Helper - - step 'I should see issues assigned to me' do - should_see(assigned_issue) - should_not_see(authored_issue) - should_not_see(other_issue) - end - - step 'I should see issues authored by me' do - should_see(authored_issue) - should_see(authored_issue_on_public_project) - should_not_see(assigned_issue) - should_not_see(other_issue) - end - - step 'I should see all issues' do - should_see(authored_issue) - should_see(assigned_issue) - should_see(other_issue) - end - - step 'I have authored issues' do - authored_issue - authored_issue_on_public_project - end - - step 'I have assigned issues' do - assigned_issue - end - - step 'I have other issues' do - other_issue - end - - step 'I click "Authored by me" link' do - select2(current_user.id, from: "#author_id") - select2(nil, from: "#assignee_id") - end - - step 'I click "All" link' do - select2(nil, from: "#author_id") - select2(nil, from: "#assignee_id") - end - - def should_see(issue) - page.should have_content(issue.title[0..10]) - end - - def should_not_see(issue) - page.should_not have_content(issue.title[0..10]) - end - - def assigned_issue - @assigned_issue ||= create :issue, assignee: current_user, project: project - end - - def authored_issue - @authored_issue ||= create :issue, author: current_user, project: project - end - - def other_issue - @other_issue ||= create :issue, project: project - end - - def authored_issue_on_public_project - @authored_issue_on_public_project ||= create :issue, author: current_user, project: public_project - end - - def project - @project ||= begin - project =create :project - project.team << [current_user, :master] - project - end - end - - def public_project - @public_project ||= create :project, :public - end -end diff --git a/features/steps/dashboard/merge_requests.rb b/features/steps/dashboard/merge_requests.rb deleted file mode 100644 index 9d92082bb83..00000000000 --- a/features/steps/dashboard/merge_requests.rb +++ /dev/null @@ -1,113 +0,0 @@ -class Spinach::Features::DashboardMergeRequests < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include Select2Helper - - step 'I should see merge requests assigned to me' do - should_see(assigned_merge_request) - should_see(assigned_merge_request_from_fork) - should_not_see(authored_merge_request) - should_not_see(authored_merge_request_from_fork) - should_not_see(other_merge_request) - end - - step 'I should see merge requests authored by me' do - should_see(authored_merge_request) - should_see(authored_merge_request_from_fork) - should_not_see(assigned_merge_request) - should_not_see(assigned_merge_request_from_fork) - should_not_see(other_merge_request) - end - - step 'I should see all merge requests' do - should_see(authored_merge_request) - should_see(assigned_merge_request) - should_see(other_merge_request) - end - - step 'I have authored merge requests' do - authored_merge_request - authored_merge_request_from_fork - end - - step 'I have assigned merge requests' do - assigned_merge_request - assigned_merge_request_from_fork - end - - step 'I have other merge requests' do - other_merge_request - end - - step 'I click "Authored by me" link' do - select2(current_user.id, from: "#author_id") - select2(nil, from: "#assignee_id") - end - - step 'I click "All" link' do - select2(nil, from: "#author_id") - select2(nil, from: "#assignee_id") - end - - def should_see(merge_request) - page.should have_content(merge_request.title[0..10]) - end - - def should_not_see(merge_request) - page.should_not have_content(merge_request.title[0..10]) - end - - def assigned_merge_request - @assigned_merge_request ||= create :merge_request, - assignee: current_user, - target_project: project, - source_project: project - end - - def authored_merge_request - @authored_merge_request ||= create :merge_request, - source_branch: 'simple_merge_request', - author: current_user, - target_project: project, - source_project: project - end - - def other_merge_request - @other_merge_request ||= create :merge_request, - source_branch: '2_3_notes_fix', - target_project: project, - source_project: project - end - - def authored_merge_request_from_fork - @authored_merge_request_from_fork ||= create :merge_request, - source_branch: 'basic_page', - author: current_user, - target_project: public_project, - source_project: forked_project - end - - def assigned_merge_request_from_fork - @assigned_merge_request_from_fork ||= create :merge_request, - source_branch: 'basic_page_fix', - assignee: current_user, - target_project: public_project, - source_project: forked_project - end - - def project - @project ||= begin - project =create :project - project.team << [current_user, :master] - project - end - end - - def public_project - @public_project ||= create :project, :public - end - - def forked_project - @forked_project ||= Projects::ForkService.new(public_project, current_user).execute - end -end diff --git a/features/steps/dashboard/new_project.rb b/features/steps/dashboard/new_project.rb deleted file mode 100644 index 5e588ceb780..00000000000 --- a/features/steps/dashboard/new_project.rb +++ /dev/null @@ -1,27 +0,0 @@ -class Spinach::Features::NewProject < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I click "New project" link' do - click_link "New project" - end - - step 'I see "New project" page' do - page.should have_content("Project path") - end - - step 'I click on "Import project from GitHub"' do - first('.how_to_import_link').click - end - - step 'I see instructions on how to import from GitHub' do - github_modal = first('.modal-body') - github_modal.should be_visible - github_modal.should have_content "To enable importing projects from GitHub" - - all('.modal-body').each do |element| - element.should_not be_visible unless element == github_modal - end - end -end diff --git a/features/steps/dashboard/shortcuts.rb b/features/steps/dashboard/shortcuts.rb deleted file mode 100644 index a9083850b52..00000000000 --- a/features/steps/dashboard/shortcuts.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Spinach::Features::DashboardShortcuts < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - include SharedActiveTab -end diff --git a/features/steps/dashboard/starred_projects.rb b/features/steps/dashboard/starred_projects.rb deleted file mode 100644 index b9ad2f13e29..00000000000 --- a/features/steps/dashboard/starred_projects.rb +++ /dev/null @@ -1,15 +0,0 @@ -class Spinach::Features::DashboardStarredProjects < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I starred project "Community"' do - current_user.toggle_star(Project.find_by(name: 'Community')) - end - - step 'I should not see project "Shop"' do - within 'aside' do - page.should_not have_content('Shop') - end - end -end diff --git a/features/steps/explore/groups.rb b/features/steps/explore/groups.rb deleted file mode 100644 index 0c2127d4c4b..00000000000 --- a/features/steps/explore/groups.rb +++ /dev/null @@ -1,92 +0,0 @@ -class Spinach::Features::ExploreGroups < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedGroup - include SharedProject - - step 'group "TestGroup" has private project "Enterprise"' do - group_has_project("TestGroup", "Enterprise", Gitlab::VisibilityLevel::PRIVATE) - end - - step 'group "TestGroup" has internal project "Internal"' do - group_has_project("TestGroup", "Internal", Gitlab::VisibilityLevel::INTERNAL) - end - - step 'group "TestGroup" has public project "Community"' do - group_has_project("TestGroup", "Community", Gitlab::VisibilityLevel::PUBLIC) - end - - step '"John Doe" is owner of group "TestGroup"' do - group = Group.find_by(name: "TestGroup") || create(:group, name: "TestGroup") - user = create(:user, name: "John Doe") - group.add_user(user, Gitlab::Access::OWNER) - end - - step 'I visit group "TestGroup" page' do - visit group_path(Group.find_by(name: "TestGroup")) - end - - step 'I visit group "TestGroup" issues page' do - visit issues_group_path(Group.find_by(name: "TestGroup")) - end - - step 'I visit group "TestGroup" merge requests page' do - visit merge_requests_group_path(Group.find_by(name: "TestGroup")) - end - - step 'I visit group "TestGroup" members page' do - visit group_group_members_path(Group.find_by(name: "TestGroup")) - end - - step 'I should not see project "Enterprise" items' do - page.should_not have_content "Enterprise" - end - - step 'I should see project "Internal" items' do - page.should have_content "Internal" - end - - step 'I should not see project "Internal" items' do - page.should_not have_content "Internal" - end - - step 'I should see project "Community" items' do - page.should have_content "Community" - end - - step 'I change filter to Everyone\'s' do - click_link "Everyone's" - end - - step 'I should see group member "John Doe"' do - page.should have_content "John Doe" - end - - step 'I should not see member roles' do - body.should_not match(%r{owner|developer|reporter|guest}i) - end - - protected - - def group_has_project(groupname, projectname, visibility_level) - group = Group.find_by(name: groupname) || create(:group, name: groupname) - project = create(:project, - namespace: group, - name: projectname, - path: "#{groupname}-#{projectname}", - visibility_level: visibility_level - ) - create(:issue, - title: "#{projectname} feature", - project: project - ) - create(:merge_request, - title: "#{projectname} feature implemented", - source_project: project, - target_project: project - ) - create(:closed_issue_event, - project: project - ) - end -end diff --git a/features/steps/explore/projects.rb b/features/steps/explore/projects.rb deleted file mode 100644 index 26b71406bd8..00000000000 --- a/features/steps/explore/projects.rb +++ /dev/null @@ -1,148 +0,0 @@ -class Spinach::Features::ExploreProjects < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I should see project "Empty Public Project"' do - page.should have_content "Empty Public Project" - end - - step 'I should see public project details' do - page.should have_content '32 branches' - page.should have_content '16 tags' - end - - step 'I should see project readme' do - page.should have_content 'README.md' - end - - step 'I should see empty public project details' do - page.should have_content 'Git global setup' - end - - step 'I should see empty public project details with http clone info' do - project = Project.find_by(name: 'Empty Public Project') - all(:css, '.git-empty .clone').each do |element| - element.text.should include(project.http_url_to_repo) - end - end - - step 'I should see empty public project details with ssh clone info' do - project = Project.find_by(name: 'Empty Public Project') - all(:css, '.git-empty .clone').each do |element| - element.text.should include(project.url_to_repo) - end - end - - step 'I should see project "Community" home page' do - within '.navbar-gitlab .title' do - page.should have_content 'Community' - end - end - - step 'I should see project "Internal" home page' do - within '.navbar-gitlab .title' do - page.should have_content 'Internal' - end - end - - step 'I should see an http link to the repository' do - project = Project.find_by(name: 'Community') - page.should have_field('project_clone', with: project.http_url_to_repo) - end - - step 'I should see an ssh link to the repository' do - project = Project.find_by(name: 'Community') - page.should have_field('project_clone', with: project.url_to_repo) - end - - step 'I visit "Community" issues page' do - create(:issue, - title: "Bug", - project: public_project - ) - create(:issue, - title: "New feature", - project: public_project - ) - visit namespace_project_issues_path(public_project.namespace, public_project) - end - - - step 'I should see list of issues for "Community" project' do - page.should have_content "Bug" - page.should have_content public_project.name - page.should have_content "New feature" - end - - step 'I visit "Internal" issues page' do - create(:issue, - title: "Internal Bug", - project: internal_project - ) - create(:issue, - title: "New internal feature", - project: internal_project - ) - visit namespace_project_issues_path(internal_project.namespace, internal_project) - end - - - step 'I should see list of issues for "Internal" project' do - page.should have_content "Internal Bug" - page.should have_content internal_project.name - page.should have_content "New internal feature" - end - - step 'I visit "Community" merge requests page' do - visit namespace_project_merge_requests_path(public_project.namespace, public_project) - end - - step 'project "Community" has "Bug fix" open merge request' do - create(:merge_request, - title: "Bug fix for public project", - source_project: public_project, - target_project: public_project, - ) - end - - step 'I should see list of merge requests for "Community" project' do - page.should have_content public_project.name - page.should have_content public_merge_request.source_project.name - end - - step 'I visit "Internal" merge requests page' do - visit namespace_project_merge_requests_path(internal_project.namespace, internal_project) - end - - step 'project "Internal" has "Feature implemented" open merge request' do - create(:merge_request, - title: "Feature implemented", - source_project: internal_project, - target_project: internal_project - ) - end - - step 'I should see list of merge requests for "Internal" project' do - page.should have_content internal_project.name - page.should have_content internal_merge_request.source_project.name - end - - def internal_project - @internal_project ||= Project.find_by!(name: 'Internal') - end - - def public_project - @public_project ||= Project.find_by!(name: 'Community') - end - - - def internal_merge_request - @internal_merge_request ||= MergeRequest.find_by!(title: 'Feature implemented') - end - - def public_merge_request - @public_merge_request ||= MergeRequest.find_by!(title: 'Bug fix for public project') - end -end - diff --git a/features/steps/groups.rb b/features/steps/groups.rb deleted file mode 100644 index 228b83e5fd0..00000000000 --- a/features/steps/groups.rb +++ /dev/null @@ -1,300 +0,0 @@ -class Spinach::Features::Groups < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedGroup - include SharedUser - include Select2Helper - - step 'gitlab user "Mike"' do - create(:user, name: "Mike") - end - - step 'I click link "Add members"' do - find(:css, 'button.btn-new').click - end - - step 'I select "Mike" as "Reporter"' do - user = User.find_by(name: "Mike") - - within ".users-group-form" do - select2(user.id, from: "#user_ids", multiple: true) - select "Reporter", from: "access_level" - end - - click_button "Add users to group" - end - - step 'I should see "Mike" in team list as "Reporter"' do - within '.well-list' do - page.should have_content('Mike') - page.should have_content('Reporter') - end - end - - step 'I select "sjobs@apple.com" as "Reporter"' do - within ".users-group-form" do - select2("sjobs@apple.com", from: "#user_ids", multiple: true) - select "Reporter", from: "access_level" - end - - click_button "Add users to group" - end - - step 'I should see "sjobs@apple.com" in team list as invited "Reporter"' do - within '.well-list' do - page.should have_content('sjobs@apple.com') - page.should have_content('invited') - page.should have_content('Reporter') - end - end - - step 'I should see group "Owned" projects list' do - Group.find_by(name: "Owned").projects.each do |project| - page.should have_link project.name - end - end - - step 'I should see projects activity feed' do - page.should have_content 'closed issue' - end - - step 'I should see issues from group "Owned" assigned to me' do - assigned_to_me(:issues).each do |issue| - page.should have_content issue.title - end - end - - step 'I should see merge requests from group "Owned" assigned to me' do - assigned_to_me(:merge_requests).each do |issue| - page.should have_content issue.title[0..80] - end - end - - step 'I select user "Mary Jane" from list with role "Reporter"' do - user = User.find_by(name: "Mary Jane") || create(:user, name: "Mary Jane") - click_button 'Add members' - within ".users-group-form" do - select2(user.id, from: "#user_ids", multiple: true) - select "Reporter", from: "access_level" - end - click_button "Add users to group" - end - - step 'I should see user "John Doe" in team list' do - projects_with_access = find(".panel .well-list") - projects_with_access.should have_content("John Doe") - end - - step 'I should not see user "John Doe" in team list' do - projects_with_access = find(".panel .well-list") - projects_with_access.should_not have_content("John Doe") - end - - step 'I should see user "Mary Jane" in team list' do - projects_with_access = find(".panel .well-list") - projects_with_access.should have_content("Mary Jane") - end - - step 'I should not see user "Mary Jane" in team list' do - projects_with_access = find(".panel .well-list") - projects_with_access.should_not have_content("Mary Jane") - end - - step 'project from group "Owned" has issues assigned to me' do - create :issue, - project: project, - assignee: current_user, - author: current_user - end - - step 'project from group "Owned" has merge requests assigned to me' do - create :merge_request, - source_project: project, - target_project: project, - assignee: current_user, - author: current_user - end - - step 'I change group "Owned" name to "new-name"' do - fill_in 'group_name', with: 'new-name' - fill_in 'group_path', with: 'new-name' - click_button "Save group" - end - - step 'I should see new group "Owned" name' do - within ".navbar-gitlab" do - page.should have_content "new-name" - end - end - - step 'I change group "Owned" avatar' do - attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) - click_button "Save group" - Group.find_by(name: "Owned").reload - end - - step 'I should see new group "Owned" avatar' do - Group.find_by(name: "Owned").avatar.should be_instance_of AvatarUploader - Group.find_by(name: "Owned").avatar.url.should == "/uploads/group/avatar/#{ Group.find_by(name:"Owned").id }/gitlab_logo.png" - end - - step 'I should see the "Remove avatar" button' do - page.should have_link("Remove avatar") - end - - step 'I have group "Owned" avatar' do - attach_file(:group_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) - click_button "Save group" - Group.find_by(name: "Owned").reload - end - - step 'I remove group "Owned" avatar' do - click_link "Remove avatar" - Group.find_by(name: "Owned").reload - end - - step 'I should not see group "Owned" avatar' do - Group.find_by(name: "Owned").avatar?.should be_false - end - - step 'I should not see the "Remove avatar" button' do - page.should_not have_link("Remove avatar") - end - - step 'I click on the "Remove User From Group" button for "John Doe"' do - find(:css, 'li', text: "John Doe").find(:css, 'a.btn-remove').click - # poltergeist always confirms popups. - end - - step 'I click on the "Remove User From Group" button for "Mary Jane"' do - find(:css, 'li', text: "Mary Jane").find(:css, 'a.btn-remove').click - # poltergeist always confirms popups. - end - - step 'I should not see the "Remove User From Group" button for "John Doe"' do - find(:css, 'li', text: "John Doe").should_not have_selector(:css, 'a.btn-remove') - # poltergeist always confirms popups. - end - - step 'I should not see the "Remove User From Group" button for "Mary Jane"' do - find(:css, 'li', text: "Mary Jane").should_not have_selector(:css, 'a.btn-remove') - # poltergeist always confirms popups. - end - - step 'I search for \'Mary\' member' do - within '.member-search-form' do - fill_in 'search', with: 'Mary' - click_button 'Search' - end - end - - step 'I click on group milestones' do - click_link 'Milestones' - end - - step 'I should see group milestones index page has no milestones' do - page.should have_content('No milestones to show') - end - - step 'Group has projects with milestones' do - group_milestone - end - - step 'I should see group milestones index page with milestones' do - page.should have_content('Version 7.2') - page.should have_content('GL-113') - page.should have_link('2 Issues', href: group_milestone_path("owned", "version-7-2", title: "Version 7.2")) - page.should have_link('3 Merge Requests', href: group_milestone_path("owned", "gl-113", title: "GL-113")) - end - - step 'I click on one group milestone' do - click_link 'GL-113' - end - - step 'I should see group milestone with descriptions and expiry date' do - page.should have_content('expires at Aug 20, 2114') - end - - step 'I should see group milestone with all issues and MRs assigned to that milestone' do - page.should have_content('Milestone GL-113') - page.should have_content('Progress: 0 closed – 4 open') - page.should have_link(@issue1.title, href: namespace_project_issue_path(@project1.namespace, @project1, @issue1)) - page.should have_link(@mr3.title, href: namespace_project_merge_request_path(@project3.namespace, @project3, @mr3)) - end - - protected - - def assigned_to_me(key) - project.send(key).where(assignee_id: current_user.id) - end - - def project - Group.find_by(name: "Owned").projects.first - end - - def group_milestone - group = Group.find_by(name: "Owned") - - @project1 = create :project, - group: group - project2 = create :project, - path: 'gitlab-ci', - group: group - @project3 = create :project, - path: 'cookbook-gitlab', - group: group - milestone1_project1 = create :milestone, - title: "Version 7.2", - project: @project1 - milestone1_project2 = create :milestone, - title: "Version 7.2", - project: project2 - milestone1_project3 = create :milestone, - title: "Version 7.2", - project: @project3 - milestone2_project1 = create :milestone, - title: "GL-113", - project: @project1 - milestone2_project2 = create :milestone, - title: "GL-113", - project: project2 - milestone2_project3 = create :milestone, - title: "GL-113", - project: @project3, - due_date: '2114-08-20', - description: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry' - @issue1 = create :issue, - project: @project1, - assignee: current_user, - author: current_user, - milestone: milestone2_project1 - issue2 = create :issue, - project: project2, - assignee: current_user, - author: current_user, - milestone: milestone1_project2 - issue3 = create :issue, - project: @project3, - assignee: current_user, - author: current_user, - milestone: milestone1_project1 - mr1 = create :merge_request, - source_project: @project1, - target_project: @project1, - assignee: current_user, - author: current_user, - milestone: milestone2_project1 - mr2 = create :merge_request, - source_project: project2, - target_project: project2, - assignee: current_user, - author: current_user, - milestone: milestone2_project2 - @mr3 = create :merge_request, - source_project: @project3, - target_project: @project3, - assignee: current_user, - author: current_user, - milestone: milestone2_project3 - end -end diff --git a/features/steps/invites.rb b/features/steps/invites.rb deleted file mode 100644 index d051cc3edc8..00000000000 --- a/features/steps/invites.rb +++ /dev/null @@ -1,80 +0,0 @@ -class Spinach::Features::Invites < Spinach::FeatureSteps - include SharedAuthentication - include SharedUser - include SharedGroup - - step '"John Doe" has invited "user@example.com" to group "Owned"' do - user = User.find_by(name: "John Doe") - group = Group.find_by(name: "Owned") - group.add_user("user@example.com", Gitlab::Access::DEVELOPER, user) - end - - step 'I visit the invitation page' do - group = Group.find_by(name: "Owned") - invite = group.group_members.invite.last - invite.generate_invite_token! - @raw_invite_token = invite.raw_invite_token - visit invite_path(@raw_invite_token) - end - - step 'I should be redirected to the sign in page' do - expect(current_path).to eq(new_user_session_path) - end - - step 'I should see a notice telling me to sign in' do - expect(page).to have_content "To accept this invitation, sign in" - end - - step 'I should be redirected to the invitation page' do - expect(current_path).to eq(invite_path(@raw_invite_token)) - end - - step 'I should see the invitation details' do - expect(page).to have_content("You have been invited by John Doe to join group Owned as Developer.") - end - - step "I should see a message telling me I'm already a member" do - expect(page).to have_content("However, you are already a member of this group.") - end - - step 'I should see an "Accept invitation" button' do - expect(page).to have_link("Accept invitation") - end - - step 'I should see a "Decline" button' do - expect(page).to have_link("Decline") - end - - step 'I click the "Accept invitation" button' do - page.click_link "Accept invitation" - end - - step 'I should be redirected to the group page' do - group = Group.find_by(name: "Owned") - expect(current_path).to eq(group_path(group)) - end - - step 'I should see a notice telling me I have access' do - expect(page).to have_content("You have been granted Developer access to group Owned.") - end - - step 'I click the "Decline" button' do - page.click_link "Decline" - end - - step 'I should be redirected to the dashboard' do - expect(current_path).to eq(dashboard_path) - end - - step 'I should see a notice telling me I have declined' do - expect(page).to have_content("You have declined the invitation to join group Owned.") - end - - step "I visit the invitation's decline page" do - group = Group.find_by(name: "Owned") - invite = group.group_members.invite.last - invite.generate_invite_token! - @raw_invite_token = invite.raw_invite_token - visit decline_invite_path(@raw_invite_token) - end -end diff --git a/features/steps/profile/active_tab.rb b/features/steps/profile/active_tab.rb deleted file mode 100644 index 8595ee876a4..00000000000 --- a/features/steps/profile/active_tab.rb +++ /dev/null @@ -1,25 +0,0 @@ -class Spinach::Features::ProfileActiveTab < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedActiveTab - - step 'the active main tab should be Home' do - ensure_active_main_tab('Profile') - end - - step 'the active main tab should be Account' do - ensure_active_main_tab('Account') - end - - step 'the active main tab should be SSH Keys' do - ensure_active_main_tab('SSH Keys') - end - - step 'the active main tab should be Design' do - ensure_active_main_tab('Design') - end - - step 'the active main tab should be History' do - ensure_active_main_tab('History') - end -end diff --git a/features/steps/profile/emails.rb b/features/steps/profile/emails.rb deleted file mode 100644 index 2b6ac37d866..00000000000 --- a/features/steps/profile/emails.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Spinach::Features::ProfileEmails < Spinach::FeatureSteps - include SharedAuthentication - - step 'I visit profile emails page' do - visit profile_emails_path - end - - step 'I should see my emails' do - page.should have_content(@user.email) - @user.emails.each do |email| - page.should have_content(email.email) - end - end - - step 'I submit new email "my@email.com"' do - fill_in "email_email", with: "my@email.com" - click_button "Add" - end - - step 'I should see new email "my@email.com"' do - email = @user.emails.find_by(email: "my@email.com") - email.should_not be_nil - page.should have_content("my@email.com") - end - - step 'I should not see email "my@email.com"' do - email = @user.emails.find_by(email: "my@email.com") - email.should be_nil - page.should_not have_content("my@email.com") - end - - step 'I click link "Remove" for "my@email.com"' do - # there should only be one remove button at this time - click_link "Remove" - # force these to reload as they have been cached - @user.emails.reload - end - - step 'I submit duplicate email @user.email' do - fill_in "email_email", with: @user.email - click_button "Add" - end - - step 'I should not have @user.email added' do - email = @user.emails.find_by(email: @user.email) - email.should be_nil - end -end diff --git a/features/steps/profile/notifications.rb b/features/steps/profile/notifications.rb deleted file mode 100644 index 13e93618eb7..00000000000 --- a/features/steps/profile/notifications.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Spinach::Features::ProfileNotifications < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - - step 'I visit profile notifications page' do - visit profile_notifications_path - end - - step 'I should see global notifications settings' do - page.should have_content "Notifications Settings" - end -end diff --git a/features/steps/profile/profile.rb b/features/steps/profile/profile.rb deleted file mode 100644 index 791982d16c3..00000000000 --- a/features/steps/profile/profile.rb +++ /dev/null @@ -1,242 +0,0 @@ -class Spinach::Features::Profile < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - - step 'I should see my profile info' do - page.should have_content "Profile Settings" - end - - step 'I change my profile info' do - fill_in "user_skype", with: "testskype" - fill_in "user_linkedin", with: "testlinkedin" - fill_in "user_twitter", with: "testtwitter" - fill_in "user_website_url", with: "testurl" - fill_in "user_location", with: "Ukraine" - click_button "Save changes" - @user.reload - end - - step 'I should see new profile info' do - @user.skype.should == 'testskype' - @user.linkedin.should == 'testlinkedin' - @user.twitter.should == 'testtwitter' - @user.website_url.should == 'testurl' - find("#user_location").value.should == "Ukraine" - end - - step 'I change my avatar' do - attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) - click_button "Save changes" - @user.reload - end - - step 'I should see new avatar' do - @user.avatar.should be_instance_of AvatarUploader - @user.avatar.url.should == "/uploads/user/avatar/#{ @user.id }/gitlab_logo.png" - end - - step 'I should see the "Remove avatar" button' do - page.should have_link("Remove avatar") - end - - step 'I have an avatar' do - attach_file(:user_avatar, File.join(Rails.root, 'public', 'gitlab_logo.png')) - click_button "Save changes" - @user.reload - end - - step 'I remove my avatar' do - click_link "Remove avatar" - @user.reload - end - - step 'I should see my gravatar' do - @user.avatar?.should be_false - end - - step 'I should not see the "Remove avatar" button' do - page.should_not have_link("Remove avatar") - end - - step 'I try change my password w/o old one' do - within '.update-password' do - fill_in "user_password", with: "22233344" - fill_in "user_password_confirmation", with: "22233344" - click_button "Save" - end - end - - step 'I change my password' do - within '.update-password' do - fill_in "user_current_password", with: "12345678" - fill_in "user_password", with: "22233344" - fill_in "user_password_confirmation", with: "22233344" - click_button "Save" - end - end - - step 'I unsuccessfully change my password' do - within '.update-password' do - fill_in "user_current_password", with: "12345678" - fill_in "user_password", with: "password" - fill_in "user_password_confirmation", with: "confirmation" - click_button "Save" - end - end - - step "I should see a missing password error message" do - page.should have_content "You must provide a valid current password" - end - - step "I should see a password error message" do - page.should have_content "Password confirmation doesn't match" - end - - step 'I reset my token' do - within '.update-token' do - @old_token = @user.private_token - click_button "Reset" - end - end - - step 'I should see new token' do - find("#token").value.should_not == @old_token - find("#token").value.should == @user.reload.private_token - end - - step 'I have activity' do - create(:closed_issue_event, author: current_user) - end - - step 'I should see my activity' do - page.should have_content "#{current_user.name} closed issue" - end - - step "I change my application theme" do - within '.application-theme' do - choose "Violet" - end - end - - step "I change my code preview theme" do - within '.code-preview-theme' do - choose "Solarized dark" - end - end - - step "I should see the theme change immediately" do - page.should have_selector('body.ui_color') - page.should_not have_selector('body.ui_basic') - end - - step "I should receive feedback that the changes were saved" do - page.should have_content("saved") - end - - step 'my password is expired' do - current_user.update_attributes(password_expires_at: Time.now - 1.hour) - end - - step "I am not an ldap user" do - current_user.identities.delete - current_user.ldap_user?.should be_false - end - - step 'I redirected to expired password page' do - current_path.should == new_profile_password_path - end - - step 'I submit new password' do - fill_in :user_current_password, with: '12345678' - fill_in :user_password, with: '12345678' - fill_in :user_password_confirmation, with: '12345678' - click_button "Set new password" - end - - step 'I redirected to sign in page' do - current_path.should == new_user_session_path - end - - step 'I should be redirected to password page' do - current_path.should == edit_profile_password_path - end - - step 'I should be redirected to account page' do - current_path.should == profile_account_path - end - - step 'I click on my profile picture' do - click_link 'profile-pic' - end - - step 'I should see my user page' do - page.should have_content "User Activity" - - within '.navbar-gitlab' do - page.should have_content current_user.name - end - end - - step 'I have group with projects' do - @group = create(:group) - @group.add_owner(current_user) - @project = create(:project, namespace: @group) - @event = create(:closed_issue_event, project: @project) - - @project.team << [current_user, :master] - end - - step 'I should see groups I belong to' do - page.should have_css('.profile-groups-avatars', visible: true) - end - - step 'I click on new application button' do - click_on 'New Application' - end - - step 'I should see application form' do - page.should have_content "New application" - end - - step 'I fill application form out and submit' do - fill_in :doorkeeper_application_name, with: 'test' - fill_in :doorkeeper_application_redirect_uri, with: 'https://test.com' - click_on "Submit" - end - - step 'I see application' do - page.should have_content "Application: test" - page.should have_content "Application Id" - page.should have_content "Secret" - end - - step 'I click edit' do - click_on "Edit" - end - - step 'I see edit application form' do - page.should have_content "Edit application" - end - - step 'I change name of application and submit' do - page.should have_content "Edit application" - fill_in :doorkeeper_application_name, with: 'test_changed' - click_on "Submit" - end - - step 'I see that application was changed' do - page.should have_content "test_changed" - page.should have_content "Application Id" - page.should have_content "Secret" - end - - step 'I click to remove application' do - within '.oauth-applications' do - click_on "Destroy" - end - end - - step "I see that application is removed" do - page.find(".oauth-applications").should_not have_content "test_changed" - end -end diff --git a/features/steps/profile/ssh_keys.rb b/features/steps/profile/ssh_keys.rb deleted file mode 100644 index ea912e5b4da..00000000000 --- a/features/steps/profile/ssh_keys.rb +++ /dev/null @@ -1,46 +0,0 @@ -class Spinach::Features::ProfileSshKeys < Spinach::FeatureSteps - include SharedAuthentication - - step 'I should see my ssh keys' do - @user.keys.each do |key| - page.should have_content(key.title) - end - end - - step 'I click link "Add new"' do - click_link "Add SSH Key" - end - - step 'I submit new ssh key "Laptop"' do - fill_in "key_title", with: "Laptop" - fill_in "key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop" - click_button "Add key" - end - - step 'I should see new ssh key "Laptop"' do - key = Key.find_by(title: "Laptop") - page.should have_content(key.title) - page.should have_content(key.key) - current_path.should == profile_key_path(key) - end - - step 'I click link "Work"' do - click_link "Work" - end - - step 'I click link "Remove"' do - click_link "Remove" - end - - step 'I visit profile keys page' do - visit profile_keys_path - end - - step 'I should not see "Work" ssh key' do - page.should_not have_content "Work" - end - - step 'I have ssh key "ssh-rsa Work"' do - create(:key, user: @user, title: "ssh-rsa Work", key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+L3TbFegm3k8QjejSwemk4HhlRh+DuN679Pc5ckqE/MPhVtE/+kZQDYCTB284GiT2aIoGzmZ8ee9TkaoejAsBwlA+Wz2Q3vhz65X6sMgalRwpdJx8kSEUYV8ZPV3MZvPo8KdNg993o4jL6G36GDW4BPIyO6FPZhfsawdf6liVD0Xo5kibIK7B9VoE178cdLQtLpS2YolRwf5yy6XR6hbbBGQR+6xrGOdP16eGZDb1CE2bMvvJijjloFqPscGktWOqW+nfh5txwFfBzlfARDTBsS8WZtg3Yoj1kn33kPsWRlgHfNutFRAIynDuDdQzQq8tTtVwm+Yi75RfcPHW8y3P Work") - end -end diff --git a/features/steps/project/active_tab.rb b/features/steps/project/active_tab.rb deleted file mode 100644 index dd3215adb1a..00000000000 --- a/features/steps/project/active_tab.rb +++ /dev/null @@ -1,103 +0,0 @@ -class Spinach::Features::ProjectActiveTab < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - include SharedActiveTab - include SharedProjectTab - - # Sub Tabs: Home - - step 'I click the "Team" tab' do - click_link('Members') - end - - step 'I click the "Attachments" tab' do - click_link('Attachments') - end - - step 'I click the "Snippets" tab' do - click_link('Snippets') - end - - step 'I click the "Edit" tab' do - within '.project-settings-nav' do - click_link('Project') - end - end - - step 'I click the "Hooks" tab' do - click_link('Web Hooks') - end - - step 'I click the "Deploy Keys" tab' do - click_link('Deploy Keys') - end - - step 'the active sub nav should be Team' do - ensure_active_sub_nav('Members') - end - - step 'the active sub nav should be Edit' do - ensure_active_sub_nav('Project') - end - - step 'the active sub nav should be Hooks' do - ensure_active_sub_nav('Web Hooks') - end - - step 'the active sub nav should be Deploy Keys' do - ensure_active_sub_nav('Deploy Keys') - end - - # Sub Tabs: Commits - - step 'I click the "Compare" tab' do - click_link('Compare') - end - - step 'I click the "Branches" tab' do - click_link('Branches') - end - - step 'I click the "Tags" tab' do - click_link('Tags') - end - - step 'the active sub tab should be Commits' do - ensure_active_sub_tab('Commits') - end - - step 'the active sub tab should be Compare' do - ensure_active_sub_tab('Compare') - end - - step 'the active sub tab should be Branches' do - ensure_active_sub_tab('Branches') - end - - step 'the active sub tab should be Tags' do - ensure_active_sub_tab('Tags') - end - - # Sub Tabs: Issues - - step 'I click the "Milestones" tab' do - click_link('Milestones') - end - - step 'I click the "Labels" tab' do - click_link('Labels') - end - - step 'the active sub tab should be Issues' do - ensure_active_sub_tab('Issues') - end - - step 'the active main tab should be Milestones' do - ensure_active_main_tab('Milestones') - end - - step 'the active main tab should be Labels' do - ensure_active_main_tab('Labels') - end -end diff --git a/features/steps/project/archived.rb b/features/steps/project/archived.rb deleted file mode 100644 index 37ad0c77655..00000000000 --- a/features/steps/project/archived.rb +++ /dev/null @@ -1,37 +0,0 @@ -class Spinach::Features::ProjectArchived < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - When 'project "Forum" is archived' do - project = Project.find_by(name: "Forum") - project.update_attribute(:archived, true) - end - - When 'project "Shop" is archived' do - project = Project.find_by(name: "Shop") - project.update_attribute(:archived, true) - end - - When 'I visit project "Forum" page' do - project = Project.find_by(name: "Forum") - visit namespace_project_path(project.namespace, project) - end - - step 'I should not see "Archived"' do - page.should_not have_content "Archived" - end - - step 'I should see "Archived"' do - page.should have_content "Archived" - end - - When 'I set project archived' do - click_link "Archive" - end - - When 'I set project unarchived' do - click_link "Unarchive" - end - -end diff --git a/features/steps/project/commits/branches.rb b/features/steps/project/commits/branches.rb deleted file mode 100644 index 07f7e5796a3..00000000000 --- a/features/steps/project/commits/branches.rb +++ /dev/null @@ -1,85 +0,0 @@ -class Spinach::Features::ProjectCommitsBranches < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I click link "All"' do - click_link "All" - end - - step 'I should see "Shop" all branches list' do - page.should have_content "Branches" - page.should have_content "master" - end - - step 'I click link "Protected"' do - click_link "Protected" - end - - step 'I should see "Shop" protected branches list' do - within ".protected-branches-list" do - page.should have_content "stable" - page.should_not have_content "master" - end - end - - step 'project "Shop" has protected branches' do - project = Project.find_by(name: "Shop") - project.protected_branches.create(name: "stable") - end - - step 'I click new branch link' do - click_link "New branch" - end - - step 'I submit new branch form' do - fill_in 'branch_name', with: 'deploy_keys' - fill_in 'ref', with: 'master' - click_button 'Create branch' - end - - step 'I submit new branch form with invalid name' do - fill_in 'branch_name', with: '1.0 stable' - fill_in 'ref', with: 'master' - click_button 'Create branch' - end - - step 'I submit new branch form with invalid reference' do - fill_in 'branch_name', with: 'foo' - fill_in 'ref', with: 'foo' - click_button 'Create branch' - end - - step 'I submit new branch form with branch that already exists' do - fill_in 'branch_name', with: 'master' - fill_in 'ref', with: 'master' - click_button 'Create branch' - end - - step 'I should see new branch created' do - page.should have_content 'deploy_keys' - end - - step 'I should see new an error that branch is invalid' do - page.should have_content 'Branch name invalid' - end - - step 'I should see new an error that ref is invalid' do - page.should have_content 'Invalid reference name' - end - - step 'I should see new an error that branch already exists' do - page.should have_content 'Branch already exists' - end - - step "I click branch 'improve/awesome' delete link" do - within '.js-branch-improve\/awesome' do - find('.btn-remove').click - sleep 0.05 - end - end - - step "I should not see branch 'improve/awesome'" do - all(visible: true).should_not have_content 'improve/awesome' - end -end diff --git a/features/steps/project/commits/comments.rb b/features/steps/project/commits/comments.rb deleted file mode 100644 index 3d4d8ad6368..00000000000 --- a/features/steps/project/commits/comments.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Spinach::Features::ProjectCommitsComments < Spinach::FeatureSteps - include SharedAuthentication - include SharedNote - include SharedPaths - include SharedProject -end diff --git a/features/steps/project/commits/commits.rb b/features/steps/project/commits/commits.rb deleted file mode 100644 index 57b727f837e..00000000000 --- a/features/steps/project/commits/commits.rb +++ /dev/null @@ -1,103 +0,0 @@ -class Spinach::Features::ProjectCommits < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include RepoHelpers - - step 'I see project commits' do - commit = @project.repository.commit - page.should have_content(@project.name) - page.should have_content(commit.message[0..20]) - page.should have_content(commit.short_id) - end - - step 'I click atom feed link' do - click_link "Feed" - end - - step 'I see commits atom feed' do - commit = @project.repository.commit - response_headers['Content-Type'].should have_content("application/atom+xml") - body.should have_selector("title", text: "Recent commits to #{@project.name}") - body.should have_selector("author email", text: commit.author_email) - body.should have_selector("entry summary", text: commit.description[0..10]) - end - - step 'I click on commit link' do - visit namespace_project_commit_path(@project.namespace, @project, sample_commit.id) - end - - step 'I see commit info' do - page.should have_content sample_commit.message - page.should have_content "Showing #{sample_commit.files_changed_count} changed files" - end - - step 'I fill compare fields with refs' do - fill_in "from", with: sample_commit.parent_id - fill_in "to", with: sample_commit.id - click_button "Compare" - end - - step 'I unfold diff' do - @diff = first('.js-unfold') - @diff.click - sleep 2 - end - - step 'I should see additional file lines' do - within @diff.parent do - first('.new_line').text.should_not have_content "..." - end - end - - step 'I see compared refs' do - page.should have_content "Compare View" - page.should have_content "Commits (1)" - page.should have_content "Showing 2 changed files" - end - - step 'I see breadcrumb links' do - page.should have_selector('ul.breadcrumb') - page.should have_selector('ul.breadcrumb a', count: 4) - end - - step 'I see commits stats' do - page.should have_content 'Top 50 Committers' - page.should have_content 'Committers' - page.should have_content 'Total commits' - page.should have_content 'Authors' - end - - step 'I visit big commit page' do - Commit::DIFF_SAFE_FILES = 20 - visit namespace_project_commit_path(@project.namespace, @project, sample_big_commit.id) - end - - step 'I see big commit warning' do - page.should have_content sample_big_commit.message - page.should have_content "Too many changes" - Commit::DIFF_SAFE_FILES = 100 - end - - step 'I visit a commit with an image that changed' do - visit namespace_project_commit_path(@project.namespace, @project, sample_image_commit.id) - end - - step 'The diff links to both the previous and current image' do - links = all('.two-up span div a') - links[0]['href'].should =~ %r{blob/#{sample_image_commit.old_blob_id}} - links[1]['href'].should =~ %r{blob/#{sample_image_commit.new_blob_id}} - end - - step 'I click side-by-side diff button' do - click_link "Side-by-side" - end - - step 'I see side-by-side diff button' do - page.should have_content "Side-by-side" - end - - step 'I see inline diff button' do - page.should have_content "Inline" - end -end diff --git a/features/steps/project/commits/diff_comments.rb b/features/steps/project/commits/diff_comments.rb deleted file mode 100644 index b9d8cf2c5a5..00000000000 --- a/features/steps/project/commits/diff_comments.rb +++ /dev/null @@ -1,6 +0,0 @@ -class Spinach::Features::ProjectCommitsDiffComments < Spinach::FeatureSteps - include SharedAuthentication - include SharedDiffNote - include SharedPaths - include SharedProject -end diff --git a/features/steps/project/commits/tags.rb b/features/steps/project/commits/tags.rb deleted file mode 100644 index 3465fcbfd07..00000000000 --- a/features/steps/project/commits/tags.rb +++ /dev/null @@ -1,82 +0,0 @@ -class Spinach::Features::ProjectCommitsTags < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I should see "Shop" all tags list' do - page.should have_content "Tags" - page.should have_content "v1.0.0" - end - - step 'I click new tag link' do - click_link 'New tag' - end - - step 'I submit new tag form' do - fill_in 'tag_name', with: 'v7.0' - fill_in 'ref', with: 'master' - click_button 'Create tag' - end - - step 'I submit new tag form with invalid name' do - fill_in 'tag_name', with: 'v 1.0' - fill_in 'ref', with: 'master' - click_button 'Create tag' - end - - step 'I submit new tag form with invalid reference' do - fill_in 'tag_name', with: 'foo' - fill_in 'ref', with: 'foo' - click_button 'Create tag' - end - - step 'I submit new tag form with tag that already exists' do - fill_in 'tag_name', with: 'v1.0.0' - fill_in 'ref', with: 'master' - click_button 'Create tag' - end - - step 'I should see new tag created' do - page.should have_content 'v7.0' - end - - step 'I should see new an error that tag is invalid' do - page.should have_content 'Tag name invalid' - end - - step 'I should see new an error that tag ref is invalid' do - page.should have_content 'Invalid reference name' - end - - step 'I should see new an error that tag already exists' do - page.should have_content 'Tag already exists' - end - - step "I delete tag 'v1.1.0'" do - within '.tags' do - first('.btn-remove').click - sleep 0.05 - end - end - - step "I should not see tag 'v1.1.0'" do - within '.tags' do - all(visible: true).should_not have_content 'v1.1.0' - end - end - - step 'I delete all tags' do - within '.tags' do - all('.btn-remove').each do |remove| - remove.click - sleep 0.05 - end - end - end - - step 'I should see tags info message' do - within '.tags' do - page.should have_content 'Repository has no tags yet.' - end - end -end diff --git a/features/steps/project/commits/user_lookup.rb b/features/steps/project/commits/user_lookup.rb deleted file mode 100644 index 63ff84c82ef..00000000000 --- a/features/steps/project/commits/user_lookup.rb +++ /dev/null @@ -1,48 +0,0 @@ -class Spinach::Features::ProjectCommitsUserLookup < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I click on commit link' do - visit namespace_project_commit_path(@project.namespace, @project, sample_commit.id) - end - - step 'I click on another commit link' do - visit namespace_project_commit_path(@project.namespace, @project, sample_commit.parent_id) - end - - step 'I have user with primary email' do - user_primary - end - - step 'I have user with secondary email' do - user_secondary - end - - step 'I see author based on primary email' do - check_author_link(sample_commit.author_email, user_primary) - end - - step 'I see author based on secondary email' do - check_author_link(sample_commit.author_email, user_secondary) - end - - def check_author_link(email, user) - author_link = find('.commit-author-link') - author_link['href'].should == user_path(user) - author_link['data-original-title'].should == email - find('.commit-author-name').text.should == user.name - end - - def user_primary - @user_primary ||= create(:user, email: 'dmitriy.zaporozhets@gmail.com') - end - - def user_secondary - @user_secondary ||= begin - user = create(:user, email: 'dzaporozhets@example.com') - create(:email, { user: user, email: 'dmitriy.zaporozhets@gmail.com' }) - user - end - end -end diff --git a/features/steps/project/create.rb b/features/steps/project/create.rb deleted file mode 100644 index 6b85cf74f5f..00000000000 --- a/features/steps/project/create.rb +++ /dev/null @@ -1,42 +0,0 @@ -class Spinach::Features::ProjectCreate < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - - step 'fill project form with valid data' do - fill_in 'project_path', with: 'Empty' - click_button "Create project" - end - - step 'I should see project page' do - page.should have_content "Empty" - current_path.should == namespace_project_path(Project.last.namespace, Project.last) - end - - step 'I should see empty project instuctions' do - page.should have_content "git init" - page.should have_content "git remote" - page.should have_content Project.last.url_to_repo - end - - step 'I see empty project instuctions' do - page.should have_content "git init" - page.should have_content "git remote" - page.should have_content Project.last.url_to_repo - end - - step 'I click on HTTP' do - click_button 'HTTP' - end - - step 'Remote url should update to http link' do - page.should have_content "git remote add origin #{Project.last.http_url_to_repo}" - end - - step 'If I click on SSH' do - click_button 'SSH' - end - - step 'Remote url should update to ssh link' do - page.should have_content "git remote add origin #{Project.last.url_to_repo}" - end -end diff --git a/features/steps/project/deploy_keys.rb b/features/steps/project/deploy_keys.rb deleted file mode 100644 index 50e14513a7a..00000000000 --- a/features/steps/project/deploy_keys.rb +++ /dev/null @@ -1,77 +0,0 @@ -class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'project has deploy key' do - create(:deploy_keys_project, project: @project) - end - - step 'I should see project deploy key' do - within '.enabled-keys' do - page.should have_content deploy_key.title - end - end - - step 'I should see other project deploy key' do - within '.available-keys' do - page.should have_content other_deploy_key.title - end - end - - step 'I should see public deploy key' do - within '.available-keys' do - page.should have_content public_deploy_key.title - end - end - - step 'I click \'New Deploy Key\'' do - click_link 'New Deploy Key' - end - - step 'I submit new deploy key' do - fill_in "deploy_key_title", with: "laptop" - fill_in "deploy_key_key", with: "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzrEJUIR6Y03TCE9rIJ+GqTBvgb8t1jI9h5UBzCLuK4VawOmkLornPqLDrGbm6tcwM/wBrrLvVOqi2HwmkKEIecVO0a64A4rIYScVsXIniHRS6w5twyn1MD3sIbN+socBDcaldECQa2u1dI3tnNVcs8wi77fiRe7RSxePsJceGoheRQgC8AZ510UdIlO+9rjIHUdVN7LLyz512auAfYsgx1OfablkQ/XJcdEwDNgi9imI6nAXhmoKUm1IPLT2yKajTIC64AjLOnE0YyCh6+7RFMpiMyu1qiOCpdjYwTgBRiciNRZCH8xIedyCoAmiUgkUT40XYHwLuwiPJICpkAzp7Q== user@laptop" - click_button "Create" - end - - step 'I should be on deploy keys page' do - current_path.should == namespace_project_deploy_keys_path(@project.namespace, @project) - end - - step 'I should see newly created deploy key' do - within '.enabled-keys' do - page.should have_content(deploy_key.title) - end - end - - step 'other project has deploy key' do - @second_project = create :project, namespace: create(:group) - @second_project.team << [current_user, :master] - create(:deploy_keys_project, project: @second_project) - end - - step 'public deploy key exists' do - create(:deploy_key, public: true) - end - - step 'I click attach deploy key' do - within '.available-keys' do - click_link 'Enable' - end - end - - protected - - def deploy_key - @project.deploy_keys.last - end - - def other_deploy_key - @second_project.deploy_keys.last - end - - def public_deploy_key - DeployKey.are_public.last - end -end diff --git a/features/steps/project/fork.rb b/features/steps/project/fork.rb deleted file mode 100644 index 8e58597db20..00000000000 --- a/features/steps/project/fork.rb +++ /dev/null @@ -1,34 +0,0 @@ -class Spinach::Features::ProjectFork < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I click link "Fork"' do - page.should have_content "Shop" - page.should have_content "Fork" - click_link "Fork" - end - - step 'I am a member of project "Shop"' do - @project = create(:project, name: "Shop") - @project.team << [@user, :reporter] - end - - step 'I should see the forked project page' do - page.should have_content "Project was successfully forked." - end - - step 'I already have a project named "Shop" in my namespace' do - @my_project = create(:project, name: "Shop", namespace: current_user.namespace) - end - - step 'I should see a "Name has already been taken" warning' do - page.should have_content "Name has already been taken" - end - - step 'I fork to my namespace' do - within '.fork-namespaces' do - click_link current_user.name - end - end -end diff --git a/features/steps/project/forked_merge_requests.rb b/features/steps/project/forked_merge_requests.rb deleted file mode 100644 index 63ad90e1241..00000000000 --- a/features/steps/project/forked_merge_requests.rb +++ /dev/null @@ -1,136 +0,0 @@ -class Spinach::Features::ProjectForkedMergeRequests < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedNote - include SharedPaths - include Select2Helper - - step 'I am a member of project "Shop"' do - @project = Project.find_by(name: "Shop") - @project ||= create(:project, name: "Shop") - @project.team << [@user, :reporter] - @project.ensure_satellite_exists - end - - step 'I have a project forked off of "Shop" called "Forked Shop"' do - @forked_project = Projects::ForkService.new(@project, @user).execute - end - - step 'I click link "New Merge Request"' do - click_link "New Merge Request" - end - - step 'I should see merge request "Merge Request On Forked Project"' do - @project.merge_requests.size.should >= 1 - @merge_request = @project.merge_requests.last - current_path.should == namespace_project_merge_request_path(@project.namespace, @project, @merge_request) - @merge_request.title.should == "Merge Request On Forked Project" - @merge_request.source_project.should == @forked_project - @merge_request.source_branch.should == "fix" - @merge_request.target_branch.should == "master" - page.should have_content @forked_project.path_with_namespace - page.should have_content @project.path_with_namespace - page.should have_content @merge_request.source_branch - page.should have_content @merge_request.target_branch - end - - step 'I fill out a "Merge Request On Forked Project" merge request' do - select @forked_project.path_with_namespace, from: "merge_request_source_project_id" - select @project.path_with_namespace, from: "merge_request_target_project_id" - select "fix", from: "merge_request_source_branch" - select "master", from: "merge_request_target_branch" - - click_button "Compare branches" - - fill_in "merge_request_title", with: "Merge Request On Forked Project" - end - - step 'I submit the merge request' do - click_button "Submit merge request" - end - - step 'I follow the target commit link' do - commit = @project.repository.commit - click_link commit.short_id(8) - end - - step 'I should see the commit under the forked from project' do - commit = @project.repository.commit - page.should have_content(commit.message) - end - - step 'I click "Create Merge Request on fork" link' do - click_link "Create Merge Request on fork" - end - - step 'I see prefilled new Merge Request page for the forked project' do - current_path.should == new_namespace_project_merge_request_path(@forked_project.namespace, @forked_project) - find("#merge_request_source_project_id").value.should == @forked_project.id.to_s - find("#merge_request_target_project_id").value.should == @project.id.to_s - find("#merge_request_source_branch").value.should have_content "new_design" - find("#merge_request_target_branch").value.should have_content "master" - find("#merge_request_title").value.should == "New Design" - verify_commit_link(".mr_target_commit", @project) - verify_commit_link(".mr_source_commit", @forked_project) - end - - step 'I update the merge request title' do - fill_in "merge_request_title", with: "An Edited Forked Merge Request" - end - - step 'I save the merge request' do - click_button "Save changes" - end - - step 'I should see the edited merge request' do - page.should have_content "An Edited Forked Merge Request" - @project.merge_requests.size.should >= 1 - @merge_request = @project.merge_requests.last - current_path.should == namespace_project_merge_request_path(@project.namespace, @project, @merge_request) - @merge_request.source_project.should == @forked_project - @merge_request.source_branch.should == "fix" - @merge_request.target_branch.should == "master" - page.should have_content @forked_project.path_with_namespace - page.should have_content @project.path_with_namespace - page.should have_content @merge_request.source_branch - page.should have_content @merge_request.target_branch - end - - step 'I should see last push widget' do - page.should have_content "You pushed to new_design" - page.should have_link "Create Merge Request" - end - - step 'I click link edit "Merge Request On Forked Project"' do - find("#edit_merge_request").click - end - - step 'I see the edit page prefilled for "Merge Request On Forked Project"' do - current_path.should == edit_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) - page.should have_content "Edit merge request ##{@merge_request.id}" - find("#merge_request_title").value.should == "Merge Request On Forked Project" - end - - step 'I fill out an invalid "Merge Request On Forked Project" merge request' do - select "Select branch", from: "merge_request_target_branch" - find(:select, "merge_request_source_project_id", {}).value.should == @forked_project.id.to_s - find(:select, "merge_request_target_project_id", {}).value.should == @project.id.to_s - find(:select, "merge_request_source_branch", {}).value.should == "" - find(:select, "merge_request_target_branch", {}).value.should == "" - click_button "Compare branches" - end - - step 'I should see validation errors' do - page.should have_content "You must select source and target branch" - end - - step 'the target repository should be the original repository' do - page.should have_select("merge_request_target_project_id", selected: @project.path_with_namespace) - end - - # Verify a link is generated against the correct project - def verify_commit_link(container_div, container_project) - # This should force a wait for the javascript to execute - find(:div,container_div).find(".commit_short_id")['href'].should have_content "#{container_project.path_with_namespace}/commit" - end -end diff --git a/features/steps/project/graph.rb b/features/steps/project/graph.rb deleted file mode 100644 index a2807c340f6..00000000000 --- a/features/steps/project/graph.rb +++ /dev/null @@ -1,23 +0,0 @@ -class Spinach::Features::ProjectGraph < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - - step 'page should have graphs' do - page.should have_selector ".stat-graph" - end - - When 'I visit project "Shop" graph page' do - project = Project.find_by(name: "Shop") - visit namespace_project_graph_path(project.namespace, project, "master") - end - - step 'I visit project "Shop" commits graph page' do - project = Project.find_by(name: "Shop") - visit commits_namespace_project_graph_path(project.namespace, project, "master") - end - - step 'page should have commits graphs' do - page.should have_content "Commit statistics for master" - page.should have_content "Commits per day of month" - end -end diff --git a/features/steps/project/hooks.rb b/features/steps/project/hooks.rb deleted file mode 100644 index 4b135202593..00000000000 --- a/features/steps/project/hooks.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'webmock' - -class Spinach::Features::ProjectHooks < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include RSpec::Matchers - include RSpec::Mocks::ExampleMethods - include WebMock::API - - step 'project has hook' do - @hook = create(:project_hook, project: current_project) - end - - step 'I own empty project with hook' do - @project = create(:empty_project, - name: 'Empty Project', namespace: @user.namespace) - @hook = create(:project_hook, project: current_project) - end - - step 'I should see project hook' do - page.should have_content @hook.url - end - - step 'I submit new hook' do - @url = Faker::Internet.uri("http") - fill_in "hook_url", with: @url - expect { click_button "Add Web Hook" }.to change(ProjectHook, :count).by(1) - end - - step 'I should see newly created hook' do - current_path.should == namespace_project_hooks_path(current_project.namespace, current_project) - page.should have_content(@url) - end - - step 'I click test hook button' do - stub_request(:post, @hook.url).to_return(status: 200) - click_link 'Test Hook' - end - - step 'I click test hook button with invalid URL' do - stub_request(:post, @hook.url).to_raise(SocketError) - click_link 'Test Hook' - end - - step 'hook should be triggered' do - current_path.should == namespace_project_hooks_path(current_project.namespace, current_project) - page.should have_selector '.flash-notice', - text: 'Hook successfully executed.' - end - - step 'I should see hook error message' do - page.should have_selector '.flash-alert', - text: 'Hook execution failed. '\ - 'Ensure the project has commits.' - end - - step 'I should see hook service down error message' do - page.should have_selector '.flash-alert', - text: 'Hook execution failed. '\ - 'Ensure hook URL is correct and '\ - 'service is up.' - end -end diff --git a/features/steps/project/issues/filter_labels.rb b/features/steps/project/issues/filter_labels.rb deleted file mode 100644 index 5740bd12837..00000000000 --- a/features/steps/project/issues/filter_labels.rb +++ /dev/null @@ -1,60 +0,0 @@ -class Spinach::Features::ProjectIssuesFilterLabels < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include Select2Helper - - step 'I should see "Bugfix1" in issues list' do - within ".issues-list" do - page.should have_content "Bugfix1" - end - end - - step 'I should see "Bugfix2" in issues list' do - within ".issues-list" do - page.should have_content "Bugfix2" - end - end - - step 'I should not see "Bugfix2" in issues list' do - within ".issues-list" do - page.should_not have_content "Bugfix2" - end - end - - step 'I should not see "Feature1" in issues list' do - within ".issues-list" do - page.should_not have_content "Feature1" - end - end - - step 'I click link "bug"' do - select2('bug', from: "#label_name") - end - - step 'I click link "feature"' do - within ".labels-filter" do - click_link "feature" - end - end - - step 'project "Shop" has issue "Bugfix1" with labels: "bug", "feature"' do - project = Project.find_by(name: "Shop") - issue = create(:issue, title: "Bugfix1", project: project) - issue.labels << project.labels.find_by(title: 'bug') - issue.labels << project.labels.find_by(title: 'feature') - end - - step 'project "Shop" has issue "Bugfix2" with labels: "bug", "enhancement"' do - project = Project.find_by(name: "Shop") - issue = create(:issue, title: "Bugfix2", project: project) - issue.labels << project.labels.find_by(title: 'bug') - issue.labels << project.labels.find_by(title: 'enhancement') - end - - step 'project "Shop" has issue "Feature1" with labels: "feature"' do - project = Project.find_by(name: "Shop") - issue = create(:issue, title: "Feature1", project: project) - issue.labels << project.labels.find_by(title: 'feature') - end -end diff --git a/features/steps/project/issues/issues.rb b/features/steps/project/issues/issues.rb deleted file mode 100644 index b8e282b2029..00000000000 --- a/features/steps/project/issues/issues.rb +++ /dev/null @@ -1,276 +0,0 @@ -class Spinach::Features::ProjectIssues < Spinach::FeatureSteps - include SharedAuthentication - include SharedIssuable - include SharedProject - include SharedNote - include SharedPaths - include SharedMarkdown - - step 'I should see "Release 0.4" in issues' do - page.should have_content "Release 0.4" - end - - step 'I should not see "Release 0.3" in issues' do - page.should_not have_content "Release 0.3" - end - - step 'I should not see "Tweet control" in issues' do - page.should_not have_content "Tweet control" - end - - step 'I should see that I am subscribed' do - find(".subscribe-button span").text.should == "Unsubscribe" - end - - step 'I should see that I am unsubscribed' do - sleep 0.2 - find(".subscribe-button span").text.should == "Subscribe" - end - - step 'I click link "Closed"' do - click_link "Closed" - end - - step 'I click button "Unsubscribe"' do - click_on "Unsubscribe" - end - - step 'I should see "Release 0.3" in issues' do - page.should have_content "Release 0.3" - end - - step 'I should not see "Release 0.4" in issues' do - page.should_not have_content "Release 0.4" - end - - step 'I click link "All"' do - click_link "All" - end - - step 'I click link "Release 0.4"' do - click_link "Release 0.4" - end - - step 'I should see issue "Release 0.4"' do - page.should have_content "Release 0.4" - end - - step 'I click link "New Issue"' do - click_link "New Issue" - end - - step 'I click "author" dropdown' do - first('.ajax-users-select').click - end - - step 'I see current user as the first user' do - expect(page).to have_selector('.user-result', visible: true, count: 4) - users = page.all('.user-name') - users[0].text.should == 'Any' - users[1].text.should == 'Unassigned' - users[2].text.should == current_user.name - end - - step 'I submit new issue "500 error on profile"' do - fill_in "issue_title", with: "500 error on profile" - click_button "Submit new issue" - end - - step 'I submit new issue "500 error on profile" with label \'bug\'' do - fill_in "issue_title", with: "500 error on profile" - select 'bug', from: "Labels" - click_button "Submit new issue" - end - - step 'I click link "500 error on profile"' do - click_link "500 error on profile" - end - - step 'I should see label \'bug\' with issue' do - within '.issue-show-labels' do - page.should have_content 'bug' - end - end - - step 'I should see issue "500 error on profile"' do - issue = Issue.find_by(title: "500 error on profile") - page.should have_content issue.title - page.should have_content issue.author_name - page.should have_content issue.project.name - end - - step 'I fill in issue search with "Re"' do - filter_issue "Re" - end - - step 'I fill in issue search with "Bu"' do - filter_issue "Bu" - end - - step 'I fill in issue search with ".3"' do - filter_issue ".3" - end - - step 'I fill in issue search with "Something"' do - filter_issue "Something" - end - - step 'I fill in issue search with ""' do - filter_issue "" - end - - step 'project "Shop" has milestone "v2.2"' do - - milestone = create(:milestone, title: "v2.2", project: project) - - 3.times { create(:issue, project: project, milestone: milestone) } - end - - step 'project "Shop" has milestone "v3.0"' do - - milestone = create(:milestone, title: "v3.0", project: project) - - 3.times { create(:issue, project: project, milestone: milestone) } - end - - When 'I select milestone "v3.0"' do - select "v3.0", from: "milestone_id" - end - - step 'I should see selected milestone with title "v3.0"' do - issues_milestone_selector = "#issue_milestone_id_chzn > a" - find(issues_milestone_selector).should have_content("v3.0") - end - - When 'I select first assignee from "Shop" project' do - - first_assignee = project.users.first - select first_assignee.name, from: "assignee_id" - end - - step 'I should see first assignee from "Shop" as selected assignee' do - issues_assignee_selector = "#issue_assignee_id_chzn > a" - - assignee_name = project.users.first.name - find(issues_assignee_selector).should have_content(assignee_name) - end - - step 'project "Shop" have "Release 0.4" open issue' do - - create(:issue, - title: "Release 0.4", - project: project, - author: project.users.first, - description: "# Description header" - ) - end - - step 'project "Shop" have "Tweet control" open issue' do - create(:issue, - title: "Tweet control", - project: project, - author: project.users.first) - end - - step 'project "Shop" have "Release 0.3" closed issue' do - create(:closed_issue, - title: "Release 0.3", - project: project, - author: project.users.first) - end - - step 'project "Shop" has "Tasks-open" open issue with task markdown' do - create_taskable(:issue, 'Tasks-open') - end - - step 'project "Shop" has "Tasks-closed" closed issue with task markdown' do - create_taskable(:closed_issue, 'Tasks-closed') - end - - step 'empty project "Empty Project"' do - create :empty_project, name: 'Empty Project', namespace: @user.namespace - end - - When 'I visit empty project page' do - project = Project.find_by(name: 'Empty Project') - visit namespace_project_path(project.namespace, project) - end - - step 'I see empty project details with ssh clone info' do - project = Project.find_by(name: 'Empty Project') - all(:css, '.git-empty .clone').each do |element| - element.text.should include(project.url_to_repo) - end - end - - When "I visit empty project's issues page" do - project = Project.find_by(name: 'Empty Project') - visit namespace_project_issues_path(project.namespace, project) - end - - step 'I leave a comment with code block' do - within(".js-main-target-form") do - fill_in "note[note]", with: "```\nCommand [1]: /usr/local/bin/git , see [text](doc/text)\n```" - click_button "Add Comment" - sleep 0.05 - end - end - - step 'I should see an error alert section within the comment form' do - within(".js-main-target-form") do - find(".error-alert") - end - end - - step 'The code block should be unchanged' do - page.should have_content("```\nCommand [1]: /usr/local/bin/git , see [text](doc/text)\n```") - end - - step 'project \'Shop\' has issue \'Bugfix1\' with description: \'Description for issue1\'' do - issue = create(:issue, title: 'Bugfix1', description: 'Description for issue1', project: project) - end - - step 'project \'Shop\' has issue \'Feature1\' with description: \'Feature submitted for issue1\'' do - issue = create(:issue, title: 'Feature1', description: 'Feature submitted for issue1', project: project) - end - - step 'I fill in issue search with \'Description for issue1\'' do - filter_issue 'Description for issue' - end - - step 'I fill in issue search with \'issue1\'' do - filter_issue 'issue1' - end - - step 'I fill in issue search with \'Rock and roll\'' do - filter_issue 'Description for issue' - end - - step 'I should see \'Bugfix1\' in issues' do - page.should have_content 'Bugfix1' - end - - step 'I should see \'Feature1\' in issues' do - page.should have_content 'Feature1' - end - - step 'I should not see \'Bugfix1\' in issues' do - page.should_not have_content 'Bugfix1' - end - - step 'issue \'Release 0.4\' has label \'bug\'' do - label = project.labels.create!(name: 'bug', color: '#990000') - issue = Issue.find_by!(title: 'Release 0.4') - issue.labels << label - end - - step 'I click label \'bug\'' do - within ".issues-list" do - click_link 'bug' - end - end - - def filter_issue(text) - fill_in 'issue_search', with: text - end -end diff --git a/features/steps/project/issues/labels.rb b/features/steps/project/issues/labels.rb deleted file mode 100644 index 6ce34c500c6..00000000000 --- a/features/steps/project/issues/labels.rb +++ /dev/null @@ -1,101 +0,0 @@ -class Spinach::Features::ProjectIssuesLabels < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I visit \'bug\' label edit page' do - visit edit_namespace_project_label_path(project.namespace, project, bug_label) - end - - step 'I remove label \'bug\'' do - within "#label_#{bug_label.id}" do - click_link 'Remove' - end - end - - step 'I delete all labels' do - within '.labels' do - all('.btn-remove').each do |remove| - remove.click - sleep 0.05 - end - end - end - - step 'I should see labels help message' do - within '.labels' do - page.should have_content 'Create first label or generate default set of '\ - 'labels' - end - end - - step 'I submit new label \'support\'' do - fill_in 'Title', with: 'support' - fill_in 'Background Color', with: '#F95610' - click_button 'Save' - end - - step 'I submit new label \'bug\'' do - fill_in 'Title', with: 'bug' - fill_in 'Background Color', with: '#F95610' - click_button 'Save' - end - - step 'I submit new label with invalid color' do - fill_in 'Title', with: 'support' - fill_in 'Background Color', with: '#12' - click_button 'Save' - end - - step 'I should see label label exist error message' do - within '.label-form' do - page.should have_content 'Title has already been taken' - end - end - - step 'I should see label color error message' do - within '.label-form' do - page.should have_content 'Color is invalid' - end - end - - step 'I should see label \'feature\'' do - within '.manage-labels-list' do - page.should have_content 'feature' - end - end - - step 'I should see label \'bug\'' do - within '.manage-labels-list' do - page.should have_content 'bug' - end - end - - step 'I should not see label \'bug\'' do - within '.manage-labels-list' do - page.should_not have_content 'bug' - end - end - - step 'I should see label \'support\'' do - within '.manage-labels-list' do - page.should have_content 'support' - end - end - - step 'I change label \'bug\' to \'fix\'' do - fill_in 'Title', with: 'fix' - fill_in 'Background Color', with: '#F15610' - click_button 'Save' - end - - step 'I should see label \'fix\'' do - within '.manage-labels-list' do - page.should have_content 'fix' - end - end - - def bug_label - project.labels.find_or_create_by(title: 'bug') - end -end diff --git a/features/steps/project/issues/milestones.rb b/features/steps/project/issues/milestones.rb deleted file mode 100644 index cce87a6d981..00000000000 --- a/features/steps/project/issues/milestones.rb +++ /dev/null @@ -1,59 +0,0 @@ -class Spinach::Features::ProjectIssuesMilestones < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include SharedMarkdown - - step 'I should see milestone "v2.2"' do - milestone = @project.milestones.find_by(title: "v2.2") - page.should have_content(milestone.title[0..10]) - page.should have_content(milestone.expires_at) - page.should have_content("Issues") - end - - step 'I click link "v2.2"' do - click_link "v2.2" - end - - step 'I click link "New Milestone"' do - click_link "New Milestone" - end - - step 'I submit new milestone "v2.3"' do - fill_in "milestone_title", with: "v2.3" - click_button "Create milestone" - end - - step 'I should see milestone "v2.3"' do - milestone = @project.milestones.find_by(title: "v2.3") - page.should have_content(milestone.title[0..10]) - page.should have_content(milestone.expires_at) - page.should have_content("Issues") - end - - step 'project "Shop" has milestone "v2.2"' do - project = Project.find_by(name: "Shop") - milestone = create(:milestone, - title: "v2.2", - project: project, - description: "# Description header" - ) - 3.times { create(:issue, project: project, milestone: milestone) } - end - - step 'the milestone has open and closed issues' do - project = Project.find_by(name: "Shop") - milestone = project.milestones.find_by(title: 'v2.2') - - # 3 Open issues created above; create one closed issue - create(:closed_issue, project: project, milestone: milestone) - end - - When 'I click link "All Issues"' do - click_link 'All Issues' - end - - step 'I should see 3 issues' do - page.should have_selector('#tab-issues li.issue-row', count: 4) - end -end diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb deleted file mode 100644 index bb1f9f129c0..00000000000 --- a/features/steps/project/merge_requests.rb +++ /dev/null @@ -1,337 +0,0 @@ -class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps - include SharedAuthentication - include SharedIssuable - include SharedProject - include SharedNote - include SharedPaths - include SharedMarkdown - include SharedDiffNote - - step 'I click link "New Merge Request"' do - click_link "New Merge Request" - end - - step 'I click link "Bug NS-04"' do - click_link "Bug NS-04" - end - - step 'I click link "All"' do - click_link "All" - end - - step 'I click link "Closed"' do - click_link "Closed" - end - - step 'I should see merge request "Wiki Feature"' do - within '.merge-request' do - page.should have_content "Wiki Feature" - end - end - - step 'I should see closed merge request "Bug NS-04"' do - merge_request = MergeRequest.find_by!(title: "Bug NS-04") - merge_request.closed?.should be_true - page.should have_content "Closed by" - end - - step 'I should see merge request "Bug NS-04"' do - page.should have_content "Bug NS-04" - end - - step 'I should see "Bug NS-04" in merge requests' do - page.should have_content "Bug NS-04" - end - - step 'I should see "Feature NS-03" in merge requests' do - page.should have_content "Feature NS-03" - end - - step 'I should not see "Feature NS-03" in merge requests' do - page.should_not have_content "Feature NS-03" - end - - - step 'I should not see "Bug NS-04" in merge requests' do - page.should_not have_content "Bug NS-04" - end - - step 'I should see that I am subscribed' do - find(".subscribe-button span").text.should == "Unsubscribe" - end - - step 'I should see that I am unsubscribed' do - find(".subscribe-button span").should have_content("Subscribe") - end - - step 'I click button "Unsubscribe"' do - click_on "Unsubscribe" - end - - step 'I click link "Close"' do - first(:css, '.close-mr-link').click - end - - step 'I submit new merge request "Wiki Feature"' do - select "fix", from: "merge_request_source_branch" - select "feature", from: "merge_request_target_branch" - click_button "Compare branches" - fill_in "merge_request_title", with: "Wiki Feature" - click_button "Submit merge request" - end - - step 'project "Shop" have "Bug NS-04" open merge request' do - create(:merge_request, - title: "Bug NS-04", - source_project: project, - target_project: project, - source_branch: 'fix', - target_branch: 'master', - author: project.users.first, - description: "# Description header" - ) - end - - step 'project "Shop" have "Bug NS-05" open merge request with diffs inside' do - create(:merge_request_with_diffs, - title: "Bug NS-05", - source_project: project, - target_project: project, - author: project.users.first) - end - - step 'project "Shop" have "Feature NS-03" closed merge request' do - create(:closed_merge_request, - title: "Feature NS-03", - source_project: project, - target_project: project, - author: project.users.first) - end - - step 'project "Shop" has "MR-task-open" open MR with task markdown' do - create_taskable(:merge_request, 'MR-task-open') - end - - step 'I switch to the diff tab' do - visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request) - end - - step 'I click on the Changes tab via Javascript' do - find('.diffs-tab').click - sleep 2 - end - - step 'I should see the proper Inline and Side-by-side links' do - buttons = all('#commit-diff-viewtype') - expect(buttons.count).to eq(2) - - buttons.each do |b| - expect(b['href']).should_not have_content('json') - end - end - - step 'I switch to the merge request\'s comments tab' do - visit namespace_project_merge_request_path(project.namespace, project, merge_request) - end - - step 'I click on the commit in the merge request' do - within '.merge-request-tabs' do - click_link 'Commits' - end - - within '.commits' do - click_link Commit.truncate_sha(sample_commit.id) - end - end - - step 'I leave a comment on the diff page' do - init_diff_note - leave_comment "One comment to rule them all" - end - - step 'I leave a comment on the diff page in commit' do - click_diff_line(sample_commit.line_code) - leave_comment "One comment to rule them all" - end - - step 'I leave a comment like "Line is wrong" on diff' do - init_diff_note - leave_comment "Line is wrong" - end - - step 'I leave a comment like "Line is wrong" on diff in commit' do - click_diff_line(sample_commit.line_code) - leave_comment "Line is wrong" - end - - step 'I should see a discussion has started on diff' do - page.should have_content "#{current_user.name} started a discussion" - page.should have_content sample_commit.line_code_path - page.should have_content "Line is wrong" - end - - step 'I should see a discussion has started on commit diff' do - page.should have_content "#{current_user.name} started a discussion on commit" - page.should have_content sample_commit.line_code_path - page.should have_content "Line is wrong" - end - - step 'I should see a discussion has started on commit' do - page.should have_content "#{current_user.name} started a discussion on commit" - page.should have_content "One comment to rule them all" - end - - step 'merge request is mergeable' do - page.should have_button 'Accept Merge Request' - end - - step 'I modify merge commit message' do - find('.modify-merge-commit-link').click - fill_in 'commit_message', with: 'wow such merge' - end - - step 'merge request "Bug NS-05" is mergeable' do - merge_request.mark_as_mergeable - end - - step 'I accept this merge request' do - Gitlab::Satellite::MergeAction.any_instance.stub( - merge!: true, - ) - - within '.can_be_merged' do - click_button "Accept Merge Request" - end - end - - step 'I should see merged request' do - within '.issue-box' do - page.should have_content "Merged" - end - end - - step 'I click link "Reopen"' do - first(:css, '.reopen-mr-link').click - end - - step 'I should see reopened merge request "Bug NS-04"' do - within '.issue-box' do - page.should have_content "Open" - end - end - - step 'I click link "Hide inline discussion" of the second file' do - within '.files [id^=diff]:nth-child(2)' do - find('.js-toggle-diff-comments').click - end - end - - step 'I click link "Show inline discussion" of the second file' do - within '.files [id^=diff]:nth-child(2)' do - find('.js-toggle-diff-comments').click - end - end - - step 'I should not see a comment like "Line is wrong" in the second file' do - within '.files [id^=diff]:nth-child(2)' do - page.should_not have_visible_content "Line is wrong" - end - end - - step 'I should see a comment like "Line is wrong" in the second file' do - within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do - page.should have_visible_content "Line is wrong" - end - end - - step 'I should not see a comment like "Line is wrong here" in the second file' do - within '.files [id^=diff]:nth-child(2)' do - page.should_not have_visible_content "Line is wrong here" - end - end - - step 'I should see a comment like "Line is wrong here" in the second file' do - within '.files [id^=diff]:nth-child(2) .note-body > .note-text' do - page.should have_visible_content "Line is wrong here" - end - end - - step 'I leave a comment like "Line is correct" on line 12 of the first file' do - init_diff_note_first_file - - within(".js-discussion-note-form") do - fill_in "note_note", with: "Line is correct" - click_button "Add Comment" - end - - within ".files [id^=diff]:nth-child(1) .note-body > .note-text" do - page.should have_content "Line is correct" - end - end - - step 'I leave a comment like "Line is wrong" on line 39 of the second file' do - init_diff_note_second_file - - within(".js-discussion-note-form") do - fill_in "note_note", with: "Line is wrong on here" - click_button "Add Comment" - end - end - - step 'I should still see a comment like "Line is correct" in the first file' do - within '.files [id^=diff]:nth-child(1) .note-body > .note-text' do - page.should have_visible_content "Line is correct" - end - end - - step 'I unfold diff' do - first('.js-unfold').click - end - - step 'I should see additional file lines' do - expect(first('.text-file')).to have_content('.bundle') - end - - step 'I click Side-by-side Diff tab' do - find('a', text: 'Side-by-side').trigger('click') - end - - step 'I should see comments on the side-by-side diff page' do - within '.files [id^=diff]:nth-child(1) .parallel .note-body > .note-text' do - page.should have_visible_content "Line is correct" - end - end - - step 'I fill in merge request search with "Fe"' do - fill_in 'issue_search', with: "Fe" - end - - def merge_request - @merge_request ||= MergeRequest.find_by!(title: "Bug NS-05") - end - - def init_diff_note - click_diff_line(sample_commit.line_code) - end - - def leave_comment(message) - within(".js-discussion-note-form") do - fill_in "note_note", with: message - click_button "Add Comment" - end - - page.should have_content message - end - - def init_diff_note_first_file - click_diff_line(sample_compare.changes[0][:line_code]) - end - - def init_diff_note_second_file - click_diff_line(sample_compare.changes[1][:line_code]) - end - - def have_visible_content (text) - have_css("*", text: text, visible: true) - end -end diff --git a/features/steps/project/network_graph.rb b/features/steps/project/network_graph.rb deleted file mode 100644 index a15688ace6a..00000000000 --- a/features/steps/project/network_graph.rb +++ /dev/null @@ -1,93 +0,0 @@ -class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'page should have network graph' do - page.should have_selector ".network-graph" - end - - When 'I visit project "Shop" network page' do - # Stub Graph max_size to speed up test (10 commits vs. 650) - Network::Graph.stub(max_count: 10) - - project = Project.find_by(name: "Shop") - visit namespace_project_network_path(project.namespace, project, "master") - end - - step 'page should select "master" in select box' do - page.should have_selector '.select2-chosen', text: "master" - end - - step 'page should select "v1.0.0" in select box' do - page.should have_selector '.select2-chosen', text: "v1.0.0" - end - - step 'page should have "master" on graph' do - within '.network-graph' do - page.should have_content 'master' - end - end - - When 'I switch ref to "feature"' do - select 'feature', from: 'ref' - sleep 2 - end - - When 'I switch ref to "v1.0.0"' do - select 'v1.0.0', from: 'ref' - sleep 2 - end - - When 'click "Show only selected branch" checkbox' do - find('#filter_ref').click - sleep 2 - end - - step 'page should have content not containing "v1.0.0"' do - within '.network-graph' do - page.should have_content 'Change some files' - end - end - - step 'page should not have content not containing "v1.0.0"' do - within '.network-graph' do - page.should_not have_content 'Change some files' - end - end - - step 'page should select "feature" in select box' do - page.should have_selector '.select2-chosen', text: "feature" - end - - step 'page should select "v1.0.0" in select box' do - page.should have_selector '.select2-chosen', text: "v1.0.0" - end - - step 'page should have "feature" on graph' do - within '.network-graph' do - page.should have_content 'feature' - end - end - - When 'I looking for a commit by SHA of "v1.0.0"' do - within ".network-form" do - fill_in 'extended_sha1', with: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9' - find('button').click - end - sleep 2 - end - - step 'page should have "v1.0.0" on graph' do - within '.network-graph' do - page.should have_content 'v1.0.0' - end - end - - When 'I look for a commit by ";"' do - within ".network-form" do - fill_in 'extended_sha1', with: ';' - find('button').click - end - end -end diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb deleted file mode 100644 index d39c8e7d2db..00000000000 --- a/features/steps/project/project.rb +++ /dev/null @@ -1,97 +0,0 @@ -class Spinach::Features::Project < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'change project settings' do - fill_in 'project_name_edit', with: 'NewName' - uncheck 'project_issues_enabled' - end - - step 'I save project' do - click_button 'Save changes' - end - - step 'I should see project with new settings' do - find_field('project_name').value.should == 'NewName' - end - - step 'change project path settings' do - fill_in 'project_path', with: 'new-path' - click_button 'Rename' - end - - step 'I should see project with new path settings' do - project.path.should == 'new-path' - end - - step 'I change the project avatar' do - attach_file( - :project_avatar, - File.join(Rails.root, 'public', 'gitlab_logo.png') - ) - click_button 'Save changes' - @project.reload - end - - step 'I should see new project avatar' do - @project.avatar.should be_instance_of AvatarUploader - url = @project.avatar.url - url.should == "/uploads/project/avatar/#{ @project.id }/gitlab_logo.png" - end - - step 'I should see the "Remove avatar" button' do - page.should have_link('Remove avatar') - end - - step 'I have an project avatar' do - attach_file( - :project_avatar, - File.join(Rails.root, 'public', 'gitlab_logo.png') - ) - click_button 'Save changes' - @project.reload - end - - step 'I remove my project avatar' do - click_link 'Remove avatar' - @project.reload - end - - step 'I should see the default project avatar' do - @project.avatar?.should be_false - end - - step 'I should not see the "Remove avatar" button' do - page.should_not have_link('Remove avatar') - end - - step 'I should see project "Shop" version' do - within '.project-side' do - page.should have_content 'Version: 6.7.0.pre' - end - end - - step 'change project default branch' do - select 'fix', from: 'project_default_branch' - click_button 'Save changes' - end - - step 'I should see project default branch changed' do - find(:css, 'select#project_default_branch').value.should == 'fix' - end - - step 'I select project "Forum" README tab' do - click_link 'Readme' - end - - step 'I should see project "Forum" README' do - page.should have_link 'README.md' - page.should have_content 'Sample repo for testing gitlab features' - end - - step 'I should see project "Shop" README' do - page.should have_link 'README.md' - page.should have_content 'testme' - end -end diff --git a/features/steps/project/project_shortcuts.rb b/features/steps/project/project_shortcuts.rb deleted file mode 100644 index a10e7bf78ee..00000000000 --- a/features/steps/project/project_shortcuts.rb +++ /dev/null @@ -1,36 +0,0 @@ -class Spinach::Features::ProjectShortcuts < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - include SharedProjectTab - - step 'I press "g" and "f"' do - find('body').native.send_key('g') - find('body').native.send_key('f') - end - - step 'I press "g" and "c"' do - find('body').native.send_key('g') - find('body').native.send_key('c') - end - - step 'I press "g" and "n"' do - find('body').native.send_key('g') - find('body').native.send_key('n') - end - - step 'I press "g" and "g"' do - find('body').native.send_key('g') - find('body').native.send_key('g') - end - - step 'I press "g" and "s"' do - find('body').native.send_key('g') - find('body').native.send_key('s') - end - - step 'I press "g" and "w"' do - find('body').native.send_key('g') - find('body').native.send_key('w') - end -end diff --git a/features/steps/project/redirects.rb b/features/steps/project/redirects.rb deleted file mode 100644 index 57c6e39c801..00000000000 --- a/features/steps/project/redirects.rb +++ /dev/null @@ -1,69 +0,0 @@ -class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'public project "Community"' do - create :project, :public, name: 'Community' - end - - step 'private project "Enterprise"' do - create :project, name: 'Enterprise' - end - - step 'I visit project "Community" page' do - project = Project.find_by(name: 'Community') - visit namespace_project_path(project.namespace, project) - end - - step 'I should see project "Community" home page' do - Gitlab.config.gitlab.should_receive(:host).and_return("www.example.com") - within '.navbar-gitlab .title' do - page.should have_content 'Community' - end - end - - step 'I visit project "Enterprise" page' do - project = Project.find_by(name: 'Enterprise') - visit namespace_project_path(project.namespace, project) - end - - step 'I visit project "CommunityDoesNotExist" page' do - project = Project.find_by(name: 'Community') - visit namespace_project_path(project.namespace, project) + 'DoesNotExist' - end - - step 'I click on "Sign In"' do - first(:link, "Sign in").click - end - - step 'Authenticate' do - admin = create(:admin) - project = Project.find_by(name: 'Community') - fill_in "user_login", with: admin.email - fill_in "user_password", with: admin.password - click_button "Sign in" - Thread.current[:current_user] = admin - end - - step 'I should be redirected to "Community" page' do - project = Project.find_by(name: 'Community') - current_path.should == "/#{project.path_with_namespace}" - status_code.should == 200 - end - - step 'I get redirected to signin page where I sign in' do - admin = create(:admin) - project = Project.find_by(name: 'Enterprise') - fill_in "user_login", with: admin.email - fill_in "user_password", with: admin.password - click_button "Sign in" - Thread.current[:current_user] = admin - end - - step 'I should be redirected to "Enterprise" page' do - project = Project.find_by(name: 'Enterprise') - current_path.should == "/#{project.path_with_namespace}" - status_code.should == 200 - end -end diff --git a/features/steps/project/services.rb b/features/steps/project/services.rb deleted file mode 100644 index 4b3d79324ab..00000000000 --- a/features/steps/project/services.rb +++ /dev/null @@ -1,225 +0,0 @@ -class Spinach::Features::ProjectServices < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I visit project "Shop" services page' do - visit namespace_project_services_path(@project.namespace, @project) - end - - step 'I should see list of available services' do - page.should have_content 'Project services' - page.should have_content 'Campfire' - page.should have_content 'HipChat' - page.should have_content 'GitLab CI' - page.should have_content 'Assembla' - page.should have_content 'Pushover' - page.should have_content 'Atlassian Bamboo' - page.should have_content 'JetBrains TeamCity' - page.should have_content 'Asana' - page.should have_content 'Irker (IRC gateway)' - end - - step 'I click gitlab-ci service link' do - click_link 'GitLab CI' - end - - step 'I fill gitlab-ci settings' do - check 'Active' - fill_in 'Project url', with: 'http://ci.gitlab.org/projects/3' - fill_in 'Token', with: 'verySecret' - click_button 'Save' - end - - step 'I should see service settings saved' do - find_field('Project url').value.should == 'http://ci.gitlab.org/projects/3' - end - - step 'I click hipchat service link' do - click_link 'HipChat' - end - - step 'I fill hipchat settings' do - check 'Active' - fill_in 'Room', with: 'gitlab' - fill_in 'Token', with: 'verySecret' - click_button 'Save' - end - - step 'I should see hipchat service settings saved' do - find_field('Room').value.should == 'gitlab' - end - - step 'I fill hipchat settings with custom server' do - check 'Active' - fill_in 'Room', with: 'gitlab_custom' - fill_in 'Token', with: 'secretCustom' - fill_in 'Server', with: 'https://chat.example.com' - click_button 'Save' - end - - step 'I should see hipchat service settings with custom server saved' do - find_field('Server').value.should == 'https://chat.example.com' - end - - step 'I click pivotaltracker service link' do - click_link 'PivotalTracker' - end - - step 'I fill pivotaltracker settings' do - check 'Active' - fill_in 'Token', with: 'verySecret' - click_button 'Save' - end - - step 'I should see pivotaltracker service settings saved' do - find_field('Token').value.should == 'verySecret' - end - - step 'I click Flowdock service link' do - click_link 'Flowdock' - end - - step 'I fill Flowdock settings' do - check 'Active' - fill_in 'Token', with: 'verySecret' - click_button 'Save' - end - - step 'I should see Flowdock service settings saved' do - find_field('Token').value.should == 'verySecret' - end - - step 'I click Assembla service link' do - click_link 'Assembla' - end - - step 'I fill Assembla settings' do - check 'Active' - fill_in 'Token', with: 'verySecret' - click_button 'Save' - end - - step 'I should see Assembla service settings saved' do - find_field('Token').value.should == 'verySecret' - end - - step 'I click Asana service link' do - click_link 'Asana' - end - - step 'I fill Asana settings' do - check 'Active' - fill_in 'Api key', with: 'verySecret' - fill_in 'Restrict to branch', with: 'master' - click_button 'Save' - end - - step 'I should see Asana service settings saved' do - find_field('Api key').value.should == 'verySecret' - find_field('Restrict to branch').value.should == 'master' - end - - step 'I click email on push service link' do - click_link 'Emails on push' - end - - step 'I fill email on push settings' do - fill_in 'Recipients', with: 'qa@company.name' - click_button 'Save' - end - - step 'I should see email on push service settings saved' do - find_field('Recipients').value.should == 'qa@company.name' - end - - step 'I click Irker service link' do - click_link 'Irker (IRC gateway)' - end - - step 'I fill Irker settings' do - check 'Active' - fill_in 'Recipients', with: 'irc://chat.freenode.net/#commits' - check 'Colorize messages' - click_button 'Save' - end - - step 'I should see Irker service settings saved' do - find_field('Recipients').value.should == 'irc://chat.freenode.net/#commits' - find_field('Colorize messages').value.should == '1' - end - - step 'I click Slack service link' do - click_link 'Slack' - end - - step 'I fill Slack settings' do - check 'Active' - fill_in 'Webhook', with: 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' - click_button 'Save' - end - - step 'I should see Slack service settings saved' do - find_field('Webhook').value.should == 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' - end - - step 'I click Pushover service link' do - click_link 'Pushover' - end - - step 'I fill Pushover settings' do - check 'Active' - fill_in 'Api key', with: 'verySecret' - fill_in 'User key', with: 'verySecret' - fill_in 'Device', with: 'myDevice' - select 'High Priority', from: 'Priority' - select 'Bike', from: 'Sound' - click_button 'Save' - end - - step 'I should see Pushover service settings saved' do - find_field('Api key').value.should == 'verySecret' - find_field('User key').value.should == 'verySecret' - find_field('Device').value.should == 'myDevice' - find_field('Priority').find('option[selected]').value.should == '1' - find_field('Sound').find('option[selected]').value.should == 'bike' - end - - step 'I click Atlassian Bamboo CI service link' do - click_link 'Atlassian Bamboo CI' - end - - step 'I fill Atlassian Bamboo CI settings' do - check 'Active' - fill_in 'Bamboo url', with: 'http://bamboo.example.com' - fill_in 'Build key', with: 'KEY' - fill_in 'Username', with: 'user' - fill_in 'Password', with: 'verySecret' - click_button 'Save' - end - - step 'I should see Atlassian Bamboo CI service settings saved' do - find_field('Bamboo url').value.should == 'http://bamboo.example.com' - find_field('Build key').value.should == 'KEY' - find_field('Username').value.should == 'user' - end - - step 'I click JetBrains TeamCity CI service link' do - click_link 'JetBrains TeamCity CI' - end - - step 'I fill JetBrains TeamCity CI settings' do - check 'Active' - fill_in 'Teamcity url', with: 'http://teamcity.example.com' - fill_in 'Build type', with: 'GitlabTest_Build' - fill_in 'Username', with: 'user' - fill_in 'Password', with: 'verySecret' - click_button 'Save' - end - - step 'I should see JetBrains TeamCity CI service settings saved' do - find_field('Teamcity url').value.should == 'http://teamcity.example.com' - find_field('Build type').value.should == 'GitlabTest_Build' - find_field('Username').value.should == 'user' - end -end diff --git a/features/steps/project/snippets.rb b/features/steps/project/snippets.rb deleted file mode 100644 index 343aeb53b11..00000000000 --- a/features/steps/project/snippets.rb +++ /dev/null @@ -1,95 +0,0 @@ -class Spinach::Features::ProjectSnippets < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedNote - include SharedPaths - - step 'project "Shop" have "Snippet one" snippet' do - create(:project_snippet, - title: "Snippet one", - content: "Test content", - file_name: "snippet.rb", - project: project, - author: project.users.first) - end - - step 'project "Shop" have no "Snippet two" snippet' do - create(:snippet, - title: "Snippet two", - content: "Test content", - file_name: "snippet.rb", - author: project.users.first) - end - - step 'I click link "New Snippet"' do - click_link "Add new snippet" - end - - step 'I click link "Snippet one"' do - click_link "Snippet one" - end - - step 'I should see "Snippet one" in snippets' do - page.should have_content "Snippet one" - end - - step 'I should not see "Snippet two" in snippets' do - page.should_not have_content "Snippet two" - end - - step 'I should not see "Snippet one" in snippets' do - page.should_not have_content "Snippet one" - end - - step 'I click link "Edit"' do - within ".file-title" do - click_link "Edit" - end - end - - step 'I click link "Remove Snippet"' do - click_link "remove" - end - - step 'I submit new snippet "Snippet three"' do - fill_in "project_snippet_title", :with => "Snippet three" - fill_in "project_snippet_file_name", :with => "my_snippet.rb" - within('.file-editor') do - find(:xpath, "//input[@id='project_snippet_content']").set 'Content of snippet three' - end - click_button "Create snippet" - end - - step 'I should see snippet "Snippet three"' do - page.should have_content "Snippet three" - page.should have_content "Content of snippet three" - end - - step 'I submit new title "Snippet new title"' do - fill_in "project_snippet_title", :with => "Snippet new title" - click_button "Save" - end - - step 'I should see "Snippet new title"' do - page.should have_content "Snippet new title" - end - - step 'I leave a comment like "Good snippet!"' do - within('.js-main-target-form') do - fill_in "note_note", with: "Good snippet!" - click_button "Add Comment" - end - end - - step 'I should see comment "Good snippet!"' do - page.should have_content "Good snippet!" - end - - step 'I visit snippet page "Snippet one"' do - visit namespace_project_snippet_path(project.namespace, project, project_snippet) - end - - def project_snippet - @project_snippet ||= ProjectSnippet.find_by!(title: "Snippet one") - end -end diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb deleted file mode 100644 index caf6c73ee06..00000000000 --- a/features/steps/project/source/browse_files.rb +++ /dev/null @@ -1,218 +0,0 @@ -class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include RepoHelpers - - step 'I should see files from repository' do - page.should have_content "VERSION" - page.should have_content ".gitignore" - page.should have_content "LICENSE" - end - - step 'I should see files from repository for "6d39438"' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "6d39438") - page.should have_content ".gitignore" - page.should have_content "LICENSE" - end - - step 'I see the ".gitignore"' do - page.should have_content '.gitignore' - end - - step 'I don\'t see the ".gitignore"' do - page.should_not have_content '.gitignore' - end - - step 'I click on ".gitignore" file in repo' do - click_link ".gitignore" - end - - step 'I should see its content' do - page.should have_content old_gitignore_content - end - - step 'I should see its new content' do - page.should have_content new_gitignore_content - end - - step 'I click link "Raw"' do - click_link 'Raw' - end - - step 'I should see raw file content' do - source.should == sample_blob.data - end - - step 'I click button "Edit"' do - click_link 'Edit' - end - - step 'I cannot see the edit button' do - page.should_not have_link 'edit' - end - - step 'The edit button is disabled' do - page.should have_css '.disabled', text: 'Edit' - end - - step 'I can edit code' do - set_new_content - evaluate_script('blob.editor.getValue()').should == new_gitignore_content - end - - step 'I edit code' do - set_new_content - end - - step 'I fill the new file name' do - fill_in :file_name, with: new_file_name - end - - step 'I fill the new branch name' do - fill_in :new_branch, with: 'new_branch_name' - end - - step 'I fill the new file name with an illegal name' do - fill_in :file_name, with: 'Spaces Not Allowed' - end - - step 'I fill the commit message' do - fill_in :commit_message, with: 'Not yet a commit message.' - end - - step 'I click link "Diff"' do - click_link 'Preview changes' - end - - step 'I click on "Commit Changes"' do - click_button 'Commit Changes' - end - - step 'I click on "Remove"' do - click_button 'Remove' - end - - step 'I click on "Remove file"' do - click_button 'Remove file' - end - - step 'I see diff' do - page.should have_css '.line_holder.new' - end - - step 'I click on "new file" link in repo' do - click_link 'new-file-link' - end - - step 'I can see new file page' do - page.should have_content "New file" - page.should have_content "Commit message" - end - - step 'I click on files directory' do - click_link 'files' - end - - step 'I click on History link' do - click_link 'History' - end - - step 'I see Browse dir link' do - page.should have_link 'Browse Dir »' - page.should_not have_link 'Browse Code »' - end - - step 'I click on readme file' do - within '.tree-table' do - click_link 'README.md' - end - end - - step 'I see Browse file link' do - page.should have_link 'Browse File »' - page.should_not have_link 'Browse Code »' - end - - step 'I see Browse code link' do - page.should have_link 'Browse Code »' - page.should_not have_link 'Browse File »' - page.should_not have_link 'Browse Dir »' - end - - step 'I click on Permalink' do - click_link 'Permalink' - end - - step 'I am redirected to the files URL' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, 'master') - end - - step 'I am redirected to the ".gitignore"' do - expect(current_path).to eq(namespace_project_blob_path(@project.namespace, @project, 'master/.gitignore')) - end - - step 'I am redirected to the ".gitignore" on new branch' do - expect(current_path).to eq(namespace_project_blob_path(@project.namespace, @project, 'new_branch_name/.gitignore')) - end - - step 'I am redirected to the permalink URL' do - expect(current_path).to( - eq(namespace_project_blob_path(@project.namespace, @project, - @project.repository.commit.sha + - '/.gitignore')) - ) - end - - step 'I am redirected to the new file' do - expect(current_path).to eq(namespace_project_blob_path( - @project.namespace, @project, 'master/' + new_file_name)) - end - - step 'I am redirected to the new file on new branch' do - expect(current_path).to eq(namespace_project_blob_path( - @project.namespace, @project, 'new_branch_name/' + new_file_name)) - end - - step "I don't see the permalink link" do - expect(page).not_to have_link('permalink') - end - - step 'I see a commit error message' do - expect(page).to have_content('Your changes could not be committed') - end - - step 'I create bare repo' do - click_link 'Create empty bare repository' - end - - step 'I click on "add a file" link' do - click_link 'add a file' - - # Remove pre-receive hook so we can push without auth - FileUtils.rm_f(File.join(@project.repository.path, 'hooks', 'pre-receive')) - end - - private - - def set_new_content - execute_script("blob.editor.setValue('#{new_gitignore_content}')") - end - - # Content of the gitignore file on the seed repository. - def old_gitignore_content - '*.rbc' - end - - # Constant value that differs from the content - # of the gitignore of the seed repository. - def new_gitignore_content - old_gitignore_content + 'a' - end - - # Constant value that is a valid filename and - # not a filename present at root of the seed repository. - def new_file_name - 'not_a_file.md' - end -end diff --git a/features/steps/project/source/git_blame.rb b/features/steps/project/source/git_blame.rb deleted file mode 100644 index e29a816c51b..00000000000 --- a/features/steps/project/source/git_blame.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Spinach::Features::ProjectSourceGitBlame < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I click on ".gitignore" file in repo' do - click_link ".gitignore" - end - - step 'I click Blame button' do - click_link 'Blame' - end - - step 'I should see git file blame' do - page.should have_content "*.rb" - page.should have_content "Dmitriy Zaporozhets" - page.should have_content "Initial commit" - end -end diff --git a/features/steps/project/source/markdown_render.rb b/features/steps/project/source/markdown_render.rb deleted file mode 100644 index 7961fdedad8..00000000000 --- a/features/steps/project/source/markdown_render.rb +++ /dev/null @@ -1,288 +0,0 @@ -# If you need to modify the existing seed repository for your tests, -# it is recommended that you make the changes on the `markdown` branch of the seed project repository, -# which should only be used by tests in this file. See `/spec/factories.rb#project` for more info. -class Spinach::Features::ProjectSourceMarkdownRender < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedMarkdown - - step 'I own project "Delta"' do - @project = Project.find_by(name: "Delta") - @project ||= create(:project, name: "Delta", namespace: @user.namespace) - @project.team << [@user, :master] - end - - step 'I should see files from repository in markdown' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown") - page.should have_content "README.md" - page.should have_content "CHANGELOG" - end - - step 'I should see rendered README which contains correct links' do - page.should have_content "Welcome to GitLab GitLab is a free project and repository management application" - page.should have_link "GitLab API doc" - page.should have_link "GitLab API website" - page.should have_link "Rake tasks" - page.should have_link "backup and restore procedure" - page.should have_link "GitLab API doc directory" - page.should have_link "Maintenance" - end - - step 'I click on Gitlab API in README' do - click_link "GitLab API doc" - end - - step 'I should see correct document rendered' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md") - page.should have_content "All API requests require authentication" - end - - step 'I click on Rake tasks in README' do - click_link "Rake tasks" - end - - step 'I should see correct directory rendered' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks") - page.should have_content "backup_restore.md" - page.should have_content "maintenance.md" - end - - step 'I click on GitLab API doc directory in README' do - click_link "GitLab API doc directory" - end - - step 'I should see correct doc/api directory rendered' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api") - page.should have_content "README.md" - page.should have_content "users.md" - end - - step 'I click on Maintenance in README' do - click_link "Maintenance" - end - - step 'I should see correct maintenance file rendered' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/raketasks/maintenance.md") - page.should have_content "bundle exec rake gitlab:env:info RAILS_ENV=production" - end - - step 'I click on link "empty" in the README' do - within('.readme-holder') do - click_link "empty" - end - end - - step 'I click on link "id" in the README' do - within('.readme-holder') do - click_link "#id" - end - end - - step 'I navigate to the doc/api/README' do - within '.tree-table' do - click_link "doc" - end - - within '.tree-table' do - click_link "api" - end - - within '.tree-table' do - click_link "README.md" - end - end - - step 'I see correct file rendered' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md") - page.should have_content "Contents" - page.should have_link "Users" - page.should have_link "Rake tasks" - end - - step 'I click on users in doc/api/README' do - click_link "Users" - end - - step 'I should see the correct document file' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md") - page.should have_content "Get a list of users." - end - - step 'I click on raketasks in doc/api/README' do - click_link "Rake tasks" - end - - # Markdown branch - - When 'I visit markdown branch' do - visit namespace_project_tree_path(@project.namespace, @project, "markdown") - end - - When 'I visit markdown branch "README.md" blob' do - visit namespace_project_blob_path(@project.namespace, @project, "markdown/README.md") - end - - When 'I visit markdown branch "d" tree' do - visit namespace_project_tree_path(@project.namespace, @project, "markdown/d") - end - - When 'I visit markdown branch "d/README.md" blob' do - visit namespace_project_blob_path(@project.namespace, @project, "markdown/d/README.md") - end - - step 'I should see files from repository in markdown branch' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown") - page.should have_content "README.md" - page.should have_content "CHANGELOG" - end - - step 'I see correct file rendered in markdown branch' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md") - page.should have_content "Contents" - page.should have_link "Users" - page.should have_link "Rake tasks" - end - - step 'I should see correct document rendered for markdown branch' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/README.md") - page.should have_content "All API requests require authentication" - end - - step 'I should see correct directory rendered for markdown branch' do - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/raketasks") - page.should have_content "backup_restore.md" - page.should have_content "maintenance.md" - end - - step 'I should see the users document file in markdown branch' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md") - page.should have_content "Get a list of users." - end - - # Expected link contents - - step 'The link with text "empty" should have url "tree/markdown"' do - find('a', text: /^empty$/)['href'] == current_host + namespace_project_tree_path(@project.namespace, @project, "markdown") - end - - step 'The link with text "empty" should have url "blob/markdown/README.md"' do - find('a', text: /^empty$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "markdown/README.md") - end - - step 'The link with text "empty" should have url "tree/markdown/d"' do - find('a', text: /^empty$/)['href'] == current_host + namespace_project_tree_path(@project.namespace, @project, "markdown/d") - end - - step 'The link with text "empty" should have '\ - 'url "blob/markdown/d/README.md"' do - find('a', text: /^empty$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "markdown/d/README.md") - end - - step 'The link with text "ID" should have url "tree/markdownID"' do - find('a', text: /^#id$/)['href'] == current_host + namespace_project_tree_path(@project.namespace, @project, "markdown") + '#id' - end - - step 'The link with text "/ID" should have url "tree/markdownID"' do - find('a', text: /^\/#id$/)['href'] == current_host + namespace_project_tree_path(@project.namespace, @project, "markdown") + '#id' - end - - step 'The link with text "README.mdID" '\ - 'should have url "blob/markdown/README.mdID"' do - find('a', text: /^README.md#id$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "markdown/README.md") + '#id' - end - - step 'The link with text "d/README.mdID" should have '\ - 'url "blob/markdown/d/README.mdID"' do - find('a', text: /^d\/README.md#id$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "d/markdown/README.md") + '#id' - end - - step 'The link with text "ID" should have url "blob/markdown/README.mdID"' do - find('a', text: /^#id$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "markdown/README.md") + '#id' - end - - step 'The link with text "/ID" should have url "blob/markdown/README.mdID"' do - find('a', text: /^\/#id$/)['href'] == current_host + namespace_project_blob_path(@project.namespace, @project, "markdown/README.md") + '#id' - end - - # Wiki - - step 'I go to wiki page' do - click_link "Wiki" - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home") - end - - step 'I add various links to the wiki page' do - fill_in "wiki[content]", with: "[test](test)\n[GitLab API doc](api)\n[Rake tasks](raketasks)\n" - fill_in "wiki[message]", with: "Adding links to wiki" - click_button "Create page" - end - - step 'Wiki page should have added links' do - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home") - page.should have_content "test GitLab API doc Rake tasks" - end - - step 'I add a header to the wiki page' do - fill_in "wiki[content]", with: "# Wiki header\n" - fill_in "wiki[message]", with: "Add header to wiki" - click_button "Create page" - end - - step 'Wiki header should have correct id and link' do - header_should_have_correct_id_and_link(1, 'Wiki header', 'wiki-header') - end - - step 'I click on test link' do - click_link "test" - end - - step 'I see new wiki page named test' do - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "test") - page.should have_content "Editing" - end - - When 'I go back to wiki page home' do - visit namespace_project_wiki_path(@project.namespace, @project, "home") - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "home") - end - - step 'I click on GitLab API doc link' do - click_link "GitLab API" - end - - step 'I see Gitlab API document' do - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "api") - page.should have_content "Editing" - end - - step 'I click on Rake tasks link' do - click_link "Rake tasks" - end - - step 'I see Rake tasks directory' do - current_path.should == namespace_project_wiki_path(@project.namespace, @project, "raketasks") - page.should have_content "Editing" - end - - step 'I go directory which contains README file' do - visit namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api") - current_path.should == namespace_project_tree_path(@project.namespace, @project, "markdown/doc/api") - end - - step 'I click on a relative link in README' do - click_link "Users" - end - - step 'I should see the correct markdown' do - current_path.should == namespace_project_blob_path(@project.namespace, @project, "markdown/doc/api/users.md") - page.should have_content "List users" - end - - step 'Header "Application details" should have correct id and link' do - header_should_have_correct_id_and_link(2, 'Application details', 'application-details') - end - - step 'Header "GitLab API" should have correct id and link' do - header_should_have_correct_id_and_link(1, 'GitLab API', 'gitlab-api') - end -end diff --git a/features/steps/project/source/multiselect_blob.rb b/features/steps/project/source/multiselect_blob.rb deleted file mode 100644 index b749ba49371..00000000000 --- a/features/steps/project/source/multiselect_blob.rb +++ /dev/null @@ -1,58 +0,0 @@ -class Spinach::Features::ProjectSourceMultiselectBlob < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - class << self - def click_line_steps(*line_numbers) - line_numbers.each do |line_number| - step "I click line #{line_number} in file" do - find("#L#{line_number}").click - end - - step "I shift-click line #{line_number} in file" do - script = "$('#L#{line_number}').trigger($.Event('click', { shiftKey: true }));" - execute_script(script) - end - end - end - - def check_state_steps(*ranges) - ranges.each do |range| - fragment = range.kind_of?(Array) ? "L#{range.first}-#{range.last}" : "L#{range}" - pluralization = range.kind_of?(Array) ? "s" : "" - - step "I should see \"#{fragment}\" as URI fragment" do - URI.parse(current_url).fragment.should == fragment - end - - step "I should see line#{pluralization} #{fragment[1..-1]} highlighted" do - ids = Array(range).map { |n| "LC#{n}" } - extra = false - - highlighted = all("#tree-content-holder .highlight .line.hll") - highlighted.each do |element| - extra ||= ids.delete(element[:id]).nil? - end - - extra.should be_false and ids.should be_empty - end - end - end - end - - click_line_steps *Array(1..5) - check_state_steps *Array(1..5), Array(1..2), Array(1..3), Array(1..4), Array(1..5), Array(3..5) - - step 'I go back in history' do - go_back - end - - step 'I go forward in history' do - go_forward - end - - step 'I click on ".gitignore" file in repo' do - click_link ".gitignore" - end -end diff --git a/features/steps/project/source/search_code.rb b/features/steps/project/source/search_code.rb deleted file mode 100644 index 9c2864cc936..00000000000 --- a/features/steps/project/source/search_code.rb +++ /dev/null @@ -1,19 +0,0 @@ -class Spinach::Features::ProjectSourceSearchCode < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - - step 'I search for term "coffee"' do - fill_in "search", with: "coffee" - click_button "Go" - end - - step 'I should see files from repository containing "coffee"' do - page.should have_content 'coffee' - page.should have_content 'CONTRIBUTING.md' - end - - step 'I should see empty result' do - page.should have_content "We couldn't find any matching" - end -end diff --git a/features/steps/project/star.rb b/features/steps/project/star.rb deleted file mode 100644 index 50cdfd73c34..00000000000 --- a/features/steps/project/star.rb +++ /dev/null @@ -1,37 +0,0 @@ -class Spinach::Features::ProjectStar < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include SharedUser - - step "The project has no stars" do - page.should_not have_content '.star-buttons' - end - - step "The project has 0 stars" do - has_n_stars(0) - end - - step "The project has 1 star" do - has_n_stars(1) - end - - step "The project has 2 stars" do - has_n_stars(2) - end - - # Requires @javascript - step "I click on the star toggle button" do - find(".star-btn", visible: true).click - end - - step 'I redirected to sign in page' do - current_path.should == new_user_session_path - end - - protected - - def has_n_stars(n) - expect(page).to have_css(".star-btn .count", text: n, visible: true) - end -end diff --git a/features/steps/project/team_management.rb b/features/steps/project/team_management.rb deleted file mode 100644 index e95621071c4..00000000000 --- a/features/steps/project/team_management.rb +++ /dev/null @@ -1,130 +0,0 @@ -class Spinach::Features::ProjectTeamManagement < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedPaths - include Select2Helper - - step 'I should be able to see myself in team' do - page.should have_content(@user.name) - page.should have_content(@user.username) - end - - step 'I should see "Sam" in team list' do - user = User.find_by(name: "Sam") - page.should have_content(user.name) - page.should have_content(user.username) - end - - step 'I click link "Add members"' do - find(:css, 'button.btn-new').click - end - - step 'I select "Mike" as "Reporter"' do - user = User.find_by(name: "Mike") - - within ".users-project-form" do - select2(user.id, from: "#user_ids", multiple: true) - select "Reporter", from: "access_level" - end - click_button "Add users to project" - end - - step 'I should see "Mike" in team list as "Reporter"' do - within ".access-reporter" do - page.should have_content('Mike') - end - end - - step 'I select "sjobs@apple.com" as "Reporter"' do - within ".users-project-form" do - select2("sjobs@apple.com", from: "#user_ids", multiple: true) - select "Reporter", from: "access_level" - end - click_button "Add users to project" - end - - step 'I should see "sjobs@apple.com" in team list as invited "Reporter"' do - within ".access-reporter" do - page.should have_content('sjobs@apple.com') - page.should have_content('invited') - page.should have_content('Reporter') - end - end - - step 'I should see "Sam" in team list as "Developer"' do - within ".access-developer" do - page.should have_content('Sam') - end - end - - step 'I change "Sam" role to "Reporter"' do - project = Project.find_by(name: "Shop") - user = User.find_by(name: 'Sam') - project_member = project.project_members.find_by(user_id: user.id) - within "#project_member_#{project_member.id}" do - click_button "Edit access level" - select "Reporter", from: "project_member_access_level" - click_button "Save" - end - end - - step 'I should see "Sam" in team list as "Reporter"' do - within ".access-reporter" do - page.should have_content('Sam') - end - end - - step 'I click link "Remove from team"' do - click_link "Remove from team" - end - - step 'I should not see "Sam" in team list' do - user = User.find_by(name: "Sam") - page.should_not have_content(user.name) - page.should_not have_content(user.username) - end - - step 'gitlab user "Mike"' do - create(:user, name: "Mike") - end - - step 'gitlab user "Sam"' do - create(:user, name: "Sam") - end - - step '"Sam" is "Shop" developer' do - user = User.find_by(name: "Sam") - project = Project.find_by(name: "Shop") - project.team << [user, :developer] - end - - step 'I own project "Website"' do - @project = create(:empty_project, name: "Website", namespace: @user.namespace) - @project.team << [@user, :master] - end - - step '"Mike" is "Website" reporter' do - user = User.find_by(name: "Mike") - project = Project.find_by(name: "Website") - project.team << [user, :reporter] - end - - step 'I click link "Import team from another project"' do - click_link "Import members from another project" - end - - When 'I submit "Website" project for import team' do - project = Project.find_by(name: "Website") - select project.name_with_namespace, from: 'source_project_id' - click_button 'Import' - end - - step 'I click cancel link for "Sam"' do - project = Project.find_by(name: "Shop") - user = User.find_by(name: 'Sam') - project_member = project.project_members.find_by(user_id: user.id) - within "#project_member_#{project_member.id}" do - click_link('Remove user from team') - end - end -end diff --git a/features/steps/project/wiki.rb b/features/steps/project/wiki.rb deleted file mode 100644 index bb93e582a1f..00000000000 --- a/features/steps/project/wiki.rb +++ /dev/null @@ -1,165 +0,0 @@ -class Spinach::Features::ProjectWiki < Spinach::FeatureSteps - include SharedAuthentication - include SharedProject - include SharedNote - include SharedPaths - include WikiHelper - - step 'I click on the Cancel button' do - within(:css, ".form-actions") do - click_on "Cancel" - end - end - - step 'I should be redirected back to the Edit Home Wiki page' do - current_path.should == namespace_project_wiki_path(project.namespace, project, :home) - end - - step 'I create the Wiki Home page' do - fill_in "wiki_content", with: '[link test](test)' - click_on "Create page" - end - - step 'I should see the newly created wiki page' do - page.should have_content "Home" - page.should have_content "link test" - - click_link "link test" - page.should have_content "Editing" - end - - step 'I have an existing Wiki page' do - wiki.create_page("existing", "content", :markdown, "first commit") - @page = wiki.find_page("existing") - end - - step 'I browse to that Wiki page' do - visit namespace_project_wiki_path(project.namespace, project, @page) - end - - step 'I click on the Edit button' do - click_on "Edit" - end - - step 'I change the content' do - fill_in "Content", with: 'Updated Wiki Content' - click_on "Save changes" - end - - step 'I should see the updated content' do - page.should have_content "Updated Wiki Content" - end - - step 'I should be redirected back to that Wiki page' do - current_path.should == namespace_project_wiki_path(project.namespace, project, @page) - end - - step 'That page has two revisions' do - @page.update("new content", :markdown, "second commit") - end - - step 'I click the History button' do - click_on "History" - end - - step 'I should see both revisions' do - page.should have_content current_user.name - page.should have_content "first commit" - page.should have_content "second commit" - end - - step 'I click on the "Delete this page" button' do - click_on "Delete this page" - end - - step 'The page should be deleted' do - page.should have_content "Page was successfully deleted" - end - - step 'I click on the "Pages" button' do - click_on "Pages" - end - - step 'I should see the existing page in the pages list' do - page.should have_content current_user.name - page.should have_content @page.title - end - - step 'I have an existing Wiki page with images linked on page' do - wiki.create_page("pictures", "Look at this [image](image.jpg)\n\n ![image](image.jpg)", :markdown, "first commit") - @wiki_page = wiki.find_page("pictures") - end - - step 'I browse to wiki page with images' do - visit namespace_project_wiki_path(project.namespace, project, @wiki_page) - end - - step 'I click on existing image link' do - file = Gollum::File.new(wiki.wiki) - Gollum::Wiki.any_instance.stub(:file).with("image.jpg", "master", true).and_return(file) - Gollum::File.any_instance.stub(:mime_type).and_return("image/jpeg") - page.should have_link('image', href: "image.jpg") - click_on "image" - end - - step 'I should see the image from wiki repo' do - current_path.should match('wikis/image.jpg') - page.should_not have_xpath('/html') # Page should render the image which means there is no html involved - Gollum::Wiki.any_instance.unstub(:file) - Gollum::File.any_instance.unstub(:mime_type) - end - - step 'Image should be shown on the page' do - page.should have_xpath("//img[@src=\"image.jpg\"]") - end - - step 'I click on image link' do - page.should have_link('image', href: "image.jpg") - click_on "image" - end - - step 'I should see the new wiki page form' do - current_path.should match('wikis/image.jpg') - page.should have_content('New Wiki Page') - page.should have_content('Editing - image.jpg') - end - - step 'I create a New page with paths' do - click_on 'New Page' - fill_in 'Page slug', with: 'one/two/three' - click_on 'Build' - fill_in "wiki_content", with: 'wiki content' - click_on "Create page" - current_path.should include 'one/two/three' - end - - step 'I should see non-escaped link in the pages list' do - page.should have_xpath("//a[@href='/#{project.path_with_namespace}/wikis/one/two/three']") - end - - step 'I edit the Wiki page with a path' do - click_on 'three' - click_on 'Edit' - end - - step 'I should see a non-escaped path' do - current_path.should include 'one/two/three' - end - - step 'I should see the Editing page' do - page.should have_content('Editing') - end - - step 'I view the page history of a Wiki page that has a path' do - click_on 'three' - click_on 'Page History' - end - - step 'I should see the page history' do - page.should have_content('History for') - end - - def wiki - @project_wiki = ProjectWiki.new(project, current_user) - end -end diff --git a/features/steps/search.rb b/features/steps/search.rb deleted file mode 100644 index 6f0e038c4d6..00000000000 --- a/features/steps/search.rb +++ /dev/null @@ -1,69 +0,0 @@ -class Spinach::Features::Search < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - - step 'I search for "Sho"' do - fill_in "dashboard_search", with: "Sho" - click_button "Search" - end - - step 'I search for "Foo"' do - fill_in "dashboard_search", with: "Foo" - click_button "Search" - end - - step 'I search for "rspec"' do - fill_in "dashboard_search", with: "rspec" - click_button "Search" - end - - step 'I click "Issues" link' do - within '.search-filter' do - click_link 'Issues' - end - end - - step 'I click project "Shop" link' do - within '.project-filter' do - click_link project.name_with_namespace - end - end - - step 'I click "Merge requests" link' do - within '.search-filter' do - click_link 'Merge requests' - end - end - - step 'I should see "Shop" project link' do - page.should have_link "Shop" - end - - step 'I should see code results for project "Shop"' do - page.should have_content 'Update capybara, rspec-rails, poltergeist to recent versions' - end - - step 'I search for "Contibuting"' do - fill_in "dashboard_search", with: "Contibuting" - click_button "Search" - end - - step 'project has issues' do - create(:issue, title: "Foo", project: project) - create(:issue, title: "Bar", project: project) - end - - step 'project has merge requests' do - create(:merge_request, title: "Foo", source_project: project, target_project: project) - create(:merge_request, :simple, title: "Bar", source_project: project, target_project: project) - end - - step 'I should see "Foo" link in the search results' do - find(:css, '.search-results').should have_link 'Foo' - end - - step 'I should not see "Bar" link in the search results' do - find(:css, '.search-results').should_not have_link 'Bar' - end -end diff --git a/features/steps/shared/active_tab.rb b/features/steps/shared/active_tab.rb deleted file mode 100644 index 9beb688bd16..00000000000 --- a/features/steps/shared/active_tab.rb +++ /dev/null @@ -1,47 +0,0 @@ -module SharedActiveTab - include Spinach::DSL - - def ensure_active_main_tab(content) - find('.nav-sidebar > li.active').should have_content(content) - end - - def ensure_active_sub_tab(content) - find('div.content ul.nav-tabs li.active').should have_content(content) - end - - def ensure_active_sub_nav(content) - find('.sidebar-subnav > li.active').should have_content(content) - end - - step 'no other main tabs should be active' do - page.should have_selector('.nav-sidebar > li.active', count: 1) - end - - step 'no other sub tabs should be active' do - page.should have_selector('div.content ul.nav-tabs li.active', count: 1) - end - - step 'no other sub navs should be active' do - page.should have_selector('.sidebar-subnav > li.active', count: 1) - end - - step 'the active main tab should be Home' do - ensure_active_main_tab('Your Projects') - end - - step 'the active main tab should be Projects' do - ensure_active_main_tab('Projects') - end - - step 'the active main tab should be Issues' do - ensure_active_main_tab('Issues') - end - - step 'the active main tab should be Merge Requests' do - ensure_active_main_tab('Merge Requests') - end - - step 'the active main tab should be Help' do - ensure_active_main_tab('Help') - end -end diff --git a/features/steps/shared/admin.rb b/features/steps/shared/admin.rb deleted file mode 100644 index b6072995677..00000000000 --- a/features/steps/shared/admin.rb +++ /dev/null @@ -1,12 +0,0 @@ -module SharedAdmin - include Spinach::DSL - - step 'there are projects in system' do - 2.times { create(:project) } - end - - step 'system has users' do - 2.times { create(:user) } - end -end - diff --git a/features/steps/shared/authentication.rb b/features/steps/shared/authentication.rb deleted file mode 100644 index ac8a3df6bb9..00000000000 --- a/features/steps/shared/authentication.rb +++ /dev/null @@ -1,34 +0,0 @@ -require Rails.root.join('spec', 'support', 'login_helpers') - -module SharedAuthentication - include Spinach::DSL - include LoginHelpers - - step 'I sign in as a user' do - login_as :user - end - - step 'I sign in as an admin' do - login_as :admin - end - - step 'I sign in as "John Doe"' do - login_with(user_exists("John Doe")) - end - - step 'I sign in as "Mary Jane"' do - login_with(user_exists("Mary Jane")) - end - - step 'I should be redirected to sign in page' do - current_path.should == new_user_session_path - end - - step "I logout" do - logout - end - - def current_user - @user || User.first - end -end diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb deleted file mode 100644 index 510e0f0f938..00000000000 --- a/features/steps/shared/diff_note.rb +++ /dev/null @@ -1,167 +0,0 @@ -module SharedDiffNote - include Spinach::DSL - include RepoHelpers - - step 'I cancel the diff comment' do - within(diff_file_selector) do - find(".js-close-discussion-note-form").click - end - end - - step 'I delete a diff comment' do - find('.note').hover - find(".js-note-delete").click - end - - step 'I haven\'t written any diff comment text' do - within(diff_file_selector) do - fill_in "note[note]", with: "" - end - end - - step 'I leave a diff comment like "Typo, please fix"' do - click_diff_line(sample_commit.line_code) - within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do - fill_in "note[note]", with: "Typo, please fix" - find(".js-comment-button").trigger("click") - sleep 0.05 - end - end - - step 'I preview a diff comment text like "Should fix it :smile:"' do - click_diff_line(sample_commit.line_code) - within("#{diff_file_selector} form[rel$='#{sample_commit.line_code}']") do - fill_in "note[note]", with: "Should fix it :smile:" - find('.js-md-preview-button').click - end - end - - step 'I preview another diff comment text like "DRY this up"' do - click_diff_line(sample_commit.del_line_code) - - within("#{diff_file_selector} form[rel$='#{sample_commit.del_line_code}']") do - fill_in "note[note]", with: "DRY this up" - find('.js-md-preview-button').click - end - end - - step 'I open a diff comment form' do - click_diff_line(sample_commit.line_code) - end - - step 'I open another diff comment form' do - click_diff_line(sample_commit.del_line_code) - end - - step 'I write a diff comment like ":-1: I don\'t like this"' do - within(diff_file_selector) do - fill_in "note[note]", with: ":-1: I don\'t like this" - end - end - - step 'I submit the diff comment' do - within(diff_file_selector) do - click_button("Add Comment") - end - end - - step 'I should not see the diff comment form' do - within(diff_file_selector) do - page.should_not have_css("form.new_note") - end - end - - step 'The diff comment preview tab should say there is nothing to do' do - within(diff_file_selector) do - find('.js-md-preview-button').click - expect(find('.js-md-preview')).to have_content('Nothing to preview.') - end - end - - step 'I should not see the diff comment text field' do - within(diff_file_selector) do - expect(find('.js-note-text')).not_to be_visible - end - end - - step 'I should only see one diff form' do - within(diff_file_selector) do - page.should have_css("form.new_note", count: 1) - end - end - - step 'I should see a diff comment form with ":-1: I don\'t like this"' do - within(diff_file_selector) do - page.should have_field("note[note]", with: ":-1: I don\'t like this") - end - end - - step 'I should see a diff comment saying "Typo, please fix"' do - within("#{diff_file_selector} .note") do - page.should have_content("Typo, please fix") - end - end - - step 'I should see a discussion reply button' do - within(diff_file_selector) do - page.should have_button('Reply') - end - end - - step 'I should see a temporary diff comment form' do - within(diff_file_selector) do - page.should have_css(".js-temp-notes-holder form.new_note") - end - end - - step 'I should see add a diff comment button' do - page.should have_css('.js-add-diff-note-button', visible: true) - end - - step 'I should see an empty diff comment form' do - within(diff_file_selector) do - page.should have_field("note[note]", with: "") - end - end - - step 'I should see the cancel comment button' do - within("#{diff_file_selector} form") do - page.should have_css(".js-close-discussion-note-form", text: "Cancel") - end - end - - step 'I should see the diff comment preview' do - within("#{diff_file_selector} form") do - expect(page).to have_css('.js-md-preview', visible: true) - end - end - - step 'I should see the diff comment write tab' do - within(diff_file_selector) do - expect(page).to have_css('.js-md-write-button', visible: true) - end - end - - step 'The diff comment preview tab should display rendered Markdown' do - within(diff_file_selector) do - find('.js-md-preview-button').click - expect(find('.js-md-preview')).to have_css('img.emoji', visible: true) - end - end - - step 'I should see two separate previews' do - within(diff_file_selector) do - expect(page).to have_css('.js-md-preview', visible: true, count: 2) - expect(page).to have_content('Should fix it') - expect(page).to have_content('DRY this up') - end - end - - def diff_file_selector - ".diff-file:nth-of-type(1)" - end - - def click_diff_line(code) - find("button[data-line-code='#{code}']").click - end -end diff --git a/features/steps/shared/group.rb b/features/steps/shared/group.rb deleted file mode 100644 index 1b225dd61a6..00000000000 --- a/features/steps/shared/group.rb +++ /dev/null @@ -1,44 +0,0 @@ -module SharedGroup - include Spinach::DSL - - step '"John Doe" is owner of group "Owned"' do - is_member_of("John Doe", "Owned", Gitlab::Access::OWNER) - end - - step '"John Doe" is guest of group "Guest"' do - is_member_of("John Doe", "Guest", Gitlab::Access::GUEST) - end - - step '"Mary Jane" is owner of group "Owned"' do - is_member_of("Mary Jane", "Owned", Gitlab::Access::OWNER) - end - - step '"Mary Jane" is guest of group "Owned"' do - is_member_of("Mary Jane", "Owned", Gitlab::Access::GUEST) - end - - step '"Mary Jane" is guest of group "Guest"' do - is_member_of("Mary Jane", "Guest", Gitlab::Access::GUEST) - end - - step 'I should see group "TestGroup"' do - page.should have_content "TestGroup" - end - - step 'I should not see group "TestGroup"' do - page.should_not have_content "TestGroup" - end - - protected - - def is_member_of(username, groupname, role) - @project_count ||= 0 - user = User.find_by(name: username) || create(:user, name: username) - group = Group.find_by(name: groupname) || create(:group, name: groupname) - group.add_user(user, role) - project ||= create(:project, namespace: group, path: "project#{@project_count}") - event ||= create(:closed_issue_event, project: project) - project.team << [user, :master] - @project_count += 1 - end -end diff --git a/features/steps/shared/issuable.rb b/features/steps/shared/issuable.rb deleted file mode 100644 index 41db2612f26..00000000000 --- a/features/steps/shared/issuable.rb +++ /dev/null @@ -1,15 +0,0 @@ -module SharedIssuable - include Spinach::DSL - - def edit_issuable - find(:css, '.issuable-edit').click - end - - step 'I click link "Edit" for the merge request' do - edit_issuable - end - - step 'I click link "Edit" for the issue' do - edit_issuable - end -end diff --git a/features/steps/shared/markdown.rb b/features/steps/shared/markdown.rb deleted file mode 100644 index e71700880cd..00000000000 --- a/features/steps/shared/markdown.rb +++ /dev/null @@ -1,102 +0,0 @@ -module SharedMarkdown - include Spinach::DSL - - def header_should_have_correct_id_and_link(level, text, id, parent = ".wiki") - find(:css, "#{parent} h#{level}##{id}").text.should == text - find(:css, "#{parent} h#{level}##{id} > :last-child")[:href].should =~ /##{id}$/ - end - - def create_taskable(type, title) - desc_text = < .note-text") do - page.should have_content("Comment with a header") - page.should_not have_css("#comment-with-a-header") - end - end - - step 'I leave a comment with task markdown' do - within('.js-main-target-form') do - fill_in 'note[note]', with: '* [x] Task item' - click_button 'Add Comment' - sleep 0.05 - end - end - - step 'I should not see task checkboxes in the comment' do - expect(page).not_to have_selector( - 'li.note div.timeline-content input[type="checkbox"]' - ) - end - - step 'I edit the last comment with a +1' do - find(".note").hover - find('.js-note-edit').click - - within(".current-note-edit-form") do - fill_in 'note[note]', with: '+1 Awesome!' - click_button 'Save Comment' - sleep 0.05 - end - end - - step 'I should see +1 in the description' do - within(".note") do - page.should have_content("+1 Awesome!") - end - end -end diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb deleted file mode 100644 index e3cf1b92cda..00000000000 --- a/features/steps/shared/paths.rb +++ /dev/null @@ -1,480 +0,0 @@ -module SharedPaths - include Spinach::DSL - include RepoHelpers - include DashboardHelper - - step 'I visit new project page' do - visit new_project_path - end - - # ---------------------------------------- - # User - # ---------------------------------------- - - step 'I visit user "John Doe" page' do - visit user_path("john_doe") - end - - # ---------------------------------------- - # Group - # ---------------------------------------- - - step 'I visit group "Owned" page' do - visit group_path(Group.find_by(name:"Owned")) - end - - step 'I visit group "Owned" issues page' do - visit issues_group_path(Group.find_by(name:"Owned")) - end - - step 'I visit group "Owned" merge requests page' do - visit merge_requests_group_path(Group.find_by(name:"Owned")) - end - - step 'I visit group "Owned" members page' do - visit group_group_members_path(Group.find_by(name:"Owned")) - end - - step 'I visit group "Owned" settings page' do - visit edit_group_path(Group.find_by(name:"Owned")) - end - - step 'I visit group "Guest" page' do - visit group_path(Group.find_by(name:"Guest")) - end - - step 'I visit group "Guest" issues page' do - visit issues_group_path(Group.find_by(name:"Guest")) - end - - step 'I visit group "Guest" merge requests page' do - visit merge_requests_group_path(Group.find_by(name:"Guest")) - end - - step 'I visit group "Guest" members page' do - visit group_group_members_path(Group.find_by(name:"Guest")) - end - - step 'I visit group "Guest" settings page' do - visit edit_group_path(Group.find_by(name:"Guest")) - end - - # ---------------------------------------- - # Dashboard - # ---------------------------------------- - - step 'I visit dashboard page' do - visit dashboard_path - end - - step 'I visit dashboard projects page' do - visit projects_dashboard_path - end - - step 'I visit dashboard issues page' do - visit assigned_issues_dashboard_path - end - - step 'I visit dashboard merge requests page' do - visit assigned_mrs_dashboard_path - end - - step 'I visit dashboard search page' do - visit search_path - end - - step 'I visit dashboard help page' do - visit help_path - end - - step 'I visit dashboard groups page' do - visit dashboard_groups_path - end - - step 'I should be redirected to the dashboard groups page' do - current_path.should == dashboard_groups_path - end - - step 'I visit dashboard starred projects page' do - visit starred_dashboard_projects_path - end - - # ---------------------------------------- - # Profile - # ---------------------------------------- - - step 'I visit profile page' do - visit profile_path - end - - step 'I visit profile applications page' do - visit applications_profile_path - end - - step 'I visit profile password page' do - visit edit_profile_password_path - end - - step 'I visit profile account page' do - visit profile_account_path - end - - step 'I visit profile SSH keys page' do - visit profile_keys_path - end - - step 'I visit profile design page' do - visit design_profile_path - end - - step 'I visit profile history page' do - visit history_profile_path - end - - # ---------------------------------------- - # Admin - # ---------------------------------------- - - step 'I visit admin page' do - visit admin_root_path - end - - step 'I visit admin projects page' do - visit admin_namespaces_projects_path - end - - step 'I visit admin users page' do - visit admin_users_path - end - - step 'I visit admin logs page' do - visit admin_logs_path - end - - step 'I visit admin messages page' do - visit admin_broadcast_messages_path - end - - step 'I visit admin hooks page' do - visit admin_hooks_path - end - - step 'I visit admin Resque page' do - visit admin_background_jobs_path - end - - step 'I visit admin groups page' do - visit admin_groups_path - end - - step 'I visit admin teams page' do - visit admin_teams_path - end - - step 'I visit admin settings page' do - visit admin_application_settings_path - end - - step 'I visit applications page' do - visit admin_applications_path - end - - # ---------------------------------------- - # Generic Project - # ---------------------------------------- - - step "I visit my project's home page" do - visit namespace_project_path(@project.namespace, @project) - end - - step "I visit my project's settings page" do - visit edit_namespace_project_path(@project.namespace, @project) - end - - step "I visit my project's files page" do - visit namespace_project_tree_path(@project.namespace, @project, root_ref) - end - - step 'I visit a binary file in the repo' do - visit namespace_project_blob_path(@project.namespace, @project, File.join( - root_ref, 'files/images/logo-black.png')) - end - - step "I visit my project's commits page" do - visit namespace_project_commits_path(@project.namespace, @project, root_ref, {limit: 5}) - end - - step "I visit my project's commits page for a specific path" do - visit namespace_project_commits_path(@project.namespace, @project, root_ref + "/app/models/project.rb", {limit: 5}) - end - - step 'I visit my project\'s commits stats page' do - visit stats_namespace_project_repository_path(@project.namespace, @project) - end - - step "I visit my project's network page" do - # Stub Graph max_size to speed up test (10 commits vs. 650) - Network::Graph.stub(max_count: 10) - - visit namespace_project_network_path(@project.namespace, @project, root_ref) - end - - step "I visit my project's issues page" do - visit namespace_project_issues_path(@project.namespace, @project) - end - - step "I visit my project's merge requests page" do - visit namespace_project_merge_requests_path(@project.namespace, @project) - end - - step "I visit my project's wiki page" do - visit namespace_project_wiki_path(@project.namespace, @project, :home) - end - - step 'I visit project hooks page' do - visit namespace_project_hooks_path(@project.namespace, @project) - end - - step 'I visit project deploy keys page' do - visit namespace_project_deploy_keys_path(@project.namespace, @project) - end - - # ---------------------------------------- - # "Shop" Project - # ---------------------------------------- - - step 'I visit project "Shop" page' do - visit namespace_project_path(project.namespace, project) - end - - step 'I visit project "Forked Shop" merge requests page' do - visit namespace_project_merge_requests_path(@forked_project.namespace, @forked_project) - end - - step 'I visit edit project "Shop" page' do - visit edit_namespace_project_path(project.namespace, project) - end - - step 'I visit project branches page' do - visit namespace_project_branches_path(@project.namespace, @project) - end - - step 'I visit project protected branches page' do - visit namespace_project_protected_branches_path(@project.namespace, @project) - end - - step 'I visit compare refs page' do - visit namespace_project_compare_index_path(@project.namespace, @project) - end - - step 'I visit project commits page' do - visit namespace_project_commits_path(@project.namespace, @project, root_ref, {limit: 5}) - end - - step 'I visit project commits page for stable branch' do - visit namespace_project_commits_path(@project.namespace, @project, 'stable', {limit: 5}) - end - - step 'I visit project source page' do - visit namespace_project_tree_path(@project.namespace, @project, root_ref) - end - - step 'I visit blob file from repo' do - visit namespace_project_blob_path(@project.namespace, @project, File.join(sample_commit.id, sample_blob.path)) - end - - step 'I visit ".gitignore" file in repo' do - visit namespace_project_blob_path(@project.namespace, @project, File.join(root_ref, '.gitignore')) - end - - step 'I am on the new file page' do - current_path.should eq(namespace_project_create_blob_path(@project.namespace, @project, root_ref)) - end - - step 'I am on the ".gitignore" edit file page' do - current_path.should eq(namespace_project_edit_blob_path( - @project.namespace, @project, File.join(root_ref, '.gitignore'))) - end - - step 'I visit project source page for "6d39438"' do - visit namespace_project_tree_path(@project.namespace, @project, "6d39438") - end - - step 'I visit project source page for' \ - ' "6d394385cf567f80a8fd85055db1ab4c5295806f"' do - visit namespace_project_tree_path(@project.namespace, @project, - '6d394385cf567f80a8fd85055db1ab4c5295806f') - end - - step 'I visit project tags page' do - visit namespace_project_tags_path(@project.namespace, @project) - end - - step 'I visit project commit page' do - visit namespace_project_commit_path(@project.namespace, @project, sample_commit.id) - end - - step 'I visit project "Shop" issues page' do - visit namespace_project_issues_path(project.namespace, project) - end - - step 'I visit issue page "Release 0.4"' do - issue = Issue.find_by(title: "Release 0.4") - visit namespace_project_issue_path(issue.project.namespace, issue.project, issue) - end - - step 'I visit issue page "Tasks-open"' do - issue = Issue.find_by(title: 'Tasks-open') - visit namespace_project_issue_path(issue.project.namespace, issue.project, issue) - end - - step 'I visit issue page "Tasks-closed"' do - issue = Issue.find_by(title: 'Tasks-closed') - visit namespace_project_issue_path(issue.project.namespace, issue.project, issue) - end - - step 'I visit project "Shop" labels page' do - project = Project.find_by(name: 'Shop') - visit namespace_project_labels_path(project.namespace, project) - end - - step 'I visit project "Forum" labels page' do - project = Project.find_by(name: 'Forum') - visit namespace_project_labels_path(project.namespace, project) - end - - step 'I visit project "Shop" new label page' do - project = Project.find_by(name: 'Shop') - visit new_namespace_project_label_path(project.namespace, project) - end - - step 'I visit project "Forum" new label page' do - project = Project.find_by(name: 'Forum') - visit new_namespace_project_label_path(project.namespace, project) - end - - step 'I visit merge request page "Bug NS-04"' do - mr = MergeRequest.find_by(title: "Bug NS-04") - visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) - end - - step 'I visit merge request page "Bug NS-05"' do - mr = MergeRequest.find_by(title: "Bug NS-05") - visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) - end - - step 'I visit merge request page "MR-task-open"' do - mr = MergeRequest.find_by(title: 'MR-task-open') - visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) - end - - step 'I visit merge request page "MR-task-closed"' do - mr = MergeRequest.find_by(title: 'MR-task-closed') - visit namespace_project_merge_request_path(mr.target_project.namespace, mr.target_project, mr) - end - - step 'I visit project "Shop" merge requests page' do - visit namespace_project_merge_requests_path(project.namespace, project) - end - - step 'I visit forked project "Shop" merge requests page' do - visit namespace_project_merge_requests_path(project.namespace, project) - end - - step 'I visit project "Shop" milestones page' do - visit namespace_project_milestones_path(project.namespace, project) - end - - step 'I visit project "Shop" team page' do - visit namespace_project_project_members_path(project.namespace, project) - end - - step 'I visit project wiki page' do - visit namespace_project_wiki_path(@project.namespace, @project, :home) - end - - # ---------------------------------------- - # Visibility Projects - # ---------------------------------------- - - step 'I visit project "Community" page' do - project = Project.find_by(name: "Community") - visit namespace_project_path(project.namespace, project) - end - - step 'I visit project "Community" source page' do - project = Project.find_by(name: 'Community') - visit namespace_project_tree_path(project.namespace, project, root_ref) - end - - step 'I visit project "Internal" page' do - project = Project.find_by(name: "Internal") - visit namespace_project_path(project.namespace, project) - end - - step 'I visit project "Enterprise" page' do - project = Project.find_by(name: "Enterprise") - visit namespace_project_path(project.namespace, project) - end - - # ---------------------------------------- - # Empty Projects - # ---------------------------------------- - - step "I visit empty project page" do - project = Project.find_by(name: "Empty Public Project") - visit namespace_project_path(project.namespace, project) - end - - # ---------------------------------------- - # Public Projects - # ---------------------------------------- - - step 'I visit the public projects area' do - visit explore_projects_path - end - - step 'I visit the explore trending projects' do - visit trending_explore_projects_path - end - - step 'I visit the explore starred projects' do - visit starred_explore_projects_path - end - - step 'I visit the public groups area' do - visit explore_groups_path - end - - # ---------------------------------------- - # Snippets - # ---------------------------------------- - - step 'I visit project "Shop" snippets page' do - visit namespace_project_snippets_path(project.namespace, project) - end - - step 'I visit snippets page' do - visit snippets_path - end - - step 'I visit new snippet page' do - visit new_snippet_path - end - - def root_ref - @project.repository.root_ref - end - - def project - Project.find_by!(name: 'Shop') - end - - # ---------------------------------------- - # Errors - # ---------------------------------------- - - step 'page status code should be 404' do - status_code.should == 404 - end -end diff --git a/features/steps/shared/project.rb b/features/steps/shared/project.rb deleted file mode 100644 index b60ac5e3423..00000000000 --- a/features/steps/shared/project.rb +++ /dev/null @@ -1,160 +0,0 @@ -module SharedProject - include Spinach::DSL - - # Create a project without caring about what it's called - step "I own a project" do - @project = create(:project, namespace: @user.namespace) - @project.team << [@user, :master] - end - - # Create a specific project called "Shop" - step 'I own project "Shop"' do - @project = Project.find_by(name: "Shop") - @project ||= create(:project, name: "Shop", namespace: @user.namespace, snippets_enabled: true) - @project.team << [@user, :master] - end - - # Add another user to project "Shop" - step 'I add a user to project "Shop"' do - @project = Project.find_by(name: "Shop") - other_user = create(:user, name: 'Alpha') - @project.team << [other_user, :master] - end - - # Create another specific project called "Forum" - step 'I own project "Forum"' do - @project = Project.find_by(name: "Forum") - @project ||= create(:project, name: "Forum", namespace: @user.namespace, path: 'forum_project') - @project.team << [@user, :master] - end - - # Create an empty project without caring about the name - step 'I own an empty project' do - @project = create(:empty_project, - name: 'Empty Project', namespace: @user.namespace) - @project.team << [@user, :master] - end - - step 'I visit my empty project page' do - project = Project.find_by(name: 'Empty Project') - visit namespace_project_path(project.namespace, project) - end - - step 'project "Shop" has push event' do - @project = Project.find_by(name: "Shop") - - data = { - before: Gitlab::Git::BLANK_SHA, - after: "6d394385cf567f80a8fd85055db1ab4c5295806f", - ref: "refs/heads/fix", - user_id: @user.id, - user_name: @user.name, - repository: { - name: @project.name, - url: "localhost/rubinius", - description: "", - homepage: "localhost/rubinius", - private: true - } - } - - @event = Event.create( - project: @project, - action: Event::PUSHED, - data: data, - author_id: @user.id - ) - end - - step 'I should see project "Shop" activity feed' do - project = Project.find_by(name: "Shop") - page.should have_content "#{@user.name} pushed new branch fix at #{project.name_with_namespace}" - end - - step 'I should see project settings' do - current_path.should == edit_namespace_project_path(@project.namespace, @project) - page.should have_content("Project name") - page.should have_content("Features:") - end - - def current_project - @project ||= Project.first - end - - # ---------------------------------------- - # Visibility level - # ---------------------------------------- - - step 'private project "Enterprise"' do - create :project, name: 'Enterprise' - end - - step 'I should see project "Enterprise"' do - page.should have_content "Enterprise" - end - - step 'I should not see project "Enterprise"' do - page.should_not have_content "Enterprise" - end - - step 'internal project "Internal"' do - create :project, :internal, name: 'Internal' - end - - step 'I should see project "Internal"' do - page.should have_content "Internal" - end - - step 'I should not see project "Internal"' do - page.should_not have_content "Internal" - end - - step 'public project "Community"' do - create :project, :public, name: 'Community' - end - - step 'I should see project "Community"' do - page.should have_content "Community" - end - - step 'I should not see project "Community"' do - page.should_not have_content "Community" - end - - step '"John Doe" owns private project "Enterprise"' do - user = user_exists("John Doe", username: "john_doe") - project = Project.find_by(name: "Enterprise") - project ||= create(:empty_project, name: "Enterprise", namespace: user.namespace) - project.team << [user, :master] - end - - step '"John Doe" owns internal project "Internal"' do - user = user_exists("John Doe", username: "john_doe") - project = Project.find_by(name: "Internal") - project ||= create :empty_project, :internal, name: 'Internal', namespace: user.namespace - project.team << [user, :master] - end - - step '"John Doe" owns public project "Community"' do - user = user_exists("John Doe", username: "john_doe") - project = Project.find_by(name: "Community") - project ||= create :empty_project, :public, name: 'Community', namespace: user.namespace - project.team << [user, :master] - end - - step 'public empty project "Empty Public Project"' do - create :project_empty_repo, :public, name: "Empty Public Project" - end - - step 'project "Community" has comments' do - project = Project.find_by(name: "Community") - 2.times { create(:note_on_issue, project: project) } - end - - step 'project "Shop" has labels: "bug", "feature", "enhancement"' do - project = Project.find_by(name: "Shop") - create(:label, project: project, title: 'bug') - create(:label, project: project, title: 'feature') - create(:label, project: project, title: 'enhancement') - end -end diff --git a/features/steps/shared/project_tab.rb b/features/steps/shared/project_tab.rb deleted file mode 100644 index c5aed19331c..00000000000 --- a/features/steps/shared/project_tab.rb +++ /dev/null @@ -1,48 +0,0 @@ -require_relative 'active_tab' - -module SharedProjectTab - include Spinach::DSL - include SharedActiveTab - - step 'the active main tab should be Home' do - ensure_active_main_tab('Project') - end - - step 'the active main tab should be Files' do - ensure_active_main_tab('Files') - end - - step 'the active main tab should be Commits' do - ensure_active_main_tab('Commits') - end - - step 'the active main tab should be Network' do - ensure_active_main_tab('Network') - end - - step 'the active main tab should be Graphs' do - ensure_active_main_tab('Graphs') - end - - step 'the active main tab should be Issues' do - ensure_active_main_tab('Issues') - end - - step 'the active main tab should be Merge Requests' do - ensure_active_main_tab('Merge Requests') - end - - step 'the active main tab should be Snippets' do - ensure_active_main_tab('Snippets') - end - - step 'the active main tab should be Wiki' do - ensure_active_main_tab('Wiki') - end - - step 'the active main tab should be Settings' do - within '.nav-sidebar' do - page.should have_content('Back to project') - end - end -end diff --git a/features/steps/shared/search.rb b/features/steps/shared/search.rb deleted file mode 100644 index 6c3d601763d..00000000000 --- a/features/steps/shared/search.rb +++ /dev/null @@ -1,11 +0,0 @@ -module SharedSearch - include Spinach::DSL - - def search_snippet_contents(query) - visit "/search?search=#{URI::encode(query)}&snippets=true&scope=snippet_blobs" - end - - def search_snippet_titles(query) - visit "/search?search=#{URI::encode(query)}&snippets=true&scope=snippet_titles" - end -end diff --git a/features/steps/shared/shortcuts.rb b/features/steps/shared/shortcuts.rb deleted file mode 100644 index bbb7afec0ad..00000000000 --- a/features/steps/shared/shortcuts.rb +++ /dev/null @@ -1,18 +0,0 @@ -module SharedActiveTab - include Spinach::DSL - - step 'I press "g" and "p"' do - find('body').native.send_key('g') - find('body').native.send_key('p') - end - - step 'I press "g" and "i"' do - find('body').native.send_key('g') - find('body').native.send_key('i') - end - - step 'I press "g" and "m"' do - find('body').native.send_key('g') - find('body').native.send_key('m') - end -end diff --git a/features/steps/shared/snippet.rb b/features/steps/shared/snippet.rb deleted file mode 100644 index bb596c1620a..00000000000 --- a/features/steps/shared/snippet.rb +++ /dev/null @@ -1,63 +0,0 @@ -module SharedSnippet - include Spinach::DSL - - step 'I have public "Personal snippet one" snippet' do - create(:personal_snippet, - title: "Personal snippet one", - content: "Test content", - file_name: "snippet.rb", - visibility_level: Snippet::PUBLIC, - author: current_user) - end - - step 'I have private "Personal snippet private" snippet' do - create(:personal_snippet, - title: "Personal snippet private", - content: "Provate content", - file_name: "private_snippet.rb", - visibility_level: Snippet::PRIVATE, - author: current_user) - end - - step 'I have internal "Personal snippet internal" snippet' do - create(:personal_snippet, - title: "Personal snippet internal", - content: "Provate content", - file_name: "internal_snippet.rb", - visibility_level: Snippet::INTERNAL, - author: current_user) - end - - step 'I have a public many lined snippet' do - create(:personal_snippet, - title: 'Many lined snippet', - content: <<-END.gsub(/^\s+\|/, ''), - |line one - |line two - |line three - |line four - |line five - |line six - |line seven - |line eight - |line nine - |line ten - |line eleven - |line twelve - |line thirteen - |line fourteen - END - file_name: 'many_lined_snippet.rb', - visibility_level: Snippet::PUBLIC, - author: current_user) - end - - step 'There is public "Personal snippet one" snippet' do - create(:personal_snippet, - title: "Personal snippet one", - content: "Test content", - file_name: "snippet.rb", - visibility_level: Snippet::PUBLIC, - author: create(:user)) - end -end diff --git a/features/steps/shared/user.rb b/features/steps/shared/user.rb deleted file mode 100644 index 209d77c7acf..00000000000 --- a/features/steps/shared/user.rb +++ /dev/null @@ -1,17 +0,0 @@ -module SharedUser - include Spinach::DSL - - step 'User "John Doe" exists' do - user_exists("John Doe", {username: "john_doe"}) - end - - step 'User "Mary Jane" exists' do - user_exists("Mary Jane", {username: "mary_jane"}) - end - - protected - - def user_exists(name, options = {}) - User.find_by(name: name) || create(:user, {name: name, admin: false}.merge(options)) - end -end diff --git a/features/steps/snippet_search.rb b/features/steps/snippet_search.rb deleted file mode 100644 index 669c7186c1b..00000000000 --- a/features/steps/snippet_search.rb +++ /dev/null @@ -1,56 +0,0 @@ -class Spinach::Features::SnippetSearch < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedSnippet - include SharedUser - include SharedSearch - - step 'I search for "snippet" in snippet titles' do - search_snippet_titles 'snippet' - end - - step 'I search for "snippet private" in snippet titles' do - search_snippet_titles 'snippet private' - end - - step 'I search for "line seven" in snippet contents' do - search_snippet_contents 'line seven' - end - - step 'I should see "line seven" in results' do - page.should have_content 'line seven' - end - - step 'I should see "line four" in results' do - page.should have_content 'line four' - end - - step 'I should see "line ten" in results' do - page.should have_content 'line ten' - end - - step 'I should not see "line eleven" in results' do - page.should_not have_content 'line eleven' - end - - step 'I should not see "line three" in results' do - page.should_not have_content 'line three' - end - - step 'I should see "Personal snippet one" in results' do - page.should have_content 'Personal snippet one' - end - - step 'I should see "Personal snippet private" in results' do - page.should have_content 'Personal snippet private' - end - - step 'I should not see "Personal snippet one" in results' do - page.should_not have_content 'Personal snippet one' - end - - step 'I should not see "Personal snippet private" in results' do - page.should_not have_content 'Personal snippet private' - end - -end diff --git a/features/steps/snippets/discover.rb b/features/steps/snippets/discover.rb deleted file mode 100644 index 2667c1e3d44..00000000000 --- a/features/steps/snippets/discover.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Spinach::Features::SnippetsDiscover < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedSnippet - - step 'I should see "Personal snippet one" in snippets' do - page.should have_content "Personal snippet one" - end - - step 'I should see "Personal snippet internal" in snippets' do - page.should have_content "Personal snippet internal" - end - - step 'I should not see "Personal snippet private" in snippets' do - page.should_not have_content "Personal snippet private" - end - - def snippet - @snippet ||= PersonalSnippet.find_by!(title: "Personal snippet one") - end -end diff --git a/features/steps/snippets/public_snippets.rb b/features/steps/snippets/public_snippets.rb deleted file mode 100644 index 67669dc0a69..00000000000 --- a/features/steps/snippets/public_snippets.rb +++ /dev/null @@ -1,25 +0,0 @@ -class Spinach::Features::PublicSnippets < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedSnippet - - step 'I should see snippet "Personal snippet one"' do - page.should have_no_xpath("//i[@class='public-snippet']") - end - - step 'I should see raw snippet "Personal snippet one"' do - page.should have_text(snippet.content) - end - - step 'I visit snippet page "Personal snippet one"' do - visit snippet_path(snippet) - end - - step 'I visit snippet raw page "Personal snippet one"' do - visit raw_snippet_path(snippet) - end - - def snippet - @snippet ||= PersonalSnippet.find_by!(title: "Personal snippet one") - end -end diff --git a/features/steps/snippets/snippets.rb b/features/steps/snippets/snippets.rb deleted file mode 100644 index de936db85ee..00000000000 --- a/features/steps/snippets/snippets.rb +++ /dev/null @@ -1,64 +0,0 @@ -class Spinach::Features::Snippets < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedProject - include SharedSnippet - - step 'I click link "Personal snippet one"' do - click_link "Personal snippet one" - end - - step 'I should not see "Personal snippet one" in snippets' do - page.should_not have_content "Personal snippet one" - end - - step 'I click link "Edit"' do - within ".file-title" do - click_link "Edit" - end - end - - step 'I click link "Destroy"' do - click_link "remove" - end - - step 'I submit new snippet "Personal snippet three"' do - fill_in "personal_snippet_title", :with => "Personal snippet three" - fill_in "personal_snippet_file_name", :with => "my_snippet.rb" - within('.file-editor') do - find(:xpath, "//input[@id='personal_snippet_content']").set 'Content of snippet three' - end - click_button "Create snippet" - end - - step 'I should see snippet "Personal snippet three"' do - page.should have_content "Personal snippet three" - page.should have_content "Content of snippet three" - end - - step 'I submit new title "Personal snippet new title"' do - fill_in "personal_snippet_title", :with => "Personal snippet new title" - click_button "Save" - end - - step 'I should see "Personal snippet new title"' do - page.should have_content "Personal snippet new title" - end - - step 'I uncheck "Private" checkbox' do - choose "Internal" - click_button "Save" - end - - step 'I should see "Personal snippet one" public' do - page.should have_no_xpath("//i[@class='public-snippet']") - end - - step 'I visit snippet page "Personal snippet one"' do - visit snippet_path(snippet) - end - - def snippet - @snippet ||= PersonalSnippet.find_by!(title: "Personal snippet one") - end -end diff --git a/features/steps/snippets/user.rb b/features/steps/snippets/user.rb deleted file mode 100644 index 866f637ab6c..00000000000 --- a/features/steps/snippets/user.rb +++ /dev/null @@ -1,55 +0,0 @@ -class Spinach::Features::SnippetsUser < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedSnippet - - step 'I visit my snippets page' do - visit user_snippets_path(current_user) - end - - step 'I should see "Personal snippet one" in snippets' do - page.should have_content "Personal snippet one" - end - - step 'I should see "Personal snippet private" in snippets' do - page.should have_content "Personal snippet private" - end - - step 'I should see "Personal snippet internal" in snippets' do - page.should have_content "Personal snippet internal" - end - - step 'I should not see "Personal snippet one" in snippets' do - page.should_not have_content "Personal snippet one" - end - - step 'I should not see "Personal snippet private" in snippets' do - page.should_not have_content "Personal snippet private" - end - - step 'I should not see "Personal snippet internal" in snippets' do - page.should_not have_content "Personal snippet internal" - end - - step 'I click "Internal" filter' do - within('.nav-stacked') do - click_link "Internal" - end - end - - step 'I click "Private" filter' do - within('.nav-stacked') do - click_link "Private" - end - end - - step 'I click "Public" filter' do - within('.nav-stacked') do - click_link "Public" - end - end - - def snippet - @snippet ||= PersonalSnippet.find_by!(title: "Personal snippet one") - end -end diff --git a/features/steps/user.rb b/features/steps/user.rb deleted file mode 100644 index 10cae692a88..00000000000 --- a/features/steps/user.rb +++ /dev/null @@ -1,43 +0,0 @@ -class Spinach::Features::User < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedUser - include SharedProject - - step 'I should see user "John Doe" page' do - expect(title).to match(/^\s*John Doe/) - end - - step '"John Doe" has contributions' do - user = User.find_by(name: 'John Doe') - project = contributed_project - - # Issue controbution - issue_params = { title: 'Bug in old browser' } - Issues::CreateService.new(project, user, issue_params).execute - - # Push code contribution - push_params = { - project: project, - action: Event::PUSHED, - author_id: user.id, - data: { commit_count: 3 } - } - - Event.create(push_params) - end - - step 'I should see contributed projects' do - within '.contributed-projects' do - page.should have_content(@contributed_project.name) - end - end - - step 'I should see contributions calendar' do - page.should have_css('.cal-heatmap-container') - end - - def contributed_project - @contributed_project ||= create(:project, :public) - end -end diff --git a/features/support/env.rb b/features/support/env.rb deleted file mode 100644 index be17065ccfd..00000000000 --- a/features/support/env.rb +++ /dev/null @@ -1,54 +0,0 @@ -if ENV['SIMPLECOV'] - require 'simplecov' -end - -if ENV['COVERALLS'] - require 'coveralls' - Coveralls.wear_merged! -end - -ENV['RAILS_ENV'] = 'test' -require './config/environment' -require 'rspec' -require 'rspec/expectations' -require 'database_cleaner' -require 'spinach/capybara' -require 'sidekiq/testing/inline' - -%w(select2_helper test_env repo_helpers).each do |f| - require Rails.root.join('spec', 'support', f) -end - -Dir["#{Rails.root}/features/steps/shared/*.rb"].each {|file| require file} - -WebMock.allow_net_connect! -# -# JS driver -# -require 'capybara/poltergeist' -Capybara.javascript_driver = :poltergeist -Capybara.register_driver :poltergeist do |app| - Capybara::Poltergeist::Driver.new(app, js_errors: false, timeout: 90) -end -Spinach.hooks.on_tag("javascript") do - ::Capybara.current_driver = ::Capybara.javascript_driver -end -Capybara.default_wait_time = 60 -Capybara.ignore_hidden_elements = false - -DatabaseCleaner.strategy = :truncation - -Spinach.hooks.before_scenario do - DatabaseCleaner.start -end - -Spinach.hooks.after_scenario do - DatabaseCleaner.clean -end - -Spinach.hooks.before_run do - include RSpec::Mocks::ExampleMethods - TestEnv.init(mailer: false) - - include FactoryGirl::Syntax::Methods -end diff --git a/features/user.feature b/features/user.feature deleted file mode 100644 index 69618e929c4..00000000000 --- a/features/user.feature +++ /dev/null @@ -1,78 +0,0 @@ -Feature: User - Background: - Given User "John Doe" exists - And "John Doe" owns private project "Enterprise" - - # Signed out - - Scenario: I visit user "John Doe" page while not signed in when he owns a public project - Given "John Doe" owns internal project "Internal" - And "John Doe" owns public project "Community" - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should not see project "Enterprise" - And I should not see project "Internal" - And I should see project "Community" - - Scenario: I visit user "John Doe" page while not signed in when he is not authorized to a public project - Given "John Doe" owns internal project "Internal" - When I visit user "John Doe" page - Then I should be redirected to sign in page - - # Signed in as someone else - - Scenario: I visit user "John Doe" page while signed in as someone else when he owns a public project - Given "John Doe" owns public project "Community" - And "John Doe" owns internal project "Internal" - And I sign in as a user - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should not see project "Enterprise" - And I should see project "Internal" - And I should see project "Community" - - Scenario: I visit user "John Doe" page while signed in as someone else when he is not authorized to a public project - Given "John Doe" owns internal project "Internal" - And I sign in as a user - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should not see project "Enterprise" - And I should see project "Internal" - And I should not see project "Community" - - Scenario: I visit user "John Doe" page while signed in as someone else when he is not authorized to a project I can see - Given I sign in as a user - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should not see project "Enterprise" - And I should not see project "Internal" - And I should not see project "Community" - - # Signed in as the user himself - - Scenario: I visit user "John Doe" page while signed in as "John Doe" when he has a public project - Given "John Doe" owns internal project "Internal" - And "John Doe" owns public project "Community" - And I sign in as "John Doe" - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should see project "Enterprise" - And I should see project "Internal" - And I should see project "Community" - - Scenario: I visit user "John Doe" page while signed in as "John Doe" when he has no public project - Given I sign in as "John Doe" - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should see project "Enterprise" - And I should not see project "Internal" - And I should not see project "Community" - - @javascript - Scenario: "John Doe" contribution profile - Given I sign in as a user - And "John Doe" has contributions - When I visit user "John Doe" page - Then I should see user "John Doe" page - And I should see contributed projects - And I should see contributions calendar diff --git a/lib/api/api.rb b/lib/api/api.rb deleted file mode 100644 index 60858a39407..00000000000 --- a/lib/api/api.rb +++ /dev/null @@ -1,53 +0,0 @@ -Dir["#{Rails.root}/lib/api/*.rb"].each {|file| require file} - -module API - class API < Grape::API - include APIGuard - version 'v3', using: :path - - rescue_from ActiveRecord::RecordNotFound do - rack_response({ 'message' => '404 Not found' }.to_json, 404) - end - - rescue_from :all do |exception| - # lifted from https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb#L60 - # why is this not wrapped in something reusable? - trace = exception.backtrace - - message = "\n#{exception.class} (#{exception.message}):\n" - message << exception.annoted_source_code.to_s if exception.respond_to?(:annoted_source_code) - message << " " << trace.join("\n ") - - API.logger.add Logger::FATAL, message - rack_response({ 'message' => '500 Internal Server Error' }, 500) - end - - format :json - content_type :txt, "text/plain" - - helpers APIHelpers - - mount Groups - mount GroupMembers - mount Users - mount Projects - mount Repositories - mount Issues - mount Milestones - mount Session - mount MergeRequests - mount Notes - mount Internal - mount SystemHooks - mount ProjectSnippets - mount ProjectMembers - mount DeployKeys - mount ProjectHooks - mount Services - mount Files - mount Commits - mount Namespaces - mount Branches - mount Labels - end -end diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb deleted file mode 100644 index b9994fcefda..00000000000 --- a/lib/api/api_guard.rb +++ /dev/null @@ -1,172 +0,0 @@ -# Guard API with OAuth 2.0 Access Token - -require 'rack/oauth2' - -module APIGuard - extend ActiveSupport::Concern - - included do |base| - # OAuth2 Resource Server Authentication - use Rack::OAuth2::Server::Resource::Bearer, 'The API' do |request| - # The authenticator only fetches the raw token string - - # Must yield access token to store it in the env - request.access_token - end - - helpers HelperMethods - - install_error_responders(base) - end - - # Helper Methods for Grape Endpoint - module HelperMethods - # Invokes the doorkeeper guard. - # - # If token is presented and valid, then it sets @current_user. - # - # If the token does not have sufficient scopes to cover the requred scopes, - # then it raises InsufficientScopeError. - # - # If the token is expired, then it raises ExpiredError. - # - # If the token is revoked, then it raises RevokedError. - # - # If the token is not found (nil), then it raises TokenNotFoundError. - # - # Arguments: - # - # scopes: (optional) scopes required for this guard. - # Defaults to empty array. - # - def doorkeeper_guard!(scopes: []) - if (access_token = find_access_token).nil? - raise TokenNotFoundError - - else - case validate_access_token(access_token, scopes) - when Oauth2::AccessTokenValidationService::INSUFFICIENT_SCOPE - raise InsufficientScopeError.new(scopes) - when Oauth2::AccessTokenValidationService::EXPIRED - raise ExpiredError - when Oauth2::AccessTokenValidationService::REVOKED - raise RevokedError - when Oauth2::AccessTokenValidationService::VALID - @current_user = User.find(access_token.resource_owner_id) - end - end - end - - def doorkeeper_guard(scopes: []) - if access_token = find_access_token - case validate_access_token(access_token, scopes) - when Oauth2::AccessTokenValidationService::INSUFFICIENT_SCOPE - raise InsufficientScopeError.new(scopes) - - when Oauth2::AccessTokenValidationService::EXPIRED - raise ExpiredError - - when Oauth2::AccessTokenValidationService::REVOKED - raise RevokedError - - when Oauth2::AccessTokenValidationService::VALID - @current_user = User.find(access_token.resource_owner_id) - end - end - end - - def current_user - @current_user - end - - private - def find_access_token - @access_token ||= Doorkeeper.authenticate(doorkeeper_request, Doorkeeper.configuration.access_token_methods) - end - - def doorkeeper_request - @doorkeeper_request ||= ActionDispatch::Request.new(env) - end - - def validate_access_token(access_token, scopes) - Oauth2::AccessTokenValidationService.validate(access_token, scopes: scopes) - end - end - - module ClassMethods - # Installs the doorkeeper guard on the whole Grape API endpoint. - # - # Arguments: - # - # scopes: (optional) scopes required for this guard. - # Defaults to empty array. - # - def guard_all!(scopes: []) - before do - guard! scopes: scopes - end - end - - private - def install_error_responders(base) - error_classes = [ MissingTokenError, TokenNotFoundError, - ExpiredError, RevokedError, InsufficientScopeError] - - base.send :rescue_from, *error_classes, oauth2_bearer_token_error_handler - end - - def oauth2_bearer_token_error_handler - Proc.new do |e| - response = - case e - when MissingTokenError - Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new - - when TokenNotFoundError - Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new( - :invalid_token, - "Bad Access Token.") - - when ExpiredError - Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new( - :invalid_token, - "Token is expired. You can either do re-authorization or token refresh.") - - when RevokedError - Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new( - :invalid_token, - "Token was revoked. You have to re-authorize from the user.") - - when InsufficientScopeError - # FIXME: ForbiddenError (inherited from Bearer::Forbidden of Rack::Oauth2) - # does not include WWW-Authenticate header, which breaks the standard. - Rack::OAuth2::Server::Resource::Bearer::Forbidden.new( - :insufficient_scope, - Rack::OAuth2::Server::Resource::ErrorMethods::DEFAULT_DESCRIPTION[:insufficient_scope], - { scope: e.scopes }) - end - - response.finish - end - end - end - - # - # Exceptions - # - - class MissingTokenError < StandardError; end - - class TokenNotFoundError < StandardError; end - - class ExpiredError < StandardError; end - - class RevokedError < StandardError; end - - class InsufficientScopeError < StandardError - attr_reader :scopes - def initialize(scopes) - @scopes = scopes - end - end -end diff --git a/lib/api/branches.rb b/lib/api/branches.rb deleted file mode 100644 index 592100a7045..00000000000 --- a/lib/api/branches.rb +++ /dev/null @@ -1,119 +0,0 @@ -require 'mime/types' - -module API - # Projects API - class Branches < Grape::API - before { authenticate! } - before { authorize! :download_code, user_project } - - resource :projects do - # Get a project repository branches - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/repository/branches - get ":id/repository/branches" do - branches = user_project.repository.branches.sort_by(&:name) - present branches, with: Entities::RepoObject, project: user_project - end - - # Get a single branch - # - # Parameters: - # id (required) - The ID of a project - # branch (required) - The name of the branch - # Example Request: - # GET /projects/:id/repository/branches/:branch - get ':id/repository/branches/:branch', requirements: { branch: /.*/ } do - @branch = user_project.repository.branches.find { |item| item.name == params[:branch] } - not_found!("Branch") unless @branch - present @branch, with: Entities::RepoObject, project: user_project - end - - # Protect a single branch - # - # Parameters: - # id (required) - The ID of a project - # branch (required) - The name of the branch - # Example Request: - # PUT /projects/:id/repository/branches/:branch/protect - put ':id/repository/branches/:branch/protect', - requirements: { branch: /.*/ } do - - authorize_admin_project - - @branch = user_project.repository.find_branch(params[:branch]) - not_found!("Branch") unless @branch - protected_branch = user_project.protected_branches.find_by(name: @branch.name) - user_project.protected_branches.create(name: @branch.name) unless protected_branch - - present @branch, with: Entities::RepoObject, project: user_project - end - - # Unprotect a single branch - # - # Parameters: - # id (required) - The ID of a project - # branch (required) - The name of the branch - # Example Request: - # PUT /projects/:id/repository/branches/:branch/unprotect - put ':id/repository/branches/:branch/unprotect', - requirements: { branch: /.*/ } do - - authorize_admin_project - - @branch = user_project.repository.find_branch(params[:branch]) - not_found!("Branch does not exist") unless @branch - protected_branch = user_project.protected_branches.find_by(name: @branch.name) - protected_branch.destroy if protected_branch - - present @branch, with: Entities::RepoObject, project: user_project - end - - # Create branch - # - # Parameters: - # id (required) - The ID of a project - # branch_name (required) - The name of the branch - # ref (required) - Create branch from commit sha or existing branch - # Example Request: - # POST /projects/:id/repository/branches - post ":id/repository/branches" do - authorize_push_project - result = CreateBranchService.new(user_project, current_user). - execute(params[:branch_name], params[:ref]) - - if result[:status] == :success - present result[:branch], - with: Entities::RepoObject, - project: user_project - else - render_api_error!(result[:message], 400) - end - end - - # Delete branch - # - # Parameters: - # id (required) - The ID of a project - # branch (required) - The name of the branch - # Example Request: - # DELETE /projects/:id/repository/branches/:branch - delete ":id/repository/branches/:branch", - requirements: { branch: /.*/ } do - authorize_push_project - result = DeleteBranchService.new(user_project, current_user). - execute(params[:branch]) - - if result[:status] == :success - { - branch_name: params[:branch] - } - else - render_api_error!(result[:message], result[:return_code]) - end - end - end - end -end diff --git a/lib/api/commits.rb b/lib/api/commits.rb deleted file mode 100644 index 0de4e720ffe..00000000000 --- a/lib/api/commits.rb +++ /dev/null @@ -1,116 +0,0 @@ -require 'mime/types' - -module API - # Projects commits API - class Commits < Grape::API - before { authenticate! } - before { authorize! :download_code, user_project } - - resource :projects do - # Get a project repository commits - # - # Parameters: - # id (required) - The ID of a project - # ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used - # Example Request: - # GET /projects/:id/repository/commits - get ":id/repository/commits" do - page = (params[:page] || 0).to_i - per_page = (params[:per_page] || 20).to_i - ref = params[:ref_name] || user_project.try(:default_branch) || 'master' - - commits = user_project.repository.commits(ref, nil, per_page, page * per_page) - present commits, with: Entities::RepoCommit - end - - # Get a specific commit of a project - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit hash or name of a repository branch or tag - # Example Request: - # GET /projects/:id/repository/commits/:sha - get ":id/repository/commits/:sha" do - sha = params[:sha] - commit = user_project.repository.commit(sha) - not_found! "Commit" unless commit - present commit, with: Entities::RepoCommitDetail - end - - # Get the diff for a specific commit of a project - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit or branch name - # Example Request: - # GET /projects/:id/repository/commits/:sha/diff - get ":id/repository/commits/:sha/diff" do - sha = params[:sha] - commit = user_project.repository.commit(sha) - not_found! "Commit" unless commit - commit.diffs - end - - # Get a commit's comments - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit hash - # Examples: - # GET /projects/:id/repository/commits/:sha/comments - get ':id/repository/commits/:sha/comments' do - sha = params[:sha] - commit = user_project.repository.commit(sha) - not_found! 'Commit' unless commit - notes = Note.where(commit_id: commit.id) - present paginate(notes), with: Entities::CommitNote - end - - # Post comment to commit - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit hash - # note (required) - Text of comment - # path (optional) - The file path - # line (optional) - The line number - # line_type (optional) - The type of line (new or old) - # Examples: - # POST /projects/:id/repository/commits/:sha/comments - post ':id/repository/commits/:sha/comments' do - required_attributes! [:note] - - sha = params[:sha] - commit = user_project.repository.commit(sha) - not_found! 'Commit' unless commit - opts = { - note: params[:note], - noteable_type: 'Commit', - commit_id: commit.id - } - - if params[:path] && params[:line] && params[:line_type] - commit.diffs.each do |diff| - next unless diff.new_path == params[:path] - lines = Gitlab::Diff::Parser.new.parse(diff.diff.lines.to_a) - - lines.each do |line| - next unless line.new_pos == params[:line].to_i && line.type == params[:line_type] - break opts[:line_code] = Gitlab::Diff::LineCode.generate(diff.new_path, line.new_pos, line.old_pos) - end - - break if opts[:line_code] - end - end - - note = ::Notes::CreateService.new(user_project, current_user, opts).execute - - if note.save - present note, with: Entities::CommitNote - else - render_api_error!("Failed to save note #{note.errors.messages}", 400) - end - end - end - end -end diff --git a/lib/api/deploy_keys.rb b/lib/api/deploy_keys.rb deleted file mode 100644 index 06eb7756841..00000000000 --- a/lib/api/deploy_keys.rb +++ /dev/null @@ -1,75 +0,0 @@ -module API - # Projects API - class DeployKeys < Grape::API - before { authenticate! } - before { authorize_admin_project } - - resource :projects do - # Get a specific project's keys - # - # Example Request: - # GET /projects/:id/keys - get ":id/keys" do - present user_project.deploy_keys, with: Entities::SSHKey - end - - # Get single key owned by currently authenticated user - # - # Example Request: - # GET /projects/:id/keys/:id - get ":id/keys/:key_id" do - key = user_project.deploy_keys.find params[:key_id] - present key, with: Entities::SSHKey - end - - # Add new ssh key to currently authenticated user - # If deploy key already exists - it will be joined to project - # but only if original one was is accessible by same user - # - # Parameters: - # key (required) - New SSH Key - # title (required) - New SSH Key's title - # Example Request: - # POST /projects/:id/keys - post ":id/keys" do - attrs = attributes_for_keys [:title, :key] - - if attrs[:key].present? - attrs[:key].strip! - - # check if key already exist in project - key = user_project.deploy_keys.find_by(key: attrs[:key]) - if key - present key, with: Entities::SSHKey - return - end - - # Check for available deploy keys in other projects - key = current_user.accessible_deploy_keys.find_by(key: attrs[:key]) - if key - user_project.deploy_keys << key - present key, with: Entities::SSHKey - return - end - end - - key = DeployKey.new attrs - - if key.valid? && user_project.deploy_keys << key - present key, with: Entities::SSHKey - else - render_validation_error!(key) - end - end - - # Delete existed ssh key of currently authenticated user - # - # Example Request: - # DELETE /projects/:id/keys/:id - delete ":id/keys/:key_id" do - key = user_project.deploy_keys.find params[:key_id] - key.destroy - end - end - end -end diff --git a/lib/api/entities.rb b/lib/api/entities.rb deleted file mode 100644 index 36332bc6514..00000000000 --- a/lib/api/entities.rb +++ /dev/null @@ -1,280 +0,0 @@ -module API - module Entities - class UserSafe < Grape::Entity - expose :name, :username - end - - class UserBasic < UserSafe - expose :id, :state, :avatar_url - end - - class User < UserBasic - expose :created_at - expose :is_admin?, as: :is_admin - expose :bio, :skype, :linkedin, :twitter, :website_url - end - - class Identity < Grape::Entity - expose :provider, :extern_uid - end - - class UserFull < User - expose :email - expose :theme_id, :color_scheme_id, :projects_limit - expose :identities, using: Entities::Identity - expose :can_create_group?, as: :can_create_group - expose :can_create_project?, as: :can_create_project - end - - class UserLogin < UserFull - expose :private_token - end - - class Hook < Grape::Entity - expose :id, :url, :created_at - end - - class ProjectHook < Hook - expose :project_id, :push_events - expose :issues_events, :merge_requests_events, :tag_push_events - end - - class ForkedFromProject < Grape::Entity - expose :id - expose :name, :name_with_namespace - expose :path, :path_with_namespace - end - - class Project < Grape::Entity - expose :id, :description, :default_branch, :tag_list - expose :public?, as: :public - expose :archived?, as: :archived - expose :visibility_level, :ssh_url_to_repo, :http_url_to_repo, :web_url - expose :owner, using: Entities::UserBasic, unless: ->(project, options) { project.group } - expose :name, :name_with_namespace - expose :path, :path_with_namespace - expose :issues_enabled, :merge_requests_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at - expose :creator_id - expose :namespace - expose :forked_from_project, using: Entities::ForkedFromProject, if: lambda{ | project, options | project.forked? } - expose :avatar_url - end - - class ProjectMember < UserBasic - expose :access_level do |user, options| - options[:project].project_members.find_by(user_id: user.id).access_level - end - end - - class Group < Grape::Entity - expose :id, :name, :path, :description - end - - class GroupDetail < Group - expose :projects, using: Entities::Project - end - - class GroupMember < UserBasic - expose :access_level do |user, options| - options[:group].group_members.find_by(user_id: user.id).access_level - end - end - - class RepoTag < Grape::Entity - expose :name - expose :message do |repo_obj, _options| - if repo_obj.respond_to?(:message) - repo_obj.message - else - nil - end - end - - expose :commit do |repo_obj, options| - if repo_obj.respond_to?(:commit) - repo_obj.commit - elsif options[:project] - options[:project].repository.commit(repo_obj.target) - end - end - end - - class RepoObject < Grape::Entity - expose :name - - expose :commit do |repo_obj, options| - if repo_obj.respond_to?(:commit) - repo_obj.commit - elsif options[:project] - options[:project].repository.commit(repo_obj.target) - end - end - - expose :protected do |repo, options| - if options[:project] - options[:project].protected_branch? repo.name - end - end - end - - class RepoTreeObject < Grape::Entity - expose :id, :name, :type - - expose :mode do |obj, options| - filemode = obj.mode.to_s(8) - filemode = "0" + filemode if filemode.length < 6 - filemode - end - end - - class RepoCommit < Grape::Entity - expose :id, :short_id, :title, :author_name, :author_email, :created_at - expose :safe_message, as: :message - end - - class RepoCommitDetail < RepoCommit - expose :parent_ids, :committed_date, :authored_date - end - - class ProjectSnippet < Grape::Entity - expose :id, :title, :file_name - expose :author, using: Entities::UserBasic - expose :expires_at, :updated_at, :created_at - end - - class ProjectEntity < Grape::Entity - expose :id, :iid - expose(:project_id) { |entity| entity.project.id } - expose :title, :description - expose :state, :created_at, :updated_at - end - - class RepoDiff < Grape::Entity - expose :old_path, :new_path, :a_mode, :b_mode, :diff - expose :new_file, :renamed_file, :deleted_file - end - - class Milestone < ProjectEntity - expose :due_date - end - - class Issue < ProjectEntity - expose :label_names, as: :labels - expose :milestone, using: Entities::Milestone - expose :assignee, :author, using: Entities::UserBasic - end - - class MergeRequest < ProjectEntity - expose :target_branch, :source_branch, :upvotes, :downvotes - expose :author, :assignee, using: Entities::UserBasic - expose :source_project_id, :target_project_id - expose :label_names, as: :labels - expose :description - expose :milestone, using: Entities::Milestone - end - - class MergeRequestChanges < MergeRequest - expose :diffs, as: :changes, using: Entities::RepoDiff do |compare, _| - compare.diffs - end - end - - class SSHKey < Grape::Entity - expose :id, :title, :key, :created_at - end - - class Note < Grape::Entity - expose :id - expose :note, as: :body - expose :attachment_identifier, as: :attachment - expose :author, using: Entities::UserBasic - expose :created_at - end - - class MRNote < Grape::Entity - expose :note - expose :author, using: Entities::UserBasic - end - - class CommitNote < Grape::Entity - expose :note - expose(:path) { |note| note.diff_file_name } - expose(:line) { |note| note.diff_new_line } - expose(:line_type) { |note| note.diff_line_type } - expose :author, using: Entities::UserBasic - end - - class Event < Grape::Entity - expose :title, :project_id, :action_name - expose :target_id, :target_type, :author_id - expose :data, :target_title - expose :created_at - - expose :author_username do |event, options| - if event.author - event.author.username - end - end - end - - class Namespace < Grape::Entity - expose :id, :path, :kind - end - - class ProjectAccess < Grape::Entity - expose :access_level - expose :notification_level - end - - class GroupAccess < Grape::Entity - expose :access_level - expose :notification_level - end - - class ProjectWithAccess < Project - expose :permissions do - expose :project_access, using: Entities::ProjectAccess do |project, options| - project.project_members.find_by(user_id: options[:user].id) - end - - expose :group_access, using: Entities::GroupAccess do |project, options| - if project.group - project.group.group_members.find_by(user_id: options[:user].id) - end - end - end - end - - class Label < Grape::Entity - expose :name, :color - end - - class Compare < Grape::Entity - expose :commit, using: Entities::RepoCommit do |compare, options| - Commit.decorate(compare.commits).last - end - - expose :commits, using: Entities::RepoCommit do |compare, options| - Commit.decorate(compare.commits) - end - - expose :diffs, using: Entities::RepoDiff do |compare, options| - compare.diffs - end - - expose :compare_timeout do |compare, options| - compare.timeout - end - - expose :same, as: :compare_same_ref - end - - class Contributor < Grape::Entity - expose :name, :email, :commits, :additions, :deletions - end - - class BroadcastMessage < Grape::Entity - expose :message, :starts_at, :ends_at, :color, :font - end - end -end diff --git a/lib/api/files.rb b/lib/api/files.rb deleted file mode 100644 index 3176ef0e256..00000000000 --- a/lib/api/files.rb +++ /dev/null @@ -1,158 +0,0 @@ -module API - # Projects API - class Files < Grape::API - before { authenticate! } - - resource :projects do - # Get file from repository - # File content is Base64 encoded - # - # Parameters: - # file_path (required) - The path to the file. Ex. lib/class.rb - # ref (required) - The name of branch, tag or commit - # - # Example Request: - # GET /projects/:id/repository/files - # - # Example response: - # { - # "file_name": "key.rb", - # "file_path": "app/models/key.rb", - # "size": 1476, - # "encoding": "base64", - # "content": "IyA9PSBTY2hlbWEgSW5mb3...", - # "ref": "master", - # "blob_id": "79f7bbd25901e8334750839545a9bd021f0e4c83", - # "commit_id": "d5a3ff139356ce33e37e73add446f16869741b50" - # } - # - get ":id/repository/files" do - authorize! :download_code, user_project - - required_attributes! [:file_path, :ref] - attrs = attributes_for_keys [:file_path, :ref] - ref = attrs.delete(:ref) - file_path = attrs.delete(:file_path) - - commit = user_project.repository.commit(ref) - not_found! 'Commit' unless commit - - blob = user_project.repository.blob_at(commit.sha, file_path) - - if blob - status(200) - - { - file_name: blob.name, - file_path: blob.path, - size: blob.size, - encoding: "base64", - content: Base64.encode64(blob.data), - ref: ref, - blob_id: blob.id, - commit_id: commit.id, - } - else - not_found! 'File' - end - end - - # Create new file in repository - # - # Parameters: - # file_path (required) - The path to new file. Ex. lib/class.rb - # branch_name (required) - The name of branch - # content (required) - File content - # commit_message (required) - Commit message - # - # Example Request: - # POST /projects/:id/repository/files - # - post ":id/repository/files" do - authorize! :push_code, user_project - - required_attributes! [:file_path, :branch_name, :content, :commit_message] - attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message, :encoding] - branch_name = attrs.delete(:branch_name) - file_path = attrs.delete(:file_path) - result = ::Files::CreateService.new(user_project, current_user, attrs, branch_name, file_path).execute - - if result[:status] == :success - status(201) - - { - file_path: file_path, - branch_name: branch_name - } - else - render_api_error!(result[:message], 400) - end - end - - # Update existing file in repository - # - # Parameters: - # file_path (optional) - The path to file. Ex. lib/class.rb - # branch_name (required) - The name of branch - # content (required) - File content - # commit_message (required) - Commit message - # - # Example Request: - # PUT /projects/:id/repository/files - # - put ":id/repository/files" do - authorize! :push_code, user_project - - required_attributes! [:file_path, :branch_name, :content, :commit_message] - attrs = attributes_for_keys [:file_path, :branch_name, :content, :commit_message, :encoding] - branch_name = attrs.delete(:branch_name) - file_path = attrs.delete(:file_path) - result = ::Files::UpdateService.new(user_project, current_user, attrs, branch_name, file_path).execute - - if result[:status] == :success - status(200) - - { - file_path: file_path, - branch_name: branch_name - } - else - http_status = result[:http_status] || 400 - render_api_error!(result[:message], http_status) - end - end - - # Delete existing file in repository - # - # Parameters: - # file_path (optional) - The path to file. Ex. lib/class.rb - # branch_name (required) - The name of branch - # content (required) - File content - # commit_message (required) - Commit message - # - # Example Request: - # DELETE /projects/:id/repository/files - # - delete ":id/repository/files" do - authorize! :push_code, user_project - - required_attributes! [:file_path, :branch_name, :commit_message] - attrs = attributes_for_keys [:file_path, :branch_name, :commit_message] - branch_name = attrs.delete(:branch_name) - file_path = attrs.delete(:file_path) - result = ::Files::DeleteService.new(user_project, current_user, attrs, branch_name, file_path).execute - - if result[:status] == :success - status(200) - - { - file_path: file_path, - branch_name: branch_name - } - else - render_api_error!(result[:message], 400) - end - end - end - end -end diff --git a/lib/api/group_members.rb b/lib/api/group_members.rb deleted file mode 100644 index ab9b7c602b5..00000000000 --- a/lib/api/group_members.rb +++ /dev/null @@ -1,87 +0,0 @@ -module API - class GroupMembers < Grape::API - before { authenticate! } - - resource :groups do - # Get a list of group members viewable by the authenticated user. - # - # Example Request: - # GET /groups/:id/members - get ":id/members" do - group = find_group(params[:id]) - users = group.users - present users, with: Entities::GroupMember, group: group - end - - # Add a user to the list of group members - # - # Parameters: - # id (required) - group id - # user_id (required) - the users id - # access_level (required) - Project access level - # Example Request: - # POST /groups/:id/members - post ":id/members" do - group = find_group(params[:id]) - authorize! :admin_group, group - required_attributes! [:user_id, :access_level] - - unless validate_access_level?(params[:access_level]) - render_api_error!("Wrong access level", 422) - end - - if group.group_members.find_by(user_id: params[:user_id]) - render_api_error!("Already exists", 409) - end - - group.add_users([params[:user_id]], params[:access_level], current_user) - member = group.group_members.find_by(user_id: params[:user_id]) - present member.user, with: Entities::GroupMember, group: group - end - - # Update group member - # - # Parameters: - # id (required) - The ID of a group - # user_id (required) - The ID of a group member - # access_level (required) - Project access level - # Example Request: - # PUT /groups/:id/members/:user_id - put ':id/members/:user_id' do - group = find_group(params[:id]) - authorize! :admin_group, group - required_attributes! [:access_level] - - group_member = group.group_members.find_by(user_id: params[:user_id]) - not_found!('User can not be found') if group_member.nil? - - if group_member.update_attributes(access_level: params[:access_level]) - @member = group_member.user - present @member, with: Entities::GroupMember, group: group - else - handle_member_errors group_member.errors - end - end - - # Remove member. - # - # Parameters: - # id (required) - group id - # user_id (required) - the users id - # - # Example Request: - # DELETE /groups/:id/members/:user_id - delete ":id/members/:user_id" do - group = find_group(params[:id]) - authorize! :admin_group, group - member = group.group_members.find_by(user_id: params[:user_id]) - - if member.nil? - render_api_error!("404 Not Found - user_id:#{params[:user_id]} not a member of group #{group.name}",404) - else - member.destroy - end - end - end - end -end diff --git a/lib/api/groups.rb b/lib/api/groups.rb deleted file mode 100644 index 8cb9f920975..00000000000 --- a/lib/api/groups.rb +++ /dev/null @@ -1,89 +0,0 @@ -module API - # groups API - class Groups < Grape::API - before { authenticate! } - - resource :groups do - # Get a groups list - # - # Example Request: - # GET /groups - get do - @groups = if current_user.admin - Group.all - else - current_user.groups - end - - @groups = @groups.search(params[:search]) if params[:search].present? - @groups = paginate @groups - present @groups, with: Entities::Group - end - - # Create group. Available only for admin - # - # Parameters: - # name (required) - The name of the group - # path (required) - The path of the group - # Example Request: - # POST /groups - post do - authenticated_as_admin! - required_attributes! [:name, :path] - - attrs = attributes_for_keys [:name, :path, :description] - @group = Group.new(attrs) - - if @group.save - @group.add_owner(current_user) - present @group, with: Entities::Group - else - render_api_error!("Failed to save group #{@group.errors.messages}", 400) - end - end - - # Get a single group, with containing projects - # - # Parameters: - # id (required) - The ID of a group - # Example Request: - # GET /groups/:id - get ":id" do - group = find_group(params[:id]) - present group, with: Entities::GroupDetail - end - - # Remove group - # - # Parameters: - # id (required) - The ID of a group - # Example Request: - # DELETE /groups/:id - delete ":id" do - group = find_group(params[:id]) - authorize! :admin_group, group - group.destroy - end - - # Transfer a project to the Group namespace - # - # Parameters: - # id - group id - # project_id - project id - # Example Request: - # POST /groups/:id/projects/:project_id - post ":id/projects/:project_id" do - authenticated_as_admin! - group = Group.find(params[:id]) - project = Project.find(params[:project_id]) - result = ::Projects::TransferService.new(project, current_user, namespace_id: group.id).execute - - if result - present group - else - render_api_error!("Failed to transfer project #{project.errors.messages}", 400) - end - end - end - end -end diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb deleted file mode 100644 index be133a2920b..00000000000 --- a/lib/api/helpers.rb +++ /dev/null @@ -1,250 +0,0 @@ -module API - module APIHelpers - PRIVATE_TOKEN_HEADER = "HTTP_PRIVATE_TOKEN" - PRIVATE_TOKEN_PARAM = :private_token - SUDO_HEADER ="HTTP_SUDO" - SUDO_PARAM = :sudo - - def parse_boolean(value) - [ true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON' ].include?(value) - end - - def current_user - private_token = (params[PRIVATE_TOKEN_PARAM] || env[PRIVATE_TOKEN_HEADER]).to_s - @current_user ||= (User.find_by(authentication_token: private_token) || doorkeeper_guard) - - unless @current_user && Gitlab::UserAccess.allowed?(@current_user) - return nil - end - - identifier = sudo_identifier() - - # If the sudo is the current user do nothing - if identifier && !(@current_user.id == identifier || @current_user.username == identifier) - render_api_error!('403 Forbidden: Must be admin to use sudo', 403) unless @current_user.is_admin? - @current_user = User.by_username_or_id(identifier) - not_found!("No user id or username for: #{identifier}") if @current_user.nil? - end - - @current_user - end - - def sudo_identifier() - identifier ||= params[SUDO_PARAM] ||= env[SUDO_HEADER] - - # Regex for integers - if !!(identifier =~ /^[0-9]+$/) - identifier.to_i - else - identifier - end - end - - def user_project - @project ||= find_project(params[:id]) - @project || not_found!("Project") - end - - def find_project(id) - project = Project.find_with_namespace(id) || Project.find_by(id: id) - - if project && can?(current_user, :read_project, project) - project - else - nil - end - end - - def find_group(id) - begin - group = Group.find(id) - rescue ActiveRecord::RecordNotFound - group = Group.find_by!(path: id) - end - - if can?(current_user, :read_group, group) - group - else - forbidden!("#{current_user.username} lacks sufficient "\ - "access to #{group.name}") - end - end - - def paginate(relation) - per_page = params[:per_page].to_i - paginated = relation.page(params[:page]).per(per_page) - add_pagination_headers(paginated, per_page) - - paginated - end - - def authenticate! - unauthorized! unless current_user - end - - def authenticate_by_gitlab_shell_token! - input = params['secret_token'].try(:chomp) - unless Devise.secure_compare(secret_token, input) - unauthorized! - end - end - - def authenticated_as_admin! - forbidden! unless current_user.is_admin? - end - - def authorize!(action, subject) - unless abilities.allowed?(current_user, action, subject) - forbidden! - end - end - - def authorize_push_project - authorize! :push_code, user_project - end - - def authorize_admin_project - authorize! :admin_project, user_project - end - - def can?(object, action, subject) - abilities.allowed?(object, action, subject) - end - - # Checks the occurrences of required attributes, each attribute must be present in the params hash - # or a Bad Request error is invoked. - # - # Parameters: - # keys (required) - A hash consisting of keys that must be present - def required_attributes!(keys) - keys.each do |key| - bad_request!(key) unless params[key].present? - end - end - - def attributes_for_keys(keys) - attrs = {} - - keys.each do |key| - if params[key].present? or (params.has_key?(key) and params[key] == false) - attrs[key] = params[key] - end - end - - ActionController::Parameters.new(attrs).permit! - end - - # Helper method for validating all labels against its names - def validate_label_params(params) - errors = {} - - if params[:labels].present? - params[:labels].split(',').each do |label_name| - label = user_project.labels.create_with( - color: Label::DEFAULT_COLOR).find_or_initialize_by( - title: label_name.strip) - - if label.invalid? - errors[label.title] = label.errors - end - end - end - - errors - end - - def validate_access_level?(level) - Gitlab::Access.options_with_owner.values.include? level.to_i - end - - def issuable_order_by - if params["order_by"] == 'updated_at' - 'updated_at' - else - 'created_at' - end - end - - def issuable_sort - if params["sort"] == 'asc' - :asc - else - :desc - end - end - - # error helpers - - def forbidden!(reason = nil) - message = ['403 Forbidden'] - message << " - #{reason}" if reason - render_api_error!(message.join(' '), 403) - end - - def bad_request!(attribute) - message = ["400 (Bad request)"] - message << "\"" + attribute.to_s + "\" not given" - render_api_error!(message.join(' '), 400) - end - - def not_found!(resource = nil) - message = ["404"] - message << resource if resource - message << "Not Found" - render_api_error!(message.join(' '), 404) - end - - def unauthorized! - render_api_error!('401 Unauthorized', 401) - end - - def not_allowed! - render_api_error!('405 Method Not Allowed', 405) - end - - def conflict!(message = nil) - render_api_error!(message || '409 Conflict', 409) - end - - def render_validation_error!(model) - if model.errors.any? - render_api_error!(model.errors.messages || '400 Bad Request', 400) - end - end - - def render_api_error!(message, status) - error!({ 'message' => message }, status) - end - - private - - def add_pagination_headers(paginated, per_page) - request_url = request.url.split('?').first - - links = [] - links << %(<#{request_url}?page=#{paginated.current_page - 1}&per_page=#{per_page}>; rel="prev") unless paginated.first_page? - links << %(<#{request_url}?page=#{paginated.current_page + 1}&per_page=#{per_page}>; rel="next") unless paginated.last_page? - links << %(<#{request_url}?page=1&per_page=#{per_page}>; rel="first") - links << %(<#{request_url}?page=#{paginated.total_pages}&per_page=#{per_page}>; rel="last") - - header 'Link', links.join(', ') - end - - def abilities - @abilities ||= begin - abilities = Six.new - abilities << Ability - abilities - end - end - - def secret_token - File.read(Rails.root.join('.gitlab_shell_secret')).chomp - end - - def handle_member_errors(errors) - error!(errors[:access_level], 422) if errors[:access_level].any? - not_found!(errors) - end - end -end diff --git a/lib/api/internal.rb b/lib/api/internal.rb deleted file mode 100644 index f98a17773e7..00000000000 --- a/lib/api/internal.rb +++ /dev/null @@ -1,85 +0,0 @@ -module API - # Internal access API - class Internal < Grape::API - before { authenticate_by_gitlab_shell_token! } - - namespace 'internal' do - # Check if git command is allowed to project - # - # Params: - # key_id - ssh key id for Git over SSH - # user_id - user id for Git over HTTP - # project - project path with namespace - # action - git action (git-upload-pack or git-receive-pack) - # ref - branch name - # forced_push - forced_push - # - post "/allowed" do - status 200 - - actor = - if params[:key_id] - Key.find_by(id: params[:key_id]) - elsif params[:user_id] - User.find_by(id: params[:user_id]) - end - - unless actor - return Gitlab::GitAccessStatus.new(false, 'No such user or key') - end - - project_path = params[:project] - - # Check for *.wiki repositories. - # Strip out the .wiki from the pathname before finding the - # project. This applies the correct project permissions to - # the wiki repository as well. - wiki = project_path.end_with?('.wiki') - project_path.chomp!('.wiki') if wiki - - project = Project.find_with_namespace(project_path) - - if project - access = - if wiki - Gitlab::GitAccessWiki.new(actor, project) - else - Gitlab::GitAccess.new(actor, project) - end - - status = access.check(params[:action], params[:changes]) - end - - if project && access.can_read_project? - status - else - Gitlab::GitAccessStatus.new(false, 'No such project') - end - end - - # - # Discover user by ssh key - # - get "/discover" do - key = Key.find(params[:key_id]) - present key.user, with: Entities::UserSafe - end - - get "/check" do - { - api_version: API.version, - gitlab_version: Gitlab::VERSION, - gitlab_rev: Gitlab::REVISION, - } - end - - get "/broadcast_message" do - if message = BroadcastMessage.current - present message, with: Entities::BroadcastMessage - else - {} - end - end - end - end -end diff --git a/lib/api/issues.rb b/lib/api/issues.rb deleted file mode 100644 index ff062be6040..00000000000 --- a/lib/api/issues.rb +++ /dev/null @@ -1,181 +0,0 @@ -module API - # Issues API - class Issues < Grape::API - before { authenticate! } - - helpers do - def filter_issues_state(issues, state) - case state - when 'opened' then issues.opened - when 'closed' then issues.closed - else issues - end - end - - def filter_issues_labels(issues, labels) - issues.includes(:labels).where('labels.title' => labels.split(',')) - end - - def filter_issues_milestone(issues, milestone) - issues.includes(:milestone).where('milestones.title' => milestone) - end - end - - resource :issues do - # Get currently authenticated user's issues - # - # Parameters: - # state (optional) - Return "opened" or "closed" issues - # labels (optional) - Comma-separated list of label names - # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` - # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - # - # Example Requests: - # GET /issues - # GET /issues?state=opened - # GET /issues?state=closed - # GET /issues?labels=foo - # GET /issues?labels=foo,bar - # GET /issues?labels=foo,bar&state=opened - get do - issues = current_user.issues - issues = filter_issues_state(issues, params[:state]) unless params[:state].nil? - issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil? - issues.reorder(issuable_order_by => issuable_sort) - present paginate(issues), with: Entities::Issue - end - end - - resource :projects do - # Get a list of project issues - # - # Parameters: - # id (required) - The ID of a project - # state (optional) - Return "opened" or "closed" issues - # labels (optional) - Comma-separated list of label names - # milestone (optional) - Milestone title - # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` - # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - # - # Example Requests: - # GET /projects/:id/issues - # GET /projects/:id/issues?state=opened - # GET /projects/:id/issues?state=closed - # GET /projects/:id/issues?labels=foo - # GET /projects/:id/issues?labels=foo,bar - # GET /projects/:id/issues?labels=foo,bar&state=opened - # GET /projects/:id/issues?milestone=1.0.0 - # GET /projects/:id/issues?milestone=1.0.0&state=closed - get ":id/issues" do - issues = user_project.issues - issues = filter_issues_state(issues, params[:state]) unless params[:state].nil? - issues = filter_issues_labels(issues, params[:labels]) unless params[:labels].nil? - - unless params[:milestone].nil? - issues = filter_issues_milestone(issues, params[:milestone]) - end - - issues.reorder(issuable_order_by => issuable_sort) - present paginate(issues), with: Entities::Issue - end - - # Get a single project issue - # - # Parameters: - # id (required) - The ID of a project - # issue_id (required) - The ID of a project issue - # Example Request: - # GET /projects/:id/issues/:issue_id - get ":id/issues/:issue_id" do - @issue = user_project.issues.find(params[:issue_id]) - present @issue, with: Entities::Issue - end - - # Create a new project issue - # - # Parameters: - # id (required) - The ID of a project - # title (required) - The title of an issue - # description (optional) - The description of an issue - # assignee_id (optional) - The ID of a user to assign issue - # milestone_id (optional) - The ID of a milestone to assign issue - # labels (optional) - The labels of an issue - # Example Request: - # POST /projects/:id/issues - post ":id/issues" do - required_attributes! [:title] - attrs = attributes_for_keys [:title, :description, :assignee_id, :milestone_id] - - # Validate label names in advance - if (errors = validate_label_params(params)).any? - render_api_error!({ labels: errors }, 400) - end - - issue = ::Issues::CreateService.new(user_project, current_user, attrs).execute - - if issue.valid? - # Find or create labels and attach to issue. Labels are valid because - # we already checked its name, so there can't be an error here - if params[:labels].present? - issue.add_labels_by_names(params[:labels].split(',')) - end - - present issue, with: Entities::Issue - else - render_validation_error!(issue) - end - end - - # Update an existing issue - # - # Parameters: - # id (required) - The ID of a project - # issue_id (required) - The ID of a project issue - # title (optional) - The title of an issue - # description (optional) - The description of an issue - # assignee_id (optional) - The ID of a user to assign issue - # milestone_id (optional) - The ID of a milestone to assign issue - # labels (optional) - The labels of an issue - # state_event (optional) - The state event of an issue (close|reopen) - # Example Request: - # PUT /projects/:id/issues/:issue_id - put ":id/issues/:issue_id" do - issue = user_project.issues.find(params[:issue_id]) - authorize! :modify_issue, issue - attrs = attributes_for_keys [:title, :description, :assignee_id, :milestone_id, :state_event] - - # Validate label names in advance - if (errors = validate_label_params(params)).any? - render_api_error!({ labels: errors }, 400) - end - - issue = ::Issues::UpdateService.new(user_project, current_user, attrs).execute(issue) - - if issue.valid? - # Find or create labels and attach to issue. Labels are valid because - # we already checked its name, so there can't be an error here - unless params[:labels].nil? - issue.remove_labels - # Create and add labels to the new created issue - issue.add_labels_by_names(params[:labels].split(',')) - end - - present issue, with: Entities::Issue - else - render_validation_error!(issue) - end - end - - # Delete a project issue (deprecated) - # - # Parameters: - # id (required) - The ID of a project - # issue_id (required) - The ID of a project issue - # Example Request: - # DELETE /projects/:id/issues/:issue_id - delete ":id/issues/:issue_id" do - not_allowed! - end - end - end -end diff --git a/lib/api/labels.rb b/lib/api/labels.rb deleted file mode 100644 index 78ca58ad0d1..00000000000 --- a/lib/api/labels.rb +++ /dev/null @@ -1,98 +0,0 @@ -module API - # Labels API - class Labels < Grape::API - before { authenticate! } - - resource :projects do - # Get all labels of the project - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/labels - get ':id/labels' do - present user_project.labels, with: Entities::Label - end - - # Creates a new label - # - # Parameters: - # id (required) - The ID of a project - # name (required) - The name of the label to be deleted - # color (required) - Color of the label given in 6-digit hex - # notation with leading '#' sign (e.g. #FFAABB) - # Example Request: - # POST /projects/:id/labels - post ':id/labels' do - authorize! :admin_label, user_project - required_attributes! [:name, :color] - - attrs = attributes_for_keys [:name, :color] - label = user_project.find_label(attrs[:name]) - - conflict!('Label already exists') if label - - label = user_project.labels.create(attrs) - - if label.valid? - present label, with: Entities::Label - else - render_validation_error!(label) - end - end - - # Deletes an existing label - # - # Parameters: - # id (required) - The ID of a project - # name (required) - The name of the label to be deleted - # - # Example Request: - # DELETE /projects/:id/labels - delete ':id/labels' do - authorize! :admin_label, user_project - required_attributes! [:name] - - label = user_project.find_label(params[:name]) - not_found!('Label') unless label - - label.destroy - end - - # Updates an existing label. At least one optional parameter is required. - # - # Parameters: - # id (required) - The ID of a project - # name (required) - The name of the label to be deleted - # new_name (optional) - The new name of the label - # color (optional) - Color of the label given in 6-digit hex - # notation with leading '#' sign (e.g. #FFAABB) - # Example Request: - # PUT /projects/:id/labels - put ':id/labels' do - authorize! :admin_label, user_project - required_attributes! [:name] - - label = user_project.find_label(params[:name]) - not_found!('Label not found') unless label - - attrs = attributes_for_keys [:new_name, :color] - - if attrs.empty? - render_api_error!('Required parameters "new_name" or "color" ' \ - 'missing', - 400) - end - - # Rename new name to the actual label attribute name - attrs[:name] = attrs.delete(:new_name) if attrs.key?(:new_name) - - if label.update(attrs) - present label, with: Entities::Label - else - render_validation_error!(label) - end - end - end - end -end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb deleted file mode 100644 index f3765f5ab03..00000000000 --- a/lib/api/merge_requests.rb +++ /dev/null @@ -1,249 +0,0 @@ -module API - # MergeRequest API - class MergeRequests < Grape::API - before { authenticate! } - - resource :projects do - helpers do - def handle_merge_request_errors!(errors) - if errors[:project_access].any? - error!(errors[:project_access], 422) - elsif errors[:branch_conflict].any? - error!(errors[:branch_conflict], 422) - elsif errors[:validate_fork].any? - error!(errors[:validate_fork], 422) - elsif errors[:validate_branches].any? - conflict!(errors[:validate_branches]) - end - - render_api_error!(errors, 400) - end - end - - # List merge requests - # - # Parameters: - # id (required) - The ID of a project - # state (optional) - Return requests "merged", "opened" or "closed" - # order_by (optional) - Return requests ordered by `created_at` or `updated_at` fields. Default is `created_at` - # sort (optional) - Return requests sorted in `asc` or `desc` order. Default is `desc` - # - # Example: - # GET /projects/:id/merge_requests - # GET /projects/:id/merge_requests?state=opened - # GET /projects/:id/merge_requests?state=closed - # GET /projects/:id/merge_requests?order_by=created_at - # GET /projects/:id/merge_requests?order_by=updated_at - # GET /projects/:id/merge_requests?sort=desc - # GET /projects/:id/merge_requests?sort=asc - # - get ":id/merge_requests" do - authorize! :read_merge_request, user_project - merge_requests = user_project.merge_requests - - merge_requests = - case params["state"] - when "opened" then merge_requests.opened - when "closed" then merge_requests.closed - when "merged" then merge_requests.merged - else merge_requests - end - - merge_requests.reorder(issuable_order_by => issuable_sort) - present paginate(merge_requests), with: Entities::MergeRequest - end - - # Show MR - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - The ID of MR - # - # Example: - # GET /projects/:id/merge_request/:merge_request_id - # - get ":id/merge_request/:merge_request_id" do - merge_request = user_project.merge_requests.find(params[:merge_request_id]) - - authorize! :read_merge_request, merge_request - - present merge_request, with: Entities::MergeRequest - end - - # Show MR changes - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - The ID of MR - # - # Example: - # GET /projects/:id/merge_request/:merge_request_id/changes - # - get ':id/merge_request/:merge_request_id/changes' do - merge_request = user_project.merge_requests. - find(params[:merge_request_id]) - authorize! :read_merge_request, merge_request - present merge_request, with: Entities::MergeRequestChanges - end - - # Create MR - # - # Parameters: - # - # id (required) - The ID of a project - this will be the source of the merge request - # source_branch (required) - The source branch - # target_branch (required) - The target branch - # target_project - The target project of the merge request defaults to the :id of the project - # assignee_id - Assignee user ID - # title (required) - Title of MR - # description - Description of MR - # labels (optional) - Labels for MR as a comma-separated list - # - # Example: - # POST /projects/:id/merge_requests - # - post ":id/merge_requests" do - authorize! :write_merge_request, user_project - required_attributes! [:source_branch, :target_branch, :title] - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description] - - # Validate label names in advance - if (errors = validate_label_params(params)).any? - render_api_error!({ labels: errors }, 400) - end - - merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute - - if merge_request.valid? - # Find or create labels and attach to issue - if params[:labels].present? - merge_request.add_labels_by_names(params[:labels].split(",")) - end - - present merge_request, with: Entities::MergeRequest - else - handle_merge_request_errors! merge_request.errors - end - end - - # Update MR - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - ID of MR - # source_branch - The source branch - # target_branch - The target branch - # assignee_id - Assignee user ID - # title - Title of MR - # state_event - Status of MR. (close|reopen|merge) - # description - Description of MR - # labels (optional) - Labels for a MR as a comma-separated list - # Example: - # PUT /projects/:id/merge_request/:merge_request_id - # - put ":id/merge_request/:merge_request_id" do - attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description] - merge_request = user_project.merge_requests.find(params[:merge_request_id]) - authorize! :modify_merge_request, merge_request - - # Validate label names in advance - if (errors = validate_label_params(params)).any? - render_api_error!({ labels: errors }, 400) - end - - merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request) - - if merge_request.valid? - # Find or create labels and attach to issue - unless params[:labels].nil? - merge_request.remove_labels - merge_request.add_labels_by_names(params[:labels].split(",")) - end - - present merge_request, with: Entities::MergeRequest - else - handle_merge_request_errors! merge_request.errors - end - end - - # Merge MR - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - ID of MR - # merge_commit_message (optional) - Custom merge commit message - # Example: - # PUT /projects/:id/merge_request/:merge_request_id/merge - # - put ":id/merge_request/:merge_request_id/merge" do - merge_request = user_project.merge_requests.find(params[:merge_request_id]) - - allowed = ::Gitlab::GitAccess.new(current_user, user_project). - can_push_to_branch?(merge_request.target_branch) - - if allowed - if merge_request.unchecked? - merge_request.check_if_can_be_merged - end - - if merge_request.open? - if merge_request.can_be_merged? - merge_request.automerge!(current_user, params[:merge_commit_message] || merge_request.merge_commit_message) - present merge_request, with: Entities::MergeRequest - else - render_api_error!('Branch cannot be merged', 405) - end - else - # Merge request can not be merged - # because it is already closed/merged - not_allowed! - end - else - # Merge request can not be merged - # because user dont have permissions to push into target branch - unauthorized! - end - end - - - # Get a merge request's comments - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - ID of MR - # Examples: - # GET /projects/:id/merge_request/:merge_request_id/comments - # - get ":id/merge_request/:merge_request_id/comments" do - merge_request = user_project.merge_requests.find(params[:merge_request_id]) - - authorize! :read_merge_request, merge_request - - present paginate(merge_request.notes), with: Entities::MRNote - end - - # Post comment to merge request - # - # Parameters: - # id (required) - The ID of a project - # merge_request_id (required) - ID of MR - # note (required) - Text of comment - # Examples: - # POST /projects/:id/merge_request/:merge_request_id/comments - # - post ":id/merge_request/:merge_request_id/comments" do - required_attributes! [:note] - - merge_request = user_project.merge_requests.find(params[:merge_request_id]) - note = merge_request.notes.new(note: params[:note], project_id: user_project.id) - note.author = current_user - - if note.save - present note, with: Entities::MRNote - else - render_api_error!("Failed to save note #{note.errors.messages}", 400) - end - end - end - end -end diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb deleted file mode 100644 index c5cd73943fb..00000000000 --- a/lib/api/milestones.rb +++ /dev/null @@ -1,95 +0,0 @@ -module API - # Milestones API - class Milestones < Grape::API - before { authenticate! } - - resource :projects do - # Get a list of project milestones - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/milestones - get ":id/milestones" do - authorize! :read_milestone, user_project - - present paginate(user_project.milestones), with: Entities::Milestone - end - - # Get a single project milestone - # - # Parameters: - # id (required) - The ID of a project - # milestone_id (required) - The ID of a project milestone - # Example Request: - # GET /projects/:id/milestones/:milestone_id - get ":id/milestones/:milestone_id" do - authorize! :read_milestone, user_project - - @milestone = user_project.milestones.find(params[:milestone_id]) - present @milestone, with: Entities::Milestone - end - - # Create a new project milestone - # - # Parameters: - # id (required) - The ID of the project - # title (required) - The title of the milestone - # description (optional) - The description of the milestone - # due_date (optional) - The due date of the milestone - # Example Request: - # POST /projects/:id/milestones - post ":id/milestones" do - authorize! :admin_milestone, user_project - required_attributes! [:title] - attrs = attributes_for_keys [:title, :description, :due_date] - milestone = ::Milestones::CreateService.new(user_project, current_user, attrs).execute - - if milestone.valid? - present milestone, with: Entities::Milestone - else - render_api_error!("Failed to create milestone #{milestone.errors.messages}", 400) - end - end - - # Update an existing project milestone - # - # Parameters: - # id (required) - The ID of a project - # milestone_id (required) - The ID of a project milestone - # title (optional) - The title of a milestone - # description (optional) - The description of a milestone - # due_date (optional) - The due date of a milestone - # state_event (optional) - The state event of the milestone (close|activate) - # Example Request: - # PUT /projects/:id/milestones/:milestone_id - put ":id/milestones/:milestone_id" do - authorize! :admin_milestone, user_project - attrs = attributes_for_keys [:title, :description, :due_date, :state_event] - milestone = user_project.milestones.find(params[:milestone_id]) - milestone = ::Milestones::UpdateService.new(user_project, current_user, attrs).execute(milestone) - - if milestone.valid? - present milestone, with: Entities::Milestone - else - render_api_error!("Failed to update milestone #{milestone.errors.messages}", 400) - end - end - - # Get all issues for a single project milestone - # - # Parameters: - # id (required) - The ID of a project - # milestone_id (required) - The ID of a project milestone - # Example Request: - # GET /projects/:id/milestones/:milestone_id/issues - get ":id/milestones/:milestone_id/issues" do - authorize! :read_milestone, user_project - - @milestone = user_project.milestones.find(params[:milestone_id]) - present paginate(@milestone.issues), with: Entities::Issue - end - - end - end -end diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb deleted file mode 100644 index b90ed6af5fb..00000000000 --- a/lib/api/namespaces.rb +++ /dev/null @@ -1,23 +0,0 @@ -module API - # namespaces API - class Namespaces < Grape::API - before do - authenticate! - authenticated_as_admin! - end - - resource :namespaces do - # Get a namespaces list - # - # Example Request: - # GET /namespaces - get do - @namespaces = Namespace.all - @namespaces = @namespaces.search(params[:search]) if params[:search].present? - @namespaces = paginate @namespaces - - present @namespaces, with: Entities::Namespace - end - end - end -end diff --git a/lib/api/notes.rb b/lib/api/notes.rb deleted file mode 100644 index 3726be7c537..00000000000 --- a/lib/api/notes.rb +++ /dev/null @@ -1,103 +0,0 @@ -module API - # Notes API - class Notes < Grape::API - before { authenticate! } - - NOTEABLE_TYPES = [Issue, MergeRequest, Snippet] - - resource :projects do - NOTEABLE_TYPES.each do |noteable_type| - noteables_str = noteable_type.to_s.underscore.pluralize - noteable_id_str = "#{noteable_type.to_s.underscore}_id" - - # Get a list of project +noteable+ notes - # - # Parameters: - # id (required) - The ID of a project - # noteable_id (required) - The ID of an issue or snippet - # Example Request: - # GET /projects/:id/issues/:noteable_id/notes - # GET /projects/:id/snippets/:noteable_id/notes - get ":id/#{noteables_str}/:#{noteable_id_str}/notes" do - @noteable = user_project.send(:"#{noteables_str}").find(params[:"#{noteable_id_str}"]) - present paginate(@noteable.notes), with: Entities::Note - end - - # Get a single +noteable+ note - # - # Parameters: - # id (required) - The ID of a project - # noteable_id (required) - The ID of an issue or snippet - # note_id (required) - The ID of a note - # Example Request: - # GET /projects/:id/issues/:noteable_id/notes/:note_id - # GET /projects/:id/snippets/:noteable_id/notes/:note_id - get ":id/#{noteables_str}/:#{noteable_id_str}/notes/:note_id" do - @noteable = user_project.send(:"#{noteables_str}").find(params[:"#{noteable_id_str}"]) - @note = @noteable.notes.find(params[:note_id]) - present @note, with: Entities::Note - end - - # Create a new +noteable+ note - # - # Parameters: - # id (required) - The ID of a project - # noteable_id (required) - The ID of an issue or snippet - # body (required) - The content of a note - # Example Request: - # POST /projects/:id/issues/:noteable_id/notes - # POST /projects/:id/snippets/:noteable_id/notes - post ":id/#{noteables_str}/:#{noteable_id_str}/notes" do - required_attributes! [:body] - - opts = { - note: params[:body], - noteable_type: noteables_str.classify, - noteable_id: params[noteable_id_str] - } - - @note = ::Notes::CreateService.new(user_project, current_user, opts).execute - - if @note.valid? - present @note, with: Entities::Note - else - not_found!("Note #{@note.errors.messages}") - end - end - - # Modify existing +noteable+ note - # - # Parameters: - # id (required) - The ID of a project - # noteable_id (required) - The ID of an issue or snippet - # node_id (required) - The ID of a note - # body (required) - New content of a note - # Example Request: - # PUT /projects/:id/issues/:noteable_id/notes/:note_id - # PUT /projects/:id/snippets/:noteable_id/notes/:node_id - put ":id/#{noteables_str}/:#{noteable_id_str}/notes/:note_id" do - required_attributes! [:body] - - authorize! :admin_note, user_project.notes.find(params[:note_id]) - - opts = { - note: params[:body], - note_id: params[:note_id], - noteable_type: noteables_str.classify, - noteable_id: params[noteable_id_str] - } - - @note = ::Notes::UpdateService.new(user_project, current_user, - opts).execute - - if @note.valid? - present @note, with: Entities::Note - else - render_api_error!("Failed to save note #{note.errors.messages}", 400) - end - end - - end - end - end -end diff --git a/lib/api/project_hooks.rb b/lib/api/project_hooks.rb deleted file mode 100644 index be9850367b9..00000000000 --- a/lib/api/project_hooks.rb +++ /dev/null @@ -1,108 +0,0 @@ -module API - # Projects API - class ProjectHooks < Grape::API - before { authenticate! } - before { authorize_admin_project } - - resource :projects do - # Get project hooks - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/hooks - get ":id/hooks" do - @hooks = paginate user_project.hooks - present @hooks, with: Entities::ProjectHook - end - - # Get a project hook - # - # Parameters: - # id (required) - The ID of a project - # hook_id (required) - The ID of a project hook - # Example Request: - # GET /projects/:id/hooks/:hook_id - get ":id/hooks/:hook_id" do - @hook = user_project.hooks.find(params[:hook_id]) - present @hook, with: Entities::ProjectHook - end - - - # Add hook to project - # - # Parameters: - # id (required) - The ID of a project - # url (required) - The hook URL - # Example Request: - # POST /projects/:id/hooks - post ":id/hooks" do - required_attributes! [:url] - attrs = attributes_for_keys [ - :url, - :push_events, - :issues_events, - :merge_requests_events, - :tag_push_events - ] - @hook = user_project.hooks.new(attrs) - - if @hook.save - present @hook, with: Entities::ProjectHook - else - if @hook.errors[:url].present? - error!("Invalid url given", 422) - end - not_found!("Project hook #{@hook.errors.messages}") - end - end - - # Update an existing project hook - # - # Parameters: - # id (required) - The ID of a project - # hook_id (required) - The ID of a project hook - # url (required) - The hook URL - # Example Request: - # PUT /projects/:id/hooks/:hook_id - put ":id/hooks/:hook_id" do - @hook = user_project.hooks.find(params[:hook_id]) - required_attributes! [:url] - attrs = attributes_for_keys [ - :url, - :push_events, - :issues_events, - :merge_requests_events, - :tag_push_events - ] - - if @hook.update_attributes attrs - present @hook, with: Entities::ProjectHook - else - if @hook.errors[:url].present? - error!("Invalid url given", 422) - end - not_found!("Project hook #{@hook.errors.messages}") - end - end - - # Deletes project hook. This is an idempotent function. - # - # Parameters: - # id (required) - The ID of a project - # hook_id (required) - The ID of hook to delete - # Example Request: - # DELETE /projects/:id/hooks/:hook_id - delete ":id/hooks/:hook_id" do - required_attributes! [:hook_id] - - begin - @hook = ProjectHook.find(params[:hook_id]) - @hook.destroy - rescue - # ProjectHook can raise Error if hook_id not found - end - end - end - end -end diff --git a/lib/api/project_members.rb b/lib/api/project_members.rb deleted file mode 100644 index c756bb479fc..00000000000 --- a/lib/api/project_members.rb +++ /dev/null @@ -1,106 +0,0 @@ -module API - # Projects members API - class ProjectMembers < Grape::API - before { authenticate! } - - resource :projects do - - # Get a project team members - # - # Parameters: - # id (required) - The ID of a project - # query - Query string - # Example Request: - # GET /projects/:id/members - get ":id/members" do - if params[:query].present? - @members = paginate user_project.users.where("username LIKE ?", "%#{params[:query]}%") - else - @members = paginate user_project.users - end - present @members, with: Entities::ProjectMember, project: user_project - end - - # Get a project team members - # - # Parameters: - # id (required) - The ID of a project - # user_id (required) - The ID of a user - # Example Request: - # GET /projects/:id/members/:user_id - get ":id/members/:user_id" do - @member = user_project.users.find params[:user_id] - present @member, with: Entities::ProjectMember, project: user_project - end - - # Add a new project team member - # - # Parameters: - # id (required) - The ID of a project - # user_id (required) - The ID of a user - # access_level (required) - Project access level - # Example Request: - # POST /projects/:id/members - post ":id/members" do - authorize! :admin_project, user_project - required_attributes! [:user_id, :access_level] - - # either the user is already a team member or a new one - project_member = user_project.project_member_by_id(params[:user_id]) - if project_member.nil? - project_member = user_project.project_members.new( - user_id: params[:user_id], - access_level: params[:access_level] - ) - end - - if project_member.save - @member = project_member.user - present @member, with: Entities::ProjectMember, project: user_project - else - handle_member_errors project_member.errors - end - end - - # Update project team member - # - # Parameters: - # id (required) - The ID of a project - # user_id (required) - The ID of a team member - # access_level (required) - Project access level - # Example Request: - # PUT /projects/:id/members/:user_id - put ":id/members/:user_id" do - authorize! :admin_project, user_project - required_attributes! [:access_level] - - project_member = user_project.project_members.find_by(user_id: params[:user_id]) - not_found!("User can not be found") if project_member.nil? - - if project_member.update_attributes(access_level: params[:access_level]) - @member = project_member.user - present @member, with: Entities::ProjectMember, project: user_project - else - handle_member_errors project_member.errors - end - end - - # Remove a team member from project - # - # Parameters: - # id (required) - The ID of a project - # user_id (required) - The ID of a team member - # Example Request: - # DELETE /projects/:id/members/:user_id - delete ":id/members/:user_id" do - authorize! :admin_project, user_project - project_member = user_project.project_members.find_by(user_id: params[:user_id]) - unless project_member.nil? - project_member.destroy - else - { message: "Access revoked", id: params[:user_id].to_i } - end - end - end - end -end diff --git a/lib/api/project_snippets.rb b/lib/api/project_snippets.rb deleted file mode 100644 index 54f2555903f..00000000000 --- a/lib/api/project_snippets.rb +++ /dev/null @@ -1,124 +0,0 @@ -module API - # Projects API - class ProjectSnippets < Grape::API - before { authenticate! } - - resource :projects do - helpers do - def handle_project_member_errors(errors) - if errors[:project_access].any? - error!(errors[:project_access], 422) - end - not_found! - end - end - - # Get a project snippets - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/snippets - get ":id/snippets" do - present paginate(user_project.snippets), with: Entities::ProjectSnippet - end - - # Get a project snippet - # - # Parameters: - # id (required) - The ID of a project - # snippet_id (required) - The ID of a project snippet - # Example Request: - # GET /projects/:id/snippets/:snippet_id - get ":id/snippets/:snippet_id" do - @snippet = user_project.snippets.find(params[:snippet_id]) - present @snippet, with: Entities::ProjectSnippet - end - - # Create a new project snippet - # - # Parameters: - # id (required) - The ID of a project - # title (required) - The title of a snippet - # file_name (required) - The name of a snippet file - # code (required) - The content of a snippet - # visibility_level (required) - The snippet's visibility - # Example Request: - # POST /projects/:id/snippets - post ":id/snippets" do - authorize! :write_project_snippet, user_project - required_attributes! [:title, :file_name, :code, :visibility_level] - - attrs = attributes_for_keys [:title, :file_name, :visibility_level] - attrs[:content] = params[:code] if params[:code].present? - @snippet = CreateSnippetService.new(user_project, current_user, - attrs).execute - - if @snippet.errors.any? - render_validation_error!(@snippet) - else - present @snippet, with: Entities::ProjectSnippet - end - end - - # Update an existing project snippet - # - # Parameters: - # id (required) - The ID of a project - # snippet_id (required) - The ID of a project snippet - # title (optional) - The title of a snippet - # file_name (optional) - The name of a snippet file - # code (optional) - The content of a snippet - # visibility_level (optional) - The snippet's visibility - # Example Request: - # PUT /projects/:id/snippets/:snippet_id - put ":id/snippets/:snippet_id" do - @snippet = user_project.snippets.find(params[:snippet_id]) - authorize! :modify_project_snippet, @snippet - - attrs = attributes_for_keys [:title, :file_name, :visibility_level] - attrs[:content] = params[:code] if params[:code].present? - - UpdateSnippetService.new(user_project, current_user, @snippet, - attrs).execute - if @snippet.errors.any? - render_validation_error!(@snippet) - else - present @snippet, with: Entities::ProjectSnippet - end - end - - # Delete a project snippet - # - # Parameters: - # id (required) - The ID of a project - # snippet_id (required) - The ID of a project snippet - # Example Request: - # DELETE /projects/:id/snippets/:snippet_id - delete ":id/snippets/:snippet_id" do - begin - @snippet = user_project.snippets.find(params[:snippet_id]) - authorize! :modify_project_snippet, @snippet - @snippet.destroy - rescue - not_found!('Snippet') - end - end - - # Get a raw project snippet - # - # Parameters: - # id (required) - The ID of a project - # snippet_id (required) - The ID of a project snippet - # Example Request: - # GET /projects/:id/snippets/:snippet_id/raw - get ":id/snippets/:snippet_id/raw" do - @snippet = user_project.snippets.find(params[:snippet_id]) - - env['api.format'] = :txt - content_type 'text/plain' - present @snippet.content - end - end - end -end diff --git a/lib/api/projects.rb b/lib/api/projects.rb deleted file mode 100644 index e3fff79d68f..00000000000 --- a/lib/api/projects.rb +++ /dev/null @@ -1,323 +0,0 @@ -module API - # Projects API - class Projects < Grape::API - before { authenticate! } - - resource :projects do - helpers do - def map_public_to_visibility_level(attrs) - publik = attrs.delete(:public) - publik = parse_boolean(publik) - attrs[:visibility_level] = Gitlab::VisibilityLevel::PUBLIC if !attrs[:visibility_level].present? && publik == true - attrs - end - - def filter_projects(projects) - # If the archived parameter is passed, limit results accordingly - if params[:archived].present? - projects = projects.where(archived: parse_boolean(params[:archived])) - end - - if params[:search].present? - projects = projects.search(params[:search]) - end - - projects.reorder(project_order_by => project_sort) - end - - def project_order_by - order_fields = %w(id name path created_at updated_at last_activity_at) - - if order_fields.include?(params['order_by']) - params['order_by'] - else - 'created_at' - end - end - - def project_sort - if params["sort"] == 'asc' - :asc - else - :desc - end - end - end - - # Get a projects list for authenticated user - # - # Example Request: - # GET /projects - get do - @projects = current_user.authorized_projects - @projects = filter_projects(@projects) - @projects = paginate @projects - present @projects, with: Entities::Project - end - - # Get an owned projects list for authenticated user - # - # Example Request: - # GET /projects/owned - get '/owned' do - @projects = current_user.owned_projects - @projects = filter_projects(@projects) - @projects = paginate @projects - present @projects, with: Entities::Project - end - - # Get all projects for admin user - # - # Example Request: - # GET /projects/all - get '/all' do - authenticated_as_admin! - @projects = Project.all - @projects = filter_projects(@projects) - @projects = paginate @projects - present @projects, with: Entities::Project - end - - # Get a single project - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id - get ":id" do - present user_project, with: Entities::ProjectWithAccess, user: current_user - end - - # Get events for a single project - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/events - get ":id/events" do - events = paginate user_project.events.recent - present events, with: Entities::Event - end - - # Create new project - # - # Parameters: - # name (required) - name for new project - # description (optional) - short project description - # issues_enabled (optional) - # merge_requests_enabled (optional) - # wiki_enabled (optional) - # snippets_enabled (optional) - # namespace_id (optional) - defaults to user namespace - # public (optional) - if true same as setting visibility_level = 20 - # visibility_level (optional) - 0 by default - # import_url (optional) - # Example Request - # POST /projects - post do - required_attributes! [:name] - attrs = attributes_for_keys [:name, - :path, - :description, - :issues_enabled, - :merge_requests_enabled, - :wiki_enabled, - :snippets_enabled, - :namespace_id, - :public, - :visibility_level, - :import_url] - attrs = map_public_to_visibility_level(attrs) - @project = ::Projects::CreateService.new(current_user, attrs).execute - if @project.saved? - present @project, with: Entities::Project - else - if @project.errors[:limit_reached].present? - error!(@project.errors[:limit_reached], 403) - end - render_validation_error!(@project) - end - end - - # Create new project for a specified user. Only available to admin users. - # - # Parameters: - # user_id (required) - The ID of a user - # name (required) - name for new project - # description (optional) - short project description - # default_branch (optional) - 'master' by default - # issues_enabled (optional) - # merge_requests_enabled (optional) - # wiki_enabled (optional) - # snippets_enabled (optional) - # public (optional) - if true same as setting visibility_level = 20 - # visibility_level (optional) - # import_url (optional) - # Example Request - # POST /projects/user/:user_id - post "user/:user_id" do - authenticated_as_admin! - user = User.find(params[:user_id]) - attrs = attributes_for_keys [:name, - :description, - :default_branch, - :issues_enabled, - :merge_requests_enabled, - :wiki_enabled, - :snippets_enabled, - :public, - :visibility_level, - :import_url] - attrs = map_public_to_visibility_level(attrs) - @project = ::Projects::CreateService.new(user, attrs).execute - if @project.saved? - present @project, with: Entities::Project - else - render_validation_error!(@project) - end - end - - # Fork new project for the current user. - # - # Parameters: - # id (required) - The ID of a project - # Example Request - # POST /projects/fork/:id - post 'fork/:id' do - @forked_project = - ::Projects::ForkService.new(user_project, - current_user).execute - if @forked_project.errors.any? - conflict!(@forked_project.errors.messages) - else - present @forked_project, with: Entities::Project - end - end - - # Update an existing project - # - # Parameters: - # id (required) - the id of a project - # name (optional) - name of a project - # path (optional) - path of a project - # description (optional) - short project description - # issues_enabled (optional) - # merge_requests_enabled (optional) - # wiki_enabled (optional) - # snippets_enabled (optional) - # public (optional) - if true same as setting visibility_level = 20 - # visibility_level (optional) - visibility level of a project - # Example Request - # PUT /projects/:id - put ':id' do - attrs = attributes_for_keys [:name, - :path, - :description, - :default_branch, - :issues_enabled, - :merge_requests_enabled, - :wiki_enabled, - :snippets_enabled, - :public, - :visibility_level] - attrs = map_public_to_visibility_level(attrs) - authorize_admin_project - authorize! :rename_project, user_project if attrs[:name].present? - if attrs[:visibility_level].present? - authorize! :change_visibility_level, user_project - end - - ::Projects::UpdateService.new(user_project, - current_user, attrs).execute - - if user_project.errors.any? - render_validation_error!(user_project) - else - present user_project, with: Entities::Project - end - end - - # Remove project - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # DELETE /projects/:id - delete ":id" do - authorize! :remove_project, user_project - ::Projects::DestroyService.new(user_project, current_user, {}).execute - end - - # Mark this project as forked from another - # - # Parameters: - # id: (required) - The ID of the project being marked as a fork - # forked_from_id: (required) - The ID of the project it was forked from - # Example Request: - # POST /projects/:id/fork/:forked_from_id - post ":id/fork/:forked_from_id" do - authenticated_as_admin! - forked_from_project = find_project(params[:forked_from_id]) - unless forked_from_project.nil? - if user_project.forked_from_project.nil? - user_project.create_forked_project_link(forked_to_project_id: user_project.id, forked_from_project_id: forked_from_project.id) - else - render_api_error!("Project already forked", 409) - end - else - not_found!("Source Project") - end - - end - - # Remove a forked_from relationship - # - # Parameters: - # id: (required) - The ID of the project being marked as a fork - # Example Request: - # DELETE /projects/:id/fork - delete ":id/fork" do - authenticated_as_admin! - unless user_project.forked_project_link.nil? - user_project.forked_project_link.destroy - end - end - # search for projects current_user has access to - # - # Parameters: - # query (required) - A string contained in the project name - # per_page (optional) - number of projects to return per page - # page (optional) - the page to retrieve - # Example Request: - # GET /projects/search/:query - get "/search/:query" do - ids = current_user.authorized_projects.map(&:id) - visibility_levels = [ Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::PUBLIC ] - projects = Project.where("(id in (?) OR visibility_level in (?)) AND (name LIKE (?))", ids, visibility_levels, "%#{params[:query]}%") - sort = params[:sort] == 'desc' ? 'desc' : 'asc' - - projects = case params["order_by"] - when 'id' then projects.order("id #{sort}") - when 'name' then projects.order("name #{sort}") - when 'created_at' then projects.order("created_at #{sort}") - when 'last_activity_at' then projects.order("last_activity_at #{sort}") - else projects - end - - present paginate(projects), with: Entities::Project - end - - - # Get a users list - # - # Example Request: - # GET /users - get ':id/users' do - @users = User.where(id: user_project.team.users.map(&:id)) - @users = @users.search(params[:search]) if params[:search].present? - @users = paginate @users - present @users, with: Entities::UserBasic - end - end - end -end diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb deleted file mode 100644 index 1fbf3dca3c6..00000000000 --- a/lib/api/repositories.rb +++ /dev/null @@ -1,190 +0,0 @@ -require 'mime/types' - -module API - # Projects API - class Repositories < Grape::API - before { authenticate! } - before { authorize! :download_code, user_project } - - resource :projects do - helpers do - def handle_project_member_errors(errors) - if errors[:project_access].any? - error!(errors[:project_access], 422) - end - not_found! - end - end - - # Get a project repository tags - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/repository/tags - get ":id/repository/tags" do - present user_project.repo.tags.sort_by(&:name).reverse, - with: Entities::RepoTag, project: user_project - end - - # Create tag - # - # Parameters: - # id (required) - The ID of a project - # tag_name (required) - The name of the tag - # ref (required) - Create tag from commit sha or branch - # message (optional) - Specifying a message creates an annotated tag. - # Example Request: - # POST /projects/:id/repository/tags - post ':id/repository/tags' do - authorize_push_project - message = params[:message] || nil - result = CreateTagService.new(user_project, current_user). - execute(params[:tag_name], params[:ref], message) - - if result[:status] == :success - present result[:tag], - with: Entities::RepoTag, - project: user_project - else - render_api_error!(result[:message], 400) - end - end - - # Get a project repository tree - # - # Parameters: - # id (required) - The ID of a project - # ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used - # Example Request: - # GET /projects/:id/repository/tree - get ':id/repository/tree' do - ref = params[:ref_name] || user_project.try(:default_branch) || 'master' - path = params[:path] || nil - - commit = user_project.repository.commit(ref) - not_found!('Tree') unless commit - - tree = user_project.repository.tree(commit.id, path) - - present tree.sorted_entries, with: Entities::RepoTreeObject - end - - # Get a raw file contents - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The commit or branch name - # filepath (required) - The path to the file to display - # Example Request: - # GET /projects/:id/repository/blobs/:sha - get [ ":id/repository/blobs/:sha", ":id/repository/commits/:sha/blob" ] do - required_attributes! [:filepath] - - ref = params[:sha] - - repo = user_project.repository - - commit = repo.commit(ref) - not_found! "Commit" unless commit - - blob = Gitlab::Git::Blob.find(repo, commit.id, params[:filepath]) - not_found! "File" unless blob - - content_type 'text/plain' - present blob.data - end - - # Get a raw blob contents by blob sha - # - # Parameters: - # id (required) - The ID of a project - # sha (required) - The blob's sha - # Example Request: - # GET /projects/:id/repository/raw_blobs/:sha - get ':id/repository/raw_blobs/:sha' do - ref = params[:sha] - - repo = user_project.repository - - begin - blob = Gitlab::Git::Blob.raw(repo, ref) - rescue - not_found! 'Blob' - end - - not_found! 'Blob' unless blob - - env['api.format'] = :txt - - content_type blob.mime_type - present blob.data - end - - # Get a an archive of the repository - # - # Parameters: - # id (required) - The ID of a project - # sha (optional) - the commit sha to download defaults to the tip of the default branch - # Example Request: - # GET /projects/:id/repository/archive - get ':id/repository/archive', - requirements: { format: Gitlab::Regex.archive_formats_regex } do - authorize! :download_code, user_project - - begin - file_path = ArchiveRepositoryService.new( - user_project, - params[:sha], - params[:format] - ).execute - rescue - not_found!('File') - end - - if file_path && File.exists?(file_path) - data = File.open(file_path, 'rb').read - basename = File.basename(file_path) - header['Content-Disposition'] = "attachment; filename=\"#{basename}\"" - content_type MIME::Types.type_for(file_path).first.content_type - env['api.format'] = :binary - present data - else - redirect request.fullpath - end - end - - # Compare two branches, tags or commits - # - # Parameters: - # id (required) - The ID of a project - # from (required) - the commit sha or branch name - # to (required) - the commit sha or branch name - # Example Request: - # GET /projects/:id/repository/compare?from=master&to=feature - get ':id/repository/compare' do - authorize! :download_code, user_project - required_attributes! [:from, :to] - compare = Gitlab::Git::Compare.new(user_project.repository.raw_repository, params[:from], params[:to]) - present compare, with: Entities::Compare - end - - # Get repository contributors - # - # Parameters: - # id (required) - The ID of a project - # Example Request: - # GET /projects/:id/repository/contributors - get ':id/repository/contributors' do - authorize! :download_code, user_project - - begin - present user_project.repository.contributors, - with: Entities::Contributor - rescue - not_found! - end - end - end - end -end diff --git a/lib/api/services.rb b/lib/api/services.rb deleted file mode 100644 index 3ad59cf3adf..00000000000 --- a/lib/api/services.rb +++ /dev/null @@ -1,78 +0,0 @@ -module API - # Projects API - class Services < Grape::API - before { authenticate! } - before { authorize_admin_project } - - resource :projects do - # Set GitLab CI service for project - # - # Parameters: - # token (required) - CI project token - # project_url (required) - CI project url - # - # Example Request: - # PUT /projects/:id/services/gitlab-ci - put ":id/services/gitlab-ci" do - required_attributes! [:token, :project_url] - attrs = attributes_for_keys [:token, :project_url] - user_project.build_missing_services - - if user_project.gitlab_ci_service.update_attributes(attrs.merge(active: true)) - true - else - not_found! - end - end - - # Delete GitLab CI service settings - # - # Example Request: - # DELETE /projects/:id/services/gitlab-ci - delete ":id/services/gitlab-ci" do - if user_project.gitlab_ci_service - user_project.gitlab_ci_service.update_attributes( - active: false, - token: nil, - project_url: nil - ) - end - end - - # Set Hipchat service for project - # - # Parameters: - # token (required) - Hipchat token - # room (required) - Hipchat room name - # - # Example Request: - # PUT /projects/:id/services/hipchat - put ':id/services/hipchat' do - required_attributes! [:token, :room] - attrs = attributes_for_keys [:token, :room] - user_project.build_missing_services - - if user_project.hipchat_service.update_attributes( - attrs.merge(active: true)) - true - else - not_found! - end - end - - # Delete Hipchat service settings - # - # Example Request: - # DELETE /projects/:id/services/hipchat - delete ':id/services/hipchat' do - if user_project.hipchat_service - user_project.hipchat_service.update_attributes( - active: false, - token: nil, - room: nil - ) - end - end - end - end -end diff --git a/lib/api/session.rb b/lib/api/session.rb deleted file mode 100644 index cc646895914..00000000000 --- a/lib/api/session.rb +++ /dev/null @@ -1,21 +0,0 @@ -module API - # Users API - class Session < Grape::API - # Login to get token - # - # Parameters: - # login (*required) - user login - # email (*required) - user email - # password (required) - user password - # - # Example Request: - # POST /session - post "/session" do - auth = Gitlab::Auth.new - user = auth.find(params[:email] || params[:login], params[:password]) - - return unauthorized! unless user - present user, with: Entities::UserLogin - end - end -end diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb deleted file mode 100644 index 518964db50d..00000000000 --- a/lib/api/system_hooks.rb +++ /dev/null @@ -1,70 +0,0 @@ -module API - # Hooks API - class SystemHooks < Grape::API - before do - authenticate! - authenticated_as_admin! - end - - resource :hooks do - # Get the list of system hooks - # - # Example Request: - # GET /hooks - get do - @hooks = SystemHook.all - present @hooks, with: Entities::Hook - end - - # Create new system hook - # - # Parameters: - # url (required) - url for system hook - # Example Request - # POST /hooks - post do - attrs = attributes_for_keys [:url] - required_attributes! [:url] - @hook = SystemHook.new attrs - if @hook.save - present @hook, with: Entities::Hook - else - not_found! - end - end - - # Test a hook - # - # Example Request - # GET /hooks/:id - get ":id" do - @hook = SystemHook.find(params[:id]) - data = { - event_name: "project_create", - name: "Ruby", - path: "ruby", - project_id: 1, - owner_name: "Someone", - owner_email: "example@gitlabhq.com" - } - @hook.execute(data) - data - end - - # Delete a hook. This is an idempotent function. - # - # Parameters: - # id (required) - ID of the hook - # Example Request: - # DELETE /hooks/:id - delete ":id" do - begin - @hook = SystemHook.find(params[:id]) - @hook.destroy - rescue - # SystemHook raises an Error if no hook with id found - end - end - end - end -end diff --git a/lib/api/users.rb b/lib/api/users.rb deleted file mode 100644 index 032a5d76e43..00000000000 --- a/lib/api/users.rb +++ /dev/null @@ -1,264 +0,0 @@ -module API - # Users API - class Users < Grape::API - before { authenticate! } - - resource :users do - # Get a users list - # - # Example Request: - # GET /users - get do - @users = User.all - @users = @users.active if params[:active].present? - @users = @users.search(params[:search]) if params[:search].present? - @users = paginate @users - - if current_user.is_admin? - present @users, with: Entities::UserFull - else - present @users, with: Entities::UserBasic - end - end - - # Get a single user - # - # Parameters: - # id (required) - The ID of a user - # Example Request: - # GET /users/:id - get ":id" do - @user = User.find(params[:id]) - - if current_user.is_admin? - present @user, with: Entities::UserFull - else - present @user, with: Entities::UserBasic - end - end - - # Create user. Available only for admin - # - # Parameters: - # email (required) - Email - # password (required) - Password - # name (required) - Name - # username (required) - Name - # skype - Skype ID - # linkedin - Linkedin - # twitter - Twitter account - # website_url - Website url - # projects_limit - Number of projects user can create - # extern_uid - External authentication provider UID - # provider - External provider - # bio - Bio - # admin - User is admin - true or false (default) - # can_create_group - User can create groups - true or false - # confirm - Require user confirmation - true (default) or false - # Example Request: - # POST /users - post do - authenticated_as_admin! - required_attributes! [:email, :password, :name, :username] - attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :bio, :can_create_group, :admin, :confirm] - admin = attrs.delete(:admin) - confirm = !(attrs.delete(:confirm) =~ (/(false|f|no|0)$/i)) - user = User.build_user(attrs) - user.admin = admin unless admin.nil? - user.skip_confirmation! unless confirm - - identity_attrs = attributes_for_keys [:provider, :extern_uid] - if identity_attrs.any? - user.identities.build(identity_attrs) - end - - if user.save - present user, with: Entities::UserFull - else - conflict!('Email has already been taken') if User. - where(email: user.email). - count > 0 - - conflict!('Username has already been taken') if User. - where(username: user.username). - count > 0 - - render_validation_error!(user) - end - end - - # Update user. Available only for admin - # - # Parameters: - # email - Email - # name - Name - # password - Password - # skype - Skype ID - # linkedin - Linkedin - # twitter - Twitter account - # website_url - Website url - # projects_limit - Limit projects each user can create - # bio - Bio - # admin - User is admin - true or false (default) - # can_create_group - User can create groups - true or false - # Example Request: - # PUT /users/:id - put ":id" do - authenticated_as_admin! - - attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :website_url, :projects_limit, :username, :bio, :can_create_group, :admin] - user = User.find(params[:id]) - not_found!('User') unless user - - admin = attrs.delete(:admin) - user.admin = admin unless admin.nil? - - conflict!('Email has already been taken') if attrs[:email] && - User.where(email: attrs[:email]). - where.not(id: user.id).count > 0 - - conflict!('Username has already been taken') if attrs[:username] && - User.where(username: attrs[:username]). - where.not(id: user.id).count > 0 - - if user.update_attributes(attrs) - present user, with: Entities::UserFull - else - render_validation_error!(user) - end - end - - # Add ssh key to a specified user. Only available to admin users. - # - # Parameters: - # id (required) - The ID of a user - # key (required) - New SSH Key - # title (required) - New SSH Key's title - # Example Request: - # POST /users/:id/keys - post ":id/keys" do - authenticated_as_admin! - required_attributes! [:title, :key] - - user = User.find(params[:id]) - attrs = attributes_for_keys [:title, :key] - key = user.keys.new attrs - if key.save - present key, with: Entities::SSHKey - else - render_validation_error!(key) - end - end - - # Get ssh keys of a specified user. Only available to admin users. - # - # Parameters: - # uid (required) - The ID of a user - # Example Request: - # GET /users/:uid/keys - get ':uid/keys' do - authenticated_as_admin! - user = User.find_by(id: params[:uid]) - not_found!('User') unless user - - present user.keys, with: Entities::SSHKey - end - - # Delete existing ssh key of a specified user. Only available to admin - # users. - # - # Parameters: - # uid (required) - The ID of a user - # id (required) - SSH Key ID - # Example Request: - # DELETE /users/:uid/keys/:id - delete ':uid/keys/:id' do - authenticated_as_admin! - user = User.find_by(id: params[:uid]) - not_found!('User') unless user - - begin - key = user.keys.find params[:id] - key.destroy - rescue ActiveRecord::RecordNotFound - not_found!('Key') - end - end - - # Delete user. Available only for admin - # - # Example Request: - # DELETE /users/:id - delete ":id" do - authenticated_as_admin! - user = User.find_by(id: params[:id]) - - if user - user.destroy - else - not_found!('User') - end - end - end - - resource :user do - # Get currently authenticated user - # - # Example Request: - # GET /user - get do - present @current_user, with: Entities::UserLogin - end - - # Get currently authenticated user's keys - # - # Example Request: - # GET /user/keys - get "keys" do - present current_user.keys, with: Entities::SSHKey - end - - # Get single key owned by currently authenticated user - # - # Example Request: - # GET /user/keys/:id - get "keys/:id" do - key = current_user.keys.find params[:id] - present key, with: Entities::SSHKey - end - - # Add new ssh key to currently authenticated user - # - # Parameters: - # key (required) - New SSH Key - # title (required) - New SSH Key's title - # Example Request: - # POST /user/keys - post "keys" do - required_attributes! [:title, :key] - - attrs = attributes_for_keys [:title, :key] - key = current_user.keys.new attrs - if key.save - present key, with: Entities::SSHKey - else - render_validation_error!(key) - end - end - - # Delete existing ssh key of currently authenticated user - # - # Parameters: - # id (required) - SSH Key ID - # Example Request: - # DELETE /user/keys/:id - delete "keys/:id" do - begin - key = current_user.keys.find params[:id] - key.destroy - rescue - end - end - end - end -end diff --git a/lib/assets/.gitkeep b/lib/assets/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/lib/backup/database.rb b/lib/backup/database.rb deleted file mode 100644 index 9ab6aca276d..00000000000 --- a/lib/backup/database.rb +++ /dev/null @@ -1,78 +0,0 @@ -require 'yaml' - -module Backup - class Database - attr_reader :config, :db_dir - - def initialize - @config = YAML.load_file(File.join(Rails.root,'config','database.yml'))[Rails.env] - @db_dir = File.join(Gitlab.config.backup.path, 'db') - FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir) - end - - def dump - success = case config["adapter"] - when /^mysql/ then - $progress.print "Dumping MySQL database #{config['database']} ... " - system('mysqldump', *mysql_args, config['database'], out: db_file_name) - when "postgresql" then - $progress.print "Dumping PostgreSQL database #{config['database']} ... " - pg_env - system('pg_dump', config['database'], out: db_file_name) - end - report_success(success) - abort 'Backup failed' unless success - end - - def restore - success = case config["adapter"] - when /^mysql/ then - $progress.print "Restoring MySQL database #{config['database']} ... " - system('mysql', *mysql_args, config['database'], in: db_file_name) - when "postgresql" then - $progress.print "Restoring PostgreSQL database #{config['database']} ... " - # Drop all tables because PostgreSQL DB dumps do not contain DROP TABLE - # statements like MySQL. - Rake::Task["gitlab:db:drop_all_tables"].invoke - Rake::Task["gitlab:db:drop_all_postgres_sequences"].invoke - pg_env - system('psql', config['database'], '-f', db_file_name) - end - report_success(success) - abort 'Restore failed' unless success - end - - protected - - def db_file_name - File.join(db_dir, 'database.sql') - end - - def mysql_args - args = { - 'host' => '--host', - 'port' => '--port', - 'socket' => '--socket', - 'username' => '--user', - 'encoding' => '--default-character-set', - 'password' => '--password' - } - args.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact - end - - def pg_env - ENV['PGUSER'] = config["username"] if config["username"] - ENV['PGHOST'] = config["host"] if config["host"] - ENV['PGPORT'] = config["port"].to_s if config["port"] - ENV['PGPASSWORD'] = config["password"].to_s if config["password"] - end - - def report_success(success) - if success - $progress.puts '[DONE]'.green - else - $progress.puts '[FAILED]'.red - end - end - end -end diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb deleted file mode 100644 index b69aebf9fe1..00000000000 --- a/lib/backup/manager.rb +++ /dev/null @@ -1,170 +0,0 @@ -module Backup - class Manager - def pack - # saving additional informations - s = {} - s[:db_version] = "#{ActiveRecord::Migrator.current_version}" - s[:backup_created_at] = Time.now - s[:gitlab_version] = Gitlab::VERSION - s[:tar_version] = tar_version - s[:skipped] = ENV["SKIP"] - tar_file = "#{s[:backup_created_at].to_i}_gitlab_backup.tar" - - Dir.chdir(Gitlab.config.backup.path) do - File.open("#{Gitlab.config.backup.path}/backup_information.yml", - "w+") do |file| - file << s.to_yaml.gsub(/^---\n/,'') - end - - FileUtils.chmod(0700, folders_to_backup) - - # create archive - $progress.print "Creating backup archive: #{tar_file} ... " - orig_umask = File.umask(0077) - if Kernel.system('tar', '-cf', tar_file, *backup_contents) - $progress.puts "done".green - else - puts "creating archive #{tar_file} failed".red - abort 'Backup failed' - end - File.umask(orig_umask) - - upload(tar_file) - end - end - - def upload(tar_file) - remote_directory = Gitlab.config.backup.upload.remote_directory - $progress.print "Uploading backup archive to remote storage #{remote_directory} ... " - - connection_settings = Gitlab.config.backup.upload.connection - if connection_settings.blank? - $progress.puts "skipped".yellow - return - end - - connection = ::Fog::Storage.new(connection_settings) - directory = connection.directories.get(remote_directory) - - if directory.files.create(key: tar_file, body: File.open(tar_file), public: false) - $progress.puts "done".green - else - puts "uploading backup to #{remote_directory} failed".red - abort 'Backup failed' - end - end - - def cleanup - $progress.print "Deleting tmp directories ... " - - backup_contents.each do |dir| - next unless File.exist?(File.join(Gitlab.config.backup.path, dir)) - - if FileUtils.rm_rf(File.join(Gitlab.config.backup.path, dir)) - $progress.puts "done".green - else - puts "deleting tmp directory '#{dir}' failed".red - abort 'Backup failed' - end - end - end - - def remove_old - # delete backups - $progress.print "Deleting old backups ... " - keep_time = Gitlab.config.backup.keep_time.to_i - - if keep_time > 0 - removed = 0 - - Dir.chdir(Gitlab.config.backup.path) do - file_list = Dir.glob('*_gitlab_backup.tar') - file_list.map! { |f| $1.to_i if f =~ /(\d+)_gitlab_backup.tar/ } - file_list.sort.each do |timestamp| - if Time.at(timestamp) < (Time.now - keep_time) - if Kernel.system(*%W(rm #{timestamp}_gitlab_backup.tar)) - removed += 1 - end - end - end - end - - $progress.puts "done. (#{removed} removed)".green - else - $progress.puts "skipping".yellow - end - end - - def unpack - Dir.chdir(Gitlab.config.backup.path) - - # check for existing backups in the backup dir - file_list = Dir.glob("*_gitlab_backup.tar").each.map { |f| f.split(/_/).first.to_i } - puts "no backups found" if file_list.count == 0 - - if file_list.count > 1 && ENV["BACKUP"].nil? - puts "Found more than one backup, please specify which one you want to restore:" - puts "rake gitlab:backup:restore BACKUP=timestamp_of_backup" - exit 1 - end - - tar_file = ENV["BACKUP"].nil? ? File.join("#{file_list.first}_gitlab_backup.tar") : File.join(ENV["BACKUP"] + "_gitlab_backup.tar") - - unless File.exists?(tar_file) - puts "The specified backup doesn't exist!" - exit 1 - end - - $progress.print "Unpacking backup ... " - - unless Kernel.system(*%W(tar -xf #{tar_file})) - puts "unpacking backup failed".red - exit 1 - else - $progress.puts "done".green - end - - ENV["VERSION"] = "#{settings[:db_version]}" if settings[:db_version].to_i > 0 - - # restoring mismatching backups can lead to unexpected problems - if settings[:gitlab_version] != Gitlab::VERSION - puts "GitLab version mismatch:".red - puts " Your current GitLab version (#{Gitlab::VERSION}) differs from the GitLab version in the backup!".red - puts " Please switch to the following version and try again:".red - puts " version: #{settings[:gitlab_version]}".red - puts - puts "Hint: git checkout v#{settings[:gitlab_version]}" - exit 1 - end - end - - def tar_version - tar_version, _ = Gitlab::Popen.popen(%W(tar --version)) - tar_version.force_encoding('locale').split("\n").first - end - - def skipped?(item) - settings[:skipped] && settings[:skipped].include?(item) - end - - private - - def backup_contents - folders_to_backup + ["backup_information.yml"] - end - - def folders_to_backup - folders = %w{repositories db uploads} - - if ENV["SKIP"] - return folders.reject{ |folder| ENV["SKIP"].include?(folder) } - end - - folders - end - - def settings - @settings ||= YAML.load_file("backup_information.yml") - end - end -end diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb deleted file mode 100644 index dfb2da9f84e..00000000000 --- a/lib/backup/repository.rb +++ /dev/null @@ -1,140 +0,0 @@ -require 'yaml' - -module Backup - class Repository - attr_reader :repos_path - - def dump - prepare - - Project.find_each(batch_size: 1000) do |project| - $progress.print " * #{project.path_with_namespace} ... " - - # Create namespace dir if missing - FileUtils.mkdir_p(File.join(backup_repos_path, project.namespace.path)) if project.namespace - - if project.empty_repo? - $progress.puts "[SKIPPED]".cyan - else - cmd = %W(tar -cf #{path_to_bundle(project)} -C #{path_to_repo(project)} .) - output, status = Gitlab::Popen.popen(cmd) - if status.zero? - $progress.puts "[DONE]".green - else - puts "[FAILED]".red - puts "failed: #{cmd.join(' ')}" - puts output - abort 'Backup failed' - end - end - - wiki = ProjectWiki.new(project) - - if File.exists?(path_to_repo(wiki)) - $progress.print " * #{wiki.path_with_namespace} ... " - if wiki.repository.empty? - $progress.puts " [SKIPPED]".cyan - else - cmd = %W(git --git-dir=#{path_to_repo(wiki)} bundle create #{path_to_bundle(wiki)} --all) - output, status = Gitlab::Popen.popen(cmd) - if status.zero? - $progress.puts " [DONE]".green - else - puts " [FAILED]".red - puts "failed: #{cmd.join(' ')}" - abort 'Backup failed' - end - end - end - end - end - - def restore - if File.exists?(repos_path) - # Move repos dir to 'repositories.old' dir - bk_repos_path = File.join(repos_path, '..', 'repositories.old.' + Time.now.to_i.to_s) - FileUtils.mv(repos_path, bk_repos_path) - end - - FileUtils.mkdir_p(repos_path) - - Project.find_each(batch_size: 1000) do |project| - $progress.print " * #{project.path_with_namespace} ... " - - project.namespace.ensure_dir_exist if project.namespace - - if File.exists?(path_to_bundle(project)) - FileUtils.mkdir_p(path_to_repo(project)) - cmd = %W(tar -xf #{path_to_bundle(project)} -C #{path_to_repo(project)}) - else - cmd = %W(git init --bare #{path_to_repo(project)}) - end - - if system(*cmd, silent) - $progress.puts "[DONE]".green - else - puts "[FAILED]".red - puts "failed: #{cmd.join(' ')}" - abort 'Restore failed' - end - - wiki = ProjectWiki.new(project) - - if File.exists?(path_to_bundle(wiki)) - $progress.print " * #{wiki.path_with_namespace} ... " - - # If a wiki bundle exists, first remove the empty repo - # that was initialized with ProjectWiki.new() and then - # try to restore with 'git clone --bare'. - FileUtils.rm_rf(path_to_repo(wiki)) - cmd = %W(git clone --bare #{path_to_bundle(wiki)} #{path_to_repo(wiki)}) - - if system(*cmd, silent) - $progress.puts " [DONE]".green - else - puts " [FAILED]".red - puts "failed: #{cmd.join(' ')}" - abort 'Restore failed' - end - end - end - - $progress.print 'Put GitLab hooks in repositories dirs'.yellow - cmd = "#{Gitlab.config.gitlab_shell.path}/bin/create-hooks" - if system(cmd) - $progress.puts " [DONE]".green - else - puts " [FAILED]".red - puts "failed: #{cmd}" - end - - end - - protected - - def path_to_repo(project) - project.repository.path_to_repo - end - - def path_to_bundle(project) - File.join(backup_repos_path, project.path_with_namespace + ".bundle") - end - - def repos_path - Gitlab.config.gitlab_shell.repos_path - end - - def backup_repos_path - File.join(Gitlab.config.backup.path, "repositories") - end - - def prepare - FileUtils.rm_rf(backup_repos_path) - FileUtils.mkdir_p(backup_repos_path) - end - - def silent - {err: '/dev/null', out: '/dev/null'} - end - end -end diff --git a/lib/backup/uploads.rb b/lib/backup/uploads.rb deleted file mode 100644 index e50e1ff4f13..00000000000 --- a/lib/backup/uploads.rb +++ /dev/null @@ -1,30 +0,0 @@ -module Backup - class Uploads - attr_reader :app_uploads_dir, :backup_uploads_dir, :backup_dir - - def initialize - @app_uploads_dir = File.realpath(Rails.root.join('public', 'uploads')) - @backup_dir = Gitlab.config.backup.path - @backup_uploads_dir = File.join(Gitlab.config.backup.path, 'uploads') - end - - # Copy uploads from public/uploads to backup/uploads - def dump - FileUtils.mkdir_p(backup_uploads_dir) - FileUtils.cp_r(app_uploads_dir, backup_dir) - end - - def restore - backup_existing_uploads_dir - - FileUtils.cp_r(backup_uploads_dir, app_uploads_dir) - end - - def backup_existing_uploads_dir - timestamped_uploads_path = File.join(app_uploads_dir, '..', "uploads.#{Time.now.to_i}") - if File.exists?(app_uploads_dir) - FileUtils.mv(app_uploads_dir, timestamped_uploads_path) - end - end - end -end diff --git a/lib/disable_email_interceptor.rb b/lib/disable_email_interceptor.rb deleted file mode 100644 index 1b80be112a4..00000000000 --- a/lib/disable_email_interceptor.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Read about interceptors in http://guides.rubyonrails.org/action_mailer_basics.html#intercepting-emails -class DisableEmailInterceptor - - def self.delivering_email(message) - message.perform_deliveries = false - Rails.logger.info "Emails disabled! Interceptor prevented sending mail #{message.subject}" - end -end diff --git a/lib/email_validator.rb b/lib/email_validator.rb deleted file mode 100644 index f509f0a5843..00000000000 --- a/lib/email_validator.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Based on https://github.com/balexand/email_validator -# -# Extended to use only strict mode with following allowed characters: -# ' - apostrophe -# -# See http://www.remote.org/jochen/mail/info/chars.html -# -class EmailValidator < ActiveModel::EachValidator - @@default_options = {} - - def self.default_options - @@default_options - end - - def validate_each(record, attribute, value) - options = @@default_options.merge(self.options) - unless value =~ /\A\s*([-a-z0-9+._']{1,64})@((?:[-a-z0-9]+\.)+[a-z]{2,})\s*\z/i - record.errors.add(attribute, options[:message] || :invalid) - end - end -end diff --git a/lib/event_filter.rb b/lib/event_filter.rb deleted file mode 100644 index 163937c02cf..00000000000 --- a/lib/event_filter.rb +++ /dev/null @@ -1,68 +0,0 @@ -class EventFilter - attr_accessor :params - - class << self - def default_filter - %w{ push issues merge_requests team} - end - - def push - 'push' - end - - def merged - 'merged' - end - - def comments - 'comments' - end - - def team - 'team' - end - end - - def initialize(params) - @params = if params - params.dup - else - []#EventFilter.default_filter - end - end - - def apply_filter(events) - return events unless params.present? - - filter = params.dup - - actions = [] - actions << Event::PUSHED if filter.include? 'push' - actions << Event::MERGED if filter.include? 'merged' - - if filter.include? 'team' - actions << Event::JOINED - actions << Event::LEFT - end - - actions << Event::COMMENTED if filter.include? 'comments' - - events = events.where(action: actions) - end - - def options(key) - filter = params.dup - - if filter.include? key - filter.delete key - else - filter << key - end - - filter - end - - def active?(key) - params.include? key - end -end diff --git a/lib/extracts_path.rb b/lib/extracts_path.rb deleted file mode 100644 index 6e4ed01e079..00000000000 --- a/lib/extracts_path.rb +++ /dev/null @@ -1,123 +0,0 @@ -# Module providing methods for dealing with separating a tree-ish string and a -# file path string when combined in a request parameter -module ExtractsPath - # Raised when given an invalid file path - class InvalidPathError < StandardError; end - - # Given a string containing both a Git tree-ish, such as a branch or tag, and - # a filesystem path joined by forward slashes, attempts to separate the two. - # - # Expects a @project instance variable to contain the active project. This is - # used to check the input against a list of valid repository refs. - # - # Examples - # - # # No @project available - # extract_ref('master') - # # => ['', ''] - # - # extract_ref('master') - # # => ['master', ''] - # - # extract_ref("f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG") - # # => ['f4b14494ef6abf3d144c28e4af0c20143383e062', 'CHANGELOG'] - # - # extract_ref("v2.0.0/README.md") - # # => ['v2.0.0', 'README.md'] - # - # extract_ref('master/app/models/project.rb') - # # => ['master', 'app/models/project.rb'] - # - # extract_ref('issues/1234/app/models/project.rb') - # # => ['issues/1234', 'app/models/project.rb'] - # - # # Given an invalid branch, we fall back to just splitting on the first slash - # extract_ref('non/existent/branch/README.md') - # # => ['non', 'existent/branch/README.md'] - # - # Returns an Array where the first value is the tree-ish and the second is the - # path - def extract_ref(id) - pair = ['', ''] - - return pair unless @project - - if id.match(/^([[:alnum:]]{40})(.+)/) - # If the ref appears to be a SHA, we're done, just split the string - pair = $~.captures - else - # Otherwise, attempt to detect the ref using a list of the project's - # branches and tags - - # Append a trailing slash if we only get a ref and no file path - id += '/' unless id.ends_with?('/') - - valid_refs = @project.repository.ref_names - valid_refs.select! { |v| id.start_with?("#{v}/") } - - if valid_refs.length != 1 - # No exact ref match, so just try our best - pair = id.match(/([^\/]+)(.*)/).captures - else - # Partition the string into the ref and the path, ignoring the empty first value - pair = id.partition(valid_refs.first)[1..-1] - end - end - - # Remove ending slashes from path - pair[1].gsub!(/^\/|\/$/, '') - - pair - end - - # Assigns common instance variables for views working with Git tree-ish objects - # - # Assignments are: - # - # - @id - A string representing the joined ref and path - # - @ref - A string representing the ref (e.g., the branch, tag, or commit SHA) - # - @path - A string representing the filesystem path - # - @commit - A Commit representing the commit from the given ref - # - # If the :id parameter appears to be requesting a specific response format, - # that will be handled as well. - # - # Automatically renders `not_found!` if a valid tree path could not be - # resolved (e.g., when a user inserts an invalid path or ref). - def assign_ref_vars - # assign allowed options - allowed_options = ["filter_ref", "extended_sha1"] - @options = params.select {|key, value| allowed_options.include?(key) && !value.blank? } - @options = HashWithIndifferentAccess.new(@options) - - @id = get_id - @ref, @path = extract_ref(@id) - @repo = @project.repository - if @options[:extended_sha1].blank? - @commit = @repo.commit(@ref) - else - @commit = @repo.commit(@options[:extended_sha1]) - end - - raise InvalidPathError unless @commit - - @hex_path = Digest::SHA1.hexdigest(@path) - @logs_path = logs_file_namespace_project_ref_path(@project.namespace, - @project, @ref, @path) - - rescue RuntimeError, NoMethodError, InvalidPathError - not_found! - end - - def tree - @tree ||= @repo.tree(@commit.id, @path) - end - - private - - def get_id - id = params[:id] || params[:ref] - id += "/" + params[:path] unless params[:path].blank? - id - end -end diff --git a/lib/file_size_validator.rb b/lib/file_size_validator.rb deleted file mode 100644 index 2eae55e534b..00000000000 --- a/lib/file_size_validator.rb +++ /dev/null @@ -1,73 +0,0 @@ -class FileSizeValidator < ActiveModel::EachValidator - MESSAGES = { is: :wrong_size, minimum: :size_too_small, maximum: :size_too_big }.freeze - CHECKS = { is: :==, minimum: :>=, maximum: :<= }.freeze - - DEFAULT_TOKENIZER = lambda { |value| value.split(//) } - RESERVED_OPTIONS = [:minimum, :maximum, :within, :is, :tokenizer, :too_short, :too_long] - - def initialize(options) - if range = (options.delete(:in) || options.delete(:within)) - raise ArgumentError, ":in and :within must be a Range" unless range.is_a?(Range) - options[:minimum], options[:maximum] = range.begin, range.end - options[:maximum] -= 1 if range.exclude_end? - end - - super - end - - def check_validity! - keys = CHECKS.keys & options.keys - - if keys.empty? - raise ArgumentError, 'Range unspecified. Specify the :within, :maximum, :minimum, or :is option.' - end - - keys.each do |key| - value = options[key] - - unless (value.is_a?(Integer) && value >= 0) || value.is_a?(Symbol) - raise ArgumentError, ":#{key} must be a nonnegative Integer or symbol" - end - end - end - - def validate_each(record, attribute, value) - raise(ArgumentError, "A CarrierWave::Uploader::Base object was expected") unless value.kind_of? CarrierWave::Uploader::Base - - value = (options[:tokenizer] || DEFAULT_TOKENIZER).call(value) if value.kind_of?(String) - - CHECKS.each do |key, validity_check| - next unless check_value = options[key] - - check_value = - case check_value - when Integer - check_value - when Symbol - record.send(check_value) - end - - value ||= [] if key == :maximum - - value_size = value.size - next if value_size.send(validity_check, check_value) - - errors_options = options.except(*RESERVED_OPTIONS) - errors_options[:file_size] = help.number_to_human_size check_value - - default_message = options[MESSAGES[key]] - errors_options[:message] ||= default_message if default_message - - record.errors.add(attribute, MESSAGES[key], errors_options) - end - end - - def help - Helper.instance - end - - class Helper - include Singleton - include ActionView::Helpers::NumberHelper - end -end diff --git a/lib/gitlab.rb b/lib/gitlab.rb deleted file mode 100644 index 5fc1862c3e9..00000000000 --- a/lib/gitlab.rb +++ /dev/null @@ -1,5 +0,0 @@ -require 'gitlab/git' - -module Gitlab - autoload :Satellite, 'gitlab/satellite/satellite' -end diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb deleted file mode 100644 index 424541b4a04..00000000000 --- a/lib/gitlab/access.rb +++ /dev/null @@ -1,73 +0,0 @@ -# Gitlab::Access module -# -# Define allowed roles that can be used -# in GitLab code to determine authorization level -# -module Gitlab - module Access - GUEST = 10 - REPORTER = 20 - DEVELOPER = 30 - MASTER = 40 - OWNER = 50 - - # Branch protection settings - PROTECTION_NONE = 0 - PROTECTION_DEV_CAN_PUSH = 1 - PROTECTION_FULL = 2 - - class << self - def values - options.values - end - - def all_values - options_with_owner.values - end - - def options - { - "Guest" => GUEST, - "Reporter" => REPORTER, - "Developer" => DEVELOPER, - "Master" => MASTER, - } - end - - def options_with_owner - options.merge( - "Owner" => OWNER - ) - end - - def sym_options - { - guest: GUEST, - reporter: REPORTER, - developer: DEVELOPER, - master: MASTER, - } - end - - def protection_options - { - "Not protected, developers and masters can (force) push and delete the branch" => PROTECTION_NONE, - "Partially protected, developers can also push but prevent all force pushes and deletion" => PROTECTION_DEV_CAN_PUSH, - "Fully protected, only masters can push and prevent all force pushes and deletion" => PROTECTION_FULL, - } - end - - def protection_values - protection_options.values - end - end - - def human_access - Gitlab::Access.options_with_owner.key(access_field) - end - - def owner? - access_field == OWNER - end - end -end diff --git a/lib/gitlab/app_logger.rb b/lib/gitlab/app_logger.rb deleted file mode 100644 index dddcb2538f9..00000000000 --- a/lib/gitlab/app_logger.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Gitlab - class AppLogger < Gitlab::Logger - def self.file_name_noext - 'application' - end - - def format_message(severity, timestamp, progname, msg) - "#{timestamp.to_s(:long)}: #{msg}\n" - end - end -end diff --git a/lib/gitlab/auth.rb b/lib/gitlab/auth.rb deleted file mode 100644 index 30509528b8b..00000000000 --- a/lib/gitlab/auth.rb +++ /dev/null @@ -1,18 +0,0 @@ -module Gitlab - class Auth - def find(login, password) - user = User.by_login(login) - - # If no user is found, or it's an LDAP server, try LDAP. - # LDAP users are only authenticated via LDAP - if user.nil? || user.ldap_user? - # Second chance - try LDAP authentication - return nil unless Gitlab::LDAP::Config.enabled? - - Gitlab::LDAP::Authentication.login(login, password) - else - user if user.valid_password?(password) - end - end - end -end diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb deleted file mode 100644 index 050b5ba29dd..00000000000 --- a/lib/gitlab/backend/grack_auth.rb +++ /dev/null @@ -1,182 +0,0 @@ -require_relative 'rack_attack_helpers' -require_relative 'shell_env' - -module Grack - class Auth < Rack::Auth::Basic - - attr_accessor :user, :project, :env - - def call(env) - @env = env - @request = Rack::Request.new(env) - @auth = Request.new(env) - - @gitlab_ci = false - - # Need this patch due to the rails mount - # Need this if under RELATIVE_URL_ROOT - unless Gitlab.config.gitlab.relative_url_root.empty? - # If website is mounted using relative_url_root need to remove it first - @env['PATH_INFO'] = @request.path.sub(Gitlab.config.gitlab.relative_url_root,'') - else - @env['PATH_INFO'] = @request.path - end - - @env['SCRIPT_NAME'] = "" - - auth! - - if project && authorized_request? - @app.call(env) - elsif @user.nil? && !@gitlab_ci - unauthorized - else - render_not_found - end - end - - private - - def auth! - return unless @auth.provided? - - return bad_request unless @auth.basic? - - # Authentication with username and password - login, password = @auth.credentials - - # Allow authentication for GitLab CI service - # if valid token passed - if gitlab_ci_request?(login, password) - @gitlab_ci = true - return - end - - @user = authenticate_user(login, password) - - if @user - Gitlab::ShellEnv.set_env(@user) - @env['REMOTE_USER'] = @auth.username - end - end - - def gitlab_ci_request?(login, password) - if login == "gitlab-ci-token" && project && project.gitlab_ci? - token = project.gitlab_ci_service.token - - if token.present? && token == password && git_cmd == 'git-upload-pack' - return true - end - end - - false - end - - def oauth_access_token_check(login, password) - if login == "oauth2" && git_cmd == 'git-upload-pack' && password.present? - token = Doorkeeper::AccessToken.by_token(password) - token && token.accessible? && User.find_by(id: token.resource_owner_id) - end - end - - def authenticate_user(login, password) - user = Gitlab::Auth.new.find(login, password) - - unless user - user = oauth_access_token_check(login, password) - end - - # If the user authenticated successfully, we reset the auth failure count - # from Rack::Attack for that IP. A client may attempt to authenticate - # with a username and blank password first, and only after it receives - # a 401 error does it present a password. Resetting the count prevents - # false positives from occurring. - # - # Otherwise, we let Rack::Attack know there was a failed authentication - # attempt from this IP. This information is stored in the Rails cache - # (Redis) and will be used by the Rack::Attack middleware to decide - # whether to block requests from this IP. - config = Gitlab.config.rack_attack.git_basic_auth - - if config.enabled - if user - # A successful login will reset the auth failure count from this IP - Rack::Attack::Allow2Ban.reset(@request.ip, config) - else - banned = Rack::Attack::Allow2Ban.filter(@request.ip, config) do - # Unless the IP is whitelisted, return true so that Allow2Ban - # increments the counter (stored in Rails.cache) for the IP - if config.ip_whitelist.include?(@request.ip) - false - else - true - end - end - - if banned - Rails.logger.info "IP #{@request.ip} failed to login " \ - "as #{login} but has been temporarily banned from Git auth" - end - end - end - - user - end - - def authorized_request? - return true if @gitlab_ci - - case git_cmd - when *Gitlab::GitAccess::DOWNLOAD_COMMANDS - if user - Gitlab::GitAccess.new(user, project).download_access_check.allowed? - elsif project.public? - # Allow clone/fetch for public projects - true - else - false - end - when *Gitlab::GitAccess::PUSH_COMMANDS - if user - # Skip user authorization on upload request. - # It will be done by the pre-receive hook in the repository. - true - else - false - end - else - false - end - end - - def git_cmd - if @request.get? - @request.params['service'] - elsif @request.post? - File.basename(@request.path) - else - nil - end - end - - def project - return @project if defined?(@project) - - @project = project_by_path(@request.path_info) - end - - def project_by_path(path) - if m = /^([\w\.\/-]+)\.git/.match(path).to_a - path_with_namespace = m.last - path_with_namespace.gsub!(/\.wiki$/, '') - - path_with_namespace[0] = '' if path_with_namespace.start_with?('/') - Project.find_with_namespace(path_with_namespace) - end - end - - def render_not_found - [404, { "Content-Type" => "text/plain" }, ["Not Found"]] - end - end -end diff --git a/lib/gitlab/backend/rack_attack_helpers.rb b/lib/gitlab/backend/rack_attack_helpers.rb deleted file mode 100644 index 8538f3f6eca..00000000000 --- a/lib/gitlab/backend/rack_attack_helpers.rb +++ /dev/null @@ -1,31 +0,0 @@ -# rack-attack v4.2.0 doesn't yet support clearing of keys. -# Taken from https://github.com/kickstarter/rack-attack/issues/113 -class Rack::Attack::Allow2Ban - def self.reset(discriminator, options) - findtime = options[:findtime] or raise ArgumentError, "Must pass findtime option" - - cache.reset_count("#{key_prefix}:count:#{discriminator}", findtime) - cache.delete("#{key_prefix}:ban:#{discriminator}") - end -end - -class Rack::Attack::Cache - def reset_count(unprefixed_key, period) - epoch_time = Time.now.to_i - # Add 1 to expires_in to avoid timing error: http://git.io/i1PHXA - expires_in = period - (epoch_time % period) + 1 - key = "#{(epoch_time / period).to_i}:#{unprefixed_key}" - delete(key) - end - - def delete(unprefixed_key) - store.delete("#{prefix}:#{unprefixed_key}") - end -end - -class Rack::Attack::StoreProxy::RedisStoreProxy - def delete(key, options={}) - self.del(key) - rescue Redis::BaseError - end -end diff --git a/lib/gitlab/backend/shell.rb b/lib/gitlab/backend/shell.rb deleted file mode 100644 index 530f9d93de4..00000000000 --- a/lib/gitlab/backend/shell.rb +++ /dev/null @@ -1,279 +0,0 @@ -module Gitlab - class Shell - class AccessDenied < StandardError; end - - class KeyAdder < Struct.new(:io) - def add_key(id, key) - io.puts("#{id}\t#{key.strip}") - end - end - - class << self - def version_required - @version_required ||= File.read(Rails.root. - join('GITLAB_SHELL_VERSION')).strip - end - end - - # Init new repository - # - # name - project path with namespace - # - # Ex. - # add_repository("gitlab/gitlab-ci") - # - def add_repository(name) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, - 'add-project', "#{name}.git"]) - end - - # Import repository - # - # name - project path with namespace - # - # Ex. - # import_repository("gitlab/gitlab-ci", "https://github.com/randx/six.git") - # - def import_repository(name, url) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'import-project', - "#{name}.git", url, '240']) - end - - # Move repository - # - # path - project path with namespace - # new_path - new project path with namespace - # - # Ex. - # mv_repository("gitlab/gitlab-ci", "randx/gitlab-ci-new.git") - # - def mv_repository(path, new_path) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'mv-project', - "#{path}.git", "#{new_path}.git"]) - end - - # Update HEAD for repository - # - # path - project path with namespace - # branch - repository branch name - # - # Ex. - # update_repository_head("gitlab/gitlab-ci", "3-1-stable") - # - def update_repository_head(path, branch) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'update-head', - "#{path}.git", branch]) - end - - # Fork repository to new namespace - # - # path - project path with namespace - # fork_namespace - namespace for forked project - # - # Ex. - # fork_repository("gitlab/gitlab-ci", "randx") - # - def fork_repository(path, fork_namespace) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'fork-project', - "#{path}.git", fork_namespace]) - end - - # Remove repository from file system - # - # name - project path with namespace - # - # Ex. - # remove_repository("gitlab/gitlab-ci") - # - def remove_repository(name) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, - 'rm-project', "#{name}.git"]) - end - - # Add repository branch from passed ref - # - # path - project path with namespace - # branch_name - new branch name - # ref - HEAD for new branch - # - # Ex. - # add_branch("gitlab/gitlab-ci", "4-0-stable", "master") - # - def add_branch(path, branch_name, ref) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'create-branch', - "#{path}.git", branch_name, ref]) - end - - # Remove repository branch - # - # path - project path with namespace - # branch_name - branch name to remove - # - # Ex. - # rm_branch("gitlab/gitlab-ci", "4-0-stable") - # - def rm_branch(path, branch_name) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'rm-branch', - "#{path}.git", branch_name]) - end - - # Add repository tag from passed ref - # - # path - project path with namespace - # tag_name - new tag name - # ref - HEAD for new tag - # message - optional message for tag (annotated tag) - # - # Ex. - # add_tag("gitlab/gitlab-ci", "v4.0", "master") - # add_tag("gitlab/gitlab-ci", "v4.0", "master", "message") - # - def add_tag(path, tag_name, ref, message = nil) - cmd = %W(#{gitlab_shell_path}/bin/gitlab-projects create-tag #{path}.git - #{tag_name} #{ref}) - cmd << message unless message.nil? || message.empty? - Gitlab::Utils.system_silent(cmd) - end - - # Remove repository tag - # - # path - project path with namespace - # tag_name - tag name to remove - # - # Ex. - # rm_tag("gitlab/gitlab-ci", "v4.0") - # - def rm_tag(path, tag_name) - Gitlab::Utils.system_silent([gitlab_shell_projects_path, 'rm-tag', - "#{path}.git", tag_name]) - end - - # Add new key to gitlab-shell - # - # Ex. - # add_key("key-42", "sha-rsa ...") - # - def add_key(key_id, key_content) - Gitlab::Utils.system_silent([gitlab_shell_keys_path, - 'add-key', key_id, key_content]) - end - - # Batch-add keys to authorized_keys - # - # Ex. - # batch_add_keys { |adder| adder.add_key("key-42", "sha-rsa ...") } - def batch_add_keys(&block) - IO.popen(%W(#{gitlab_shell_path}/bin/gitlab-keys batch-add-keys), 'w') do |io| - block.call(KeyAdder.new(io)) - end - end - - # Remove ssh key from gitlab shell - # - # Ex. - # remove_key("key-342", "sha-rsa ...") - # - def remove_key(key_id, key_content) - Gitlab::Utils.system_silent([gitlab_shell_keys_path, - 'rm-key', key_id, key_content]) - end - - # Remove all ssh keys from gitlab shell - # - # Ex. - # remove_all_keys - # - def remove_all_keys - Gitlab::Utils.system_silent([gitlab_shell_keys_path, 'clear']) - end - - # Add empty directory for storing repositories - # - # Ex. - # add_namespace("gitlab") - # - def add_namespace(name) - FileUtils.mkdir(full_path(name), mode: 0770) unless exists?(name) - end - - # Remove directory from repositories storage - # Every repository inside this directory will be removed too - # - # Ex. - # rm_namespace("gitlab") - # - def rm_namespace(name) - FileUtils.rm_r(full_path(name), force: true) - end - - # Move namespace directory inside repositories storage - # - # Ex. - # mv_namespace("gitlab", "gitlabhq") - # - def mv_namespace(old_name, new_name) - return false if exists?(new_name) || !exists?(old_name) - - FileUtils.mv(full_path(old_name), full_path(new_name)) - end - - # Remove GitLab Satellites for provided path (namespace or repo dir) - # - # Ex. - # rm_satellites("gitlab") - # - # rm_satellites("gitlab/gitlab-ci.git") - # - def rm_satellites(path) - raise ArgumentError.new("Path can't be blank") if path.blank? - - satellites_path = File.join(Gitlab.config.satellites.path, path) - FileUtils.rm_r(satellites_path, force: true) - end - - def url_to_repo(path) - Gitlab.config.gitlab_shell.ssh_path_prefix + "#{path}.git" - end - - # Return GitLab shell version - def version - gitlab_shell_version_file = "#{gitlab_shell_path}/VERSION" - - if File.readable?(gitlab_shell_version_file) - File.read(gitlab_shell_version_file).chomp - end - end - - protected - - def gitlab_shell_path - Gitlab.config.gitlab_shell.path - end - - def gitlab_shell_user_home - File.expand_path("~#{Gitlab.config.gitlab_shell.ssh_user}") - end - - def repos_path - Gitlab.config.gitlab_shell.repos_path - end - - def full_path(dir_name) - raise ArgumentError.new("Directory name can't be blank") if dir_name.blank? - - File.join(repos_path, dir_name) - end - - def exists?(dir_name) - File.exists?(full_path(dir_name)) - end - - def gitlab_shell_projects_path - File.join(gitlab_shell_path, 'bin', 'gitlab-projects') - end - - def gitlab_shell_keys_path - File.join(gitlab_shell_path, 'bin', 'gitlab-keys') - end - end -end diff --git a/lib/gitlab/backend/shell_adapter.rb b/lib/gitlab/backend/shell_adapter.rb deleted file mode 100644 index fbe2a7a0d72..00000000000 --- a/lib/gitlab/backend/shell_adapter.rb +++ /dev/null @@ -1,11 +0,0 @@ -# == GitLab Shell mixin -# -# Provide a shortcut to Gitlab::Shell instance by gitlab_shell -# -module Gitlab - module ShellAdapter - def gitlab_shell - Gitlab::Shell.new - end - end -end diff --git a/lib/gitlab/backend/shell_env.rb b/lib/gitlab/backend/shell_env.rb deleted file mode 100644 index 044afb27f3f..00000000000 --- a/lib/gitlab/backend/shell_env.rb +++ /dev/null @@ -1,17 +0,0 @@ -module Gitlab - # This module provide 2 methods - # to set specific ENV variables for GitLab Shell - module ShellEnv - extend self - - def set_env(user) - # Set GL_ID env variable - ENV['GL_ID'] = "user-#{user.id}" - end - - def reset_env - # Reset GL_ID env variable - ENV['GL_ID'] = nil - end - end -end diff --git a/lib/gitlab/bitbucket_import.rb b/lib/gitlab/bitbucket_import.rb deleted file mode 100644 index 7298152e7e9..00000000000 --- a/lib/gitlab/bitbucket_import.rb +++ /dev/null @@ -1,6 +0,0 @@ -module Gitlab - module BitbucketImport - mattr_accessor :public_key - @public_key = nil - end -end diff --git a/lib/gitlab/bitbucket_import/client.rb b/lib/gitlab/bitbucket_import/client.rb deleted file mode 100644 index 5b1952b9675..00000000000 --- a/lib/gitlab/bitbucket_import/client.rb +++ /dev/null @@ -1,99 +0,0 @@ -module Gitlab - module BitbucketImport - class Client - attr_reader :consumer, :api - - def initialize(access_token = nil, access_token_secret = nil) - @consumer = ::OAuth::Consumer.new( - config.app_id, - config.app_secret, - bitbucket_options - ) - - if access_token && access_token_secret - @api = ::OAuth::AccessToken.new(@consumer, access_token, access_token_secret) - end - end - - def request_token(redirect_uri) - request_token = consumer.get_request_token(oauth_callback: redirect_uri) - - { - oauth_token: request_token.token, - oauth_token_secret: request_token.secret, - oauth_callback_confirmed: request_token.callback_confirmed?.to_s - } - end - - def authorize_url(request_token, redirect_uri) - request_token = ::OAuth::RequestToken.from_hash(consumer, request_token) if request_token.is_a?(Hash) - - if request_token.callback_confirmed? - request_token.authorize_url - else - request_token.authorize_url(oauth_callback: redirect_uri) - end - end - - def get_token(request_token, oauth_verifier, redirect_uri) - request_token = ::OAuth::RequestToken.from_hash(consumer, request_token) if request_token.is_a?(Hash) - - if request_token.callback_confirmed? - request_token.get_access_token(oauth_verifier: oauth_verifier) - else - request_token.get_access_token(oauth_callback: redirect_uri) - end - end - - def user - JSON.parse(api.get("/api/1.0/user").body) - end - - def issues(project_identifier) - JSON.parse(api.get("/api/1.0/repositories/#{project_identifier}/issues").body) - end - - def issue_comments(project_identifier, issue_id) - JSON.parse(api.get("/api/1.0/repositories/#{project_identifier}/issues/#{issue_id}/comments").body) - end - - def project(project_identifier) - JSON.parse(api.get("/api/1.0/repositories/#{project_identifier}").body) - end - - def find_deploy_key(project_identifier, key) - JSON.parse(api.get("/api/1.0/repositories/#{project_identifier}/deploy-keys").body).find do |deploy_key| - deploy_key["key"].chomp == key.chomp - end - end - - def add_deploy_key(project_identifier, key) - deploy_key = find_deploy_key(project_identifier, key) - return if deploy_key - - JSON.parse(api.post("/api/1.0/repositories/#{project_identifier}/deploy-keys", key: key, label: "GitLab import key").body) - end - - def delete_deploy_key(project_identifier, key) - deploy_key = find_deploy_key(project_identifier, key) - return unless deploy_key - - api.delete("/api/1.0/repositories/#{project_identifier}/deploy-keys/#{deploy_key["pk"]}").code == "204" - end - - def projects - JSON.parse(api.get("/api/1.0/user/repositories").body).select { |repo| repo["scm"] == "git" } - end - - private - - def config - Gitlab.config.omniauth.providers.find { |provider| provider.name == "bitbucket"} - end - - def bitbucket_options - OmniAuth::Strategies::Bitbucket.default_options[:client_options].symbolize_keys - end - end - end -end diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb deleted file mode 100644 index 42c93707caa..00000000000 --- a/lib/gitlab/bitbucket_import/importer.rb +++ /dev/null @@ -1,52 +0,0 @@ -module Gitlab - module BitbucketImport - class Importer - attr_reader :project, :client - - def initialize(project) - @project = project - @client = Client.new(project.creator.bitbucket_access_token, project.creator.bitbucket_access_token_secret) - @formatter = Gitlab::ImportFormatter.new - end - - def execute - project_identifier = project.import_source - - return true unless client.project(project_identifier)["has_issues"] - - #Issues && Comments - issues = client.issues(project_identifier) - - issues["issues"].each do |issue| - body = @formatter.author_line(issue["reported_by"]["username"], issue["content"]) - - comments = client.issue_comments(project_identifier, issue["local_id"]) - - if comments.any? - body += @formatter.comments_header - end - - comments.each do |comment| - body += @formatter.comment(comment["author_info"]["username"], comment["utc_created_on"], comment["content"]) - end - - project.issues.create!( - description: body, - title: issue["title"], - state: %w(resolved invalid duplicate wontfix).include?(issue["status"]) ? 'closed' : 'opened', - author_id: gl_user_id(project, issue["reported_by"]["username"]) - ) - end - - true - end - - private - - def gl_user_id(project, bitbucket_id) - user = User.joins(:identities).find_by("identities.extern_uid = ? AND identities.provider = 'bitbucket'", bitbucket_id.to_s) - (user && user.id) || project.creator_id - end - end - end -end diff --git a/lib/gitlab/bitbucket_import/key_adder.rb b/lib/gitlab/bitbucket_import/key_adder.rb deleted file mode 100644 index 9931aa7e029..00000000000 --- a/lib/gitlab/bitbucket_import/key_adder.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Gitlab - module BitbucketImport - class KeyAdder - attr_reader :repo, :current_user, :client - - def initialize(repo, current_user) - @repo, @current_user = repo, current_user - @client = Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) - end - - def execute - return false unless BitbucketImport.public_key.present? - - project_identifier = "#{repo["owner"]}/#{repo["slug"]}" - client.add_deploy_key(project_identifier, BitbucketImport.public_key) - - true - rescue - false - end - end - end -end diff --git a/lib/gitlab/bitbucket_import/key_deleter.rb b/lib/gitlab/bitbucket_import/key_deleter.rb deleted file mode 100644 index 1a24a86fc37..00000000000 --- a/lib/gitlab/bitbucket_import/key_deleter.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Gitlab - module BitbucketImport - class KeyDeleter - attr_reader :project, :current_user, :client - - def initialize(project) - @project = project - @current_user = project.creator - @client = Client.new(current_user.bitbucket_access_token, current_user.bitbucket_access_token_secret) - end - - def execute - return false unless BitbucketImport.public_key.present? - - client.delete_deploy_key(project.import_source, BitbucketImport.public_key) - - true - rescue - false - end - end - end -end diff --git a/lib/gitlab/bitbucket_import/project_creator.rb b/lib/gitlab/bitbucket_import/project_creator.rb deleted file mode 100644 index 54420e62c90..00000000000 --- a/lib/gitlab/bitbucket_import/project_creator.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Gitlab - module BitbucketImport - class ProjectCreator - attr_reader :repo, :namespace, :current_user - - def initialize(repo, namespace, current_user) - @repo = repo - @namespace = namespace - @current_user = current_user - end - - def execute - ::Projects::CreateService.new(current_user, - name: repo["name"], - path: repo["slug"], - description: repo["description"], - namespace_id: namespace.id, - visibility_level: repo["is_private"] ? Gitlab::VisibilityLevel::PRIVATE : Gitlab::VisibilityLevel::PUBLIC, - import_type: "bitbucket", - import_source: "#{repo["owner"]}/#{repo["slug"]}", - import_url: "ssh://git@bitbucket.org/#{repo["owner"]}/#{repo["slug"]}.git" - ).execute - end - end - end -end diff --git a/lib/gitlab/blacklist.rb b/lib/gitlab/blacklist.rb deleted file mode 100644 index 43145e0ee1b..00000000000 --- a/lib/gitlab/blacklist.rb +++ /dev/null @@ -1,34 +0,0 @@ -module Gitlab - module Blacklist - extend self - - def path - %w( - admin - dashboard - files - groups - help - profile - projects - search - public - assets - u - s - teams - merge_requests - issues - users - snippets - services - repository - hooks - notes - unsubscribes - all - ci - ) - end - end -end diff --git a/lib/gitlab/closing_issue_extractor.rb b/lib/gitlab/closing_issue_extractor.rb deleted file mode 100644 index ab184d95c05..00000000000 --- a/lib/gitlab/closing_issue_extractor.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Gitlab - class ClosingIssueExtractor - ISSUE_CLOSING_REGEX = Regexp.new(Gitlab.config.gitlab.issue_closing_pattern) - - def initialize(project, current_user = nil) - @extractor = Gitlab::ReferenceExtractor.new(project, current_user) - end - - def closed_by_message(message) - return [] if message.nil? - - closing_statements = message.scan(ISSUE_CLOSING_REGEX). - map { |ref| ref[0] }.join(" ") - - @extractor.analyze(closing_statements) - - @extractor.issues - end - end -end diff --git a/lib/gitlab/compare_result.rb b/lib/gitlab/compare_result.rb deleted file mode 100644 index d72391dade5..00000000000 --- a/lib/gitlab/compare_result.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Gitlab - class CompareResult - attr_reader :commits, :diffs - - def initialize(compare) - @commits, @diffs = compare.commits, compare.diffs - end - end -end diff --git a/lib/gitlab/config_helper.rb b/lib/gitlab/config_helper.rb deleted file mode 100644 index 41880069e4c..00000000000 --- a/lib/gitlab/config_helper.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Gitlab::ConfigHelper - def gitlab_config_features - Gitlab.config.gitlab.default_projects_features - end - - def gitlab_config - Gitlab.config.gitlab - end -end diff --git a/lib/gitlab/contributions_calendar.rb b/lib/gitlab/contributions_calendar.rb deleted file mode 100644 index 3fd0823df06..00000000000 --- a/lib/gitlab/contributions_calendar.rb +++ /dev/null @@ -1,56 +0,0 @@ -module Gitlab - class ContributionsCalendar - attr_reader :timestamps, :projects, :user - - def initialize(projects, user) - @projects = projects - @user = user - end - - def timestamps - return @timestamps if @timestamps.present? - - @timestamps = {} - date_from = 1.year.ago - date_to = Date.today - - events = Event.reorder(nil).contributions.where(author_id: user.id). - where("created_at > ?", date_from).where(project_id: projects). - group('date(created_at)'). - select('date(created_at), count(id) as total_amount'). - map(&:attributes) - - dates = (1.year.ago.to_date..(Date.today + 1.day)).to_a - - dates.each do |date| - date_id = date.to_time.to_i.to_s - @timestamps[date_id] = 0 - day_events = events.find { |day_events| day_events["date"] == date } - - if day_events - @timestamps[date_id] = day_events["total_amount"] - end - end - - @timestamps - end - - def events_by_date(date) - events = Event.contributions.where(author_id: user.id). - where("created_at > ? AND created_at < ?", date.beginning_of_day, date.end_of_day). - where(project_id: projects) - - events.select do |event| - event.push? || event.issue? || event.merge_request? - end - end - - def starting_year - (Time.now - 1.year).strftime("%Y") - end - - def starting_month - Date.today.strftime("%m").to_i - end - end -end diff --git a/lib/gitlab/contributor.rb b/lib/gitlab/contributor.rb deleted file mode 100644 index c41e92b620f..00000000000 --- a/lib/gitlab/contributor.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Gitlab - class Contributor - attr_accessor :email, :name, :commits, :additions, :deletions - - def initialize - @commits, @additions, @deletions = 0, 0, 0 - end - end -end diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb deleted file mode 100644 index d8f696d247b..00000000000 --- a/lib/gitlab/current_settings.rb +++ /dev/null @@ -1,28 +0,0 @@ -module Gitlab - module CurrentSettings - def current_application_settings - key = :current_application_settings - - RequestStore.store[key] ||= begin - if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings') - ApplicationSetting.current || ApplicationSetting.create_from_defaults - else - fake_application_settings - end - end - end - - def fake_application_settings - OpenStruct.new( - default_projects_limit: Settings.gitlab['default_projects_limit'], - default_branch_protection: Settings.gitlab['default_branch_protection'], - signup_enabled: Settings.gitlab['signup_enabled'], - signin_enabled: Settings.gitlab['signin_enabled'], - gravatar_enabled: Settings.gravatar['enabled'], - sign_in_text: Settings.extra['sign_in_text'], - restricted_visibility_levels: Settings.gitlab['restricted_visibility_levels'], - max_attachment_size: Settings.gitlab['max_attachment_size'] - ) - end - end -end diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb deleted file mode 100644 index 4daf65331e8..00000000000 --- a/lib/gitlab/diff/file.rb +++ /dev/null @@ -1,49 +0,0 @@ -module Gitlab - module Diff - class File - attr_reader :diff - - delegate :new_file, :deleted_file, :renamed_file, - :old_path, :new_path, to: :diff, prefix: false - - def initialize(diff) - @diff = diff - end - - # Array of Gitlab::DIff::Line objects - def diff_lines - @lines ||= parser.parse(raw_diff.lines) - end - - def mode_changed? - !!(diff.a_mode && diff.b_mode && diff.a_mode != diff.b_mode) - end - - def parser - Gitlab::Diff::Parser.new - end - - def raw_diff - diff.diff.to_s - end - - def next_line(index) - diff_lines[index + 1] - end - - def prev_line(index) - if index > 0 - diff_lines[index - 1] - end - end - - def file_path - if diff.new_path.present? - diff.new_path - elsif diff.old_path.present? - diff.old_path - end - end - end - end -end diff --git a/lib/gitlab/diff/line.rb b/lib/gitlab/diff/line.rb deleted file mode 100644 index 8ac1b15e88a..00000000000 --- a/lib/gitlab/diff/line.rb +++ /dev/null @@ -1,12 +0,0 @@ -module Gitlab - module Diff - class Line - attr_reader :type, :text, :index, :old_pos, :new_pos - - def initialize(text, type, index, old_pos, new_pos) - @text, @type, @index = text, type, index - @old_pos, @new_pos = old_pos, new_pos - end - end - end -end diff --git a/lib/gitlab/diff/line_code.rb b/lib/gitlab/diff/line_code.rb deleted file mode 100644 index f3578ab3d35..00000000000 --- a/lib/gitlab/diff/line_code.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Gitlab - module Diff - class LineCode - def self.generate(file_path, new_line_position, old_line_position) - "#{Digest::SHA1.hexdigest(file_path)}_#{old_line_position}_#{new_line_position}" - end - end - end -end diff --git a/lib/gitlab/diff/parser.rb b/lib/gitlab/diff/parser.rb deleted file mode 100644 index c1d9520ddf1..00000000000 --- a/lib/gitlab/diff/parser.rb +++ /dev/null @@ -1,81 +0,0 @@ -module Gitlab - module Diff - class Parser - include Enumerable - - def parse(lines) - @lines = lines - lines_obj = [] - line_obj_index = 0 - line_old = 1 - line_new = 1 - type = nil - - lines_arr = ::Gitlab::InlineDiff.processing lines - - lines_arr.each do |line| - raw_line = line.dup - - next if filename?(line) - - full_line = html_escape(line.gsub(/\n/, '')) - full_line = ::Gitlab::InlineDiff.replace_markers full_line - - if line.match(/^@@ -/) - type = "match" - - line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0 - line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0 - - next if line_old <= 1 && line_new <= 1 #top of file - lines_obj << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new) - line_obj_index += 1 - next - else - type = identification_type(line) - lines_obj << Gitlab::Diff::Line.new(full_line, type, line_obj_index, line_old, line_new) - line_obj_index += 1 - end - - - if line[0] == "+" - line_new += 1 - elsif line[0] == "-" - line_old += 1 - else - line_new += 1 - line_old += 1 - end - end - - lines_obj - end - - def empty? - @lines.empty? - end - - private - - def filename?(line) - line.start_with?('--- /dev/null', '+++ /dev/null', '--- a', '+++ b', - '--- /tmp/diffy', '+++ /tmp/diffy') - end - - def identification_type(line) - if line[0] == "+" - "new" - elsif line[0] == "-" - "old" - else - nil - end - end - - def html_escape(str) - replacements = { '&' => '&', '>' => '>', '<' => '<', '"' => '"', "'" => ''' } - str.gsub(/[&"'><]/, replacements) - end - end - end -end diff --git a/lib/gitlab/force_push_check.rb b/lib/gitlab/force_push_check.rb deleted file mode 100644 index fdb6a35c78d..00000000000 --- a/lib/gitlab/force_push_check.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Gitlab - class ForcePushCheck - def self.force_push?(project, oldrev, newrev) - return false if project.empty_repo? - - # Created or deleted branch - if Gitlab::Git.blank_ref?(oldrev) || Gitlab::Git.blank_ref?(newrev) - false - else - missed_refs, _ = Gitlab::Popen.popen(%W(git --git-dir=#{project.repository.path_to_repo} rev-list #{oldrev} ^#{newrev})) - missed_refs.split("\n").size > 0 - end - end - end -end diff --git a/lib/gitlab/git.rb b/lib/gitlab/git.rb deleted file mode 100644 index 0c350d7c675..00000000000 --- a/lib/gitlab/git.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Gitlab - module Git - BLANK_SHA = '0' * 40 - TAG_REF_PREFIX = "refs/tags/" - BRANCH_REF_PREFIX = "refs/heads/" - - class << self - def ref_name(ref) - ref.gsub(/\Arefs\/(tags|heads)\//, '') - end - - def tag_ref?(ref) - ref.start_with?(TAG_REF_PREFIX) - end - - def branch_ref?(ref) - ref.start_with?(BRANCH_REF_PREFIX) - end - - def blank_ref?(ref) - ref == BLANK_SHA - end - end - end -end diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb deleted file mode 100644 index bc72b7528d5..00000000000 --- a/lib/gitlab/git_access.rb +++ /dev/null @@ -1,198 +0,0 @@ -module Gitlab - class GitAccess - DOWNLOAD_COMMANDS = %w{ git-upload-pack git-upload-archive } - PUSH_COMMANDS = %w{ git-receive-pack } - - attr_reader :actor, :project - - def initialize(actor, project) - @actor = actor - @project = project - end - - def user - return @user if defined?(@user) - - @user = - case actor - when User - actor - when DeployKey - nil - when Key - actor.user - end - end - - def deploy_key - actor if actor.is_a?(DeployKey) - end - - def can_push_to_branch?(ref) - return false unless user - - if project.protected_branch?(ref) && - !(project.developers_can_push_to_protected_branch?(ref) && project.team.developer?(user)) - user.can?(:push_code_to_protected_branches, project) - else - user.can?(:push_code, project) - end - end - - def can_read_project? - if user - user.can?(:read_project, project) - elsif deploy_key - deploy_key.projects.include?(project) - else - false - end - end - - def check(cmd, changes = nil) - case cmd - when *DOWNLOAD_COMMANDS - download_access_check - when *PUSH_COMMANDS - push_access_check(changes) - else - build_status_object(false, "Wrong command") - end - end - - def download_access_check - if user - user_download_access_check - elsif deploy_key - deploy_key_download_access_check - else - raise 'Wrong actor' - end - end - - def push_access_check(changes) - if user - user_push_access_check(changes) - elsif deploy_key - build_status_object(false, "Deploy key not allowed to push") - else - raise 'Wrong actor' - end - end - - def user_download_access_check - if user && user_allowed? && user.can?(:download_code, project) - build_status_object(true) - else - build_status_object(false, "You don't have access") - end - end - - def deploy_key_download_access_check - if can_read_project? - build_status_object(true) - else - build_status_object(false, "Deploy key not allowed to access this project") - end - end - - def user_push_access_check(changes) - unless user && user_allowed? - return build_status_object(false, "You don't have access") - end - - if changes.blank? - return build_status_object(true) - end - - unless project.repository.exists? - return build_status_object(false, "Repository does not exist") - end - - changes = changes.lines if changes.kind_of?(String) - - # Iterate over all changes to find if user allowed all of them to be applied - changes.map(&:strip).reject(&:blank?).each do |change| - status = change_access_check(change) - unless status.allowed? - # If user does not have access to make at least one change - cancel all push - return status - end - end - - build_status_object(true) - end - - def change_access_check(change) - oldrev, newrev, ref = change.split(' ') - - action = - if project.protected_branch?(branch_name(ref)) - protected_branch_action(oldrev, newrev, branch_name(ref)) - elsif protected_tag?(tag_name(ref)) - # Prevent any changes to existing git tag unless user has permissions - :admin_project - else - :push_code - end - - if user.can?(action, project) - build_status_object(true) - else - build_status_object(false, "You don't have permission") - end - end - - def forced_push?(oldrev, newrev) - Gitlab::ForcePushCheck.force_push?(project, oldrev, newrev) - end - - private - - def protected_branch_action(oldrev, newrev, branch_name) - # we dont allow force push to protected branch - if forced_push?(oldrev, newrev) - :force_push_code_to_protected_branches - elsif Gitlab::Git.blank_ref?(newrev) - # and we dont allow remove of protected branch - :remove_protected_branches - elsif project.developers_can_push_to_protected_branch?(branch_name) - :push_code - else - :push_code_to_protected_branches - end - end - - def protected_tag?(tag_name) - project.repository.tag_names.include?(tag_name) - end - - def user_allowed? - Gitlab::UserAccess.allowed?(user) - end - - def branch_name(ref) - ref = ref.to_s - if Gitlab::Git.branch_ref?(ref) - Gitlab::Git.ref_name(ref) - else - nil - end - end - - def tag_name(ref) - ref = ref.to_s - if Gitlab::Git.tag_ref?(ref) - Gitlab::Git.ref_name(ref) - else - nil - end - end - - protected - - def build_status_object(status, message = '') - GitAccessStatus.new(status, message) - end - end -end diff --git a/lib/gitlab/git_access_status.rb b/lib/gitlab/git_access_status.rb deleted file mode 100644 index 5a806ff6e0d..00000000000 --- a/lib/gitlab/git_access_status.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Gitlab - class GitAccessStatus - attr_accessor :status, :message - alias_method :allowed?, :status - - def initialize(status, message = '') - @status = status - @message = message - end - - def to_json - { status: @status, message: @message }.to_json - end - end -end diff --git a/lib/gitlab/git_access_wiki.rb b/lib/gitlab/git_access_wiki.rb deleted file mode 100644 index 73d99b96202..00000000000 --- a/lib/gitlab/git_access_wiki.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Gitlab - class GitAccessWiki < GitAccess - def change_access_check(change) - if user.can?(:write_wiki, project) - build_status_object(true) - else - build_status_object(false, "You don't have access") - end - end - end -end diff --git a/lib/gitlab/git_logger.rb b/lib/gitlab/git_logger.rb deleted file mode 100644 index 9e02ccc0f44..00000000000 --- a/lib/gitlab/git_logger.rb +++ /dev/null @@ -1,11 +0,0 @@ -module Gitlab - class GitLogger < Gitlab::Logger - def self.file_name_noext - 'githost' - end - - def format_message(severity, timestamp, progname, msg) - "#{timestamp.to_s(:long)} -> #{severity} -> #{msg}\n" - end - end -end diff --git a/lib/gitlab/git_ref_validator.rb b/lib/gitlab/git_ref_validator.rb deleted file mode 100644 index 39d17def930..00000000000 --- a/lib/gitlab/git_ref_validator.rb +++ /dev/null @@ -1,12 +0,0 @@ -module Gitlab - module GitRefValidator - extend self - # Validates a given name against the git reference specification - # - # Returns true for a valid reference name, false otherwise - def validate(ref_name) - Gitlab::Utils.system_silent( - %W(git check-ref-format refs/#{ref_name})) - end - end -end diff --git a/lib/gitlab/github_import/client.rb b/lib/gitlab/github_import/client.rb deleted file mode 100644 index 270cbcd9ccd..00000000000 --- a/lib/gitlab/github_import/client.rb +++ /dev/null @@ -1,53 +0,0 @@ -module Gitlab - module GithubImport - class Client - attr_reader :client, :api - - def initialize(access_token) - @client = ::OAuth2::Client.new( - config.app_id, - config.app_secret, - github_options - ) - - if access_token - ::Octokit.auto_paginate = true - @api = ::Octokit::Client.new(access_token: access_token) - end - end - - def authorize_url(redirect_uri) - client.auth_code.authorize_url({ - redirect_uri: redirect_uri, - scope: "repo, user, user:email" - }) - end - - def get_token(code) - client.auth_code.get_token(code).token - end - - def method_missing(method, *args, &block) - if api.respond_to?(method) - api.send(method, *args, &block) - else - super(method, *args, &block) - end - end - - def respond_to?(method) - api.respond_to?(method) || super - end - - private - - def config - Gitlab.config.omniauth.providers.find{|provider| provider.name == "github"} - end - - def github_options - OmniAuth::Strategies::GitHub.default_options[:client_options].symbolize_keys - end - end - end -end diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb deleted file mode 100644 index 23832b3233c..00000000000 --- a/lib/gitlab/github_import/importer.rb +++ /dev/null @@ -1,46 +0,0 @@ -module Gitlab - module GithubImport - class Importer - attr_reader :project, :client - - def initialize(project) - @project = project - @client = Client.new(project.creator.github_access_token) - @formatter = Gitlab::ImportFormatter.new - end - - def execute - #Issues && Comments - client.list_issues(project.import_source, state: :all).each do |issue| - if issue.pull_request.nil? - - body = @formatter.author_line(issue.user.login, issue.body) - - if issue.comments > 0 - body += @formatter.comments_header - - client.issue_comments(project.import_source, issue.number).each do |c| - body += @formatter.comment(c.user.login, c.created_at, c.body) - end - end - - project.issues.create!( - description: body, - title: issue.title, - state: issue.state == 'closed' ? 'closed' : 'opened', - author_id: gl_user_id(project, issue.user.id) - ) - end - end - end - - private - - def gl_user_id(project, github_id) - user = User.joins(:identities). - find_by("identities.extern_uid = ? AND identities.provider = 'github'", github_id.to_s) - (user && user.id) || project.creator_id - end - end - end -end diff --git a/lib/gitlab/github_import/project_creator.rb b/lib/gitlab/github_import/project_creator.rb deleted file mode 100644 index 2723eec933e..00000000000 --- a/lib/gitlab/github_import/project_creator.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Gitlab - module GithubImport - class ProjectCreator - attr_reader :repo, :namespace, :current_user - - def initialize(repo, namespace, current_user) - @repo = repo - @namespace = namespace - @current_user = current_user - end - - def execute - ::Projects::CreateService.new(current_user, - name: repo.name, - path: repo.name, - description: repo.description, - namespace_id: namespace.id, - visibility_level: repo.private ? Gitlab::VisibilityLevel::PRIVATE : Gitlab::VisibilityLevel::PUBLIC, - import_type: "github", - import_source: repo.full_name, - import_url: repo.clone_url.sub("https://", "https://#{current_user.github_access_token}@") - ).execute - end - end - end -end diff --git a/lib/gitlab/gitlab_import/client.rb b/lib/gitlab/gitlab_import/client.rb deleted file mode 100644 index 9c00896c913..00000000000 --- a/lib/gitlab/gitlab_import/client.rb +++ /dev/null @@ -1,82 +0,0 @@ -module Gitlab - module GitlabImport - class Client - attr_reader :client, :api - - PER_PAGE = 100 - - def initialize(access_token) - @client = ::OAuth2::Client.new( - config.app_id, - config.app_secret, - gitlab_options - ) - - if access_token - @api = OAuth2::AccessToken.from_hash(@client, access_token: access_token) - end - end - - def authorize_url(redirect_uri) - client.auth_code.authorize_url({ - redirect_uri: redirect_uri, - scope: "api" - }) - end - - def get_token(code, redirect_uri) - client.auth_code.get_token(code, redirect_uri: redirect_uri).token - end - - def user - api.get("/api/v3/user").parsed - end - - def issues(project_identifier) - lazy_page_iterator(PER_PAGE) do |page| - api.get("/api/v3/projects/#{project_identifier}/issues?per_page=#{PER_PAGE}&page=#{page}").parsed - end - end - - def issue_comments(project_identifier, issue_id) - lazy_page_iterator(PER_PAGE) do |page| - api.get("/api/v3/projects/#{project_identifier}/issues/#{issue_id}/notes?per_page=#{PER_PAGE}&page=#{page}").parsed - end - end - - def project(id) - api.get("/api/v3/projects/#{id}").parsed - end - - def projects - lazy_page_iterator(PER_PAGE) do |page| - api.get("/api/v3/projects?per_page=#{PER_PAGE}&page=#{page}").parsed - end - end - - private - - def lazy_page_iterator(per_page) - Enumerator.new do |y| - page = 1 - loop do - items = yield(page) - items.each do |item| - y << item - end - break if items.empty? || items.size < per_page - page += 1 - end - end - end - - def config - Gitlab.config.omniauth.providers.find{|provider| provider.name == "gitlab"} - end - - def gitlab_options - OmniAuth::Strategies::GitLab.default_options[:client_options].symbolize_keys - end - end - end -end diff --git a/lib/gitlab/gitlab_import/importer.rb b/lib/gitlab/gitlab_import/importer.rb deleted file mode 100644 index c5304a0699b..00000000000 --- a/lib/gitlab/gitlab_import/importer.rb +++ /dev/null @@ -1,50 +0,0 @@ -module Gitlab - module GitlabImport - class Importer - attr_reader :project, :client - - def initialize(project) - @project = project - @client = Client.new(project.creator.gitlab_access_token) - @formatter = Gitlab::ImportFormatter.new - end - - def execute - project_identifier = URI.encode(project.import_source, '/') - - #Issues && Comments - issues = client.issues(project_identifier) - - issues.each do |issue| - body = @formatter.author_line(issue["author"]["name"], issue["description"]) - - comments = client.issue_comments(project_identifier, issue["id"]) - - if comments.any? - body += @formatter.comments_header - end - - comments.each do |comment| - body += @formatter.comment(comment["author"]["name"], comment["created_at"], comment["body"]) - end - - project.issues.create!( - description: body, - title: issue["title"], - state: issue["state"], - author_id: gl_user_id(project, issue["author"]["id"]) - ) - end - - true - end - - private - - def gl_user_id(project, gitlab_id) - user = User.joins(:identities).find_by("identities.extern_uid = ? AND identities.provider = 'gitlab'", gitlab_id.to_s) - (user && user.id) || project.creator_id - end - end - end -end diff --git a/lib/gitlab/gitlab_import/project_creator.rb b/lib/gitlab/gitlab_import/project_creator.rb deleted file mode 100644 index f0d7141bf56..00000000000 --- a/lib/gitlab/gitlab_import/project_creator.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Gitlab - module GitlabImport - class ProjectCreator - attr_reader :repo, :namespace, :current_user - - def initialize(repo, namespace, current_user) - @repo = repo - @namespace = namespace - @current_user = current_user - end - - def execute - ::Projects::CreateService.new(current_user, - name: repo["name"], - path: repo["path"], - description: repo["description"], - namespace_id: namespace.id, - visibility_level: repo["visibility_level"], - import_type: "gitlab", - import_source: repo["path_with_namespace"], - import_url: repo["http_url_to_repo"].sub("://", "://oauth2:#{current_user.gitlab_access_token}@") - ).execute - end - end - end -end diff --git a/lib/gitlab/gitorious_import/client.rb b/lib/gitlab/gitorious_import/client.rb deleted file mode 100644 index 8cdc3d4afae..00000000000 --- a/lib/gitlab/gitorious_import/client.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Gitlab - module GitoriousImport - GITORIOUS_HOST = "https://gitorious.org" - - class Client - attr_reader :repo_list - - def initialize(repo_list) - @repo_list = repo_list - end - - def authorize_url(redirect_uri) - "#{GITORIOUS_HOST}/gitlab-import?callback_url=#{redirect_uri}" - end - - def repos - @repos ||= repo_names.map { |full_name| Repository.new(full_name) } - end - - def repo(id) - repos.find { |repo| repo.id == id } - end - - private - - def repo_names - repo_list.to_s.split(',').map(&:strip).reject(&:blank?) - end - end - end -end diff --git a/lib/gitlab/gitorious_import/project_creator.rb b/lib/gitlab/gitorious_import/project_creator.rb deleted file mode 100644 index cc9a91c91f4..00000000000 --- a/lib/gitlab/gitorious_import/project_creator.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Gitlab - module GitoriousImport - class ProjectCreator - attr_reader :repo, :namespace, :current_user - - def initialize(repo, namespace, current_user) - @repo = repo - @namespace = namespace - @current_user = current_user - end - - def execute - ::Projects::CreateService.new(current_user, - name: repo.name, - path: repo.path, - description: repo.description, - namespace_id: namespace.id, - visibility_level: Gitlab::VisibilityLevel::PUBLIC, - import_type: "gitorious", - import_source: repo.full_name, - import_url: repo.import_url - ).execute - end - end - end -end diff --git a/lib/gitlab/gitorious_import/repository.rb b/lib/gitlab/gitorious_import/repository.rb deleted file mode 100644 index f702797dc6e..00000000000 --- a/lib/gitlab/gitorious_import/repository.rb +++ /dev/null @@ -1,37 +0,0 @@ -module Gitlab - module GitoriousImport - GITORIOUS_HOST = "https://gitorious.org" - - Repository = Struct.new(:full_name) do - def id - Digest::SHA1.hexdigest(full_name) - end - - def namespace - segments.first - end - - def path - segments.last - end - - def name - path.titleize - end - - def description - "" - end - - def import_url - "#{GITORIOUS_HOST}/#{full_name}.git" - end - - private - - def segments - full_name.split('/') - end - end - end -end diff --git a/lib/gitlab/google_code_import/client.rb b/lib/gitlab/google_code_import/client.rb deleted file mode 100644 index 02f31e45f88..00000000000 --- a/lib/gitlab/google_code_import/client.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Gitlab - module GoogleCodeImport - class Client - attr_reader :raw_data - - def self.mask_email(author) - parts = author.split("@", 2) - parts[0] = "#{parts[0][0...-3]}..." - parts.join("@") - end - - def initialize(raw_data) - @raw_data = raw_data - end - - def valid? - raw_data.is_a?(Hash) && raw_data["kind"] == "projecthosting#user" && raw_data.has_key?("projects") - end - - def repos - @repos ||= raw_data["projects"].map { |raw_repo| GoogleCodeImport::Repository.new(raw_repo) }.select(&:git?) - end - - def repo(id) - repos.find { |repo| repo.id == id } - end - - def user_map - user_map = Hash.new { |hash, user| hash[user] = self.class.mask_email(user) } - - repos.each do |repo| - next unless repo.valid? && repo.issues - - repo.issues.each do |raw_issue| - # Touching is enough to add the entry and masked email. - user_map[raw_issue["author"]["name"]] - - raw_issue["comments"]["items"].each do |raw_comment| - user_map[raw_comment["author"]["name"]] - end - end - end - - Hash[user_map.sort] - end - end - end -end diff --git a/lib/gitlab/google_code_import/repository.rb b/lib/gitlab/google_code_import/repository.rb deleted file mode 100644 index ad33fc2cad2..00000000000 --- a/lib/gitlab/google_code_import/repository.rb +++ /dev/null @@ -1,43 +0,0 @@ -module Gitlab - module GoogleCodeImport - class Repository - attr_accessor :raw_data - - def initialize(raw_data) - @raw_data = raw_data - end - - def valid? - raw_data.is_a?(Hash) && raw_data["kind"] == "projecthosting#project" - end - - def id - raw_data["externalId"] - end - - def name - raw_data["name"] - end - - def summary - raw_data["summary"] - end - - def description - raw_data["description"] - end - - def git? - raw_data["versionControlSystem"] == "git" - end - - def import_url - raw_data["repositoryUrls"].first - end - - def issues - raw_data["issues"] && raw_data["issues"]["items"] - end - end - end -end diff --git a/lib/gitlab/graphs/commits.rb b/lib/gitlab/graphs/commits.rb deleted file mode 100644 index 2122339d2db..00000000000 --- a/lib/gitlab/graphs/commits.rb +++ /dev/null @@ -1,49 +0,0 @@ -module Gitlab - module Graphs - class Commits - attr_reader :commits, :start_date, :end_date, :duration, - :commits_per_week_days, :commits_per_time, :commits_per_month - - def initialize(commits) - @commits = commits - @start_date = commits.last.committed_date.to_date - @end_date = commits.first.committed_date.to_date - @duration = (@end_date - @start_date).to_i - - collect_data - end - - def authors - @authors ||= @commits.map(&:author_email).uniq.size - end - - def commit_per_day - @commit_per_day ||= (@commits.size.to_f / @duration).round(1) - end - - def collect_data - @commits_per_week_days = {} - Date::DAYNAMES.each { |day| @commits_per_week_days[day] = 0 } - - @commits_per_time = {} - (0..23).to_a.each { |hour| @commits_per_time[hour] = 0 } - - @commits_per_month = {} - (1..31).to_a.each { |day| @commits_per_month[day] = 0 } - - @commits.each do |commit| - hour = commit.committed_date.strftime('%k').to_i - day_of_month = commit.committed_date.strftime('%e').to_i - weekday = commit.committed_date.strftime('%A') - - @commits_per_week_days[weekday] ||= 0 - @commits_per_week_days[weekday] += 1 - @commits_per_time[hour] ||= 0 - @commits_per_time[hour] += 1 - @commits_per_month[day_of_month] ||= 0 - @commits_per_month[day_of_month] += 1 - end - end - end - end -end diff --git a/lib/gitlab/identifier.rb b/lib/gitlab/identifier.rb deleted file mode 100644 index 6e4de197eeb..00000000000 --- a/lib/gitlab/identifier.rb +++ /dev/null @@ -1,23 +0,0 @@ -# Detect user based on identifier like -# key-13 or user-36 or last commit -module Gitlab - module Identifier - def identify(identifier, project, newrev) - if identifier.blank? - # Local push from gitlab - email = project.repository.commit(newrev).author_email rescue nil - User.find_by(email: email) if email - - elsif identifier =~ /\Auser-\d+\Z/ - # git push over http - user_id = identifier.gsub("user-", "") - User.find_by(id: user_id) - - elsif identifier =~ /\Akey-\d+\Z/ - # git push over ssh - key_id = identifier.gsub("key-", "") - Key.find_by(id: key_id).try(:user) - end - end - end -end diff --git a/lib/gitlab/import_formatter.rb b/lib/gitlab/import_formatter.rb deleted file mode 100644 index 72e041a90b1..00000000000 --- a/lib/gitlab/import_formatter.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Gitlab - class ImportFormatter - def comment(author, date, body) - "\n\n*By #{author} on #{date}*\n\n#{body}" - end - - def comments_header - "\n\n\n**Imported comments:**\n" - end - - def author_line(author, body) - "*Created by: #{author}*\n\n#{body}" - end - end -end diff --git a/lib/gitlab/inline_diff.rb b/lib/gitlab/inline_diff.rb deleted file mode 100644 index 3517ecdf5cf..00000000000 --- a/lib/gitlab/inline_diff.rb +++ /dev/null @@ -1,78 +0,0 @@ -module Gitlab - class InlineDiff - class << self - - START = "#!idiff-start!#" - FINISH = "#!idiff-finish!#" - - def processing(diff_arr) - indexes = _indexes_of_changed_lines diff_arr - - indexes.each do |index| - first_line = diff_arr[index+1] - second_line = diff_arr[index+2] - max_length = [first_line.size, second_line.size].max - - # Skip inline diff if empty line was replaced with content - next if first_line == "-\n" - - first_the_same_symbols = 0 - (0..max_length + 1).each do |i| - first_the_same_symbols = i - 1 - if first_line[i] != second_line[i] && i > 0 - break - end - end - - first_token = first_line[0..first_the_same_symbols][1..-1] - start = first_token + START - - if first_token.empty? - # In case if we remove string of spaces in commit - diff_arr[index+1].sub!("-", "-" => "-#{START}") - diff_arr[index+2].sub!("+", "+" => "+#{START}") - else - diff_arr[index+1].sub!(first_token, first_token => start) - diff_arr[index+2].sub!(first_token, first_token => start) - end - - last_the_same_symbols = 0 - (1..max_length + 1).each do |i| - last_the_same_symbols = -i - shortest_line = second_line.size > first_line.size ? first_line : second_line - if ( first_line[-i] != second_line[-i] ) || "#{first_token}#{START}".size == shortest_line[1..-i].size - break - end - end - last_the_same_symbols += 1 - last_token = first_line[last_the_same_symbols..-1] - diff_arr[index+1].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token) - diff_arr[index+2].sub!(/#{Regexp.escape(last_token)}$/, FINISH + last_token) - end - diff_arr - end - - def _indexes_of_changed_lines(diff_arr) - chain_of_first_symbols = "" - diff_arr.each_with_index do |line, i| - chain_of_first_symbols += line[0] - end - chain_of_first_symbols.gsub!(/[^\-\+]/, "#") - - offset = 0 - indexes = [] - while index = chain_of_first_symbols.index("#-+#", offset) - indexes << index - offset = index + 1 - end - indexes - end - - def replace_markers(line) - line.gsub!(START, "") - line.gsub!(FINISH, "") - line - end - end - end -end diff --git a/lib/gitlab/issues_labels.rb b/lib/gitlab/issues_labels.rb deleted file mode 100644 index 1bec6088292..00000000000 --- a/lib/gitlab/issues_labels.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Gitlab - class IssuesLabels - class << self - def generate(project) - red = '#d9534f' - yellow = '#f0ad4e' - blue = '#428bca' - green = '#5cb85c' - - labels = [ - { title: "bug", color: red }, - { title: "critical", color: red }, - { title: "confirmed", color: red }, - { title: "documentation", color: yellow }, - { title: "support", color: yellow }, - { title: "discussion", color: blue }, - { title: "suggestion", color: blue }, - { title: "enhancement", color: green } - ] - - labels.each do |label| - project.labels.create(label) - end - end - end - end -end diff --git a/lib/gitlab/key_fingerprint.rb b/lib/gitlab/key_fingerprint.rb deleted file mode 100644 index baf52ff750d..00000000000 --- a/lib/gitlab/key_fingerprint.rb +++ /dev/null @@ -1,55 +0,0 @@ -module Gitlab - class KeyFingerprint - include Gitlab::Popen - - attr_accessor :key - - def initialize(key) - @key = key - end - - def fingerprint - cmd_status = 0 - cmd_output = '' - - Tempfile.open('gitlab_key_file') do |file| - file.puts key - file.rewind - - cmd = [] - cmd.push *%W(ssh-keygen) - cmd.push *%W(-E md5) if explicit_fingerprint_algorithm? - cmd.push *%W(-lf #{file.path}) - - cmd_output, cmd_status = popen(cmd, '/tmp') - end - - return nil unless cmd_status.zero? - - # 16 hex bytes separated by ':', optionally starting with "MD5:" - fingerprint_matches = cmd_output.match(/(MD5:)?(?(\h{2}:){15}\h{2})/) - return nil unless fingerprint_matches - - fingerprint_matches[:fingerprint] - end - - private - - def explicit_fingerprint_algorithm? - # OpenSSH 6.8 introduces a new default output format for fingerprints. - # Check the version and decide which command to use. - - version_output, version_status = popen(%W(ssh -V)) - return false unless version_status.zero? - - version_matches = version_output.match(/OpenSSH_(?\d+)\.(?\d+)/) - return false unless version_matches - - version_info = Gitlab::VersionInfo.new(version_matches[:major].to_i, version_matches[:minor].to_i) - - required_version_info = Gitlab::VersionInfo.new(6, 8) - - version_info >= required_version_info - end - end -end diff --git a/lib/gitlab/ldap/access.rb b/lib/gitlab/ldap/access.rb deleted file mode 100644 index 960fb3849b4..00000000000 --- a/lib/gitlab/ldap/access.rb +++ /dev/null @@ -1,62 +0,0 @@ -# LDAP authorization model -# -# * Check if we are allowed access (not blocked) -# -module Gitlab - module LDAP - class Access - attr_reader :adapter, :provider, :user - - def self.open(user, &block) - Gitlab::LDAP::Adapter.open(user.ldap_identity.provider) do |adapter| - block.call(self.new(user, adapter)) - end - end - - def self.allowed?(user) - self.open(user) do |access| - if access.allowed? - user.last_credential_check_at = Time.now - user.save - true - else - false - end - end - end - - def initialize(user, adapter=nil) - @adapter = adapter - @user = user - @provider = user.ldap_identity.provider - end - - def allowed? - if Gitlab::LDAP::Person.find_by_dn(user.ldap_identity.extern_uid, adapter) - return true unless ldap_config.active_directory - - # Block user in GitLab if he/she was blocked in AD - if Gitlab::LDAP::Person.disabled_via_active_directory?(user.ldap_identity.extern_uid, adapter) - user.block unless user.blocked? - false - else - user.activate if user.blocked? - true - end - else - false - end - rescue - false - end - - def adapter - @adapter ||= Gitlab::LDAP::Adapter.new(provider) - end - - def ldap_config - Gitlab::LDAP::Config.new(provider) - end - end - end -end diff --git a/lib/gitlab/ldap/adapter.rb b/lib/gitlab/ldap/adapter.rb deleted file mode 100644 index 577a890a7d9..00000000000 --- a/lib/gitlab/ldap/adapter.rb +++ /dev/null @@ -1,89 +0,0 @@ -module Gitlab - module LDAP - class Adapter - attr_reader :provider, :ldap - - def self.open(provider, &block) - Net::LDAP.open(config(provider).adapter_options) do |ldap| - block.call(self.new(provider, ldap)) - end - end - - def self.config(provider) - Gitlab::LDAP::Config.new(provider) - end - - def initialize(provider, ldap=nil) - @provider = provider - @ldap = ldap || Net::LDAP.new(config.adapter_options) - end - - def config - Gitlab::LDAP::Config.new(provider) - end - - def users(field, value, limit = nil) - if field.to_sym == :dn - options = { - base: value, - scope: Net::LDAP::SearchScope_BaseObject - } - else - options = { - base: config.base, - filter: Net::LDAP::Filter.eq(field, value) - } - end - - if config.user_filter.present? - user_filter = Net::LDAP::Filter.construct(config.user_filter) - - options[:filter] = if options[:filter] - Net::LDAP::Filter.join(options[:filter], user_filter) - else - user_filter - end - end - - if limit.present? - options.merge!(size: limit) - end - - entries = ldap_search(options).select do |entry| - entry.respond_to? config.uid - end - - entries.map do |entry| - Gitlab::LDAP::Person.new(entry, provider) - end - end - - def user(*args) - users(*args).first - end - - def dn_matches_filter?(dn, filter) - ldap_search(base: dn, - filter: filter, - scope: Net::LDAP::SearchScope_BaseObject, - attributes: %w{dn}).any? - end - - def ldap_search(*args) - results = ldap.search(*args) - - if results.nil? - response = ldap.get_operation_result - - unless response.code.zero? - Rails.logger.warn("LDAP search error: #{response.message}") - end - - [] - else - results - end - end - end - end -end diff --git a/lib/gitlab/ldap/authentication.rb b/lib/gitlab/ldap/authentication.rb deleted file mode 100644 index 649cf3194b8..00000000000 --- a/lib/gitlab/ldap/authentication.rb +++ /dev/null @@ -1,71 +0,0 @@ -# This calls helps to authenticate to LDAP by providing username and password -# -# Since multiple LDAP servers are supported, it will loop through all of them -# until a valid bind is found -# - -module Gitlab - module LDAP - class Authentication - def self.login(login, password) - return unless Gitlab::LDAP::Config.enabled? - return unless login.present? && password.present? - - auth = nil - # loop through providers until valid bind - providers.find do |provider| - auth = new(provider) - auth.login(login, password) # true will exit the loop - end - - # If (login, password) was invalid for all providers, the value of auth is now the last - # Gitlab::LDAP::Authentication instance we tried. - auth.user - end - - def self.providers - Gitlab::LDAP::Config.providers - end - - attr_accessor :provider, :ldap_user - - def initialize(provider) - @provider = provider - end - - def login(login, password) - @ldap_user = adapter.bind_as( - filter: user_filter(login), - size: 1, - password: password - ) - end - - def adapter - OmniAuth::LDAP::Adaptor.new(config.options.symbolize_keys) - end - - def config - Gitlab::LDAP::Config.new(provider) - end - - def user_filter(login) - filter = Net::LDAP::Filter.equals(config.uid, login) - - # Apply LDAP user filter if present - if config.user_filter.present? - filter = Net::LDAP::Filter.join( - filter, - Net::LDAP::Filter.construct(config.user_filter) - ) - end - filter - end - - def user - return nil unless ldap_user - Gitlab::LDAP::User.find_by_uid_and_provider(ldap_user.dn, provider) - end - end - end -end diff --git a/lib/gitlab/ldap/config.rb b/lib/gitlab/ldap/config.rb deleted file mode 100644 index d2ffa2e1fe8..00000000000 --- a/lib/gitlab/ldap/config.rb +++ /dev/null @@ -1,122 +0,0 @@ -# Load a specific server configuration -module Gitlab - module LDAP - class Config - attr_accessor :provider, :options - - def self.enabled? - Gitlab.config.ldap.enabled - end - - def self.servers - Gitlab.config.ldap.servers.values - end - - def self.providers - servers.map {|server| server['provider_name'] } - end - - def self.valid_provider?(provider) - providers.include?(provider) - end - - def self.invalid_provider(provider) - raise "Unknown provider (#{provider}). Available providers: #{providers}" - end - - def initialize(provider) - if self.class.valid_provider?(provider) - @provider = provider - else - self.class.invalid_provider(provider) - end - @options = config_for(@provider) # Use @provider, not provider - end - - def enabled? - base_config.enabled - end - - def adapter_options - { - host: options['host'], - port: options['port'], - encryption: encryption - }.tap do |options| - options.merge!(auth_options) if has_auth? - end - end - - def base - options['base'] - end - - def uid - options['uid'] - end - - def sync_ssh_keys? - sync_ssh_keys.present? - end - - # The LDAP attribute in which the ssh keys are stored - def sync_ssh_keys - options['sync_ssh_keys'] - end - - def user_filter - options['user_filter'] - end - - def group_base - options['group_base'] - end - - def admin_group - options['admin_group'] - end - - def active_directory - options['active_directory'] - end - - def block_auto_created_users - options['block_auto_created_users'] - end - - protected - def base_config - Gitlab.config.ldap - end - - def config_for(provider) - base_config.servers.values.find { |server| server['provider_name'] == provider } - end - - def encryption - case options['method'].to_s - when 'ssl' - :simple_tls - when 'tls' - :start_tls - else - nil - end - end - - def auth_options - { - auth: { - method: :simple, - username: options['bind_dn'], - password: options['password'] - } - } - end - - def has_auth? - options['password'] || options['bind_dn'] - end - end - end -end diff --git a/lib/gitlab/ldap/person.rb b/lib/gitlab/ldap/person.rb deleted file mode 100644 index b81f3e8e8f5..00000000000 --- a/lib/gitlab/ldap/person.rb +++ /dev/null @@ -1,61 +0,0 @@ -module Gitlab - module LDAP - class Person - # Active Directory-specific LDAP filter that checks if bit 2 of the - # userAccountControl attribute is set. - # Source: http://ctogonewild.com/2009/09/03/bitmask-searches-in-ldap/ - AD_USER_DISABLED = Net::LDAP::Filter.ex("userAccountControl:1.2.840.113556.1.4.803", "2") - - attr_accessor :entry, :provider - - def self.find_by_uid(uid, adapter) - uid = Net::LDAP::Filter.escape(uid) - adapter.user(adapter.config.uid, uid) - end - - def self.find_by_dn(dn, adapter) - adapter.user('dn', dn) - end - - def self.disabled_via_active_directory?(dn, adapter) - adapter.dn_matches_filter?(dn, AD_USER_DISABLED) - end - - def initialize(entry, provider) - Rails.logger.debug { "Instantiating #{self.class.name} with LDIF:\n#{entry.to_ldif}" } - @entry = entry - @provider = provider - end - - def name - entry.cn.first - end - - def uid - entry.send(config.uid).first - end - - def username - uid - end - - def email - entry.try(:mail) - end - - def dn - entry.dn - end - - private - - def entry - @entry - end - - def config - @config ||= Gitlab::LDAP::Config.new(provider) - end - end - end -end diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb deleted file mode 100644 index f7f3ba9ad7d..00000000000 --- a/lib/gitlab/ldap/user.rb +++ /dev/null @@ -1,71 +0,0 @@ -require 'gitlab/o_auth/user' - -# LDAP extension for User model -# -# * Find or create user from omniauth.auth data -# * Links LDAP account with existing user -# * Auth LDAP user with login and password -# -module Gitlab - module LDAP - class User < Gitlab::OAuth::User - class << self - def find_by_uid_and_provider(uid, provider) - # LDAP distinguished name is case-insensitive - identity = ::Identity. - where(provider: provider). - where('lower(extern_uid) = ?', uid.downcase).last - identity && identity.user - end - end - - def initialize(auth_hash) - super - update_user_attributes - end - - # instance methods - def gl_user - @gl_user ||= find_by_uid_and_provider || find_by_email || build_new_user - end - - def find_by_uid_and_provider - self.class.find_by_uid_and_provider( - auth_hash.uid.downcase, auth_hash.provider) - end - - def find_by_email - ::User.find_by(email: auth_hash.email) - end - - def update_user_attributes - return unless persisted? - - gl_user.skip_reconfirmation! - gl_user.email = auth_hash.email - - # Build new identity only if we dont have have same one - gl_user.identities.find_or_initialize_by(provider: auth_hash.provider, - extern_uid: auth_hash.uid) - - gl_user - end - - def changed? - gl_user.changed? || gl_user.identities.any?(&:changed?) - end - - def block_after_signup? - ldap_config.block_auto_created_users - end - - def allowed? - Gitlab::LDAP::Access.allowed?(gl_user) - end - - def ldap_config - Gitlab::LDAP::Config.new(auth_hash.provider) - end - end - end -end diff --git a/lib/gitlab/logger.rb b/lib/gitlab/logger.rb deleted file mode 100644 index 59b21149a9a..00000000000 --- a/lib/gitlab/logger.rb +++ /dev/null @@ -1,32 +0,0 @@ -module Gitlab - class Logger < ::Logger - def self.file_name - file_name_noext + '.log' - end - - def self.error(message) - build.error(message) - end - - def self.info(message) - build.info(message) - end - - def self.read_latest - path = Rails.root.join("log", file_name) - self.build unless File.exist?(path) - tail_output, _ = Gitlab::Popen.popen(%W(tail -n 2000 #{path})) - tail_output.split("\n") - end - - def self.read_latest_for(filename) - path = Rails.root.join("log", filename) - tail_output, _ = Gitlab::Popen.popen(%W(tail -n 2000 #{path})) - tail_output.split("\n") - end - - def self.build - new(Rails.root.join("log", file_name)) - end - end -end diff --git a/lib/gitlab/markdown_helper.rb b/lib/gitlab/markdown_helper.rb deleted file mode 100644 index 5e3cfc0585b..00000000000 --- a/lib/gitlab/markdown_helper.rb +++ /dev/null @@ -1,29 +0,0 @@ -module Gitlab - module MarkdownHelper - module_function - - # Public: Determines if a given filename is compatible with GitHub::Markup. - # - # filename - Filename string to check - # - # Returns boolean - def markup?(filename) - filename.downcase.end_with?(*%w(.textile .rdoc .org .creole .wiki - .mediawiki .rst .adoc .asciidoc .asc)) - end - - # Public: Determines if a given filename is compatible with - # GitLab-flavored Markdown. - # - # filename - Filename string to check - # - # Returns boolean - def gitlab_markdown?(filename) - filename.downcase.end_with?(*%w(.mdown .md .markdown)) - end - - def previewable?(filename) - gitlab_markdown?(filename) || markup?(filename) - end - end -end diff --git a/lib/gitlab/middleware/static.rb b/lib/gitlab/middleware/static.rb deleted file mode 100644 index 85ffa8aca68..00000000000 --- a/lib/gitlab/middleware/static.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Gitlab - module Middleware - class Static < ActionDispatch::Static - UPLOADS_REGEX = /\A\/uploads(\/|\z)/.freeze - - def call(env) - return @app.call(env) if env['PATH_INFO'] =~ UPLOADS_REGEX - - super - end - end - end -end diff --git a/lib/gitlab/note_data_builder.rb b/lib/gitlab/note_data_builder.rb deleted file mode 100644 index 644dec45dca..00000000000 --- a/lib/gitlab/note_data_builder.rb +++ /dev/null @@ -1,77 +0,0 @@ -module Gitlab - class NoteDataBuilder - class << self - # Produce a hash of post-receive data - # - # For all notes: - # - # data = { - # object_kind: "note", - # user: { - # name: String, - # username: String, - # avatar_url: String - # } - # project_id: Integer, - # repository: { - # name: String, - # url: String, - # description: String, - # homepage: String, - # } - # object_attributes: { - # - # } - # : { - # } - # note-specific data is a hash with one of the following keys and contains - # the hook data for that type. - # - commit - # - issue - # - merge_request - # - snippet - # - def build(note, user) - project = note.project - data = build_base_data(project, user, note) - - if note.for_commit? - data[:commit] = build_data_for_commit(project, user, note) - elsif note.for_issue? - data[:issue] = note.noteable.hook_attrs - elsif note.for_merge_request? - data[:merge_request] = note.noteable.hook_attrs - elsif note.for_project_snippet? - data[:snippet] = note.noteable.hook_attrs - end - - data - end - - def build_base_data(project, user, note) - base_data = { - object_kind: "note", - user: user.hook_attrs, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url, - }, - object_attributes: note.hook_attrs - } - - base_data[:object_attributes][:url] = - Gitlab::UrlBuilder.new(:note).build(note.id) - base_data - end - - def build_data_for_commit(project, user, note) - # commit_id is the SHA hash - commit = project.repository.commit(note.commit_id) - commit.hook_attrs(project) - end - end - end -end diff --git a/lib/gitlab/o_auth/auth_hash.rb b/lib/gitlab/o_auth/auth_hash.rb deleted file mode 100644 index ce52beec78e..00000000000 --- a/lib/gitlab/o_auth/auth_hash.rb +++ /dev/null @@ -1,54 +0,0 @@ -# Class to parse and transform the info provided by omniauth -# -module Gitlab - module OAuth - class AuthHash - attr_reader :auth_hash - def initialize(auth_hash) - @auth_hash = auth_hash - end - - def uid - auth_hash.uid.to_s - end - - def provider - auth_hash.provider - end - - def info - auth_hash.info - end - - def name - (info.try(:name) || full_name).to_s.force_encoding('utf-8') - end - - def full_name - "#{info.first_name} #{info.last_name}" - end - - def username - (info.try(:nickname) || generate_username).to_s.force_encoding('utf-8') - end - - def email - (info.try(:email) || generate_temporarily_email).downcase - end - - def password - @password ||= Devise.friendly_token[0, 8].downcase - end - - # Get the first part of the email address (before @) - # In addtion in removes illegal characters - def generate_username - email.match(/^[^@]*/)[0].parameterize - end - - def generate_temporarily_email - "temp-email-for-oauth-#{username}@gitlab.localhost" - end - end - end -end diff --git a/lib/gitlab/o_auth/user.rb b/lib/gitlab/o_auth/user.rb deleted file mode 100644 index 2f5c217d764..00000000000 --- a/lib/gitlab/o_auth/user.rb +++ /dev/null @@ -1,106 +0,0 @@ -# OAuth extension for User model -# -# * Find GitLab user based on omniauth uid and provider -# * Create new user from omniauth data -# -module Gitlab - module OAuth - class ForbiddenAction < StandardError; end - - class User - attr_accessor :auth_hash, :gl_user - - def initialize(auth_hash) - self.auth_hash = auth_hash - end - - def persisted? - gl_user.try(:persisted?) - end - - def new? - !persisted? - end - - def valid? - gl_user.try(:valid?) - end - - def save - unauthorized_to_create unless gl_user - - if needs_blocking? - gl_user.save! - gl_user.block - else - gl_user.save! - end - - log.info "(OAuth) saving user #{auth_hash.email} from login with extern_uid => #{auth_hash.uid}" - gl_user - rescue ActiveRecord::RecordInvalid => e - log.info "(OAuth) Error saving user: #{gl_user.errors.full_messages}" - return self, e.record.errors - end - - def gl_user - @user ||= find_by_uid_and_provider - - if signup_enabled? - @user ||= build_new_user - end - - @user - end - - protected - - def needs_blocking? - new? && block_after_signup? - end - - def signup_enabled? - Gitlab.config.omniauth.allow_single_sign_on - end - - def block_after_signup? - Gitlab.config.omniauth.block_auto_created_users - end - - def auth_hash=(auth_hash) - @auth_hash = AuthHash.new(auth_hash) - end - - def find_by_uid_and_provider - identity = Identity.find_by(provider: auth_hash.provider, extern_uid: auth_hash.uid) - identity && identity.user - end - - def build_new_user - user = ::User.new(user_attributes) - user.skip_confirmation! - user.identities.new(extern_uid: auth_hash.uid, provider: auth_hash.provider) - user - end - - def user_attributes - { - name: auth_hash.name, - username: ::Namespace.clean_path(auth_hash.username), - email: auth_hash.email, - password: auth_hash.password, - password_confirmation: auth_hash.password, - password_automatically_set: true - } - end - - def log - Gitlab::AppLogger - end - - def unauthorized_to_create - raise ForbiddenAction.new("Unauthorized to create user, signup disabled for #{auth_hash.provider}") - end - end - end -end diff --git a/lib/gitlab/popen.rb b/lib/gitlab/popen.rb deleted file mode 100644 index 43e07e09160..00000000000 --- a/lib/gitlab/popen.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'fileutils' -require 'open3' - -module Gitlab - module Popen - extend self - - def popen(cmd, path=nil) - unless cmd.is_a?(Array) - raise "System commands must be given as an array of strings" - end - - path ||= Dir.pwd - vars = { "PWD" => path } - options = { chdir: path } - - unless File.directory?(path) - FileUtils.mkdir_p(path) - end - - @cmd_output = "" - @cmd_status = 0 - Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr| - # We are not using stdin so we should close it, in case the command we - # are running waits for input. - stdin.close - @cmd_output << stdout.read - @cmd_output << stderr.read - @cmd_status = wait_thr.value.exitstatus - end - - [@cmd_output, @cmd_status] - end - end -end diff --git a/lib/gitlab/production_logger.rb b/lib/gitlab/production_logger.rb deleted file mode 100644 index 89ce7144b1b..00000000000 --- a/lib/gitlab/production_logger.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Gitlab - class ProductionLogger < Gitlab::Logger - def self.file_name_noext - 'production' - end - end -end diff --git a/lib/gitlab/project_search_results.rb b/lib/gitlab/project_search_results.rb deleted file mode 100644 index 0dab7bcfa4d..00000000000 --- a/lib/gitlab/project_search_results.rb +++ /dev/null @@ -1,77 +0,0 @@ -module Gitlab - class ProjectSearchResults < SearchResults - attr_reader :project, :repository_ref - - def initialize(project_id, query, repository_ref = nil) - @project = Project.find(project_id) - @repository_ref = if repository_ref.present? - repository_ref - else - nil - end - @query = Shellwords.shellescape(query) if query.present? - end - - def objects(scope, page = nil) - case scope - when 'notes' - notes.page(page).per(per_page) - when 'blobs' - Kaminari.paginate_array(blobs).page(page).per(per_page) - when 'wiki_blobs' - Kaminari.paginate_array(wiki_blobs).page(page).per(per_page) - else - super - end - end - - def total_count - @total_count ||= issues_count + merge_requests_count + blobs_count + - notes_count + wiki_blobs_count - end - - def blobs_count - @blobs_count ||= blobs.count - end - - def notes_count - @notes_count ||= notes.count - end - - def wiki_blobs_count - @wiki_blobs_count ||= wiki_blobs.count - end - - private - - def blobs - if project.empty_repo? || query.blank? - [] - else - project.repository.search_files(query, repository_ref) - end - end - - def wiki_blobs - if project.wiki_enabled? && query.present? - project_wiki = ProjectWiki.new(project) - - unless project_wiki.empty? - project_wiki.search_files(query) - else - [] - end - else - [] - end - end - - def notes - Note.where(project_id: limit_project_ids).user.search(query).order('updated_at DESC') - end - - def limit_project_ids - [project.id] - end - end -end diff --git a/lib/gitlab/push_data_builder.rb b/lib/gitlab/push_data_builder.rb deleted file mode 100644 index f8da452e4c0..00000000000 --- a/lib/gitlab/push_data_builder.rb +++ /dev/null @@ -1,90 +0,0 @@ -module Gitlab - class PushDataBuilder - class << self - # Produce a hash of post-receive data - # - # data = { - # before: String, - # after: String, - # ref: String, - # user_id: String, - # user_name: String, - # user_email: String - # project_id: String, - # repository: { - # name: String, - # url: String, - # description: String, - # homepage: String, - # }, - # commits: Array, - # total_commits_count: Fixnum - # } - # - def build(project, user, oldrev, newrev, ref, commits = [], message = nil) - # Total commits count - commits_count = commits.size - - # Get latest 20 commits ASC - commits_limited = commits.last(20) - - # For performance purposes maximum 20 latest commits - # will be passed as post receive hook data. - commit_attrs = commits_limited.map do |commit| - commit.hook_attrs(project) - end - - type = Gitlab::Git.tag_ref?(ref) ? "tag_push" : "push" - # Hash to be passed as post_receive_data - data = { - object_kind: type, - before: oldrev, - after: newrev, - ref: ref, - checkout_sha: checkout_sha(project.repository, newrev, ref), - message: message, - user_id: user.id, - user_name: user.name, - user_email: user.email, - project_id: project.id, - repository: { - name: project.name, - url: project.url_to_repo, - description: project.description, - homepage: project.web_url, - git_http_url: project.http_url_to_repo, - git_ssh_url: project.ssh_url_to_repo, - visibility_level: project.visibility_level - }, - commits: commit_attrs, - total_commits_count: commits_count - } - - data - end - - # This method provide a sample data generated with - # existing project and commits to test web hooks - def build_sample(project, user) - commits = project.repository.commits(project.default_branch, nil, 3) - ref = "#{Gitlab::Git::BRANCH_REF_PREFIX}#{project.default_branch}" - build(project, user, commits.last.id, commits.first.id, ref, commits) - end - - def checkout_sha(repository, newrev, ref) - # Find sha for tag, except when it was deleted. - if Gitlab::Git.tag_ref?(ref) && !Gitlab::Git.blank_ref?(newrev) - tag_name = Gitlab::Git.ref_name(ref) - tag = repository.find_tag(tag_name) - - if tag - commit = repository.commit(tag.target) - commit.try(:sha) - end - else - newrev - end - end - end - end -end diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb deleted file mode 100644 index a502a8fe9cd..00000000000 --- a/lib/gitlab/reference_extractor.rb +++ /dev/null @@ -1,94 +0,0 @@ -module Gitlab - # Extract possible GFM references from an arbitrary String for further processing. - class ReferenceExtractor - attr_accessor :project, :current_user, :references - - include ::Gitlab::Markdown - - def initialize(project, current_user = nil) - @project = project - @current_user = current_user - end - - def can?(user, action, subject) - Ability.abilities.allowed?(user, action, subject) - end - - def analyze(text) - text = text.dup - - # Remove preformatted/code blocks so that references are not included - text.gsub!(%r{

        .*?
        |.*?}m) { |match| '' } - text.gsub!(%r{^```.*?^```}m) { |match| '' } - - @references = Hash.new { |hash, type| hash[type] = [] } - parse_references(text) - end - - # Given a valid project, resolve the extracted identifiers of the requested type to - # model objects. - - def users - references[:user].uniq.map do |project, identifier| - if identifier == "all" - project.team.members.flatten - elsif namespace = Namespace.find_by(path: identifier) - if namespace.is_a?(Group) - namespace.users - else - namespace.owner - end - end - end.flatten.compact.uniq - end - - def labels - references[:label].uniq.map do |project, identifier| - project.labels.where(id: identifier).first - end.compact.uniq - end - - def issues - references[:issue].uniq.map do |project, identifier| - if project.default_issues_tracker? - project.issues.where(iid: identifier).first - end - end.compact.uniq - end - - def merge_requests - references[:merge_request].uniq.map do |project, identifier| - project.merge_requests.where(iid: identifier).first - end.compact.uniq - end - - def snippets - references[:snippet].uniq.map do |project, identifier| - project.snippets.where(id: identifier).first - end.compact.uniq - end - - def commits - references[:commit].uniq.map do |project, identifier| - repo = project.repository - repo.commit(identifier) if repo - end.compact.uniq - end - - def commit_ranges - references[:commit_range].uniq.map do |project, identifier| - repo = project.repository - if repo - from_id, to_id = identifier.split(/\.{2,3}/, 2) - [repo.commit(from_id), repo.commit(to_id)] - end - end.compact.uniq - end - - private - - def reference_link(type, identifier, project, _) - references[type] << [project, identifier] - end - end -end diff --git a/lib/gitlab/satellite/action.rb b/lib/gitlab/satellite/action.rb deleted file mode 100644 index 4890ccf21e6..00000000000 --- a/lib/gitlab/satellite/action.rb +++ /dev/null @@ -1,56 +0,0 @@ -module Gitlab - module Satellite - class Action - DEFAULT_OPTIONS = { git_timeout: Gitlab.config.satellites.timeout.seconds } - - attr_accessor :options, :project, :user - - def initialize(user, project, options = {}) - @options = DEFAULT_OPTIONS.merge(options) - @project = project - @user = user - end - - protected - - # * Sets a 30s timeout for Git - # * Locks the satellite repo - # * Yields the prepared satellite repo - def in_locked_and_timed_satellite - Gitlab::ShellEnv.set_env(user) - - Grit::Git.with_timeout(options[:git_timeout]) do - project.satellite.lock do - return yield project.satellite.repo - end - end - rescue Errno::ENOMEM => ex - return handle_exception(ex) - rescue Grit::Git::GitTimeout => ex - return handle_exception(ex) - ensure - Gitlab::ShellEnv.reset_env - end - - # * Recreates the satellite - # * Sets up Git variables for the user - # - # Note: use this within #in_locked_and_timed_satellite - def prepare_satellite!(repo) - project.satellite.clear_and_update! - - repo.config['user.name'] = user.name - repo.config['user.email'] = user.email - end - - def default_options(options = {}) - { raise: true, timeout: true }.merge(options) - end - - def handle_exception(exception) - Gitlab::GitLogger.error(exception.message) - false - end - end - end -end diff --git a/lib/gitlab/satellite/compare_action.rb b/lib/gitlab/satellite/compare_action.rb deleted file mode 100644 index 46c98a8f4ca..00000000000 --- a/lib/gitlab/satellite/compare_action.rb +++ /dev/null @@ -1,44 +0,0 @@ -module Gitlab - module Satellite - class BranchesWithoutParent < StandardError; end - - class CompareAction < Action - def initialize(user, target_project, target_branch, source_project, source_branch) - super user, target_project - - @target_project, @target_branch = target_project, target_branch - @source_project, @source_branch = source_project, source_branch - end - - # Compare 2 repositories and return Gitlab::CompareResult object - def result - in_locked_and_timed_satellite do |target_repo| - prepare_satellite!(target_repo) - update_satellite_source_and_target!(target_repo) - - Gitlab::CompareResult.new(compare(target_repo)) - end - rescue Grit::Git::CommandFailed => ex - raise BranchesWithoutParent - end - - private - - # Assumes a satellite exists that is a fresh clone of the projects repo, prepares satellite for diffs - def update_satellite_source_and_target!(target_repo) - target_repo.remote_add('source', @source_project.repository.path_to_repo) - target_repo.remote_fetch('source') - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - def compare(repo) - @compare ||= Gitlab::Git::Compare.new( - Gitlab::Git::Repository.new(repo.path), - "origin/#{@target_branch}", - "source/#{@source_branch}" - ) - end - end - end -end diff --git a/lib/gitlab/satellite/files/delete_file_action.rb b/lib/gitlab/satellite/files/delete_file_action.rb deleted file mode 100644 index 0d37b9dea85..00000000000 --- a/lib/gitlab/satellite/files/delete_file_action.rb +++ /dev/null @@ -1,50 +0,0 @@ -require_relative 'file_action' - -module Gitlab - module Satellite - class DeleteFileAction < FileAction - # Deletes file and creates a new commit for it - # - # Returns false if committing the change fails - # Returns false if pushing from the satellite to bare repo failed or was rejected - # Returns true otherwise - def commit!(content, commit_message) - in_locked_and_timed_satellite do |repo| - prepare_satellite!(repo) - - # create target branch in satellite at the corresponding commit from bare repo - repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") - - # update the file in the satellite's working dir - file_path_in_satellite = File.join(repo.working_dir, file_path) - - # Prevent relative links - unless safe_path?(file_path_in_satellite) - Gitlab::GitLogger.error("FileAction: Relative path not allowed") - return false - end - - File.delete(file_path_in_satellite) - - # add removed file - repo.remove(file_path_in_satellite) - - # commit the changes - # will raise CommandFailed when commit fails - repo.git.commit(raise: true, timeout: true, a: true, m: commit_message) - - - # push commit back to bare repo - # will raise CommandFailed when push fails - repo.git.push({ raise: true, timeout: true }, :origin, ref) - - # everything worked - true - end - rescue Grit::Git::CommandFailed => ex - Gitlab::GitLogger.error(ex.message) - false - end - end - end -end diff --git a/lib/gitlab/satellite/files/edit_file_action.rb b/lib/gitlab/satellite/files/edit_file_action.rb deleted file mode 100644 index 3cb9c0b5ecb..00000000000 --- a/lib/gitlab/satellite/files/edit_file_action.rb +++ /dev/null @@ -1,68 +0,0 @@ -require_relative 'file_action' - -module Gitlab - module Satellite - # GitLab server-side file update and commit - class EditFileAction < FileAction - # Updates the files content and creates a new commit for it - # - # Returns false if the ref has been updated while editing the file - # Returns false if committing the change fails - # Returns false if pushing from the satellite to bare repo failed or was rejected - # Returns true otherwise - def commit!(content, commit_message, encoding, new_branch = nil) - in_locked_and_timed_satellite do |repo| - prepare_satellite!(repo) - - # create target branch in satellite at the corresponding commit from bare repo - begin - repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") - rescue Grit::Git::CommandFailed => ex - log_and_raise(CheckoutFailed, ex.message) - end - - # update the file in the satellite's working dir - file_path_in_satellite = File.join(repo.working_dir, file_path) - - # Prevent relative links - unless safe_path?(file_path_in_satellite) - Gitlab::GitLogger.error("FileAction: Relative path not allowed") - return false - end - - # Write file - write_file(file_path_in_satellite, content, encoding) - - # commit the changes - # will raise CommandFailed when commit fails - begin - repo.git.commit(raise: true, timeout: true, a: true, m: commit_message) - rescue Grit::Git::CommandFailed => ex - log_and_raise(CommitFailed, ex.message) - end - - - target_branch = new_branch.present? ? "#{ref}:#{new_branch}" : ref - - # push commit back to bare repo - # will raise CommandFailed when push fails - begin - repo.git.push({ raise: true, timeout: true }, :origin, target_branch) - rescue Grit::Git::CommandFailed => ex - log_and_raise(PushFailed, ex.message) - end - - # everything worked - true - end - end - - private - - def log_and_raise(errorClass, message) - Gitlab::GitLogger.error(message) - raise(errorClass, message) - end - end - end -end diff --git a/lib/gitlab/satellite/files/file_action.rb b/lib/gitlab/satellite/files/file_action.rb deleted file mode 100644 index 6446b14568a..00000000000 --- a/lib/gitlab/satellite/files/file_action.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Gitlab - module Satellite - class FileAction < Action - attr_accessor :file_path, :ref - - def initialize(user, project, ref, file_path) - super user, project - @file_path = file_path - @ref = ref - end - - def safe_path?(path) - File.absolute_path(path) == path - end - - def write_file(abs_file_path, content, file_encoding = 'text') - if file_encoding == 'base64' - File.open(abs_file_path, 'wb') { |f| f.write(Base64.decode64(content)) } - else - File.open(abs_file_path, 'w') { |f| f.write(content) } - end - end - end - end -end diff --git a/lib/gitlab/satellite/files/new_file_action.rb b/lib/gitlab/satellite/files/new_file_action.rb deleted file mode 100644 index 724dfa0d042..00000000000 --- a/lib/gitlab/satellite/files/new_file_action.rb +++ /dev/null @@ -1,67 +0,0 @@ -require_relative 'file_action' - -module Gitlab - module Satellite - class NewFileAction < FileAction - # Updates the files content and creates a new commit for it - # - # Returns false if the ref has been updated while editing the file - # Returns false if committing the change fails - # Returns false if pushing from the satellite to bare repo failed or was rejected - # Returns true otherwise - def commit!(content, commit_message, encoding, new_branch = nil) - in_locked_and_timed_satellite do |repo| - prepare_satellite!(repo) - - # create target branch in satellite at the corresponding commit from bare repo - current_ref = - if @project.empty_repo? - # skip this step if we want to add first file to empty repo - Satellite::PARKING_BRANCH - else - repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") - ref - end - - file_path_in_satellite = File.join(repo.working_dir, file_path) - dir_name_in_satellite = File.dirname(file_path_in_satellite) - - # Prevent relative links - unless safe_path?(file_path_in_satellite) - Gitlab::GitLogger.error("FileAction: Relative path not allowed") - return false - end - - # Create dir if not exists - FileUtils.mkdir_p(dir_name_in_satellite) - - # Write file - write_file(file_path_in_satellite, content, encoding) - - # add new file - repo.add(file_path_in_satellite) - - # commit the changes - # will raise CommandFailed when commit fails - repo.git.commit(raise: true, timeout: true, a: true, m: commit_message) - - target_branch = if new_branch.present? && !@project.empty_repo? - "#{ref}:#{new_branch}" - else - "#{current_ref}:#{ref}" - end - - # push commit back to bare repo - # will raise CommandFailed when push fails - repo.git.push({ raise: true, timeout: true }, :origin, target_branch) - - # everything worked - true - end - rescue Grit::Git::CommandFailed => ex - Gitlab::GitLogger.error(ex.message) - false - end - end - end -end diff --git a/lib/gitlab/satellite/logger.rb b/lib/gitlab/satellite/logger.rb deleted file mode 100644 index 6f3f8255aca..00000000000 --- a/lib/gitlab/satellite/logger.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Gitlab - module Satellite - class Logger < Gitlab::Logger - def self.file_name - 'satellites.log' - end - - def format_message(severity, timestamp, progname, msg) - "#{timestamp.to_s(:long)}: #{msg}\n" - end - end - end -end diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb deleted file mode 100644 index 1f2e5f82dd5..00000000000 --- a/lib/gitlab/satellite/merge_action.rb +++ /dev/null @@ -1,146 +0,0 @@ -module Gitlab - module Satellite - # GitLab server-side merge - class MergeAction < Action - attr_accessor :merge_request - - def initialize(user, merge_request) - super user, merge_request.target_project - @merge_request = merge_request - end - - # Checks if a merge request can be executed without user interaction - def can_be_merged? - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - merge_in_satellite!(merge_repo) - end - end - - # Merges the source branch into the target branch in the satellite and - # pushes it back to the repository. - # It also removes the source branch if requested in the merge request (and this is permitted by the merge request). - # - # Returns false if the merge produced conflicts - # Returns false if pushing from the satellite to the repository failed or was rejected - # Returns true otherwise - def merge!(merge_commit_message = nil) - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - if merge_in_satellite!(merge_repo, merge_commit_message) - # push merge back to bare repo - # will raise CommandFailed when push fails - merge_repo.git.push(default_options, :origin, merge_request.target_branch) - - # remove source branch - if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch) && !merge_request.for_fork? - # will raise CommandFailed when push fails - merge_repo.git.push(default_options, :origin, ":#{merge_request.source_branch}") - end - # merge, push and branch removal successful - true - end - end - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - def diff_in_satellite - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - update_satellite_source_and_target!(merge_repo) - - # Only show what is new in the source branch compared to the target branch, not the other way around. - # The line below with merge_base is equivalent to diff with three dots (git diff branch1...branch2) - # From the git documentation: "git diff A...B" is equivalent to "git diff $(git-merge-base A B) B" - common_commit = merge_repo.git.native(:merge_base, default_options, ["origin/#{merge_request.target_branch}", "source/#{merge_request.source_branch}"]).strip - merge_repo.git.native(:diff, default_options, common_commit, "source/#{merge_request.source_branch}") - end - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - def diffs_between_satellite - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - update_satellite_source_and_target!(merge_repo) - if merge_request.for_fork? - repository = Gitlab::Git::Repository.new(merge_repo.path) - diffs = Gitlab::Git::Diff.between( - repository, - "source/#{merge_request.source_branch}", - "origin/#{merge_request.target_branch}" - ) - else - raise "Attempt to determine diffs between for a non forked merge request in satellite MergeRequest.id:[#{merge_request.id}]" - end - - return diffs - end - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - # Get commit as an email patch - def format_patch - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - update_satellite_source_and_target!(merge_repo) - patch = merge_repo.git.format_patch(default_options({ stdout: true }), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}") - end - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - # Retrieve an array of commits between the source and the target - def commits_between - in_locked_and_timed_satellite do |merge_repo| - prepare_satellite!(merge_repo) - update_satellite_source_and_target!(merge_repo) - if merge_request.for_fork? - repository = Gitlab::Git::Repository.new(merge_repo.path) - commits = Gitlab::Git::Commit.between( - repository, - "origin/#{merge_request.target_branch}", - "source/#{merge_request.source_branch}" - ) - else - raise "Attempt to determine commits between for a non forked merge request in satellite MergeRequest.id:[#{merge_request.id}]" - end - - return commits - end - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - private - # Merges the source_branch into the target_branch in the satellite. - # - # Note: it will clear out the satellite before doing anything - # - # Returns false if the merge produced conflicts - # Returns true otherwise - def merge_in_satellite!(repo, message = nil) - update_satellite_source_and_target!(repo) - - message ||= "Merge branch '#{merge_request.source_branch}' into '#{merge_request.target_branch}'" - - # merge the source branch into the satellite - # will raise CommandFailed when merge fails - repo.git.merge(default_options({ no_ff: true }), "-m#{message}", "source/#{merge_request.source_branch}") - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - - # Assumes a satellite exists that is a fresh clone of the projects repo, prepares satellite for merges, diffs etc - def update_satellite_source_and_target!(repo) - repo.remote_add('source', merge_request.source_project.repository.path_to_repo) - repo.remote_fetch('source') - repo.git.checkout(default_options({ b: true }), merge_request.target_branch, "origin/#{merge_request.target_branch}") - rescue Grit::Git::CommandFailed => ex - handle_exception(ex) - end - end - end -end diff --git a/lib/gitlab/satellite/satellite.rb b/lib/gitlab/satellite/satellite.rb deleted file mode 100644 index 398643d68de..00000000000 --- a/lib/gitlab/satellite/satellite.rb +++ /dev/null @@ -1,148 +0,0 @@ -module Gitlab - module Satellite - autoload :DeleteFileAction, 'gitlab/satellite/files/delete_file_action' - autoload :EditFileAction, 'gitlab/satellite/files/edit_file_action' - autoload :FileAction, 'gitlab/satellite/files/file_action' - autoload :NewFileAction, 'gitlab/satellite/files/new_file_action' - - class CheckoutFailed < StandardError; end - class CommitFailed < StandardError; end - class PushFailed < StandardError; end - - class Satellite - include Gitlab::Popen - - PARKING_BRANCH = "__parking_branch" - - attr_accessor :project - - def initialize(project) - @project = project - end - - def log(message) - Gitlab::Satellite::Logger.error(message) - end - - def clear_and_update! - project.ensure_satellite_exists - - @repo = nil - clear_working_dir! - delete_heads! - remove_remotes! - update_from_source! - end - - def create - output, status = popen(%W(git clone -- #{project.repository.path_to_repo} #{path}), - Gitlab.config.satellites.path) - - log("PID: #{project.id}: git clone #{project.repository.path_to_repo} #{path}") - log("PID: #{project.id}: -> #{output}") - - if status.zero? - true - else - log("Failed to create satellite for #{project.name_with_namespace}") - false - end - end - - def exists? - File.exists? path - end - - # * Locks the satellite - # * Changes the current directory to the satellite's working dir - # * Yields - def lock - project.ensure_satellite_exists - - File.open(lock_file, "w+") do |f| - begin - f.flock File::LOCK_EX - yield - ensure - f.flock File::LOCK_UN - end - end - end - - def lock_file - create_locks_dir unless File.exists?(lock_files_dir) - File.join(lock_files_dir, "satellite_#{project.id}.lock") - end - - def path - File.join(Gitlab.config.satellites.path, project.path_with_namespace) - end - - def repo - project.ensure_satellite_exists - - @repo ||= Grit::Repo.new(path) - end - - def destroy - FileUtils.rm_rf(path) - end - - private - - # Clear the working directory - def clear_working_dir! - repo.git.reset(hard: true) - repo.git.clean(f: true, d: true, x: true) - end - - # Deletes all branches except the parking branch - # - # This ensures we have no name clashes or issues updating branches when - # working with the satellite. - def delete_heads! - heads = repo.heads.map(&:name) - - # update or create the parking branch - repo.git.checkout(default_options({ B: true }), PARKING_BRANCH) - - # remove the parking branch from the list of heads ... - heads.delete(PARKING_BRANCH) - # ... and delete all others - heads.each { |head| repo.git.branch(default_options({ D: true }), head) } - end - - # Deletes all remotes except origin - # - # This ensures we have no remote name clashes or issues updating branches when - # working with the satellite. - def remove_remotes! - remotes = repo.git.remote.split(' ') - remotes.delete('origin') - remotes.each { |name| repo.git.remote(default_options,'rm', name)} - end - - # Updates the satellite from bare repo - # - # Note: this will only update remote branches (i.e. origin/*) - def update_from_source! - repo.git.remote(default_options, 'set-url', :origin, project.repository.path_to_repo) - repo.git.fetch(default_options, :origin) - end - - def default_options(options = {}) - { raise: true, timeout: true }.merge(options) - end - - # Create directory for storing - # satellites lock files - def create_locks_dir - FileUtils.mkdir_p(lock_files_dir) - end - - def lock_files_dir - @lock_files_dir ||= File.join(Gitlab.config.satellites.path, "tmp") - end - end - end -end diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb deleted file mode 100644 index 75a3dfe37c3..00000000000 --- a/lib/gitlab/search_results.rb +++ /dev/null @@ -1,69 +0,0 @@ -module Gitlab - class SearchResults - attr_reader :query - - # Limit search results by passed project ids - # It allows us to search only for projects user has access to - attr_reader :limit_project_ids - - def initialize(limit_project_ids, query) - @limit_project_ids = limit_project_ids || Project.all - @query = Shellwords.shellescape(query) if query.present? - end - - def objects(scope, page = nil) - case scope - when 'projects' - projects.page(page).per(per_page) - when 'issues' - issues.page(page).per(per_page) - when 'merge_requests' - merge_requests.page(page).per(per_page) - else - Kaminari.paginate_array([]).page(page).per(per_page) - end - end - - def total_count - @total_count ||= projects_count + issues_count + merge_requests_count - end - - def projects_count - @projects_count ||= projects.count - end - - def issues_count - @issues_count ||= issues.count - end - - def merge_requests_count - @merge_requests_count ||= merge_requests.count - end - - def empty? - total_count.zero? - end - - private - - def projects - Project.where(id: limit_project_ids).search(query) - end - - def issues - Issue.where(project_id: limit_project_ids).full_search(query).order('updated_at DESC') - end - - def merge_requests - MergeRequest.in_projects(limit_project_ids).full_search(query).order('updated_at DESC') - end - - def default_scope - 'projects' - end - - def per_page - 20 - end - end -end diff --git a/lib/gitlab/seeder.rb b/lib/gitlab/seeder.rb deleted file mode 100644 index 31aa3528c4c..00000000000 --- a/lib/gitlab/seeder.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Gitlab - class Seeder - def self.quiet - mute_mailer - SeedFu.quiet = true - yield - SeedFu.quiet = false - puts "\nOK".green - end - - def self.by_user(user) - yield - end - - def self.mute_mailer - code = <<-eos -def Notify.delay - self -end - eos - eval(code) - end - end -end diff --git a/lib/gitlab/sidekiq_logger.rb b/lib/gitlab/sidekiq_logger.rb deleted file mode 100644 index c1dab87a432..00000000000 --- a/lib/gitlab/sidekiq_logger.rb +++ /dev/null @@ -1,7 +0,0 @@ -module Gitlab - class SidekiqLogger < Gitlab::Logger - def self.file_name_noext - 'sidekiq' - end - end -end diff --git a/lib/gitlab/sidekiq_middleware/arguments_logger.rb b/lib/gitlab/sidekiq_middleware/arguments_logger.rb deleted file mode 100644 index 7813091ec7b..00000000000 --- a/lib/gitlab/sidekiq_middleware/arguments_logger.rb +++ /dev/null @@ -1,10 +0,0 @@ -module Gitlab - module SidekiqMiddleware - class ArgumentsLogger - def call(worker, job, queue) - Sidekiq.logger.info "arguments: #{job['args']}" - yield - end - end - end -end diff --git a/lib/gitlab/sidekiq_middleware/memory_killer.rb b/lib/gitlab/sidekiq_middleware/memory_killer.rb deleted file mode 100644 index 0f2db50e98c..00000000000 --- a/lib/gitlab/sidekiq_middleware/memory_killer.rb +++ /dev/null @@ -1,53 +0,0 @@ -module Gitlab - module SidekiqMiddleware - class MemoryKiller - # Default the RSS limit to 0, meaning the MemoryKiller is disabled - MAX_RSS = (ENV['SIDEKIQ_MEMORY_KILLER_MAX_RSS'] || 0).to_s.to_i - # Give Sidekiq 15 minutes of grace time after exceeding the RSS limit - GRACE_TIME = (ENV['SIDEKIQ_MEMORY_KILLER_GRACE_TIME'] || 15 * 60).to_s.to_i - # Wait 30 seconds for running jobs to finish during graceful shutdown - SHUTDOWN_WAIT = (ENV['SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT'] || 30).to_s.to_i - - # Create a mutex used to ensure there will be only one thread waiting to - # shut Sidekiq down - MUTEX = Mutex.new - - def call(worker, job, queue) - yield - current_rss = get_rss - - return unless MAX_RSS > 0 && current_rss > MAX_RSS - - Thread.new do - # Return if another thread is already waiting to shut Sidekiq down - return unless MUTEX.try_lock - - Sidekiq.logger.warn "current RSS #{current_rss} exceeds maximum RSS "\ - "#{MAX_RSS}" - Sidekiq.logger.warn "spawned thread that will shut down PID "\ - "#{Process.pid} in #{GRACE_TIME} seconds" - sleep(GRACE_TIME) - - Sidekiq.logger.warn "sending SIGUSR1 to PID #{Process.pid}" - Process.kill('SIGUSR1', Process.pid) - - Sidekiq.logger.warn "waiting #{SHUTDOWN_WAIT} seconds before sending "\ - "SIGTERM to PID #{Process.pid}" - sleep(SHUTDOWN_WAIT) - - Sidekiq.logger.warn "sending SIGTERM to PID #{Process.pid}" - Process.kill('SIGTERM', Process.pid) - end - end - - private - - def get_rss - output, status = Gitlab::Popen.popen(%W(ps -o rss= -p #{Process.pid})) - return 0 unless status.zero? - - output.to_i - end - end - end -end diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb deleted file mode 100644 index 938219efdb2..00000000000 --- a/lib/gitlab/snippet_search_results.rb +++ /dev/null @@ -1,131 +0,0 @@ -module Gitlab - class SnippetSearchResults < SearchResults - attr_reader :limit_snippet_ids - - def initialize(limit_snippet_ids, query) - @limit_snippet_ids = limit_snippet_ids - @query = query - end - - def objects(scope, page = nil) - case scope - when 'snippet_titles' - Kaminari.paginate_array(snippet_titles).page(page).per(per_page) - when 'snippet_blobs' - Kaminari.paginate_array(snippet_blobs).page(page).per(per_page) - else - super - end - end - - def total_count - @total_count ||= snippet_titles_count + snippet_blobs_count - end - - def snippet_titles_count - @snippet_titles_count ||= snippet_titles.count - end - - def snippet_blobs_count - @snippet_blobs_count ||= snippet_blobs.count - end - - private - - def snippet_titles - Snippet.where(id: limit_snippet_ids).search(query).order('updated_at DESC') - end - - def snippet_blobs - search = Snippet.where(id: limit_snippet_ids).search_code(query) - search = search.order('updated_at DESC').to_a - snippets = [] - search.each { |e| snippets << chunk_snippet(e) } - snippets - end - - def default_scope - 'snippet_blobs' - end - - # Get an array of line numbers surrounding a matching - # line, bounded by min/max. - # - # @returns Array of line numbers - def bounded_line_numbers(line, min, max) - lower = line - surrounding_lines > min ? line - surrounding_lines : min - upper = line + surrounding_lines < max ? line + surrounding_lines : max - (lower..upper).to_a - end - - # Returns a sorted set of lines to be included in a snippet preview. - # This ensures matching adjacent lines do not display duplicated - # surrounding code. - # - # @returns Array, unique and sorted. - def matching_lines(lined_content) - used_lines = [] - lined_content.each_with_index do |line, line_number| - used_lines.concat bounded_line_numbers( - line_number, - 0, - lined_content.size - ) if line.include?(query) - end - - used_lines.uniq.sort - end - - # 'Chunkify' entire snippet. Splits the snippet data into matching lines + - # surrounding_lines() worth of unmatching lines. - # - # @returns a hash with {snippet_object, snippet_chunks:{data,start_line}} - def chunk_snippet(snippet) - lined_content = snippet.content.split("\n") - used_lines = matching_lines(lined_content) - - snippet_chunk = [] - snippet_chunks = [] - snippet_start_line = 0 - last_line = -1 - - # Go through each used line, and add consecutive lines as a single chunk - # to the snippet chunk array. - used_lines.each do |line_number| - if last_line < 0 - # Start a new chunk. - snippet_start_line = line_number - snippet_chunk << lined_content[line_number] - elsif last_line == line_number - 1 - # Consecutive line, continue chunk. - snippet_chunk << lined_content[line_number] - else - # Non-consecutive line, add chunk to chunk array. - snippet_chunks << { - data: snippet_chunk.join("\n"), - start_line: snippet_start_line + 1 - } - - # Start a new chunk. - snippet_chunk = [lined_content[line_number]] - snippet_start_line = line_number - end - last_line = line_number - end - # Add final chunk to chunk array - snippet_chunks << { - data: snippet_chunk.join("\n"), - start_line: snippet_start_line + 1 - } - - # Return snippet with chunk array - { snippet_object: snippet, snippet_chunks: snippet_chunks } - end - - # Defines how many unmatching lines should be - # included around the matching lines in a snippet - def surrounding_lines - 3 - end - end -end diff --git a/lib/gitlab/theme.rb b/lib/gitlab/theme.rb deleted file mode 100644 index 43093c7d27e..00000000000 --- a/lib/gitlab/theme.rb +++ /dev/null @@ -1,39 +0,0 @@ -module Gitlab - class Theme - BASIC = 1 unless const_defined?(:BASIC) - MARS = 2 unless const_defined?(:MARS) - MODERN = 3 unless const_defined?(:MODERN) - GRAY = 4 unless const_defined?(:GRAY) - COLOR = 5 unless const_defined?(:COLOR) - BLUE = 6 unless const_defined?(:BLUE) - - def self.css_class_by_id(id) - themes = { - BASIC => "ui_basic", - MARS => "ui_mars", - MODERN => "ui_modern", - GRAY => "ui_gray", - COLOR => "ui_color", - BLUE => "ui_blue" - } - - id ||= Gitlab.config.gitlab.default_theme - - themes[id] - end - - def self.type_css_class_by_id(id) - types = { - BASIC => 'light_theme', - MARS => 'dark_theme', - MODERN => 'dark_theme', - GRAY => 'dark_theme', - COLOR => 'dark_theme' - } - - id ||= Gitlab.config.gitlab.default_theme - - types[id] - end - end -end diff --git a/lib/gitlab/upgrader.rb b/lib/gitlab/upgrader.rb deleted file mode 100644 index 0570c2fbeb5..00000000000 --- a/lib/gitlab/upgrader.rb +++ /dev/null @@ -1,102 +0,0 @@ -require_relative "popen" -require_relative "version_info" - -module Gitlab - class Upgrader - def execute - puts "GitLab #{current_version.major} upgrade tool" - puts "Your version is #{current_version}" - puts "Latest available version for GitLab #{current_version.major} is #{latest_version}" - - if latest_version? - puts "You are using the latest GitLab version" - else - puts "Newer GitLab version is available" - answer = if ARGV.first == "-y" - "yes" - else - prompt("Do you want to upgrade (yes/no)? ", %w{yes no}) - end - - if answer == "yes" - upgrade - else - exit 0 - end - end - end - - def latest_version? - current_version >= latest_version - end - - def current_version - @current_version ||= Gitlab::VersionInfo.parse(current_version_raw) - end - - def latest_version - @latest_version ||= Gitlab::VersionInfo.parse(latest_version_raw) - end - - def current_version_raw - File.read(File.join(gitlab_path, "VERSION")).strip - end - - def latest_version_raw - remote_tags, _ = Gitlab::Popen.popen(%W(git ls-remote --tags https://gitlab.com/gitlab-org/gitlab-ce.git)) - git_tags = remote_tags.split("\n").grep(/tags\/v#{current_version.major}/) - git_tags = git_tags.select { |version| version =~ /v\d\.\d\.\d\Z/ } - last_tag = git_tags.last.match(/v\d\.\d\.\d/).to_s - end - - def update_commands - { - "Stash changed files" => %W(git stash), - "Get latest code" => %W(git fetch), - "Switch to new version" => %W(git checkout v#{latest_version}), - "Install gems" => %W(bundle), - "Migrate DB" => %W(bundle exec rake db:migrate), - "Recompile assets" => %W(bundle exec rake assets:clean assets:precompile), - "Clear cache" => %W(bundle exec rake cache:clear) - } - end - - def env - { 'RAILS_ENV' => 'production' } - end - - def upgrade - update_commands.each do |title, cmd| - puts title - puts " -> #{cmd.join(' ')}" - if system(env, *cmd) - puts " -> OK" - else - puts " -> FAILED" - puts "Failed to upgrade. Try to repeat task or proceed with upgrade manually " - exit 1 - end - end - - puts "Done" - end - - def gitlab_path - File.expand_path(File.join(File.dirname(__FILE__), '../..')) - end - - # Prompt the user to input something - # - # message - the message to display before input - # choices - array of strings of acceptable answers or nil for any answer - # - # Returns the user's answer - def prompt(message, choices = nil) - begin - print(message) - answer = STDIN.gets.chomp - end while !choices.include?(answer) - answer - end - end -end diff --git a/lib/gitlab/url_builder.rb b/lib/gitlab/url_builder.rb deleted file mode 100644 index 11b0d44f340..00000000000 --- a/lib/gitlab/url_builder.rb +++ /dev/null @@ -1,60 +0,0 @@ -module Gitlab - class UrlBuilder - include Rails.application.routes.url_helpers - include GitlabRoutingHelper - - def initialize(type) - @type = type - end - - def build(id) - case @type - when :issue - build_issue_url(id) - when :merge_request - build_merge_request_url(id) - when :note - build_note_url(id) - - end - end - - private - - def build_issue_url(id) - issue = Issue.find(id) - issue_url(issue, host: Gitlab.config.gitlab['url']) - end - - def build_merge_request_url(id) - merge_request = MergeRequest.find(id) - merge_request_url(merge_request, host: Gitlab.config.gitlab['url']) - end - - def build_note_url(id) - note = Note.find(id) - if note.for_commit? - namespace_project_commit_url(namespace_id: note.project.namespace, - id: note.commit_id, - project_id: note.project, - host: Gitlab.config.gitlab['url'], - anchor: "note_#{note.id}") - elsif note.for_issue? - issue = Issue.find(note.noteable_id) - issue_url(issue, - host: Gitlab.config.gitlab['url'], - anchor: "note_#{note.id}") - elsif note.for_merge_request? - merge_request = MergeRequest.find(note.noteable_id) - merge_request_url(merge_request, - host: Gitlab.config.gitlab['url'], - anchor: "note_#{note.id}") - elsif note.for_project_snippet? - snippet = Snippet.find(note.noteable_id) - project_snippet_url(snippet, - host: Gitlab.config.gitlab['url'], - anchor: "note_#{note.id}") - end - end - end -end diff --git a/lib/gitlab/user_access.rb b/lib/gitlab/user_access.rb deleted file mode 100644 index 4885baf9526..00000000000 --- a/lib/gitlab/user_access.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Gitlab - module UserAccess - def self.allowed?(user) - return false if user.blocked? - - if user.requires_ldap_check? - return false unless Gitlab::LDAP::Access.allowed?(user) - end - - true - end - end -end diff --git a/lib/gitlab/utils.rb b/lib/gitlab/utils.rb deleted file mode 100644 index bd184c27187..00000000000 --- a/lib/gitlab/utils.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Gitlab - module Utils - extend self - - # Run system command without outputting to stdout. - # - # @param cmd [Array] - # @return [Boolean] - def system_silent(cmd) - Popen::popen(cmd).last.zero? - end - end -end diff --git a/lib/gitlab/version_info.rb b/lib/gitlab/version_info.rb deleted file mode 100644 index 6ee41e85cc9..00000000000 --- a/lib/gitlab/version_info.rb +++ /dev/null @@ -1,54 +0,0 @@ -module Gitlab - class VersionInfo - include Comparable - - attr_reader :major, :minor, :patch - - def self.parse(str) - if str && m = str.match(/(\d+)\.(\d+)\.(\d+)/) - VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i) - else - VersionInfo.new - end - end - - def initialize(major = 0, minor = 0, patch = 0) - @major = major - @minor = minor - @patch = patch - end - - def <=>(other) - return unless other.is_a? VersionInfo - return unless valid? && other.valid? - - if other.major < @major - 1 - elsif @major < other.major - -1 - elsif other.minor < @minor - 1 - elsif @minor < other.minor - -1 - elsif other.patch < @patch - 1 - elsif @patch < other.patch - -1 - else - 0 - end - end - - def to_s - if valid? - "%d.%d.%d" % [@major, @minor, @patch] - else - "Unknown" - end - end - - def valid? - @major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0 - end - end -end diff --git a/lib/gitlab/visibility_level.rb b/lib/gitlab/visibility_level.rb deleted file mode 100644 index 582fc759efd..00000000000 --- a/lib/gitlab/visibility_level.rb +++ /dev/null @@ -1,64 +0,0 @@ -# Gitlab::VisibilityLevel module -# -# Define allowed public modes that can be used for -# GitLab projects to determine project public mode -# -module Gitlab - module VisibilityLevel - extend CurrentSettings - - PRIVATE = 0 unless const_defined?(:PRIVATE) - INTERNAL = 10 unless const_defined?(:INTERNAL) - PUBLIC = 20 unless const_defined?(:PUBLIC) - - class << self - def values - options.values - end - - def options - { - 'Private' => PRIVATE, - 'Internal' => INTERNAL, - 'Public' => PUBLIC - } - end - - def allowed_for?(user, level) - user.is_admin? || allowed_level?(level.to_i) - end - - # Return true if the specified level is allowed for the current user. - # Level should be a numeric value, e.g. `20`. - def allowed_level?(level) - valid_level?(level) && non_restricted_level?(level) - end - - def non_restricted_level?(level) - restricted_levels = current_application_settings.restricted_visibility_levels - - if restricted_levels.nil? - true - else - !restricted_levels.include?(level) - end - end - - def valid_level?(level) - options.has_value?(level) - end - end - - def private? - visibility_level_field == PRIVATE - end - - def internal? - visibility_level_field == INTERNAL - end - - def public? - visibility_level_field == PUBLIC - end - end -end diff --git a/lib/gt_one_coercion.rb b/lib/gt_one_coercion.rb deleted file mode 100644 index ef2dc09767c..00000000000 --- a/lib/gt_one_coercion.rb +++ /dev/null @@ -1,5 +0,0 @@ -class GtOneCoercion < Virtus::Attribute - def coerce(value) - [1, value.to_i].max - end -end diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb deleted file mode 100644 index 10efff2ae9f..00000000000 --- a/lib/redcarpet/render/gitlab_html.rb +++ /dev/null @@ -1,72 +0,0 @@ -class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML - - attr_reader :template - alias_method :h, :template - - def initialize(template, color_scheme, options = {}) - @template = template - @color_scheme = color_scheme - @project = @template.instance_variable_get("@project") - @options = options.dup - super options - end - - def preprocess(full_document) - # Redcarpet doesn't allow SMB links when `safe_links_only` is enabled. - # FTP links are allowed, so we trick Redcarpet. - full_document.gsub("smb://", "ftp://smb:") - end - - # If project has issue number 39, apostrophe will be linked in - # regular text to the issue as Redcarpet will convert apostrophe to - # #39; - # We replace apostrophe with right single quote before Redcarpet - # does the processing and put the apostrophe back in postprocessing. - # This only influences regular text, code blocks are untouched. - def normal_text(text) - return text unless text.present? - text.gsub("'", "’") - end - - # Stolen from Rugments::Plugins::Redcarpet as this module is not required - # from Rugments's gem root. - def block_code(code, language) - lexer = Rugments::Lexer.find_fancy(language, code) || Rugments::Lexers::PlainText - - # XXX HACK: Redcarpet strips hard tabs out of code blocks, - # so we assume you're not using leading spaces that aren't tabs, - # and just replace them here. - if lexer.tag == 'make' - code.gsub! /^ /, "\t" - end - - formatter = Rugments::Formatters::HTML.new( - cssclass: "code highlight #{@color_scheme} #{lexer.tag}" - ) - formatter.format(lexer.lex(code)) - end - - def link(link, title, content) - h.link_to_gfm(content, link, title: title) - end - - def header(text, level) - if @options[:no_header_anchors] - "#{text}" - else - id = ActionController::Base.helpers.strip_tags(h.gfm(text)).downcase() \ - .gsub(/[^a-z0-9_-]/, '-').gsub(/-+/, '-').gsub(/^-/, '').gsub(/-$/, '') - "#{text}" - end - end - - def postprocess(full_document) - full_document.gsub!("ftp://smb:", "smb://") - - full_document.gsub!("’", "'") - unless @template.instance_variable_get("@project_wiki") || @project.nil? - full_document = h.create_relative_links(full_document) - end - h.gfm_with_options(full_document, @options) - end -end diff --git a/lib/repository_cache.rb b/lib/repository_cache.rb deleted file mode 100644 index fa016a170cd..00000000000 --- a/lib/repository_cache.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Interface to the Redis-backed cache store used by the Repository model -class RepositoryCache - attr_reader :namespace, :backend - - def initialize(namespace, backend = Rails.cache) - @namespace = namespace - @backend = backend - end - - def cache_key(type) - "#{type}:#{namespace}" - end - - def expire(key) - backend.delete(cache_key(key)) - end - - def fetch(key, &block) - backend.fetch(cache_key(key), &block) - end -end diff --git a/lib/static_model.rb b/lib/static_model.rb deleted file mode 100644 index 185921d8fbe..00000000000 --- a/lib/static_model.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Provides an ActiveRecord-like interface to a model whose data is not persisted to a database. -module StaticModel - extend ActiveSupport::Concern - - module ClassMethods - # Used by ActiveRecord's polymorphic association to set object_id - def primary_key - 'id' - end - - # Used by ActiveRecord's polymorphic association to set object_type - def base_class - self - end - end - - # Used by AR for fetching attributes - # - # Pass it along if we respond to it. - def [](key) - send(key) if respond_to?(key) - end - - def to_param - id - end - - def new_record? - false - end - - def persisted? - false - end - - def destroyed? - false - end - - def ==(other) - if other.is_a? ::StaticModel - id == other.id - else - super - end - end -end diff --git a/lib/support/deploy/deploy.sh b/lib/support/deploy/deploy.sh deleted file mode 100755 index adea4c7a747..00000000000 --- a/lib/support/deploy/deploy.sh +++ /dev/null @@ -1,45 +0,0 @@ -# This is deploy script we use to update staging server -# You can always modify it for your needs :) - -# If any command return non-zero status - stop deploy -set -e - -echo 'Deploy: Stopping sidekiq..' -cd /home/git/gitlab/ && sudo -u git -H bundle exec rake sidekiq:stop RAILS_ENV=production - -echo 'Deploy: Show deploy index page' -sudo -u git -H cp /home/git/gitlab/public/deploy.html /home/git/gitlab/public/index.html - -echo 'Deploy: Starting backup...' -cd /home/git/gitlab/ && sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production - -echo 'Deploy: Stop GitLab server' -sudo service gitlab stop - -echo 'Deploy: Get latest code' -cd /home/git/gitlab/ - -# clean working directory -sudo -u git -H git stash - -# change branch to -sudo -u git -H git pull origin master - -echo 'Deploy: Bundle and migrate' - -# change it to your needs -sudo -u git -H bundle --without aws development test mysql --deployment - -sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production -sudo -u git -H bundle exec rake assets:clean RAILS_ENV=production -sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production -sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production - -# return stashed changes (if necessary) -# sudo -u git -H git stash pop - -echo 'Deploy: Starting GitLab server...' -sudo service gitlab start - -sudo -u git -H rm /home/git/gitlab/public/index.html -echo 'Deploy: Done' diff --git a/lib/support/init.d/gitlab b/lib/support/init.d/gitlab deleted file mode 100755 index b066a1a6935..00000000000 --- a/lib/support/init.d/gitlab +++ /dev/null @@ -1,301 +0,0 @@ -#! /bin/sh - -# GITLAB -# Maintainer: @randx -# Authors: rovanion.luckey@gmail.com, @randx - -### BEGIN INIT INFO -# Provides: gitlab -# Required-Start: $local_fs $remote_fs $network $syslog redis-server -# Required-Stop: $local_fs $remote_fs $network $syslog -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: GitLab git repository management -# Description: GitLab git repository management -# chkconfig: - 85 14 -### END INIT INFO - - -### -# DO NOT EDIT THIS FILE! -# This file will be overwritten on update. -# Instead add/change your variables in /etc/default/gitlab -# An example defaults file can be found in lib/support/init.d/gitlab.default.example -### - - -### Environment variables -RAILS_ENV="production" - -# Script variable names should be lower-case not to conflict with -# internal /bin/sh variables such as PATH, EDITOR or SHELL. -app_user="git" -app_root="/home/$app_user/gitlab" -pid_path="$app_root/tmp/pids" -socket_path="$app_root/tmp/sockets" -web_server_pid_path="$pid_path/unicorn.pid" -sidekiq_pid_path="$pid_path/sidekiq.pid" - -# Read configuration variable file if it is present -test -f /etc/default/gitlab && . /etc/default/gitlab - -# Switch to the app_user if it is not he/she who is running the script. -if [ "$USER" != "$app_user" ]; then - eval su - "$app_user" -c $(echo \")$0 "$@"$(echo \"); exit; -fi - -# Switch to the gitlab path, exit on failure. -if ! cd "$app_root" ; then - echo "Failed to cd into $app_root, exiting!"; exit 1 -fi - - -### Init Script functions - -## Gets the pids from the files -check_pids(){ - if ! mkdir -p "$pid_path"; then - echo "Could not create the path $pid_path needed to store the pids." - exit 1 - fi - # If there exists a file which should hold the value of the Unicorn pid: read it. - if [ -f "$web_server_pid_path" ]; then - wpid=$(cat "$web_server_pid_path") - else - wpid=0 - fi - if [ -f "$sidekiq_pid_path" ]; then - spid=$(cat "$sidekiq_pid_path") - else - spid=0 - fi -} - -## Called when we have started the two processes and are waiting for their pid files. -wait_for_pids(){ - # We are sleeping a bit here mostly because sidekiq is slow at writing it's pid - i=0; - while [ ! -f $web_server_pid_path -o ! -f $sidekiq_pid_path ]; do - sleep 0.1; - i=$((i+1)) - if [ $((i%10)) = 0 ]; then - echo -n "." - elif [ $((i)) = 301 ]; then - echo "Waited 30s for the processes to write their pids, something probably went wrong." - exit 1; - fi - done - echo -} - -# We use the pids in so many parts of the script it makes sense to always check them. -# Only after start() is run should the pids change. Sidekiq sets it's own pid. -check_pids - - -## Checks whether the different parts of the service are already running or not. -check_status(){ - check_pids - # If the web server is running kill -0 $wpid returns true, or rather 0. - # Checks of *_status should only check for == 0 or != 0, never anything else. - if [ $wpid -ne 0 ]; then - kill -0 "$wpid" 2>/dev/null - web_status="$?" - else - web_status="-1" - fi - if [ $spid -ne 0 ]; then - kill -0 "$spid" 2>/dev/null - sidekiq_status="$?" - else - sidekiq_status="-1" - fi - if [ $web_status = 0 -a $sidekiq_status = 0 ]; then - gitlab_status=0 - else - # http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html - # code 3 means 'program is not running' - gitlab_status=3 - fi -} - -## Check for stale pids and remove them if necessary. -check_stale_pids(){ - check_status - # If there is a pid it is something else than 0, the service is running if - # *_status is == 0. - if [ "$wpid" != "0" -a "$web_status" != "0" ]; then - echo "Removing stale Unicorn web server pid. This is most likely caused by the web server crashing the last time it ran." - if ! rm "$web_server_pid_path"; then - echo "Unable to remove stale pid, exiting." - exit 1 - fi - fi - if [ "$spid" != "0" -a "$sidekiq_status" != "0" ]; then - echo "Removing stale Sidekiq job dispatcher pid. This is most likely caused by Sidekiq crashing the last time it ran." - if ! rm "$sidekiq_pid_path"; then - echo "Unable to remove stale pid, exiting" - exit 1 - fi - fi -} - -## If no parts of the service is running, bail out. -exit_if_not_running(){ - check_stale_pids - if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then - echo "GitLab is not running." - exit - fi -} - -## Starts Unicorn and Sidekiq if they're not running. -start_gitlab() { - check_stale_pids - - if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then - echo -n "Starting both the GitLab Unicorn and Sidekiq" - elif [ "$web_status" != "0" ]; then - echo -n "Starting GitLab Unicorn" - elif [ "$sidekiq_status" != "0" ]; then - echo -n "Starting GitLab Sidekiq" - fi - - # Then check if the service is running. If it is: don't start again. - if [ "$web_status" = "0" ]; then - echo "The Unicorn web server already running with pid $wpid, not restarting." - else - # Remove old socket if it exists - rm -f "$socket_path"/gitlab.socket 2>/dev/null - # Start the web server - RAILS_ENV=$RAILS_ENV bin/web start - fi - - # If sidekiq is already running, don't start it again. - if [ "$sidekiq_status" = "0" ]; then - echo "The Sidekiq job dispatcher is already running with pid $spid, not restarting" - else - RAILS_ENV=$RAILS_ENV bin/background_jobs start & - fi - - # Wait for the pids to be planted - wait_for_pids - # Finally check the status to tell wether or not GitLab is running - print_status -} - -## Asks the Unicorn and the Sidekiq if they would be so kind as to stop, if not kills them. -stop_gitlab() { - exit_if_not_running - - if [ "$web_status" = "0" -a "$sidekiq_status" = "0" ]; then - echo -n "Shutting down both Unicorn and Sidekiq" - elif [ "$web_status" = "0" ]; then - echo -n "Shutting down Unicorn" - elif [ "$sidekiq_status" = "0" ]; then - echo -n "Shutting down Sidekiq" - fi - - # If the Unicorn web server is running, tell it to stop; - if [ "$web_status" = "0" ]; then - RAILS_ENV=$RAILS_ENV bin/web stop - fi - # And do the same thing for the Sidekiq. - if [ "$sidekiq_status" = "0" ]; then - RAILS_ENV=$RAILS_ENV bin/background_jobs stop - fi - - # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script. - while [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; do - sleep 1 - check_status - printf "." - if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then - printf "\n" - break - fi - done - - sleep 1 - # Cleaning up unused pids - rm "$web_server_pid_path" 2>/dev/null - # rm "$sidekiq_pid_path" # Sidekiq seems to be cleaning up it's own pid. - - print_status -} - -## Prints the status of GitLab and it's components. -print_status() { - check_status - if [ "$web_status" != "0" -a "$sidekiq_status" != "0" ]; then - echo "GitLab is not running." - return - fi - if [ "$web_status" = "0" ]; then - echo "The GitLab Unicorn web server with pid $wpid is running." - else - printf "The GitLab Unicorn web server is \033[31mnot running\033[0m.\n" - fi - if [ "$sidekiq_status" = "0" ]; then - echo "The GitLab Sidekiq job dispatcher with pid $spid is running." - else - printf "The GitLab Sidekiq job dispatcher is \033[31mnot running\033[0m.\n" - fi - if [ "$web_status" = "0" -a "$sidekiq_status" = "0" ]; then - printf "GitLab and all its components are \033[32mup and running\033[0m.\n" - fi -} - -## Tells unicorn to reload it's config and Sidekiq to restart -reload_gitlab(){ - exit_if_not_running - if [ "$wpid" = "0" ];then - echo "The GitLab Unicorn Web server is not running thus its configuration can't be reloaded." - exit 1 - fi - printf "Reloading GitLab Unicorn configuration... " - RAILS_ENV=$RAILS_ENV bin/web reload - echo "Done." - echo "Restarting GitLab Sidekiq since it isn't capable of reloading its config..." - RAILS_ENV=$RAILS_ENV bin/background_jobs restart - - wait_for_pids - print_status -} - -## Restarts Sidekiq and Unicorn. -restart_gitlab(){ - check_status - if [ "$web_status" = "0" -o "$sidekiq_status" = "0" ]; then - stop_gitlab - fi - start_gitlab -} - - -### Finally the input handling. - -case "$1" in - start) - start_gitlab - ;; - stop) - stop_gitlab - ;; - restart) - restart_gitlab - ;; - reload|force-reload) - reload_gitlab - ;; - status) - print_status - exit $gitlab_status - ;; - *) - echo "Usage: service gitlab {start|stop|restart|reload|status}" - exit 1 - ;; -esac - -exit diff --git a/lib/support/init.d/gitlab.default.example b/lib/support/init.d/gitlab.default.example deleted file mode 100755 index 9951bacedf5..00000000000 --- a/lib/support/init.d/gitlab.default.example +++ /dev/null @@ -1,31 +0,0 @@ -# Copy this lib/support/init.d/gitlab.default.example file to -# /etc/default/gitlab in order for it to apply to your system. - -# RAILS_ENV defines the type of installation that is running. -# Normal values are "production", "test" and "development". -RAILS_ENV="production" - -# app_user defines the user that GitLab is run as. -# The default is "git". -app_user="git" - -# app_root defines the folder in which gitlab and it's components are installed. -# The default is "/home/$app_user/gitlab" -app_root="/home/$app_user/gitlab" - -# pid_path defines a folder in which the gitlab and it's components place their pids. -# This variable is also used below to define the relevant pids for the gitlab components. -# The default is "$app_root/tmp/pids" -pid_path="$app_root/tmp/pids" - -# socket_path defines the folder in which gitlab places the sockets -#The default is "$app_root/tmp/sockets" -socket_path="$app_root/tmp/sockets" - -# web_server_pid_path defines the path in which to create the pid file fo the web_server -# The default is "$pid_path/unicorn.pid" -web_server_pid_path="$pid_path/unicorn.pid" - -# sidekiq_pid_path defines the path in which to create the pid file for sidekiq -# The default is "$pid_path/sidekiq.pid" -sidekiq_pid_path="$pid_path/sidekiq.pid" diff --git a/lib/support/logrotate/gitlab b/lib/support/logrotate/gitlab deleted file mode 100644 index d9b07b61ec3..00000000000 --- a/lib/support/logrotate/gitlab +++ /dev/null @@ -1,20 +0,0 @@ -# GitLab logrotate settings -# based on: http://stackoverflow.com/a/4883967 - -/home/git/gitlab/log/*.log { - daily - missingok - rotate 90 - compress - notifempty - copytruncate -} - -/home/git/gitlab-shell/gitlab-shell.log { - daily - missingok - rotate 90 - compress - notifempty - copytruncate -} diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab deleted file mode 100644 index 62a4276536c..00000000000 --- a/lib/support/nginx/gitlab +++ /dev/null @@ -1,115 +0,0 @@ -## GitLab -## Contributors: randx, yin8086, sashkab, orkoden, axilleas, bbodenmiller, DouweM -## -## Lines starting with two hashes (##) are comments with information. -## Lines starting with one hash (#) are configuration parameters that can be uncommented. -## -################################## -## CHUNKED TRANSFER ## -################################## -## -## It is a known issue that Git-over-HTTP requires chunked transfer encoding [0] -## which is not supported by Nginx < 1.3.9 [1]. As a result, pushing a large object -## with Git (i.e. a single large file) can lead to a 411 error. In theory you can get -## around this by tweaking this configuration file and either: -## - installing an old version of Nginx with the chunkin module [2] compiled in, or -## - using a newer version of Nginx. -## -## At the time of writing we do not know if either of these theoretical solutions works. -## As a workaround users can use Git over SSH to push large files. -## -## [0] https://git.kernel.org/cgit/git/git.git/tree/Documentation/technical/http-protocol.txt#n99 -## [1] https://github.com/agentzh/chunkin-nginx-module#status -## [2] https://github.com/agentzh/chunkin-nginx-module -## -################################### -## configuration ## -################################### -## -## See installation.md#using-https for additional HTTPS configuration details. - -upstream gitlab { - server unix:/home/git/gitlab/tmp/sockets/gitlab.socket fail_timeout=0; -} - -## Normal HTTP host -server { - listen 0.0.0.0:80 default_server; - listen [::]:80 default_server; - server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com - server_tokens off; ## Don't show the nginx version number, a security best practice - root /home/git/gitlab/public; - - ## Increase this if you want to upload large attachments - ## Or if you want to accept large git objects over http - client_max_body_size 20m; - - ## See app/controllers/application_controller.rb for headers set - - ## Individual nginx logs for this GitLab vhost - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; - - location / { - ## Serve static files from defined root folder. - ## @gitlab is a named location for the upstream fallback, see below. - try_files $uri $uri/index.html $uri.html @gitlab; - } - - ## We route uploads through GitLab to prevent XSS and enforce access control. - location /uploads/ { - ## If you use HTTPS make sure you disable gzip compression - ## to be safe against BREACH attack. - # gzip off; - - ## https://github.com/gitlabhq/gitlabhq/issues/694 - ## Some requests take more than 30 seconds. - proxy_read_timeout 300; - proxy_connect_timeout 300; - proxy_redirect off; - - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Frame-Options SAMEORIGIN; - - proxy_pass http://gitlab; - } - - ## If a file, which is not found in the root folder is requested, - ## then the proxy passes the request to the upsteam (gitlab unicorn). - location @gitlab { - ## If you use HTTPS make sure you disable gzip compression - ## to be safe against BREACH attack. - # gzip off; - - ## https://github.com/gitlabhq/gitlabhq/issues/694 - ## Some requests take more than 30 seconds. - proxy_read_timeout 300; - proxy_connect_timeout 300; - proxy_redirect off; - - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Frame-Options SAMEORIGIN; - - proxy_pass http://gitlab; - } - - ## Enable gzip compression as per rails guide: - ## http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression - ## WARNING: If you are using relative urls remove the block below - ## See config/application.rb under "Relative url support" for the list of - ## other files that need to be changed for relative url support - location ~ ^/(assets)/ { - root /home/git/gitlab/public; - gzip_static on; # to serve pre-gzipped version - expires max; - add_header Cache-Control public; - } - - error_page 502 /502.html; -} diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl deleted file mode 100644 index 2aefc944698..00000000000 --- a/lib/support/nginx/gitlab-ssl +++ /dev/null @@ -1,162 +0,0 @@ -## GitLab -## Contributors: randx, yin8086, sashkab, orkoden, axilleas, bbodenmiller, DouweM -## -## Modified from nginx http version -## Modified from http://blog.phusion.nl/2012/04/21/tutorial-setting-up-gitlab-on-debian-6/ -## Modified from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html -## -## Lines starting with two hashes (##) are comments with information. -## Lines starting with one hash (#) are configuration parameters that can be uncommented. -## -################################## -## CHUNKED TRANSFER ## -################################## -## -## It is a known issue that Git-over-HTTP requires chunked transfer encoding [0] -## which is not supported by Nginx < 1.3.9 [1]. As a result, pushing a large object -## with Git (i.e. a single large file) can lead to a 411 error. In theory you can get -## around this by tweaking this configuration file and either: -## - installing an old version of Nginx with the chunkin module [2] compiled in, or -## - using a newer version of Nginx. -## -## At the time of writing we do not know if either of these theoretical solutions works. -## As a workaround users can use Git over SSH to push large files. -## -## [0] https://git.kernel.org/cgit/git/git.git/tree/Documentation/technical/http-protocol.txt#n99 -## [1] https://github.com/agentzh/chunkin-nginx-module#status -## [2] https://github.com/agentzh/chunkin-nginx-module -## -################################### -## configuration ## -################################### -## -## See installation.md#using-https for additional HTTPS configuration details. - -upstream gitlab { - server unix:/home/git/gitlab/tmp/sockets/gitlab.socket fail_timeout=0; -} - -## Redirects all HTTP traffic to the HTTPS host -server { - listen 0.0.0.0:80; - listen [::]:80 ipv6only=on default_server; - server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com - server_tokens off; ## Don't show the nginx version number, a security best practice - return 301 https://$server_name$request_uri; - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; -} - - -## HTTPS host -server { - listen 0.0.0.0:443 ssl; - listen [::]:443 ipv6only=on ssl default_server; - server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com - server_tokens off; ## Don't show the nginx version number, a security best practice - root /home/git/gitlab/public; - - ## Increase this if you want to upload large attachments - ## Or if you want to accept large git objects over http - client_max_body_size 20m; - - ## Strong SSL Security - ## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html & https://cipherli.st/ - ssl on; - ssl_certificate /etc/nginx/ssl/gitlab.crt; - ssl_certificate_key /etc/nginx/ssl/gitlab.key; - - # GitLab needs backwards compatible ciphers to retain compatibility with Java IDEs - ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; - ssl_prefer_server_ciphers on; - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 5m; - - ## See app/controllers/application_controller.rb for headers set - - ## [Optional] If your certficate has OCSP, enable OCSP stapling to reduce the overhead and latency of running SSL. - ## Replace with your ssl_trusted_certificate. For more info see: - ## - https://medium.com/devops-programming/4445f4862461 - ## - https://www.ruby-forum.com/topic/4419319 - ## - https://www.digitalocean.com/community/tutorials/how-to-configure-ocsp-stapling-on-apache-and-nginx - # ssl_stapling on; - # ssl_stapling_verify on; - # ssl_trusted_certificate /etc/nginx/ssl/stapling.trusted.crt; - # resolver 208.67.222.222 208.67.222.220 valid=300s; # Can change to your DNS resolver if desired - # resolver_timeout 5s; - - ## [Optional] Generate a stronger DHE parameter: - ## sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096 - ## - # ssl_dhparam /etc/ssl/certs/dhparam.pem; - - ## Individual nginx logs for this GitLab vhost - access_log /var/log/nginx/gitlab_access.log; - error_log /var/log/nginx/gitlab_error.log; - - location / { - ## Serve static files from defined root folder. - ## @gitlab is a named location for the upstream fallback, see below. - try_files $uri $uri/index.html $uri.html @gitlab; - } - - ## We route uploads through GitLab to prevent XSS and enforce access control. - location /uploads/ { - ## If you use HTTPS make sure you disable gzip compression - ## to be safe against BREACH attack. - gzip off; - - ## https://github.com/gitlabhq/gitlabhq/issues/694 - ## Some requests take more than 30 seconds. - proxy_read_timeout 300; - proxy_connect_timeout 300; - proxy_redirect off; - - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Ssl on; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Frame-Options SAMEORIGIN; - - proxy_pass http://gitlab; - } - - ## If a file, which is not found in the root folder is requested, - ## then the proxy passes the request to the upsteam (gitlab unicorn). - location @gitlab { - ## If you use HTTPS make sure you disable gzip compression - ## to be safe against BREACH attack. - gzip off; - - ## https://github.com/gitlabhq/gitlabhq/issues/694 - ## Some requests take more than 30 seconds. - proxy_read_timeout 300; - proxy_connect_timeout 300; - proxy_redirect off; - - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-Ssl on; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Frame-Options SAMEORIGIN; - - proxy_pass http://gitlab; - } - - ## Enable gzip compression as per rails guide: - ## http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression - ## WARNING: If you are using relative urls remove the block below - ## See config/application.rb under "Relative url support" for the list of - ## other files that need to be changed for relative url support - location ~ ^/(assets)/ { - root /home/git/gitlab/public; - gzip_static on; # to serve pre-gzipped version - expires max; - add_header Cache-Control public; - } - - error_page 502 /502.html; -} diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/lib/tasks/brakeman.rake b/lib/tasks/brakeman.rake deleted file mode 100644 index 3a225801ff2..00000000000 --- a/lib/tasks/brakeman.rake +++ /dev/null @@ -1,9 +0,0 @@ -desc 'Security check via brakeman' -task :brakeman do - if system("brakeman --skip-files lib/backup/repository.rb -w3 -z") - puts 'Security check succeed' - else - puts 'Security check failed' - exit 1 - end -end diff --git a/lib/tasks/cache.rake b/lib/tasks/cache.rake deleted file mode 100644 index 753a5a11070..00000000000 --- a/lib/tasks/cache.rake +++ /dev/null @@ -1,11 +0,0 @@ -namespace :cache do - desc "GITLAB | Clear redis cache" - task :clear => :environment do - # Hack into Rails.cache until https://github.com/redis-store/redis-store/pull/225 - # is accepted (I hope) and we can update the redis-store gem. - redis_store = Rails.cache.instance_variable_get(:@data) - redis_store.keys.each_slice(1000) do |key_slice| - redis_store.del(*key_slice) - end - end -end diff --git a/lib/tasks/dev.rake b/lib/tasks/dev.rake deleted file mode 100644 index 058c7417040..00000000000 --- a/lib/tasks/dev.rake +++ /dev/null @@ -1,10 +0,0 @@ -task dev: ["dev:setup"] - -namespace :dev do - desc "GITLAB | Setup developer environment (db, fixtures)" - task :setup => :environment do - ENV['force'] = 'yes' - Rake::Task["gitlab:setup"].invoke - Rake::Task["gitlab:shell:setup"].invoke - end -end diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake deleted file mode 100644 index 84445b3bf2f..00000000000 --- a/lib/tasks/gitlab/backup.rake +++ /dev/null @@ -1,106 +0,0 @@ -require 'active_record/fixtures' - -namespace :gitlab do - namespace :backup do - # Create backup of GitLab system - desc "GITLAB | Create a backup of the GitLab system" - task create: :environment do - warn_user_is_not_gitlab - configure_cron_mode - - Rake::Task["gitlab:backup:db:create"].invoke - Rake::Task["gitlab:backup:repo:create"].invoke - Rake::Task["gitlab:backup:uploads:create"].invoke - - backup = Backup::Manager.new - backup.pack - backup.cleanup - backup.remove_old - end - - # Restore backup of GitLab system - desc "GITLAB | Restore a previously created backup" - task restore: :environment do - warn_user_is_not_gitlab - configure_cron_mode - - backup = Backup::Manager.new - backup.unpack - - Rake::Task["gitlab:backup:db:restore"].invoke unless backup.skipped?("db") - Rake::Task["gitlab:backup:repo:restore"].invoke unless backup.skipped?("repositories") - Rake::Task["gitlab:backup:uploads:restore"].invoke unless backup.skipped?("uploads") - Rake::Task["gitlab:shell:setup"].invoke - - backup.cleanup - end - - namespace :repo do - task create: :environment do - $progress.puts "Dumping repositories ...".blue - - if ENV["SKIP"] && ENV["SKIP"].include?("repositories") - $progress.puts "[SKIPPED]".cyan - else - Backup::Repository.new.dump - $progress.puts "done".green - end - end - - task restore: :environment do - $progress.puts "Restoring repositories ...".blue - Backup::Repository.new.restore - $progress.puts "done".green - end - end - - namespace :db do - task create: :environment do - $progress.puts "Dumping database ... ".blue - - if ENV["SKIP"] && ENV["SKIP"].include?("db") - $progress.puts "[SKIPPED]".cyan - else - Backup::Database.new.dump - $progress.puts "done".green - end - end - - task restore: :environment do - $progress.puts "Restoring database ... ".blue - Backup::Database.new.restore - $progress.puts "done".green - end - end - - namespace :uploads do - task create: :environment do - $progress.puts "Dumping uploads ... ".blue - - if ENV["SKIP"] && ENV["SKIP"].include?("uploads") - $progress.puts "[SKIPPED]".cyan - else - Backup::Uploads.new.dump - $progress.puts "done".green - end - end - - task restore: :environment do - $progress.puts "Restoring uploads ... ".blue - Backup::Uploads.new.restore - $progress.puts "done".green - end - end - - def configure_cron_mode - if ENV['CRON'] - # We need an object we can say 'puts' and 'print' to; let's use a - # StringIO. - require 'stringio' - $progress = StringIO.new - else - $progress = $stdout - end - end - end # namespace end: backup -end # namespace end: gitlab diff --git a/lib/tasks/gitlab/bulk_add_permission.rake b/lib/tasks/gitlab/bulk_add_permission.rake deleted file mode 100644 index 3d8c171dfa3..00000000000 --- a/lib/tasks/gitlab/bulk_add_permission.rake +++ /dev/null @@ -1,48 +0,0 @@ -namespace :gitlab do - namespace :import do - desc "GITLAB | Add all users to all projects (admin users are added as masters)" - task all_users_to_all_projects: :environment do |t, args| - user_ids = User.where(admin: false).pluck(:id) - admin_ids = User.where(admin: true).pluck(:id) - projects_ids = Project.pluck(:id) - - puts "Importing #{user_ids.size} users into #{projects_ids.size} projects" - ProjectMember.add_users_into_projects(projects_ids, user_ids, ProjectMember::DEVELOPER) - - puts "Importing #{admin_ids.size} admins into #{projects_ids.size} projects" - ProjectMember.add_users_into_projects(projects_ids, admin_ids, ProjectMember::MASTER) - end - - desc "GITLAB | Add a specific user to all projects (as a developer)" - task :user_to_projects, [:email] => :environment do |t, args| - user = User.find_by(email: args.email) - project_ids = Project.pluck(:id) - puts "Importing #{user.email} users into #{project_ids.size} projects" - ProjectMember.add_users_into_projects(project_ids, Array.wrap(user.id), ProjectMember::DEVELOPER) - end - - desc "GITLAB | Add all users to all groups (admin users are added as owners)" - task all_users_to_all_groups: :environment do |t, args| - user_ids = User.where(admin: false).pluck(:id) - admin_ids = User.where(admin: true).pluck(:id) - groups = Group.all - - puts "Importing #{user_ids.size} users into #{groups.size} groups" - puts "Importing #{admin_ids.size} admins into #{groups.size} groups" - groups.each do |group| - group.add_users(user_ids, GroupMember::DEVELOPER) - group.add_users(admin_ids, GroupMember::OWNER) - end - end - - desc "GITLAB | Add a specific user to all groups (as a developer)" - task :user_to_groups, [:email] => :environment do |t, args| - user = User.find_by_email args.email - groups = Group.all - puts "Importing #{user.email} users into #{groups.size} groups" - groups.each do |group| - group.add_users(Array.wrap(user.id), GroupMember::DEVELOPER) - end - end - end -end diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake deleted file mode 100644 index 3c9802a0be4..00000000000 --- a/lib/tasks/gitlab/cleanup.rake +++ /dev/null @@ -1,113 +0,0 @@ -namespace :gitlab do - namespace :cleanup do - desc "GITLAB | Cleanup | Clean namespaces" - task dirs: :environment do - warn_user_is_not_gitlab - remove_flag = ENV['REMOVE'] - - - namespaces = Namespace.pluck(:path) - git_base_path = Gitlab.config.gitlab_shell.repos_path - all_dirs = Dir.glob(git_base_path + '/*') - - puts git_base_path.yellow - puts "Looking for directories to remove... " - - all_dirs.reject! do |dir| - # skip if git repo - dir =~ /.git$/ - end - - all_dirs.reject! do |dir| - dir_name = File.basename dir - - # skip if namespace present - namespaces.include?(dir_name) - end - - all_dirs.each do |dir_path| - - if remove_flag - if FileUtils.rm_rf dir_path - puts "Removed...#{dir_path}".red - else - puts "Cannot remove #{dir_path}".red - end - else - puts "Can be removed: #{dir_path}".red - end - end - - unless remove_flag - puts "To cleanup this directories run this command with REMOVE=true".yellow - end - end - - desc "GITLAB | Cleanup | Clean repositories" - task repos: :environment do - warn_user_is_not_gitlab - remove_flag = ENV['REMOVE'] - - git_base_path = Gitlab.config.gitlab_shell.repos_path - all_dirs = Dir.glob(git_base_path + '/*') - - global_projects = Project.where(namespace_id: nil).pluck(:path) - - puts git_base_path.yellow - puts "Looking for global repos to remove... " - - # skip non git repo - all_dirs.select! do |dir| - dir =~ /.git$/ - end - - # skip existing repos - all_dirs.reject! do |dir| - repo_name = File.basename dir - path = repo_name.gsub(/\.git$/, "") - global_projects.include?(path) - end - - all_dirs.each do |dir_path| - if remove_flag - if FileUtils.rm_rf dir_path - puts "Removed...#{dir_path}".red - else - puts "Cannot remove #{dir_path}".red - end - else - puts "Can be removed: #{dir_path}".red - end - end - - unless remove_flag - puts "To cleanup this directories run this command with REMOVE=true".yellow - end - end - - desc "GITLAB | Cleanup | Block users that have been removed in LDAP" - task block_removed_ldap_users: :environment do - warn_user_is_not_gitlab - block_flag = ENV['BLOCK'] - - User.find_each do |user| - next unless user.ldap_user? - print "#{user.name} (#{user.ldap_identity.extern_uid}) ..." - if Gitlab::LDAP::Access.allowed?(user) - puts " [OK]".green - else - if block_flag - user.block! unless user.blocked? - puts " [BLOCKED]".red - else - puts " [NOT IN LDAP]".yellow - end - end - end - - unless block_flag - puts "To block these users run this command with BLOCK=true".yellow - end - end - end -end diff --git a/lib/tasks/gitlab/db/drop_all_postgres_sequences.rake b/lib/tasks/gitlab/db/drop_all_postgres_sequences.rake deleted file mode 100644 index e9cf0a9b5e8..00000000000 --- a/lib/tasks/gitlab/db/drop_all_postgres_sequences.rake +++ /dev/null @@ -1,10 +0,0 @@ -namespace :gitlab do - namespace :db do - task drop_all_postgres_sequences: :environment do - connection = ActiveRecord::Base.connection - connection.execute("SELECT c.relname FROM pg_class c WHERE c.relkind = 'S';").each do |sequence| - connection.execute("DROP SEQUENCE #{sequence['relname']}") - end - end - end -end diff --git a/lib/tasks/gitlab/db/drop_all_tables.rake b/lib/tasks/gitlab/db/drop_all_tables.rake deleted file mode 100644 index a66030ab93a..00000000000 --- a/lib/tasks/gitlab/db/drop_all_tables.rake +++ /dev/null @@ -1,10 +0,0 @@ -namespace :gitlab do - namespace :db do - task drop_all_tables: :environment do - connection = ActiveRecord::Base.connection - connection.tables.each do |table| - connection.drop_table(table) - end - end - end -end diff --git a/lib/tasks/gitlab/enable_automerge.rake b/lib/tasks/gitlab/enable_automerge.rake deleted file mode 100644 index aa9869daf2f..00000000000 --- a/lib/tasks/gitlab/enable_automerge.rake +++ /dev/null @@ -1,39 +0,0 @@ -namespace :gitlab do - namespace :satellites do - desc "GITLAB | Create satellite repos" - task create: :environment do - create_satellites - end - end - - def create_satellites - warn_user_is_not_gitlab - - print "Creating satellites for ..." - unless Project.count > 0 - puts "skipping, because you have no projects".magenta - return - end - puts "" - - Project.find_each(batch_size: 100) do |project| - print "#{project.name_with_namespace.yellow} ... " - - unless project.repo_exists? - puts "skipping, because the repo is empty".magenta - next - end - - if project.satellite.exists? - puts "exists already".green - else - print "\n... " - if project.satellite.create - puts "created".green - else - puts "error".red - end - end - end - end -end diff --git a/lib/tasks/gitlab/generate_docs.rake b/lib/tasks/gitlab/generate_docs.rake deleted file mode 100644 index 332cd61f84c..00000000000 --- a/lib/tasks/gitlab/generate_docs.rake +++ /dev/null @@ -1,7 +0,0 @@ -namespace :gitlab do - desc "GITLAB | Generate sdocs for project" - task generate_docs: :environment do - system(*%W(bundle exec sdoc -o doc/code app lib)) - end -end - diff --git a/lib/tasks/gitlab/import.rake b/lib/tasks/gitlab/import.rake deleted file mode 100644 index 20abb2fa500..00000000000 --- a/lib/tasks/gitlab/import.rake +++ /dev/null @@ -1,77 +0,0 @@ -namespace :gitlab do - namespace :import do - # How to use: - # - # 1. copy the bare repos under the repos_path (commonly /home/git/repositories) - # 2. run: bundle exec rake gitlab:import:repos RAILS_ENV=production - # - # Notes: - # * The project owner will set to the first administator of the system - # * Existing projects will be skipped - # - desc "GITLAB | Import bare repositories from gitlab_shell -> repos_path into GitLab project instance" - task repos: :environment do - - git_base_path = Gitlab.config.gitlab_shell.repos_path - repos_to_import = Dir.glob(git_base_path + '/**/*.git') - - repos_to_import.each do |repo_path| - # strip repo base path - repo_path[0..git_base_path.length] = '' - - path = repo_path.sub(/\.git$/, '') - group_name, name = File.split(path) - group_name = nil if group_name == '.' - - puts "Processing #{repo_path}".yellow - - if path.end_with?('.wiki') - puts " * Skipping wiki repo" - next - end - - project = Project.find_with_namespace(path) - - if project - puts " * #{project.name} (#{repo_path}) exists" - else - user = User.admins.first - - project_params = { - name: name, - path: name - } - - # find group namespace - if group_name - group = Namespace.find_by(path: group_name) - # create group namespace - unless group - group = Group.new(:name => group_name) - group.path = group_name - group.owner = user - if group.save - puts " * Created Group #{group.name} (#{group.id})".green - else - puts " * Failed trying to create group #{group.name}".red - end - end - # set project group - project_params[:namespace_id] = group.id - end - - project = Projects::CreateService.new(user, project_params).execute - - if project.valid? - puts " * Created #{project.name} (#{repo_path})".green - else - puts " * Failed trying to create #{project.name} (#{repo_path})".red - puts " Validation Errors: #{project.errors.messages}".red - end - end - end - - puts "Done!".green - end - end -end diff --git a/lib/tasks/gitlab/info.rake b/lib/tasks/gitlab/info.rake deleted file mode 100644 index 72452e1d8ea..00000000000 --- a/lib/tasks/gitlab/info.rake +++ /dev/null @@ -1,72 +0,0 @@ -namespace :gitlab do - namespace :env do - desc "GITLAB | Show information about GitLab and its environment" - task info: :environment do - - # check if there is an RVM environment - rvm_version = run_and_match(%W(rvm --version), /[\d\.]+/).try(:to_s) - # check Ruby version - ruby_version = run_and_match(%W(ruby --version), /[\d\.p]+/).try(:to_s) - # check Gem version - gem_version = run(%W(gem --version)) - # check Bundler version - bunder_version = run_and_match(%W(bundle --version), /[\d\.]+/).try(:to_s) - # check Bundler version - rake_version = run_and_match(%W(rake --version), /[\d\.]+/).try(:to_s) - - puts "" - puts "System information".yellow - puts "System:\t\t#{os_name || "unknown".red}" - puts "Current User:\t#{run(%W(whoami))}" - puts "Using RVM:\t#{rvm_version.present? ? "yes".green : "no"}" - puts "RVM Version:\t#{rvm_version}" if rvm_version.present? - puts "Ruby Version:\t#{ruby_version || "unknown".red}" - puts "Gem Version:\t#{gem_version || "unknown".red}" - puts "Bundler Version:#{bunder_version || "unknown".red}" - puts "Rake Version:\t#{rake_version || "unknown".red}" - puts "Sidekiq Version:#{Sidekiq::VERSION}" - - - # check database adapter - database_adapter = ActiveRecord::Base.connection.adapter_name.downcase - - project = Project.new(path: "some-project") - project.path = "some-project" - # construct clone URLs - http_clone_url = project.http_url_to_repo - ssh_clone_url = project.ssh_url_to_repo - - omniauth_providers = Gitlab.config.omniauth.providers - omniauth_providers.map! { |provider| provider['name'] } - - puts "" - puts "GitLab information".yellow - puts "Version:\t#{Gitlab::VERSION}" - puts "Revision:\t#{Gitlab::REVISION}" - puts "Directory:\t#{Rails.root}" - puts "DB Adapter:\t#{database_adapter}" - puts "URL:\t\t#{Gitlab.config.gitlab.url}" - puts "HTTP Clone URL:\t#{http_clone_url}" - puts "SSH Clone URL:\t#{ssh_clone_url}" - puts "Using LDAP:\t#{Gitlab.config.ldap.enabled ? "yes".green : "no"}" - puts "Using Omniauth:\t#{Gitlab.config.omniauth.enabled ? "yes".green : "no"}" - puts "Omniauth Providers: #{omniauth_providers.map(&:magenta).join(', ')}" if Gitlab.config.omniauth.enabled - - - - # check Gitolite version - gitlab_shell_version_file = "#{Gitlab.config.gitlab_shell.hooks_path}/../VERSION" - if File.readable?(gitlab_shell_version_file) - gitlab_shell_version = File.read(gitlab_shell_version_file) - end - - puts "" - puts "GitLab Shell".yellow - puts "Version:\t#{gitlab_shell_version || "unknown".red}" - puts "Repositories:\t#{Gitlab.config.gitlab_shell.repos_path}" - puts "Hooks:\t\t#{Gitlab.config.gitlab_shell.hooks_path}" - puts "Git:\t\t#{Gitlab.config.git.bin_path}" - - end - end -end diff --git a/lib/tasks/gitlab/mail_google_schema_whitelisting.rake b/lib/tasks/gitlab/mail_google_schema_whitelisting.rake deleted file mode 100644 index 102c6ae55d5..00000000000 --- a/lib/tasks/gitlab/mail_google_schema_whitelisting.rake +++ /dev/null @@ -1,73 +0,0 @@ -require "#{Rails.root}/app/helpers/emails_helper" -require 'action_view/helpers' -extend ActionView::Helpers - -include ActionView::Context -include EmailsHelper - -namespace :gitlab do - desc "Email google whitelisting email with example email for actions in inbox" - task mail_google_schema_whitelisting: :environment do - subject = "Rails | Implemented feature" - url = "#{Gitlab.config.gitlab.url}/base/rails-project/issues/#{rand(1..100)}#note_#{rand(10..1000)}" - schema = email_action(url) - body = email_template(schema, url) - mail = Notify.test_email("schema.whitelisting+sample@gmail.com", subject, body.html_safe) - if send_now - mail.deliver - else - puts "WOULD SEND:" - end - puts mail - end - - def email_template(schema, url) - " - - - - GitLab - - - - - -
        -
        -

        I like it :+1:

        -
        -
        - - - - " - end - - def send_now - if ENV['SEND'] == "true" - true - else - false - end - end -end diff --git a/lib/tasks/gitlab/setup.rake b/lib/tasks/gitlab/setup.rake deleted file mode 100644 index 8b4ccdfc3fe..00000000000 --- a/lib/tasks/gitlab/setup.rake +++ /dev/null @@ -1,24 +0,0 @@ -namespace :gitlab do - desc "GITLAB | Setup production application" - task setup: :environment do - setup_db - end - - def setup_db - warn_user_is_not_gitlab - - unless ENV['force'] == 'yes' - puts "This will create the necessary database tables and seed the database." - puts "You will lose any previous data stored in the database." - ask_to_continue - puts "" - end - - Rake::Task["db:setup"].invoke - Rake::Task["add_limits_mysql"].invoke - Rake::Task["db:seed_fu"].invoke - rescue Gitlab::TaskAbortedByUserError - puts "Quitting...".red - exit 1 - end -end diff --git a/lib/tasks/gitlab/shell.rake b/lib/tasks/gitlab/shell.rake deleted file mode 100644 index e835d6cb9b7..00000000000 --- a/lib/tasks/gitlab/shell.rake +++ /dev/null @@ -1,138 +0,0 @@ -namespace :gitlab do - namespace :shell do - desc "GITLAB | Install or upgrade gitlab-shell" - task :install, [:tag, :repo] => :environment do |t, args| - warn_user_is_not_gitlab - - default_version = Gitlab::Shell.version_required - args.with_defaults(tag: 'v' + default_version, repo: "https://gitlab.com/gitlab-org/gitlab-shell.git") - - user = Gitlab.config.gitlab.user - home_dir = Rails.env.test? ? Rails.root.join('tmp/tests') : Gitlab.config.gitlab.user_home - gitlab_url = Gitlab.config.gitlab.url - # gitlab-shell requires a / at the end of the url - gitlab_url += '/' unless gitlab_url.end_with?('/') - repos_path = Gitlab.config.gitlab_shell.repos_path - target_dir = Gitlab.config.gitlab_shell.path - - # Clone if needed - unless File.directory?(target_dir) - system(*%W(git clone -- #{args.repo} #{target_dir})) - end - - # Make sure we're on the right tag - Dir.chdir(target_dir) do - # First try to checkout without fetching - # to avoid stalling tests if the Internet is down. - reseted = reset_to_commit(args) - - unless reseted - system(*%W(git fetch origin)) - reset_to_commit(args) - end - - config = { - user: user, - gitlab_url: gitlab_url, - http_settings: {self_signed_cert: false}.stringify_keys, - repos_path: repos_path, - auth_file: File.join(home_dir, ".ssh", "authorized_keys"), - redis: { - bin: %x{which redis-cli}.chomp, - namespace: "resque:gitlab" - }.stringify_keys, - log_level: "INFO", - audit_usernames: false - }.stringify_keys - - redis_url = URI.parse(ENV['REDIS_URL'] || "redis://localhost:6379") - - if redis_url.scheme == 'unix' - config['redis']['socket'] = redis_url.path - else - config['redis']['host'] = redis_url.host - config['redis']['port'] = redis_url.port - end - - # Generate config.yml based on existing gitlab settings - File.open("config.yml", "w+") {|f| f.puts config.to_yaml} - - # Launch installation process - system(*%W(bin/install)) - end - - # Required for debian packaging with PKGR: Setup .ssh/environment with - # the current PATH, so that the correct ruby version gets loaded - # Requires to set "PermitUserEnvironment yes" in sshd config (should not - # be an issue since it is more than likely that there are no "normal" - # user accounts on a gitlab server). The alternative is for the admin to - # install a ruby (1.9.3+) in the global path. - File.open(File.join(home_dir, ".ssh", "environment"), "w+") do |f| - f.puts "PATH=#{ENV['PATH']}" - end - end - - desc "GITLAB | Setup gitlab-shell" - task setup: :environment do - setup - end - - desc "GITLAB | Build missing projects" - task build_missing_projects: :environment do - Project.find_each(batch_size: 1000) do |project| - path_to_repo = project.repository.path_to_repo - if File.exists?(path_to_repo) - print '-' - else - if Gitlab::Shell.new.add_repository(project.path_with_namespace) - print '.' - else - print 'F' - end - end - end - end - end - - def setup - warn_user_is_not_gitlab - - unless ENV['force'] == 'yes' - puts "This will rebuild an authorized_keys file." - puts "You will lose any data stored in authorized_keys file." - ask_to_continue - puts "" - end - - Gitlab::Shell.new.remove_all_keys - - Gitlab::Shell.new.batch_add_keys do |adder| - Key.find_each(batch_size: 1000) do |key| - adder.add_key(key.shell_id, key.key) - print '.' - end - end - puts "" - - unless $?.success? - puts "Failed to add keys...".red - exit 1 - end - - rescue Gitlab::TaskAbortedByUserError - puts "Quitting...".red - exit 1 - end - - def reset_to_commit(args) - tag, status = Gitlab::Popen.popen(%W(git describe -- #{args.tag})) - - unless status.zero? - tag, status = Gitlab::Popen.popen(%W(git describe -- origin/#{args.tag})) - end - - tag = tag.strip - system(*%W(git reset --hard #{tag})) - end -end - diff --git a/lib/tasks/gitlab/sidekiq.rake b/lib/tasks/gitlab/sidekiq.rake deleted file mode 100644 index 7e2a6668e59..00000000000 --- a/lib/tasks/gitlab/sidekiq.rake +++ /dev/null @@ -1,47 +0,0 @@ -namespace :gitlab do - namespace :sidekiq do - QUEUE = 'queue:post_receive' - - desc 'Drop all Sidekiq PostReceive jobs for a given project' - task :drop_post_receive , [:project] => :environment do |t, args| - unless args.project.present? - abort "Please specify the project you want to drop PostReceive jobs for:\n rake gitlab:sidekiq:drop_post_receive[group/project]" - end - project_path = Project.find_with_namespace(args.project).repository.path_to_repo - - Sidekiq.redis do |redis| - unless redis.exists(QUEUE) - abort "Queue #{QUEUE} is empty" - end - - temp_queue = "#{QUEUE}_#{Time.now.to_i}" - redis.rename(QUEUE, temp_queue) - - # At this point, then post_receive queue is empty. It may be receiving - # new jobs already. We will repopulate it with the old jobs, skipping the - # ones we want to drop. - dropped = 0 - while (job = redis.lpop(temp_queue)) do - if repo_path(job) == project_path - dropped += 1 - else - redis.rpush(QUEUE, job) - end - end - # The temp_queue will delete itself after we have popped all elements - # from it - - puts "Dropped #{dropped} jobs containing #{project_path} from #{QUEUE}" - end - end - - def repo_path(job) - job_args = JSON.parse(job)['args'] - if job_args - job_args.first - else - nil - end - end - end -end diff --git a/lib/tasks/gitlab/task_helpers.rake b/lib/tasks/gitlab/task_helpers.rake deleted file mode 100644 index 14a130be2ca..00000000000 --- a/lib/tasks/gitlab/task_helpers.rake +++ /dev/null @@ -1,131 +0,0 @@ -module Gitlab - class TaskAbortedByUserError < StandardError; end -end - -unless STDOUT.isatty - module Colored - extend self - - def colorize(string, options={}) - string - end - end -end - -namespace :gitlab do - - # Ask if the user wants to continue - # - # Returns "yes" the user chose to continue - # Raises Gitlab::TaskAbortedByUserError if the user chose *not* to continue - def ask_to_continue - answer = prompt("Do you want to continue (yes/no)? ".blue, %w{yes no}) - raise Gitlab::TaskAbortedByUserError unless answer == "yes" - end - - # Check which OS is running - # - # It will primarily use lsb_relase to determine the OS. - # It has fallbacks to Debian, SuSE, OS X and systems running systemd. - def os_name - os_name = run(%W(lsb_release -irs)) - os_name ||= if File.readable?('/etc/system-release') - File.read('/etc/system-release') - end - os_name ||= if File.readable?('/etc/debian_version') - debian_version = File.read('/etc/debian_version') - "Debian #{debian_version}" - end - os_name ||= if File.readable?('/etc/SuSE-release') - File.read('/etc/SuSE-release') - end - os_name ||= if os_x_version = run(%W(sw_vers -productVersion)) - "Mac OS X #{os_x_version}" - end - os_name ||= if File.readable?('/etc/os-release') - File.read('/etc/os-release').match(/PRETTY_NAME=\"(.+)\"/)[1] - end - os_name.try(:squish!) - end - - # Prompt the user to input something - # - # message - the message to display before input - # choices - array of strings of acceptable answers or nil for any answer - # - # Returns the user's answer - def prompt(message, choices = nil) - begin - print(message) - answer = STDIN.gets.chomp - end while choices.present? && !choices.include?(answer) - answer - end - - # Runs the given command and matches the output against the given pattern - # - # Returns nil if nothing matched - # Returns the MatchData if the pattern matched - # - # see also #run - # see also String#match - def run_and_match(command, regexp) - run(command).try(:match, regexp) - end - - # Runs the given command - # - # Returns nil if the command was not found - # Returns the output of the command otherwise - # - # see also #run_and_match - def run(command) - output, _ = Gitlab::Popen.popen(command) - output - rescue Errno::ENOENT - '' # if the command does not exist, return an empty string - end - - def uid_for(user_name) - run(%W(id -u #{user_name})).chomp.to_i - end - - def gid_for(group_name) - begin - Etc.getgrnam(group_name).gid - rescue ArgumentError # no group - "group #{group_name} doesn't exist" - end - end - - def warn_user_is_not_gitlab - unless @warned_user_not_gitlab - gitlab_user = Gitlab.config.gitlab.user - current_user = run(%W(whoami)).chomp - unless current_user == gitlab_user - puts "#{Colored.color(:black)+Colored.color(:on_yellow)} Warning #{Colored.extra(:clear)}" - puts " You are running as user #{current_user.magenta}, we hope you know what you are doing." - puts " Things may work\/fail for the wrong reasons." - puts " For correct results you should run this as user #{gitlab_user.magenta}." - puts "" - end - @warned_user_not_gitlab = true - end - end - - # Tries to configure git itself - # - # Returns true if all subcommands were successfull (according to their exit code) - # Returns false if any or all subcommands failed. - def auto_fix_git_config(options) - if !@warned_user_not_gitlab && options['user.email'] != 'example@example.com' # default email should be overridden? - command_success = options.map do |name, value| - system(%W(#{Gitlab.config.git.bin_path} config --global #{name} #{value})) - end - - command_success.all? - else - false - end - end -end diff --git a/lib/tasks/gitlab/test.rake b/lib/tasks/gitlab/test.rake deleted file mode 100644 index b4c0ae3ff79..00000000000 --- a/lib/tasks/gitlab/test.rake +++ /dev/null @@ -1,16 +0,0 @@ -namespace :gitlab do - desc "GITLAB | Run all tests" - task :test do - cmds = [ - %W(rake brakeman), - %W(rake rubocop), - %W(rake spinach), - %W(rake spec), - %W(rake jasmine:ci) - ] - - cmds.each do |cmd| - system({'RAILS_ENV' => 'test', 'force' => 'yes'}, *cmd) or raise("#{cmd} failed!") - end - end -end diff --git a/lib/tasks/gitlab/web_hook.rake b/lib/tasks/gitlab/web_hook.rake deleted file mode 100644 index f9f586db93c..00000000000 --- a/lib/tasks/gitlab/web_hook.rake +++ /dev/null @@ -1,65 +0,0 @@ -namespace :gitlab do - namespace :web_hook do - desc "GITLAB | Adds a web hook to the projects" - task :add => :environment do - web_hook_url = ENV['URL'] - namespace_path = ENV['NAMESPACE'] - - projects = find_projects(namespace_path) - - puts "Adding web hook '#{web_hook_url}' to:" - projects.find_each(batch_size: 1000) do |project| - print "- #{project.name} ... " - web_hook = project.hooks.new(url: web_hook_url) - if web_hook.save - puts "added".green - else - print "failed".red - puts " [#{web_hook.errors.full_messages.to_sentence}]" - end - end - end - - desc "GITLAB | Remove a web hook from the projects" - task :rm => :environment do - web_hook_url = ENV['URL'] - namespace_path = ENV['NAMESPACE'] - - projects = find_projects(namespace_path) - projects_ids = projects.pluck(:id) - - puts "Removing web hooks with the url '#{web_hook_url}' ... " - count = WebHook.where(url: web_hook_url, project_id: projects_ids, type: 'ProjectHook').delete_all - puts "#{count} web hooks were removed." - end - - desc "GITLAB | List web hooks" - task :list => :environment do - namespace_path = ENV['NAMESPACE'] - - projects = find_projects(namespace_path) - web_hooks = projects.all.map(&:hooks).flatten - web_hooks.each do |hook| - puts "#{hook.project.name.truncate(20).ljust(20)} -> #{hook.url}" - end - - puts "\n#{web_hooks.size} web hooks found." - end - end - - def find_projects(namespace_path) - if namespace_path.blank? - Project - elsif namespace_path == '/' - Project.where(namespace_id: nil) - else - namespace = Namespace.where(path: namespace_path).first - if namespace - Project.where(namespace_id: namespace.id) - else - puts "Namespace not found: #{namespace_path}".red - exit 2 - end - end - end -end diff --git a/lib/tasks/migrate/add_limits_mysql.rake b/lib/tasks/migrate/add_limits_mysql.rake deleted file mode 100644 index a1972a682d8..00000000000 --- a/lib/tasks/migrate/add_limits_mysql.rake +++ /dev/null @@ -1,7 +0,0 @@ -require Rails.root.join('db/migrate/limits_to_mysql') - -desc "GITLAB | Add limits to strings in mysql database" -task add_limits_mysql: :environment do - puts "Adding limits to schema.rb for mysql" - LimitsToMysql.new.up -end diff --git a/lib/tasks/migrate/migrate_iids.rake b/lib/tasks/migrate/migrate_iids.rake deleted file mode 100644 index 33271e1a2bb..00000000000 --- a/lib/tasks/migrate/migrate_iids.rake +++ /dev/null @@ -1,48 +0,0 @@ -desc "GITLAB | Build internal ids for issues and merge requests" -task migrate_iids: :environment do - puts 'Issues'.yellow - Issue.where(iid: nil).find_each(batch_size: 100) do |issue| - begin - issue.set_iid - if issue.update_attribute(:iid, issue.iid) - print '.' - else - print 'F' - end - rescue - print 'F' - end - end - - puts 'done' - puts 'Merge Requests'.yellow - MergeRequest.where(iid: nil).find_each(batch_size: 100) do |mr| - begin - mr.set_iid - if mr.update_attribute(:iid, mr.iid) - print '.' - else - print 'F' - end - rescue => ex - print 'F' - end - end - - puts 'done' - puts 'Milestones'.yellow - Milestone.where(iid: nil).find_each(batch_size: 100) do |m| - begin - m.set_iid - if m.update_attribute(:iid, m.iid) - print '.' - else - print 'F' - end - rescue - print 'F' - end - end - - puts 'done' -end diff --git a/lib/tasks/rubocop.rake b/lib/tasks/rubocop.rake deleted file mode 100644 index ddfaf5d51f2..00000000000 --- a/lib/tasks/rubocop.rake +++ /dev/null @@ -1,4 +0,0 @@ -unless Rails.env.production? - require 'rubocop/rake_task' - RuboCop::RakeTask.new -end diff --git a/lib/tasks/setup.rake b/lib/tasks/setup.rake deleted file mode 100644 index 93701de8f63..00000000000 --- a/lib/tasks/setup.rake +++ /dev/null @@ -1,4 +0,0 @@ -desc "GITLAB | Setup gitlab db" -task :setup do - Rake::Task["gitlab:setup"].invoke -end diff --git a/lib/tasks/sidekiq.rake b/lib/tasks/sidekiq.rake deleted file mode 100644 index e4bd6545755..00000000000 --- a/lib/tasks/sidekiq.rake +++ /dev/null @@ -1,21 +0,0 @@ -namespace :sidekiq do - desc "GITLAB | Stop sidekiq" - task :stop do - system *%W(bin/background_jobs stop) - end - - desc "GITLAB | Start sidekiq" - task :start do - system *%W(bin/background_jobs start) - end - - desc 'GitLab | Restart sidekiq' - task :restart do - system *%W(bin/background_jobs restart) - end - - desc "GITLAB | Start sidekiq with launchd on Mac OS X" - task :launchd do - system *%W(bin/background_jobs start_no_deamonize) - end -end diff --git a/lib/tasks/spec.rake b/lib/tasks/spec.rake deleted file mode 100644 index bee22300298..00000000000 --- a/lib/tasks/spec.rake +++ /dev/null @@ -1,45 +0,0 @@ -Rake::Task["spec"].clear if Rake::Task.task_defined?('spec') - -namespace :spec do - desc 'GITLAB | Run request specs' - task :api do - cmds = [ - %W(rake gitlab:setup), - %W(rspec spec --tag @api) - ] - run_commands(cmds) - end - - desc 'GITLAB | Run feature specs' - task :feature do - cmds = [ - %W(rake gitlab:setup), - %W(rspec spec --tag @feature) - ] - run_commands(cmds) - end - - desc 'GITLAB | Run other specs' - task :other do - cmds = [ - %W(rake gitlab:setup), - %W(rspec spec --tag ~@api --tag ~@feature) - ] - run_commands(cmds) - end -end - -desc "GITLAB | Run specs" -task :spec do - cmds = [ - %W(rake gitlab:setup), - %W(rspec spec), - ] - run_commands(cmds) -end - -def run_commands(cmds) - cmds.each do |cmd| - system({'RAILS_ENV' => 'test', 'force' => 'yes'}, *cmd) or raise("#{cmd} failed!") - end -end diff --git a/lib/tasks/spinach.rake b/lib/tasks/spinach.rake deleted file mode 100644 index 4aefc18ce14..00000000000 --- a/lib/tasks/spinach.rake +++ /dev/null @@ -1,40 +0,0 @@ -Rake::Task["spinach"].clear if Rake::Task.task_defined?('spinach') - -desc "GITLAB | Run spinach" -task :spinach do - tags = if ENV['SEMAPHORE'] - '~@tricky' - else - '~@semaphore' - end - - cmds = [ - %W(rake gitlab:setup), - %W(spinach --tags #{tags}), - ] - run_commands(cmds) -end - -desc "GITLAB | Run project spinach features" -task :spinach_project do - cmds = [ - %W(rake gitlab:setup), - %W(spinach --tags ~@admin,~@dashboard,~@profile,~@public,~@snippets), - ] - run_commands(cmds) -end - -desc "GITLAB | Run other spinach features" -task :spinach_other do - cmds = [ - %W(rake gitlab:setup), - %W(spinach --tags @admin,@dashboard,@profile,@public,@snippets), - ] - run_commands(cmds) -end - -def run_commands(cmds) - cmds.each do |cmd| - system({'RAILS_ENV' => 'test', 'force' => 'yes'}, *cmd) or raise("#{cmd} failed!") - end -end diff --git a/lib/tasks/test.rake b/lib/tasks/test.rake deleted file mode 100644 index a39d9649876..00000000000 --- a/lib/tasks/test.rake +++ /dev/null @@ -1,13 +0,0 @@ -Rake::Task["test"].clear - -desc "GITLAB | Run all tests" -task :test do - Rake::Task["gitlab:test"].invoke -end - -unless Rails.env.production? - require 'coveralls/rake/task' - Coveralls::RakeTask.new - desc "GITLAB | Run all tests on CI with simplecov" - task :test_ci => [:rubocop, :brakeman, 'jasmine:ci', :spinach, :spec, 'coveralls:push'] -end diff --git a/lib/unfold_form.rb b/lib/unfold_form.rb deleted file mode 100644 index 46b12beeaaf..00000000000 --- a/lib/unfold_form.rb +++ /dev/null @@ -1,11 +0,0 @@ -require_relative 'gt_one_coercion' - -class UnfoldForm - include Virtus.model - - attribute :since, GtOneCoercion - attribute :to, GtOneCoercion - attribute :bottom, Boolean - attribute :unfold, Boolean, default: true - attribute :offset, Integer -end diff --git a/log/.gitkeep b/log/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/public/404.html b/public/404.html deleted file mode 100644 index 867f193a98f..00000000000 --- a/public/404.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - -

        404

        -

        The page you were looking for doesn't exist.

        -
        -

        You may have mistyped the address or the page may have moved.

        - - diff --git a/public/422.html b/public/422.html deleted file mode 100644 index b6c37ac5386..00000000000 --- a/public/422.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - -

        422

        -
        -

        The change you wanted was rejected.

        -

        Maybe you tried to change something you didn't have access to.

        -
        - - diff --git a/public/500.html b/public/500.html deleted file mode 100644 index c84b9e90e4b..00000000000 --- a/public/500.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - -

        500

        -

        We're sorry, but something went wrong.

        -
        -

        Please contact your GitLab administrator if this problem persists.

        - - diff --git a/public/502.html b/public/502.html deleted file mode 100644 index d171eccc927..00000000000 --- a/public/502.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - GitLab is not responding (502) - - - -

        502

        -

        GitLab is not responding.

        -
        -

        Please contact your GitLab administrator if this problem persists.

        - - diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png deleted file mode 100644 index 6f2e0dd090ff597a7261de7b8b7d403a92691a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11979 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�Cdv-f6QYnS9>5VabvcUl%<7WdD!d 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 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png deleted file mode 100644 index 6f2e0dd090ff597a7261de7b8b7d403a92691a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11979 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�Cdv-f6QYnS9>5VabvcUl%<7WdD!d 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 diff --git a/public/deploy.html b/public/deploy.html deleted file mode 100644 index d9c4bb5c583..00000000000 --- a/public/deploy.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - Deploy in progress. Please try again in few minutes - - - -

        Deploy in progress

        -

        Please try again in few minutes or contact your administrator.

        - - diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index bfb74960c480e6cb14f1d38437303af6b375ccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32988 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 diff --git a/public/gitlab_logo.png b/public/gitlab_logo.png deleted file mode 100644 index dbe6dabb784f3f104908e2eefe79a887545d1075..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13819 zcmeAS@N?(olHy`uVBq!ia0y~yVANq?U^v9V#K6E%qn44vz`(#*9OUlAu(UOo$O1fT(E}K%d zFU2`cJ29>H^uG7I51ui2fAxyVSp&7U8J7F|&zqdRWBFa@{CB(aJD=YvUJ>Bn;P5{r zWC2%014E001A~)-f&zo0fIx!)2M31(2Mdb=3lkHQ023o4MRARtocW&V__d+x(McYHnvt1VKh zVV|0^@LEY-LHqpar{CQ=x^5jG!^0<`$;r%57(}0Zn>Ovq*6rKV(w6-GRWZllir|CW zYgaFxI&-4iI*msn%ePp3_pZr_&;Kr>>*QBZ=P)1wQA)#MYZR9 zH~5LGv)9?pi?!bFwC?b`TdaO&VyBIl1uuHvqUjo(+}pbIvNYwOIJo!h4$e;u9}mhSVxFgr7|@7EVc*T}Y+od*x!EnW3} z?u3qc(q-Wi=0+N)-WOL_=v!N_-nY+8-+XrE=VNWZR(Zzhz1d@Vcl-TAXI3oP@cr`g z?-!m5J(u{B?HW0;bK<(EnaKx5S z-qz-yEAJ<-@b14a_QE`J=KZ40LAiP}=5Mp$RG4#R)#|ldZF0H3$}IT){oOsgx;G~Z z!s9Ju;^O1evy(mDci%d4W5e#vsaZb{yuP0EG9y!N=e@P7SGy_+-iV(%b?TFmrbbI<)j(2pzUjdgWzKKvHC!k(8(AIQo-gDr*~WNq&60Z(V)Ix!XUB!=h(gbDkU5 z^ZoF-;_&e0YkNiY`M;~^@TnQ+$M3(fqcJYhQ}J;$7tb}@n6QiUUEFJHo>VR0y!h$2 zv)T-YJl}J^esyk++0L4aLRI(sTcYO}UAua%;T}&W?+gP`wr18J)oWundj&i1-MX}H zlC{8j_j3Y`nVKK}{yp)qPe)(-rnX{9fG4AA!yKEVj_Hecu8a$JpIoN9b^Z6n@80G8 zImfgw?^f)mx=$Qc$=StxT<+P~*$gd{!*g?WujibfYqPNb-}~R+^IckYG&BEg%T7Df z?xC`2)1Tebmc81P>Rq#Uj#@we!IR8ub~l&3omHNHsL(0k&*ScW;$CkApFDo3rF-uG z^P>mn{94(s{dJXS`&GVaQ^gbnI1WiV*Z=!?IQn(5*w4ylX7A-^ef6TE6Yg8E3iw%- zmTtQpzkkKz+8^m#IA3467G%Fd<@&8l28%i!)(5zMjNG7atGjj28@Vqv+d0kdB>I^L z1V?^QeRjBe!vp0iD=+pG!|(i@@sU!m7Rqh<_^WhF-}k)l|11maCq8wWzk2P~z`(e! zva_o;r2ng}tvzCKKwjM4;>!LFyX#p0#xvLM)iz7Fw!Q@lf)92xF7JK)spz-i{1!X@ zw7dH>58P*Wz0>mG-@kvmW*Oz`hQ10t&HPuccl*gl%kNwZl9&B?>h9ZzACs+`YI0t` zxPE4qY4XiWuD2u2Iys8oi9WCV{EM|@qrxVOt)^F_X1xjt3GtbIOxaW&FoY2Z^yfQImpm5 z`PVYnhzJRDarS42uRYuKcT=_KlhjvP|C8?UaD8iHp1&q)r%(KUkMwF|&mK|xJeT^W zhVPVRYY?+w%ZqCgf>6d((r{i|k7^>XR*VSCLdh^tb`IbivFPxt&ti&|0 z>h`S&ZEY`OqYGyn{SG>;UcBB#YvcuMMaD8x6 zc;K?E$8N#;?Z>ZNd2!_9;u-y}t*n3l{tbMf+2y&eU*5ih>+_ZCQxa#LdVW$lYF6sM zI=lK*#uW!IK0L(CWyB+W?dVaLMf)X7KPUHBIsWxuVSVM^y=Twg)Ie_l_{cvUqnDxlc@p$k@=KaQ%0Ae%-y&)ta}}HUAj>VeNY3k|$92Q)qX* zn~v$z*ZH%vb0{?84q4^w=;S|eIcVRV9d()J*Vk1RKlkYPe7}58 zXwV$?RMFzcEkAS;`Ch-v+PXJ~_v&qDb#|76j0YYHW#+87YEcsq>&yB|X@R}Jx38VT zese7&CI^d~QzuVeyL`2v)GwLcuJTsadQld)?|!x0<@*2HlA_I*Sy+Gk_-V1(D7bTr z_ZmMnA-30f+1b@ko~bD6?Z|k@G_!UQqkrx0e{uvdbyu1frWwgj$yn5oq z4>pB4Z&s~cX=rS?r{dq2`QJHLA9ZQ1*m?6)(Pp>wWwCSLilrSlTeJN0r;^r3o=n?X zO*NPE8$Fuw;`{M0Tf^2xoH~8@-;vXs*{}V}Kd8J;`TCb5r<-RNKhJt4s?PKEQqbgE zx1uhVHwPT%U-|!qxAI<_yAqPuW=g(x-g_`mM7Xw~H1sHAWhCp*zc(Jw3D4D^At`-j z!d(wrNv9jkuQ%;3b99asT^?&Izw^v|>(Br8-u6(bDVf&z%kX@2DtGg|zN*Sd&VBVi z{zf?G`zI$aUjJRWP*6@v>Q!)>8*Amt$&+mlnLJBVojp@(ZQNe3BL4mR-#=b<%x#XP z)r{Ge0l6Vlrc23Oy?1Df-J8k_FT8&J&dc)nuu8Ohf!g7J0si67FSQ!mZt!DJ%=#pK zVRQQVBd)B!t9JkE*lHD}@~vZ2Ui!InrzE;F!$PNNpLqNDapM0EW-|9J9n7MlqaQze zb>!f-T5;{}<;$goF50TzP!4!}?Xs&0h>q@d{Fq)Y&e#9rL)ZN2 zwfonov^hCtE`R&fEU;DnDxA)gId8T{W26E0-IpoR~j5Tb%ti-wQ2fQ8C-6yB6;I_HS>rOwO8ZX3rn&HMnvk zPvQG_Wt+Qm#m>%u`}AYGw2w!J^$Hzn!H;sTeM-(8`^BHhUkt2%P$7O_fluRv@tWoS z{{PL&c7LgQvoGoBByaJx33ulPxPRH$t}V~MoWcJ4>kkuFo|8+IVxCv^`AypM=TAS? zJqrA?_rapAPghO#mfyK^!jcoMtUF_5tX*7L5@Xli;M`?bVrI24J|>1mVUEK zD%t;ObN+ZTx%`CosW+mRu7^H+mT>W6&~G96ZprWRv8M_u)?cn=*NFP~spO#NafkT# zZzO{?G*|`vmgX&-vcx0O)9xRmRD0-j{h8lIwIfuGBDZ)t{B?+z_fJ%u_qeU<{k^u> zT?Nx-cmG}VRWhQSUGlNHO4r@k+<=dY&(|;AHh+3GJG*rE`hNHP{P+FIZo&LNe_BS* zkUVBCVK5aa-yL#p%5qICcmjdEf zKR#}g@aTEHV^)5C>5k;{=TDbC{Zz?cu3i{e$MJH{9Uq+l&7{oWH zp=6t$nz&%S^^@&k>1V}t=LpMxpE+ac1cPZI;nBI3$7W3KJ$c9F`w_#lwnK^HB_OFrsJL~4=WizGZozGwSyE^OS`O{0Iy*I~)N&VM;Jh^Sz zvE$VVcNq?8rpY)uHcp6ql2U)Tylt&+ua3@{EG;fs*|!>x)S5!Vrb$b`+`KXGTFBI? zlLfEZull{$V0zL==}lc++(l=6{MJNmozvCj<^R0Ew^Y^eYxBQt%h}Uv&m|pf`Z-_e z-oqV^8W#elO#k$;(&<>J?>6Z}Q$+afmb@-_{%pe9ckh2!JZ#!IalT#ByfummajB`Q zRlB6DBP5QvRy;{nmAAU@e#rg)XT{4ezPPvVTz~uZM(NYn&I+_=tzutTr9A2Il_^JD zxzn<OeezVXcd+igR&N5CLQ!_IS8($sT;TW4c_37#9 zX{jm?cN~1S%!;>kskiv~$>moACvJ4C@$I>-Z)*`Pb)4hEd+)AK=4+xqE17V-<@w0( z@OQ?MiWd_uoss;Xd~?&qQow@9&(Q}^Rh4x^{VvEmP312=_x$YK z)Z&X=|8E~)h<~~F(8t1yPhy{kq~r?!P4}BEHTS~%#)EA~&Rjk`b^i3dD>s&Tc&}Q! zGALw9^ST#2(l27?ykE?|lA+FJ5y$Iy1!YAs8xq!ivGdfJb>R7j=aYBW))sA=6um9y z)vKK2h0VIYU)@Wt_{}qrkZ@q~w`lc!=>6yUUn3#KgN%n|mn~fPeg=6>I` zONzBJvcut6?-#{`{*BBsbG>=^J}qAux6R*c(XaErO=ev8pKo_&rmb+7`-j!vD?J)! z807nuu-v?E^Yi_c?7~wK!Lfq%mE2!`pXw6Q?RD<`y7fkUY1x)jr%yVtWdwAs#iosZ{Bu{i~APm z8TdVZvh+v(j-N6QA3yzcSn^-T;$2o(LZ>P)l@}K;Sz5=+(l__;jq~yrmfN&tC%nzb zKKSq3%6@C!ub*x$oc8}?-KU6<8TRJtlZCYAD}7s2Ua&(|S#{cE+njE-Bkuq9*k0y$ z7d~f*}jcH!QwB`Xwi^U^x%?nv8fxE^2+KP2LaDRn1xRXE(;5ynjjPXT^>8cXs&&`Z~A#pMQ*H-ydqjsU%_siz%fH|f0%>91HZnq;^*f$Ie*#e?%uuo^ot$y797Z1 z(W|kRbA`rPKCdqB@=bZx`Ke8HCTeQ0L=Ur7bvP(HznwQP&*8z50*>ZV`KzI^yGjg0 z{;xRraF@$s{Q$ts5k469k*{q zF*XWIP2I9>!{)a)PHfn>Wyy77LOd zv9=$!z4QM33`1qRZ^B1~JURsyZD3>AYQnd2wbr8f>)AKHu-_@NZToiFkV)2=C37ad zp5K+EtDt6;B>VT)pF8=&I;$H$*NN$6<$lUjK!#@&1E!i93IcOER+ zX>{%S_3W$_bF8b`DxA17-t2m{HhRXr{nf5#PVKLsYV>iw|4y&jGZs1aGMW0;${zhH zsBuns-qtM_E?dTUcinp+Z!iC%{rlH%-wrI;zi*%18L>rA4$28JimprFP_oyS!$tmN z=8-Qv{jV}3=G$}IC|d45xa^pfUtjF{xVA~B+$MUsBsPu;d{8_$>TlP|=n_t?G&ViH}uWs8Nny0y-c+kYS0uE^k@E7Qch zCn#9x)TvV!g#UU(Z}}j8zWnW-dv`+k6;z_{?#NrcavjS?L$Tcl|7=*f((p^=2S?SH zs@>0ncvaQhZar@M^-zDF=#%GLw@<#8a-4Jjv9?`z?#TFm|II%2`{lKa@Ci>FDIzwd;=SKgodJLtz3O6-7ah z7+E8=9=U8!I~wWzdCQe4ZNF}vJf>LYm$hoO-Ja^DYnK|;-}6a2Wm0A(xr=z?O19oB>2r{LL#&7)%dJqC0e$*S9i?l zpPar(MveLFSJU4*N{O#MJeMelK?)7K!+)~zy3Hmcvu{DkS;ZwzWNs{GnV2(hob;NOt`ow4YN7lcx$dL(Uu*x| z|G&ax(aX#K$`1vsUy!h9{^G-PH1y1Z5<@;dpV0K^^9ld=$0G#37>!GkeF?rFCoH-hB1>NbzMgwoB8F z{$tCW_BuB|-@5wPn;j1WA8?**abRJpbMb%Ove3+Gk7W14^wiXX;*G%*qrQ}EnJ2gI z?%c<__pzmYJpb$0thgggC=WKT159)6} zn|Mh_SM$>4tF!ECZ*@e@vMzsjcX#>xKNF@;pT2nU;+;D!)z#G(-Zrj2^7->;k4abe z-0=xby;)tJ&**RQ^lpM*S=*E)FWyF*2P}y=^(pvBdu6e^gu`sh;$=&gENN{$dUbX9 z`o98S(w?82t1R_*%}irI3AvT)Rw-Dv&$zP5I5;I$<^Om4JAQBL|Nk|2nO^$q%c4a} zbCxJ6DVgQnv4|05VPP>cHujwQwwllUyLWeZ*pvkau4M#IKd|lEv&FmGO|MRU{o2!5 z-NNY8<3p^QIX9=|=KlTryL^uPri~i~AM-Ew{p}y_zIfTJDTWeibFVyM2~6B)e@r+1 z%#GdU@Ap=JzqVGo>d4W92N|`e{0&^1oBQh3tHaJ39zq-!pKJY^w|>Qj_qVp5J|OHD z$~2MV$JfZ%J4l-&&ObMT0ZoA+nWob`w1PyBE!xh`(q1_ArT z{I)XI8_T`Dybkp*0=$jJM_InOsu${4enL^QKEmnw}5u7r%J% zBJb`l*16)fJR-$LMn-&*V$spjbC#Ssefs+Pc>9=}ynR_)x0_DdAR8S$yJSm9>6VaN zQL|6XaMs$SVxVCW;4wk{z-!7pZ``=BU~#ELaS(@Met!O!tp6FM<>khP zhP;tt_V#yn@?KzVb+~y^c)jQ9BP|kwj`M!^m3!XkV>t9tReRm6V#gyI)`5 z?me%SrEjCzuH9Da;x`^Uw_)j0RX=lnp)1BRM(v@Yp*J!QC2W{&p3fKl;cUXBOu6lv!w!(4mr&>~*m_8Ez`A%vq#h z@9*O>fuUv6q)A`D?wI(bPuBWFf6V4I-@H6MKK_7=T}emJ=RGeITh`OFW#f#y$NBTc zl6u*l_--CO%G$c!SntUMas6YmRf2+o2Q{mMgD-E(z1^n$L(q2ZxpQHY;zKX)Dmxn% zF+u&Kw@GA?N0@+;K*z0FtM1G>Gwao<4HqVy?RmY$G&F0qwnw$t^>)7&<(sj#|egovfCvzuU5P^0WAv`IVKL{NMFz++-7C$q>rP}}3uw3FSE_6-+h%?}L~M(B_|&@pWiHPJ?D?xdUAOr3c*31SfoIOL zX?hkqGrygt7Ibccn|e@apw|BQE{2x$^Yh-mdUePyGdcP3o167LxjGRW6l`o{?2|b; zId3#~U0(iQ+)V3nTWR^-ovH2f&6SlG-@6z0$LZ+Nqq+k;T(DbG1 zot&TN8eGWA&sBN*HjhE^CFh&Q()j&V6K8iX-n1y^&#YJ1cUt-S_6c%$EzA&3KJ{Y0 zin{vw8HUYmZOb+ZmFvj;wX?IUJE3T8I+Zyf{(F8^b1Kj4_R=ff({wm_c#f=;|01oy z()y`Ec)im?Q+D>_6FhZecilMp^j}5zSA}*-Po_OG-^|}k;4q5Onm^~z#YXW&#ps!m z`;WNtWG1R?pZf0Hw#Uc6v~B(>svVZ_EN+oyOVh6H`S%wo+x~eI8XoR!_{!k2*Yc%H zRD@?%vMkcKIMDrJt+Gb``FXa|M$&)l*YRGzd|6pX$HwQ1?fHBEe(m_>@aDT=V1DFw zt4NnUH<-_ZI5;An@4Xf>R7g!To-?~?9rV!oSdKTp4#*A>H5e3hC?S^6SBQ0 zcTQY4XN?HsW)01A=RN$}et9o>D$x02=j(+1IX5pow9wJfIr81|hUAGeXO7Ht>{`Fr z{p+k*9kT?(f@8O~cHU4exVApN{^g~mj~*q>ad}Yiw^RfN| z>(-syGG)i3LnVK1?JK<7Hg~G#>*HLuDUW$hD$B@r^!?gUC!6aSXO)!0f9cW1o|q-T28M{oESGwKY#q zO+DTxTm9idV|)AYt=ZSNY~4C@=FHCal&`B)D|cERNm11_Y|EF?{ZiDtX zIsQ$TgfISHG_ht;a+1>;2K(=8B8}U>s4TvAM)LpZ6B3m=e49>}uW$A^eGk<5C_k5z z%d7gOtnYE+_Zd%$HeZ&rx+}AB-d_3L8{ekr{n_d!)=&`ig;P=VNvcOjcR|scGiN;1 zaEPl2n^Z!JqL;pJ(1^C{7{#+*e`{e@d z6JK6lPCq-#)pzfwDJugL<8E0zY@eG}mv>C|w>R?%JElB=+W*_+8E@}Qp1pT2@0#7* zreEhO{=6eA`{qLVwwbf#ZlBrlFg4=AgzXLi`{ngBwr{nJHncn3x&Qs#vTbavzg}l) zy}z+7_2Z+X0+T;KKR^4w_l5ce{$hWBG~d&SFsT3bCi3vk^O45OQ`7qPoGP^!`uOp# zF_T^HxjB{>I>i#_es_<1w($Rj$f$ialKkekGm9UauXhrxjeXoM|LXkF{B`kr4eq?n zUQ;0|DfHy*!EL$1kE^b|oo%=`nBn0Qr;C>l&z;zK@AT!V2JNL=uZo|a9UdOq7v9l2 z`GJFfX=PlHQ%TXI^cVV?4?l08vSU`)o?WZ{>{`|Is%uYAey3mG_MMjHd_N`rMa_Cz zS!sD>j+v=t;ta#io4=Q+{Hd||v?(}C`!oChRa{-%#zB*l_p7<6tGYR_zaR8i%WJcn z#tDm%z*N_pU$w)YEV$)T>My9_v{gspy=qm-Cz6FpZ@{`FhO28S1>CP(U@_pM#-Klg>x@zn{(&V)St5L&_Ud)->|{6BH( zNgjM}^JBh#{N`ZKXYaYqvr6vMl(et%+Fm~^cPmeHvE6_9;=Qs{M;Lx@pCe;kyeUX+ z;qivj@=Cj+UB##S7#aiAFC70Zc-v1bJzf3NhiVZ<#WL%?9K25wl6TgAj>^~XaqyNm zzra)Riue8N*($krZrxh4ri3ATLP2C$nA*fjX$c3nx|&Yjg%1t)dfu=qsF=ULfBC|F zYKcs-b7XFoZLF~Ws1nW;n6m$e{*nvn{+2f*-dW#s;=jQEl4oK4)lfc`AGV5bA3TgG zsylj(&3WR?lN+Z^b9+=D9UOf4?9XCH-V=*|RoTzVX?)>e|0#0A{H{$hRXqhK+#D4I z^v->^yjlL^r=40dQ{a>h;;c&+ILI^B`SJ6c9|_<;wBY~k+n3j_*&?qb_BDI$x%$-) z6zp$pU42peNqyh1AL093V}1#*cekJa=Xvo6n?bR`9l7NSw->>Jq@xigD&L2N}W{alr-{ZDZ_xmeq872MO z6M5>C*W@D|^?cm5z0>dOPnG!J$ z1eAj(3%}C(6!4wjwVFV?zxHe-)A1|U zuWM?1y_UbaP=iU6`%rv&e3s?Sau&893%(~ybR9l;ecrpi;579R{LoGyEZ?)V${JV+i&QaH&EwUcj-jf^m ztveW)d*uT^7qj5wu72rP^0tdEU%TaW;Hc=6^y1=oA3oK1G=}=RHXgg!-*WoR?d;lf zi^^xL%-Wy+J$%|~nGlQI!mdk9DnddTiFwP`XjtD-nzH{|f6H7mdrj@#`3vM78%teX zXC9k4bKa>$A1pbd&z<=~lI=#bW+h)$9WgH8{5HEQ#}JF*jD8%Fq}fyr)|D z)R`@Y+Qw6jvS)N9@g9A6jyF#3+pATZChBB92tE?cXm_rf@7s!#hBMPv3B0H{Kd--C zc5l2Cwf#HmP}3bjUT(J6o3>gWKX`7|7t=%~T{V>x?mJTM>W8gwKB4##6($DFvKdvVnGk>S$%RReq`p=w~lO5F&D!g&|vhMbHFZbx?2F(P!^()t1x@4oHsTUFXuQthN z`TF(m-^uP~{rvo&Xyb*C>&|U2{1z_te%6|GI+Fy1uUx&jX5Bg&!$bBfR5r(lW$kER z%h)1vJkj;%_gRnub2zc5T^5vjy`vdp`KUpMUuJg*8fLzSX-- z1>eW}-Ox+2w~bEkUez^e2Zw)I*sTthTeolK-13MH59Z@w5%_m)`<5k7Pm8y=+9%vsNDNpyzdD$5&BJK9)#VGdn_FCN7cJ#Pw zuSbH%g6E%7yEhvJ1ty$eclfbSW{z?}YnRu}%MR1uyt_Sh&gwZErrD?9sOtyI;nt2ZMhg?r?G zxy)CxTNAtY%$+wXSqz4U_AcF*x5Ddch{#3r9L7e5LxMTnY|WnUZ?9fkI%7uj#1nR= zp-*#l&di9NtY#!~=Ct1*^&gI2o}Tx1rEXr$I<=F&Z44C7M5kFJiHGk#I`IB@NoZP zQkHkW=Uz600EfaKZfkALbGMJ4syTP6NrEprdiKs8mftem%5(pV3}uRyRn!(*fa3nifKK}0zo$IGbJ@=OT5U{ixfPZSe2!7n9b^|bJ14Q zsZWkSeD6CYON)Q?DdU_4=RLaRCm!$?U%PE{j@Fs;O4qrC8w#AN>^$RVnC0%sDV`_6 zr);+;W^2*Ti3{DliB%3hl!e|Fk(-xc9&J9;W?l^O$<=HA;Px5~jmp`l>SwCOVh zc2Ax8@l2tW^b0+CZc}`#=fGO=Gi(X3R-L+{Eq=W2pT*L%hNh~OM>nyy z^J(!#-n;J~6*hJD92+&21AkTJToy7MDtu;Os_Gch;vXKpba5b7#bN4ecbB3B~w&P?A`Q< zmjc4|PMlXfljvSOTfv_HHQ%&DO?xy`X1%Bp6MIs$>AlE<`*&~M@@Y8mXOGNPXRhC= zOS`)2)|fGHun73|G)|j3b;U{zE!i9MXU+1Naro6Kp=+|yEi7fzCujH?GHFgY@~d8K z!D z@%I1QBvtk_=gIEv4}UK?()Tjk^vZPxCdQWkZHKo_W79qz?8G$3|F2xK+(!9JDT|fw zuU{O$dYzX2le)VukFMXlHfhQf0f7hghu?KAY+Uz<@h3A^(S`Y&E;R}t@4vGz^}CVH zmPLDVuE_kmCAsMLhFOPhZC#!GAx|@rmrbc=uY4!R=a>z4w=Z5}0Ts^Pe2VQ49u&-; zKmBv#V_BA8g;x_}K+AJYOs-5z_YK-q*I2uOTJohoCtZ!2^_1~n+=`PMm)E@b zeBkPp(|Yk%?C+Z&PT^R)ye{re%x<0YGeW}~MXMQGCf`#%w97g+X3mYWysi5Sa~JH- z_gH`F-o32UOh0#T*`F`t{j!|ro4>lu-p2c7TKXAl>sxIF5B}~oUw3=c#=OcGk61)` z1vnJu7%hCc`onXknmMmldCh%sw(~<6OKw({fvMfb+}F>JwCt!)y7|I*nM&==BRdYB zxx$goE&e6DI{R~?scWI(!tLu1J8*C*%&C$|OHY>zne_De?YUED+NiXfnqGDPvgKx3 z-s$sa9sYK!&i?e-=tf!Yb^BGp(b2vB31M!R^78zyIu}(|E)eEWn6pVHEIianc5Scp z^`F119z|O&`Si(1HrLm&?%k|aowqeUKR2^T{rRURrhUp&FYm4ozZ>o1-ucWni`iMT zZ`m#`kVkH5l$DmTu>HtQTVh{)i>KA;QSpq~lNA-utya*tH4OHzTUU7J@>&Ib?alrc z>ejOT2kM-ebC;cc-OTiN_bvx@0S6B;8KsFG`h^pJFFC@(S|R;9`=h0g?>{BQW6PJX z=9RTv=hlDoubX?cw?~7v>Q8RI#;>KJ0cxt>IhLv&?=MelU}zDRp2f!#5*jKcnYA|F z|NpmCgSsE$;?gJ2pUz9nYm<^#e>TVG0poQZq0v?9;^A#?L!Ja|!Y0-^amr_zQx7Eq6UEY4$;s5)iP5JkBltsLCNOaW8%JDaT z`aDhZly{uP|JR9+>UQjYZChm}^}6_3u6vKRlu!l$j0nUbEESoc{gXMsHD4Q2tRzl=Va zg$L_q+TPx7SYPvBXmiGQPUpSd&(F@1dfoY4AX|9pvenz3pY`cm`2Y96T#M7!&T6N!y=9Nvo%-r5sIGcxoML|V=`izF3rikFWjvs&&_`tPp!A z@5c!h5dw{Guhp$@yLManm(76-4y%{#I&<$_TcU06+FsMNCcYJk42l=xcO1Df<3y}= z`J1T%UHyMqUcb9=J-Gkh7pb?>froY0bhsQ^tQ03_z3P+YtF>qB4D<57Em@z?ufm{s zK_b9K;lZ?YKf~N8_RTJ3+&q+#n#m`l&>+xZ zq9^$3dSP+#iIZM?>ZQwWeerONV|&Jsb6}Iv<)z;~ycK-<@afIody_!r8HyYG zZ+q(b31zW%rZG%&+x(A2@qPJ$qThz`(%Z>FVdQ&MBb@0E5Qnj{pDw diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 085187fa58b..00000000000 --- a/public/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-Agent: * -# Disallow: / diff --git a/public/static.css b/public/static.css deleted file mode 100644 index c6f92ac01d9..00000000000 --- a/public/static.css +++ /dev/null @@ -1,30 +0,0 @@ -body { - color: #666; - text-align: center; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - margin:0; - width: 800px; - margin: auto; - font-size: 14px; -} -h1 { - font-size: 56px; - line-height: 100px; - font-weight: normal; - color: #456; -} -h2 { font-size: 24px; color: #666; line-height: 1.5em; } - -h3 { - color: #456; - font-size: 20px; - font-weight: normal; - line-height: 28px; -} - -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #EEE; - border-bottom: 1px solid white; -} diff --git a/public/uploads/.gitkeep b/public/uploads/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/safe/public.pem b/safe/public.pem deleted file mode 100644 index c5ffe20a5c7..00000000000 --- a/safe/public.pem +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnp2mUaLBoHFX127ysonX -OihiGpI4098eFfH1iAxpKHIof0vs0jFF05IUScNXJZ1U3w8G1U/unY/wGGa3NzAb -ZfDd22eOF6X2Gfiey6U4w9dFf0/UT5x1bphlpX357yh4O9oWWuNaWD062DTbOOsJ -U6UW2U/sZAu/QScys0Nw+gJ58t93hb4jFq+nO5IAQc6g4S8ek5YvIXOshFEpF2in -ZLbSYowx92+9GzfjvdQ7fk0Q2ssg0zfScVa6FY8n019osz0SC3wcSd/qicdfecpu -7oycpd9YDqk4lufE1qVMOsgE8OO4KXMrByz2f+T0p/bH9zdBa5HYylf1T7i60hIL -kQIDAQAB ------END PUBLIC KEY----- diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb deleted file mode 100644 index 186239d3096..00000000000 --- a/spec/controllers/application_controller_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'spec_helper' - -describe ApplicationController do - describe '#check_password_expiration' do - let(:user) { create(:user) } - let(:controller) { ApplicationController.new } - - it 'should redirect if the user is over their password expiry' do - user.password_expires_at = Time.new(2002) - expect(user.ldap_user?).to be_falsey - allow(controller).to receive(:current_user).and_return(user) - expect(controller).to receive(:redirect_to) - expect(controller).to receive(:new_profile_password_path) - controller.send(:check_password_expiration) - end - - it 'should not redirect if the user is under their password expiry' do - user.password_expires_at = Time.now + 20010101 - expect(user.ldap_user?).to be_falsey - allow(controller).to receive(:current_user).and_return(user) - expect(controller).not_to receive(:redirect_to) - controller.send(:check_password_expiration) - end - - it 'should not redirect if the user is over their password expiry but they are an ldap user' do - user.password_expires_at = Time.new(2002) - allow(user).to receive(:ldap_user?).and_return(true) - allow(controller).to receive(:current_user).and_return(user) - expect(controller).not_to receive(:redirect_to) - controller.send(:check_password_expiration) - end - end -end diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb deleted file mode 100644 index a0909cec3bd..00000000000 --- a/spec/controllers/autocomplete_controller_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' - -describe AutocompleteController do - let!(:project) { create(:project) } - let!(:user) { create(:user) } - let!(:user2) { create(:user) } - - context 'project members' do - before do - sign_in(user) - project.team << [user, :master] - - get(:users, project_id: project.id) - end - - let(:body) { JSON.parse(response.body) } - - it { body.should be_kind_of(Array) } - it { body.size.should eq(1) } - it { body.first["username"].should == user.username } - end - - context 'group members' do - let(:group) { create(:group) } - - before do - sign_in(user) - group.add_owner(user) - - get(:users, group_id: group.id) - end - - let(:body) { JSON.parse(response.body) } - - it { body.should be_kind_of(Array) } - it { body.size.should eq(1) } - it { body.first["username"].should == user.username } - end - - context 'all users' do - before do - sign_in(user) - get(:users) - end - - let(:body) { JSON.parse(response.body) } - - it { body.should be_kind_of(Array) } - it { body.size.should eq(User.count) } - end -end diff --git a/spec/controllers/blob_controller_spec.rb b/spec/controllers/blob_controller_spec.rb deleted file mode 100644 index a1102f28340..00000000000 --- a/spec/controllers/blob_controller_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'spec_helper' - -describe Projects::BlobController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - sign_in(user) - - project.team << [user, :master] - - allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz']) - allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0']) - controller.instance_variable_set(:@project, project) - end - - describe "GET show" do - render_views - - before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) - end - - context "valid branch, valid file" do - let(:id) { 'master/README.md' } - it { is_expected.to respond_with(:success) } - end - - context "valid branch, invalid file" do - let(:id) { 'master/invalid-path.rb' } - it { is_expected.to respond_with(:not_found) } - end - - context "invalid branch, valid file" do - let(:id) { 'invalid-branch/README.md' } - it { is_expected.to respond_with(:not_found) } - end - end - - describe 'GET show with tree path' do - render_views - - before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) - controller.instance_variable_set(:@blob, nil) - end - - context 'redirect to tree' do - let(:id) { 'markdown/doc' } - it 'redirects' do - expect(subject). - to redirect_to("/#{project.path_with_namespace}/tree/markdown/doc") - end - end - end -end diff --git a/spec/controllers/branches_controller_spec.rb b/spec/controllers/branches_controller_spec.rb deleted file mode 100644 index 51397382cfb..00000000000 --- a/spec/controllers/branches_controller_spec.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'spec_helper' - -describe Projects::BranchesController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - sign_in(user) - - project.team << [user, :master] - - allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz']) - allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0']) - controller.instance_variable_set(:@project, project) - end - - describe "POST create" do - render_views - - before { - post :create, - namespace_id: project.namespace.to_param, - project_id: project.to_param, - branch_name: branch, - ref: ref - } - - context "valid branch name, valid source" do - let(:branch) { "merge_branch" } - let(:ref) { "master" } - it 'redirects' do - expect(subject). - to redirect_to("/#{project.path_with_namespace}/tree/merge_branch") - end - end - - context "invalid branch name, valid ref" do - let(:branch) { "" } - let(:ref) { "master" } - it 'redirects' do - expect(subject). - to redirect_to("/#{project.path_with_namespace}/tree/alert('merge');") - end - end - - context "valid branch name, invalid ref" do - let(:branch) { "merge_branch" } - let(:ref) { "" } - it { is_expected.to render_template('new') } - end - - context "invalid branch name, invalid ref" do - let(:branch) { "" } - let(:ref) { "" } - it { is_expected.to render_template('new') } - end - end -end diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb deleted file mode 100644 index 3394a1f863f..00000000000 --- a/spec/controllers/commit_controller_spec.rb +++ /dev/null @@ -1,91 +0,0 @@ -require 'spec_helper' - -describe Projects::CommitController do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:commit) { project.repository.commit("master") } - - before do - sign_in(user) - project.team << [user, :master] - end - - describe "#show" do - shared_examples "export as" do |format| - it "should generally work" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response).to be_success - end - - it "should generate it" do - expect_any_instance_of(Commit).to receive(:"to_#{format}") - - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - end - - it "should render it" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response.body).to eq(commit.send(:"to_#{format}")) - end - - it "should not escape Html" do - allow_any_instance_of(Commit).to receive(:"to_#{format}"). - and_return('HTML entities &<>" ') - - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response.body).to_not include('&') - expect(response.body).to_not include('>') - expect(response.body).to_not include('<') - expect(response.body).to_not include('"') - end - end - - describe "as diff" do - include_examples "export as", :diff - let(:format) { :diff } - - it "should really only be a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response.body).to start_with("diff --git") - end - end - - describe "as patch" do - include_examples "export as", :patch - let(:format) { :patch } - - it "should really be a git email patch" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response.body).to start_with("From #{commit.id}") - end - - it "should contain a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id, format: format) - - expect(response.body).to match(/^diff --git/) - end - end - end - - describe "#branches" do - it "contains branch and tags information" do - get(:branches, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: commit.id) - - expect(assigns(:branches)).to include("master", "feature_conflict") - expect(assigns(:tags)).to include("v1.1.0") - end - end -end diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/commits_controller_spec.rb deleted file mode 100644 index 2184b35152e..00000000000 --- a/spec/controllers/commits_controller_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe Projects::CommitsController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - sign_in(user) - project.team << [user, :master] - end - - describe "GET show" do - context "as atom feed" do - it "should render as atom" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: "master", format: "atom") - expect(response).to be_success - expect(response.content_type).to eq('application/atom+xml') - end - end - end -end diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb deleted file mode 100644 index c31563e6d77..00000000000 --- a/spec/controllers/import/bitbucket_controller_spec.rb +++ /dev/null @@ -1,163 +0,0 @@ -require 'spec_helper' - -describe Import::BitbucketController do - let(:user) { create(:user, bitbucket_access_token: 'asd123', bitbucket_access_token_secret: "sekret") } - - before do - sign_in(user) - controller.stub(:bitbucket_import_enabled?).and_return(true) - end - - describe "GET callback" do - before do - session[:oauth_request_token] = {} - end - - it "updates access token" do - token = "asdasd12345" - secret = "sekrettt" - access_token = double(token: token, secret: secret) - Gitlab::BitbucketImport::Client.any_instance.stub(:get_token).and_return(access_token) - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket") - - get :callback - - expect(user.reload.bitbucket_access_token).to eq(token) - expect(user.reload.bitbucket_access_token_secret).to eq(secret) - expect(controller).to redirect_to(status_import_bitbucket_url) - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(slug: 'vim', owner: 'asd') - end - - it "assigns variables" do - @project = create(:project, import_type: 'bitbucket', creator_id: user.id) - controller.stub_chain(:client, :projects).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'bitbucket', creator_id: user.id, import_source: 'asd/vim') - controller.stub_chain(:client, :projects).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - end - - describe "POST create" do - let(:bitbucket_username) { user.username } - - let(:bitbucket_user) { - { - user: { - username: bitbucket_username - } - }.with_indifferent_access - } - - let(:bitbucket_repo) { - { - slug: "vim", - owner: bitbucket_username - }.with_indifferent_access - } - - before do - allow(Gitlab::BitbucketImport::KeyAdder). - to receive(:new).with(bitbucket_repo, user). - and_return(double(execute: true)) - - controller.stub_chain(:client, :user).and_return(bitbucket_user) - controller.stub_chain(:client, :project).and_return(bitbucket_repo) - end - - context "when the repository owner is the Bitbucket user" do - context "when the Bitbucket user and GitLab user's usernames match" do - it "takes the current user's namespace" do - expect(Gitlab::BitbucketImport::ProjectCreator). - to receive(:new).with(bitbucket_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the Bitbucket user and GitLab user's usernames don't match" do - let(:bitbucket_username) { "someone_else" } - - it "takes the current user's namespace" do - expect(Gitlab::BitbucketImport::ProjectCreator). - to receive(:new).with(bitbucket_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - - context "when the repository owner is not the Bitbucket user" do - let(:other_username) { "someone_else" } - - before do - bitbucket_repo["owner"] = other_username - end - - context "when a namespace with the Bitbucket user's username already exists" do - let!(:existing_namespace) { create(:namespace, name: other_username, owner: user) } - - context "when the namespace is owned by the GitLab user" do - it "takes the existing namespace" do - expect(Gitlab::BitbucketImport::ProjectCreator). - to receive(:new).with(bitbucket_repo, existing_namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the namespace is not owned by the GitLab user" do - before do - existing_namespace.owner = create(:user) - existing_namespace.save - end - - it "doesn't create a project" do - expect(Gitlab::BitbucketImport::ProjectCreator). - not_to receive(:new) - - post :create, format: :js - end - end - end - - context "when a namespace with the Bitbucket user's username doesn't exist" do - it "creates the namespace" do - expect(Gitlab::BitbucketImport::ProjectCreator). - to receive(:new).and_return(double(execute: true)) - - post :create, format: :js - - expect(Namespace.where(name: other_username).first).not_to be_nil - end - - it "takes the new namespace" do - expect(Gitlab::BitbucketImport::ProjectCreator). - to receive(:new).with(bitbucket_repo, an_instance_of(Group), user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - end -end diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb deleted file mode 100644 index 3d3846b2e3a..00000000000 --- a/spec/controllers/import/github_controller_spec.rb +++ /dev/null @@ -1,153 +0,0 @@ -require 'spec_helper' - -describe Import::GithubController do - let(:user) { create(:user, github_access_token: 'asd123') } - - before do - sign_in(user) - controller.stub(:github_import_enabled?).and_return(true) - end - - describe "GET callback" do - it "updates access token" do - token = "asdasd12345" - allow_any_instance_of(Gitlab::GithubImport::Client). - to receive(:get_token).and_return(token) - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: 'asd123', - app_secret: 'asd123', - name: 'github') - - get :callback - - expect(user.reload.github_access_token).to eq(token) - expect(controller).to redirect_to(status_import_github_url) - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(login: 'vim', full_name: 'asd/vim') - @org = OpenStruct.new(login: 'company') - @org_repo = OpenStruct.new(login: 'company', full_name: 'company/repo') - end - - it "assigns variables" do - @project = create(:project, import_type: 'github', creator_id: user.id) - controller.stub_chain(:client, :repos).and_return([@repo]) - controller.stub_chain(:client, :orgs).and_return([@org]) - controller.stub_chain(:client, :org_repos).with(@org.login).and_return([@org_repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo, @org_repo]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'github', creator_id: user.id, import_source: 'asd/vim') - controller.stub_chain(:client, :repos).and_return([@repo]) - controller.stub_chain(:client, :orgs).and_return([]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - end - - describe "POST create" do - let(:github_username) { user.username } - - let(:github_user) { - OpenStruct.new(login: github_username) - } - - let(:github_repo) { - OpenStruct.new(name: 'vim', full_name: "#{github_username}/vim", owner: OpenStruct.new(login: github_username)) - } - - before do - controller.stub_chain(:client, :user).and_return(github_user) - controller.stub_chain(:client, :repo).and_return(github_repo) - end - - context "when the repository owner is the GitHub user" do - context "when the GitHub user and GitLab user's usernames match" do - it "takes the current user's namespace" do - expect(Gitlab::GithubImport::ProjectCreator). - to receive(:new).with(github_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the GitHub user and GitLab user's usernames don't match" do - let(:github_username) { "someone_else" } - - it "takes the current user's namespace" do - expect(Gitlab::GithubImport::ProjectCreator). - to receive(:new).with(github_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - - context "when the repository owner is not the GitHub user" do - let(:other_username) { "someone_else" } - - before do - github_repo.owner = OpenStruct.new(login: other_username) - end - - context "when a namespace with the GitHub user's username already exists" do - let!(:existing_namespace) { create(:namespace, name: other_username, owner: user) } - - context "when the namespace is owned by the GitLab user" do - it "takes the existing namespace" do - expect(Gitlab::GithubImport::ProjectCreator). - to receive(:new).with(github_repo, existing_namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the namespace is not owned by the GitLab user" do - before do - existing_namespace.owner = create(:user) - existing_namespace.save - end - - it "doesn't create a project" do - expect(Gitlab::GithubImport::ProjectCreator). - not_to receive(:new) - - post :create, format: :js - end - end - end - - context "when a namespace with the GitHub user's username doesn't exist" do - it "creates the namespace" do - expect(Gitlab::GithubImport::ProjectCreator). - to receive(:new).and_return(double(execute: true)) - - post :create, format: :js - - expect(Namespace.where(name: other_username).first).not_to be_nil - end - - it "takes the new namespace" do - expect(Gitlab::GithubImport::ProjectCreator). - to receive(:new).with(github_repo, an_instance_of(Group), user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - end -end diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb deleted file mode 100644 index 112e51d431e..00000000000 --- a/spec/controllers/import/gitlab_controller_spec.rb +++ /dev/null @@ -1,152 +0,0 @@ -require 'spec_helper' - -describe Import::GitlabController do - let(:user) { create(:user, gitlab_access_token: 'asd123') } - - before do - sign_in(user) - controller.stub(:gitlab_import_enabled?).and_return(true) - end - - describe "GET callback" do - it "updates access token" do - token = "asdasd12345" - Gitlab::GitlabImport::Client.any_instance.stub_chain(:client, :auth_code, :get_token, :token).and_return(token) - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "gitlab") - - get :callback - - expect(user.reload.gitlab_access_token).to eq(token) - expect(controller).to redirect_to(status_import_gitlab_url) - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(path: 'vim', path_with_namespace: 'asd/vim') - end - - it "assigns variables" do - @project = create(:project, import_type: 'gitlab', creator_id: user.id) - controller.stub_chain(:client, :projects).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'gitlab', creator_id: user.id, import_source: 'asd/vim') - controller.stub_chain(:client, :projects).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - end - - describe "POST create" do - let(:gitlab_username) { user.username } - - let(:gitlab_user) { - { - username: gitlab_username - }.with_indifferent_access - } - - let(:gitlab_repo) { - { - path: 'vim', - path_with_namespace: "#{gitlab_username}/vim", - owner: { name: gitlab_username }, - namespace: { path: gitlab_username } - }.with_indifferent_access - } - - before do - controller.stub_chain(:client, :user).and_return(gitlab_user) - controller.stub_chain(:client, :project).and_return(gitlab_repo) - end - - context "when the repository owner is the GitLab.com user" do - context "when the GitLab.com user and GitLab server user's usernames match" do - it "takes the current user's namespace" do - expect(Gitlab::GitlabImport::ProjectCreator). - to receive(:new).with(gitlab_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the GitLab.com user and GitLab server user's usernames don't match" do - let(:gitlab_username) { "someone_else" } - - it "takes the current user's namespace" do - expect(Gitlab::GitlabImport::ProjectCreator). - to receive(:new).with(gitlab_repo, user.namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - - context "when the repository owner is not the GitLab.com user" do - let(:other_username) { "someone_else" } - - before do - gitlab_repo["namespace"]["path"] = other_username - end - - context "when a namespace with the GitLab.com user's username already exists" do - let!(:existing_namespace) { create(:namespace, name: other_username, owner: user) } - - context "when the namespace is owned by the GitLab server user" do - it "takes the existing namespace" do - expect(Gitlab::GitlabImport::ProjectCreator). - to receive(:new).with(gitlab_repo, existing_namespace, user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - - context "when the namespace is not owned by the GitLab server user" do - before do - existing_namespace.owner = create(:user) - existing_namespace.save - end - - it "doesn't create a project" do - expect(Gitlab::GitlabImport::ProjectCreator). - not_to receive(:new) - - post :create, format: :js - end - end - end - - context "when a namespace with the GitLab.com user's username doesn't exist" do - it "creates the namespace" do - expect(Gitlab::GitlabImport::ProjectCreator). - to receive(:new).and_return(double(execute: true)) - - post :create, format: :js - - expect(Namespace.where(name: other_username).first).not_to be_nil - end - - it "takes the new namespace" do - expect(Gitlab::GitlabImport::ProjectCreator). - to receive(:new).with(gitlab_repo, an_instance_of(Group), user). - and_return(double(execute: true)) - - post :create, format: :js - end - end - end - end -end diff --git a/spec/controllers/import/gitorious_controller_spec.rb b/spec/controllers/import/gitorious_controller_spec.rb deleted file mode 100644 index 07c9484bf1a..00000000000 --- a/spec/controllers/import/gitorious_controller_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'spec_helper' - -describe Import::GitoriousController do - let(:user) { create(:user) } - - before do - sign_in(user) - end - - describe "GET new" do - it "redirects to import endpoint on gitorious.org" do - get :new - - expect(controller).to redirect_to("https://gitorious.org/gitlab-import?callback_url=http://test.host/import/gitorious/callback") - end - end - - describe "GET callback" do - it "stores repo list in session" do - get :callback, repos: 'foo/bar,baz/qux' - - expect(session[:gitorious_repos]).to eq('foo/bar,baz/qux') - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(full_name: 'asd/vim') - end - - it "assigns variables" do - @project = create(:project, import_type: 'gitorious', creator_id: user.id) - controller.stub_chain(:client, :repos).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'gitorious', creator_id: user.id, import_source: 'asd/vim') - controller.stub_chain(:client, :repos).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - end - - describe "POST create" do - before do - @repo = Gitlab::GitoriousImport::Repository.new('asd/vim') - end - - it "takes already existing namespace" do - namespace = create(:namespace, name: "asd", owner: user) - expect(Gitlab::GitoriousImport::ProjectCreator). - to receive(:new).with(@repo, namespace, user). - and_return(double(execute: true)) - controller.stub_chain(:client, :repo).and_return(@repo) - - post :create, format: :js - end - end -end diff --git a/spec/controllers/import/google_code_controller_spec.rb b/spec/controllers/import/google_code_controller_spec.rb deleted file mode 100644 index 037cddb4600..00000000000 --- a/spec/controllers/import/google_code_controller_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'spec_helper' - -describe Import::GoogleCodeController do - let(:user) { create(:user) } - let(:dump_file) { fixture_file_upload(Rails.root + 'spec/fixtures/GoogleCodeProjectHosting.json', 'application/json') } - - before do - sign_in(user) - end - - describe "POST callback" do - it "stores Google Takeout dump list in session" do - post :callback, dump_file: dump_file - - expect(session[:google_code_dump]).to be_a(Hash) - expect(session[:google_code_dump]["kind"]).to eq("projecthosting#user") - expect(session[:google_code_dump]).to have_key("projects") - end - end - - describe "GET status" do - before do - @repo = OpenStruct.new(name: 'vim') - controller.stub_chain(:client, :valid?).and_return(true) - end - - it "assigns variables" do - @project = create(:project, import_type: 'google_code', creator_id: user.id) - controller.stub_chain(:client, :repos).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([@repo]) - end - - it "does not show already added project" do - @project = create(:project, import_type: 'google_code', creator_id: user.id, import_source: 'vim') - controller.stub_chain(:client, :repos).and_return([@repo]) - - get :status - - expect(assigns(:already_added_projects)).to eq([@project]) - expect(assigns(:repos)).to eq([]) - end - end -end diff --git a/spec/controllers/merge_requests_controller_spec.rb b/spec/controllers/merge_requests_controller_spec.rb deleted file mode 100644 index d6f56ed33d6..00000000000 --- a/spec/controllers/merge_requests_controller_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper' - -describe Projects::MergeRequestsController do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } - - before do - sign_in(user) - project.team << [user, :master] - end - - describe "#show" do - shared_examples "export merge as" do |format| - it "should generally work" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response).to be_success - end - - it "should generate it" do - expect_any_instance_of(MergeRequest).to receive(:"to_#{format}") - - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - end - - it "should render it" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response.body).to eq((merge_request.send(:"to_#{format}",user)).to_s) - end - - it "should not escape Html" do - allow_any_instance_of(MergeRequest).to receive(:"to_#{format}"). - and_return('HTML entities &<>" ') - - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response.body).to_not include('&') - expect(response.body).to_not include('>') - expect(response.body).to_not include('<') - expect(response.body).to_not include('"') - end - end - - describe "as diff" do - include_examples "export merge as", :diff - let(:format) { :diff } - - it "should really only be a git diff" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response.body).to start_with("diff --git") - end - end - - describe "as patch" do - include_examples "export merge as", :patch - let(:format) { :patch } - - it "should really be a git email patch with commit" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}") - end - - it "should contain git diffs" do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: merge_request.iid, format: format) - - expect(response.body).to match(/^diff --git/) - end - end - end -end diff --git a/spec/controllers/namespaces_controller_spec.rb b/spec/controllers/namespaces_controller_spec.rb deleted file mode 100644 index 9c8619722cd..00000000000 --- a/spec/controllers/namespaces_controller_spec.rb +++ /dev/null @@ -1,121 +0,0 @@ -require 'spec_helper' - -describe NamespacesController do - let!(:user) { create(:user, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } - - describe "GET show" do - context "when the namespace belongs to a user" do - let!(:other_user) { create(:user) } - - it "redirects to the user's page" do - get :show, id: other_user.username - - expect(response).to redirect_to(user_path(other_user)) - end - end - - context "when the namespace belongs to a group" do - let!(:group) { create(:group) } - let!(:project) { create(:project, namespace: group) } - - context "when the group has public projects" do - before do - project.update_attribute(:visibility_level, Project::PUBLIC) - end - - context "when not signed in" do - it "redirects to the group's page" do - get :show, id: group.path - - expect(response).to redirect_to(group_path(group)) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - it "redirects to the group's page" do - get :show, id: group.path - - expect(response).to redirect_to(group_path(group)) - end - end - end - - context "when the project doesn't have public projects" do - context "when not signed in" do - it "redirects to the sign in page" do - get :show, id: group.path - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - context "when the user has access to the project" do - before do - project.team << [user, :master] - end - - context "when the user is blocked" do - before do - user.block - project.team << [user, :master] - end - - it "redirects to the sign in page" do - get :show, id: group.path - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when the user isn't blocked" do - it "redirects to the group's page" do - get :show, id: group.path - - expect(response).to redirect_to(group_path(group)) - end - end - end - - context "when the user doesn't have access to the project" do - it "responds with status 404" do - get :show, id: group.path - - expect(response.status).to eq(404) - end - end - end - end - end - - context "when the namespace doesn't exist" do - context "when signed in" do - before do - sign_in(user) - end - - it "responds with status 404" do - get :show, id: "doesntexist" - - expect(response.status).to eq(404) - end - end - - context "when not signed in" do - it "redirects to the sign in page" do - get :show, id: "doesntexist" - - expect(response).to redirect_to(new_user_session_path) - end - end - end - end -end diff --git a/spec/controllers/profile_keys_controller_spec.rb b/spec/controllers/profile_keys_controller_spec.rb deleted file mode 100644 index 593d3e9eb56..00000000000 --- a/spec/controllers/profile_keys_controller_spec.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'spec_helper' - -describe Profiles::KeysController do - let(:user) { create(:user) } - - describe "#get_keys" do - describe "non existant user" do - it "should generally not work" do - get :get_keys, username: 'not-existent' - - expect(response).not_to be_success - end - end - - describe "user with no keys" do - it "should generally work" do - get :get_keys, username: user.username - - expect(response).to be_success - end - - it "should render all keys separated with a new line" do - get :get_keys, username: user.username - - expect(response.body).to eq("") - end - - it "should respond with text/plain content type" do - get :get_keys, username: user.username - expect(response.content_type).to eq("text/plain") - end - end - - describe "user with keys" do - before do - user.keys << create(:key) - user.keys << create(:another_key) - end - - it "should generally work" do - get :get_keys, username: user.username - - expect(response).to be_success - end - - it "should render all keys separated with a new line" do - get :get_keys, username: user.username - - expect(response.body).not_to eq("") - expect(response.body).to eq(user.all_ssh_keys.join("\n")) - end - - it "should respond with text/plain content type" do - get :get_keys, username: user.username - expect(response.content_type).to eq("text/plain") - end - end - end -end diff --git a/spec/controllers/projects/protected_branches_controller_spec.rb b/spec/controllers/projects/protected_branches_controller_spec.rb deleted file mode 100644 index 596d8d34b7c..00000000000 --- a/spec/controllers/projects/protected_branches_controller_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ -require('spec_helper') - -describe Projects::ProtectedBranchesController do - describe "GET #index" do - let(:project) { create(:project_empty_repo, :public) } - it "redirect empty repo to projects page" do - get(:index, namespace_id: project.namespace.to_param, project_id: project.to_param) - end - end -end diff --git a/spec/controllers/projects/refs_controller_spec.rb b/spec/controllers/projects/refs_controller_spec.rb deleted file mode 100644 index c254ab7cb6e..00000000000 --- a/spec/controllers/projects/refs_controller_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'spec_helper' - -describe Projects::RefsController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - sign_in(user) - project.team << [user, :developer] - end - - describe 'GET #logs_tree' do - def default_get(format = :html) - get :logs_tree, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: 'master', - path: 'foo/bar/baz.html', format: format - end - - def xhr_get(format = :html) - xhr :get, :logs_tree, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: 'master', - path: 'foo/bar/baz.html', format: format - end - - it 'never throws MissingTemplate' do - expect { default_get }.not_to raise_error - expect { xhr_get }.not_to raise_error - end - - it 'renders 404 for non-JS requests' do - xhr_get - - expect(response).to be_not_found - end - - it 'renders JS' do - xhr_get(:js) - expect(response).to be_success - end - end -end diff --git a/spec/controllers/projects/repositories_controller_spec.rb b/spec/controllers/projects/repositories_controller_spec.rb deleted file mode 100644 index 91856ed0cc0..00000000000 --- a/spec/controllers/projects/repositories_controller_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require "spec_helper" - -describe Projects::RepositoriesController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - describe "GET archive" do - before do - sign_in(user) - project.team << [user, :developer] - - allow(ArchiveRepositoryService).to receive(:new).and_return(service) - end - - let(:service) { ArchiveRepositoryService.new(project, "master", "zip") } - - it "executes ArchiveRepositoryService" do - expect(ArchiveRepositoryService).to receive(:new).with(project, "master", "zip") - expect(service).to receive(:execute) - - get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip" - end - - context "when the service raises an error" do - - before do - allow(service).to receive(:execute).and_raise("Archive failed") - end - - it "renders Not Found" do - get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip" - - expect(response.status).to eq(404) - end - end - - context "when the service doesn't return a path" do - - before do - allow(service).to receive(:execute).and_return(nil) - end - - it "reloads the page" do - get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip" - - expect(response).to redirect_to(archive_namespace_project_repository_path(project.namespace, project, ref: "master", format: "zip")) - end - end - - context "when the service returns a path" do - - let(:path) { Rails.root.join("spec/fixtures/dk.png").to_s } - - before do - allow(service).to receive(:execute).and_return(path) - end - - it "sends the file" do - get :archive, namespace_id: project.namespace.path, project_id: project.path, ref: "master", format: "zip" - - expect(response.body).to eq(File.binread(path)) - end - end - end -end diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb deleted file mode 100644 index a1b82a32150..00000000000 --- a/spec/controllers/projects_controller_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -require('spec_helper') - -describe ProjectsController do - let(:project) { create(:project) } - let(:public_project) { create(:project, :public) } - let(:user) { create(:user) } - let(:jpg) { fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') } - let(:txt) { fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') } - - describe "GET show" do - - context "when requested by `go get`" do - render_views - - it "renders the go-import meta tag" do - get :show, "go-get" => "1", namespace_id: "bogus_namespace", id: "bogus_project" - - expect(response.body).to include("name='go-import'") - - content = "localhost/bogus_namespace/bogus_project git http://localhost/bogus_namespace/bogus_project.git" - expect(response.body).to include("content='#{content}'") - end - end - end - - describe "POST #toggle_star" do - it "toggles star if user is signed in" do - sign_in(user) - expect(user.starred?(public_project)).to be_falsey - post(:toggle_star, namespace_id: public_project.namespace.to_param, - id: public_project.to_param) - expect(user.starred?(public_project)).to be_truthy - post(:toggle_star, namespace_id: public_project.namespace.to_param, - id: public_project.to_param) - expect(user.starred?(public_project)).to be_falsey - end - - it "does nothing if user is not signed in" do - post(:toggle_star, namespace_id: project.namespace.to_param, - id: public_project.to_param) - expect(user.starred?(public_project)).to be_falsey - post(:toggle_star, namespace_id: project.namespace.to_param, - id: public_project.to_param) - expect(user.starred?(public_project)).to be_falsey - end - end -end diff --git a/spec/controllers/tree_controller_spec.rb b/spec/controllers/tree_controller_spec.rb deleted file mode 100644 index 7b219819bbc..00000000000 --- a/spec/controllers/tree_controller_spec.rb +++ /dev/null @@ -1,64 +0,0 @@ -require 'spec_helper' - -describe Projects::TreeController do - let(:project) { create(:project) } - let(:user) { create(:user) } - - before do - sign_in(user) - - project.team << [user, :master] - - allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz']) - allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0']) - controller.instance_variable_set(:@project, project) - end - - describe "GET show" do - # Make sure any errors accessing the tree in our views bubble up to this spec - render_views - - before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) - end - - context "valid branch, no path" do - let(:id) { 'master' } - it { is_expected.to respond_with(:success) } - end - - context "valid branch, valid path" do - let(:id) { 'master/encoding/' } - it { is_expected.to respond_with(:success) } - end - - context "valid branch, invalid path" do - let(:id) { 'master/invalid-path/' } - it { is_expected.to respond_with(:not_found) } - end - - context "invalid branch, valid path" do - let(:id) { 'invalid-branch/encoding/' } - it { is_expected.to respond_with(:not_found) } - end - end - - describe 'GET show with blob path' do - render_views - - before do - get(:show, namespace_id: project.namespace.to_param, - project_id: project.to_param, id: id) - end - - context 'redirect to blob' do - let(:id) { 'master/README.md' } - it 'redirects' do - redirect_url = "/#{project.path_with_namespace}/blob/master/README.md" - expect(subject). - to redirect_to(redirect_url) - end - end - end -end diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb deleted file mode 100644 index 0f9780356b1..00000000000 --- a/spec/controllers/uploads_controller_spec.rb +++ /dev/null @@ -1,296 +0,0 @@ -require 'spec_helper' - -describe UploadsController do - let!(:user) { create(:user, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } - - describe "GET show" do - context "when viewing a user avatar" do - context "when signed in" do - before do - sign_in(user) - end - - context "when the user is blocked" do - before do - user.block - end - - it "redirects to the sign in page" do - get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when the user isn't blocked" do - it "responds with status 200" do - get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when not signed in" do - it "responds with status 200" do - get :show, model: "user", mounted_as: "avatar", id: user.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when viewing a project avatar" do - let!(:project) { create(:project, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } - - context "when the project is public" do - before do - project.update_attribute(:visibility_level, Project::PUBLIC) - end - - context "when not signed in" do - it "responds with status 200" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - it "responds with status 200" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the project is private" do - before do - project.update_attribute(:visibility_level, Project::PRIVATE) - end - - context "when not signed in" do - it "redirects to the sign in page" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - context "when the user has access to the project" do - before do - project.team << [user, :master] - end - - context "when the user is blocked" do - before do - user.block - project.team << [user, :master] - end - - it "redirects to the sign in page" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when the user isn't blocked" do - it "responds with status 200" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the user doesn't have access to the project" do - it "responds with status 404" do - get :show, model: "project", mounted_as: "avatar", id: project.id, filename: "image.png" - - expect(response.status).to eq(404) - end - end - end - end - end - - context "when viewing a group avatar" do - let!(:group) { create(:group, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } - let!(:project) { create(:project, namespace: group) } - - context "when the group has public projects" do - before do - project.update_attribute(:visibility_level, Project::PUBLIC) - end - - context "when not signed in" do - it "responds with status 200" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - it "responds with status 200" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the project doesn't have public projects" do - context "when not signed in" do - it "redirects to the sign in page" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - context "when the user has access to the project" do - before do - project.team << [user, :master] - end - - context "when the user is blocked" do - before do - user.block - project.team << [user, :master] - end - - it "redirects to the sign in page" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when the user isn't blocked" do - it "responds with status 200" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the user doesn't have access to the project" do - it "responds with status 404" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response.status).to eq(404) - end - end - end - end - end - - context "when viewing a note attachment" do - let!(:note) { create(:note, :with_attachment) } - let(:project) { note.project } - - context "when the project is public" do - before do - project.update_attribute(:visibility_level, Project::PUBLIC) - end - - context "when not signed in" do - it "responds with status 200" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - it "responds with status 200" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the project is private" do - before do - project.update_attribute(:visibility_level, Project::PRIVATE) - end - - context "when not signed in" do - it "redirects to the sign in page" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when signed in" do - before do - sign_in(user) - end - - context "when the user has access to the project" do - before do - project.team << [user, :master] - end - - context "when the user is blocked" do - before do - user.block - project.team << [user, :master] - end - - it "redirects to the sign in page" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - - context "when the user isn't blocked" do - it "responds with status 200" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response.status).to eq(200) - end - end - end - - context "when the user doesn't have access to the project" do - it "responds with status 404" do - get :show, model: "note", mounted_as: "attachment", id: note.id, filename: "image.png" - - expect(response.status).to eq(404) - end - end - end - end - end - end -end diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb deleted file mode 100644 index d47a37914df..00000000000 --- a/spec/controllers/users_controller_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'spec_helper' - -describe UsersController do - let(:user) { create(:user, username: 'user1', name: 'User 1', email: 'user1@gitlab.com') } - - before do - sign_in(user) - end - - describe 'GET #show' do - render_views - - it 'renders the show template' do - get :show, username: user.username - expect(response.status).to eq(200) - expect(response).to render_template('show') - end - end - - describe 'GET #calendar' do - it 'renders calendar' do - get :calendar, username: user.username - expect(response).to render_template('calendar') - end - end - - describe 'GET #calendar_activities' do - let!(:project) { create(:project) } - let!(:user) { create(:user) } - - before do - allow_any_instance_of(User).to receive(:contributed_projects_ids).and_return([project.id]) - project.team << [user, :developer] - end - - it 'assigns @calendar_date' do - get :calendar_activities, username: user.username, date: '2014-07-31' - expect(assigns(:calendar_date)).to eq(Date.parse('2014-07-31')) - end - - it 'renders calendar_activities' do - get :calendar_activities, username: user.username - expect(response).to render_template('calendar_activities') - end - end -end diff --git a/spec/factories.rb b/spec/factories.rb deleted file mode 100644 index a5c335c82bc..00000000000 --- a/spec/factories.rb +++ /dev/null @@ -1,193 +0,0 @@ -include ActionDispatch::TestProcess - -FactoryGirl.define do - sequence :sentence, aliases: [:title, :content] do - Faker::Lorem.sentence - end - - sequence :name do - Faker::Name.name - end - - sequence :file_name do - Faker::Internet.user_name - end - - sequence(:url) { Faker::Internet.uri('http') } - - factory :user, aliases: [:author, :assignee, :owner, :creator] do - email { Faker::Internet.email } - name - sequence(:username) { |n| "#{Faker::Internet.user_name}#{n}" } - password "12345678" - confirmed_at { Time.now } - confirmation_token { nil } - - trait :admin do - admin true - end - - factory :omniauth_user do - ignore do - extern_uid '123456' - provider 'ldapmain' - end - - after(:create) do |user, evaluator| - user.identities << create(:identity, - provider: evaluator.provider, - extern_uid: evaluator.extern_uid - ) - end - end - - factory :admin, traits: [:admin] - end - - factory :group do - sequence(:name) { |n| "group#{n}" } - path { name.downcase.gsub(/\s/, '_') } - type 'Group' - end - - factory :namespace do - sequence(:name) { |n| "namespace#{n}" } - path { name.downcase.gsub(/\s/, '_') } - owner - end - - factory :project_member do - user - project - access_level { ProjectMember::MASTER } - end - - factory :issue do - title - author - project - - trait :closed do - state :closed - end - - trait :reopened do - state :reopened - end - - factory :closed_issue, traits: [:closed] - factory :reopened_issue, traits: [:reopened] - end - - factory :event do - factory :closed_issue_event do - project - action { Event::CLOSED } - target factory: :closed_issue - author factory: :user - end - end - - factory :key do - title - key do - "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" - end - - factory :deploy_key, class: 'DeployKey' do - end - - factory :personal_key do - user - end - - factory :another_key do - key do - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmTillFzNTrrGgwaCKaSj+QCz81E6jBc/s9av0+3b1Hwfxgkqjl4nAK/OD2NjgyrONDTDfR8cRN4eAAy6nY8GLkOyYBDyuc5nTMqs5z3yVuTwf3koGm/YQQCmo91psZ2BgDFTor8SVEE5Mm1D1k3JDMhDFxzzrOtRYFPci9lskTJaBjpqWZ4E9rDTD2q/QZntCqbC3wE9uSemRQB5f8kik7vD/AD8VQXuzKladrZKkzkONCPWsXDspUitjM8HkQdOf0PsYn1CMUC1xKYbCxkg5TkEosIwGv6CoEArUrdu/4+10LVslq494mAvEItywzrluCLCnwELfW+h/m8UHoVhZ" - end - - factory :another_deploy_key, class: 'DeployKey' do - end - end - end - - factory :email do - user - email do - Faker::Internet.email('alias') - end - - factory :another_email do - email do - Faker::Internet.email('another.alias') - end - end - end - - factory :milestone do - title - project - - trait :closed do - state :closed - end - - factory :closed_milestone, traits: [:closed] - end - - factory :system_hook do - url - end - - factory :project_hook do - url - end - - factory :project_snippet do - project - author - title - content - file_name - end - - factory :personal_snippet do - author - title - content - file_name - end - - factory :snippet do - author - title - content - file_name - end - - factory :protected_branch do - name - project - end - - factory :service do - type "" - title "GitLab CI" - project - end - - factory :service_hook do - url - service - end - - factory :deploy_keys_project do - deploy_key - project - end - - factory :identity do - provider 'ldapmain' - extern_uid 'my-ldap-id' - end -end diff --git a/spec/factories/broadcast_messages.rb b/spec/factories/broadcast_messages.rb deleted file mode 100644 index ea0039d39e6..00000000000 --- a/spec/factories/broadcast_messages.rb +++ /dev/null @@ -1,27 +0,0 @@ -# == Schema Information -# -# Table name: broadcast_messages -# -# id :integer not null, primary key -# message :text not null -# starts_at :datetime -# ends_at :datetime -# alert_type :integer -# created_at :datetime -# updated_at :datetime -# color :string(255) -# font :string(255) -# - -# Read about factories at https://github.com/thoughtbot/factory_girl - -FactoryGirl.define do - factory :broadcast_message do - message "MyText" - starts_at "2013-11-12 13:43:25" - ends_at "2013-11-12 13:43:25" - alert_type 1 - color "#555555" - font "#BBBBBB" - end -end diff --git a/spec/factories/forked_project_links.rb b/spec/factories/forked_project_links.rb deleted file mode 100644 index 906e4106b32..00000000000 --- a/spec/factories/forked_project_links.rb +++ /dev/null @@ -1,19 +0,0 @@ -# == Schema Information -# -# Table name: forked_project_links -# -# id :integer not null, primary key -# forked_to_project_id :integer not null -# forked_from_project_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -# Read about factories at https://github.com/thoughtbot/factory_girl - -FactoryGirl.define do - factory :forked_project_link do - association :forked_to_project, factory: :project - association :forked_from_project, factory: :project - end -end diff --git a/spec/factories/group_members.rb b/spec/factories/group_members.rb deleted file mode 100644 index debb86d997f..00000000000 --- a/spec/factories/group_members.rb +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: group_members -# -# id :integer not null, primary key -# group_access :integer not null -# group_id :integer not null -# user_id :integer not null -# created_at :datetime -# updated_at :datetime -# notification_level :integer default(3), not null -# - -FactoryGirl.define do - factory :group_member do - access_level { GroupMember::OWNER } - group - user - end -end diff --git a/spec/factories/label_links.rb b/spec/factories/label_links.rb deleted file mode 100644 index bd304b5db6b..00000000000 --- a/spec/factories/label_links.rb +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: label_links -# -# id :integer not null, primary key -# label_id :integer -# target_id :integer -# target_type :string(255) -# created_at :datetime -# updated_at :datetime -# - -# Read about factories at https://github.com/thoughtbot/factory_girl - -FactoryGirl.define do - factory :label_link do - label - target factory: :issue - end -end diff --git a/spec/factories/labels.rb b/spec/factories/labels.rb deleted file mode 100644 index 6829387c660..00000000000 --- a/spec/factories/labels.rb +++ /dev/null @@ -1,21 +0,0 @@ -# == Schema Information -# -# Table name: labels -# -# id :integer not null, primary key -# title :string(255) -# color :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# - -# Read about factories at https://github.com/thoughtbot/factory_girl - -FactoryGirl.define do - factory :label do - title "Bug" - color "#990000" - project - end -end diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb deleted file mode 100644 index 77cd37c22d9..00000000000 --- a/spec/factories/merge_requests.rb +++ /dev/null @@ -1,70 +0,0 @@ -# == Schema Information -# -# Table name: merge_requests -# -# id :integer not null, primary key -# target_branch :string(255) not null -# source_branch :string(255) not null -# source_project_id :integer not null -# author_id :integer -# assignee_id :integer -# title :string(255) -# created_at :datetime -# updated_at :datetime -# milestone_id :integer -# state :string(255) -# merge_status :string(255) -# target_project_id :integer not null -# iid :integer -# description :text -# position :integer default(0) -# locked_at :datetime -# - -FactoryGirl.define do - factory :merge_request do - title - author - source_project factory: :project - target_project { source_project } - - # → git log --pretty=oneline feature..master - # 5937ac0a7beb003549fc5fd26fc247adbce4a52e Add submodule from gitlab.com - # 570e7b2abdd848b95f2f578043fc23bd6f6fd24d Change some files - # 6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9 More submodules - # d14d6c0abdd253381df51a723d58691b2ee1ab08 Remove ds_store files - # c1acaa58bbcbc3eafe538cb8274ba387047b69f8 Ignore DS files - # - # See also RepoHelpers.sample_compare - # - source_branch "master" - target_branch "feature" - - merge_status "can_be_merged" - - trait :with_diffs do - end - - trait :conflict do - source_branch "feature_conflict" - target_branch "feature" - end - - trait :closed do - state :closed - end - - trait :reopened do - state :reopened - end - - trait :simple do - source_branch "feature" - target_branch "master" - end - - factory :closed_merge_request, traits: [:closed] - factory :reopened_merge_request, traits: [:reopened] - factory :merge_request_with_diffs, traits: [:with_diffs] - end -end diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb deleted file mode 100644 index f1c33461b55..00000000000 --- a/spec/factories/notes.rb +++ /dev/null @@ -1,65 +0,0 @@ -# == Schema Information -# -# Table name: notes -# -# id :integer not null, primary key -# note :text -# noteable_type :string(255) -# author_id :integer -# created_at :datetime -# updated_at :datetime -# project_id :integer -# attachment :string(255) -# line_code :string(255) -# commit_id :string(255) -# noteable_id :integer -# system :boolean default(FALSE), not null -# st_diff :text -# - -require_relative '../support/repo_helpers' - -FactoryGirl.define do - factory :note do - project - note "Note" - author - - factory :note_on_commit, traits: [:on_commit] - factory :note_on_commit_diff, traits: [:on_commit, :on_diff] - factory :note_on_issue, traits: [:on_issue], aliases: [:votable_note] - factory :note_on_merge_request, traits: [:on_merge_request] - factory :note_on_merge_request_diff, traits: [:on_merge_request, :on_diff] - factory :note_on_project_snippet, traits: [:on_project_snippet] - - trait :on_commit do - project factory: :project - commit_id RepoHelpers.sample_commit.id - noteable_type "Commit" - end - - trait :on_diff do - line_code "0_184_184" - end - - trait :on_merge_request do - project factory: :project - noteable_id 1 - noteable_type "MergeRequest" - end - - trait :on_issue do - noteable_id 1 - noteable_type "Issue" - end - - trait :on_project_snippet do - noteable_id 1 - noteable_type "Snippet" - end - - trait :with_attachment do - attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "`/png") } - end - end -end diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb deleted file mode 100644 index 0899a7603fc..00000000000 --- a/spec/factories/projects.rb +++ /dev/null @@ -1,95 +0,0 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime -# updated_at :datetime -# creator_id :integer -# issues_enabled :boolean default(TRUE), not null -# wall_enabled :boolean default(TRUE), not null -# merge_requests_enabled :boolean default(TRUE), not null -# wiki_enabled :boolean default(TRUE), not null -# namespace_id :integer -# issues_tracker :string(255) default("gitlab"), not null -# issues_tracker_id :string(255) -# snippets_enabled :boolean default(TRUE), not null -# last_activity_at :datetime -# import_url :string(255) -# visibility_level :integer default(0), not null -# archived :boolean default(FALSE), not null -# import_status :string(255) -# repository_size :float default(0.0) -# star_count :integer default(0), not null -# import_type :string(255) -# import_source :string(255) -# avatar :string(255) -# - -FactoryGirl.define do - # Project without repository - # - # Project does not have bare repository. - # Use this factory if you dont need repository in tests - factory :empty_project, class: 'Project' do - sequence(:name) { |n| "project#{n}" } - path { name.downcase.gsub(/\s/, '_') } - namespace - creator - snippets_enabled true - - trait :public do - visibility_level Gitlab::VisibilityLevel::PUBLIC - end - - trait :internal do - visibility_level Gitlab::VisibilityLevel::INTERNAL - end - - trait :private do - visibility_level Gitlab::VisibilityLevel::PRIVATE - end - end - - # Project with empty repository - # - # This is a case when you just created a project - # but not pushed any code there yet - factory :project_empty_repo, parent: :empty_project do - after :create do |project| - project.create_repository - end - end - - # Project with test repository - # - # Test repository source can be found at - # https://gitlab.com/gitlab-org/gitlab-test - factory :project, parent: :empty_project do - path { 'gitlabhq' } - - after :create do |project| - TestEnv.copy_repo(project) - end - end - - factory :redmine_project, parent: :project do - after :create do |project| - project.create_redmine_service( - active: true, - properties: { - 'project_url' => 'http://redmine/projects/project_name_in_redmine', - 'issues_url' => "http://redmine/#{project.id}/project_name_in_redmine/:id", - 'new_issue_url' => 'http://redmine/projects/project_name_in_redmine/issues/new' - } - ) - end - after :create do |project| - project.issues_tracker = 'redmine' - project.issues_tracker_id = 'project_name_in_redmine' - end - end -end diff --git a/spec/factories_spec.rb b/spec/factories_spec.rb deleted file mode 100644 index 457859dedaf..00000000000 --- a/spec/factories_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -require 'spec_helper' - -FactoryGirl.factories.map(&:name).each do |factory_name| - describe "#{factory_name} factory" do - it 'should be valid' do - expect(build(factory_name)).to be_valid - end - end -end diff --git a/spec/features/admin/admin_hooks_spec.rb b/spec/features/admin/admin_hooks_spec.rb deleted file mode 100644 index 25862614d28..00000000000 --- a/spec/features/admin/admin_hooks_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' - -describe "Admin::Hooks", feature: true do - before do - @project = create(:project) - login_as :admin - - @system_hook = create(:system_hook) - - end - - describe "GET /admin/hooks" do - it "should be ok" do - visit admin_root_path - within ".sidebar-wrapper" do - click_on "Hooks" - end - expect(current_path).to eq(admin_hooks_path) - end - - it "should have hooks list" do - visit admin_hooks_path - expect(page).to have_content(@system_hook.url) - end - end - - describe "New Hook" do - before do - @url = Faker::Internet.uri("http") - visit admin_hooks_path - fill_in "hook_url", with: @url - expect { click_button "Add System Hook" }.to change(SystemHook, :count).by(1) - end - - it "should open new hook popup" do - expect(current_path).to eq(admin_hooks_path) - expect(page).to have_content(@url) - end - end - - describe "Test" do - before do - WebMock.stub_request(:post, @system_hook.url) - visit admin_hooks_path - click_link "Test Hook" - end - - it { expect(current_path).to eq(admin_hooks_path) } - end - -end diff --git a/spec/features/admin/admin_projects_spec.rb b/spec/features/admin/admin_projects_spec.rb deleted file mode 100644 index 101d955d693..00000000000 --- a/spec/features/admin/admin_projects_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe "Admin::Projects", feature: true do - before do - @project = create(:project) - login_as :admin - end - - describe "GET /admin/projects" do - before do - visit admin_namespaces_projects_path - end - - it "should be ok" do - expect(current_path).to eq(admin_namespaces_projects_path) - end - - it "should have projects list" do - expect(page).to have_content(@project.name) - end - end - - describe "GET /admin/projects/:id" do - before do - visit admin_namespaces_projects_path - click_link "#{@project.name}" - end - - it "should have project info" do - expect(page).to have_content(@project.path) - expect(page).to have_content(@project.name) - end - end -end diff --git a/spec/features/admin/admin_users_spec.rb b/spec/features/admin/admin_users_spec.rb deleted file mode 100644 index f97b69713ce..00000000000 --- a/spec/features/admin/admin_users_spec.rb +++ /dev/null @@ -1,109 +0,0 @@ -require 'spec_helper' - -describe "Admin::Users", feature: true do - before { login_as :admin } - - describe "GET /admin/users" do - before do - visit admin_users_path - end - - it "should be ok" do - expect(current_path).to eq(admin_users_path) - end - - it "should have users list" do - expect(page).to have_content(@user.email) - expect(page).to have_content(@user.name) - end - end - - describe "GET /admin/users/new" do - before do - visit new_admin_user_path - fill_in "user_name", with: "Big Bang" - fill_in "user_username", with: "bang" - fill_in "user_email", with: "bigbang@mail.com" - end - - it "should create new user" do - expect { click_button "Create user" }.to change {User.count}.by(1) - end - - it "should apply defaults to user" do - click_button "Create user" - user = User.find_by(username: 'bang') - expect(user.projects_limit). - to eq(Gitlab.config.gitlab.default_projects_limit) - expect(user.can_create_group). - to eq(Gitlab.config.gitlab.default_can_create_group) - end - - it "should create user with valid data" do - click_button "Create user" - user = User.find_by(username: 'bang') - expect(user.name).to eq('Big Bang') - expect(user.email).to eq('bigbang@mail.com') - end - - it "should call send mail" do - expect(Notify).to receive(:new_user_email) - - click_button "Create user" - end - - it "should send valid email to user with email & password" do - click_button "Create user" - user = User.find_by(username: 'bang') - email = ActionMailer::Base.deliveries.last - expect(email.subject).to have_content('Account was created') - expect(email.text_part.body).to have_content(user.email) - expect(email.text_part.body).to have_content('password') - end - end - - describe "GET /admin/users/:id" do - before do - visit admin_users_path - click_link "#{@user.name}" - end - - it "should have user info" do - expect(page).to have_content(@user.email) - expect(page).to have_content(@user.name) - end - end - - describe "GET /admin/users/:id/edit" do - before do - @simple_user = create(:user) - visit admin_users_path - click_link "edit_user_#{@simple_user.id}" - end - - it "should have user edit page" do - expect(page).to have_content('Name') - expect(page).to have_content('Password') - end - - describe "Update user" do - before do - fill_in "user_name", with: "Big Bang" - fill_in "user_email", with: "bigbang@mail.com" - check "user_admin" - click_button "Save changes" - end - - it "should show page with new data" do - expect(page).to have_content('bigbang@mail.com') - expect(page).to have_content('Big Bang') - end - - it "should change user entry" do - @simple_user.reload - expect(@simple_user.name).to eq('Big Bang') - expect(@simple_user.is_admin?).to be_truthy - end - end - end -end diff --git a/spec/features/admin/security_spec.rb b/spec/features/admin/security_spec.rb deleted file mode 100644 index 175fa9d4647..00000000000 --- a/spec/features/admin/security_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'spec_helper' - -describe "Admin::Projects", feature: true do - describe "GET /admin/projects" do - subject { admin_namespaces_projects_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /admin/users" do - subject { admin_users_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /admin/hooks" do - subject { admin_hooks_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/atom/dashboard_issues_spec.rb b/spec/features/atom/dashboard_issues_spec.rb deleted file mode 100644 index b710cb3c72f..00000000000 --- a/spec/features/atom/dashboard_issues_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec_helper' - -describe "Dashboard Issues Feed", feature: true do - describe "GET /issues" do - let!(:user) { create(:user) } - let!(:project1) { create(:project) } - let!(:project2) { create(:project) } - let!(:issue1) { create(:issue, author: user, assignee: user, project: project1) } - let!(:issue2) { create(:issue, author: user, assignee: user, project: project2) } - - before do - project1.team << [user, :master] - project2.team << [user, :master] - end - - describe "atom feed" do - it "should render atom feed via private token" do - visit issues_dashboard_path(:atom, private_token: user.private_token) - - expect(response_headers['Content-Type']). - to have_content('application/atom+xml') - expect(body).to have_selector('title', text: "#{user.name} issues") - expect(body).to have_selector('author email', text: issue1.author_email) - expect(body).to have_selector('entry summary', text: issue1.title) - expect(body).to have_selector('author email', text: issue2.author_email) - expect(body).to have_selector('entry summary', text: issue2.title) - end - end - end -end diff --git a/spec/features/atom/dashboard_spec.rb b/spec/features/atom/dashboard_spec.rb deleted file mode 100644 index ad157d742ff..00000000000 --- a/spec/features/atom/dashboard_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -describe "Dashboard Feed", feature: true do - describe "GET /" do - let!(:user) { create(:user, name: "Jonh") } - - context "projects atom feed via private token" do - it "should render projects atom feed" do - visit dashboard_path(:atom, private_token: user.private_token) - expect(body).to have_selector('feed title') - end - end - - context 'feed content' do - let(:project) { create(:project) } - let(:issue) { create(:issue, project: project, author: user, description: '') } - let(:note) { create(:note, noteable: issue, author: user, note: 'Bug confirmed', project: project) } - - before do - project.team << [user, :master] - issue_event(issue, user) - note_event(note, user) - visit dashboard_path(:atom, private_token: user.private_token) - end - - it "should have issue opened event" do - expect(body).to have_content("#{user.name} opened issue ##{issue.iid}") - end - - it "should have issue comment event" do - expect(body). - to have_content("#{user.name} commented on issue ##{issue.iid}") - end - end - end - - def issue_event(issue, user) - EventCreateService.new.open_issue(issue, user) - end - - def note_event(note, user) - EventCreateService.new.leave_note(note, user) - end -end diff --git a/spec/features/atom/issues_spec.rb b/spec/features/atom/issues_spec.rb deleted file mode 100644 index baa7814e96a..00000000000 --- a/spec/features/atom/issues_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' - -describe 'Issues Feed', feature: true do - describe 'GET /issues' do - let!(:user) { create(:user) } - let!(:project) { create(:project) } - let!(:issue) { create(:issue, author: user, project: project) } - - before { project.team << [user, :developer] } - - context 'when authenticated' do - it 'should render atom feed' do - login_with user - visit namespace_project_issues_path(project.namespace, project, :atom) - - expect(response_headers['Content-Type']). - to have_content('application/atom+xml') - expect(body).to have_selector('title', text: "#{project.name} issues") - expect(body).to have_selector('author email', text: issue.author_email) - expect(body).to have_selector('entry summary', text: issue.title) - end - end - - context 'when authenticated via private token' do - it 'should render atom feed' do - visit namespace_project_issues_path(project.namespace, project, :atom, - private_token: user.private_token) - - expect(response_headers['Content-Type']). - to have_content('application/atom+xml') - expect(body).to have_selector('title', text: "#{project.name} issues") - expect(body).to have_selector('author email', text: issue.author_email) - expect(body).to have_selector('entry summary', text: issue.title) - end - end - end -end diff --git a/spec/features/atom/users_spec.rb b/spec/features/atom/users_spec.rb deleted file mode 100644 index 770ac04c2c5..00000000000 --- a/spec/features/atom/users_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -require 'spec_helper' - -describe "User Feed", feature: true do - describe "GET /" do - let!(:user) { create(:user) } - - context 'user atom feed via private token' do - it "should render user atom feed" do - visit user_path(user, :atom, private_token: user.private_token) - expect(body).to have_selector('feed title') - end - end - - context 'feed content' do - let(:project) { create(:project) } - let(:issue) do - create(:issue, project: project, - author: user, description: "Houston, we have a bug!\n\n***\n\nI guess.") - end - let(:note) do - create(:note, noteable: issue, author: user, - note: 'Bug confirmed :+1:', project: project) - end - let(:merge_request) do - create(:merge_request, - title: 'Fix bug', author: user, - source_project: project, target_project: project, - description: "Here is the fix: ![an image](image.png)") - end - - before do - project.team << [user, :master] - issue_event(issue, user) - note_event(note, user) - merge_request_event(merge_request, user) - visit user_path(user, :atom, private_token: user.private_token) - end - - it 'should have issue opened event' do - expect(body).to have_content("#{safe_name} opened issue ##{issue.iid}") - end - - it 'should have issue comment event' do - expect(body). - to have_content("#{safe_name} commented on issue ##{issue.iid}") - end - - it 'should have XHTML summaries in issue descriptions' do - expect(body).to match /we have a bug!<\/p>\n\n
        \n\n

        I guess/ - end - - it 'should have XHTML summaries in notes' do - expect(body).to match /Bug confirmed ]*\/>/ - end - - it 'should have XHTML summaries in merge request descriptions' do - expect(body).to match /Here is the fix: ]*\/>/ - end - end - end - - def issue_event(issue, user) - EventCreateService.new.open_issue(issue, user) - end - - def note_event(note, user) - EventCreateService.new.leave_note(note, user) - end - - def merge_request_event(request, user) - EventCreateService.new.open_mr(request, user) - end - - def safe_name - html_escape(user.name) - end -end diff --git a/spec/features/gitlab_flavored_markdown_spec.rb b/spec/features/gitlab_flavored_markdown_spec.rb deleted file mode 100644 index fca1a06eb88..00000000000 --- a/spec/features/gitlab_flavored_markdown_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require 'spec_helper' - -describe "GitLab Flavored Markdown", feature: true do - let(:project) { create(:project) } - let(:issue) { create(:issue, project: project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:fred) do - u = create(:user, name: "fred") - project.team << [u, :master] - u - end - - before do - Commit.any_instance.stub(title: "fix ##{issue.iid}\n\nask @#{fred.username} for details") - end - - let(:commit) { project.repository.commit } - - before do - login_as :user - project.team << [@user, :developer] - end - - describe "for commits" do - it "should render title in commits#index" do - visit namespace_project_commits_path(project.namespace, project, 'master', limit: 1) - - expect(page).to have_link("##{issue.iid}") - end - - it "should render title in commits#show" do - visit namespace_project_commit_path(project.namespace, project, commit) - - expect(page).to have_link("##{issue.iid}") - end - - it "should render description in commits#show" do - visit namespace_project_commit_path(project.namespace, project, commit) - - expect(page).to have_link("@#{fred.username}") - end - - it "should render title in repositories#branches" do - visit namespace_project_branches_path(project.namespace, project) - - expect(page).to have_link("##{issue.iid}") - end - end - - describe "for issues" do - before do - @other_issue = create(:issue, - author: @user, - assignee: @user, - project: project) - @issue = create(:issue, - author: @user, - assignee: @user, - project: project, - title: "fix ##{@other_issue.iid}", - description: "ask @#{fred.username} for details") - end - - it "should render subject in issues#index" do - visit namespace_project_issues_path(project.namespace, project) - - expect(page).to have_link("##{@other_issue.iid}") - end - - it "should render subject in issues#show" do - visit namespace_project_issue_path(project.namespace, project, @issue) - - expect(page).to have_link("##{@other_issue.iid}") - end - - it "should render details in issues#show" do - visit namespace_project_issue_path(project.namespace, project, @issue) - - expect(page).to have_link("@#{fred.username}") - end - end - - - describe "for merge requests" do - before do - @merge_request = create(:merge_request, source_project: project, target_project: project, title: "fix ##{issue.iid}") - end - - it "should render title in merge_requests#index" do - visit namespace_project_merge_requests_path(project.namespace, project) - - expect(page).to have_link("##{issue.iid}") - end - - it "should render title in merge_requests#show" do - visit namespace_project_merge_request_path(project.namespace, project, @merge_request) - - expect(page).to have_link("##{issue.iid}") - end - end - - - describe "for milestones" do - before do - @milestone = create(:milestone, - project: project, - title: "fix ##{issue.iid}", - description: "ask @#{fred.username} for details") - end - - it "should render title in milestones#index" do - visit namespace_project_milestones_path(project.namespace, project) - - expect(page).to have_link("##{issue.iid}") - end - - it "should render title in milestones#show" do - visit namespace_project_milestone_path(project.namespace, project, @milestone) - - expect(page).to have_link("##{issue.iid}") - end - - it "should render description in milestones#show" do - visit namespace_project_milestone_path(project.namespace, project, @milestone) - - expect(page).to have_link("@#{fred.username}") - end - end -end diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb deleted file mode 100644 index e5f33d5a25a..00000000000 --- a/spec/features/issues_spec.rb +++ /dev/null @@ -1,320 +0,0 @@ -require 'spec_helper' - -describe 'Issues', feature: true do - include SortingHelper - - let(:project) { create(:project) } - - before do - login_as :user - user2 = create(:user) - - project.team << [[@user, user2], :developer] - end - - describe 'Edit issue' do - let!(:issue) do - create(:issue, - author: @user, - assignee: @user, - project: project) - end - - before do - visit namespace_project_issues_path(project.namespace, project) - click_link "Edit" - end - - it 'should open new issue popup' do - expect(page).to have_content("Issue ##{issue.iid}") - end - - describe 'fill in' do - before do - fill_in 'issue_title', with: 'bug 345' - fill_in 'issue_description', with: 'bug description' - end - - it 'does not change issue count' do - expect { - click_button 'Save changes' - }.to_not change { Issue.count } - end - - it 'should update issue fields' do - click_button 'Save changes' - - expect(page).to have_content @user.name - expect(page).to have_content 'bug 345' - expect(page).to have_content project.name - end - end - - end - - describe 'Editing issue assignee' do - let!(:issue) do - create(:issue, - author: @user, - assignee: @user, - project: project) - end - - it 'allows user to select unasigned', js: true do - visit edit_namespace_project_issue_path(project.namespace, project, issue) - - expect(page).to have_content "Assign to #{@user.name}" - - first('#s2id_issue_assignee_id').click - sleep 2 # wait for ajax stuff to complete - first('.user-result').click - - click_button 'Save changes' - - expect(page).to have_content 'Assignee: none' - expect(issue.reload.assignee).to be_nil - end - end - - describe 'Filter issue' do - before do - ['foobar', 'barbaz', 'gitlab'].each do |title| - create(:issue, - author: @user, - assignee: @user, - project: project, - title: title) - end - - @issue = Issue.find_by(title: 'foobar') - @issue.milestone = create(:milestone, project: project) - @issue.assignee = nil - @issue.save - end - - let(:issue) { @issue } - - it 'should allow filtering by issues with no specified milestone' do - visit namespace_project_issues_path(project.namespace, project, milestone_id: IssuableFinder::NONE) - - expect(page).not_to have_content 'foobar' - expect(page).to have_content 'barbaz' - expect(page).to have_content 'gitlab' - end - - it 'should allow filtering by a specified milestone' do - visit namespace_project_issues_path(project.namespace, project, milestone_id: issue.milestone.id) - - expect(page).to have_content 'foobar' - expect(page).not_to have_content 'barbaz' - expect(page).not_to have_content 'gitlab' - end - - it 'should allow filtering by issues with no specified assignee' do - visit namespace_project_issues_path(project.namespace, project, assignee_id: IssuableFinder::NONE) - - expect(page).to have_content 'foobar' - expect(page).not_to have_content 'barbaz' - expect(page).not_to have_content 'gitlab' - end - - it 'should allow filtering by a specified assignee' do - visit namespace_project_issues_path(project.namespace, project, assignee_id: @user.id) - - expect(page).not_to have_content 'foobar' - expect(page).to have_content 'barbaz' - expect(page).to have_content 'gitlab' - end - end - - describe 'filter issue' do - titles = ['foo','bar','baz'] - titles.each_with_index do |title, index| - let!(title.to_sym) do - create(:issue, title: title, - project: project, - created_at: Time.now - (index * 60)) - end - end - let(:newer_due_milestone) { create(:milestone, due_date: '2013-12-11') } - let(:later_due_milestone) { create(:milestone, due_date: '2013-12-12') } - - it 'sorts by newest' do - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_recently_created) - - expect(first_issue).to include('foo') - expect(last_issue).to include('baz') - end - - it 'sorts by oldest' do - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_oldest_created) - - expect(first_issue).to include('baz') - expect(last_issue).to include('foo') - end - - it 'sorts by most recently updated' do - baz.updated_at = Time.now + 100 - baz.save - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_recently_updated) - - expect(first_issue).to include('baz') - end - - it 'sorts by least recently updated' do - baz.updated_at = Time.now - 100 - baz.save - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_oldest_updated) - - expect(first_issue).to include('baz') - end - - describe 'sorting by milestone' do - before :each do - foo.milestone = newer_due_milestone - foo.save - bar.milestone = later_due_milestone - bar.save - end - - it 'sorts by recently due milestone' do - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_milestone_soon) - - expect(first_issue).to include('foo') - end - - it 'sorts by least recently due milestone' do - visit namespace_project_issues_path(project.namespace, project, sort: sort_value_milestone_later) - - expect(first_issue).to include('bar') - end - end - - describe 'combine filter and sort' do - let(:user2) { create(:user) } - - before :each do - foo.assignee = user2 - foo.save - bar.assignee = user2 - bar.save - end - - it 'sorts with a filter applied' do - visit namespace_project_issues_path(project.namespace, project, - sort: sort_value_oldest_created, - assignee_id: user2.id) - - expect(first_issue).to include('bar') - expect(last_issue).to include('foo') - expect(page).not_to have_content 'baz' - end - end - end - - describe 'update assignee from issue#show' do - let(:issue) { create(:issue, project: project, author: @user) } - - context 'by autorized user' do - - it 'with dropdown menu' do - visit namespace_project_issue_path(project.namespace, project, issue) - - find('.edit-issue.inline-update #issue_assignee_id'). - set project.team.members.first.id - click_button 'Update Issue' - - expect(page).to have_content 'Assignee:' - has_select?('issue_assignee_id', - selected: project.team.members.first.name) - end - end - - context 'by unauthorized user' do - - let(:guest) { create(:user) } - - before :each do - project.team << [[guest], :guest] - issue.assignee = @user - issue.save - end - - it 'shows assignee text', js: true do - logout - login_with guest - - visit namespace_project_issue_path(project.namespace, project, issue) - expect(page).to have_content issue.assignee.name - end - end - end - - describe 'update milestone from issue#show' do - let!(:issue) { create(:issue, project: project, author: @user) } - let!(:milestone) { create(:milestone, project: project) } - - context 'by authorized user' do - - it 'with dropdown menu' do - visit namespace_project_issue_path(project.namespace, project, issue) - - find('.edit-issue.inline-update'). - select(milestone.title, from: 'issue_milestone_id') - click_button 'Update Issue' - - expect(page).to have_content "Milestone changed to #{milestone.title}" - expect(page).to have_content "Milestone: #{milestone.title}" - has_select?('issue_assignee_id', selected: milestone.title) - end - end - - context 'by unauthorized user' do - let(:guest) { create(:user) } - - before :each do - project.team << [guest, :guest] - issue.milestone = milestone - issue.save - end - - it 'shows milestone text', js: true do - logout - login_with guest - - visit namespace_project_issue_path(project.namespace, project, issue) - expect(page).to have_content milestone.title - end - end - - describe 'removing assignee' do - let(:user2) { create(:user) } - - before :each do - issue.assignee = user2 - issue.save - end - - it 'allows user to remove assignee', :js => true do - visit namespace_project_issue_path(project.namespace, project, issue) - expect(page).to have_content "Assignee: #{user2.name}" - - first('#s2id_issue_assignee_id').click - sleep 2 # wait for ajax stuff to complete - first('.user-result').click - - expect(page).to have_content 'Assignee: none' - sleep 2 # wait for ajax stuff to complete - expect(issue.reload.assignee).to be_nil - end - end - end - - def first_issue - all('ul.issues-list li').first.text - end - - def last_issue - all('ul.issues-list li').last.text - end -end diff --git a/spec/features/notes_on_merge_requests_spec.rb b/spec/features/notes_on_merge_requests_spec.rb deleted file mode 100644 index c47368b1fda..00000000000 --- a/spec/features/notes_on_merge_requests_spec.rb +++ /dev/null @@ -1,230 +0,0 @@ -require 'spec_helper' - -describe 'Comments' do - include RepoHelpers - - describe 'On a merge request', js: true, feature: true do - let!(:merge_request) { create(:merge_request) } - let!(:project) { merge_request.source_project } - let!(:note) do - create(:note_on_merge_request, :with_attachment, project: project) - end - - before do - login_as :admin - visit namespace_project_merge_request_path(project.namespace, project, merge_request) - end - - subject { page } - - describe 'the note form' do - it 'should be valid' do - is_expected.to have_css('.js-main-target-form', visible: true, count: 1) - expect(find('.js-main-target-form input[type=submit]').value). - to eq('Add Comment') - within('.js-main-target-form') do - expect(page).not_to have_link('Cancel') - end - end - - describe 'with text' do - before do - within('.js-main-target-form') do - fill_in 'note[note]', with: 'This is awesome' - end - end - - it 'should have enable submit button and preview button' do - within('.js-main-target-form') do - expect(page).not_to have_css('.js-comment-button[disabled]') - expect(page).to have_css('.js-md-preview-button', visible: true) - end - end - end - end - - describe 'when posting a note' do - before do - within('.js-main-target-form') do - fill_in 'note[note]', with: 'This is awsome!' - find('.js-md-preview-button').click - click_button 'Add Comment' - end - end - - it 'should be added and form reset' do - is_expected.to have_content('This is awsome!') - within('.js-main-target-form') do - expect(page).to have_no_field('note[note]', with: 'This is awesome!') - expect(page).to have_css('.js-md-preview', visible: :hidden) - end - within('.js-main-target-form') do - is_expected.to have_css('.js-note-text', visible: true) - end - end - end - - describe 'when editing a note', js: true do - it 'should contain the hidden edit form' do - within("#note_#{note.id}") do - is_expected.to have_css('.note-edit-form', visible: false) - end - end - - describe 'editing the note' do - before do - find('.note').hover - find(".js-note-edit").click - end - - it 'should show the note edit form and hide the note body' do - within("#note_#{note.id}") do - expect(find('.current-note-edit-form', visible: true)).to be_visible - expect(find('.note-edit-form', visible: true)).to be_visible - expect(find(:css, '.note-body > .note-text', visible: false)).not_to be_visible - end - end - - # TODO: fix after 7.7 release - #it "should reset the edit note form textarea with the original content of the note if cancelled" do - #within(".current-note-edit-form") do - #fill_in "note[note]", with: "Some new content" - #find(".btn-cancel").click - #find(".js-note-text", visible: false).text.should == note.note - #end - #end - - it 'appends the edited at time to the note' do - within('.current-note-edit-form') do - fill_in 'note[note]', with: 'Some new content' - find('.btn-save').click - end - - within("#note_#{note.id}") do - is_expected.to have_css('.note_edited_ago') - expect(find('.note_edited_ago').text). - to match(/less than a minute ago/) - end - end - end - - describe 'deleting an attachment' do - before do - find('.note').hover - find('.js-note-edit').click - end - - it 'shows the delete link' do - within('.note-attachment') do - is_expected.to have_css('.js-note-attachment-delete') - end - end - - it 'removes the attachment div and resets the edit form' do - find('.js-note-attachment-delete').click - is_expected.not_to have_css('.note-attachment') - expect(find('.current-note-edit-form', visible: false)). - not_to be_visible - end - end - end - end - - describe 'On a merge request diff', js: true, feature: true do - let(:merge_request) { create(:merge_request) } - let(:project) { merge_request.source_project } - - before do - login_as :admin - visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request) - end - - subject { page } - - describe 'when adding a note' do - before do - click_diff_line - end - - describe 'the notes holder' do - it { is_expected.to have_css('.js-temp-notes-holder') } - - it 'has .new_note css class' do - within('.js-temp-notes-holder') do - expect(subject).to have_css('.new_note') - end - end - end - - describe 'the note form' do - it "shouldn't add a second form for same row" do - click_diff_line - - is_expected. - to have_css("tr[id='#{line_code}'] + .js-temp-notes-holder form", - count: 1) - end - - it 'should be removed when canceled' do - within(".diff-file form[rel$='#{line_code}']") do - find('.js-close-discussion-note-form').trigger('click') - end - - is_expected.to have_no_css('.js-temp-notes-holder') - end - end - end - - describe 'with muliple note forms' do - before do - click_diff_line - click_diff_line(line_code_2) - end - - it { is_expected.to have_css('.js-temp-notes-holder', count: 2) } - - describe 'previewing them separately' do - before do - # add two separate texts and trigger previews on both - within("tr[id='#{line_code}'] + .js-temp-notes-holder") do - fill_in 'note[note]', with: 'One comment on line 7' - find('.js-md-preview-button').click - end - within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do - fill_in 'note[note]', with: 'Another comment on line 10' - find('.js-md-preview-button').click - end - end - end - - describe 'posting a note' do - before do - within("tr[id='#{line_code_2}'] + .js-temp-notes-holder") do - fill_in 'note[note]', with: 'Another comment on line 10' - click_button('Add Comment') - end - end - - it 'should be added as discussion' do - is_expected.to have_content('Another comment on line 10') - is_expected.to have_css('.notes_holder') - is_expected.to have_css('.notes_holder .note', count: 1) - is_expected.to have_button('Reply') - end - end - end - end - - def line_code - sample_compare.changes.first[:line_code] - end - - def line_code_2 - sample_compare.changes.last[:line_code] - end - - def click_diff_line(data = nil) - data ||= line_code - find("button[data-line-code=\"#{data}\"]").click - end -end diff --git a/spec/features/profile_spec.rb b/spec/features/profile_spec.rb deleted file mode 100644 index 3d36a3c02d0..00000000000 --- a/spec/features/profile_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' - -describe 'Profile account page', feature: true do - let(:user) { create(:user) } - - before do - login_as :user - end - - describe 'when signup is enabled' do - before do - ApplicationSetting.any_instance.stub(signup_enabled?: true) - visit profile_account_path - end - - it { expect(page).to have_content('Remove account') } - - it 'should delete the account' do - expect { click_link 'Delete account' }.to change { User.count }.by(-1) - expect(current_path).to eq(new_user_session_path) - end - end - - describe 'when signup is disabled' do - before do - ApplicationSetting.any_instance.stub(signup_enabled?: false) - visit profile_account_path - end - - it 'should not have option to remove account' do - expect(page).not_to have_content('Remove account') - expect(current_path).to eq(profile_account_path) - end - end -end diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb deleted file mode 100644 index cae11be7cdd..00000000000 --- a/spec/features/projects_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' - -describe "Projects", feature: true, js: true do - before { login_as :user } - - describe "DELETE /projects/:id" do - before do - @project = create(:project, namespace: @user.namespace) - @project.team << [@user, :master] - visit edit_namespace_project_path(@project.namespace, @project) - end - - it "should remove project" do - expect { remove_project }.to change {Project.count}.by(-1) - end - - it 'should delete the project from disk' do - expect(GitlabShellWorker).to( - receive(:perform_async).with(:remove_repository, - /#{@project.path_with_namespace}/) - ).twice - - remove_project - end - end - - def remove_project - click_link "Remove project" - fill_in 'confirm_name_input', with: @project.path - click_button 'Confirm' - end -end diff --git a/spec/features/search_spec.rb b/spec/features/search_spec.rb deleted file mode 100644 index 73987739a7a..00000000000 --- a/spec/features/search_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'spec_helper' - -describe "Search", feature: true do - before do - login_as :user - @project = create(:project, namespace: @user.namespace) - @project.team << [@user, :reporter] - visit search_path - - within '.search-holder' do - fill_in "search", with: @project.name[0..3] - click_button "Search" - end - end - - it "should show project in search results" do - expect(page).to have_content @project.name - end -end - diff --git a/spec/features/security/dashboard_access_spec.rb b/spec/features/security/dashboard_access_spec.rb deleted file mode 100644 index 67238e3ab76..00000000000 --- a/spec/features/security/dashboard_access_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'spec_helper' - -describe "Dashboard access", feature: true do - describe "GET /dashboard" do - subject { dashboard_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /dashboard/issues" do - subject { issues_dashboard_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /dashboard/merge_requests" do - subject { merge_requests_dashboard_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /dashboard/projects/starred" do - subject { starred_dashboard_projects_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /help" do - subject { help_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /projects/new" do - it { expect(new_project_path).to be_allowed_for :admin } - it { expect(new_project_path).to be_allowed_for :user } - it { expect(new_project_path).to be_denied_for :visitor } - end - - describe "GET /groups/new" do - it { expect(new_group_path).to be_allowed_for :admin } - it { expect(new_group_path).to be_allowed_for :user } - it { expect(new_group_path).to be_denied_for :visitor } - end - - describe "GET /profile/groups" do - subject { dashboard_groups_path } - - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/security/group/group_access_spec.rb b/spec/features/security/group/group_access_spec.rb deleted file mode 100644 index 63793149459..00000000000 --- a/spec/features/security/group/group_access_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'spec_helper' - -describe "Group access", feature: true do - describe "GET /projects/new" do - it { expect(new_group_path).to be_allowed_for :admin } - it { expect(new_group_path).to be_allowed_for :user } - it { expect(new_group_path).to be_denied_for :visitor } - end - - describe "Group" do - let(:group) { create(:group) } - - let(:owner) { create(:owner) } - let(:master) { create(:user) } - let(:reporter) { create(:user) } - let(:guest) { create(:user) } - let(:nonmember) { create(:user) } - - before do - group.add_user(owner, Gitlab::Access::OWNER) - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) - end - - describe "GET /groups/:path" do - subject { group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/issues" do - subject { issues_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/merge_requests" do - subject { merge_requests_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/group_members" do - subject { group_group_members_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/edit" do - subject { edit_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_denied_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/projects" do - subject { projects_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_denied_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - end -end diff --git a/spec/features/security/group/internal_group_access_spec.rb b/spec/features/security/group/internal_group_access_spec.rb deleted file mode 100644 index d17a7412e43..00000000000 --- a/spec/features/security/group/internal_group_access_spec.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'spec_helper' - -describe "Group with internal project access", feature: true do - describe "Group" do - let(:group) { create(:group) } - - let(:owner) { create(:owner) } - let(:master) { create(:user) } - let(:reporter) { create(:user) } - let(:guest) { create(:user) } - let(:nonmember) { create(:user) } - - before do - group.add_user(owner, Gitlab::Access::OWNER) - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) - - create(:project, :internal, group: group) - end - - describe "GET /groups/:path" do - subject { group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/issues" do - subject { issues_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/merge_requests" do - subject { merge_requests_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/group_members" do - subject { group_group_members_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /groups/:path/edit" do - subject { edit_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_denied_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - end -end diff --git a/spec/features/security/group/mixed_group_access_spec.rb b/spec/features/security/group/mixed_group_access_spec.rb deleted file mode 100644 index b3db7b5dea4..00000000000 --- a/spec/features/security/group/mixed_group_access_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -require 'spec_helper' - -describe "Group access", feature: true do - describe "Group" do - let(:group) { create(:group) } - - let(:owner) { create(:owner) } - let(:master) { create(:user) } - let(:reporter) { create(:user) } - let(:guest) { create(:user) } - let(:nonmember) { create(:user) } - - before do - group.add_user(owner, Gitlab::Access::OWNER) - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) - - create(:project, :internal, path: "internal_project", group: group) - create(:project, :public, path: "public_project", group: group) - end - - describe "GET /groups/:path" do - subject { group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/issues" do - subject { issues_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/merge_requests" do - subject { merge_requests_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/group_members" do - subject { group_group_members_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/edit" do - subject { edit_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_denied_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - end -end diff --git a/spec/features/security/group/public_group_access_spec.rb b/spec/features/security/group/public_group_access_spec.rb deleted file mode 100644 index c16f0c0d1e1..00000000000 --- a/spec/features/security/group/public_group_access_spec.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'spec_helper' - -describe "Group with public project access", feature: true do - describe "Group" do - let(:group) { create(:group) } - - let(:owner) { create(:owner) } - let(:master) { create(:user) } - let(:reporter) { create(:user) } - let(:guest) { create(:user) } - let(:nonmember) { create(:user) } - - before do - group.add_user(owner, Gitlab::Access::OWNER) - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) - - create(:project, :public, group: group) - end - - describe "GET /groups/:path" do - subject { group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/issues" do - subject { issues_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/merge_requests" do - subject { merge_requests_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/group_members" do - subject { group_group_members_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /groups/:path/edit" do - subject { edit_group_path(group) } - - it { is_expected.to be_allowed_for owner } - it { is_expected.to be_denied_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - end -end diff --git a/spec/features/security/profile_access_spec.rb b/spec/features/security/profile_access_spec.rb deleted file mode 100644 index 2512a9c0e3d..00000000000 --- a/spec/features/security/profile_access_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'spec_helper' - -describe "Profile access", feature: true do - before do - @u1 = create(:user) - end - - describe "GET /login" do - it { expect(new_user_session_path).not_to be_404_for :visitor } - end - - describe "GET /profile/keys" do - subject { profile_keys_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /profile" do - subject { profile_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /profile/account" do - subject { profile_account_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /profile/design" do - subject { design_profile_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /profile/history" do - subject { history_profile_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /profile/notifications" do - subject { profile_notifications_path } - - it { is_expected.to be_allowed_for @u1 } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb deleted file mode 100644 index 8d1bfd25223..00000000000 --- a/spec/features/security/project/internal_access_spec.rb +++ /dev/null @@ -1,227 +0,0 @@ -require 'spec_helper' - -describe "Internal Project Access", feature: true do - let(:project) { create(:project, :internal) } - - let(:master) { create(:user) } - let(:guest) { create(:user) } - let(:reporter) { create(:user) } - - before do - # full access - project.team << [master, :master] - - # readonly - project.team << [reporter, :reporter] - end - - describe "Project should be internal" do - subject { project } - - describe '#internal?' do - subject { super().internal? } - it { is_expected.to be_truthy } - end - end - - describe "GET /:project_path" do - subject { namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/tree/master" do - subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/commits/master" do - subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/commit/:sha" do - subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/compare" do - subject { namespace_project_compare_index_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/project_members" do - subject { namespace_project_project_members_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/blob" do - before do - commit = project.repository.commit - path = '.gitignore' - @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path)) - end - - it { expect(@blob_path).to be_allowed_for master } - it { expect(@blob_path).to be_allowed_for reporter } - it { expect(@blob_path).to be_allowed_for :admin } - it { expect(@blob_path).to be_allowed_for guest } - it { expect(@blob_path).to be_allowed_for :user } - it { expect(@blob_path).to be_denied_for :visitor } - end - - describe "GET /:project_path/edit" do - subject { edit_namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/deploy_keys" do - subject { namespace_project_deploy_keys_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/issues" do - subject { namespace_project_issues_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/snippets" do - subject { namespace_project_snippets_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/snippets/new" do - subject { new_namespace_project_snippet_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/merge_requests" do - subject { namespace_project_merge_requests_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/merge_requests/new" do - subject { new_namespace_project_merge_request_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/branches" do - subject { namespace_project_branches_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/tags" do - subject { namespace_project_tags_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/hooks" do - subject { namespace_project_hooks_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb deleted file mode 100644 index 9021ff33186..00000000000 --- a/spec/features/security/project/private_access_spec.rb +++ /dev/null @@ -1,205 +0,0 @@ -require 'spec_helper' - -describe "Private Project Access", feature: true do - let(:project) { create(:project) } - - let(:master) { create(:user) } - let(:guest) { create(:user) } - let(:reporter) { create(:user) } - - before do - # full access - project.team << [master, :master] - - # readonly - project.team << [reporter, :reporter] - end - - describe "Project should be private" do - subject { project } - - describe '#private?' do - subject { super().private? } - it { is_expected.to be_truthy } - end - end - - describe "GET /:project_path" do - subject { namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/tree/master" do - subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/commits/master" do - subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/commit/:sha" do - subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/compare" do - subject { namespace_project_compare_index_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/project_members" do - subject { namespace_project_project_members_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/blob" do - before do - commit = project.repository.commit - path = '.gitignore' - @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path)) - end - - it { expect(@blob_path).to be_allowed_for master } - it { expect(@blob_path).to be_allowed_for reporter } - it { expect(@blob_path).to be_allowed_for :admin } - it { expect(@blob_path).to be_denied_for guest } - it { expect(@blob_path).to be_denied_for :user } - it { expect(@blob_path).to be_denied_for :visitor } - end - - describe "GET /:project_path/edit" do - subject { edit_namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/deploy_keys" do - subject { namespace_project_deploy_keys_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/issues" do - subject { namespace_project_issues_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/snippets" do - subject { namespace_project_snippets_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/merge_requests" do - subject { namespace_project_merge_requests_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/branches" do - subject { namespace_project_branches_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/tags" do - subject { namespace_project_tags_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/hooks" do - subject { namespace_project_hooks_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb deleted file mode 100644 index 6ec190ed777..00000000000 --- a/spec/features/security/project/public_access_spec.rb +++ /dev/null @@ -1,232 +0,0 @@ -require 'spec_helper' - -describe "Public Project Access", feature: true do - let(:project) { create(:project) } - - let(:master) { create(:user) } - let(:guest) { create(:user) } - let(:reporter) { create(:user) } - - before do - # public project - project.visibility_level = Gitlab::VisibilityLevel::PUBLIC - project.save! - - # full access - project.team << [master, :master] - - # readonly - project.team << [reporter, :reporter] - - end - - describe "Project should be public" do - subject { project } - - describe '#public?' do - subject { super().public? } - it { is_expected.to be_truthy } - end - end - - describe "GET /:project_path" do - subject { namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/tree/master" do - subject { namespace_project_tree_path(project.namespace, project, project.repository.root_ref) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/commits/master" do - subject { namespace_project_commits_path(project.namespace, project, project.repository.root_ref, limit: 1) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/commit/:sha" do - subject { namespace_project_commit_path(project.namespace, project, project.repository.commit) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/compare" do - subject { namespace_project_compare_index_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/project_members" do - subject { namespace_project_project_members_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/blob" do - before do - commit = project.repository.commit - path = '.gitignore' - @blob_path = namespace_project_blob_path(project.namespace, project, File.join(commit.id, path)) - end - - it { expect(@blob_path).to be_allowed_for master } - it { expect(@blob_path).to be_allowed_for reporter } - it { expect(@blob_path).to be_allowed_for :admin } - it { expect(@blob_path).to be_allowed_for guest } - it { expect(@blob_path).to be_allowed_for :user } - it { expect(@blob_path).to be_allowed_for :visitor } - end - - describe "GET /:project_path/edit" do - subject { edit_namespace_project_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/deploy_keys" do - subject { namespace_project_deploy_keys_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/issues" do - subject { namespace_project_issues_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/snippets" do - subject { namespace_project_snippets_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/snippets/new" do - subject { new_namespace_project_snippet_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/merge_requests" do - subject { namespace_project_merge_requests_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/merge_requests/new" do - subject { new_namespace_project_merge_request_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end - - describe "GET /:project_path/branches" do - subject { namespace_project_branches_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:branches).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/tags" do - subject { namespace_project_tags_path(project.namespace, project) } - - before do - # Speed increase - allow_any_instance_of(Project).to receive(:tags).and_return([]) - end - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_allowed_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_allowed_for guest } - it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } - end - - describe "GET /:project_path/hooks" do - subject { namespace_project_hooks_path(project.namespace, project) } - - it { is_expected.to be_allowed_for master } - it { is_expected.to be_denied_for reporter } - it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for guest } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } - end -end diff --git a/spec/features/users_spec.rb b/spec/features/users_spec.rb deleted file mode 100644 index 4cfaab03caf..00000000000 --- a/spec/features/users_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' - -feature 'Users' do - around do |ex| - old_url_options = Rails.application.routes.default_url_options - Rails.application.routes.default_url_options = { host: 'example.foo' } - ex.run - Rails.application.routes.default_url_options = old_url_options - end - - scenario 'GET /users/sign_in creates a new user account' do - visit new_user_session_path - fill_in 'user_name', with: 'Name Surname' - fill_in 'user_username', with: 'Great' - fill_in 'user_email', with: 'name@mail.com' - fill_in 'user_password_sign_up', with: 'password1234' - expect { click_button 'Sign up' }.to change { User.count }.by(1) - end - - scenario 'Successful user signin invalidates password reset token' do - user = create(:user) - expect(user.reset_password_token).to be_nil - - visit new_user_password_path - fill_in 'user_email', with: user.email - click_button 'Reset password' - - user.reload - expect(user.reset_password_token).not_to be_nil - - login_with(user) - expect(current_path).to eq root_path - - user.reload - expect(user.reset_password_token).to be_nil - end -end diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb deleted file mode 100644 index 479fa950387..00000000000 --- a/spec/finders/issues_finder_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper' - -describe IssuesFinder do - let(:user) { create :user } - let(:user2) { create :user } - let(:project1) { create(:project) } - let(:project2) { create(:project) } - let(:milestone) { create(:milestone, project: project1) } - let(:issue1) { create(:issue, author: user, assignee: user, project: project1, milestone: milestone) } - let(:issue2) { create(:issue, author: user, assignee: user, project: project2) } - let(:issue3) { create(:issue, author: user2, assignee: user2, project: project2) } - - before do - project1.team << [user, :master] - project2.team << [user, :developer] - project2.team << [user2, :developer] - end - - describe :execute do - before :each do - issue1 - issue2 - issue3 - end - - context 'scope: all' do - it 'should filter by all' do - params = { scope: "all", state: 'opened' } - issues = IssuesFinder.new.execute(user, params) - expect(issues.size).to eq(3) - end - - it 'should filter by assignee id' do - params = { scope: "all", assignee_id: user.id, state: 'opened' } - issues = IssuesFinder.new.execute(user, params) - expect(issues.size).to eq(2) - end - - it 'should filter by author id' do - params = { scope: "all", author_id: user2.id, state: 'opened' } - issues = IssuesFinder.new.execute(user, params) - expect(issues).to eq([issue3]) - end - - it 'should filter by milestone id' do - params = { scope: "all", milestone_id: milestone.id, state: 'opened' } - issues = IssuesFinder.new.execute(user, params) - expect(issues).to eq([issue1]) - end - - it 'should be empty for unauthorized user' do - params = { scope: "all", state: 'opened' } - issues = IssuesFinder.new.execute(nil, params) - expect(issues.size).to be_zero - end - - it 'should not include unauthorized issues' do - params = { scope: "all", state: 'opened' } - issues = IssuesFinder.new.execute(user2, params) - expect(issues.size).to eq(2) - expect(issues).not_to include(issue1) - expect(issues).to include(issue2) - expect(issues).to include(issue3) - end - end - - context 'personal scope' do - it 'should filter by assignee' do - params = { scope: "assigned-to-me", state: 'opened' } - issues = IssuesFinder.new.execute(user, params) - expect(issues.size).to eq(2) - end - - it 'should filter by project' do - params = { scope: "assigned-to-me", state: 'opened', project_id: project1.id } - issues = IssuesFinder.new.execute(user, params) - expect(issues.size).to eq(1) - end - end - end -end diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb deleted file mode 100644 index 8536377a7f0..00000000000 --- a/spec/finders/merge_requests_finder_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require 'spec_helper' - -describe MergeRequestsFinder do - let(:user) { create :user } - let(:user2) { create :user } - - let(:project1) { create(:project) } - let(:project2) { create(:project, forked_from_project: project1) } - - let!(:merge_request1) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1) } - let!(:merge_request2) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project1, state: 'closed') } - let!(:merge_request3) { create(:merge_request, :simple, author: user, source_project: project2, target_project: project2) } - - before do - project1.team << [user, :master] - project2.team << [user, :developer] - project2.team << [user2, :developer] - end - - describe "#execute" do - it 'should filter by scope' do - params = { scope: 'authored', state: 'opened' } - merge_requests = MergeRequestsFinder.new.execute(user, params) - expect(merge_requests.size).to eq(2) - end - - it 'should filter by project' do - params = { project_id: project1.id, scope: 'authored', state: 'opened' } - merge_requests = MergeRequestsFinder.new.execute(user, params) - expect(merge_requests.size).to eq(1) - end - end -end diff --git a/spec/finders/notes_finder_spec.rb b/spec/finders/notes_finder_spec.rb deleted file mode 100644 index c83824b900d..00000000000 --- a/spec/finders/notes_finder_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'spec_helper' - -describe NotesFinder do - let(:user) { create :user } - let(:project) { create :project } - let(:note1) { create :note_on_commit, project: project } - let(:note2) { create :note_on_commit, project: project } - let(:commit) { note1.noteable } - - before do - project.team << [user, :master] - end - - describe :execute do - let(:params) { { target_id: commit.id, target_type: 'commit', last_fetched_at: 1.hour.ago.to_i } } - - before do - note1 - note2 - end - - it 'should find all notes' do - notes = NotesFinder.new.execute(project, user, params) - expect(notes.size).to eq(2) - end - - it 'should raise an exception for an invalid target_type' do - params.merge!(target_type: 'invalid') - expect { NotesFinder.new.execute(project, user, params) }.to raise_error('invalid target_type') - end - - it 'filters out old notes' do - note2.update_attribute(:updated_at, 2.hours.ago) - notes = NotesFinder.new.execute(project, user, params) - expect(notes).to eq([note1]) - end - end -end diff --git a/spec/finders/projects_finder_spec.rb b/spec/finders/projects_finder_spec.rb deleted file mode 100644 index 2ab71b05968..00000000000 --- a/spec/finders/projects_finder_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' - -describe ProjectsFinder do - let(:user) { create :user } - let(:group) { create :group } - - let(:project1) { create(:empty_project, :public, group: group) } - let(:project2) { create(:empty_project, :internal, group: group) } - let(:project3) { create(:empty_project, :private, group: group) } - let(:project4) { create(:empty_project, :private, group: group) } - - context 'non authenticated' do - subject { ProjectsFinder.new.execute(nil, group: group) } - - it { is_expected.to include(project1) } - it { is_expected.not_to include(project2) } - it { is_expected.not_to include(project3) } - it { is_expected.not_to include(project4) } - end - - context 'authenticated' do - subject { ProjectsFinder.new.execute(user, group: group) } - - it { is_expected.to include(project1) } - it { is_expected.to include(project2) } - it { is_expected.not_to include(project3) } - it { is_expected.not_to include(project4) } - end - - context 'authenticated, project member' do - before { project3.team << [user, :developer] } - - subject { ProjectsFinder.new.execute(user, group: group) } - - it { is_expected.to include(project1) } - it { is_expected.to include(project2) } - it { is_expected.to include(project3) } - it { is_expected.not_to include(project4) } - end - - context 'authenticated, group member' do - before { group.add_user(user, Gitlab::Access::DEVELOPER) } - - subject { ProjectsFinder.new.execute(user, group: group) } - - it { is_expected.to include(project1) } - it { is_expected.to include(project2) } - it { is_expected.to include(project3) } - it { is_expected.to include(project4) } - end -end diff --git a/spec/finders/snippets_finder_spec.rb b/spec/finders/snippets_finder_spec.rb deleted file mode 100644 index 1b4ffc2d717..00000000000 --- a/spec/finders/snippets_finder_spec.rb +++ /dev/null @@ -1,101 +0,0 @@ -require 'spec_helper' - -describe SnippetsFinder do - let(:user) { create :user } - let(:user1) { create :user } - let(:group) { create :group } - - let(:project1) { create(:empty_project, :public, group: group) } - let(:project2) { create(:empty_project, :private, group: group) } - - - context ':all filter' do - before do - @snippet1 = create(:personal_snippet, visibility_level: Snippet::PRIVATE) - @snippet2 = create(:personal_snippet, visibility_level: Snippet::INTERNAL) - @snippet3 = create(:personal_snippet, visibility_level: Snippet::PUBLIC) - end - - it "returns all private and internal snippets" do - snippets = SnippetsFinder.new.execute(user, filter: :all) - expect(snippets).to include(@snippet2, @snippet3) - expect(snippets).not_to include(@snippet1) - end - - it "returns all public snippets" do - snippets = SnippetsFinder.new.execute(nil, filter: :all) - expect(snippets).to include(@snippet3) - expect(snippets).not_to include(@snippet1, @snippet2) - end - end - - context ':by_user filter' do - before do - @snippet1 = create(:personal_snippet, visibility_level: Snippet::PRIVATE, author: user) - @snippet2 = create(:personal_snippet, visibility_level: Snippet::INTERNAL, author: user) - @snippet3 = create(:personal_snippet, visibility_level: Snippet::PUBLIC, author: user) - end - - it "returns all public and internal snippets" do - snippets = SnippetsFinder.new.execute(user1, filter: :by_user, user: user) - expect(snippets).to include(@snippet2, @snippet3) - expect(snippets).not_to include(@snippet1) - end - - it "returns internal snippets" do - snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_internal") - expect(snippets).to include(@snippet2) - expect(snippets).not_to include(@snippet1, @snippet3) - end - - it "returns private snippets" do - snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_private") - expect(snippets).to include(@snippet1) - expect(snippets).not_to include(@snippet2, @snippet3) - end - - it "returns public snippets" do - snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user, scope: "are_public") - expect(snippets).to include(@snippet3) - expect(snippets).not_to include(@snippet1, @snippet2) - end - - it "returns all snippets" do - snippets = SnippetsFinder.new.execute(user, filter: :by_user, user: user) - expect(snippets).to include(@snippet1, @snippet2, @snippet3) - end - - it "returns only public snippets if unauthenticated user" do - snippets = SnippetsFinder.new.execute(nil, filter: :by_user, user: user) - expect(snippets).to include(@snippet3) - expect(snippets).not_to include(@snippet2, @snippet1) - end - - end - - context 'by_project filter' do - before do - @snippet1 = create(:project_snippet, visibility_level: Snippet::PRIVATE, project: project1) - @snippet2 = create(:project_snippet, visibility_level: Snippet::INTERNAL, project: project1) - @snippet3 = create(:project_snippet, visibility_level: Snippet::PUBLIC, project: project1) - end - - it "returns public snippets for unauthorized user" do - snippets = SnippetsFinder.new.execute(nil, filter: :by_project, project: project1) - expect(snippets).to include(@snippet3) - expect(snippets).not_to include(@snippet1, @snippet2) - end - - it "returns public and internal snippets for none project members" do - snippets = SnippetsFinder.new.execute(user, filter: :by_project, project: project1) - expect(snippets).to include(@snippet2, @snippet3) - expect(snippets).not_to include(@snippet1) - end - - it "returns all snippets for project members" do - project1.team << [user, :developer] - snippets = SnippetsFinder.new.execute(user, filter: :by_project, project: project1) - expect(snippets).to include(@snippet1, @snippet2, @snippet3) - end - end -end diff --git a/spec/fixtures/GoogleCodeProjectHosting.json b/spec/fixtures/GoogleCodeProjectHosting.json deleted file mode 100644 index d05e77271ae..00000000000 --- a/spec/fixtures/GoogleCodeProjectHosting.json +++ /dev/null @@ -1,407 +0,0 @@ -{ - "kind" : "projecthosting#user", - "id" : "@WRRVSlFXARlCVgB6", - "projects" : [ { - "kind" : "projecthosting#project", - "name" : "pmn", - "externalId" : "pmn", - "htmlLink" : "/p/pmn/", - "summary" : "Shows an icon in the system tray when you have new emails", - "description" : "IMAP client that shows an icon in the system tray when you have new emails.", - "labels" : [ "Mail" ], - "versionControlSystem" : "svn", - "repositoryUrls" : [ "https://pmn.googlecode.com/svn/" ], - "issuesConfig" : { - "kind" : "projecthosting#projectIssueConfig", - "statuses" : [ { - "status" : "New", - "meansOpen" : true, - "description" : "Issue has not had initial review yet" - }, { - "status" : "Accepted", - "meansOpen" : true, - "description" : "Problem reproduced / Need acknowledged" - }, { - "status" : "Started", - "meansOpen" : true, - "description" : "Work on this issue has begun" - }, { - "status" : "Fixed", - "meansOpen" : false, - "description" : "Developer made source code changes, QA should verify" - }, { - "status" : "Verified", - "meansOpen" : false, - "description" : "QA has verified that the fix worked" - }, { - "status" : "Invalid", - "meansOpen" : false, - "description" : "This was not a valid issue report" - }, { - "status" : "Duplicate", - "meansOpen" : false, - "description" : "This report duplicates an existing issue" - }, { - "status" : "WontFix", - "meansOpen" : false, - "description" : "We decided to not take action on this issue" - }, { - "status" : "Done", - "meansOpen" : false, - "description" : "The requested non-coding task was completed" - } ], - "labels" : [ { - "label" : "Type-Defect", - "description" : "Report of a software defect" - }, { - "label" : "Type-Enhancement", - "description" : "Request for enhancement" - }, { - "label" : "Type-Task", - "description" : "Work item that doesn't change the code or docs" - }, { - "label" : "Type-Review", - "description" : "Request for a source code review" - }, { - "label" : "Type-Other", - "description" : "Some other kind of issue" - }, { - "label" : "Priority-Critical", - "description" : "Must resolve in the specified milestone" - }, { - "label" : "Priority-High", - "description" : "Strongly want to resolve in the specified milestone" - }, { - "label" : "Priority-Medium", - "description" : "Normal priority" - }, { - "label" : "Priority-Low", - "description" : "Might slip to later milestone" - }, { - "label" : "OpSys-All", - "description" : "Affects all operating systems" - }, { - "label" : "OpSys-Windows", - "description" : "Affects Windows users" - }, { - "label" : "OpSys-Linux", - "description" : "Affects Linux users" - }, { - "label" : "OpSys-OSX", - "description" : "Affects Mac OS X users" - }, { - "label" : "Milestone-Release1.0", - "description" : "All essential functionality working" - }, { - "label" : "Component-UI", - "description" : "Issue relates to program UI" - }, { - "label" : "Component-Logic", - "description" : "Issue relates to application logic" - }, { - "label" : "Component-Persistence", - "description" : "Issue relates to data storage components" - }, { - "label" : "Component-Scripts", - "description" : "Utility and installation scripts" - }, { - "label" : "Component-Docs", - "description" : "Issue relates to end-user documentation" - }, { - "label" : "Security", - "description" : "Security risk to users" - }, { - "label" : "Performance", - "description" : "Performance issue" - }, { - "label" : "Usability", - "description" : "Affects program usability" - }, { - "label" : "Maintainability", - "description" : "Hinders future changes" - } ], - "prompts" : [ { - "name" : "Defect report from user", - "title" : "Enter one-line summary", - "description" : "What steps will reproduce the problem?\n1. \n2. \n3. \n\nWhat is the expected output? What do you see instead?\n\n\nWhat version of the product are you using? On what operating system?\n\n\nPlease provide any additional information below.\n", - "titleMustBeEdited" : true, - "status" : "New", - "labels" : [ "Type-Defect", "Priority-Medium" ] - }, { - "name" : "Defect report from developer", - "title" : "Enter one-line summary", - "description" : "What steps will reproduce the problem?\n1. \n2. \n3. \n\nWhat is the expected output? What do you see instead?\n\n\nPlease use labels and text to provide additional information.\n", - "titleMustBeEdited" : true, - "status" : "Accepted", - "labels" : [ "Type-Defect", "Priority-Medium" ], - "membersOnly" : true - }, { - "name" : "Review request", - "title" : "Code review request", - "description" : "Branch name:\n\nPurpose of code changes on this branch:\n\n\nWhen reviewing my code changes, please focus on:\n\n\nAfter the review, I'll merge this branch into:\n/trunk\n", - "status" : "New", - "labels" : [ "Type-Review", "Priority-Medium" ], - "membersOnly" : true, - "defaultToMember" : false - } ], - "defaultPromptForMembers" : 1, - "defaultPromptForNonMembers" : 0 - }, - "role" : "owner", - "members" : [ { - "kind" : "projecthosting#issuePerson", - "name" : "mrovi9000", - "htmlLink" : "https://code.google.com/u/106736353629303906862/" - } ], - "issues" : { - "kind" : "projecthosting#issueList", - "totalResults" : 0, - "items" : [ ] - } - }, { - "kind" : "projecthosting#project", - "name" : "tint2", - "externalId" : "tint2", - "htmlLink" : "/p/tint2/", - "summary" : "tint2 is a lightweight panel/taskbar.", - "description" : "tint2 is a simple _*panel/taskbar*_ unintrusive and light (memory / cpu / aestetic).
        We follow freedesktop specifications.\r\n \r\n=== 0.11 features ===\r\n * panel with taskbar, systray, clock and battery status\r\n * easy to customize : color/transparency on font, icon, border and background\r\n * pager like capability : send task from one workspace to another, switch workspace\r\n * multi-monitor capability : one panel per monitor, show task from current monitor\r\n * customize mouse event\r\n * window manager's menu\r\n * tooltip\r\n * autohide\r\n * clock timezones\r\n * real & fake transparency with autodetection of composite manager\r\n * panel's theme switcher 'tint2conf' \r\n\r\n=== Other project ===\r\n * Lightweight volume control http://softwarebakery.com/maato/volumeicon.html\r\n * Lightweight calendar http://code.google.com/p/gsimplecal/\r\n * Graphical config tool http://code.google.com/p/tintwizard/\r\n * Command line theme switcher http://github.com/dbbolton/scripts/blob/master/tint2theme\r\n\r\n\r\n=== Snapshot SVN ===\r\n\r\nhttp://img252.imageshack.us/img252/1433/wallpaper2td.jpg\r\n\r\n\r\n", - "labels" : [ "taskbar", "panel", "lightweight", "desktop", "openbox", "pager", "tint2" ], - "versionControlSystem" : "git", - "repositoryUrls" : [ "https://tint2.googlecode.com/git/" ], - "issuesConfig" : { - "kind" : "projecthosting#projectIssueConfig", - "defaultColumns" : [ "ID", "Status", "Type", "Milestone", "Priority", "Component", "Owner", "Summary", "Modified", "Stars" ], - "defaultSorting" : [ "-ID" ], - "statuses" : [ { - "status" : "New", - "meansOpen" : true, - "description" : "Issue has not had initial review yet" - }, { - "status" : "NeedInfo", - "meansOpen" : true, - "description" : "More information is needed before deciding what action should be taken" - }, { - "status" : "Accepted", - "meansOpen" : true, - "description" : "A Defect that a developer has reproduced or an Enhancement that a developer has committed to addressing" - }, { - "status" : "Wishlist", - "meansOpen" : true, - "description" : "An Enhancement which is valid, but no developers have committed to addressing" - }, { - "status" : "Started", - "meansOpen" : true, - "description" : "Work on this issue has begun" - }, { - "status" : "Fixed", - "meansOpen" : false, - "description" : "Work has completed" - }, { - "status" : "Invalid", - "meansOpen" : false, - "description" : "This was not a valid issue report" - }, { - "status" : "Duplicate", - "meansOpen" : false, - "description" : "This report duplicates an existing issue" - }, { - "status" : "WontFix", - "meansOpen" : false, - "description" : "We decided to not take action on this issue" - }, { - "status" : "Incomplete", - "meansOpen" : false, - "description" : "Not enough information and no activity for a long period of time" - } ], - "labels" : [ { - "label" : "Type-Defect", - "description" : "Report of a software defect" - }, { - "label" : "Type-Enhancement", - "description" : "Request for enhancement" - }, { - "label" : "Type-Task", - "description" : "Work item that does not change the code" - }, { - "label" : "Type-Review", - "description" : "Request for a source code review" - }, { - "label" : "Type-Other", - "description" : "Some other kind of issue" - }, { - "label" : "Milestone-0.12", - "description" : "Fix should be included in release 0.12" - }, { - "label" : "Priority-Critical", - "description" : "Must resolve in the specified milestone" - }, { - "label" : "Priority-High", - "description" : "Strongly want to resolve in the specified milestone" - }, { - "label" : "Priority-Medium", - "description" : "Normal priority" - }, { - "label" : "Priority-Low", - "description" : "Might slip to later milestone" - }, { - "label" : "OpSys-All", - "description" : "Affects all operating systems" - }, { - "label" : "OpSys-Windows", - "description" : "Affects Windows users" - }, { - "label" : "OpSys-Linux", - "description" : "Affects Linux users" - }, { - "label" : "OpSys-OSX", - "description" : "Affects Mac OS X users" - }, { - "label" : "Security", - "description" : "Security risk to users" - }, { - "label" : "Performance", - "description" : "Performance issue" - }, { - "label" : "Usability", - "description" : "Affects program usability" - }, { - "label" : "Maintainability", - "description" : "Hinders future changes" - }, { - "label" : "Component-Panel", - "description" : "Issue relates to the panel (e.g. positioning, hiding, transparency)" - }, { - "label" : "Component-Taskbar", - "description" : "Issue relates to the taskbar (e.g. tasks, multiple desktops)" - }, { - "label" : "Component-Battery", - "description" : "Issue relates to the battery" - }, { - "label" : "Component-Systray", - "description" : "Issue relates to the system tray" - }, { - "label" : "Component-Clock", - "description" : "Issue relates to the clock" - }, { - "label" : "Component-Launcher", - "description" : "Issue relates to the launcher" - }, { - "label" : "Component-Tint2conf", - "description" : "Issue relates to the configuration GUI (tint2conf)" - }, { - "label" : "Component-Docs", - "description" : "Issue relates to end-user documentation" - }, { - "label" : "Component-New", - "description" : "Issue describes a new component proposal" - } ], - "prompts" : [ { - "name" : "Defect report from user", - "title" : "Enter one-line summary", - "description" : "What steps will reproduce the problem?\n1.\n2.\n3.\n\nWhat is the expected output? What do you see instead?\n\n\nWhat version of the product are you using? On what operating system?\n\n\nWhich window manager (e.g. openbox, xfwm, metacity, mutter, kwin) or\nwhich desktop environment (e.g. Gnome 2, Gnome 3, LXDE, XFCE, KDE)\nare you using?\n\n\nPlease provide any additional information below. It might be helpful\nto attach your tint2rc file (usually located at ~/.config/tint2/tint2rc).", - "titleMustBeEdited" : true, - "status" : "New", - "labels" : [ "Priority-Medium" ], - "defaultToMember" : true - }, { - "name" : "Defect report from developer", - "title" : "Enter one-line summary", - "description" : "What steps will reproduce the problem?\n1.\n2.\n3.\n\nWhat is the expected output? What do you see instead?\n\n\nPlease use labels and text to provide additional information.", - "titleMustBeEdited" : true, - "status" : "Accepted", - "labels" : [ "Type-Defect", "Priority-Medium" ], - "membersOnly" : true, - "defaultToMember" : true - }, { - "name" : "Review request", - "title" : "Code review request", - "description" : "Purpose of code changes on this branch:\n\n\nWhen reviewing my code changes, please focus on:\n\n\nAfter the review, I'll merge this branch into:\n/trunk", - "status" : "New", - "labels" : [ "Type-Review", "Priority-Medium" ], - "membersOnly" : true, - "defaultToMember" : true - } ], - "defaultPromptForMembers" : 1, - "defaultPromptForNonMembers" : 0, - "usersCanSetLabels" : false - }, - "role" : "owner", - "issues" : { - "kind" : "projecthosting#issueList", - "totalResults" : 473, - "items" : [ { - "kind" : "projecthosting#issue", - "id" : 169, - "title" : "Scrolling through tasks", - "summary" : "Scrolling through tasks", - "stars" : 1, - "starred" : false, - "status" : "Fixed", - "state" : "closed", - "labels" : [ "Type-Enhancement", "Priority-Medium" ], - "author" : { - "kind" : "projecthosting#issuePerson", - "name" : "schattenpr...", - "htmlLink" : "https://code.google.com/u/106498139506637530000/" - }, - "owner" : { - "kind" : "projecthosting#issuePerson", - "name" : "thilo...", - "htmlLink" : "https://code.google.com/u/104224918623172014000/" - }, - "updated" : "2009-11-18T05:14:58.000Z", - "published" : "2009-11-18T00:20:19.000Z", - "closed" : "2009-11-18T05:14:58.000Z", - "projectId" : "tint2", - "canComment" : true, - "canEdit" : true, - "comments" : { - "kind" : "projecthosting#issueCommentList", - "totalResults" : 2, - "items" : [ { - "id" : 0, - "kind" : "projecthosting#issueComment", - "author" : { - "kind" : "projecthosting#issuePerson", - "name" : "schattenpr...", - "htmlLink" : "https://code.google.com/u/10649813950663753000/" - }, - "content" : "I like to scroll through the tasks with my scrollwheel (like in fluxbox). \r\n\r\nPatch is attached that adds two new mouse-actions (next_task+prev_task) \r\nthat can be used for exactly that purpose. \r\n\r\nall the best!", - "published" : "2009-11-18T00:20:19.000Z", - "updates" : { - "kind" : "projecthosting#issueCommentUpdate" - }, - "canDelete" : true, - "attachments" : [ { - "attachmentId" : "8901002890399325565", - "fileName" : "tint2_task_scrolling.diff", - "fileSize" : 3059, - "mimetype" : "text/x-c++; charset=us-ascii" - }, { - "attachmentId" : "000", - "fileName" : "screenshot.png", - "fileSize" : 0, - "mimetype" : "image/png" - } ] - }, { - "id" : 1, - "kind" : "projecthosting#issueComment", - "author" : { - "kind" : "projecthosting#issuePerson", - "name" : "thilo...", - "htmlLink" : "https://code.google.com/u/104224918623172014000/" - }, - "content" : "applied, thanks.\r\n", - "published" : "2009-11-18T05:14:58.000Z", - "updates" : { - "kind" : "projecthosting#issueCommentUpdate", - "status" : "Fixed", - "labels" : [ "-Type-Defect", "Type-Enhancement" ] - }, - "canDelete" : true - } ] - } - } ] - } - } ] -} diff --git a/spec/fixtures/banana_sample.gif b/spec/fixtures/banana_sample.gif deleted file mode 100644 index 1322ac92d141f2240f3b68b1c4a10b5e18b49e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71759 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

        vb$Bv_2AUrJ6|{6<-U0L@xrI)#8mz~%bXOs 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 diff --git a/spec/fixtures/dk.png b/spec/fixtures/dk.png deleted file mode 100644 index 87ce25e877ab8a9602b77af019f191e6749003f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1143 zcmeAS@N?(olHy`uVBq!ia0y~yU_8UX!05!n%)r3V=l?;Lfq_9Zz$e7@|NsBruWel` z!0`Y7|Fr@P->+?DU|@Lucdi!$0|RqOkY6x^!`I_CdOa8zSol0$978JN-rT;JdDuY2 zEwP;W^+N8BoC~}y>>2XAoW98`dIsY)kEyLjVeoP&7Jlbmbi7l|D25ykM3U^ z5@E#>e6WR6Sj}gK!QFW?qR*W8vXN_9f9c$XGdlN6u}A9h9P;r!4ps1WxBoMv^-fU@ ze)kuBX{;38bUr}kx7HHJYsSHe0%=?zGoqVM%6GMFPkVOl?F4f@2QR0oYn}GaTv#-4>}YY)Et>sT3o<U4PU%`IQ@OZU!S?c^hMq$(mg?~r5Eafjgd2FW~(jx zB>LTsHErj=GXZwecmDV|swF^eUiN&uNqc_%&BZ=hGrzv%Gr|a#HW@fKZJ^%@>RAGzBD^0HLTU2H^+n+a7 zqkHGGTe?1ASFF^$xpt=fw|5d-6E!%PGS)3n66dh$JjojLv-X?)5j0ZRUtGO3q zw4-v~q2}H%?#lvBuPu4rMTIP&@ogUl21=LUcd}dCY7sMBa?raxCZU4tx9Pn|4 z=ub*&V=TEGH6h`xeDzruW!caBS^V|=>0-~cbIETk8h!$eNn&YYSB*6DLb%EA8aosGN=3IYy+;R^~FA8Y6(9Q?OBLXu0!vRhlPvc8#}_vA$F zBQnlA_wHY7Z*lkJ>ltC|c7BLi7@iFEz_yhiZ@yT3VuyY~-pSWepSQ;(B|U2a1)Qat uG3zWjhsIU$Dr#VmR^f1^ZaVJ-xtvwLXLkJEsms8?z~JfX=d#Wzp$PyJZU!&_ diff --git a/spec/fixtures/doc_sample.txt b/spec/fixtures/doc_sample.txt deleted file mode 100644 index 600477e9421..00000000000 --- a/spec/fixtures/doc_sample.txt +++ /dev/null @@ -1,3 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - -Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? diff --git a/spec/fixtures/rails_sample.jpg b/spec/fixtures/rails_sample.jpg deleted file mode 100644 index a847b19332535844fe83840e16d3872902bb7441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35255 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 Sve$wv(g81`9BhRB|C<1R2<`g- diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb deleted file mode 100644 index 015a66f7fa0..00000000000 --- a/spec/helpers/application_helper_spec.rb +++ /dev/null @@ -1,262 +0,0 @@ -require 'spec_helper' - -describe ApplicationHelper do - describe 'current_controller?' do - before do - allow(controller).to receive(:controller_name).and_return('foo') - end - - it 'returns true when controller matches argument' do - expect(current_controller?(:foo)).to be_truthy - end - - it 'returns false when controller does not match argument' do - expect(current_controller?(:bar)).not_to be_truthy - end - - it 'should take any number of arguments' do - expect(current_controller?(:baz, :bar)).not_to be_truthy - expect(current_controller?(:baz, :bar, :foo)).to be_truthy - end - end - - describe 'current_action?' do - before do - allow(self).to receive(:action_name).and_return('foo') - end - - it 'returns true when action matches argument' do - expect(current_action?(:foo)).to be_truthy - end - - it 'returns false when action does not match argument' do - expect(current_action?(:bar)).not_to be_truthy - end - - it 'should take any number of arguments' do - expect(current_action?(:baz, :bar)).not_to be_truthy - expect(current_action?(:baz, :bar, :foo)).to be_truthy - end - end - - describe 'project_icon' do - avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png') - - it 'should return an url for the avatar' do - project = create(:project) - project.avatar = File.open(avatar_file_path) - project.save! - avatar_url = "http://localhost/uploads/project/avatar/#{ project.id }/gitlab_logo.png" - expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to eq( - "\"Gitlab" - ) - end - - it 'should give uploaded icon when present' do - project = create(:project) - project.save! - - allow_any_instance_of(Project).to receive(:avatar_in_git).and_return(true) - - avatar_url = 'http://localhost' + namespace_project_avatar_path(project.namespace, project) - expect(project_icon("#{project.namespace.to_param}/#{project.to_param}").to_s).to match( - image_tag(avatar_url)) - end - end - - describe 'avatar_icon' do - avatar_file_path = File.join(Rails.root, 'public', 'gitlab_logo.png') - - it 'should return an url for the avatar' do - user = create(:user) - user.avatar = File.open(avatar_file_path) - user.save! - expect(avatar_icon(user.email).to_s). - to match("/uploads/user/avatar/#{ user.id }/gitlab_logo.png") - end - - it 'should return an url for the avatar with relative url' do - Gitlab.config.gitlab.stub(relative_url_root: '/gitlab') - Gitlab.config.gitlab.stub(url: Settings.send(:build_gitlab_url)) - - user = create(:user) - user.avatar = File.open(avatar_file_path) - user.save! - expect(avatar_icon(user.email).to_s). - to match("/gitlab/uploads/user/avatar/#{ user.id }/gitlab_logo.png") - end - - it 'should call gravatar_icon when no avatar is present' do - user = create(:user, email: 'test@example.com') - user.save! - expect(avatar_icon(user.email).to_s).to eq('http://www.gravatar.com/avatar/55502f40dc8b7c769880b10874abc9d0?s=40&d=identicon') - end - end - - describe 'gravatar_icon' do - let(:user_email) { 'user@email.com' } - - it 'should return a generic avatar path when Gravatar is disabled' do - ApplicationSetting.any_instance.stub(gravatar_enabled?: false) - expect(gravatar_icon(user_email)).to match('no_avatar.png') - end - - it 'should return a generic avatar path when email is blank' do - expect(gravatar_icon('')).to match('no_avatar.png') - end - - it 'should return default gravatar url' do - Gitlab.config.gitlab.stub(https: false) - url = 'http://www.gravatar.com/avatar/b58c6f14d292556214bd64909bcdb118' - expect(gravatar_icon(user_email)).to match(url) - end - - it 'should use SSL when appropriate' do - Gitlab.config.gitlab.stub(https: true) - expect(gravatar_icon(user_email)).to match('https://secure.gravatar.com') - end - - it 'should return custom gravatar path when gravatar_url is set' do - allow(self).to receive(:request).and_return(double(:ssl? => false)) - allow(Gitlab.config.gravatar). - to receive(:plain_url). - and_return('http://example.local/?s=%{size}&hash=%{hash}') - url = 'http://example.local/?s=20&hash=b58c6f14d292556214bd64909bcdb118' - expect(gravatar_icon(user_email, 20)).to eq(url) - end - - it 'should accept a custom size' do - allow(self).to receive(:request).and_return(double(:ssl? => false)) - expect(gravatar_icon(user_email, 64)).to match(/\?s=64/) - end - - it 'should use default size when size is wrong' do - allow(self).to receive(:request).and_return(double(:ssl? => false)) - expect(gravatar_icon(user_email, nil)).to match(/\?s=40/) - end - - it 'should be case insensitive' do - allow(self).to receive(:request).and_return(double(:ssl? => false)) - expect(gravatar_icon(user_email)). - to eq(gravatar_icon(user_email.upcase + ' ')) - end - end - - describe 'grouped_options_refs' do - # Override Rails' grouped_options_for_select helper since HTML is harder to work with - def grouped_options_for_select(options, *args) - options - end - - let(:options) { grouped_options_refs } - - before do - # Must be an instance variable - @project = create(:project) - end - - it 'includes a list of branch names' do - expect(options[0][0]).to eq('Branches') - expect(options[0][1]).to include('master', 'feature') - end - - it 'includes a list of tag names' do - expect(options[1][0]).to eq('Tags') - expect(options[1][1]).to include('v1.0.0', 'v1.1.0') - end - - it 'includes a specific commit ref if defined' do - # Must be an instance variable - @ref = '2ed06dc41dbb5936af845b87d79e05bbf24c73b8' - - expect(options[2][0]).to eq('Commit') - expect(options[2][1]).to eq([@ref]) - end - - it 'sorts tags in a natural order' do - # Stub repository.tag_names to make sure we get some valid testing data - expect(@project.repository).to receive(:tag_names). - and_return(['v1.0.9', 'v1.0.10', 'v2.0', 'v3.1.4.2', 'v2.0rc1¿', - 'v1.0.9a', 'v2.0-rc1', 'v2.0rc2']) - - expect(options[1][1]). - to eq(['v3.1.4.2', 'v2.0', 'v2.0rc2', 'v2.0rc1¿', 'v2.0-rc1', 'v1.0.10', - 'v1.0.9', 'v1.0.9a']) - end - end - - describe 'user_color_scheme_class' do - context 'with current_user is nil' do - it 'should return a string' do - allow(self).to receive(:current_user).and_return(nil) - expect(user_color_scheme_class).to be_kind_of(String) - end - end - - context 'with a current_user' do - (1..5).each do |color_scheme_id| - context "with color_scheme_id == #{color_scheme_id}" do - it 'should return a string' do - current_user = double(:color_scheme_id => color_scheme_id) - allow(self).to receive(:current_user).and_return(current_user) - expect(user_color_scheme_class).to be_kind_of(String) - end - end - end - end - end - - describe 'simple_sanitize' do - let(:a_tag) { 'Foo' } - - it 'allows the a tag' do - expect(simple_sanitize(a_tag)).to eq(a_tag) - end - - it 'allows the span tag' do - input = 'Bar' - expect(simple_sanitize(input)).to eq(input) - end - - it 'disallows other tags' do - input = "#{a_tag}" - expect(simple_sanitize(input)).to eq(a_tag) - end - end - - describe 'link_to' do - it 'should not include rel=nofollow for internal links' do - expect(link_to('Home', root_path)).to eq('Home') - end - - it 'should include rel=nofollow for external links' do - expect(link_to('Example', 'http://www.example.com')). - to eq 'Example' - end - - it 'should include rel=nofollow for external links and honor existing html_options' do - expect(link_to('Example', 'http://www.example.com', class: 'toggle', data: {toggle: 'dropdown'})) - .to eq 'Example' - end - - it 'should include rel=nofollow for external links and preserve other rel values' do - expect(link_to('Example', 'http://www.example.com', rel: 'noreferrer')) - .to eq 'Example' - end - - it 'should not include rel=nofollow for external links on the same host as GitLab' do - expect(Gitlab.config.gitlab).to receive(:host).and_return('example.foo') - expect(link_to('Example', 'http://example.foo/bar')). - to eq 'Example' - end - end - - describe 'markup_render' do - let(:content) { 'Noël' } - - it 'should preserve encoding' do - expect(content.encoding.name).to eq('UTF-8') - expect(render_markup('foo.rst', content).encoding.name).to eq('UTF-8') - end - end -end diff --git a/spec/helpers/broadcast_messages_helper_spec.rb b/spec/helpers/broadcast_messages_helper_spec.rb deleted file mode 100644 index f6df12662bb..00000000000 --- a/spec/helpers/broadcast_messages_helper_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe BroadcastMessagesHelper do - describe 'broadcast_styling' do - let(:broadcast_message) { double(color: "", font: "") } - - context "default style" do - it "should have no style" do - expect(broadcast_styling(broadcast_message)).to match('') - end - end - - context "customiezd style" do - before { broadcast_message.stub(color: "#f2dede", font: "#b94a48") } - - it "should have a customized style" do - expect(broadcast_styling(broadcast_message)). - to match('background-color:#f2dede;color:#b94a48') - end - end - end -end diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb deleted file mode 100644 index 5bd09793b11..00000000000 --- a/spec/helpers/diff_helper_spec.rb +++ /dev/null @@ -1,102 +0,0 @@ -require 'spec_helper' - -describe DiffHelper do - include RepoHelpers - - let(:project) { create(:project) } - let(:commit) { project.repository.commit(sample_commit.id) } - let(:diff) { commit.diffs.first } - let(:diff_file) { Gitlab::Diff::File.new(diff) } - - describe 'diff_hard_limit_enabled?' do - it 'should return true if param is provided' do - allow(controller).to receive(:params) { { force_show_diff: true } } - expect(diff_hard_limit_enabled?).to be_truthy - end - - it 'should return false if param is not provided' do - expect(diff_hard_limit_enabled?).to be_falsey - end - end - - describe 'allowed_diff_size' do - it 'should return hard limit for a diff if force diff is true' do - allow(controller).to receive(:params) { { force_show_diff: true } } - expect(allowed_diff_size).to eq(1000) - end - - it 'should return safe limit for a diff if force diff is false' do - expect(allowed_diff_size).to eq(100) - end - end - - describe 'parallel_diff' do - it 'should return an array of arrays containing the parsed diff' do - expect(parallel_diff(diff_file, 0)). - to match_array(parallel_diff_result_array) - end - end - - describe 'generate_line_code' do - it 'should generate correct line code' do - expect(generate_line_code(diff_file.file_path, diff_file.diff_lines.first)). - to eq('2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6') - end - end - - describe 'unfold_bottom_class' do - it 'should return empty string when bottom line shouldnt be unfolded' do - expect(unfold_bottom_class(false)).to eq('') - end - - it 'should return js class when bottom lines should be unfolded' do - expect(unfold_bottom_class(true)).to eq('js-unfold-bottom') - end - end - - describe 'diff_line_content' do - - it 'should return non breaking space when line is empty' do - expect(diff_line_content(nil)).to eq('  ') - end - - it 'should return the line itself' do - expect(diff_line_content(diff_file.diff_lines.first.text)). - to eq('@@ -6,12 +6,18 @@ module Popen') - expect(diff_line_content(diff_file.diff_lines.first.type)).to eq('match') - expect(diff_line_content(diff_file.diff_lines.first.new_pos)).to eq(6) - end - end - - def parallel_diff_result_array - [ - ["match", 6, "@@ -6,12 +6,18 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6", "match", 6, "@@ -6,12 +6,18 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6"], - [nil, 6, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6", nil, 6, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_6_6"], [nil, 7, " def popen(cmd, path=nil)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7", nil, 7, " def popen(cmd, path=nil)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_7_7"], - [nil, 8, " unless cmd.is_a?(Array)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8", nil, 8, " unless cmd.is_a?(Array)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_8_8"], - ["old", 9, "- raise "System commands must be given as an array of strings"", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9", "new", 9, "+ raise RuntimeError, "System commands must be given as an array of strings"", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_9"], - [nil, 10, " end", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10", nil, 10, " end", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_10_10"], - [nil, 11, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_11_11", nil, 11, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_11_11"], - [nil, 12, " path ||= Dir.pwd", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_12_12", nil, 12, " path ||= Dir.pwd", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_12_12"], - ["old", 13, "- vars = { "PWD" => path }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_13_13", "old", nil, " ", nil], - ["old", 14, "- options = { chdir: path }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_14_13", "new", 13, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_13"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14", "new", 14, "+ vars = {", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_15", "new", 15, "+ "PWD" => path", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_15"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_16", "new", 16, "+ }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_16"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_17", "new", 17, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_17"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_18", "new", 18, "+ options = {", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_18"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_19", "new", 19, "+ chdir: path", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_19"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_20", "new", 20, "+ }", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_20"], - [nil, 15, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_21", nil, 21, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_21"], - [nil, 16, " unless File.directory?(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_16_22", nil, 22, " unless File.directory?(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_16_22"], - [nil, 17, " FileUtils.mkdir_p(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_17_23", nil, 23, " FileUtils.mkdir_p(path)", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_17_23"], - ["match", 19, "@@ -19,6 +25,7 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25", "match", 25, "@@ -19,6 +25,7 @@ module Popen", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25"], - [nil, 19, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25", nil, 25, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_19_25"], - [nil, 20, " @cmd_output = """, "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_20_26", nil, 26, " @cmd_output = """, "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_20_26"], - [nil, 21, " @cmd_status = 0", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_21_27", nil, 27, " @cmd_status = 0", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_21_27"], - [nil, nil, " ", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_28", "new", 28, "+", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_28"], - [nil, 22, " Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_29", nil, 29, " Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_22_29"], - [nil, 23, " @cmd_output << stdout.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_23_30", nil, 30, " @cmd_output << stdout.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_23_30"], - [nil, 24, " @cmd_output << stderr.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_24_31", nil, 31, " @cmd_output << stderr.read", "2f6fcd96b88b36ce98c38da085c795a27d92a3dd_24_31"] - ] - end -end diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb deleted file mode 100644 index b392371deb4..00000000000 --- a/spec/helpers/events_helper_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'spec_helper' - -describe EventsHelper do - include ApplicationHelper - include GitlabMarkdownHelper - - let(:current_user) { create(:user, email: "current@email.com") } - - it 'should display one line of plain text without alteration' do - input = 'A short, plain note' - expect(event_note(input)).to match(input) - expect(event_note(input)).not_to match(/\.\.\.\z/) - end - - it 'should display inline code' do - input = 'A note with `inline code`' - expected = 'A note with inline code' - - expect(event_note(input)).to match(expected) - end - - it 'should truncate a note with multiple paragraphs' do - input = "Paragraph 1\n\nParagraph 2" - expected = 'Paragraph 1...' - - expect(event_note(input)).to match(expected) - end - - it 'should display the first line of a code block' do - input = "```\nCode block\nwith two lines\n```" - expected = '

        ' \
        -               'Code block...
        ' - - expect(event_note(input)).to match(expected) - end - - it 'should truncate a single long line of text' do - text = 'The quick brown fox jumped over the lazy dog twice' # 50 chars - input = "#{text}#{text}#{text}#{text}" # 200 chars - expected = "#{text}#{text}".sub(/.{3}/, '...') - - expect(event_note(input)).to match(expected) - end - - it 'should preserve a link href when link text is truncated' do - text = 'The quick brown fox jumped over the lazy dog' # 44 chars - input = "#{text}#{text}#{text} " # 133 chars - link_url = 'http://example.com/foo/bar/baz' # 30 chars - input << link_url - expected_link_text = 'http://example...' - - expect(event_note(input)).to match(link_url) - expect(event_note(input)).to match(expected_link_text) - end - - it 'should preserve code color scheme' do - input = "```ruby\ndef test\n 'hello world'\nend\n```" - expected = '
        ' \
        -      "def test\n" \
        -      "  \'hello world\'\n" \
        -      "end\n" \
        -      '
        ' - expect(event_note(input)).to eq(expected) - end -end diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb deleted file mode 100644 index 944e743675c..00000000000 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ /dev/null @@ -1,916 +0,0 @@ -require 'spec_helper' - -describe GitlabMarkdownHelper do - include ApplicationHelper - include IssuesHelper - - # TODO: Properly test this - def can?(*) - true - end - - let!(:project) { create(:project) } - let(:empty_project) { create(:empty_project) } - - let(:user) { create(:user, username: 'gfm') } - let(:commit) { project.repository.commit } - let(:earlier_commit){ project.repository.commit("HEAD~2") } - let(:issue) { create(:issue, project: project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:snippet) { create(:project_snippet, project: project) } - let(:member) { project.project_members.where(user_id: user).first } - - # Helper expects a current_user method. - let(:current_user) { user } - - def url_helper(image_name) - File.join(root_url, 'assets', image_name) - end - - before do - # Helper expects a @project instance variable - @project = project - @ref = 'markdown' - @repository = project.repository - @request.host = Gitlab.config.gitlab.host - end - - describe "#gfm" do - it "should return unaltered text if project is nil" do - actual = "Testing references: ##{issue.iid}" - - expect(gfm(actual)).not_to eq(actual) - - @project = nil - expect(gfm(actual)).to eq(actual) - end - - it "should not alter non-references" do - actual = expected = "_Please_ *stop* 'helping' and all the other b*$#%' you do." - expect(gfm(actual)).to eq(expected) - end - - it "should not touch HTML entities" do - allow(@project.issues).to receive(:where). - with(id: '39').and_return([issue]) - actual = 'We'll accept good pull requests.' - expect(gfm(actual)).to eq("We'll accept good pull requests.") - end - - it "should forward HTML options to links" do - expect(gfm("Fixed in #{commit.id}", @project, class: 'foo')). - to have_selector('a.gfm.foo') - end - - describe "referencing a commit range" do - let(:expected) { namespace_project_compare_path(project.namespace, project, from: earlier_commit.id, to: commit.id) } - - it "should link using a full id" do - actual = "What happened in #{earlier_commit.id}...#{commit.id}" - expect(gfm(actual)).to match(expected) - end - - it "should link using a short id" do - actual = "What happened in #{earlier_commit.short_id}...#{commit.short_id}" - expected = namespace_project_compare_path(project.namespace, project, from: earlier_commit.short_id, to: commit.short_id) - expect(gfm(actual)).to match(expected) - end - - it "should link inclusively" do - actual = "What happened in #{earlier_commit.id}..#{commit.id}" - expected = namespace_project_compare_path(project.namespace, project, from: "#{earlier_commit.id}^", to: commit.id) - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - actual = "(see #{earlier_commit.id}...#{commit.id})" - expect(gfm(actual)).to match(expected) - end - - it "should keep whitespace intact" do - actual = "Changes #{earlier_commit.id}...#{commit.id} dramatically" - expected = /Changes #{earlier_commit.id}...#{commit.id}<\/a> dramatically/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - actual = expected = "What happened in #{earlier_commit.id.reverse}...#{commit.id.reverse}" - expect(gfm(actual)).to eq(expected) - end - - it "should include a title attribute" do - actual = "What happened in #{earlier_commit.id}...#{commit.id}" - expect(gfm(actual)).to match(/title="Commits #{earlier_commit.id} through #{commit.id}"/) - end - - it "should include standard gfm classes" do - actual = "What happened in #{earlier_commit.id}...#{commit.id}" - expect(gfm(actual)).to match(/class="\s?gfm gfm-commit_range\s?"/) - end - end - - describe "referencing a commit" do - let(:expected) { namespace_project_commit_path(project.namespace, project, commit) } - - it "should link using a full id" do - actual = "Reverts #{commit.id}" - expect(gfm(actual)).to match(expected) - end - - it "should link using a short id" do - actual = "Backported from #{commit.short_id}" - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - actual = "Reverted (see #{commit.id})" - expect(gfm(actual)).to match(expected) - end - - it "should keep whitespace intact" do - actual = "Changes #{commit.id} dramatically" - expected = /Changes #{commit.id}<\/a> dramatically/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - actual = expected = "What happened in #{commit.id.reverse}" - expect(gfm(actual)).to eq(expected) - end - - it "should include a title attribute" do - actual = "Reverts #{commit.id}" - expect(gfm(actual)).to match(/title="#{commit.link_title}"/) - end - - it "should include standard gfm classes" do - actual = "Reverts #{commit.id}" - expect(gfm(actual)).to match(/class="\s?gfm gfm-commit\s?"/) - end - end - - describe "referencing a team member" do - let(:actual) { "@#{user.username} you are right." } - let(:expected) { user_path(user) } - - before do - project.team << [user, :master] - end - - it "should link using a simple name" do - expect(gfm(actual)).to match(expected) - end - - it "should link using a name with dots" do - user.update_attributes(name: "alphA.Beta") - expect(gfm(actual)).to match(expected) - end - - it "should link using name with underscores" do - user.update_attributes(name: "ping_pong_king") - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - actual = "Mail the admin (@#{user.username})" - expect(gfm(actual)).to match(expected) - end - - it "should keep whitespace intact" do - actual = "Yes, @#{user.username} is right." - expected = /Yes, @#{user.username}<\/a> is right/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - actual = expected = "@#{user.username.reverse} you are right." - expect(gfm(actual)).to eq(expected) - end - - it "should include standard gfm classes" do - expect(gfm(actual)).to match(/class="\s?gfm gfm-project_member\s?"/) - end - end - - # Shared examples for referencing an object - # - # Expects the following attributes to be available in the example group: - # - # - object - The object itself - # - reference - The object reference string (e.g., #1234, $1234, !1234) - # - # Currently limited to Snippets, Issues and MergeRequests - shared_examples 'referenced object' do - let(:actual) { "Reference to #{reference}" } - let(:expected) { polymorphic_path([project.namespace, project, object]) } - - it "should link using a valid id" do - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - # Wrap the reference in parenthesis - expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected) - - # Append some text to the end of the reference - expect(gfm(actual.gsub(reference, "#{reference}, right?"))). - to match(expected) - end - - it "should keep whitespace intact" do - actual = "Referenced #{reference} already." - expected = /Referenced [^\s]+<\/a> already/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - # Modify the reference string so it's still parsed, but is invalid - reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2)) - expect(gfm(actual)).to eq(actual) - end - - it "should include a title attribute" do - title = "#{object.class.to_s.titlecase}: #{object.title}" - expect(gfm(actual)).to match(/title="#{title}"/) - end - - it "should include standard gfm classes" do - css = object.class.to_s.underscore - expect(gfm(actual)).to match(/class="\s?gfm gfm-#{css}\s?"/) - end - end - - # Shared examples for referencing an object in a different project - # - # Expects the following attributes to be available in the example group: - # - # - object - The object itself - # - reference - The object reference string (e.g., #1234, $1234, !1234) - # - other_project - The project that owns the target object - # - # Currently limited to Snippets, Issues and MergeRequests - shared_examples 'cross-project referenced object' do - let(:project_path) { @other_project.path_with_namespace } - let(:full_reference) { "#{project_path}#{reference}" } - let(:actual) { "Reference to #{full_reference}" } - let(:expected) do - if object.is_a?(Commit) - namespace_project_commit_path(@other_project.namespace, @other_project, object) - else - polymorphic_path([@other_project.namespace, @other_project, object]) - end - end - - it 'should link using a valid id' do - expect(gfm(actual)).to match( - /#{expected}.*#{Regexp.escape(full_reference)}/ - ) - end - - it 'should link with adjacent text' do - # Wrap the reference in parenthesis - expect(gfm(actual.gsub(full_reference, "(#{full_reference})"))).to( - match(expected) - ) - - # Append some text to the end of the reference - expect(gfm(actual.gsub(full_reference, "#{full_reference}, right?"))). - to(match(expected)) - end - - it 'should keep whitespace intact' do - actual = "Referenced #{full_reference} already." - expected = /Referenced [^\s]+<\/a> already/ - expect(gfm(actual)).to match(expected) - end - - it 'should not link with an invalid id' do - # Modify the reference string so it's still parsed, but is invalid - if object.is_a?(Commit) - reference.gsub!(/^(.).+$/, '\1' + '12345abcd') - else - reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2)) - end - expect(gfm(actual)).to eq(actual) - end - - it 'should include a title attribute' do - if object.is_a?(Commit) - title = object.link_title - else - title = "#{object.class.to_s.titlecase}: #{object.title}" - end - expect(gfm(actual)).to match(/title="#{title}"/) - end - - it 'should include standard gfm classes' do - css = object.class.to_s.underscore - expect(gfm(actual)).to match(/class="\s?gfm gfm-#{css}\s?"/) - end - end - - describe "referencing an issue" do - let(:object) { issue } - let(:reference) { "##{issue.iid}" } - - include_examples 'referenced object' - end - - context 'cross-repo references' do - before(:all) do - @other_project = create(:project, :public) - @commit2 = @other_project.repository.commit - @issue2 = create(:issue, project: @other_project) - @merge_request2 = create(:merge_request, - source_project: @other_project, - target_project: @other_project) - end - - describe 'referencing an issue in another project' do - let(:object) { @issue2 } - let(:reference) { "##{@issue2.iid}" } - - include_examples 'cross-project referenced object' - end - - describe 'referencing an merge request in another project' do - let(:object) { @merge_request2 } - let(:reference) { "!#{@merge_request2.iid}" } - - include_examples 'cross-project referenced object' - end - - describe 'referencing a commit in another project' do - let(:object) { @commit2 } - let(:reference) { "@#{@commit2.id}" } - - include_examples 'cross-project referenced object' - end - end - - describe "referencing a Jira issue" do - let(:actual) { "Reference to JIRA-#{issue.iid}" } - let(:expected) { "http://jira.example/browse/JIRA-#{issue.iid}" } - let(:reference) { "JIRA-#{issue.iid}" } - - before do - jira = @project.create_jira_service if @project.jira_service.nil? - properties = {"title"=>"JIRA tracker", "project_url"=>"http://jira.example/issues/?jql=project=A", "issues_url"=>"http://jira.example/browse/:id", "new_issue_url"=>"http://jira.example/secure/CreateIssue.jspa"} - jira.update_attributes(properties: properties, active: true) - end - - after do - @project.jira_service.destroy! unless @project.jira_service.nil? - end - - it "should link using a valid id" do - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - # Wrap the reference in parenthesis - expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected) - - # Append some text to the end of the reference - expect(gfm(actual.gsub(reference, "#{reference}, right?"))). - to match(expected) - end - - it "should keep whitespace intact" do - actual = "Referenced #{reference} already." - expected = /Referenced [^\s]+<\/a> already/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - # Modify the reference string so it's still parsed, but is invalid - invalid_reference = actual.gsub(/(\d+)$/, "r45") - expect(gfm(invalid_reference)).to eq(invalid_reference) - end - - it "should include a title attribute" do - title = "Issue in JIRA tracker" - expect(gfm(actual)).to match(/title="#{title}"/) - end - - it "should include standard gfm classes" do - expect(gfm(actual)).to match(/class="\s?gfm gfm-issue\s?"/) - end - end - - describe "referencing a merge request" do - let(:object) { merge_request } - let(:reference) { "!#{merge_request.iid}" } - - include_examples 'referenced object' - end - - describe "referencing a snippet" do - let(:object) { snippet } - let(:reference) { "$#{snippet.id}" } - let(:actual) { "Reference to #{reference}" } - let(:expected) { namespace_project_snippet_path(project.namespace, project, object) } - - it "should link using a valid id" do - expect(gfm(actual)).to match(expected) - end - - it "should link with adjacent text" do - # Wrap the reference in parenthesis - expect(gfm(actual.gsub(reference, "(#{reference})"))).to match(expected) - - # Append some text to the end of the reference - expect(gfm(actual.gsub(reference, "#{reference}, right?"))).to match(expected) - end - - it "should keep whitespace intact" do - actual = "Referenced #{reference} already." - expected = /Referenced [^\s]+<\/a> already/ - expect(gfm(actual)).to match(expected) - end - - it "should not link with an invalid id" do - # Modify the reference string so it's still parsed, but is invalid - reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2)) - expect(gfm(actual)).to eq(actual) - end - - it "should include a title attribute" do - title = "Snippet: #{object.title}" - expect(gfm(actual)).to match(/title="#{title}"/) - end - - it "should include standard gfm classes" do - css = object.class.to_s.underscore - expect(gfm(actual)).to match(/class="\s?gfm gfm-snippet\s?"/) - end - - end - - describe "referencing multiple objects" do - let(:actual) { "!#{merge_request.iid} -> #{commit.id} -> ##{issue.iid}" } - - it "should link to the merge request" do - expected = namespace_project_merge_request_path(project.namespace, project, merge_request) - expect(gfm(actual)).to match(expected) - end - - it "should link to the commit" do - expected = namespace_project_commit_path(project.namespace, project, commit) - expect(gfm(actual)).to match(expected) - end - - it "should link to the issue" do - expected = namespace_project_issue_path(project.namespace, project, issue) - expect(gfm(actual)).to match(expected) - end - end - - describe "emoji" do - it "matches at the start of a string" do - expect(gfm(":+1:")).to match(/ big time/) - end - - it "ignores invalid emoji" do - expect(gfm(":invalid-emoji:")).not_to match(/") - - # Leading commit link - expect(groups[0]).to match(/href="#{commit_path}"/) - expect(groups[0]).to match(/This should finally fix $/) - - # First issue link - expect(groups[1]). - to match(/href="#{namespace_project_issue_path(project.namespace, project, issues[0])}"/) - expect(groups[1]).to match(/##{issues[0].iid}$/) - - # Internal commit link - expect(groups[2]).to match(/href="#{commit_path}"/) - expect(groups[2]).to match(/ and /) - - # Second issue link - expect(groups[3]). - to match(/href="#{namespace_project_issue_path(project.namespace, project, issues[1])}"/) - expect(groups[3]).to match(/##{issues[1].iid}$/) - - # Trailing commit link - expect(groups[4]).to match(/href="#{commit_path}"/) - expect(groups[4]).to match(/ for real$/) - end - - it "should forward HTML options" do - actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo') - expect(actual).to have_selector 'a.gfm.gfm-commit.foo' - end - - it "escapes HTML passed in as the body" do - actual = "This is a

        test

        - see ##{issues[0].iid}" - expect(link_to_gfm(actual, commit_path)). - to match('<h1>test</h1>') - end - end - - describe "#markdown" do - it "should handle references in paragraphs" do - actual = "\n\nLorem ipsum dolor sit amet. #{commit.id} Nam pulvinar sapien eget.\n" - expected = namespace_project_commit_path(project.namespace, project, commit) - expect(markdown(actual)).to match(expected) - end - - it "should handle references in headers" do - actual = "\n# Working around ##{issue.iid}\n## Apply !#{merge_request.iid}" - - expect(markdown(actual, no_header_anchors: true)). - to match(%r{Working around ##{issue.iid}

      nts8#c&fs#bvg&9 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 diff --git a/doc/workflow/github_importer/importer.png b/doc/workflow/github_importer/importer.png deleted file mode 100644 index 57636717571a17ea17ee5cfdabbd4408597fd668..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39335 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

    2. }) - expect(markdown(actual, no_header_anchors: true)). - to match(%r{Apply !#{merge_request.iid}}) - end - - it "should add ids and links to headers" do - # Test every rule except nested tags. - text = '..Ab_c-d. e..' - id = 'ab_c-d-e' - expect(markdown("# #{text}")). - to match(%r{

      #{text}

      }) - expect(markdown("# #{text}", {no_header_anchors:true})). - to eq("

      #{text}

      ") - - id = 'link-text' - expect(markdown("# [link text](url) ![img alt](url)")).to match( - %r{

      link text ]*>

      } - ) - end - - it "should handle references in lists" do - project.team << [user, :master] - - actual = "\n* dark: ##{issue.iid}\n* light by @#{member.user.username}" - - expect(markdown(actual)). - to match(%r{
    3. dark: ##{issue.iid}
    4. }) - expect(markdown(actual)). - to match(%r{
    5. light by @#{member.user.username}
    6. }) - end - - it "should not link the apostrophe to issue 39" do - project.team << [user, :master] - allow(project.issues). - to receive(:where).with(iid: '39').and_return([issue]) - - actual = "Yes, it is @#{member.user.username}'s task." - expected = /Yes, it is @#{member.user.username}<\/a>'s task/ - expect(markdown(actual)).to match(expected) - end - - it "should not link the apostrophe to issue 39 in code blocks" do - project.team << [user, :master] - allow(project.issues). - to receive(:where).with(iid: '39').and_return([issue]) - - actual = "Yes, `it is @#{member.user.username}'s task.`" - expected = /Yes, it is @gfm\'s task.<\/code>/ - expect(markdown(actual)).to match(expected) - end - - it "should handle references in " do - actual = "Apply _!#{merge_request.iid}_ ASAP" - - expect(markdown(actual)). - to match(%r{Apply !#{merge_request.iid}}) - end - - it "should handle tables" do - actual = %Q{| header 1 | header 2 | -| -------- | -------- | -| cell 1 | cell 2 | -| cell 3 | cell 4 |} - - expect(markdown(actual)).to match(/\Asome code from $#{snippet.id}\nhere too\n\n" - - expect(helper.markdown("\n some code from $#{snippet.id}\n here too\n")). - to eq(target_html) - expect(helper.markdown("\n```\nsome code from $#{snippet.id}\nhere too\n```\n")). - to eq(target_html) - end - - it "should leave inline code untouched" do - expect(markdown("\nDon't use `$#{snippet.id}` here.\n")).to eq( - "

      Don't use $#{snippet.id} here.

      \n" - ) - end - - it "should leave ref-like autolinks untouched" do - expect(markdown("look at http://example.tld/#!#{merge_request.iid}")).to eq("

      look at http://example.tld/#!#{merge_request.iid}

      \n") - end - - it "should leave ref-like href of 'manual' links untouched" do - expect(markdown("why not [inspect !#{merge_request.iid}](http://example.tld/#!#{merge_request.iid})")).to eq("

      why not inspect !#{merge_request.iid}

      \n") - end - - it "should leave ref-like src of images untouched" do - expect(markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.iid})")).to eq("

      screen shot: \"some

      \n") - end - - it "should generate absolute urls for refs" do - expect(markdown("##{issue.iid}")).to include(namespace_project_issue_path(project.namespace, project, issue)) - end - - it "should generate absolute urls for emoji" do - expect(markdown(':smile:')).to( - include(%(src="#{Gitlab.config.gitlab.url}/assets/emoji/#{Emoji.emoji_filename('smile')}.png)) - ) - end - - it "should generate absolute urls for emoji if relative url is present" do - allow(Gitlab.config.gitlab).to receive(:url).and_return('http://localhost/gitlab/root') - expect(markdown(":smile:")).to include("src=\"http://localhost/gitlab/root/assets/emoji/#{Emoji.emoji_filename('smile')}.png") - end - - it "should generate absolute urls for emoji if asset_host is present" do - allow(Gitlab::Application.config).to receive(:asset_host).and_return("https://cdn.example.com") - ActionView::Base.any_instance.stub_chain(:config, :asset_host).and_return("https://cdn.example.com") - expect(markdown(":smile:")).to include("src=\"https://cdn.example.com/assets/emoji/#{Emoji.emoji_filename('smile')}.png") - end - - - it "should handle relative urls for a file in master" do - actual = "[GitLab API doc](doc/api/README.md)\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should handle relative urls for a file in master with an anchor" do - actual = "[GitLab API doc](doc/api/README.md#section)\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should not handle relative urls for the current file with an anchor" do - actual = "[GitLab API doc](#section)\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should handle relative urls for a directory in master" do - actual = "[GitLab API doc](doc/api)\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should handle absolute urls" do - actual = "[GitLab](https://www.gitlab.com)\n" - expected = "

      GitLab

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should handle relative urls in reference links for a file in master" do - actual = "[GitLab API doc][GitLab readme]\n [GitLab readme]: doc/api/README.md\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should handle relative urls in reference links for a directory in master" do - actual = "[GitLab API doc directory][GitLab readmes]\n [GitLab readmes]: doc/api/\n" - expected = "

      GitLab API doc directory

      \n" - expect(markdown(actual)).to match(expected) - end - - it "should not handle malformed relative urls in reference links for a file in master" do - actual = "[GitLab readme]: doc/api/README.md\n" - expected = "" - expect(markdown(actual)).to match(expected) - end - - it 'should allow whitelisted HTML tags from the user' do - actual = '
      Term
      Definition
      ' - expect(markdown(actual)).to match(actual) - end - - it 'should sanitize tags that are not whitelisted' do - actual = 'no blinks' - expected = 'no inputs allowed no blinks' - expect(markdown(actual)).to match(expected) - expect(markdown(actual)).not_to match('<.textarea>') - expect(markdown(actual)).not_to match('<.blink>') - end - - it 'should allow whitelisted tag attributes from the user' do - actual = 'link text' - expect(markdown(actual)).to match(actual) - end - - it 'should sanitize tag attributes that are not whitelisted' do - actual = 'link text' - expected = 'link text' - expect(markdown(actual)).to match(expected) - end - - it 'should sanitize javascript in attributes' do - actual = %q(link text) - expected = 'link text' - expect(markdown(actual)).to match(expected) - end - end - - describe 'markdown for empty repository' do - before do - @project = empty_project - @repository = empty_project.repository - end - - it "should not touch relative urls" do - actual = "[GitLab API doc][GitLab readme]\n [GitLab readme]: doc/api/README.md\n" - expected = "

      GitLab API doc

      \n" - expect(markdown(actual)).to match(expected) - end - end - - describe "#render_wiki_content" do - before do - @wiki = double('WikiPage') - allow(@wiki).to receive(:content).and_return('wiki content') - end - - it "should use GitLab Flavored Markdown for markdown files" do - allow(@wiki).to receive(:format).and_return(:markdown) - - expect(helper).to receive(:markdown).with('wiki content') - - helper.render_wiki_content(@wiki) - end - - it "should use the Gollum renderer for all other file types" do - allow(@wiki).to receive(:format).and_return(:rdoc) - formatted_content_stub = double('formatted_content') - expect(formatted_content_stub).to receive(:html_safe) - allow(@wiki).to receive(:formatted_content).and_return(formatted_content_stub) - - helper.render_wiki_content(@wiki) - end - end - - describe '#gfm_with_tasks' do - before(:all) do - @source_text_asterisk = </) - expect(nav_link(controller: :bar)).not_to match(/active/) - expect(nav_link(controller: [:foo, :bar])).to match(/active/) - end - - it "performs checks on the current action" do - expect(nav_link(action: :foo)).to match(/
    7. /) - expect(nav_link(action: :bar)).not_to match(/active/) - expect(nav_link(action: [:foo, :bar])).to match(/active/) - end - - it "performs checks on both controller and action when both are present" do - expect(nav_link(controller: :bar, action: :foo)).not_to match(/active/) - expect(nav_link(controller: :foo, action: :bar)).not_to match(/active/) - expect(nav_link(controller: :foo, action: :foo)).to match(/active/) - end - - it "accepts a path shorthand" do - expect(nav_link(path: 'foo#bar')).not_to match(/active/) - expect(nav_link(path: 'foo#foo')).to match(/active/) - end - - it "passes extra html options to the list element" do - expect(nav_link(action: :foo, html_options: {class: 'home'})).to match(/
    8. /) - expect(nav_link(html_options: {class: 'active'})).to match(/
    9. /) - end - end -end diff --git a/spec/helpers/tree_helper_spec.rb b/spec/helpers/tree_helper_spec.rb deleted file mode 100644 index 8271e00f41b..00000000000 --- a/spec/helpers/tree_helper_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe TreeHelper do - describe 'flatten_tree' do - let(:project) { create(:project) } - - before { - @repository = project.repository - @commit = project.repository.commit("e56497bb") - } - - context "on a directory containing more than one file/directory" do - let(:tree_item) { double(name: "files", path: "files") } - - it "should return the directory name" do - expect(flatten_tree(tree_item)).to match('files') - end - end - - context "on a directory containing only one directory" do - let(:tree_item) { double(name: "foo", path: "foo") } - - it "should return the flattened path" do - expect(flatten_tree(tree_item)).to match('foo/bar') - end - end - end -end diff --git a/spec/javascripts/helpers/.gitkeep b/spec/javascripts/helpers/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/spec/javascripts/stat_graph_contributors_graph_spec.js b/spec/javascripts/stat_graph_contributors_graph_spec.js deleted file mode 100644 index 1090cb7f620..00000000000 --- a/spec/javascripts/stat_graph_contributors_graph_spec.js +++ /dev/null @@ -1,126 +0,0 @@ -describe("ContributorsGraph", function () { - describe("#set_x_domain", function () { - it("set the x_domain", function () { - ContributorsGraph.set_x_domain(20) - expect(ContributorsGraph.prototype.x_domain).toEqual(20) - }) - }) - - describe("#set_y_domain", function () { - it("sets the y_domain", function () { - ContributorsGraph.set_y_domain([{commits: 30}]) - expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30]) - }) - }) - - describe("#init_x_domain", function () { - it("sets the initial x_domain", function () { - ContributorsGraph.init_x_domain([{date: "2013-01-31"}, {date: "2012-01-31"}]) - expect(ContributorsGraph.prototype.x_domain).toEqual(["2012-01-31", "2013-01-31"]) - }) - }) - - describe("#init_y_domain", function () { - it("sets the initial y_domain", function () { - ContributorsGraph.init_y_domain([{commits: 30}]) - expect(ContributorsGraph.prototype.y_domain).toEqual([0, 30]) - }) - }) - - describe("#init_domain", function () { - it("calls init_x_domain and init_y_domain", function () { - spyOn(ContributorsGraph, "init_x_domain") - spyOn(ContributorsGraph, "init_y_domain") - ContributorsGraph.init_domain() - expect(ContributorsGraph.init_x_domain).toHaveBeenCalled() - expect(ContributorsGraph.init_y_domain).toHaveBeenCalled() - }) - }) - - describe("#set_dates", function () { - it("sets the dates", function () { - ContributorsGraph.set_dates("2013-12-01") - expect(ContributorsGraph.prototype.dates).toEqual("2013-12-01") - }) - }) - - describe("#set_x_domain", function () { - it("sets the instance's x domain using the prototype's x_domain", function () { - ContributorsGraph.prototype.x_domain = 20 - var instance = new ContributorsGraph() - instance.x = d3.time.scale().range([0, 100]).clamp(true) - spyOn(instance.x, 'domain') - instance.set_x_domain() - expect(instance.x.domain).toHaveBeenCalledWith(20) - }) - }) - - describe("#set_y_domain", function () { - it("sets the instance's y domain using the prototype's y_domain", function () { - ContributorsGraph.prototype.y_domain = 30 - var instance = new ContributorsGraph() - instance.y = d3.scale.linear().range([100, 0]).nice() - spyOn(instance.y, 'domain') - instance.set_y_domain() - expect(instance.y.domain).toHaveBeenCalledWith(30) - }) - }) - - describe("#set_domain", function () { - it("calls set_x_domain and set_y_domain", function () { - var instance = new ContributorsGraph() - spyOn(instance, 'set_x_domain') - spyOn(instance, 'set_y_domain') - instance.set_domain() - expect(instance.set_x_domain).toHaveBeenCalled() - expect(instance.set_y_domain).toHaveBeenCalled() - }) - }) - - describe("#set_data", function () { - it("sets the data", function () { - var instance = new ContributorsGraph() - instance.set_data("20") - expect(instance.data).toEqual("20") - }) - }) -}) - -describe("ContributorsMasterGraph", function () { - - // TODO: fix or remove - //describe("#process_dates", function () { - //it("gets and parses dates", function () { - //var graph = new ContributorsMasterGraph() - //var data = 'random data here' - //spyOn(graph, 'parse_dates') - //spyOn(graph, 'get_dates').andReturn("get") - //spyOn(ContributorsGraph,'set_dates').andCallThrough() - //graph.process_dates(data) - //expect(graph.parse_dates).toHaveBeenCalledWith(data) - //expect(graph.get_dates).toHaveBeenCalledWith(data) - //expect(ContributorsGraph.set_dates).toHaveBeenCalledWith("get") - //}) - //}) - - describe("#get_dates", function () { - it("plucks the date field from data collection", function () { - var graph = new ContributorsMasterGraph() - var data = [{date: "2013-01-01"}, {date: "2012-12-15"}] - expect(graph.get_dates(data)).toEqual(["2013-01-01", "2012-12-15"]) - }) - }) - - describe("#parse_dates", function () { - it("parses the dates", function () { - var graph = new ContributorsMasterGraph() - var parseDate = d3.time.format("%Y-%m-%d").parse - var data = [{date: "2013-01-01"}, {date: "2012-12-15"}] - var correct = [{date: parseDate(data[0].date)}, {date: parseDate(data[1].date)}] - graph.parse_dates(data) - expect(data).toEqual(correct) - }) - }) - - -}) diff --git a/spec/javascripts/stat_graph_contributors_util_spec.js b/spec/javascripts/stat_graph_contributors_util_spec.js deleted file mode 100644 index 9c1b588861d..00000000000 --- a/spec/javascripts/stat_graph_contributors_util_spec.js +++ /dev/null @@ -1,208 +0,0 @@ -describe("ContributorsStatGraphUtil", function () { - - describe("#parse_log", function () { - it("returns a correctly parsed log", function () { - var fake_log = [ - {author_email: "karlo@email.com", author_name: "Karlo Soriano", date: "2013-05-09", additions: 471}, - {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 6, deletions: 1}, - {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 19, deletions: 3}, - {author_email: "dzaporozhets@email.com", author_name: "Dmitriy Zaporozhets", date: "2013-05-08", additions: 29, deletions: 3}] - - var correct_parsed_log = { - total: [ - {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}, - {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}], - by_author: - [ - { - author_name: "Karlo Soriano", author_email: "karlo@email.com", - "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1} - }, - { - author_name: "Dmitriy Zaporozhets",author_email: "dzaporozhets@email.com", - "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3} - } - ] - } - expect(ContributorsStatGraphUtil.parse_log(fake_log)).toEqual(correct_parsed_log) - }) - }) - - describe("#store_data", function () { - - var fake_entry = {author: "Karlo Soriano", date: "2013-05-09", additions: 471} - var fake_total = {} - var fake_by_author = {} - - it("calls #store_commits", function () { - spyOn(ContributorsStatGraphUtil, 'store_commits') - ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author) - expect(ContributorsStatGraphUtil.store_commits).toHaveBeenCalled() - }) - - it("calls #store_additions", function () { - spyOn(ContributorsStatGraphUtil, 'store_additions') - ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author) - expect(ContributorsStatGraphUtil.store_additions).toHaveBeenCalled() - }) - - it("calls #store_deletions", function () { - spyOn(ContributorsStatGraphUtil, 'store_deletions') - ContributorsStatGraphUtil.store_data(fake_entry, fake_total, fake_by_author) - expect(ContributorsStatGraphUtil.store_deletions).toHaveBeenCalled() - }) - - }) - - // TODO: fix or remove - //describe("#store_commits", function () { - //var fake_total = "fake_total" - //var fake_by_author = "fake_by_author" - - //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () { - //spyOn(ContributorsStatGraphUtil, 'add') - //ContributorsStatGraphUtil.store_commits(fake_total, fake_by_author) - //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "commits", 1], ["fake_by_author", "commits", 1]]) - //}) - //}) - - describe("#add", function () { - it("adds 1 to current test_field in collection", function () { - var fake_collection = {test_field: 10} - ContributorsStatGraphUtil.add(fake_collection, "test_field", 1) - expect(fake_collection.test_field).toEqual(11) - }) - - it("inits and adds 1 if test_field in collection is not defined", function () { - var fake_collection = {} - ContributorsStatGraphUtil.add(fake_collection, "test_field", 1) - expect(fake_collection.test_field).toEqual(1) - }) - }) - - // TODO: fix or remove - //describe("#store_additions", function () { - //var fake_entry = {additions: 10} - //var fake_total= "fake_total" - //var fake_by_author = "fake_by_author" - //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () { - //spyOn(ContributorsStatGraphUtil, 'add') - //ContributorsStatGraphUtil.store_additions(fake_entry, fake_total, fake_by_author) - //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "additions", 10], ["fake_by_author", "additions", 10]]) - //}) - //}) - - // TODO: fix or remove - //describe("#store_deletions", function () { - //var fake_entry = {deletions: 10} - //var fake_total= "fake_total" - //var fake_by_author = "fake_by_author" - //it("calls #add twice with arguments fake_total and fake_by_author respectively", function () { - //spyOn(ContributorsStatGraphUtil, 'add') - //ContributorsStatGraphUtil.store_deletions(fake_entry, fake_total, fake_by_author) - //expect(ContributorsStatGraphUtil.add.argsForCall).toEqual([["fake_total", "deletions", 10], ["fake_by_author", "deletions", 10]]) - //}) - //}) - - describe("#add_date", function () { - it("adds a date field to the collection", function () { - var fake_date = "2013-10-02" - var fake_collection = {} - ContributorsStatGraphUtil.add_date(fake_date, fake_collection) - expect(fake_collection[fake_date].date).toEqual("2013-10-02") - }) - }) - - describe("#add_author", function () { - it("adds an author field to the collection", function () { - var fake_author = { author_name: "Author", author_email: 'fake@email.com' } - var fake_collection = {} - ContributorsStatGraphUtil.add_author(fake_author, fake_collection) - expect(fake_collection[fake_author.author_name].author_name).toEqual("Author") - }) - }) - - describe("#get_total_data", function () { - it("returns the collection sorted via specified field", function () { - var fake_parsed_log = { - total: [{date: "2013-05-09", additions: 471, deletions: 0, commits: 1}, - {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}], - by_author:[ - { - author: "Karlo Soriano", - "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1} - }, - { - author: "Dmitriy Zaporozhets", - "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3} - } - ]}; - var correct_total_data = [{date: "2013-05-08", commits: 3}, - {date: "2013-05-09", commits: 1}]; - expect(ContributorsStatGraphUtil.get_total_data(fake_parsed_log, "commits")).toEqual(correct_total_data) - }) - }) - - describe("#pick_field", function () { - it("returns the collection with only the specified field and date", function () { - var fake_parsed_log_total = [{date: "2013-05-09", additions: 471, deletions: 0, commits: 1}, - {date: "2013-05-08", additions: 54, deletions: 7, commits: 3}]; - ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits") - var correct_pick_field_data = [{date: "2013-05-09", commits: 1},{date: "2013-05-08", commits: 3}]; - expect(ContributorsStatGraphUtil.pick_field(fake_parsed_log_total, "commits")).toEqual(correct_pick_field_data) - }) - }) - - describe("#get_author_data", function () { - it("returns the log by author sorted by specified field", function () { - var fake_parsed_log = { - total: [ - {date: "2013-05-09", additions: 471, deletions: 0, commits: 1}, - {date: "2013-05-08", additions: 54, deletions: 7, commits: 3} - ], - by_author: [ - { - author_name: "Karlo Soriano", author_email: "karlo@email.com", - "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1} - }, - { - author_name: "Dmitriy Zaporozhets", author_email: "dzaporozhets@email.com", - "2013-05-08": {date: "2013-05-08", additions: 54, deletions: 7, commits: 3} - } - ] - } - var correct_author_data = [ - {author_name:"Dmitriy Zaporozhets",author_email:"dzaporozhets@email.com",dates:{"2013-05-08":3},deletions:7,additions:54,"commits":3}, - {author_name:"Karlo Soriano",author_email:"karlo@email.com",dates:{"2013-05-09":1},deletions:0,additions:471,commits:1} - ] - expect(ContributorsStatGraphUtil.get_author_data(fake_parsed_log, "commits")).toEqual(correct_author_data) - }) - }) - - describe("#parse_log_entry", function () { - it("adds the corresponding info from the log entry to the author", function () { - var fake_log_entry = { author_name: "Karlo Soriano", author_email: "karlo@email.com", - "2013-05-09": {date: "2013-05-09", additions: 471, deletions: 0, commits: 1} - } - var correct_parsed_log = {author_name:"Karlo Soriano",author_email:"karlo@email.com",dates:{"2013-05-09":1},deletions:0,additions:471,commits:1} - expect(ContributorsStatGraphUtil.parse_log_entry(fake_log_entry, 'commits', null)).toEqual(correct_parsed_log) - }) - }) - - describe("#in_range", function () { - var date = "2013-05-09" - it("returns true if date_range is null", function () { - expect(ContributorsStatGraphUtil.in_range(date, null)).toEqual(true) - }) - it("returns true if date is in range", function () { - var date_range = [new Date("2013-01-01"), new Date("2013-12-12")] - expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(true) - }) - it("returns false if date is not in range", function () { - var date_range = [new Date("1999-12-01"), new Date("2000-12-01")] - expect(ContributorsStatGraphUtil.in_range(date, date_range)).toEqual(false) - }) - }) - - -}) diff --git a/spec/javascripts/stat_graph_spec.js b/spec/javascripts/stat_graph_spec.js deleted file mode 100644 index b589af34610..00000000000 --- a/spec/javascripts/stat_graph_spec.js +++ /dev/null @@ -1,17 +0,0 @@ -describe("StatGraph", function () { - - describe("#get_log", function () { - it("returns log", function () { - StatGraph.log = "test"; - expect(StatGraph.get_log()).toBe("test"); - }); - }); - - describe("#set_log", function () { - it("sets the log", function () { - StatGraph.set_log("test"); - expect(StatGraph.log).toBe("test"); - }) - }) - -}); diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml deleted file mode 100644 index 9bfa261a356..00000000000 --- a/spec/javascripts/support/jasmine.yml +++ /dev/null @@ -1,76 +0,0 @@ -# src_files -# -# Return an array of filepaths relative to src_dir to include before jasmine specs. -# Default: [] -# -# EXAMPLE: -# -# src_files: -# - lib/source1.js -# - lib/source2.js -# - dist/**/*.js -# -src_files: - - assets/application.js - -# stylesheets -# -# Return an array of stylesheet filepaths relative to src_dir to include before jasmine specs. -# Default: [] -# -# EXAMPLE: -# -# stylesheets: -# - css/style.css -# - stylesheets/*.css -# -stylesheets: - - stylesheets/**/*.css - -# helpers -# -# Return an array of filepaths relative to spec_dir to include before jasmine specs. -# Default: ["helpers/**/*.js"] -# -# EXAMPLE: -# -# helpers: -# - helpers/**/*.js -# -helpers: - - helpers/**/*.js - -# spec_files -# -# Return an array of filepaths relative to spec_dir to include. -# Default: ["**/*[sS]pec.js"] -# -# EXAMPLE: -# -# spec_files: -# - **/*[sS]pec.js -# -spec_files: - - '**/*[sS]pec.js' - -# src_dir -# -# Source directory path. Your src_files must be returned relative to this path. Will use root if left blank. -# Default: project root -# -# EXAMPLE: -# -# src_dir: public -# -src_dir: - -# spec_dir -# -# Spec directory path. Your spec_files must be returned relative to this path. -# Default: spec/javascripts -# -# EXAMPLE: -# -# spec_dir: spec/javascripts -# -spec_dir: spec/javascripts diff --git a/spec/javascripts/support/jasmine_helper.rb b/spec/javascripts/support/jasmine_helper.rb deleted file mode 100644 index b4919802afe..00000000000 --- a/spec/javascripts/support/jasmine_helper.rb +++ /dev/null @@ -1,11 +0,0 @@ -#Use this file to set/override Jasmine configuration options -#You can remove it if you don't need it. -#This file is loaded *after* jasmine.yml is interpreted. -# -#Example: using a different boot file. -#Jasmine.configure do |config| -# config.boot_dir = '/absolute/path/to/boot_dir' -# config.boot_files = lambda { ['/absolute/path/to/boot_dir/file.js'] } -#end -# - diff --git a/spec/lib/disable_email_interceptor_spec.rb b/spec/lib/disable_email_interceptor_spec.rb deleted file mode 100644 index 06d5450688b..00000000000 --- a/spec/lib/disable_email_interceptor_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe DisableEmailInterceptor do - before do - ActionMailer::Base.register_interceptor(DisableEmailInterceptor) - end - - it 'should not send emails' do - allow(Gitlab.config.gitlab).to receive(:email_enabled).and_return(false) - expect { - deliver_mail - }.not_to change(ActionMailer::Base.deliveries, :count) - end - - after do - # Removing interceptor from the list because unregister_interceptor is - # implemented in later version of mail gem - # See: https://github.com/mikel/mail/pull/705 - Mail.class_variable_set(:@@delivery_interceptors, []) - end - - def deliver_mail - key = create :personal_key - Notify.new_ssh_key_email(key.id) - end -end diff --git a/spec/lib/extracts_path_spec.rb b/spec/lib/extracts_path_spec.rb deleted file mode 100644 index ac602eac154..00000000000 --- a/spec/lib/extracts_path_spec.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'spec_helper' - -describe ExtractsPath do - include ExtractsPath - - let(:project) { double('project') } - - before do - @project = project - project.stub(repository: double(ref_names: ['master', 'foo/bar/baz', 'v1.0.0', 'v2.0.0'])) - project.stub(path_with_namespace: 'gitlab/gitlab-ci') - end - - describe '#extract_ref' do - it "returns an empty pair when no @project is set" do - @project = nil - expect(extract_ref('master/CHANGELOG')).to eq(['', '']) - end - - context "without a path" do - it "extracts a valid branch" do - expect(extract_ref('master')).to eq(['master', '']) - end - - it "extracts a valid tag" do - expect(extract_ref('v2.0.0')).to eq(['v2.0.0', '']) - end - - it "extracts a valid commit ref without a path" do - expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062')).to eq( - ['f4b14494ef6abf3d144c28e4af0c20143383e062', ''] - ) - end - - it "falls back to a primitive split for an invalid ref" do - expect(extract_ref('stable')).to eq(['stable', '']) - end - end - - context "with a path" do - it "extracts a valid branch" do - expect(extract_ref('foo/bar/baz/CHANGELOG')).to eq(['foo/bar/baz', 'CHANGELOG']) - end - - it "extracts a valid tag" do - expect(extract_ref('v2.0.0/CHANGELOG')).to eq(['v2.0.0', 'CHANGELOG']) - end - - it "extracts a valid commit SHA" do - expect(extract_ref('f4b14494ef6abf3d144c28e4af0c20143383e062/CHANGELOG')).to eq( - ['f4b14494ef6abf3d144c28e4af0c20143383e062', 'CHANGELOG'] - ) - end - - it "falls back to a primitive split for an invalid ref" do - expect(extract_ref('stable/CHANGELOG')).to eq(['stable', 'CHANGELOG']) - end - end - end -end diff --git a/spec/lib/file_size_validator_spec.rb b/spec/lib/file_size_validator_spec.rb deleted file mode 100644 index 5c89c854714..00000000000 --- a/spec/lib/file_size_validator_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::FileSizeValidatorSpec' do - let(:validator) { FileSizeValidator.new(options) } - let(:attachment) { AttachmentUploader.new } - let(:note) { create(:note) } - - describe 'options uses an integer' do - let(:options) { { maximum: 10, attributes: { attachment: attachment } } } - - it 'attachment exceeds maximum limit' do - allow(attachment).to receive(:size) { 100 } - validator.validate_each(note, :attachment, attachment) - expect(note.errors).to have_key(:attachment) - end - - it 'attachment under maximum limit' do - allow(attachment).to receive(:size) { 1 } - validator.validate_each(note, :attachment, attachment) - expect(note.errors).not_to have_key(:attachment) - end - end - - describe 'options uses a symbol' do - let(:options) { { maximum: :test, - attributes: { attachment: attachment } } } - before do - allow(note).to receive(:test) { 10 } - end - - it 'attachment exceeds maximum limit' do - allow(attachment).to receive(:size) { 100 } - validator.validate_each(note, :attachment, attachment) - expect(note.errors).to have_key(:attachment) - end - - it 'attachment under maximum limit' do - allow(attachment).to receive(:size) { 1 } - validator.validate_each(note, :attachment, attachment) - expect(note.errors).not_to have_key(:attachment) - end - end -end diff --git a/spec/lib/git_ref_validator_spec.rb b/spec/lib/git_ref_validator_spec.rb deleted file mode 100644 index 4633b6f3934..00000000000 --- a/spec/lib/git_ref_validator_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitRefValidator do - it { expect(Gitlab::GitRefValidator.validate('feature/new')).to be_truthy } - it { expect(Gitlab::GitRefValidator.validate('implement_@all')).to be_truthy } - it { expect(Gitlab::GitRefValidator.validate('my_new_feature')).to be_truthy } - it { expect(Gitlab::GitRefValidator.validate('#1')).to be_truthy } - it { expect(Gitlab::GitRefValidator.validate('feature/~new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/^new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/:new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/?new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/*new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/[new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/new/')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature/new.')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature\@{')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature\new')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature//new')).to be_falsey } - it { expect(Gitlab::GitRefValidator.validate('feature new')).to be_falsey } -end diff --git a/spec/lib/gitlab/auth_spec.rb b/spec/lib/gitlab/auth_spec.rb deleted file mode 100644 index 95fc7e16a11..00000000000 --- a/spec/lib/gitlab/auth_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Auth do - let(:gl_auth) { Gitlab::Auth.new } - - describe :find do - let!(:user) do - create(:user, - username: username, - password: password, - password_confirmation: password) - end - let(:username) { 'John' } # username isn't lowercase, test this - let(:password) { 'my-secret' } - - it "should find user by valid login/password" do - expect( gl_auth.find(username, password) ).to eql user - end - - it 'should find user by valid email/password with case-insensitive email' do - expect(gl_auth.find(user.email.upcase, password)).to eql user - end - - it 'should find user by valid username/password with case-insensitive username' do - expect(gl_auth.find(username.upcase, password)).to eql user - end - - it "should not find user with invalid password" do - password = 'wrong' - expect( gl_auth.find(username, password) ).to_not eql user - end - - it "should not find user with invalid login" do - user = 'wrong' - expect( gl_auth.find(username, password) ).to_not eql user - end - - context "with ldap enabled" do - before { Gitlab::LDAP::Config.stub(enabled?: true) } - - it "tries to autheticate with db before ldap" do - expect(Gitlab::LDAP::Authentication).not_to receive(:login) - - gl_auth.find(username, password) - end - - it "uses ldap as fallback to for authentication" do - expect(Gitlab::LDAP::Authentication).to receive(:login) - - gl_auth.find('ldap_user', 'password') - end - end - end -end diff --git a/spec/lib/gitlab/backend/grack_auth_spec.rb b/spec/lib/gitlab/backend/grack_auth_spec.rb deleted file mode 100644 index d0aad54f677..00000000000 --- a/spec/lib/gitlab/backend/grack_auth_spec.rb +++ /dev/null @@ -1,196 +0,0 @@ -require "spec_helper" - -describe Grack::Auth do - let(:user) { create(:user) } - let(:project) { create(:project) } - - let(:app) { lambda { |env| [200, {}, "Success!"] } } - let!(:auth) { Grack::Auth.new(app) } - let(:env) { - { - "rack.input" => "", - "REQUEST_METHOD" => "GET", - "QUERY_STRING" => "service=git-upload-pack" - } - } - let(:status) { auth.call(env).first } - - describe "#call" do - context "when the project doesn't exist" do - before do - env["PATH_INFO"] = "doesnt/exist.git" - end - - context "when no authentication is provided" do - it "responds with status 401" do - expect(status).to eq(401) - end - end - - context "when username and password are provided" do - context "when authentication fails" do - before do - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, "nope") - end - - it "responds with status 401" do - expect(status).to eq(401) - end - end - - context "when authentication succeeds" do - before do - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password) - end - - it "responds with status 404" do - expect(status).to eq(404) - end - end - end - end - - context "when the project exists" do - before do - env["PATH_INFO"] = project.path_with_namespace + ".git" - end - - context "when the project is public" do - before do - project.update_attribute(:visibility_level, Project::PUBLIC) - end - - it "responds with status 200" do - expect(status).to eq(200) - end - end - - context "when the project is private" do - before do - project.update_attribute(:visibility_level, Project::PRIVATE) - end - - context "when no authentication is provided" do - it "responds with status 401" do - expect(status).to eq(401) - end - end - - context "when username and password are provided" do - context "when authentication fails" do - before do - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, "nope") - end - - it "responds with status 401" do - expect(status).to eq(401) - end - - context "when the user is IP banned" do - before do - expect(Rack::Attack::Allow2Ban).to receive(:filter).and_return(true) - allow_any_instance_of(Rack::Request).to receive(:ip).and_return('1.2.3.4') - end - - it "responds with status 401" do - expect(status).to eq(401) - end - end - end - - context "when authentication succeeds" do - before do - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password) - end - - context "when the user has access to the project" do - before do - project.team << [user, :master] - end - - context "when the user is blocked" do - before do - user.block - project.team << [user, :master] - end - - it "responds with status 404" do - expect(status).to eq(404) - end - end - - context "when the user isn't blocked" do - before do - expect(Rack::Attack::Allow2Ban).to receive(:reset) - end - - it "responds with status 200" do - expect(status).to eq(200) - end - end - - context "when blank password attempts follow a valid login" do - let(:options) { Gitlab.config.rack_attack.git_basic_auth } - let(:maxretry) { options[:maxretry] - 1 } - let(:ip) { '1.2.3.4' } - - before do - allow_any_instance_of(Rack::Request).to receive(:ip).and_return(ip) - Rack::Attack::Allow2Ban.reset(ip, options) - end - - after do - Rack::Attack::Allow2Ban.reset(ip, options) - end - - def attempt_login(include_password) - password = include_password ? user.password : "" - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials(user.username, password) - Grack::Auth.new(app) - auth.call(env).first - end - - it "repeated attempts followed by successful attempt" do - for n in 0..maxretry do - expect(attempt_login(false)).to eq(401) - end - - expect(attempt_login(true)).to eq(200) - expect(Rack::Attack::Allow2Ban.send(:banned?, ip)).to eq(nil) - - for n in 0..maxretry do - expect(attempt_login(false)).to eq(401) - end - end - end - end - - context "when the user doesn't have access to the project" do - it "responds with status 404" do - expect(status).to eq(404) - end - end - end - end - - context "when a gitlab ci token is provided" do - let(:token) { "123" } - - before do - gitlab_ci_service = project.build_gitlab_ci_service - gitlab_ci_service.active = true - gitlab_ci_service.token = token - gitlab_ci_service.project_url = "http://google.com" - gitlab_ci_service.save - - env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Basic.encode_credentials("gitlab-ci-token", token) - end - - it "responds with status 200" do - expect(status).to eq(200) - end - end - end - end - end -end diff --git a/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb b/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb deleted file mode 100644 index 2ac496fd669..00000000000 --- a/spec/lib/gitlab/backend/rack_attack_helpers_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require "spec_helper" - -describe 'RackAttackHelpers' do - describe 'reset' do - let(:discriminator) { 'test-key'} - let(:maxretry) { 5 } - let(:period) { 1.minute } - let(:options) { { findtime: period, bantime: 60, maxretry: maxretry } } - - def do_filter - for i in 1..maxretry - 1 do - status = Rack::Attack::Allow2Ban.filter(discriminator, options) { true } - expect(status).to eq(false) - end - end - - def do_reset - Rack::Attack::Allow2Ban.reset(discriminator, options) - end - - before do - do_reset - end - - after do - do_reset - end - - it 'user is not banned after n - 1 retries' do - do_filter - do_reset - do_filter - end - end -end diff --git a/spec/lib/gitlab/backend/shell_spec.rb b/spec/lib/gitlab/backend/shell_spec.rb deleted file mode 100644 index 27279465c1a..00000000000 --- a/spec/lib/gitlab/backend/shell_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Shell do - let(:project) { double('Project', id: 7, path: 'diaspora') } - let(:gitlab_shell) { Gitlab::Shell.new } - - before do - Project.stub(find: project) - end - - it { is_expected.to respond_to :add_key } - it { is_expected.to respond_to :remove_key } - it { is_expected.to respond_to :add_repository } - it { is_expected.to respond_to :remove_repository } - it { is_expected.to respond_to :fork_repository } - - it { expect(gitlab_shell.url_to_repo('diaspora')).to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + "diaspora.git") } -end diff --git a/spec/lib/gitlab/bitbucket_import/client_spec.rb b/spec/lib/gitlab/bitbucket_import/client_spec.rb deleted file mode 100644 index dd450e9967b..00000000000 --- a/spec/lib/gitlab/bitbucket_import/client_spec.rb +++ /dev/null @@ -1,17 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BitbucketImport::Client do - let(:token) { '123456' } - let(:secret) { 'secret' } - let(:client) { Gitlab::BitbucketImport::Client.new(token, secret) } - - before do - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "bitbucket") - end - - it 'all OAuth client options are symbols' do - client.consumer.options.keys.each do |key| - expect(key).to be_kind_of(Symbol) - end - end -end diff --git a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb b/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb deleted file mode 100644 index 0ec6a43f681..00000000000 --- a/spec/lib/gitlab/bitbucket_import/project_creator_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe Gitlab::BitbucketImport::ProjectCreator do - let(:user) { create(:user, bitbucket_access_token: "asdffg", bitbucket_access_token_secret: "sekret") } - let(:repo) { { - name: 'Vim', - slug: 'vim', - is_private: true, - owner: "asd"}.with_indifferent_access - } - let(:namespace){ create(:group, owner: user) } - - before do - namespace.add_owner(user) - end - - it 'creates project' do - allow_any_instance_of(Project).to receive(:add_import_job) - - project_creator = Gitlab::BitbucketImport::ProjectCreator.new(repo, namespace, user) - project = project_creator.execute - - expect(project.import_url).to eq("ssh://git@bitbucket.org/asd/vim.git") - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) - end -end diff --git a/spec/lib/gitlab/closing_issue_extractor_spec.rb b/spec/lib/gitlab/closing_issue_extractor_spec.rb deleted file mode 100644 index cb7b0fbb890..00000000000 --- a/spec/lib/gitlab/closing_issue_extractor_spec.rb +++ /dev/null @@ -1,176 +0,0 @@ -require 'spec_helper' - -describe Gitlab::ClosingIssueExtractor do - let(:project) { create(:project) } - let(:issue) { create(:issue, project: project) } - let(:iid1) { issue.iid } - - subject { described_class.new(project, project.creator) } - - describe "#closed_by_message" do - context 'with a single reference' do - it do - message = "Awesome commit (Closes ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Awesome commit (closes ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Closed ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "closed ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Closing ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "closing ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Close ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "close ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Awesome commit (Fixes ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Awesome commit (fixes ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Fixed ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "fixed ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Fixing ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "fixing ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Fix ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "fix ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Awesome commit (Resolves ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Awesome commit (resolves ##{iid1})" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Resolved ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "resolved ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Resolving ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "resolving ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "Resolve ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - - it do - message = "resolve ##{iid1}" - expect(subject.closed_by_message(message)).to eq([issue]) - end - end - - context 'with multiple references' do - let(:other_issue) { create(:issue, project: project) } - let(:third_issue) { create(:issue, project: project) } - let(:iid2) { other_issue.iid } - let(:iid3) { third_issue.iid } - - it 'fetches issues in single line message' do - message = "Closes ##{iid1} and fix ##{iid2}" - - expect(subject.closed_by_message(message)). - to eq([issue, other_issue]) - end - - it 'fetches comma-separated issues references in single line message' do - message = "Closes ##{iid1}, closes ##{iid2}" - - expect(subject.closed_by_message(message)). - to eq([issue, other_issue]) - end - - it 'fetches comma-separated issues numbers in single line message' do - message = "Closes ##{iid1}, ##{iid2} and ##{iid3}" - - expect(subject.closed_by_message(message)). - to eq([issue, other_issue, third_issue]) - end - - it 'fetches issues in multi-line message' do - message = "Awesome commit (closes ##{iid1})\nAlso fixes ##{iid2}" - - expect(subject.closed_by_message(message)). - to eq([issue, other_issue]) - end - - it 'fetches issues in hybrid message' do - message = "Awesome commit (closes ##{iid1})\n"\ - "Also fixing issues ##{iid2}, ##{iid3} and #4" - - expect(subject.closed_by_message(message)). - to eq([issue, other_issue, third_issue]) - end - end - end -end diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb deleted file mode 100644 index 40eb45e37ca..00000000000 --- a/spec/lib/gitlab/diff/file_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Diff::File do - include RepoHelpers - - let(:project) { create(:project) } - let(:commit) { project.repository.commit(sample_commit.id) } - let(:diff) { commit.diffs.first } - let(:diff_file) { Gitlab::Diff::File.new(diff) } - - describe :diff_lines do - let(:diff_lines) { diff_file.diff_lines } - - it { expect(diff_lines.size).to eq(30) } - it { expect(diff_lines.first).to be_kind_of(Gitlab::Diff::Line) } - end - - describe :mode_changed? do - it { expect(diff_file.mode_changed?).to be_falsey } - end -end diff --git a/spec/lib/gitlab/diff/parser_spec.rb b/spec/lib/gitlab/diff/parser_spec.rb deleted file mode 100644 index 918f6d0ead4..00000000000 --- a/spec/lib/gitlab/diff/parser_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Diff::Parser do - include RepoHelpers - - let(:project) { create(:project) } - let(:commit) { project.repository.commit(sample_commit.id) } - let(:diff) { commit.diffs.first } - let(:parser) { Gitlab::Diff::Parser.new } - - describe :parse do - let(:diff) do - < path } -- options = { chdir: path } -+ -+ vars = { -+ "PWD" => path -+ } -+ -+ options = { -+ chdir: path -+ } - - unless File.directory?(path) - FileUtils.mkdir_p(path) -@@ -19,6 +25,7 @@ module Popen - - @cmd_output = "" - @cmd_status = 0 -+ - Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr| - @cmd_output << stdout.read - @cmd_output << stderr.read -eos - end - - before do - @lines = parser.parse(diff.lines) - end - - it { expect(@lines.size).to eq(30) } - - describe 'lines' do - describe 'first line' do - let(:line) { @lines.first } - - it { expect(line.type).to eq('match') } - it { expect(line.old_pos).to eq(6) } - it { expect(line.new_pos).to eq(6) } - it { expect(line.text).to eq('@@ -6,12 +6,18 @@ module Popen') } - end - - describe 'removal line' do - let(:line) { @lines[10] } - - it { expect(line.type).to eq('old') } - it { expect(line.old_pos).to eq(14) } - it { expect(line.new_pos).to eq(13) } - it { expect(line.text).to eq('- options = { chdir: path }') } - end - - describe 'addition line' do - let(:line) { @lines[16] } - - it { expect(line.type).to eq('new') } - it { expect(line.old_pos).to eq(15) } - it { expect(line.new_pos).to eq(18) } - it { expect(line.text).to eq('+ options = {') } - end - - describe 'unchanged line' do - let(:line) { @lines.last } - - it { expect(line.type).to eq(nil) } - it { expect(line.old_pos).to eq(24) } - it { expect(line.new_pos).to eq(31) } - it { expect(line.text).to eq(' @cmd_output << stderr.read') } - end - end - end -end diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb deleted file mode 100644 index 39be9d64644..00000000000 --- a/spec/lib/gitlab/git_access_spec.rb +++ /dev/null @@ -1,235 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitAccess do - let(:access) { Gitlab::GitAccess.new(actor, project) } - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:actor) { user } - - describe 'can_push_to_branch?' do - describe 'push to none protected branch' do - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?("random_branch")).to be_truthy - end - - it "returns true if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?("random_branch")).to be_truthy - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?("random_branch")).to be_falsey - end - end - - describe 'push to protected branch' do - before do - @branch = create :protected_branch, project: project - end - - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns false if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - end - - describe 'push to protected branch if allowed for developers' do - before do - @branch = create :protected_branch, project: project, developers_can_push: true - end - - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns true if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - end - - end - - describe 'download_access_check' do - describe 'master permissions' do - before { project.team << [user, :master] } - - context 'pull code' do - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_truthy } - end - end - - describe 'guest permissions' do - before { project.team << [user, :guest] } - - context 'pull code' do - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_falsey } - end - end - - describe 'blocked user' do - before do - project.team << [user, :master] - user.block - end - - context 'pull code' do - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_falsey } - end - end - - describe 'without acccess to project' do - context 'pull code' do - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_falsey } - end - end - - describe 'deploy key permissions' do - let(:key) { create(:deploy_key) } - let(:actor) { key } - - context 'pull code' do - context 'allowed' do - before { key.projects << project } - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_truthy } - end - - context 'denied' do - subject { access.download_access_check } - - it { expect(subject.allowed?).to be_falsey } - end - end - end - end - - describe 'push_access_check' do - def protect_feature_branch - create(:protected_branch, name: 'feature', project: project) - end - - def changes - { - push_new_branch: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/heads/wow", - push_master: '6f6d7e7ed 570e7b2ab refs/heads/master', - push_protected_branch: '6f6d7e7ed 570e7b2ab refs/heads/feature', - push_remove_protected_branch: "570e7b2ab #{Gitlab::Git::BLANK_SHA} "\ - 'refs/heads/feature', - push_tag: '6f6d7e7ed 570e7b2ab refs/tags/v1.0.0', - push_new_tag: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/tags/v7.8.9", - push_all: ['6f6d7e7ed 570e7b2ab refs/heads/master', '6f6d7e7ed 570e7b2ab refs/heads/feature'] - } - end - - def self.permissions_matrix - { - master: { - push_new_branch: true, - push_master: true, - push_protected_branch: true, - push_remove_protected_branch: false, - push_tag: true, - push_new_tag: true, - push_all: true, - }, - - developer: { - push_new_branch: true, - push_master: true, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: true, - push_all: false, - }, - - reporter: { - push_new_branch: false, - push_master: false, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: false, - push_all: false, - }, - - guest: { - push_new_branch: false, - push_master: false, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: false, - push_all: false, - } - } - end - - def self.updated_permissions_matrix - updated_permissions_matrix = permissions_matrix.dup - updated_permissions_matrix[:developer][:push_protected_branch] = true - updated_permissions_matrix[:developer][:push_all] = true - updated_permissions_matrix - end - - permissions_matrix.keys.each do |role| - describe "#{role} access" do - before { protect_feature_branch } - before { project.team << [user, role] } - - permissions_matrix[role].each do |action, allowed| - context action do - subject { access.push_access_check(changes[action]) } - - it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } - end - end - end - end - - context "with enabled developers push to protected branches " do - updated_permissions_matrix.keys.each do |role| - describe "#{role} access" do - before { create(:protected_branch, name: 'feature', developers_can_push: true, project: project) } - before { project.team << [user, role] } - - updated_permissions_matrix[role].each do |action, allowed| - context action do - subject { access.push_access_check(changes[action]) } - - it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } - end - end - end - end - end - end -end diff --git a/spec/lib/gitlab/git_access_wiki_spec.rb b/spec/lib/gitlab/git_access_wiki_spec.rb deleted file mode 100644 index 4cb91094cb3..00000000000 --- a/spec/lib/gitlab/git_access_wiki_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitAccessWiki do - let(:access) { Gitlab::GitAccessWiki.new(user, project) } - let(:project) { create(:project) } - let(:user) { create(:user) } - - describe 'push_allowed?' do - before do - create(:protected_branch, name: 'master', project: project) - project.team << [user, :developer] - end - - subject { access.push_access_check(changes) } - - it { expect(subject.allowed?).to be_truthy } - end - - def changes - ['6f6d7e7ed 570e7b2ab refs/heads/master'] - end -end diff --git a/spec/lib/gitlab/github_import/client_spec.rb b/spec/lib/gitlab/github_import/client_spec.rb deleted file mode 100644 index 26618120316..00000000000 --- a/spec/lib/gitlab/github_import/client_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GithubImport::Client do - let(:token) { '123456' } - let(:client) { Gitlab::GithubImport::Client.new(token) } - - before do - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "github") - end - - it 'all OAuth2 client options are symbols' do - client.client.options.keys.each do |key| - expect(key).to be_kind_of(Symbol) - end - end -end diff --git a/spec/lib/gitlab/github_import/project_creator_spec.rb b/spec/lib/gitlab/github_import/project_creator_spec.rb deleted file mode 100644 index 3bf52cb685e..00000000000 --- a/spec/lib/gitlab/github_import/project_creator_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GithubImport::ProjectCreator do - let(:user) { create(:user, github_access_token: "asdffg") } - let(:repo) { OpenStruct.new( - login: 'vim', - name: 'vim', - private: true, - full_name: 'asd/vim', - clone_url: "https://gitlab.com/asd/vim.git", - owner: OpenStruct.new(login: "john")) - } - let(:namespace){ create(:group, owner: user) } - - before do - namespace.add_owner(user) - end - - it 'creates project' do - allow_any_instance_of(Project).to receive(:add_import_job) - - project_creator = Gitlab::GithubImport::ProjectCreator.new(repo, namespace, user) - project = project_creator.execute - - expect(project.import_url).to eq("https://asdffg@gitlab.com/asd/vim.git") - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) - end -end diff --git a/spec/lib/gitlab/gitlab_import/client_spec.rb b/spec/lib/gitlab/gitlab_import/client_spec.rb deleted file mode 100644 index c511c515474..00000000000 --- a/spec/lib/gitlab/gitlab_import/client_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitlabImport::Client do - let(:token) { '123456' } - let(:client) { Gitlab::GitlabImport::Client.new(token) } - - before do - Gitlab.config.omniauth.providers << OpenStruct.new(app_id: "asd123", app_secret: "asd123", name: "gitlab") - end - - it 'all OAuth2 client options are symbols' do - client.client.options.keys.each do |key| - expect(key).to be_kind_of(Symbol) - end - end -end diff --git a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb b/spec/lib/gitlab/gitlab_import/project_creator_spec.rb deleted file mode 100644 index 3cefe4ea8e2..00000000000 --- a/spec/lib/gitlab/gitlab_import/project_creator_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitlabImport::ProjectCreator do - let(:user) { create(:user, gitlab_access_token: "asdffg") } - let(:repo) { { - name: 'vim', - path: 'vim', - visibility_level: Gitlab::VisibilityLevel::PRIVATE, - path_with_namespace: 'asd/vim', - http_url_to_repo: "https://gitlab.com/asd/vim.git", - owner: {name: "john"}}.with_indifferent_access - } - let(:namespace){ create(:group, owner: user) } - - before do - namespace.add_owner(user) - end - - it 'creates project' do - allow_any_instance_of(Project).to receive(:add_import_job) - - project_creator = Gitlab::GitlabImport::ProjectCreator.new(repo, namespace, user) - project = project_creator.execute - - expect(project.import_url).to eq("https://oauth2:asdffg@gitlab.com/asd/vim.git") - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE) - end -end diff --git a/spec/lib/gitlab/gitlab_markdown_helper_spec.rb b/spec/lib/gitlab/gitlab_markdown_helper_spec.rb deleted file mode 100644 index ab613193f41..00000000000 --- a/spec/lib/gitlab/gitlab_markdown_helper_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Gitlab::MarkdownHelper do - describe '#markup?' do - %w(textile rdoc org creole wiki - mediawiki rst adoc asciidoc asc).each do |type| - it "returns true for #{type} files" do - expect(Gitlab::MarkdownHelper.markup?("README.#{type}")).to be_truthy - end - end - - it 'returns false when given a non-markup filename' do - expect(Gitlab::MarkdownHelper.markup?('README.rb')).not_to be_truthy - end - end - - describe '#gitlab_markdown?' do - %w(mdown md markdown).each do |type| - it "returns true for #{type} files" do - expect(Gitlab::MarkdownHelper.gitlab_markdown?("README.#{type}")).to be_truthy - end - end - - it 'returns false when given a non-markdown filename' do - expect(Gitlab::MarkdownHelper.gitlab_markdown?('README.rb')).not_to be_truthy - end - end -end diff --git a/spec/lib/gitlab/gitorious_import/project_creator_spec.rb b/spec/lib/gitlab/gitorious_import/project_creator_spec.rb deleted file mode 100644 index c1125ca6357..00000000000 --- a/spec/lib/gitlab/gitorious_import/project_creator_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GitoriousImport::ProjectCreator do - let(:user) { create(:user) } - let(:repo) { Gitlab::GitoriousImport::Repository.new('foo/bar-baz-qux') } - let(:namespace){ create(:group, owner: user) } - - before do - namespace.add_owner(user) - end - - it 'creates project' do - allow_any_instance_of(Project).to receive(:add_import_job) - - project_creator = Gitlab::GitoriousImport::ProjectCreator.new(repo, namespace, user) - project = project_creator.execute - - expect(project.name).to eq("Bar Baz Qux") - expect(project.path).to eq("bar-baz-qux") - expect(project.namespace).to eq(namespace) - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) - expect(project.import_type).to eq("gitorious") - expect(project.import_source).to eq("foo/bar-baz-qux") - expect(project.import_url).to eq("https://gitorious.org/foo/bar-baz-qux.git") - end -end diff --git a/spec/lib/gitlab/google_code_import/client_spec.rb b/spec/lib/gitlab/google_code_import/client_spec.rb deleted file mode 100644 index d2bf871daa8..00000000000 --- a/spec/lib/gitlab/google_code_import/client_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require "spec_helper" - -describe Gitlab::GoogleCodeImport::Client do - let(:raw_data) { JSON.parse(File.read(Rails.root.join("spec/fixtures/GoogleCodeProjectHosting.json"))) } - subject { described_class.new(raw_data) } - - describe "#valid?" do - context "when the data is valid" do - it "returns true" do - expect(subject).to be_valid - end - end - - context "when the data is invalid" do - let(:raw_data) { "No clue" } - - it "returns true" do - expect(subject).to_not be_valid - end - end - end - - describe "#repos" do - it "returns only Git repositories" do - expect(subject.repos.length).to eq(1) - end - end - - describe "#repo" do - it "returns the referenced repository" do - expect(subject.repo("tint2").name).to eq("tint2") - end - end -end diff --git a/spec/lib/gitlab/google_code_import/project_creator_spec.rb b/spec/lib/gitlab/google_code_import/project_creator_spec.rb deleted file mode 100644 index 7a224538b8b..00000000000 --- a/spec/lib/gitlab/google_code_import/project_creator_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'spec_helper' - -describe Gitlab::GoogleCodeImport::ProjectCreator do - let(:user) { create(:user) } - let(:repo) { - Gitlab::GoogleCodeImport::Repository.new( - "name" => 'vim', - "summary" => 'VI Improved', - "repositoryUrls" => [ "https://vim.googlecode.com/git/" ] - ) - } - let(:namespace){ create(:group, owner: user) } - - before do - namespace.add_owner(user) - end - - it 'creates project' do - allow_any_instance_of(Project).to receive(:add_import_job) - - project_creator = Gitlab::GoogleCodeImport::ProjectCreator.new(repo, namespace, user) - project = project_creator.execute - - expect(project.import_url).to eq("https://vim.googlecode.com/git/") - expect(project.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) - end -end diff --git a/spec/lib/gitlab/key_fingerprint_spec.rb b/spec/lib/gitlab/key_fingerprint_spec.rb deleted file mode 100644 index 266eab6e793..00000000000 --- a/spec/lib/gitlab/key_fingerprint_spec.rb +++ /dev/null @@ -1,12 +0,0 @@ -require "spec_helper" - -describe Gitlab::KeyFingerprint do - let(:key) { "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=" } - let(:fingerprint) { "3f:a2:ee:de:b5:de:53:c3:aa:2f:9c:45:24:4c:47:7b" } - - describe "#fingerprint" do - it "generates the key's fingerprint" do - expect(Gitlab::KeyFingerprint.new(key).fingerprint).to eq(fingerprint) - end - end -end diff --git a/spec/lib/gitlab/ldap/access_spec.rb b/spec/lib/gitlab/ldap/access_spec.rb deleted file mode 100644 index 707a0521ab3..00000000000 --- a/spec/lib/gitlab/ldap/access_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'spec_helper' - -describe Gitlab::LDAP::Access do - let(:access) { Gitlab::LDAP::Access.new user } - let(:user) { create(:omniauth_user) } - - describe :allowed? do - subject { access.allowed? } - - context 'when the user cannot be found' do - before { Gitlab::LDAP::Person.stub(find_by_dn: nil) } - - it { is_expected.to be_falsey } - end - - context 'when the user is found' do - before { Gitlab::LDAP::Person.stub(find_by_dn: :ldap_user) } - - context 'and the user is diabled via active directory' do - before { Gitlab::LDAP::Person.stub(disabled_via_active_directory?: true) } - - it { is_expected.to be_falsey } - - it "should block user in GitLab" do - access.allowed? - user.should be_blocked - end - end - - context 'and has no disabled flag in active diretory' do - before do - user.block - - Gitlab::LDAP::Person.stub(disabled_via_active_directory?: false) - end - - it { is_expected.to be_truthy } - - it "should unblock user in GitLab" do - access.allowed? - user.should_not be_blocked - end - end - - context 'without ActiveDirectory enabled' do - before do - Gitlab::LDAP::Config.stub(enabled?: true) - Gitlab::LDAP::Config.any_instance.stub(active_directory: false) - end - - it { is_expected.to be_truthy } - end - end - end -end diff --git a/spec/lib/gitlab/ldap/adapter_spec.rb b/spec/lib/gitlab/ldap/adapter_spec.rb deleted file mode 100644 index b609e4b38f2..00000000000 --- a/spec/lib/gitlab/ldap/adapter_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'spec_helper' - -describe Gitlab::LDAP::Adapter do - let(:adapter) { Gitlab::LDAP::Adapter.new 'ldapmain' } - - describe :dn_matches_filter? do - let(:ldap) { double(:ldap) } - subject { adapter.dn_matches_filter?(:dn, :filter) } - before { adapter.stub(ldap: ldap) } - - context "when the search is successful" do - context "and the result is non-empty" do - before { ldap.stub(search: [:foo]) } - - it { is_expected.to be_truthy } - end - - context "and the result is empty" do - before { ldap.stub(search: []) } - - it { is_expected.to be_falsey } - end - end - - context "when the search encounters an error" do - before { ldap.stub(search: nil, get_operation_result: double(code: 1, message: 'some error')) } - - it { is_expected.to be_falsey } - end - end -end diff --git a/spec/lib/gitlab/ldap/authentication_spec.rb b/spec/lib/gitlab/ldap/authentication_spec.rb deleted file mode 100644 index 8afc2b21f46..00000000000 --- a/spec/lib/gitlab/ldap/authentication_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require 'spec_helper' - -describe Gitlab::LDAP::Authentication do - let(:klass) { Gitlab::LDAP::Authentication } - let(:user) { create(:omniauth_user, extern_uid: dn) } - let(:dn) { 'uid=john,ou=people,dc=example,dc=com' } - let(:login) { 'john' } - let(:password) { 'password' } - - describe :login do - let(:adapter) { double :adapter } - before do - Gitlab::LDAP::Config.stub(enabled?: true) - end - - it "finds the user if authentication is successful" do - user - # try only to fake the LDAP call - klass.any_instance.stub(adapter: double(:adapter, - bind_as: double(:ldap_user, dn: dn) - )) - expect(klass.login(login, password)).to be_truthy - end - - it "is false if the user does not exist" do - # try only to fake the LDAP call - klass.any_instance.stub(adapter: double(:adapter, - bind_as: double(:ldap_user, dn: dn) - )) - expect(klass.login(login, password)).to be_falsey - end - - it "is false if authentication fails" do - user - # try only to fake the LDAP call - klass.any_instance.stub(adapter: double(:adapter, bind_as: nil)) - expect(klass.login(login, password)).to be_falsey - end - - it "fails if ldap is disabled" do - Gitlab::LDAP::Config.stub(enabled?: false) - expect(klass.login(login, password)).to be_falsey - end - - it "fails if no login is supplied" do - expect(klass.login('', password)).to be_falsey - end - - it "fails if no password is supplied" do - expect(klass.login(login, '')).to be_falsey - end - end -end \ No newline at end of file diff --git a/spec/lib/gitlab/ldap/config_spec.rb b/spec/lib/gitlab/ldap/config_spec.rb deleted file mode 100644 index 00e9076c787..00000000000 --- a/spec/lib/gitlab/ldap/config_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'spec_helper' - -describe Gitlab::LDAP::Config do - let(:config) { Gitlab::LDAP::Config.new provider } - let(:provider) { 'ldapmain' } - - describe '#initalize' do - it 'requires a provider' do - expect{ Gitlab::LDAP::Config.new }.to raise_error ArgumentError - end - - it "works" do - expect(config).to be_a described_class - end - - it "raises an error if a unknow provider is used" do - expect{ Gitlab::LDAP::Config.new 'unknown' }.to raise_error - end - end -end diff --git a/spec/lib/gitlab/ldap/user_spec.rb b/spec/lib/gitlab/ldap/user_spec.rb deleted file mode 100644 index 42015c28c81..00000000000 --- a/spec/lib/gitlab/ldap/user_spec.rb +++ /dev/null @@ -1,106 +0,0 @@ -require 'spec_helper' - -describe Gitlab::LDAP::User do - let(:ldap_user) { Gitlab::LDAP::User.new(auth_hash) } - let(:gl_user) { ldap_user.gl_user } - let(:info) do - { - name: 'John', - email: 'john@example.com', - nickname: 'john' - } - end - let(:auth_hash) do - double(uid: 'my-uid', provider: 'ldapmain', info: double(info)) - end - - describe :changed? do - it "marks existing ldap user as changed" do - existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain') - expect(ldap_user.changed?).to be_truthy - end - - it "marks existing non-ldap user if the email matches as changed" do - existing_user = create(:user, email: 'john@example.com') - expect(ldap_user.changed?).to be_truthy - end - - it "dont marks existing ldap user as changed" do - existing_user = create(:omniauth_user, email: 'john@example.com', extern_uid: 'my-uid', provider: 'ldapmain') - expect(ldap_user.changed?).to be_falsey - end - end - - describe :find_or_create do - it "finds the user if already existing" do - existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain') - - expect{ ldap_user.save }.to_not change{ User.count } - end - - it "connects to existing non-ldap user if the email matches" do - existing_user = create(:omniauth_user, email: 'john@example.com', provider: "twitter") - expect{ ldap_user.save }.to_not change{ User.count } - - existing_user.reload - expect(existing_user.ldap_identity.extern_uid).to eql 'my-uid' - expect(existing_user.ldap_identity.provider).to eql 'ldapmain' - end - - it "creates a new user if not found" do - expect{ ldap_user.save }.to change{ User.count }.by(1) - end - end - - - describe 'blocking' do - context 'signup' do - context 'dont block on create' do - before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false } - - it do - ldap_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - - context 'block on create' do - before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true } - - it do - ldap_user.save - expect(gl_user).to be_valid - expect(gl_user).to be_blocked - end - end - end - - context 'sign-in' do - before do - ldap_user.save - ldap_user.gl_user.activate - end - - context 'dont block on create' do - before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: false } - - it do - ldap_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - - context 'block on create' do - before { Gitlab::LDAP::Config.any_instance.stub block_auto_created_users: true } - - it do - ldap_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - end - end -end diff --git a/spec/lib/gitlab/note_data_builder_spec.rb b/spec/lib/gitlab/note_data_builder_spec.rb deleted file mode 100644 index 448cd0c6880..00000000000 --- a/spec/lib/gitlab/note_data_builder_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::NoteDataBuilder' do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:data) { Gitlab::NoteDataBuilder.build(note, user) } - let(:note_url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - let(:fixed_time) { Time.at(1425600000) } # Avoid time precision errors - - before(:each) do - expect(data).to have_key(:object_attributes) - expect(data[:object_attributes]).to have_key(:url) - expect(data[:object_attributes][:url]).to eq(note_url) - expect(data[:object_kind]).to eq('note') - expect(data[:user]).to eq(user.hook_attrs) - end - - describe 'When asking for a note on commit' do - let(:note) { create(:note_on_commit) } - - it 'returns the note and commit-specific data' do - expect(data).to have_key(:commit) - end - end - - describe 'When asking for a note on commit diff' do - let(:note) { create(:note_on_commit_diff) } - - it 'returns the note and commit-specific data' do - expect(data).to have_key(:commit) - end - end - - describe 'When asking for a note on issue' do - let(:issue) { create(:issue, created_at: fixed_time, updated_at: fixed_time) } - let(:note) { create(:note_on_issue, noteable_id: issue.id) } - - it 'returns the note and issue-specific data' do - expect(data).to have_key(:issue) - expect(data[:issue]).to eq(issue.hook_attrs) - end - end - - describe 'When asking for a note on merge request' do - let(:merge_request) { create(:merge_request, created_at: fixed_time, updated_at: fixed_time) } - let(:note) { create(:note_on_merge_request, noteable_id: merge_request.id) } - - it 'returns the note and merge request data' do - expect(data).to have_key(:merge_request) - expect(data[:merge_request]).to eq(merge_request.hook_attrs) - end - end - - describe 'When asking for a note on merge request diff' do - let(:merge_request) { create(:merge_request, created_at: fixed_time, updated_at: fixed_time) } - let(:note) { create(:note_on_merge_request_diff, noteable_id: merge_request.id) } - - it 'returns the note and merge request diff data' do - expect(data).to have_key(:merge_request) - expect(data[:merge_request]).to eq(merge_request.hook_attrs) - end - end - - describe 'When asking for a note on project snippet' do - let!(:snippet) { create(:project_snippet, created_at: fixed_time, updated_at: fixed_time) } - let!(:note) { create(:note_on_project_snippet, noteable_id: snippet.id) } - - it 'returns the note and project snippet data' do - expect(data).to have_key(:snippet) - expect(data[:snippet]).to eq(snippet.hook_attrs) - end - end -end diff --git a/spec/lib/gitlab/o_auth/auth_hash_spec.rb b/spec/lib/gitlab/o_auth/auth_hash_spec.rb deleted file mode 100644 index 5eb77b492b2..00000000000 --- a/spec/lib/gitlab/o_auth/auth_hash_spec.rb +++ /dev/null @@ -1,55 +0,0 @@ -require 'spec_helper' - -describe Gitlab::OAuth::AuthHash do - let(:auth_hash) do - Gitlab::OAuth::AuthHash.new(double({ - provider: 'twitter', - uid: uid, - info: double(info_hash) - })) - end - let(:uid) { 'my-uid' } - let(:email) { 'my-email@example.com' } - let(:nickname) { 'my-nickname' } - let(:info_hash) { - { - email: email, - nickname: nickname, - name: 'John', - first_name: "John", - last_name: "Who" - } - } - - context "defaults" do - it { expect(auth_hash.provider).to eql 'twitter' } - it { expect(auth_hash.uid).to eql uid } - it { expect(auth_hash.email).to eql email } - it { expect(auth_hash.username).to eql nickname } - it { expect(auth_hash.name).to eql "John" } - it { expect(auth_hash.password).to_not be_empty } - end - - context "email not provided" do - before { info_hash.delete(:email) } - it "generates a temp email" do - expect( auth_hash.email).to start_with('temp-email-for-oauth') - end - end - - context "username not provided" do - before { info_hash.delete(:nickname) } - - it "takes the first part of the email as username" do - expect( auth_hash.username ).to eql "my-email" - end - end - - context "name not provided" do - before { info_hash.delete(:name) } - - it "concats first and lastname as the name" do - expect( auth_hash.name ).to eql "John Who" - end - end -end \ No newline at end of file diff --git a/spec/lib/gitlab/o_auth/user_spec.rb b/spec/lib/gitlab/o_auth/user_spec.rb deleted file mode 100644 index 44cdd1e4fab..00000000000 --- a/spec/lib/gitlab/o_auth/user_spec.rb +++ /dev/null @@ -1,109 +0,0 @@ -require 'spec_helper' - -describe Gitlab::OAuth::User do - let(:oauth_user) { Gitlab::OAuth::User.new(auth_hash) } - let(:gl_user) { oauth_user.gl_user } - let(:uid) { 'my-uid' } - let(:provider) { 'my-provider' } - let(:auth_hash) { double(uid: uid, provider: provider, info: double(info_hash)) } - let(:info_hash) do - { - nickname: '-john+gitlab-ETC%.git@gmail.com', - name: 'John', - email: 'john@mail.com' - } - end - - describe :persisted? do - let!(:existing_user) { create(:omniauth_user, extern_uid: 'my-uid', provider: 'my-provider') } - - it "finds an existing user based on uid and provider (facebook)" do - auth = double(info: double(name: 'John'), uid: 'my-uid', provider: 'my-provider') - expect( oauth_user.persisted? ).to be_truthy - end - - it "returns false if use is not found in database" do - auth_hash.stub(uid: 'non-existing') - expect( oauth_user.persisted? ).to be_falsey - end - end - - describe :save do - let(:provider) { 'twitter' } - - describe 'signup' do - context "with allow_single_sign_on enabled" do - before { Gitlab.config.omniauth.stub allow_single_sign_on: true } - - it "creates a user from Omniauth" do - oauth_user.save - - expect(gl_user).to be_valid - identity = gl_user.identities.first - expect(identity.extern_uid).to eql uid - expect(identity.provider).to eql 'twitter' - end - end - - context "with allow_single_sign_on disabled (Default)" do - it "throws an error" do - expect{ oauth_user.save }.to raise_error StandardError - end - end - end - - describe 'blocking' do - let(:provider) { 'twitter' } - before { Gitlab.config.omniauth.stub allow_single_sign_on: true } - - context 'signup' do - context 'dont block on create' do - before { Gitlab.config.omniauth.stub block_auto_created_users: false } - - it do - oauth_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - - context 'block on create' do - before { Gitlab.config.omniauth.stub block_auto_created_users: true } - - it do - oauth_user.save - expect(gl_user).to be_valid - expect(gl_user).to be_blocked - end - end - end - - context 'sign-in' do - before do - oauth_user.save - oauth_user.gl_user.activate - end - - context 'dont block on create' do - before { Gitlab.config.omniauth.stub block_auto_created_users: false } - - it do - oauth_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - - context 'block on create' do - before { Gitlab.config.omniauth.stub block_auto_created_users: true } - - it do - oauth_user.save - expect(gl_user).to be_valid - expect(gl_user).not_to be_blocked - end - end - end - end - end -end diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb deleted file mode 100644 index cd9d0456b25..00000000000 --- a/spec/lib/gitlab/popen_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::Popen', no_db: true do - let (:path) { Rails.root.join('tmp').to_s } - - before do - @klass = Class.new(Object) - @klass.send(:include, Gitlab::Popen) - end - - context 'zero status' do - before do - @output, @status = @klass.new.popen(%W(ls), path) - end - - it { expect(@status).to be_zero } - it { expect(@output).to include('cache') } - end - - context 'non-zero status' do - before do - @output, @status = @klass.new.popen(%W(cat NOTHING), path) - end - - it { expect(@status).to eq(1) } - it { expect(@output).to include('No such file or directory') } - end - - context 'unsafe string command' do - it 'raises an error when it gets called with a string argument' do - expect { @klass.new.popen('ls', path) }.to raise_error - end - end - - context 'without a directory argument' do - before do - @output, @status = @klass.new.popen(%W(ls)) - end - - it { expect(@status).to be_zero } - it { expect(@output).to include('spec') } - end - -end - diff --git a/spec/lib/gitlab/push_data_builder_spec.rb b/spec/lib/gitlab/push_data_builder_spec.rb deleted file mode 100644 index 1b8ba7b4d43..00000000000 --- a/spec/lib/gitlab/push_data_builder_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::PushDataBuilder' do - let(:project) { create(:project) } - let(:user) { create(:user) } - - - describe :build_sample do - let(:data) { Gitlab::PushDataBuilder.build_sample(project, user) } - - it { expect(data).to be_a(Hash) } - it { expect(data[:before]).to eq('6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') } - it { expect(data[:after]).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e') } - it { expect(data[:ref]).to eq('refs/heads/master') } - it { expect(data[:commits].size).to eq(3) } - it { expect(data[:repository][:git_http_url]).to eq(project.http_url_to_repo) } - it { expect(data[:repository][:git_ssh_url]).to eq(project.ssh_url_to_repo) } - it { expect(data[:repository][:visibility_level]).to eq(project.visibility_level) } - it { expect(data[:total_commits_count]).to eq(3) } - end - - describe :build do - let(:data) do - Gitlab::PushDataBuilder.build(project, - user, - Gitlab::Git::BLANK_SHA, - '8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b', - 'refs/tags/v1.1.0') - end - - it { expect(data).to be_a(Hash) } - it { expect(data[:before]).to eq(Gitlab::Git::BLANK_SHA) } - it { expect(data[:checkout_sha]).to eq('5937ac0a7beb003549fc5fd26fc247adbce4a52e') } - it { expect(data[:after]).to eq('8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b') } - it { expect(data[:ref]).to eq('refs/tags/v1.1.0') } - it { expect(data[:commits]).to be_empty } - it { expect(data[:total_commits_count]).to be_zero } - end -end diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb deleted file mode 100644 index c9fb62b61ae..00000000000 --- a/spec/lib/gitlab/reference_extractor_spec.rb +++ /dev/null @@ -1,156 +0,0 @@ -require 'spec_helper' - -describe Gitlab::ReferenceExtractor do - let(:project) { create(:project) } - subject { Gitlab::ReferenceExtractor.new(project, project.creator) } - - it 'extracts username references' do - subject.analyze('this contains a @user reference') - expect(subject.references[:user]).to eq([[project, 'user']]) - end - - it 'extracts issue references' do - subject.analyze('this one talks about issue #1234') - expect(subject.references[:issue]).to eq([[project, '1234']]) - end - - it 'extracts JIRA issue references' do - subject.analyze('this one talks about issue JIRA-1234') - expect(subject.references[:issue]).to eq([[project, 'JIRA-1234']]) - end - - it 'extracts merge request references' do - subject.analyze("and here's !43, a merge request") - expect(subject.references[:merge_request]).to eq([[project, '43']]) - end - - it 'extracts snippet ids' do - subject.analyze('snippets like $12 get extracted as well') - expect(subject.references[:snippet]).to eq([[project, '12']]) - end - - it 'extracts commit shas' do - subject.analyze('commit shas 98cf0ae3 are pulled out as Strings') - expect(subject.references[:commit]).to eq([[project, '98cf0ae3']]) - end - - it 'extracts commit ranges' do - subject.analyze('here you go, a commit range: 98cf0ae3...98cf0ae4') - expect(subject.references[:commit_range]).to eq([[project, '98cf0ae3...98cf0ae4']]) - end - - it 'extracts multiple references and preserves their order' do - subject.analyze('@me and @you both care about this') - expect(subject.references[:user]).to eq([ - [project, 'me'], - [project, 'you'] - ]) - end - - it 'leaves the original note unmodified' do - text = 'issue #123 is just the worst, @user' - subject.analyze(text) - expect(text).to eq('issue #123 is just the worst, @user') - end - - it 'extracts no references for
      ..
      blocks' do - subject.analyze("
      def puts '#1 issue'\nend\n
      ```") - expect(subject.issues).to be_blank - end - - it 'extracts no references for .. blocks' do - subject.analyze("def puts '!1 request'\nend\n```") - expect(subject.merge_requests).to be_blank - end - - it 'extracts no references for code blocks with language' do - subject.analyze("this code:\n```ruby\ndef puts '#1 issue'\nend\n```") - expect(subject.issues).to be_blank - end - - it 'extracts issue references for invalid code blocks' do - subject.analyze('test: ```this one talks about issue #1234```') - expect(subject.references[:issue]).to eq([[project, '1234']]) - end - - it 'handles all possible kinds of references' do - accessors = Gitlab::Markdown::TYPES.map { |t| "#{t}s".to_sym } - expect(subject).to respond_to(*accessors) - end - - it 'accesses valid user objects' do - @u_foo = create(:user, username: 'foo') - @u_bar = create(:user, username: 'bar') - @u_offteam = create(:user, username: 'offteam') - - project.team << [@u_foo, :reporter] - project.team << [@u_bar, :guest] - - subject.analyze('@foo, @baduser, @bar, and @offteam') - expect(subject.users).to eq([@u_foo, @u_bar, @u_offteam]) - end - - it 'accesses valid issue objects' do - @i0 = create(:issue, project: project) - @i1 = create(:issue, project: project) - - subject.analyze("##{@i0.iid}, ##{@i1.iid}, and #999.") - expect(subject.issues).to eq([@i0, @i1]) - end - - it 'accesses valid merge requests' do - @m0 = create(:merge_request, source_project: project, target_project: project, source_branch: 'aaa') - @m1 = create(:merge_request, source_project: project, target_project: project, source_branch: 'bbb') - - subject.analyze("!999, !#{@m1.iid}, and !#{@m0.iid}.") - expect(subject.merge_requests).to eq([@m1, @m0]) - end - - it 'accesses valid snippets' do - @s0 = create(:project_snippet, project: project) - @s1 = create(:project_snippet, project: project) - @s2 = create(:project_snippet) - - subject.analyze("$#{@s0.id}, $999, $#{@s2.id}, $#{@s1.id}") - expect(subject.snippets).to eq([@s0, @s1]) - end - - it 'accesses valid commits' do - commit = project.repository.commit('master') - - subject.analyze("this references commits #{commit.sha[0..6]} and 012345") - extracted = subject.commits - expect(extracted.size).to eq(1) - expect(extracted[0].sha).to eq(commit.sha) - expect(extracted[0].message).to eq(commit.message) - end - - it 'accesses valid commit ranges' do - commit = project.repository.commit('master') - earlier_commit = project.repository.commit('master~2') - - subject.analyze("this references commits #{earlier_commit.sha[0..6]}...#{commit.sha[0..6]}") - extracted = subject.commit_ranges - expect(extracted.size).to eq(1) - expect(extracted[0][0].sha).to eq(earlier_commit.sha) - expect(extracted[0][0].message).to eq(earlier_commit.message) - expect(extracted[0][1].sha).to eq(commit.sha) - expect(extracted[0][1].message).to eq(commit.message) - end - - context 'with a project with an underscore' do - let(:other_project) { create(:project, path: 'test_project') } - let(:issue) { create(:issue, project: other_project) } - - before do - other_project.team << [project.creator, :developer] - end - - it 'handles project issue references' do - subject.analyze("this refers issue #{other_project.path_with_namespace}##{issue.iid}") - extracted = subject.issues - expect(extracted.size).to eq(1) - expect(extracted).to eq([issue]) - end - end -end diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb deleted file mode 100644 index 727884c41c5..00000000000 --- a/spec/lib/gitlab/regex_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Regex do - describe 'project path regex' do - it { expect('gitlab-ce').to match(Gitlab::Regex.project_path_regex) } - it { expect('gitlab_git').to match(Gitlab::Regex.project_path_regex) } - it { expect('_underscore.js').to match(Gitlab::Regex.project_path_regex) } - it { expect('100px.com').to match(Gitlab::Regex.project_path_regex) } - it { expect('?gitlab').not_to match(Gitlab::Regex.project_path_regex) } - it { expect('git lab').not_to match(Gitlab::Regex.project_path_regex) } - it { expect('gitlab.git').not_to match(Gitlab::Regex.project_path_regex) } - end - - describe 'project name regex' do - it { expect('gitlab-ce').to match(Gitlab::Regex.project_name_regex) } - it { expect('GitLab CE').to match(Gitlab::Regex.project_name_regex) } - it { expect('100 lines').to match(Gitlab::Regex.project_name_regex) } - it { expect('gitlab.git').to match(Gitlab::Regex.project_name_regex) } - it { expect('?gitlab').not_to match(Gitlab::Regex.project_name_regex) } - end -end diff --git a/spec/lib/gitlab/satellite/action_spec.rb b/spec/lib/gitlab/satellite/action_spec.rb deleted file mode 100644 index 28e3d64ee2b..00000000000 --- a/spec/lib/gitlab/satellite/action_spec.rb +++ /dev/null @@ -1,118 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::Satellite::Action' do - let(:project) { create(:project) } - let(:user) { create(:user) } - - describe '#prepare_satellite!' do - it 'should be able to fetch timeout from conf' do - expect(Gitlab::Satellite::Action::DEFAULT_OPTIONS[:git_timeout]).to eq(30.seconds) - end - - it 'create a repository with a parking branch and one remote: origin' do - repo = project.satellite.repo - - #now lets dirty it up - - starting_remote_count = repo.git.list_remotes.size - expect(starting_remote_count).to be >= 1 - #kind of hookey way to add a second remote - origin_uri = repo.git.remote({v: true}).split(" ")[1] - begin - repo.git.remote({raise: true}, 'add', 'another-remote', origin_uri) - repo.git.branch({raise: true}, 'a-new-branch') - - expect(repo.heads.size).to be > (starting_remote_count) - expect(repo.git.remote().split(" ").size).to be > (starting_remote_count) - rescue - end - - repo.git.config({}, "user.name", "#{user.name} -- foo") - repo.git.config({}, "user.email", "#{user.email} -- foo") - expect(repo.config['user.name']).to eq("#{user.name} -- foo") - expect(repo.config['user.email']).to eq("#{user.email} -- foo") - - - #These must happen in the context of the satellite directory... - satellite_action = Gitlab::Satellite::Action.new(user, project) - project.satellite.lock { - #Now clean it up, use send to get around prepare_satellite! being protected - satellite_action.send(:prepare_satellite!, repo) - } - - #verify it's clean - heads = repo.heads.map(&:name) - expect(heads.size).to eq(1) - expect(heads.include?(Gitlab::Satellite::Satellite::PARKING_BRANCH)).to eq(true) - remotes = repo.git.remote().split(' ') - expect(remotes.size).to eq(1) - expect(remotes.include?('origin')).to eq(true) - expect(repo.config['user.name']).to eq(user.name) - expect(repo.config['user.email']).to eq(user.email) - end - end - - describe '#in_locked_and_timed_satellite' do - - it 'should make use of a lockfile' do - repo = project.satellite.repo - called = false - - #set assumptions - FileUtils.rm_f(project.satellite.lock_file) - - expect(File.exists?(project.satellite.lock_file)).to be_falsey - - satellite_action = Gitlab::Satellite::Action.new(user, project) - satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo| - expect(repo).to eq(sat_repo) - expect(File.exists? project.satellite.lock_file).to be_truthy - called = true - end - - expect(called).to be_truthy - - end - - it 'should be able to use the satellite after locking' do - repo = project.satellite.repo - called = false - - # Set base assumptions - if File.exists? project.satellite.lock_file - expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey - end - - satellite_action = Gitlab::Satellite::Action.new(user, project) - satellite_action.send(:in_locked_and_timed_satellite) do |sat_repo| - called = true - expect(repo).to eq(sat_repo) - expect(File.exists? project.satellite.lock_file).to be_truthy - expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_truthy - end - - expect(called).to be_truthy - expect(FileLockStatusChecker.new(project.satellite.lock_file).flocked?).to be_falsey - - end - - class FileLockStatusChecker < File - def flocked?(&block) - status = flock LOCK_EX|LOCK_NB - case status - when false - return true - when 0 - begin - block ? block.call : false - ensure - flock LOCK_UN - end - else - raise SystemCallError, status - end - end - end - - end -end diff --git a/spec/lib/gitlab/satellite/merge_action_spec.rb b/spec/lib/gitlab/satellite/merge_action_spec.rb deleted file mode 100644 index 915e3ff0e51..00000000000 --- a/spec/lib/gitlab/satellite/merge_action_spec.rb +++ /dev/null @@ -1,104 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::Satellite::MergeAction' do - include RepoHelpers - - let(:project) { create(:project, namespace: create(:group)) } - let(:fork_project) { create(:project, namespace: create(:group), forked_from_project: project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) } - - let(:merge_request_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) } - let(:merge_request_fork_with_conflict) { create(:merge_request, :conflict, source_project: project, target_project: project) } - - describe '#commits_between' do - def verify_commits(commits, first_commit_sha, last_commit_sha) - commits.each { |commit| expect(commit.class).to eq(Gitlab::Git::Commit) } - expect(commits.first.id).to eq(first_commit_sha) - expect(commits.last.id).to eq(last_commit_sha) - end - - context 'on fork' do - it 'should get proper commits between' do - commits = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).commits_between - verify_commits(commits, sample_compare.commits.first, sample_compare.commits.last) - end - end - - context 'between branches' do - it 'should raise exception -- not expected to be used by non forks' do - expect { Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between }.to raise_error - end - end - end - - describe '#format_patch' do - def verify_content(patch) - sample_compare.commits.each do |commit| - expect(patch.include?(commit)).to be_truthy - end - end - - context 'on fork' do - it 'should build a format patch' do - patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).format_patch - verify_content(patch) - end - end - - context 'between branches' do - it 'should build a format patch' do - patch = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request).format_patch - verify_content(patch) - end - end - end - - describe '#diffs_between_satellite tested against diff_in_satellite' do - def is_a_matching_diff(diff, diffs) - diff_count = diff.scan('diff --git').size - expect(diff_count).to be >= 1 - expect(diffs.size).to eq(diff_count) - diffs.each do |a_diff| - expect(a_diff.class).to eq(Gitlab::Git::Diff) - expect(diff.include? a_diff.diff).to be_truthy - end - end - - context 'on fork' do - it 'should get proper diffs' do - diffs = Gitlab::Satellite::MergeAction.new(merge_request_fork.author, merge_request_fork).diffs_between_satellite - diff = Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request_fork).diff_in_satellite - is_a_matching_diff(diff, diffs) - end - end - - context 'between branches' do - it 'should get proper diffs' do - expect{ Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite }.to raise_error - end - end - end - - describe '#can_be_merged?' do - context 'on fork' do - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_fork.author, - merge_request_fork).can_be_merged?).to be_truthy } - - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_fork_with_conflict.author, - merge_request_fork_with_conflict).can_be_merged?).to be_falsey } - end - - context 'between branches' do - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request.author, - merge_request).can_be_merged?).to be_truthy } - - it { expect(Gitlab::Satellite::MergeAction.new( - merge_request_with_conflict.author, - merge_request_with_conflict).can_be_merged?).to be_falsey } - end - end -end diff --git a/spec/lib/gitlab/upgrader_spec.rb b/spec/lib/gitlab/upgrader_spec.rb deleted file mode 100644 index ce3ea6c260a..00000000000 --- a/spec/lib/gitlab/upgrader_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Upgrader do - let(:upgrader) { Gitlab::Upgrader.new } - let(:current_version) { Gitlab::VERSION } - - describe 'current_version_raw' do - it { expect(upgrader.current_version_raw).to eq(current_version) } - end - - describe 'latest_version?' do - it 'should be true if newest version' do - upgrader.stub(latest_version_raw: current_version) - expect(upgrader.latest_version?).to be_truthy - end - end - - describe 'latest_version_raw' do - it 'should be latest version for GitLab 5' do - upgrader.stub(current_version_raw: "5.3.0") - expect(upgrader.latest_version_raw).to eq("v5.4.2") - end - end -end diff --git a/spec/lib/gitlab/url_builder_spec.rb b/spec/lib/gitlab/url_builder_spec.rb deleted file mode 100644 index 5153ed15af3..00000000000 --- a/spec/lib/gitlab/url_builder_spec.rb +++ /dev/null @@ -1,77 +0,0 @@ -require 'spec_helper' - -describe Gitlab::UrlBuilder do - describe 'When asking for an issue' do - it 'returns the issue url' do - issue = create(:issue) - url = Gitlab::UrlBuilder.new(:issue).build(issue.id) - expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}" - end - end - - describe 'When asking for an merge request' do - it 'returns the merge request url' do - merge_request = create(:merge_request) - url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id) - expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}" - end - end - - describe 'When asking for a note on commit' do - let(:note) { create(:note_on_commit) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}" - end - end - - describe 'When asking for a note on commit diff' do - let(:note) { create(:note_on_commit_diff) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}" - end - end - - describe 'When asking for a note on issue' do - let(:issue) { create(:issue) } - let(:note) { create(:note_on_issue, noteable_id: issue.id) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}#note_#{note.id}" - end - end - - describe 'When asking for a note on merge request' do - let(:merge_request) { create(:merge_request) } - let(:note) { create(:note_on_merge_request, noteable_id: merge_request.id) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}" - end - end - - describe 'When asking for a note on merge request diff' do - let(:merge_request) { create(:merge_request) } - let(:note) { create(:note_on_merge_request_diff, noteable_id: merge_request.id) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}" - end - end - - describe 'When asking for a note on project snippet' do - let(:snippet) { create(:project_snippet) } - let(:note) { create(:note_on_project_snippet, noteable_id: snippet.id) } - let(:url) { Gitlab::UrlBuilder.new(:note).build(note.id) } - - it 'returns the note url' do - expect(url).to eq "#{Settings.gitlab['url']}/#{snippet.project.path_with_namespace}/snippets/#{note.noteable_id}#note_#{note.id}" - end - end -end diff --git a/spec/lib/gitlab/version_info_spec.rb b/spec/lib/gitlab/version_info_spec.rb deleted file mode 100644 index 5afeb1c1ec3..00000000000 --- a/spec/lib/gitlab/version_info_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require 'spec_helper' - -describe 'Gitlab::VersionInfo', no_db: true do - before do - @unknown = Gitlab::VersionInfo.new - @v0_0_1 = Gitlab::VersionInfo.new(0, 0, 1) - @v0_1_0 = Gitlab::VersionInfo.new(0, 1, 0) - @v1_0_0 = Gitlab::VersionInfo.new(1, 0, 0) - @v1_0_1 = Gitlab::VersionInfo.new(1, 0, 1) - @v1_1_0 = Gitlab::VersionInfo.new(1, 1, 0) - @v2_0_0 = Gitlab::VersionInfo.new(2, 0, 0) - end - - context '>' do - it { expect(@v2_0_0).to be > @v1_1_0 } - it { expect(@v1_1_0).to be > @v1_0_1 } - it { expect(@v1_0_1).to be > @v1_0_0 } - it { expect(@v1_0_0).to be > @v0_1_0 } - it { expect(@v0_1_0).to be > @v0_0_1 } - end - - context '>=' do - it { expect(@v2_0_0).to be >= Gitlab::VersionInfo.new(2, 0, 0) } - it { expect(@v2_0_0).to be >= @v1_1_0 } - end - - context '<' do - it { expect(@v0_0_1).to be < @v0_1_0 } - it { expect(@v0_1_0).to be < @v1_0_0 } - it { expect(@v1_0_0).to be < @v1_0_1 } - it { expect(@v1_0_1).to be < @v1_1_0 } - it { expect(@v1_1_0).to be < @v2_0_0 } - end - - context '<=' do - it { expect(@v0_0_1).to be <= Gitlab::VersionInfo.new(0, 0, 1) } - it { expect(@v0_0_1).to be <= @v0_1_0 } - end - - context '==' do - it { expect(@v0_0_1).to eq(Gitlab::VersionInfo.new(0, 0, 1)) } - it { expect(@v0_1_0).to eq(Gitlab::VersionInfo.new(0, 1, 0)) } - it { expect(@v1_0_0).to eq(Gitlab::VersionInfo.new(1, 0, 0)) } - end - - context '!=' do - it { expect(@v0_0_1).not_to eq(@v0_1_0) } - end - - context 'unknown' do - it { expect(@unknown).not_to be @v0_0_1 } - it { expect(@unknown).not_to be Gitlab::VersionInfo.new } - it { expect{@unknown > @v0_0_1}.to raise_error(ArgumentError) } - it { expect{@unknown < @v0_0_1}.to raise_error(ArgumentError) } - end - - context 'parse' do - it { expect(Gitlab::VersionInfo.parse("1.0.0")).to eq(@v1_0_0) } - it { expect(Gitlab::VersionInfo.parse("1.0.0.1")).to eq(@v1_0_0) } - it { expect(Gitlab::VersionInfo.parse("git 1.0.0b1")).to eq(@v1_0_0) } - it { expect(Gitlab::VersionInfo.parse("git 1.0b1")).not_to be_valid } - end - - context 'to_s' do - it { expect(@v1_0_0.to_s).to eq("1.0.0") } - it { expect(@unknown.to_s).to eq("Unknown") } - end -end - diff --git a/spec/lib/repository_cache_spec.rb b/spec/lib/repository_cache_spec.rb deleted file mode 100644 index af399f3a731..00000000000 --- a/spec/lib/repository_cache_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'rspec' -require_relative '../../lib/repository_cache' - -describe RepositoryCache do - let(:backend) { double('backend').as_null_object } - let(:cache) { RepositoryCache.new('example', backend) } - - describe '#cache_key' do - it 'includes the namespace' do - expect(cache.cache_key(:foo)).to eq 'foo:example' - end - end - - describe '#expire' do - it 'expires the given key from the cache' do - cache.expire(:foo) - expect(backend).to have_received(:delete).with('foo:example') - end - end - - describe '#fetch' do - it 'fetches the given key from the cache' do - cache.fetch(:bar) - expect(backend).to have_received(:fetch).with('bar:example') - end - - it 'accepts a block' do - p = -> {} - - cache.fetch(:baz, &p) - expect(backend).to have_received(:fetch).with('baz:example', &p) - end - end -end diff --git a/spec/lib/votes_spec.rb b/spec/lib/votes_spec.rb deleted file mode 100644 index df243a26008..00000000000 --- a/spec/lib/votes_spec.rb +++ /dev/null @@ -1,185 +0,0 @@ -require 'spec_helper' - -describe Issue, 'Votes' do - let(:issue) { create(:issue) } - - describe "#upvotes" do - it "with no notes has a 0/0 score" do - expect(issue.upvotes).to eq(0) - end - - it "should recognize non-+1 notes" do - add_note "No +1 here" - expect(issue.notes.size).to eq(1) - expect(issue.notes.first.upvote?).to be_falsey - expect(issue.upvotes).to eq(0) - end - - it "should recognize a single +1 note" do - add_note "+1 This is awesome" - expect(issue.upvotes).to eq(1) - end - - it 'should recognize multiple +1 notes' do - add_note '+1 This is awesome', create(:user) - add_note '+1 I want this', create(:user) - expect(issue.upvotes).to eq(2) - end - - it 'should not count 2 +1 votes from the same user' do - add_note '+1 This is awesome' - add_note '+1 I want this' - expect(issue.upvotes).to eq(1) - end - end - - describe "#downvotes" do - it "with no notes has a 0/0 score" do - expect(issue.downvotes).to eq(0) - end - - it "should recognize non--1 notes" do - add_note "Almost got a -1" - expect(issue.notes.size).to eq(1) - expect(issue.notes.first.downvote?).to be_falsey - expect(issue.downvotes).to eq(0) - end - - it "should recognize a single -1 note" do - add_note "-1 This is bad" - expect(issue.downvotes).to eq(1) - end - - it "should recognize multiple -1 notes" do - add_note('-1 This is bad', create(:user)) - add_note('-1 Away with this', create(:user)) - expect(issue.downvotes).to eq(2) - end - end - - describe "#votes_count" do - it "with no notes has a 0/0 score" do - expect(issue.votes_count).to eq(0) - end - - it "should recognize non notes" do - add_note "No +1 here" - expect(issue.notes.size).to eq(1) - expect(issue.votes_count).to eq(0) - end - - it "should recognize a single +1 note" do - add_note "+1 This is awesome" - expect(issue.votes_count).to eq(1) - end - - it "should recognize a single -1 note" do - add_note "-1 This is bad" - expect(issue.votes_count).to eq(1) - end - - it "should recognize multiple notes" do - add_note('+1 This is awesome', create(:user)) - add_note('-1 This is bad', create(:user)) - add_note('+1 I want this', create(:user)) - expect(issue.votes_count).to eq(3) - end - - it 'should not count 2 -1 votes from the same user' do - add_note '-1 This is suspicious' - add_note '-1 This is bad' - expect(issue.votes_count).to eq(1) - end - end - - describe "#upvotes_in_percent" do - it "with no notes has a 0% score" do - expect(issue.upvotes_in_percent).to eq(0) - end - - it "should count a single 1 note as 100%" do - add_note "+1 This is awesome" - expect(issue.upvotes_in_percent).to eq(100) - end - - it 'should count multiple +1 notes as 100%' do - add_note('+1 This is awesome', create(:user)) - add_note('+1 I want this', create(:user)) - expect(issue.upvotes_in_percent).to eq(100) - end - - it 'should count fractions for multiple +1 and -1 notes correctly' do - add_note('+1 This is awesome', create(:user)) - add_note('+1 I want this', create(:user)) - add_note('-1 This is bad', create(:user)) - add_note('+1 me too', create(:user)) - expect(issue.upvotes_in_percent).to eq(75) - end - end - - describe "#downvotes_in_percent" do - it "with no notes has a 0% score" do - expect(issue.downvotes_in_percent).to eq(0) - end - - it "should count a single -1 note as 100%" do - add_note "-1 This is bad" - expect(issue.downvotes_in_percent).to eq(100) - end - - it 'should count multiple -1 notes as 100%' do - add_note('-1 This is bad', create(:user)) - add_note('-1 Away with this', create(:user)) - expect(issue.downvotes_in_percent).to eq(100) - end - - it 'should count fractions for multiple +1 and -1 notes correctly' do - add_note('+1 This is awesome', create(:user)) - add_note('+1 I want this', create(:user)) - add_note('-1 This is bad', create(:user)) - add_note('+1 me too', create(:user)) - expect(issue.downvotes_in_percent).to eq(25) - end - end - - describe '#filter_superceded_votes' do - - it 'should count a users vote only once amongst multiple votes' do - add_note('-1 This needs work before I will accept it') - add_note('+1 I want this', create(:user)) - add_note('+1 This is is awesome', create(:user)) - add_note('+1 this looks good now') - add_note('+1 This is awesome', create(:user)) - add_note('+1 me too', create(:user)) - expect(issue.downvotes).to eq(0) - expect(issue.upvotes).to eq(5) - end - - it 'should count each users vote only once' do - add_note '-1 This needs work before it will be accepted' - add_note '+1 I like this' - add_note '+1 I still like this' - add_note '+1 I really like this' - add_note '+1 Give me this now!!!!' - expect(issue.downvotes).to eq(0) - expect(issue.upvotes).to eq(1) - end - - it 'should count a users vote only once without caring about comments' do - add_note '-1 This needs work before it will be accepted' - add_note 'Comment 1' - add_note 'Another comment' - add_note '+1 vote' - add_note 'final comment' - expect(issue.downvotes).to eq(0) - expect(issue.upvotes).to eq(1) - end - - end - - def add_note(text, author = issue.author) - created_at = Time.now - 1.hour + Note.count.seconds - issue.notes << create(:note, note: text, project: issue.project, - author_id: author.id, created_at: created_at) - end -end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb deleted file mode 100644 index b297fbd5119..00000000000 --- a/spec/mailers/notify_spec.rb +++ /dev/null @@ -1,808 +0,0 @@ -require 'spec_helper' - -describe Notify do - include EmailSpec::Helpers - include EmailSpec::Matchers - include RepoHelpers - - let(:gitlab_sender_display_name) { Gitlab.config.gitlab.email_display_name } - let(:gitlab_sender) { Gitlab.config.gitlab.email_from } - let(:gitlab_sender_reply_to) { Gitlab.config.gitlab.email_reply_to } - let(:recipient) { create(:user, email: 'recipient@example.com') } - let(:project) { create(:project) } - - around(:each) { ActionMailer::Base.deliveries.clear } - - before(:each) do - email = recipient.emails.create(email: "notifications@example.com") - recipient.update_attribute(:notification_email, email.email) - end - - shared_examples 'a multiple recipients email' do - it 'is sent to the given recipient' do - is_expected.to deliver_to recipient.notification_email - end - end - - shared_examples 'an email sent from GitLab' do - it 'is sent from GitLab' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(gitlab_sender_display_name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has a Reply-To address' do - reply_to = subject.header[:reply_to].addresses - expect(reply_to).to eq([gitlab_sender_reply_to]) - end - end - - shared_examples 'an email starting a new thread' do |message_id_prefix| - it 'has a discussion identifier' do - is_expected.to have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - is_expected.to have_header 'X-GitLab-Project', /#{project.name}/ - end - end - - shared_examples 'an answer to an existing thread' do |thread_id_prefix| - it 'has a subject that begins with Re: ' do - is_expected.to have_subject /^Re: / - end - - it 'has headers that reference an existing thread' do - is_expected.to have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - is_expected.to have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/ - is_expected.to have_header 'X-GitLab-Project', /#{project.name}/ - end - end - - describe 'for new users, the email' do - let(:example_site_path) { root_path } - let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) } - - token = 'kETLwRaayvigPq_x3SNM' - - subject { Notify.new_user_email(new_user.id, token) } - - it_behaves_like 'an email sent from GitLab' - - it 'is sent to the new user' do - is_expected.to deliver_to new_user.email - end - - it 'has the correct subject' do - is_expected.to have_subject /^Account was created for you$/i - end - - it 'contains the new user\'s login name' do - is_expected.to have_body_text /#{new_user.email}/ - end - - it 'contains the password text' do - is_expected.to have_body_text /Click here to set your password/ - end - - it 'includes a link for user to set password' do - params = "reset_password_token=#{token}" - is_expected.to have_body_text( - %r{http://localhost(:\d+)?/users/password/edit\?#{params}} - ) - end - - it 'includes a link to the site' do - is_expected.to have_body_text /#{example_site_path}/ - end - end - - - describe 'for users that signed up, the email' do - let(:example_site_path) { root_path } - let(:new_user) { create(:user, email: 'newguy@example.com', password: "securePassword") } - - subject { Notify.new_user_email(new_user.id) } - - it_behaves_like 'an email sent from GitLab' - - it 'is sent to the new user' do - is_expected.to deliver_to new_user.email - end - - it 'has the correct subject' do - is_expected.to have_subject /^Account was created for you$/i - end - - it 'contains the new user\'s login name' do - is_expected.to have_body_text /#{new_user.email}/ - end - - it 'should not contain the new user\'s password' do - is_expected.not_to have_body_text /password/ - end - - it 'includes a link to the site' do - is_expected.to have_body_text /#{example_site_path}/ - end - end - - describe 'user added ssh key' do - let(:key) { create(:personal_key) } - - subject { Notify.new_ssh_key_email(key.id) } - - it_behaves_like 'an email sent from GitLab' - - it 'is sent to the new user' do - is_expected.to deliver_to key.user.email - end - - it 'has the correct subject' do - is_expected.to have_subject /^SSH key was added to your account$/i - end - - it 'contains the new ssh key title' do - is_expected.to have_body_text /#{key.title}/ - end - - it 'includes a link to ssh keys page' do - is_expected.to have_body_text /#{profile_keys_path}/ - end - end - - describe 'user added email' do - let(:email) { create(:email) } - - subject { Notify.new_email_email(email.id) } - - it 'is sent to the new user' do - is_expected.to deliver_to email.user.email - end - - it 'has the correct subject' do - is_expected.to have_subject /^Email was added to your account$/i - end - - it 'contains the new email address' do - is_expected.to have_body_text /#{email.email}/ - end - - it 'includes a link to emails page' do - is_expected.to have_body_text /#{profile_emails_path}/ - end - end - - context 'for a project' do - describe 'items that are assignable, the email' do - let(:current_user) { create(:user, email: "current@email.com") } - let(:assignee) { create(:user, email: 'assignee@example.com') } - let(:previous_assignee) { create(:user, name: 'Previous Assignee') } - - shared_examples 'an assignee email' do - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(current_user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to the assignee' do - is_expected.to deliver_to assignee.email - end - end - - context 'for issues' do - let(:issue) { create(:issue, author: current_user, assignee: assignee, project: project) } - let(:issue_with_description) { create(:issue, author: current_user, assignee: assignee, project: project, description: Faker::Lorem.sentence) } - - describe 'that are new' do - subject { Notify.new_issue_email(issue.assignee_id, issue.id) } - - it_behaves_like 'an assignee email' - it_behaves_like 'an email starting a new thread', 'issue' - - it 'has the correct subject' do - is_expected.to have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/ - end - - it 'contains a link to the new issue' do - is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/ - end - end - - describe 'that are new with a description' do - subject { Notify.new_issue_email(issue_with_description.assignee_id, issue_with_description.id) } - - it 'contains the description' do - is_expected.to have_body_text /#{issue_with_description.description}/ - end - end - - describe 'that have been reassigned' do - subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) } - - it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'issue' - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(current_user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has the correct subject' do - is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/ - end - - it 'contains the name of the previous assignee' do - is_expected.to have_body_text /#{previous_assignee.name}/ - end - - it 'contains the name of the new assignee' do - is_expected.to have_body_text /#{assignee.name}/ - end - - it 'contains a link to the issue' do - is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/ - end - end - - describe 'status changed' do - let(:status) { 'closed' } - subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) } - - it_behaves_like 'an answer to an existing thread', 'issue' - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(current_user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has the correct subject' do - is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/i - end - - it 'contains the new status' do - is_expected.to have_body_text /#{status}/i - end - - it 'contains the user name' do - is_expected.to have_body_text /#{current_user.name}/i - end - - it 'contains a link to the issue' do - is_expected.to have_body_text /#{namespace_project_issue_path project.namespace, project, issue}/ - end - end - - end - - context 'for merge requests' do - let(:merge_author) { create(:user) } - let(:merge_request) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project) } - let(:merge_request_with_description) { create(:merge_request, author: current_user, assignee: assignee, source_project: project, target_project: project, description: Faker::Lorem.sentence) } - - describe 'that are new' do - subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) } - - it_behaves_like 'an assignee email' - it_behaves_like 'an email starting a new thread', 'merge_request' - - it 'has the correct subject' do - is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ - end - - it 'contains a link to the new merge request' do - is_expected.to have_body_text /#{namespace_project_merge_request_path(project.namespace, project, merge_request)}/ - end - - it 'contains the source branch for the merge request' do - is_expected.to have_body_text /#{merge_request.source_branch}/ - end - - it 'contains the target branch for the merge request' do - is_expected.to have_body_text /#{merge_request.target_branch}/ - end - - it 'has the correct message-id set' do - is_expected.to have_header 'Message-ID', "" - end - end - - describe 'that are new with a description' do - subject { Notify.new_merge_request_email(merge_request_with_description.assignee_id, merge_request_with_description.id) } - - it 'contains the description' do - is_expected.to have_body_text /#{merge_request_with_description.description}/ - end - end - - describe 'that are reassigned' do - subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) } - - it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'merge_request' - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(current_user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has the correct subject' do - is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ - end - - it 'contains the name of the previous assignee' do - is_expected.to have_body_text /#{previous_assignee.name}/ - end - - it 'contains the name of the new assignee' do - is_expected.to have_body_text /#{assignee.name}/ - end - - it 'contains a link to the merge request' do - is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/ - end - end - - describe 'status changed' do - let(:status) { 'reopened' } - subject { Notify.merge_request_status_email(recipient.id, merge_request.id, status, current_user) } - - it_behaves_like 'an answer to an existing thread', 'merge_request' - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(current_user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has the correct subject' do - is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/i - end - - it 'contains the new status' do - is_expected.to have_body_text /#{status}/i - end - - it 'contains the user name' do - is_expected.to have_body_text /#{current_user.name}/i - end - - it 'contains a link to the merge request' do - is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/ - end - end - - describe 'that are merged' do - subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) } - - it_behaves_like 'a multiple recipients email' - it_behaves_like 'an answer to an existing thread', 'merge_request' - - it 'is sent as the merge author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(merge_author.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'has the correct subject' do - is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ - end - - it 'contains the new status' do - is_expected.to have_body_text /merged/i - end - - it 'contains a link to the merge request' do - is_expected.to have_body_text /#{namespace_project_merge_request_path project.namespace, project, merge_request}/ - end - end - end - end - - describe 'project was moved' do - let(:project) { create(:project) } - let(:user) { create(:user) } - subject { Notify.project_was_moved_email(project.id, user.id) } - - it_behaves_like 'an email sent from GitLab' - - it 'has the correct subject' do - is_expected.to have_subject /Project was moved/ - end - - it 'contains name of project' do - is_expected.to have_body_text /#{project.name_with_namespace}/ - end - - it 'contains new user role' do - is_expected.to have_body_text /#{project.ssh_url_to_repo}/ - end - end - - describe 'project access changed' do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:project_member) { create(:project_member, - project: project, - user: user) } - subject { Notify.project_access_granted_email(project_member.id) } - - it_behaves_like 'an email sent from GitLab' - - it 'has the correct subject' do - is_expected.to have_subject /Access to project was granted/ - end - it 'contains name of project' do - is_expected.to have_body_text /#{project.name}/ - end - it 'contains new user role' do - is_expected.to have_body_text /#{project_member.human_access}/ - end - end - - context 'items that are noteable, the email for a note' do - let(:note_author) { create(:user, name: 'author_name') } - let(:note) { create(:note, project: project, author: note_author) } - - before :each do - allow(Note).to receive(:find).with(note.id).and_return(note) - end - - shared_examples 'a note email' do - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(note_author.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to the given recipient' do - is_expected.to deliver_to recipient.notification_email - end - - it 'contains the message from the note' do - is_expected.to have_body_text /#{note.note}/ - end - end - - describe 'on a commit' do - let(:commit) { project.repository.commit } - - before(:each) { allow(note).to receive(:noteable).and_return(commit) } - - subject { Notify.note_commit_email(recipient.id, note.id) } - - it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'commits' - - it 'has the correct subject' do - is_expected.to have_subject /#{commit.title} \(#{commit.short_id}\)/ - end - - it 'contains a link to the commit' do - is_expected.to have_body_text commit.short_id - end - end - - describe 'on a merge request' do - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:note_on_merge_request_path) { namespace_project_merge_request_path(project.namespace, project, merge_request, anchor: "note_#{note.id}") } - before(:each) { allow(note).to receive(:noteable).and_return(merge_request) } - - subject { Notify.note_merge_request_email(recipient.id, note.id) } - - it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'merge_request' - - it 'has the correct subject' do - is_expected.to have_subject /#{merge_request.title} \(##{merge_request.iid}\)/ - end - - it 'contains a link to the merge request note' do - is_expected.to have_body_text /#{note_on_merge_request_path}/ - end - end - - describe 'on an issue' do - let(:issue) { create(:issue, project: project) } - let(:note_on_issue_path) { namespace_project_issue_path(project.namespace, project, issue, anchor: "note_#{note.id}") } - before(:each) { allow(note).to receive(:noteable).and_return(issue) } - - subject { Notify.note_issue_email(recipient.id, note.id) } - - it_behaves_like 'a note email' - it_behaves_like 'an answer to an existing thread', 'issue' - - it 'has the correct subject' do - is_expected.to have_subject /#{issue.title} \(##{issue.iid}\)/ - end - - it 'contains a link to the issue note' do - is_expected.to have_body_text /#{note_on_issue_path}/ - end - end - end - end - - describe 'group access changed' do - let(:group) { create(:group) } - let(:user) { create(:user) } - let(:membership) { create(:group_member, group: group, user: user) } - - subject { Notify.group_access_granted_email(membership.id) } - - it_behaves_like 'an email sent from GitLab' - - it 'has the correct subject' do - is_expected.to have_subject /Access to group was granted/ - end - - it 'contains name of project' do - is_expected.to have_body_text /#{group.name}/ - end - - it 'contains new user role' do - is_expected.to have_body_text /#{membership.human_access}/ - end - end - - describe 'confirmation if email changed' do - let(:example_site_path) { root_path } - let(:user) { create(:user, email: 'old-email@mail.com') } - - before do - user.email = "new-email@mail.com" - user.save - end - - subject { ActionMailer::Base.deliveries.last } - - it_behaves_like 'an email sent from GitLab' - - it 'is sent to the new user' do - is_expected.to deliver_to 'new-email@mail.com' - end - - it 'has the correct subject' do - is_expected.to have_subject "Confirmation instructions" - end - - it 'includes a link to the site' do - is_expected.to have_body_text /#{example_site_path}/ - end - end - - describe 'email on push for a created branch' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - let(:tree_path) { namespace_project_tree_path(project.namespace, project, "master") } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :create) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /Pushed new branch master/ - end - - it 'contains a link to the branch' do - is_expected.to have_body_text /#{tree_path}/ - end - end - - describe 'email on push for a created tag' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - let(:tree_path) { namespace_project_tree_path(project.namespace, project, "v1.0") } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/tags/v1.0', action: :create) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /Pushed new tag v1\.0/ - end - - it 'contains a link to the tag' do - is_expected.to have_body_text /#{tree_path}/ - end - end - - describe 'email on push for a deleted branch' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :delete) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /Deleted branch master/ - end - end - - describe 'email on push for a deleted tag' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/tags/v1.0', action: :delete) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /Deleted tag v1\.0/ - end - end - - describe 'email on push with multiple commits' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_image_commit.id, sample_commit.id) } - let(:commits) { Commit.decorate(compare.commits) } - let(:diff_path) { namespace_project_compare_path(project.namespace, project, from: Commit.new(compare.base), to: Commit.new(compare.head)) } - let(:send_from_committer_email) { false } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare, reverse_compare: false, send_from_committer_email: send_from_committer_email) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /\[#{project.path_with_namespace}\]\[master\] #{commits.length} commits:/ - end - - it 'includes commits list' do - is_expected.to have_body_text /Change some files/ - end - - it 'includes diffs' do - is_expected.to have_body_text /def archive_formats_regex/ - end - - it 'contains a link to the diff' do - is_expected.to have_body_text /#{diff_path}/ - end - - it 'doesn not contain the misleading footer' do - is_expected.not_to have_body_text /you are a member of/ - end - - context "when set to send from committer email if domain matches" do - - let(:send_from_committer_email) { true } - - before do - allow(Gitlab.config.gitlab).to receive(:host).and_return("gitlab.corp.company.com") - end - - context "when the committer email domain is within the GitLab domain" do - - before do - user.update_attribute(:email, "user@company.com") - user.confirm! - end - - it "is sent from the committer email" do - sender = subject.header[:from].addrs[0] - expect(sender.address).to eq(user.email) - end - - it "is set to reply to the committer email" do - sender = subject.header[:reply_to].addrs[0] - expect(sender.address).to eq(user.email) - end - end - - context "when the committer email domain is not completely within the GitLab domain" do - - before do - user.update_attribute(:email, "user@something.company.com") - user.confirm! - end - - it "is sent from the default email" do - sender = subject.header[:from].addrs[0] - expect(sender.address).to eq(gitlab_sender) - end - - it "is set to reply to the default email" do - sender = subject.header[:reply_to].addrs[0] - expect(sender.address).to eq(gitlab_sender_reply_to) - end - end - - context "when the committer email domain is outside the GitLab domain" do - - before do - user.update_attribute(:email, "user@mpany.com") - user.confirm! - end - - it "is sent from the default email" do - sender = subject.header[:from].addrs[0] - expect(sender.address).to eq(gitlab_sender) - end - - it "is set to reply to the default email" do - sender = subject.header[:reply_to].addrs[0] - expect(sender.address).to eq(gitlab_sender_reply_to) - end - end - end - end - - describe 'email on push with a single commit' do - let(:example_site_path) { root_path } - let(:user) { create(:user) } - let(:compare) { Gitlab::Git::Compare.new(project.repository.raw_repository, sample_commit.parent_id, sample_commit.id) } - let(:commits) { Commit.decorate(compare.commits) } - let(:diff_path) { namespace_project_commit_path(project.namespace, project, commits.first) } - - subject { Notify.repository_push_email(project.id, 'devs@company.name', author_id: user.id, ref: 'refs/heads/master', action: :push, compare: compare) } - - it 'is sent as the author' do - sender = subject.header[:from].addrs[0] - expect(sender.display_name).to eq(user.name) - expect(sender.address).to eq(gitlab_sender) - end - - it 'is sent to recipient' do - is_expected.to deliver_to 'devs@company.name' - end - - it 'has the correct subject' do - is_expected.to have_subject /#{commits.first.title}/ - end - - it 'includes commits list' do - is_expected.to have_body_text /Change some files/ - end - - it 'includes diffs' do - is_expected.to have_body_text /def archive_formats_regex/ - end - - it 'contains a link to the diff' do - is_expected.to have_body_text /#{diff_path}/ - end - end -end diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb deleted file mode 100644 index b4f0b2c201a..00000000000 --- a/spec/models/application_setting_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# == Schema Information -# -# Table name: application_settings -# -# id :integer not null, primary key -# default_projects_limit :integer -# default_branch_protection :integer -# signup_enabled :boolean -# signin_enabled :boolean -# gravatar_enabled :boolean -# sign_in_text :text -# created_at :datetime -# updated_at :datetime -# home_page_url :string(255) -# default_branch_protection :integer default(2) -# twitter_sharing_enabled :boolean default(TRUE) -# restricted_visibility_levels :text -# - -require 'spec_helper' - -describe ApplicationSetting, models: true do - it { expect(ApplicationSetting.create_from_defaults).to be_valid } -end diff --git a/spec/models/broadcast_message_spec.rb b/spec/models/broadcast_message_spec.rb deleted file mode 100644 index 8ab72151a69..00000000000 --- a/spec/models/broadcast_message_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -# == Schema Information -# -# Table name: broadcast_messages -# -# id :integer not null, primary key -# message :text not null -# starts_at :datetime -# ends_at :datetime -# alert_type :integer -# created_at :datetime -# updated_at :datetime -# color :string(255) -# font :string(255) -# - -require 'spec_helper' - -describe BroadcastMessage do - subject { create(:broadcast_message) } - - it { is_expected.to be_valid } - - describe :current do - it "should return last message if time match" do - broadcast_message = create(:broadcast_message, starts_at: Time.now.yesterday, ends_at: Time.now.tomorrow) - expect(BroadcastMessage.current).to eq(broadcast_message) - end - - it "should return nil if time not come" do - broadcast_message = create(:broadcast_message, starts_at: Time.now.tomorrow, ends_at: Time.now + 2.days) - expect(BroadcastMessage.current).to be_nil - end - - it "should return nil if time has passed" do - broadcast_message = create(:broadcast_message, starts_at: Time.now - 2.days, ends_at: Time.now.yesterday) - expect(BroadcastMessage.current).to be_nil - end - end -end diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb deleted file mode 100644 index 11cc7762ce4..00000000000 --- a/spec/models/commit_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' - -describe Commit do - let(:project) { create :project } - let(:commit) { project.repository.commit } - - describe '#title' do - it "returns no_commit_message when safe_message is blank" do - allow(commit).to receive(:safe_message).and_return('') - expect(commit.title).to eq("--no commit message") - end - - it "truncates a message without a newline at 80 characters" do - message = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sodales id felis id blandit. Vivamus egestas lacinia lacus, sed rutrum mauris.' - - allow(commit).to receive(:safe_message).and_return(message) - expect(commit.title).to eq("#{message[0..79]}…") - end - - it "truncates a message with a newline before 80 characters at the newline" do - message = commit.safe_message.split(" ").first - - allow(commit).to receive(:safe_message).and_return(message + "\n" + message) - expect(commit.title).to eq(message) - end - - it "does not truncates a message with a newline after 80 but less 100 characters" do - message =<(txt){ subject.stub(safe_message: txt) } } - - # Include the subject in the repository stub. - let(:extra_commits) { [subject] } - end -end diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb deleted file mode 100644 index 557c71b4d2c..00000000000 --- a/spec/models/concerns/issuable_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -require 'spec_helper' - -describe Issue, "Issuable" do - let(:issue) { create(:issue) } - - describe "Associations" do - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:author) } - it { is_expected.to belong_to(:assignee) } - it { is_expected.to have_many(:notes).dependent(:destroy) } - end - - describe "Validation" do - before { subject.stub(set_iid: false) } - it { is_expected.to validate_presence_of(:project) } - it { is_expected.to validate_presence_of(:iid) } - it { is_expected.to validate_presence_of(:author) } - it { is_expected.to validate_presence_of(:title) } - it { is_expected.to ensure_length_of(:title).is_at_least(0).is_at_most(255) } - end - - describe "Scope" do - it { expect(described_class).to respond_to(:opened) } - it { expect(described_class).to respond_to(:closed) } - it { expect(described_class).to respond_to(:assigned) } - end - - describe ".search" do - let!(:searchable_issue) { create(:issue, title: "Searchable issue") } - - it "matches by title" do - expect(described_class.search('able')).to eq([searchable_issue]) - end - end - - describe "#today?" do - it "returns true when created today" do - # Avoid timezone differences and just return exactly what we want - allow(Date).to receive(:today).and_return(issue.created_at.to_date) - expect(issue.today?).to be_truthy - end - - it "returns false when not created today" do - allow(Date).to receive(:today).and_return(Date.yesterday) - expect(issue.today?).to be_falsey - end - end - - describe "#new?" do - it "returns true when created today and record hasn't been updated" do - allow(issue).to receive(:today?).and_return(true) - expect(issue.new?).to be_truthy - end - - it "returns false when not created today" do - allow(issue).to receive(:today?).and_return(false) - expect(issue.new?).to be_falsey - end - - it "returns false when record has been updated" do - allow(issue).to receive(:today?).and_return(true) - issue.touch - expect(issue.new?).to be_falsey - end - end -end diff --git a/spec/models/concerns/mentionable_spec.rb b/spec/models/concerns/mentionable_spec.rb deleted file mode 100644 index eadb941a3fa..00000000000 --- a/spec/models/concerns/mentionable_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'spec_helper' - -describe Issue, "Mentionable" do - describe :mentioned_users do - let!(:user) { create(:user, username: 'stranger') } - let!(:user2) { create(:user, username: 'john') } - let!(:issue) { create(:issue, description: '@stranger mentioned') } - - subject { issue.mentioned_users } - - it { is_expected.to include(user) } - it { is_expected.not_to include(user2) } - end -end diff --git a/spec/models/deploy_key_spec.rb b/spec/models/deploy_key_spec.rb deleted file mode 100644 index b32be8d7a7c..00000000000 --- a/spec/models/deploy_key_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# == Schema Information -# -# Table name: keys -# -# id :integer not null, primary key -# user_id :integer -# created_at :datetime -# updated_at :datetime -# key :text -# title :string(255) -# type :string(255) -# fingerprint :string(255) -# - -require 'spec_helper' - -describe DeployKey do - let(:project) { create(:project) } - let(:deploy_key) { create(:deploy_key, projects: [project]) } - - describe "Associations" do - it { is_expected.to have_many(:deploy_keys_projects) } - it { is_expected.to have_many(:projects) } - end -end diff --git a/spec/models/deploy_keys_project_spec.rb b/spec/models/deploy_keys_project_spec.rb deleted file mode 100644 index 7032b777144..00000000000 --- a/spec/models/deploy_keys_project_spec.rb +++ /dev/null @@ -1,72 +0,0 @@ -# == Schema Information -# -# Table name: deploy_keys_projects -# -# id :integer not null, primary key -# deploy_key_id :integer not null -# project_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe DeployKeysProject do - describe "Associations" do - it { is_expected.to belong_to(:deploy_key) } - it { is_expected.to belong_to(:project) } - end - - describe "Validation" do - it { is_expected.to validate_presence_of(:project_id) } - it { is_expected.to validate_presence_of(:deploy_key_id) } - end - - describe "Destroying" do - let(:project) { create(:project) } - subject { create(:deploy_keys_project, project: project) } - let(:deploy_key) { subject.deploy_key } - - context "when the deploy key is only used by this project" do - context "when the deploy key is public" do - before do - deploy_key.update_attribute(:public, true) - end - - it "doesn't destroy the deploy key" do - subject.destroy - - expect { - deploy_key.reload - }.not_to raise_error(ActiveRecord::RecordNotFound) - end - end - - context "when the deploy key is private" do - it "destroys the deploy key" do - subject.destroy - - expect { - deploy_key.reload - }.to raise_error(ActiveRecord::RecordNotFound) - end - end - end - - context "when the deploy key is used by more than one project" do - let!(:other_project) { create(:project) } - - before do - other_project.deploy_keys << deploy_key - end - - it "doesn't destroy the deploy key" do - subject.destroy - - expect { - deploy_key.reload - }.not_to raise_error(ActiveRecord::RecordNotFound) - end - end - end -end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb deleted file mode 100644 index 0f32f162a10..00000000000 --- a/spec/models/event_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -# == Schema Information -# -# Table name: events -# -# id :integer not null, primary key -# target_type :string(255) -# target_id :integer -# title :string(255) -# data :text -# project_id :integer -# created_at :datetime -# updated_at :datetime -# action :integer -# author_id :integer -# - -require 'spec_helper' - -describe Event do - describe "Associations" do - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:target) } - end - - describe "Respond to" do - it { is_expected.to respond_to(:author_name) } - it { is_expected.to respond_to(:author_email) } - it { is_expected.to respond_to(:issue_title) } - it { is_expected.to respond_to(:merge_request_title) } - it { is_expected.to respond_to(:commits) } - end - - describe "Push event" do - before do - project = create(:project) - @user = project.owner - - data = { - before: Gitlab::Git::BLANK_SHA, - after: "0220c11b9a3e6c69dc8fd35321254ca9a7b98f7e", - ref: "refs/heads/master", - user_id: @user.id, - user_name: @user.name, - repository: { - name: project.name, - url: "localhost/rubinius", - description: "", - homepage: "localhost/rubinius", - private: true - } - } - - @event = Event.create( - project: project, - action: Event::PUSHED, - data: data, - author_id: @user.id - ) - end - - it { expect(@event.push?).to be_truthy } - it { expect(@event.proper?).to be_truthy } - it { expect(@event.tag?).to be_falsey } - it { expect(@event.branch_name).to eq("master") } - it { expect(@event.author).to eq(@user) } - end -end diff --git a/spec/models/external_wiki_service_spec.rb b/spec/models/external_wiki_service_spec.rb deleted file mode 100644 index 78ef687d29c..00000000000 --- a/spec/models/external_wiki_service_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -require 'spec_helper' - -describe ExternalWikiService do - include ExternalWikiHelper - describe "Associations" do - it { should belong_to :project } - it { should have_one :service_hook } - end - - describe "Validations" do - context "active" do - before do - subject.active = true - end - - it { should validate_presence_of :external_wiki_url } - end - end - - describe 'External wiki' do - let(:project) { create(:project) } - - context 'when it is active' do - before do - properties = { 'external_wiki_url' => 'https://gitlab.com' } - @service = project.create_external_wiki_service(active: true, properties: properties) - end - - after do - @service.destroy! - end - - it 'should replace the wiki url' do - wiki_path = get_project_wiki_path(project) - wiki_path.should match('https://gitlab.com') - end - end - end -end diff --git a/spec/models/forked_project_link_spec.rb b/spec/models/forked_project_link_spec.rb deleted file mode 100644 index 7d0ad44a92c..00000000000 --- a/spec/models/forked_project_link_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -# == Schema Information -# -# Table name: forked_project_links -# -# id :integer not null, primary key -# forked_to_project_id :integer not null -# forked_from_project_id :integer not null -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe ForkedProjectLink, "add link on fork" do - let(:project_from) { create(:project) } - let(:namespace) { create(:namespace) } - let(:user) { create(:user, namespace: namespace) } - - before do - @project_to = fork_project(project_from, user) - end - - it "project_to should know it is forked" do - expect(@project_to.forked?).to be_truthy - end - - it "project should know who it is forked from" do - expect(@project_to.forked_from_project).to eq(project_from) - end -end - -describe :forked_from_project do - let(:forked_project_link) { build(:forked_project_link) } - let(:project_from) { create(:project) } - let(:project_to) { create(:project, forked_project_link: forked_project_link) } - - - before :each do - forked_project_link.forked_from_project = project_from - forked_project_link.forked_to_project = project_to - forked_project_link.save! - end - - - it "project_to should know it is forked" do - expect(project_to.forked?).to be_truthy - end - - it "project_from should not be forked" do - expect(project_from.forked?).to be_falsey - end - - it "project_to.destroy should destroy fork_link" do - expect(forked_project_link).to receive(:destroy) - project_to.destroy - end - -end - -def fork_project(from_project, user) - context = Projects::ForkService.new(from_project, user) - shell = double("gitlab_shell") - shell.stub(fork_repository: true) - context.stub(gitlab_shell: shell) - context.execute -end - diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb deleted file mode 100644 index 9428224a64f..00000000000 --- a/spec/models/group_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -# == Schema Information -# -# Table name: namespaces -# -# id :integer not null, primary key -# name :string(255) not null -# path :string(255) not null -# owner_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) -# description :string(255) default(""), not null -# avatar :string(255) -# - -require 'spec_helper' - -describe Group do - let!(:group) { create(:group) } - - describe "Associations" do - it { is_expected.to have_many :projects } - it { is_expected.to have_many :group_members } - end - - it { is_expected.to validate_presence_of :name } - it { is_expected.to validate_uniqueness_of(:name) } - it { is_expected.to validate_presence_of :path } - it { is_expected.to validate_uniqueness_of(:path) } - it { is_expected.not_to validate_presence_of :owner } - - describe :users do - it { expect(group.users).to eq(group.owners) } - end - - describe :human_name do - it { expect(group.human_name).to eq(group.name) } - end - - describe :add_users do - let(:user) { create(:user) } - before { group.add_user(user, GroupMember::MASTER) } - - it { expect(group.group_members.masters.map(&:user)).to include(user) } - end - - describe :add_users do - let(:user) { create(:user) } - before { group.add_users([user.id], GroupMember::GUEST) } - - it "should update the group permission" do - expect(group.group_members.guests.map(&:user)).to include(user) - group.add_users([user.id], GroupMember::DEVELOPER) - expect(group.group_members.developers.map(&:user)).to include(user) - expect(group.group_members.guests.map(&:user)).not_to include(user) - end - end - - describe :avatar_type do - let(:user) { create(:user) } - before { group.add_user(user, GroupMember::MASTER) } - - it "should be true if avatar is image" do - group.update_attribute(:avatar, 'uploads/avatar.png') - expect(group.avatar_type).to be_truthy - end - - it "should be false if avatar is html page" do - group.update_attribute(:avatar, 'uploads/avatar.html') - expect(group.avatar_type).to eq(["only images allowed"]) - end - end -end diff --git a/spec/models/hooks/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb deleted file mode 100644 index 4e0d50d7f3f..00000000000 --- a/spec/models/hooks/project_hook_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -require 'spec_helper' - -describe ProjectHook do - describe '.push_hooks' do - it 'should return hooks for push events only' do - hook = create(:project_hook, push_events: true) - hook2 = create(:project_hook, push_events: false) - expect(ProjectHook.push_hooks).to eq([hook]) - end - end - - describe '.tag_push_hooks' do - it 'should return hooks for tag push events only' do - hook = create(:project_hook, tag_push_events: true) - hook2 = create(:project_hook, tag_push_events: false) - expect(ProjectHook.tag_push_hooks).to eq([hook]) - end - end -end diff --git a/spec/models/hooks/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb deleted file mode 100644 index 96bf74d45da..00000000000 --- a/spec/models/hooks/service_hook_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -require "spec_helper" - -describe ServiceHook do - describe "Associations" do - it { is_expected.to belong_to :service } - end -end diff --git a/spec/models/hooks/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb deleted file mode 100644 index 810b311a40b..00000000000 --- a/spec/models/hooks/system_hook_spec.rb +++ /dev/null @@ -1,100 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -require "spec_helper" - -describe SystemHook do - describe "execute" do - before(:each) do - @system_hook = create(:system_hook) - WebMock.stub_request(:post, @system_hook.url) - end - - it "project_create hook" do - Projects::CreateService.new(create(:user), name: 'empty').execute - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /project_create/).once - end - - it "project_destroy hook" do - user = create(:user) - project = create(:empty_project, namespace: user.namespace) - Projects::DestroyService.new(project, user, {}).execute - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /project_destroy/).once - end - - it "user_create hook" do - create(:user) - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_create/).once - end - - it "user_destroy hook" do - user = create(:user) - user.destroy - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_destroy/).once - end - - it "project_create hook" do - user = create(:user) - project = create(:project) - project.team << [user, :master] - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once - end - - it "project_destroy hook" do - user = create(:user) - project = create(:project) - project.team << [user, :master] - project.project_members.destroy_all - expect(WebMock).to have_requested(:post, @system_hook.url).with(body: /user_remove_from_team/).once - end - - it 'group create hook' do - create(:group) - expect(WebMock).to have_requested(:post, @system_hook.url).with( - body: /group_create/ - ).once - end - - it 'group destroy hook' do - group = create(:group) - group.destroy - expect(WebMock).to have_requested(:post, @system_hook.url).with( - body: /group_destroy/ - ).once - end - - it 'group member create hook' do - group = create(:group) - user = create(:user) - group.add_user(user, Gitlab::Access::MASTER) - expect(WebMock).to have_requested(:post, @system_hook.url).with( - body: /user_add_to_group/ - ).once - end - - it 'group member destroy hook' do - group = create(:group) - user = create(:user) - group.add_user(user, Gitlab::Access::MASTER) - group.group_members.destroy_all - expect(WebMock).to have_requested(:post, @system_hook.url).with( - body: /user_remove_from_group/ - ).once - end - - end -end diff --git a/spec/models/hooks/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb deleted file mode 100644 index 67ec9193ad7..00000000000 --- a/spec/models/hooks/web_hook_spec.rb +++ /dev/null @@ -1,74 +0,0 @@ -# == Schema Information -# -# Table name: web_hooks -# -# id :integer not null, primary key -# url :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) default("ProjectHook") -# service_id :integer -# push_events :boolean default(TRUE), not null -# issues_events :boolean default(FALSE), not null -# merge_requests_events :boolean default(FALSE), not null -# tag_push_events :boolean default(FALSE) -# - -require 'spec_helper' - -describe ProjectHook do - describe "Associations" do - it { is_expected.to belong_to :project } - end - - describe "Mass assignment" do - end - - describe "Validations" do - it { is_expected.to validate_presence_of(:url) } - - context "url format" do - it { is_expected.to allow_value("http://example.com").for(:url) } - it { is_expected.to allow_value("https://excample.com").for(:url) } - it { is_expected.to allow_value("http://test.com/api").for(:url) } - it { is_expected.to allow_value("http://test.com/api?key=abc").for(:url) } - it { is_expected.to allow_value("http://test.com/api?key=abc&type=def").for(:url) } - - it { is_expected.not_to allow_value("example.com").for(:url) } - it { is_expected.not_to allow_value("ftp://example.com").for(:url) } - it { is_expected.not_to allow_value("herp-and-derp").for(:url) } - end - end - - describe "execute" do - before(:each) do - @project_hook = create(:project_hook) - @project = create(:project) - @project.hooks << [@project_hook] - @data = { before: 'oldrev', after: 'newrev', ref: 'ref'} - - WebMock.stub_request(:post, @project_hook.url) - end - - it "POSTs to the web hook URL" do - @project_hook.execute(@data) - expect(WebMock).to have_requested(:post, @project_hook.url).once - end - - it "POSTs the data as JSON" do - json = @data.to_json - - @project_hook.execute(@data) - expect(WebMock).to have_requested(:post, @project_hook.url).with(body: json).once - end - - it "catches exceptions" do - expect(WebHook).to receive(:post).and_raise("Some HTTP Post error") - - expect { - @project_hook.execute(@data) - }.to raise_error - end - end -end diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb deleted file mode 100644 index 087e40c3d84..00000000000 --- a/spec/models/issue_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -# == Schema Information -# -# 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 -# - -require 'spec_helper' - -describe Issue do - describe "Associations" do - it { is_expected.to belong_to(:milestone) } - end - - describe "Mass assignment" do - end - - describe 'modules' do - it { is_expected.to include_module(Issuable) } - end - - subject { create(:issue) } - - describe '#is_being_reassigned?' do - it 'returns true if the issue assignee has changed' do - subject.assignee = create(:user) - expect(subject.is_being_reassigned?).to be_truthy - end - it 'returns false if the issue assignee has not changed' do - expect(subject.is_being_reassigned?).to be_falsey - end - end - - describe '#is_being_reassigned?' do - it 'returns issues assigned to user' do - user = create :user - - 2.times do - issue = create :issue, assignee: user - end - - expect(Issue.open_for(user).count).to eq 2 - end - end - - it_behaves_like 'an editable mentionable' do - let(:subject) { create :issue, project: mproject } - let(:backref_text) { "issue ##{subject.iid}" } - let(:set_mentionable_text) { ->(txt){ subject.description = txt } } - end - - it_behaves_like 'a Taskable' do - let(:subject) { create :issue } - end -end diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb deleted file mode 100644 index 2fb651bef1b..00000000000 --- a/spec/models/key_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -# == Schema Information -# -# Table name: keys -# -# id :integer not null, primary key -# user_id :integer -# created_at :datetime -# updated_at :datetime -# key :text -# title :string(255) -# type :string(255) -# fingerprint :string(255) -# - -require 'spec_helper' - -describe Key do - describe "Associations" do - it { is_expected.to belong_to(:user) } - end - - describe "Mass assignment" do - end - - describe "Validation" do - it { is_expected.to validate_presence_of(:title) } - it { is_expected.to validate_presence_of(:key) } - it { is_expected.to ensure_length_of(:title).is_within(0..255) } - it { is_expected.to ensure_length_of(:key).is_within(0..5000) } - end - - describe "Methods" do - it { is_expected.to respond_to :projects } - end - - context "validation of uniqueness" do - let(:user) { create(:user) } - - it "accepts the key once" do - expect(build(:key, user: user)).to be_valid - end - - it "does not accept the exact same key twice" do - create(:key, user: user) - expect(build(:key, user: user)).not_to be_valid - end - - it "does not accept a duplicate key with a different comment" do - create(:key, user: user) - duplicate = build(:key, user: user) - duplicate.key << ' extra comment' - expect(duplicate).not_to be_valid - end - end - - context "validate it is a fingerprintable key" do - it "accepts the fingerprintable key" do - expect(build(:key)).to be_valid - end - - it 'rejects an unfingerprintable key that contains a space' do - key = build(:key) - - # Not always the middle, but close enough - key.key = key.key[0..100] + ' ' + key.key[100..-1] - - expect(key).not_to be_valid - end - - it 'rejects the unfingerprintable key (not a key)' do - expect(build(:key, key: 'ssh-rsa an-invalid-key==')).not_to be_valid - end - end - - context 'callbacks' do - it 'should add new key to authorized_file' do - @key = build(:personal_key, id: 7) - expect(GitlabShellWorker).to receive(:perform_async).with(:add_key, @key.shell_id, @key.key) - @key.save - end - - it 'should remove key from authorized_file' do - @key = create(:personal_key) - expect(GitlabShellWorker).to receive(:perform_async).with(:remove_key, @key.shell_id, @key.key) - @key.destroy - end - end -end diff --git a/spec/models/label_link_spec.rb b/spec/models/label_link_spec.rb deleted file mode 100644 index 8c240826582..00000000000 --- a/spec/models/label_link_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# == Schema Information -# -# Table name: label_links -# -# id :integer not null, primary key -# label_id :integer -# target_id :integer -# target_type :string(255) -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe LabelLink do - let(:label) { create(:label_link) } - it { expect(label).to be_valid } - - it { is_expected.to belong_to(:label) } - it { is_expected.to belong_to(:target) } -end diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb deleted file mode 100644 index 8644ac46605..00000000000 --- a/spec/models/label_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -# == Schema Information -# -# Table name: labels -# -# id :integer not null, primary key -# title :string(255) -# color :string(255) -# project_id :integer -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe Label do - let(:label) { create(:label) } - it { expect(label).to be_valid } - - it { is_expected.to belong_to(:project) } - - describe 'Validation' do - it 'should validate color code' do - expect(build(:label, color: 'G-ITLAB')).not_to be_valid - expect(build(:label, color: 'AABBCC')).not_to be_valid - expect(build(:label, color: '#AABBCCEE')).not_to be_valid - expect(build(:label, color: '#GGHHII')).not_to be_valid - expect(build(:label, color: '#')).not_to be_valid - expect(build(:label, color: '')).not_to be_valid - - expect(build(:label, color: '#AABBCC')).to be_valid - end - - it 'should validate title' do - expect(build(:label, title: 'G,ITLAB')).not_to be_valid - expect(build(:label, title: 'G?ITLAB')).not_to be_valid - expect(build(:label, title: 'G&ITLAB')).not_to be_valid - expect(build(:label, title: '')).not_to be_valid - - expect(build(:label, title: 'GITLAB')).to be_valid - expect(build(:label, title: 'gitlab')).to be_valid - end - end -end diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb deleted file mode 100644 index 56d030a03b3..00000000000 --- a/spec/models/member_spec.rb +++ /dev/null @@ -1,148 +0,0 @@ -require 'spec_helper' - -describe Member do - describe "Associations" do - it { is_expected.to belong_to(:user) } - end - - describe "Validation" do - subject { Member.new(access_level: Member::GUEST) } - - it { is_expected.to validate_presence_of(:user) } - it { is_expected.to validate_presence_of(:source) } - it { is_expected.to validate_inclusion_of(:access_level).in_array(Gitlab::Access.values) } - - context "when an invite email is provided" do - let(:member) { build(:project_member, invite_email: "user@example.com", user: nil) } - - it "doesn't require a user" do - expect(member).to be_valid - end - - it "requires a valid invite email" do - member.invite_email = "nope" - - expect(member).not_to be_valid - end - - it "requires a unique invite email scoped to this source" do - create(:project_member, source: member.source, invite_email: member.invite_email) - - expect(member).not_to be_valid - end - - it "is valid otherwise" do - expect(member).to be_valid - end - end - - context "when an invite email is not provided" do - let(:member) { build(:project_member) } - - it "requires a user" do - member.user = nil - - expect(member).not_to be_valid - end - - it "is valid otherwise" do - expect(member).to be_valid - end - end - end - - describe "Delegate methods" do - it { is_expected.to respond_to(:user_name) } - it { is_expected.to respond_to(:user_email) } - end - - describe ".add_user" do - let!(:user) { create(:user) } - let(:project) { create(:project) } - - context "when called with a user id" do - it "adds the user as a member" do - Member.add_user(project.project_members, user.id, ProjectMember::MASTER) - - expect(project.users).to include(user) - end - end - - context "when called with a user object" do - it "adds the user as a member" do - Member.add_user(project.project_members, user, ProjectMember::MASTER) - - expect(project.users).to include(user) - end - end - - context "when called with a known user email" do - it "adds the user as a member" do - Member.add_user(project.project_members, user.email, ProjectMember::MASTER) - - expect(project.users).to include(user) - end - end - - context "when called with an unknown user email" do - it "adds a member invite" do - Member.add_user(project.project_members, "user@example.com", ProjectMember::MASTER) - - expect(project.project_members.invite.pluck(:invite_email)).to include("user@example.com") - end - end - end - - describe "#accept_invite!" do - let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) } - let(:user) { create(:user) } - - it "resets the invite token" do - member.accept_invite!(user) - - expect(member.invite_token).to be_nil - end - - it "sets the invite accepted timestamp" do - member.accept_invite!(user) - - expect(member.invite_accepted_at).not_to be_nil - end - - it "sets the user" do - member.accept_invite!(user) - - expect(member.user).to eq(user) - end - - it "calls #after_accept_invite" do - expect(member).to receive(:after_accept_invite) - - member.accept_invite!(user) - end - end - - describe "#decline_invite!" do - let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) } - - it "destroys the member" do - member.decline_invite! - - expect(member).to be_destroyed - end - - it "calls #after_decline_invite" do - expect(member).to receive(:after_decline_invite) - - member.decline_invite! - end - end - - describe "#generate_invite_token" do - let!(:member) { create(:project_member, invite_email: "user@example.com", user: nil) } - - it "sets the invite token" do - expect { member.generate_invite_token }.to change { member.invite_token} - end - end -end diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb deleted file mode 100644 index e206c11f33a..00000000000 --- a/spec/models/members/group_member_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -# == Schema Information -# -# Table name: members -# -# id :integer not null, primary key -# access_level :integer not null -# source_id :integer not null -# source_type :string(255) not null -# user_id :integer not null -# notification_level :integer not null -# type :string(255) -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe GroupMember do - context 'notification' do - describe "#after_create" do - it "should send email to user" do - membership = build(:group_member) - membership.stub(notification_service: double('NotificationService').as_null_object) - expect(membership).to receive(:notification_service) - membership.save - end - end - - describe "#after_update" do - before do - @group_member = create :group_member - @group_member.stub(notification_service: double('NotificationService').as_null_object) - end - - it "should send email to user" do - expect(@group_member).to receive(:notification_service) - @group_member.update_attribute(:access_level, GroupMember::MASTER) - end - - it "does not send an email when the access level has not changed" do - expect(@group_member).not_to receive(:notification_service) - @group_member.update_attribute(:access_level, GroupMember::OWNER) - end - end - end -end diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb deleted file mode 100644 index 521721f3577..00000000000 --- a/spec/models/members/project_member_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -# == Schema Information -# -# Table name: members -# -# id :integer not null, primary key -# access_level :integer not null -# source_id :integer not null -# source_type :string(255) not null -# user_id :integer not null -# notification_level :integer not null -# type :string(255) -# created_at :datetime -# updated_at :datetime -# - -require 'spec_helper' - -describe ProjectMember do - describe :import_team do - before do - @abilities = Six.new - @abilities << Ability - - @project_1 = create :project - @project_2 = create :project - - @user_1 = create :user - @user_2 = create :user - - @project_1.team << [ @user_1, :developer ] - @project_2.team << [ @user_2, :reporter ] - - @status = @project_2.team.import(@project_1) - end - - it { expect(@status).to be_truthy } - - describe 'project 2 should get user 1 as developer. user_2 should not be changed' do - it { expect(@project_2.users).to include(@user_1) } - it { expect(@project_2.users).to include(@user_2) } - - it { expect(@abilities.allowed?(@user_1, :write_project, @project_2)).to be_truthy } - it { expect(@abilities.allowed?(@user_2, :read_project, @project_2)).to be_truthy } - end - - describe 'project 1 should not be changed' do - it { expect(@project_1.users).to include(@user_1) } - it { expect(@project_1.users).not_to include(@user_2) } - end - end - - describe :add_users_into_projects do - before do - @project_1 = create :project - @project_2 = create :project - - @user_1 = create :user - @user_2 = create :user - - ProjectMember.add_users_into_projects( - [@project_1.id, @project_2.id], - [@user_1.id, @user_2.id], - ProjectMember::MASTER - ) - end - - it { expect(@project_1.users).to include(@user_1) } - it { expect(@project_1.users).to include(@user_2) } - - - it { expect(@project_2.users).to include(@user_1) } - it { expect(@project_2.users).to include(@user_2) } - end - - describe :truncate_teams do - before do - @project_1 = create :project - @project_2 = create :project - - @user_1 = create :user - @user_2 = create :user - - @project_1.team << [ @user_1, :developer] - @project_2.team << [ @user_2, :reporter] - - ProjectMember.truncate_teams([@project_1.id, @project_2.id]) - end - - it { expect(@project_1.users).to be_empty } - it { expect(@project_2.users).to be_empty } - end -end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb deleted file mode 100644 index d40503d791c..00000000000 --- a/spec/models/merge_request_spec.rb +++ /dev/null @@ -1,127 +0,0 @@ -# == Schema Information -# -# Table name: merge_requests -# -# id :integer not null, primary key -# target_branch :string(255) not null -# source_branch :string(255) not null -# source_project_id :integer not null -# author_id :integer -# assignee_id :integer -# title :string(255) -# created_at :datetime -# updated_at :datetime -# milestone_id :integer -# state :string(255) -# merge_status :string(255) -# target_project_id :integer not null -# iid :integer -# description :text -# position :integer default(0) -# locked_at :datetime -# - -require 'spec_helper' - -describe MergeRequest do - describe "Validation" do - it { is_expected.to validate_presence_of(:target_branch) } - it { is_expected.to validate_presence_of(:source_branch) } - end - - describe "Mass assignment" do - end - - describe "Respond to" do - it { is_expected.to respond_to(:unchecked?) } - it { is_expected.to respond_to(:can_be_merged?) } - it { is_expected.to respond_to(:cannot_be_merged?) } - end - - describe 'modules' do - it { is_expected.to include_module(Issuable) } - end - - describe "#mr_and_commit_notes" do - let!(:merge_request) { create(:merge_request) } - - before do - allow(merge_request).to receive(:commits) { [merge_request.source_project.repository.commit] } - create(:note, commit_id: merge_request.commits.first.id, noteable_type: 'Commit', project: merge_request.project) - create(:note, noteable: merge_request, project: merge_request.project) - end - - it "should include notes for commits" do - expect(merge_request.commits).not_to be_empty - expect(merge_request.mr_and_commit_notes.count).to eq(2) - end - end - - subject { create(:merge_request) } - - describe '#is_being_reassigned?' do - it 'returns true if the merge_request assignee has changed' do - subject.assignee = create(:user) - expect(subject.is_being_reassigned?).to be_truthy - end - it 'returns false if the merge request assignee has not changed' do - expect(subject.is_being_reassigned?).to be_falsey - end - end - - describe '#for_fork?' do - it 'returns true if the merge request is for a fork' do - subject.source_project = create(:project, namespace: create(:group)) - subject.target_project = create(:project, namespace: create(:group)) - - expect(subject.for_fork?).to be_truthy - end - - it 'returns false if is not for a fork' do - expect(subject.for_fork?).to be_falsey - end - end - - describe 'detection of issues to be closed' do - let(:issue0) { create :issue, project: subject.project } - let(:issue1) { create :issue, project: subject.project } - let(:commit0) { double('commit0', closes_issues: [issue0]) } - let(:commit1) { double('commit1', closes_issues: [issue0]) } - let(:commit2) { double('commit2', closes_issues: [issue1]) } - - before do - subject.stub(commits: [commit0, commit1, commit2]) - end - - it 'accesses the set of issues that will be closed on acceptance' do - subject.project.stub(default_branch: subject.target_branch) - - expect(subject.closes_issues).to eq([issue0, issue1].sort_by(&:id)) - end - - it 'only lists issues as to be closed if it targets the default branch' do - subject.project.stub(default_branch: 'master') - subject.target_branch = 'something-else' - - expect(subject.closes_issues).to be_empty - end - - it 'detects issues mentioned in the description' do - issue2 = create(:issue, project: subject.project) - subject.description = "Closes ##{issue2.iid}" - subject.project.stub(default_branch: subject.target_branch) - - expect(subject.closes_issues).to include(issue2) - end - end - - it_behaves_like 'an editable mentionable' do - let(:subject) { create :merge_request, source_project: mproject, target_project: mproject } - let(:backref_text) { "merge request !#{subject.iid}" } - let(:set_mentionable_text) { ->(txt){ subject.title = txt } } - end - - it_behaves_like 'a Taskable' do - let(:subject) { create :merge_request, :simple } - end -end diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb deleted file mode 100644 index 45171e1bf64..00000000000 --- a/spec/models/milestone_spec.rb +++ /dev/null @@ -1,143 +0,0 @@ -# == Schema Information -# -# Table name: milestones -# -# id :integer not null, primary key -# title :string(255) not null -# project_id :integer not null -# description :text -# due_date :date -# created_at :datetime -# updated_at :datetime -# state :string(255) -# iid :integer -# - -require 'spec_helper' - -describe Milestone do - describe "Associations" do - it { is_expected.to belong_to(:project) } - it { is_expected.to have_many(:issues) } - end - - describe "Mass assignment" do - end - - describe "Validation" do - before { subject.stub(set_iid: false) } - it { is_expected.to validate_presence_of(:title) } - it { is_expected.to validate_presence_of(:project) } - end - - let(:milestone) { create(:milestone) } - let(:issue) { create(:issue) } - - describe "#percent_complete" do - it "should not count open issues" do - milestone.issues << issue - expect(milestone.percent_complete).to eq(0) - end - - it "should count closed issues" do - issue.close - milestone.issues << issue - expect(milestone.percent_complete).to eq(100) - end - - it "should recover from dividing by zero" do - expect(milestone.issues).to receive(:count).and_return(0) - expect(milestone.percent_complete).to eq(100) - end - end - - describe "#expires_at" do - it "should be nil when due_date is unset" do - milestone.update_attributes(due_date: nil) - expect(milestone.expires_at).to be_nil - end - - it "should not be nil when due_date is set" do - milestone.update_attributes(due_date: Date.tomorrow) - expect(milestone.expires_at).to be_present - end - end - - describe :expired? do - context "expired" do - before do - milestone.stub(due_date: Date.today.prev_year) - end - - it { expect(milestone.expired?).to be_truthy } - end - - context "not expired" do - before do - milestone.stub(due_date: Date.today.next_year) - end - - it { expect(milestone.expired?).to be_falsey } - end - end - - describe :percent_complete do - before do - milestone.stub( - closed_items_count: 3, - total_items_count: 4 - ) - end - - it { expect(milestone.percent_complete).to eq(75) } - end - - describe :items_count do - before do - milestone.issues << create(:issue) - milestone.issues << create(:closed_issue) - milestone.merge_requests << create(:merge_request) - end - - it { expect(milestone.closed_items_count).to eq(1) } - it { expect(milestone.open_items_count).to eq(2) } - it { expect(milestone.total_items_count).to eq(3) } - it { expect(milestone.is_empty?).to be_falsey } - end - - describe :can_be_closed? do - it { expect(milestone.can_be_closed?).to be_truthy } - end - - describe :is_empty? do - before do - issue = create :closed_issue, milestone: milestone - merge_request = create :merge_request, milestone: milestone - end - - it 'Should return total count of issues and merge requests assigned to milestone' do - expect(milestone.total_items_count).to eq 2 - end - end - - describe :can_be_closed? do - before do - milestone = create :milestone - create :closed_issue, milestone: milestone - - issue = create :issue - end - - it 'should be true if milestone active and all nested issues closed' do - expect(milestone.can_be_closed?).to be_truthy - end - - it 'should be false if milestone active and not all nested issues closed' do - issue.milestone = milestone - issue.save - - expect(milestone.can_be_closed?).to be_falsey - end - end - -end diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb deleted file mode 100644 index e87432fdf62..00000000000 --- a/spec/models/namespace_spec.rb +++ /dev/null @@ -1,96 +0,0 @@ -# == Schema Information -# -# Table name: namespaces -# -# id :integer not null, primary key -# name :string(255) not null -# path :string(255) not null -# owner_id :integer -# created_at :datetime -# updated_at :datetime -# type :string(255) -# description :string(255) default(""), not null -# avatar :string(255) -# - -require 'spec_helper' - -describe Namespace do - let!(:namespace) { create(:namespace) } - - it { is_expected.to have_many :projects } - it { is_expected.to validate_presence_of :name } - it { is_expected.to validate_uniqueness_of(:name) } - it { is_expected.to validate_presence_of :path } - it { is_expected.to validate_uniqueness_of(:path) } - it { is_expected.to validate_presence_of :owner } - - describe "Mass assignment" do - end - - describe "Respond to" do - it { is_expected.to respond_to(:human_name) } - it { is_expected.to respond_to(:to_param) } - end - - describe :to_param do - it { expect(namespace.to_param).to eq(namespace.path) } - end - - describe :human_name do - it { expect(namespace.human_name).to eq(namespace.owner_name) } - end - - describe :search do - before do - @namespace = create :namespace - end - - it { expect(Namespace.search(@namespace.path)).to eq([@namespace]) } - it { expect(Namespace.search('unknown')).to eq([]) } - end - - describe :move_dir do - before do - @namespace = create :namespace - @namespace.stub(path_changed?: true) - end - - it "should raise error when directory exists" do - expect { @namespace.move_dir }.to raise_error("namespace directory cannot be moved") - end - - it "should move dir if path changed" do - new_path = @namespace.path + "_new" - @namespace.stub(path_was: @namespace.path) - @namespace.stub(path: new_path) - expect(@namespace.move_dir).to be_truthy - end - end - - describe :rm_dir do - it "should remove dir" do - expect(namespace.rm_dir).to be_truthy - end - end - - describe :find_by_path_or_name do - before do - @namespace = create(:namespace, name: 'WoW', path: 'woW') - end - - it { expect(Namespace.find_by_path_or_name('wow')).to eq(@namespace) } - it { expect(Namespace.find_by_path_or_name('WOW')).to eq(@namespace) } - it { expect(Namespace.find_by_path_or_name('unknown')).to eq(nil) } - end - - describe ".clean_path" do - - let!(:user) { create(:user, username: "johngitlab-etc") } - let!(:namespace) { create(:namespace, path: "JohnGitLab-etc1") } - - it "cleans the path and makes sure it's available" do - expect(Namespace.clean_path("-john+gitlab-ETC%.git@gmail.com")).to eq("johngitlab-ETC2") - end - end -end diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb deleted file mode 100644 index a7bf5081d5b..00000000000 --- a/spec/models/note_spec.rb +++ /dev/null @@ -1,637 +0,0 @@ -# == Schema Information -# -# Table name: notes -# -# id :integer not null, primary key -# note :text -# noteable_type :string(255) -# author_id :integer -# created_at :datetime -# updated_at :datetime -# project_id :integer -# attachment :string(255) -# line_code :string(255) -# commit_id :string(255) -# noteable_id :integer -# system :boolean default(FALSE), not null -# st_diff :text -# - -require 'spec_helper' - -describe Note do - describe "Associations" do - it { is_expected.to belong_to(:project) } - it { is_expected.to belong_to(:noteable) } - it { is_expected.to belong_to(:author).class_name('User') } - end - - describe "Mass assignment" do - end - - describe "Validation" do - it { is_expected.to validate_presence_of(:note) } - it { is_expected.to validate_presence_of(:project) } - end - - describe "Voting score" do - let(:project) { create(:project) } - - it "recognizes a neutral note" do - note = create(:votable_note, note: "This is not a +1 note") - expect(note).not_to be_upvote - expect(note).not_to be_downvote - end - - it "recognizes a neutral emoji note" do - note = build(:votable_note, note: "I would :+1: this, but I don't want to") - expect(note).not_to be_upvote - expect(note).not_to be_downvote - end - - it "recognizes a +1 note" do - note = create(:votable_note, note: "+1 for this") - expect(note).to be_upvote - end - - it "recognizes a +1 emoji as a vote" do - note = build(:votable_note, note: ":+1: for this") - expect(note).to be_upvote - end - - it "recognizes a thumbsup emoji as a vote" do - note = build(:votable_note, note: ":thumbsup: for this") - expect(note).to be_upvote - end - - it "recognizes a -1 note" do - note = create(:votable_note, note: "-1 for this") - expect(note).to be_downvote - end - - it "recognizes a -1 emoji as a vote" do - note = build(:votable_note, note: ":-1: for this") - expect(note).to be_downvote - end - - it "recognizes a thumbsdown emoji as a vote" do - note = build(:votable_note, note: ":thumbsdown: for this") - expect(note).to be_downvote - end - end - - let(:project) { create(:project) } - - describe "Commit notes" do - let!(:note) { create(:note_on_commit, note: "+1 from me") } - let!(:commit) { note.noteable } - - it "should be accessible through #noteable" do - expect(note.commit_id).to eq(commit.id) - expect(note.noteable).to be_a(Commit) - expect(note.noteable).to eq(commit) - end - - it "should save a valid note" do - expect(note.commit_id).to eq(commit.id) - note.noteable == commit - end - - it "should be recognized by #for_commit?" do - expect(note).to be_for_commit - end - - it "should not be votable" do - expect(note).not_to be_votable - end - end - - describe "Commit diff line notes" do - let!(:note) { create(:note_on_commit_diff, note: "+1 from me") } - let!(:commit) { note.noteable } - - it "should save a valid note" do - expect(note.commit_id).to eq(commit.id) - expect(note.noteable.id).to eq(commit.id) - end - - it "should be recognized by #for_diff_line?" do - expect(note).to be_for_diff_line - end - - it "should be recognized by #for_commit_diff_line?" do - expect(note).to be_for_commit_diff_line - end - - it "should not be votable" do - expect(note).not_to be_votable - end - end - - describe "Issue notes" do - let!(:note) { create(:note_on_issue, note: "+1 from me") } - - it "should not be votable" do - expect(note).to be_votable - end - end - - describe "Merge request notes" do - let!(:note) { create(:note_on_merge_request, note: "+1 from me") } - - it "should be votable" do - expect(note).to be_votable - end - end - - describe "Merge request diff line notes" do - let!(:note) { create(:note_on_merge_request_diff, note: "+1 from me") } - - it "should not be votable" do - expect(note).not_to be_votable - end - end - - describe '#create_status_change_note' do - let(:project) { create(:project) } - let(:thing) { create(:issue, project: project) } - let(:author) { create(:user) } - let(:status) { 'new_status' } - - subject { Note.create_status_change_note(thing, project, author, status, nil) } - - it 'creates and saves a Note' do - is_expected.to be_a Note - expect(subject.id).not_to be_nil - end - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(thing) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(thing.project) } - end - - describe '#author' do - subject { super().author } - it { is_expected.to eq(author) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("Status changed to #{status}") } - end - - it 'appends a back-reference if a closing mentionable is supplied' do - commit = double('commit', gfm_reference: 'commit 123456') - n = Note.create_status_change_note(thing, project, author, status, commit) - - expect(n.note).to eq("Status changed to #{status} by commit 123456") - end - end - - describe '#create_assignee_change_note' do - let(:project) { create(:project) } - let(:thing) { create(:issue, project: project) } - let(:author) { create(:user) } - let(:assignee) { create(:user, username: "assigned_user") } - - subject { Note.create_assignee_change_note(thing, project, author, assignee) } - - context 'creates and saves a Note' do - it { is_expected.to be_a Note } - - describe '#id' do - subject { super().id } - it { is_expected.not_to be_nil } - end - end - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(thing) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(thing.project) } - end - - describe '#author' do - subject { super().author } - it { is_expected.to eq(author) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq('Reassigned to @assigned_user') } - end - - context 'assignee is removed' do - let(:assignee) { nil } - - describe '#note' do - subject { super().note } - it { is_expected.to eq('Assignee removed') } - end - end - end - - describe '#create_labels_change_note' do - let(:project) { create(:project) } - let(:thing) { create(:issue, project: project) } - let(:author) { create(:user) } - let(:label1) { create(:label) } - let(:label2) { create(:label) } - let(:added_labels) { [label1, label2] } - let(:removed_labels) { [] } - - subject { Note.create_labels_change_note(thing, project, author, added_labels, removed_labels) } - - context 'creates and saves a Note' do - it { is_expected.to be_a Note } - - describe '#id' do - subject { super().id } - it { is_expected.not_to be_nil } - end - end - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(thing) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(thing.project) } - end - - describe '#author' do - subject { super().author } - it { is_expected.to eq(author) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("Added ~#{label1.id} ~#{label2.id} labels") } - end - - context 'label is removed' do - let(:added_labels) { [label1] } - let(:removed_labels) { [label2] } - - describe '#note' do - subject { super().note } - it { is_expected.to eq("Added ~#{label1.id} and removed ~#{label2.id} labels") } - end - end - end - - describe '#create_milestone_change_note' do - let(:project) { create(:project) } - let(:thing) { create(:issue, project: project) } - let(:milestone) { create(:milestone, project: project, title: "first_milestone") } - let(:author) { create(:user) } - - subject { Note.create_milestone_change_note(thing, project, author, milestone) } - - context 'creates and saves a Note' do - it { is_expected.to be_a Note } - - describe '#id' do - subject { super().id } - it { is_expected.not_to be_nil } - end - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(thing.project) } - end - - describe '#author' do - subject { super().author } - it { is_expected.to eq(author) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("Milestone changed to first_milestone") } - end - end - - describe '#create_cross_reference_note' do - let(:project) { create(:project) } - let(:author) { create(:user) } - let(:issue) { create(:issue, project: project) } - let(:mergereq) { create(:merge_request, :simple, target_project: project, source_project: project) } - let(:commit) { project.repository.commit } - - # Test all of {issue, merge request, commit} in both the referenced and referencing - # roles, to ensure that the correct information can be inferred from any argument. - - context 'issue from a merge request' do - subject { Note.create_cross_reference_note(issue, mergereq, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(issue) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(issue.project) } - end - - describe '#author' do - subject { super().author } - it { is_expected.to eq(author) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") } - end - end - - context 'issue from a commit' do - subject { Note.create_cross_reference_note(issue, commit, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(issue) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in commit #{commit.sha}") } - end - end - - context 'merge request from an issue' do - subject { Note.create_cross_reference_note(mergereq, issue, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(mergereq) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(mergereq.project) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in issue ##{issue.iid}") } - end - end - - context 'commit from a merge request' do - subject { Note.create_cross_reference_note(commit, mergereq, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable' do - subject { super().noteable } - it { is_expected.to eq(commit) } - end - - describe '#project' do - subject { super().project } - it { is_expected.to eq(project) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in merge request !#{mergereq.iid}") } - end - end - - context 'commit contained in a merge request' do - subject { Note.create_cross_reference_note(mergereq.commits.first, mergereq, author, project) } - - it { is_expected.to be_nil } - end - - context 'commit from issue' do - subject { Note.create_cross_reference_note(commit, issue, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable_type' do - subject { super().noteable_type } - it { is_expected.to eq("Commit") } - end - - describe '#noteable_id' do - subject { super().noteable_id } - it { is_expected.to be_nil } - end - - describe '#commit_id' do - subject { super().commit_id } - it { is_expected.to eq(commit.id) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in issue ##{issue.iid}") } - end - end - - context 'commit from commit' do - let(:parent_commit) { commit.parents.first } - subject { Note.create_cross_reference_note(commit, parent_commit, author, project) } - - it { is_expected.to be_valid } - - describe '#noteable_type' do - subject { super().noteable_type } - it { is_expected.to eq("Commit") } - end - - describe '#noteable_id' do - subject { super().noteable_id } - it { is_expected.to be_nil } - end - - describe '#commit_id' do - subject { super().commit_id } - it { is_expected.to eq(commit.id) } - end - - describe '#note' do - subject { super().note } - it { is_expected.to eq("mentioned in commit #{parent_commit.id}") } - end - end - end - - describe '#cross_reference_exists?' do - let(:project) { create :project } - let(:author) { create :user } - let(:issue) { create :issue } - let(:commit0) { project.repository.commit } - let(:commit1) { project.repository.commit('HEAD~2') } - - before do - Note.create_cross_reference_note(issue, commit0, author, project) - end - - it 'detects if a mentionable has already been mentioned' do - expect(Note.cross_reference_exists?(issue, commit0)).to be_truthy - end - - it 'detects if a mentionable has not already been mentioned' do - expect(Note.cross_reference_exists?(issue, commit1)).to be_falsey - end - - context 'commit on commit' do - before do - Note.create_cross_reference_note(commit0, commit1, author, project) - end - - it { expect(Note.cross_reference_exists?(commit0, commit1)).to be_truthy } - it { expect(Note.cross_reference_exists?(commit1, commit0)).to be_falsey } - end - - context 'legacy note with Markdown emphasis' do - let(:issue2) { create :issue, project: project } - let!(:note) do - create :note, system: true, noteable_id: issue2.id, - noteable_type: "Issue", note: "_mentioned in issue " \ - "#{issue.project.path_with_namespace}##{issue.iid}_" - end - - it 'detects if a mentionable with emphasis has been mentioned' do - expect(Note.cross_reference_exists?(issue2, issue)).to be_truthy - end - end - end - - describe '#cross_references_with_underscores?' do - let(:project) { create :project, path: "first_project" } - let(:second_project) { create :project, path: "second_project" } - - let(:author) { create :user } - let(:issue0) { create :issue, project: project } - let(:issue1) { create :issue, project: second_project } - let!(:note) { Note.create_cross_reference_note(issue0, issue1, author, project) } - - it 'detects if a mentionable has already been mentioned' do - expect(Note.cross_reference_exists?(issue0, issue1)).to be_truthy - end - - it 'detects if a mentionable has not already been mentioned' do - expect(Note.cross_reference_exists?(issue1, issue0)).to be_falsey - end - - it 'detects that text has underscores' do - expect(note.note).to eq("mentioned in issue #{second_project.path_with_namespace}##{issue1.iid}") - end - end - - describe '#system?' do - let(:project) { create(:project) } - let(:issue) { create(:issue, project: project) } - let(:other) { create(:issue, project: project) } - let(:author) { create(:user) } - let(:assignee) { create(:user) } - let(:label) { create(:label) } - let(:milestone) { create(:milestone) } - - it 'should recognize user-supplied notes as non-system' do - @note = create(:note_on_issue) - expect(@note).not_to be_system - end - - it 'should identify status-change notes as system notes' do - @note = Note.create_status_change_note(issue, project, author, 'closed', nil) - expect(@note).to be_system - end - - it 'should identify cross-reference notes as system notes' do - @note = Note.create_cross_reference_note(issue, other, author, project) - expect(@note).to be_system - end - - it 'should identify assignee-change notes as system notes' do - @note = Note.create_assignee_change_note(issue, project, author, assignee) - expect(@note).to be_system - end - - it 'should identify label-change notes as system notes' do - @note = Note.create_labels_change_note(issue, project, author, [label], []) - expect(@note).to be_system - end - - it 'should identify milestone-change notes as system notes' do - @note = Note.create_milestone_change_note(issue, project, author, milestone) - expect(@note).to be_system - end - end - - describe :authorization do - before do - @p1 = create(:project) - @p2 = create(:project) - @u1 = create(:user) - @u2 = create(:user) - @u3 = create(:user) - @abilities = Six.new - @abilities << Ability - end - - describe :read do - before do - @p1.project_members.create(user: @u2, access_level: ProjectMember::GUEST) - @p2.project_members.create(user: @u3, access_level: ProjectMember::GUEST) - end - - it { expect(@abilities.allowed?(@u1, :read_note, @p1)).to be_falsey } - it { expect(@abilities.allowed?(@u2, :read_note, @p1)).to be_truthy } - it { expect(@abilities.allowed?(@u3, :read_note, @p1)).to be_falsey } - end - - describe :write do - before do - @p1.project_members.create(user: @u2, access_level: ProjectMember::DEVELOPER) - @p2.project_members.create(user: @u3, access_level: ProjectMember::DEVELOPER) - end - - it { expect(@abilities.allowed?(@u1, :write_note, @p1)).to be_falsey } - it { expect(@abilities.allowed?(@u2, :write_note, @p1)).to be_truthy } - it { expect(@abilities.allowed?(@u3, :write_note, @p1)).to be_falsey } - end - - describe :admin do - before do - @p1.project_members.create(user: @u1, access_level: ProjectMember::REPORTER) - @p1.project_members.create(user: @u2, access_level: ProjectMember::MASTER) - @p2.project_members.create(user: @u3, access_level: ProjectMember::MASTER) - end - - it { expect(@abilities.allowed?(@u1, :admin_note, @p1)).to be_falsey } - it { expect(@abilities.allowed?(@u2, :admin_note, @p1)).to be_truthy } - it { expect(@abilities.allowed?(@u3, :admin_note, @p1)).to be_falsey } - end - end - - it_behaves_like 'an editable mentionable' do - let(:issue) { create :issue, project: project } - let(:subject) { create :note, noteable: issue, project: project } - let(:backref_text) { issue.gfm_reference } - let(:set_mentionable_text) { ->(txt) { subject.note = txt } } - end -end diff --git a/spec/models/project_security_spec.rb b/spec/models/project_security_spec.rb deleted file mode 100644 index 1ee19003543..00000000000 --- a/spec/models/project_security_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -require 'spec_helper' - -describe Project do - describe :authorization do - before do - @p1 = create(:project) - - @u1 = create(:user) - @u2 = create(:user) - @u3 = create(:user) - @u4 = @p1.owner - - @abilities = Six.new - @abilities << Ability - end - - let(:guest_actions) { Ability.project_guest_rules } - let(:report_actions) { Ability.project_report_rules } - let(:dev_actions) { Ability.project_dev_rules } - let(:master_actions) { Ability.project_master_rules } - let(:admin_actions) { Ability.project_admin_rules } - - describe "Non member rules" do - it "should deny for non-project users any actions" do - admin_actions.each do |action| - expect(@abilities.allowed?(@u1, action, @p1)).to be_falsey - end - end - end - - describe "Guest Rules" do - before do - @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::GUEST) - end - - it "should allow for project user any guest actions" do - guest_actions.each do |action| - expect(@abilities.allowed?(@u2, action, @p1)).to be_truthy - end - end - end - - describe "Report Rules" do - before do - @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::REPORTER) - end - - it "should allow for project user any report actions" do - report_actions.each do |action| - expect(@abilities.allowed?(@u2, action, @p1)).to be_truthy - end - end - end - - describe "Developer Rules" do - before do - @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::REPORTER) - @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::DEVELOPER) - end - - it "should deny for developer master-specific actions" do - [dev_actions - report_actions].each do |action| - expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey - end - end - - it "should allow for project user any dev actions" do - dev_actions.each do |action| - expect(@abilities.allowed?(@u3, action, @p1)).to be_truthy - end - end - end - - describe "Master Rules" do - before do - @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::DEVELOPER) - @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::MASTER) - end - - it "should deny for developer master-specific actions" do - [master_actions - dev_actions].each do |action| - expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey - end - end - - it "should allow for project user any master actions" do - master_actions.each do |action| - expect(@abilities.allowed?(@u3, action, @p1)).to be_truthy - end - end - end - - describe "Admin Rules" do - before do - @p1.project_members.create(project: @p1, user: @u2, access_level: ProjectMember::DEVELOPER) - @p1.project_members.create(project: @p1, user: @u3, access_level: ProjectMember::MASTER) - end - - it "should deny for masters admin-specific actions" do - [admin_actions - master_actions].each do |action| - expect(@abilities.allowed?(@u2, action, @p1)).to be_falsey - end - end - - it "should allow for project owner any admin actions" do - admin_actions.each do |action| - expect(@abilities.allowed?(@u4, action, @p1)).to be_truthy - end - end - end - end -end -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime -# updated_at :datetime -# private_flag :boolean default(TRUE), not null -# code :string(255) -# - diff --git a/spec/models/project_services/asana_service_spec.rb b/spec/models/project_services/asana_service_spec.rb deleted file mode 100644 index 13c8d54a2af..00000000000 --- a/spec/models/project_services/asana_service_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe AsanaService, models: true do - describe 'Associations' do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe 'Validations' do - context 'active' do - before do - subject.active = true - end - - it { is_expected.to validate_presence_of :api_key } - end - end - - describe 'Execute' do - let(:user) { create(:user) } - let(:project) { create(:project) } - - before do - @asana = AsanaService.new - @asana.stub( - project: project, - project_id: project.id, - service_hook: true, - api_key: 'verySecret', - restrict_to_branch: 'master' - ) - end - - it 'should call Asana service to created a story' do - expect(Asana::Task).to receive(:find).with('123456').once - - @asana.check_commit('related to #123456', 'pushed') - end - - it 'should call Asana service to created a story and close a task' do - expect(Asana::Task).to receive(:find).with('456789').twice - - @asana.check_commit('fix #456789', 'pushed') - end - end -end diff --git a/spec/models/project_services/assembla_service_spec.rb b/spec/models/project_services/assembla_service_spec.rb deleted file mode 100644 index 91730da1eec..00000000000 --- a/spec/models/project_services/assembla_service_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe AssemblaService, models: true do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Execute" do - let(:user) { create(:user) } - let(:project) { create(:project) } - - before do - @assembla_service = AssemblaService.new - @assembla_service.stub( - project_id: project.id, - project: project, - service_hook: true, - token: 'verySecret', - subdomain: 'project_name' - ) - @sample_data = Gitlab::PushDataBuilder.build_sample(project, user) - @api_url = 'https://atlas.assembla.com/spaces/project_name/github_tool?secret_key=verySecret' - WebMock.stub_request(:post, @api_url) - end - - it "should call Assembla API" do - @assembla_service.execute(@sample_data) - expect(WebMock).to have_requested(:post, @api_url).with( - body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/ - ).once - end - end -end diff --git a/spec/models/project_services/buildkite_service_spec.rb b/spec/models/project_services/buildkite_service_spec.rb deleted file mode 100644 index e987241f3ca..00000000000 --- a/spec/models/project_services/buildkite_service_spec.rb +++ /dev/null @@ -1,82 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe BuildkiteService do - describe 'Associations' do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe 'commits methods' do - before do - @project = Project.new - @project.stub( - default_branch: 'default-brancho' - ) - - @service = BuildkiteService.new - @service.stub( - project: @project, - service_hook: true, - project_url: 'https://buildkite.com/account-name/example-project', - token: 'secret-sauce-webhook-token:secret-sauce-status-token' - ) - end - - describe :webhook_url do - it 'returns the webhook url' do - expect(@service.webhook_url).to eq( - 'https://webhook.buildkite.com/deliver/secret-sauce-webhook-token' - ) - end - end - - describe :commit_status_path do - it 'returns the correct status page' do - expect(@service.commit_status_path('2ab7834c')).to eq( - 'https://gitlab.buildkite.com/status/secret-sauce-status-token.json?commit=2ab7834c' - ) - end - end - - describe :build_page do - it 'returns the correct build page' do - expect(@service.build_page('2ab7834c', nil)).to eq( - 'https://buildkite.com/account-name/example-project/builds?commit=2ab7834c' - ) - end - end - - describe :builds_page do - it 'returns the correct path to the builds page' do - expect(@service.builds_path).to eq( - 'https://buildkite.com/account-name/example-project/builds?branch=default-brancho' - ) - end - end - - describe :status_img_path do - it 'returns the correct path to the status image' do - expect(@service.status_img_path).to eq('https://badge.buildkite.com/secret-sauce-status-token.svg') - end - end - end -end diff --git a/spec/models/project_services/flowdock_service_spec.rb b/spec/models/project_services/flowdock_service_spec.rb deleted file mode 100644 index 73f68301a34..00000000000 --- a/spec/models/project_services/flowdock_service_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe FlowdockService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Execute" do - let(:user) { create(:user) } - let(:project) { create(:project) } - - before do - @flowdock_service = FlowdockService.new - @flowdock_service.stub( - project_id: project.id, - project: project, - service_hook: true, - token: 'verySecret' - ) - @sample_data = Gitlab::PushDataBuilder.build_sample(project, user) - @api_url = 'https://api.flowdock.com/v1/git/verySecret' - WebMock.stub_request(:post, @api_url) - end - - it "should call FlowDock API" do - @flowdock_service.execute(@sample_data) - expect(WebMock).to have_requested(:post, @api_url).with( - body: /#{@sample_data[:before]}.*#{@sample_data[:after]}.*#{project.path}/ - ).once - end - end -end diff --git a/spec/models/project_services/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb deleted file mode 100644 index d44064bbe6a..00000000000 --- a/spec/models/project_services/gemnasium_service_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe GemnasiumService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Execute" do - let(:user) { create(:user) } - let(:project) { create(:project) } - - before do - @gemnasium_service = GemnasiumService.new - @gemnasium_service.stub( - project_id: project.id, - project: project, - service_hook: true, - token: 'verySecret', - api_key: 'GemnasiumUserApiKey' - ) - @sample_data = Gitlab::PushDataBuilder.build_sample(project, user) - end - it "should call Gemnasium service" do - expect(Gemnasium::GitlabService).to receive(:execute).with(an_instance_of(Hash)).once - @gemnasium_service.execute(@sample_data) - end - end -end diff --git a/spec/models/project_services/gitlab_ci_service_spec.rb b/spec/models/project_services/gitlab_ci_service_spec.rb deleted file mode 100644 index 6a557d839ca..00000000000 --- a/spec/models/project_services/gitlab_ci_service_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe GitlabCiService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Mass assignment" do - end - - describe 'commits methods' do - before do - @service = GitlabCiService.new - @service.stub( - service_hook: true, - project_url: 'http://ci.gitlab.org/projects/2', - token: 'verySecret' - ) - end - - describe :commit_status_path do - it { expect(@service.commit_status_path("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c/status.json?token=verySecret")} - end - - describe :build_page do - it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://ci.gitlab.org/projects/2/refs/master/commits/2ab7834c")} - end - end - - describe "Fork registration" do - before do - @old_project = create(:empty_project) - @project = create(:empty_project) - @user = create(:user) - - @service = GitlabCiService.new - @service.stub( - service_hook: true, - project_url: 'http://ci.gitlab.org/projects/2', - token: 'verySecret', - project: @old_project - ) - end - - it "performs http reuquest to ci" do - stub_request(:post, "http://ci.gitlab.org/api/v1/forks") - @service.fork_registration(@project, @user.private_token) - end - end -end diff --git a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb b/spec/models/project_services/gitlab_issue_tracker_service_spec.rb deleted file mode 100644 index f94bef5c365..00000000000 --- a/spec/models/project_services/gitlab_issue_tracker_service_spec.rb +++ /dev/null @@ -1,66 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe GitlabIssueTrackerService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - - describe 'project and issue urls' do - let(:project) { create(:project) } - - context 'with absolute urls' do - before do - GitlabIssueTrackerService.default_url_options[:script_name] = "/gitlab/root" - @service = project.create_gitlab_issue_tracker_service(active: true) - end - - after do - @service.destroy! - end - - it 'should give the correct path' do - expect(@service.project_url).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues") - expect(@service.new_issue_url).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues/new") - expect(@service.issue_url(432)).to eq("http://localhost/gitlab/root/#{project.path_with_namespace}/issues/432") - end - end - - context 'with relative urls' do - before do - GitlabIssueTrackerService.default_url_options[:script_name] = "/gitlab/root" - @service = project.create_gitlab_issue_tracker_service(active: true) - end - - after do - @service.destroy! - end - - it 'should give the correct path' do - expect(@service.project_path).to eq("/gitlab/root/#{project.path_with_namespace}/issues") - expect(@service.new_issue_path).to eq("/gitlab/root/#{project.path_with_namespace}/issues/new") - expect(@service.issue_path(432)).to eq("/gitlab/root/#{project.path_with_namespace}/issues/432") - end - end - end -end diff --git a/spec/models/project_services/hipchat_service_spec.rb b/spec/models/project_services/hipchat_service_spec.rb deleted file mode 100644 index 8ab847e6432..00000000000 --- a/spec/models/project_services/hipchat_service_spec.rb +++ /dev/null @@ -1,217 +0,0 @@ -# == 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 -# push_events :boolean default(TRUE) -# issues_events :boolean default(TRUE) -# merge_requests_events :boolean default(TRUE) -# tag_push_events :boolean default(TRUE) -# - -require 'spec_helper' - -describe HipchatService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Execute" do - let(:hipchat) { HipchatService.new } - let(:user) { create(:user, username: 'username') } - let(:project) { create(:project, name: 'project') } - let(:api_url) { 'https://hipchat.example.com/v2/room/123456/notification?auth_token=verySecret' } - let(:project_name) { project.name_with_namespace.gsub(/\s/, '') } - - before(:each) do - hipchat.stub( - project_id: project.id, - project: project, - room: 123456, - server: 'https://hipchat.example.com', - token: 'verySecret' - ) - WebMock.stub_request(:post, api_url) - end - - context 'push events' do - let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) } - - it "should call Hipchat API for push events" do - hipchat.execute(push_sample_data) - - expect(WebMock).to have_requested(:post, api_url).once - end - - it "should create a push message" do - message = hipchat.send(:create_push_message, push_sample_data) - - obj_attr = push_sample_data[:object_attributes] - branch = push_sample_data[:ref].gsub('refs/heads/', '') - expect(message).to include("#{user.name} pushed to branch " \ - "#{branch} of " \ - "#{project_name}") - end - end - - context 'tag_push events' do - let(:push_sample_data) { Gitlab::PushDataBuilder.build(project, user, Gitlab::Git::BLANK_SHA, '1' * 40, 'refs/tags/test', []) } - - it "should call Hipchat API for tag push events" do - hipchat.execute(push_sample_data) - - expect(WebMock).to have_requested(:post, api_url).once - end - - it "should create a tag push message" do - message = hipchat.send(:create_push_message, push_sample_data) - - obj_attr = push_sample_data[:object_attributes] - expect(message).to eq("#{user.name} pushed new tag " \ - "test to " \ - "#{project_name}\n") - end - end - - context 'issue events' do - let(:issue) { create(:issue, title: 'Awesome issue', description: 'please fix') } - let(:issue_service) { Issues::CreateService.new(project, user) } - let(:issues_sample_data) { issue_service.hook_data(issue, 'open') } - - it "should call Hipchat API for issue events" do - hipchat.execute(issues_sample_data) - - expect(WebMock).to have_requested(:post, api_url).once - end - - it "should create an issue message" do - message = hipchat.send(:create_issue_message, issues_sample_data) - - obj_attr = issues_sample_data[:object_attributes] - expect(message).to eq("#{user.name} opened " \ - "issue ##{obj_attr["iid"]} in " \ - "#{project_name}: " \ - "Awesome issue" \ - "
      please fix
      ") - end - end - - context 'merge request events' do - let(:merge_request) { create(:merge_request, description: 'please fix', title: 'Awesome merge request', target_project: project, source_project: project) } - let(:merge_service) { MergeRequests::CreateService.new(project, user) } - let(:merge_sample_data) { merge_service.hook_data(merge_request, 'open') } - - it "should call Hipchat API for merge requests events" do - hipchat.execute(merge_sample_data) - - expect(WebMock).to have_requested(:post, api_url).once - end - - it "should create a merge request message" do - message = hipchat.send(:create_merge_request_message, - merge_sample_data) - - obj_attr = merge_sample_data[:object_attributes] - expect(message).to eq("#{user.name} opened " \ - "merge request ##{obj_attr["iid"]} in " \ - "#{project_name}: " \ - "Awesome merge request" \ - "
      please fix
      ") - end - end - - context "Note events" do - let(:user) { create(:user) } - let(:project) { create(:project, creator_id: user.id) } - let(:issue) { create(:issue, project: project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:snippet) { create(:project_snippet, project: project) } - let(:commit_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') } - let(:merge_request_note) { create(:note_on_merge_request, noteable_id: merge_request.id, note: "merge request note") } - let(:issue_note) { create(:note_on_issue, noteable_id: issue.id, note: "issue note")} - let(:snippet_note) { create(:note_on_project_snippet, noteable_id: snippet.id, note: "snippet note") } - - it "should call Hipchat API for commit comment events" do - data = Gitlab::NoteDataBuilder.build(commit_note, user) - hipchat.execute(data) - - expect(WebMock).to have_requested(:post, api_url).once - - message = hipchat.send(:create_message, data) - - obj_attr = data[:object_attributes] - commit_id = Commit.truncate_sha(data[:commit][:id]) - title = hipchat.send(:format_title, data[:commit][:message]) - - expect(message).to eq("#{user.name} commented on " \ - "commit #{commit_id} in " \ - "#{project_name}: " \ - "#{title}" \ - "
      a comment on a commit
      ") - end - - it "should call Hipchat API for merge request comment events" do - data = Gitlab::NoteDataBuilder.build(merge_request_note, user) - hipchat.execute(data) - - expect(WebMock).to have_requested(:post, api_url).once - - message = hipchat.send(:create_message, data) - - obj_attr = data[:object_attributes] - merge_id = data[:merge_request]['iid'] - title = data[:merge_request]['title'] - - expect(message).to eq("#{user.name} commented on " \ - "merge request ##{merge_id} in " \ - "#{project_name}: " \ - "#{title}" \ - "
      merge request note
      ") - end - - it "should call Hipchat API for issue comment events" do - data = Gitlab::NoteDataBuilder.build(issue_note, user) - hipchat.execute(data) - - message = hipchat.send(:create_message, data) - - obj_attr = data[:object_attributes] - issue_id = data[:issue]['iid'] - title = data[:issue]['title'] - - expect(message).to eq("#{user.name} commented on " \ - "issue ##{issue_id} in " \ - "#{project_name}: " \ - "#{title}" \ - "
      issue note
      ") - end - - it "should call Hipchat API for snippet comment events" do - data = Gitlab::NoteDataBuilder.build(snippet_note, user) - hipchat.execute(data) - - expect(WebMock).to have_requested(:post, api_url).once - - message = hipchat.send(:create_message, data) - - obj_attr = data[:object_attributes] - snippet_id = data[:snippet]['id'] - title = data[:snippet]['title'] - - expect(message).to eq("#{user.name} commented on " \ - "snippet ##{snippet_id} in " \ - "#{project_name}: " \ - "#{title}" \ - "
      snippet note
      ") - end - end - end -end diff --git a/spec/models/project_services/irker_service_spec.rb b/spec/models/project_services/irker_service_spec.rb deleted file mode 100644 index d55399bc360..00000000000 --- a/spec/models/project_services/irker_service_spec.rb +++ /dev/null @@ -1,108 +0,0 @@ -# == 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) -# - -require 'spec_helper' -require 'socket' -require 'json' - -describe IrkerService do - describe 'Associations' do - it { should belong_to :project } - it { should have_one :service_hook } - end - - describe 'Validations' do - before do - subject.active = true - subject.properties['recipients'] = _recipients - end - - context 'active' do - let(:_recipients) { nil } - it { should validate_presence_of :recipients } - end - - context 'too many recipients' do - let(:_recipients) { 'a b c d' } - it 'should add an error if there is too many recipients' do - subject.send :check_recipients_count - subject.errors.should_not be_blank - end - end - - context '3 recipients' do - let(:_recipients) { 'a b c' } - it 'should not add an error if there is 3 recipients' do - subject.send :check_recipients_count - subject.errors.should be_blank - end - end - end - - describe 'Execute' do - let(:irker) { IrkerService.new } - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) } - - let(:recipients) { '#commits' } - let(:colorize_messages) { '1' } - - before do - irker.stub( - active: true, - project: project, - project_id: project.id, - service_hook: true, - properties: { - 'recipients' => recipients, - 'colorize_messages' => colorize_messages - } - ) - irker.settings = { - server_ip: 'localhost', - server_port: 6659, - max_channels: 3, - default_irc_uri: 'irc://chat.freenode.net/' - } - irker.valid? - @irker_server = TCPServer.new 'localhost', 6659 - end - - after do - @irker_server.close - end - - it 'should send valid JSON messages to an Irker listener' do - irker.execute(sample_data) - - conn = @irker_server.accept - conn.readlines.each do |line| - msg = JSON.load(line.chomp("\n")) - msg.keys.should match_array(['to', 'privmsg']) - if msg['to'].is_a?(String) - msg['to'].should == 'irc://chat.freenode.net/#commits' - else - msg['to'].should match_array(['irc://chat.freenode.net/#commits']) - end - end - conn.close - end - end -end diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb deleted file mode 100644 index 355911e6377..00000000000 --- a/spec/models/project_services/jira_service_spec.rb +++ /dev/null @@ -1,102 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe JiraService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Validations" do - context "active" do - before do - subject.active = true - end - - it { is_expected.to validate_presence_of :project_url } - it { is_expected.to validate_presence_of :issues_url } - it { is_expected.to validate_presence_of :new_issue_url } - end - end - - describe 'description and title' do - let(:project) { create(:project) } - - context 'when it is not set' do - before do - @service = project.create_jira_service(active: true) - end - - after do - @service.destroy! - end - - it 'should be initialized' do - expect(@service.title).to eq('JIRA') - expect(@service.description).to eq("Jira issue tracker") - end - end - - context 'when it is set' do - before do - properties = { 'title' => 'Jira One', 'description' => 'Jira One issue tracker' } - @service = project.create_jira_service(active: true, properties: properties) - end - - after do - @service.destroy! - end - - it "should be correct" do - expect(@service.title).to eq('Jira One') - expect(@service.description).to eq('Jira One issue tracker') - end - end - end - - describe 'project and issue urls' do - let(:project) { create(:project) } - - context 'when gitlab.yml was initialized' do - before do - settings = { "jira" => { - "title" => "Jira", - "project_url" => "http://jira.sample/projects/project_a", - "issues_url" => "http://jira.sample/issues/:id", - "new_issue_url" => "http://jira.sample/projects/project_a/issues/new" - } - } - allow(Gitlab.config).to receive(:issues_tracker).and_return(settings) - @service = project.create_jira_service(active: true) - end - - after do - @service.destroy! - end - - it 'should be prepopulated with the settings' do - expect(@service.properties[:project_url]).to eq('http://jira.sample/projects/project_a') - expect(@service.properties[:issues_url]).to eq("http://jira.sample/issues/:id") - expect(@service.properties[:new_issue_url]).to eq("http://jira.sample/projects/project_a/issues/new") - end - end - end -end diff --git a/spec/models/project_services/pushover_service_spec.rb b/spec/models/project_services/pushover_service_spec.rb deleted file mode 100644 index 5a18fd09bfc..00000000000 --- a/spec/models/project_services/pushover_service_spec.rb +++ /dev/null @@ -1,74 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe PushoverService do - describe 'Associations' do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe 'Validations' do - context 'active' do - before do - subject.active = true - end - - it { is_expected.to validate_presence_of :api_key } - it { is_expected.to validate_presence_of :user_key } - it { is_expected.to validate_presence_of :priority } - end - end - - describe 'Execute' do - let(:pushover) { PushoverService.new } - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) } - - let(:api_key) { 'verySecret' } - let(:user_key) { 'verySecret' } - let(:device) { 'myDevice' } - let(:priority) { 0 } - let(:sound) { 'bike' } - let(:api_url) { 'https://api.pushover.net/1/messages.json' } - - before do - pushover.stub( - project: project, - project_id: project.id, - service_hook: true, - api_key: api_key, - user_key: user_key, - device: device, - priority: priority, - sound: sound - ) - - WebMock.stub_request(:post, api_url) - end - - it 'should call Pushover API' do - pushover.execute(sample_data) - - expect(WebMock).to have_requested(:post, api_url).once - end - end -end diff --git a/spec/models/project_services/slack_service/issue_message_spec.rb b/spec/models/project_services/slack_service/issue_message_spec.rb deleted file mode 100644 index 8bca1fef44c..00000000000 --- a/spec/models/project_services/slack_service/issue_message_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' - -describe SlackService::IssueMessage do - subject { SlackService::IssueMessage.new(args) } - - let(:args) { - { - user: { - name: 'Test User', - username: 'Test User' - }, - project_name: 'project_name', - project_url: 'somewhere.com', - - object_attributes: { - title: 'Issue title', - id: 10, - iid: 100, - assignee_id: 1, - url: 'url', - action: 'open', - state: 'opened', - description: 'issue description' - } - } - } - - let(:color) { '#345' } - - context 'open' do - it 'returns a message regarding opening of issues' do - expect(subject.pretext).to eq( - 'Test User opened in : '\ - '*Issue title*') - expect(subject.attachments).to eq([ - { - text: "issue description", - color: color, - } - ]) - end - end - - context 'close' do - before do - args[:object_attributes][:action] = 'close' - args[:object_attributes][:state] = 'closed' - end - it 'returns a message regarding closing of issues' do - expect(subject.pretext). to eq( - 'Test User closed in : '\ - '*Issue title*') - expect(subject.attachments).to be_empty - end - end -end diff --git a/spec/models/project_services/slack_service/merge_message_spec.rb b/spec/models/project_services/slack_service/merge_message_spec.rb deleted file mode 100644 index aeb408aa766..00000000000 --- a/spec/models/project_services/slack_service/merge_message_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' - -describe SlackService::MergeMessage do - subject { SlackService::MergeMessage.new(args) } - - let(:args) { - { - user: { - name: 'Test User', - username: 'Test User' - }, - project_name: 'project_name', - project_url: 'somewhere.com', - - object_attributes: { - title: "Issue title\nSecond line", - id: 10, - iid: 100, - assignee_id: 1, - url: 'url', - state: 'opened', - description: 'issue description', - source_branch: 'source_branch', - target_branch: 'target_branch', - } - } - } - - let(:color) { '#345' } - - context 'open' do - it 'returns a message regarding opening of merge requests' do - expect(subject.pretext).to eq( - 'Test User opened '\ - 'in : *Issue title*') - expect(subject.attachments).to be_empty - end - end - - context 'close' do - before do - args[:object_attributes][:state] = 'closed' - end - it 'returns a message regarding closing of merge requests' do - expect(subject.pretext).to eq( - 'Test User closed '\ - 'in : *Issue title*') - expect(subject.attachments).to be_empty - end - end -end diff --git a/spec/models/project_services/slack_service/note_message_spec.rb b/spec/models/project_services/slack_service/note_message_spec.rb deleted file mode 100644 index 21fb575480b..00000000000 --- a/spec/models/project_services/slack_service/note_message_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require 'spec_helper' - -describe SlackService::NoteMessage do - let(:color) { '#345' } - - before do - @args = { - user: { - name: 'Test User', - username: 'username', - avatar_url: 'http://fakeavatar' - }, - project_name: 'project_name', - project_url: 'somewhere.com', - repository: { - name: 'project_name', - url: 'somewhere.com', - }, - object_attributes: { - id: 10, - note: 'comment on a commit', - url: 'url', - noteable_type: 'Commit' - } - } - end - - context 'commit notes' do - before do - @args[:object_attributes][:note] = 'comment on a commit' - @args[:object_attributes][:noteable_type] = 'Commit' - @args[:commit] = { - id: '5f163b2b95e6f53cbd428f5f0b103702a52b9a23', - message: "Added a commit message\ndetails\n123\n" - } - end - - it 'returns a message regarding notes on commits' do - message = SlackService::NoteMessage.new(@args) - expect(message.pretext).to eq("Test User commented on " \ - " in : " \ - "*Added a commit message*") - expected_attachments = [ - { - text: "comment on a commit", - color: color, - } - ] - expect(message.attachments).to eq(expected_attachments) - end - end - - context 'merge request notes' do - before do - @args[:object_attributes][:note] = 'comment on a merge request' - @args[:object_attributes][:noteable_type] = 'MergeRequest' - @args[:merge_request] = { - id: 1, - iid: 30, - title: "merge request title\ndetails\n" - } - end - it 'returns a message regarding notes on a merge request' do - message = SlackService::NoteMessage.new(@args) - expect(message.pretext).to eq("Test User commented on " \ - " in : " \ - "*merge request title*") - expected_attachments = [ - { - text: "comment on a merge request", - color: color, - } - ] - expect(message.attachments).to eq(expected_attachments) - end - end - - context 'issue notes' do - before do - @args[:object_attributes][:note] = 'comment on an issue' - @args[:object_attributes][:noteable_type] = 'Issue' - @args[:issue] = { - id: 1, - iid: 20, - title: "issue title\ndetails\n" - } - end - - it 'returns a message regarding notes on an issue' do - message = SlackService::NoteMessage.new(@args) - expect(message.pretext).to eq( - "Test User commented on " \ - " in : " \ - "*issue title*") - expected_attachments = [ - { - text: "comment on an issue", - color: color, - } - ] - expect(message.attachments).to eq(expected_attachments) - end - end - - context 'project snippet notes' do - before do - @args[:object_attributes][:note] = 'comment on a snippet' - @args[:object_attributes][:noteable_type] = 'Snippet' - @args[:snippet] = { - id: 5, - title: "snippet title\ndetails\n" - } - end - - it 'returns a message regarding notes on a project snippet' do - message = SlackService::NoteMessage.new(@args) - expect(message.pretext).to eq("Test User commented on " \ - " in : " \ - "*snippet title*") - expected_attachments = [ - { - text: "comment on a snippet", - color: color, - } - ] - expect(message.attachments).to eq(expected_attachments) - end - end -end diff --git a/spec/models/project_services/slack_service/push_message_spec.rb b/spec/models/project_services/slack_service/push_message_spec.rb deleted file mode 100644 index 10963481a12..00000000000 --- a/spec/models/project_services/slack_service/push_message_spec.rb +++ /dev/null @@ -1,88 +0,0 @@ -require 'spec_helper' - -describe SlackService::PushMessage do - subject { SlackService::PushMessage.new(args) } - - let(:args) { - { - after: 'after', - before: 'before', - project_name: 'project_name', - ref: 'refs/heads/master', - user_name: 'user_name', - project_url: 'url' - } - } - - let(:color) { '#345' } - - context 'push' do - before do - args[:commits] = [ - { message: 'message1', url: 'url1', id: 'abcdefghijkl', author: { name: 'author1' } }, - { message: 'message2', url: 'url2', id: '123456789012', author: { name: 'author2' } }, - ] - end - - it 'returns a message regarding pushes' do - expect(subject.pretext).to eq( - 'user_name pushed to branch of '\ - ' ()' - ) - expect(subject.attachments).to eq([ - { - text: ": message1 - author1\n"\ - ": message2 - author2", - color: color, - } - ]) - end - end - - context 'tag push' do - let(:args) { - { - after: 'after', - before: Gitlab::Git::BLANK_SHA, - project_name: 'project_name', - ref: 'refs/tags/new_tag', - user_name: 'user_name', - project_url: 'url' - } - } - - it 'returns a message regarding pushes' do - expect(subject.pretext).to eq('user_name pushed new tag ' \ - ' to ' \ - '') - expect(subject.attachments).to be_empty - end - end - - context 'new branch' do - before do - args[:before] = Gitlab::Git::BLANK_SHA - end - - it 'returns a message regarding a new branch' do - expect(subject.pretext).to eq( - 'user_name pushed new branch to '\ - '' - ) - expect(subject.attachments).to be_empty - end - end - - context 'removed branch' do - before do - args[:after] = Gitlab::Git::BLANK_SHA - end - - it 'returns a message regarding a removed branch' do - expect(subject.pretext).to eq( - 'user_name removed branch master from ' - ) - expect(subject.attachments).to be_empty - end - end -end diff --git a/spec/models/project_services/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb deleted file mode 100644 index c36506644b3..00000000000 --- a/spec/models/project_services/slack_service_spec.rb +++ /dev/null @@ -1,170 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe SlackService do - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Validations" do - context "active" do - before do - subject.active = true - end - - it { is_expected.to validate_presence_of :webhook } - end - end - - describe "Execute" do - let(:slack) { SlackService.new } - let(:user) { create(:user) } - let(:project) { create(:project) } - let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) } - let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' } - let(:username) { 'slack_username' } - let(:channel) { 'slack_channel' } - - before do - slack.stub( - project: project, - project_id: project.id, - service_hook: true, - webhook: webhook_url - ) - - WebMock.stub_request(:post, webhook_url) - - opts = { - title: 'Awesome issue', - description: 'please fix' - } - - issue_service = Issues::CreateService.new(project, user, opts) - @issue = issue_service.execute - @issues_sample_data = issue_service.hook_data(@issue, 'open') - - opts = { - title: 'Awesome merge_request', - description: 'please fix', - source_branch: 'stable', - target_branch: 'master' - } - merge_service = MergeRequests::CreateService.new(project, - user, opts) - @merge_request = merge_service.execute - @merge_sample_data = merge_service.hook_data(@merge_request, - 'open') - end - - it "should call Slack API for push events" do - slack.execute(push_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it "should call Slack API for issue events" do - slack.execute(@issues_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it "should call Slack API for merge requests events" do - slack.execute(@merge_sample_data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it 'should use the username as an option for slack when configured' do - slack.stub(username: username) - expect(Slack::Notifier).to receive(:new). - with(webhook_url, username: username). - and_return( - double(:slack_service).as_null_object - ) - slack.execute(push_sample_data) - end - - it 'should use the channel as an option when it is configured' do - slack.stub(channel: channel) - expect(Slack::Notifier).to receive(:new). - with(webhook_url, channel: channel). - and_return( - double(:slack_service).as_null_object - ) - slack.execute(push_sample_data) - end - end - - describe "Note events" do - let(:slack) { SlackService.new } - let(:user) { create(:user) } - let(:project) { create(:project, creator_id: user.id) } - let(:issue) { create(:issue, project: project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:snippet) { create(:project_snippet, project: project) } - let(:commit_note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') } - let(:merge_request_note) { create(:note_on_merge_request, noteable_id: merge_request.id, note: "merge request note") } - let(:issue_note) { create(:note_on_issue, noteable_id: issue.id, note: "issue note")} - let(:snippet_note) { create(:note_on_project_snippet, noteable_id: snippet.id, note: "snippet note") } - let(:webhook_url) { 'https://hooks.slack.com/services/SVRWFV0VVAR97N/B02R25XN3/ZBqu7xMupaEEICInN685' } - - before do - slack.stub( - project: project, - project_id: project.id, - service_hook: true, - webhook: webhook_url - ) - - WebMock.stub_request(:post, webhook_url) - end - - it "should call Slack API for commit comment events" do - data = Gitlab::NoteDataBuilder.build(commit_note, user) - slack.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it "should call Slack API for merge request comment events" do - data = Gitlab::NoteDataBuilder.build(merge_request_note, user) - slack.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it "should call Slack API for issue comment events" do - data = Gitlab::NoteDataBuilder.build(issue_note, user) - slack.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - - it "should call Slack API for snippet comment events" do - data = Gitlab::NoteDataBuilder.build(snippet_note, user) - slack.execute(data) - - expect(WebMock).to have_requested(:post, webhook_url).once - end - end -end diff --git a/spec/models/project_snippet_spec.rb b/spec/models/project_snippet_spec.rb deleted file mode 100644 index 3e8f106d27f..00000000000 --- a/spec/models/project_snippet_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -# == Schema Information -# -# Table name: snippets -# -# id :integer not null, primary key -# title :string(255) -# content :text -# author_id :integer not null -# project_id :integer -# created_at :datetime -# updated_at :datetime -# file_name :string(255) -# expires_at :datetime -# type :string(255) -# visibility_level :integer default(0), not null -# - -require 'spec_helper' - -describe ProjectSnippet do - describe "Associations" do - it { is_expected.to belong_to(:project) } - end - - describe "Mass assignment" do - end - - describe "Validation" do - it { is_expected.to validate_presence_of(:project) } - end -end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb deleted file mode 100644 index 879a63dd9f9..00000000000 --- a/spec/models/project_spec.rb +++ /dev/null @@ -1,360 +0,0 @@ -# == Schema Information -# -# Table name: projects -# -# id :integer not null, primary key -# name :string(255) -# path :string(255) -# description :text -# created_at :datetime -# updated_at :datetime -# creator_id :integer -# issues_enabled :boolean default(TRUE), not null -# wall_enabled :boolean default(TRUE), not null -# merge_requests_enabled :boolean default(TRUE), not null -# wiki_enabled :boolean default(TRUE), not null -# namespace_id :integer -# issues_tracker :string(255) default("gitlab"), not null -# issues_tracker_id :string(255) -# snippets_enabled :boolean default(TRUE), not null -# last_activity_at :datetime -# import_url :string(255) -# visibility_level :integer default(0), not null -# archived :boolean default(FALSE), not null -# import_status :string(255) -# repository_size :float default(0.0) -# star_count :integer default(0), not null -# import_type :string(255) -# import_source :string(255) -# avatar :string(255) -# - -require 'spec_helper' - -describe Project do - describe 'Associations' do - it { is_expected.to belong_to(:group) } - it { is_expected.to belong_to(:namespace) } - it { is_expected.to belong_to(:creator).class_name('User') } - it { is_expected.to have_many(:users) } - it { is_expected.to have_many(:events).dependent(:destroy) } - it { is_expected.to have_many(:merge_requests).dependent(:destroy) } - it { is_expected.to have_many(:issues).dependent(:destroy) } - it { is_expected.to have_many(:milestones).dependent(:destroy) } - it { is_expected.to have_many(:project_members).dependent(:destroy) } - it { is_expected.to have_many(:notes).dependent(:destroy) } - it { is_expected.to have_many(:snippets).class_name('ProjectSnippet').dependent(:destroy) } - it { is_expected.to have_many(:deploy_keys_projects).dependent(:destroy) } - it { is_expected.to have_many(:deploy_keys) } - it { is_expected.to have_many(:hooks).dependent(:destroy) } - it { is_expected.to have_many(:protected_branches).dependent(:destroy) } - it { is_expected.to have_one(:forked_project_link).dependent(:destroy) } - it { is_expected.to have_one(:slack_service).dependent(:destroy) } - it { is_expected.to have_one(:pushover_service).dependent(:destroy) } - it { is_expected.to have_one(:asana_service).dependent(:destroy) } - end - - describe 'Mass assignment' do - end - - describe 'Validation' do - let!(:project) { create(:project) } - - it { is_expected.to validate_presence_of(:name) } - it { is_expected.to validate_uniqueness_of(:name).scoped_to(:namespace_id) } - it { is_expected.to ensure_length_of(:name).is_within(0..255) } - - it { is_expected.to validate_presence_of(:path) } - it { is_expected.to validate_uniqueness_of(:path).scoped_to(:namespace_id) } - it { is_expected.to ensure_length_of(:path).is_within(0..255) } - it { is_expected.to ensure_length_of(:description).is_within(0..2000) } - it { is_expected.to validate_presence_of(:creator) } - it { is_expected.to ensure_length_of(:issues_tracker_id).is_within(0..255) } - it { is_expected.to validate_presence_of(:namespace) } - - it 'should not allow new projects beyond user limits' do - project2 = build(:project) - allow(project2).to receive(:creator).and_return(double(can_create_project?: false, projects_limit: 0).as_null_object) - expect(project2).not_to be_valid - expect(project2.errors[:limit_reached].first).to match(/Your project limit is 0/) - end - end - - describe 'Respond to' do - it { is_expected.to respond_to(:url_to_repo) } - it { is_expected.to respond_to(:repo_exists?) } - it { is_expected.to respond_to(:satellite) } - it { is_expected.to respond_to(:update_merge_requests) } - it { is_expected.to respond_to(:execute_hooks) } - it { is_expected.to respond_to(:name_with_namespace) } - it { is_expected.to respond_to(:owner) } - it { is_expected.to respond_to(:path_with_namespace) } - end - - it 'should return valid url to repo' do - project = Project.new(path: 'somewhere') - expect(project.url_to_repo).to eq(Gitlab.config.gitlab_shell.ssh_path_prefix + 'somewhere.git') - end - - it 'returns the full web URL for this repo' do - project = Project.new(path: 'somewhere') - expect(project.web_url).to eq("#{Gitlab.config.gitlab.url}/somewhere") - end - - it 'returns the web URL without the protocol for this repo' do - project = Project.new(path: 'somewhere') - expect(project.web_url_without_protocol).to eq("#{Gitlab.config.gitlab.url.split('://')[1]}/somewhere") - end - - describe 'last_activity methods' do - let(:project) { create(:project) } - let(:last_event) { double(created_at: Time.now) } - - describe 'last_activity' do - it 'should alias last_activity to last_event' do - project.stub(last_event: last_event) - expect(project.last_activity).to eq(last_event) - end - end - - describe 'last_activity_date' do - it 'returns the creation date of the project\'s last event if present' do - last_activity_event = create(:event, project: project) - expect(project.last_activity_at.to_i).to eq(last_event.created_at.to_i) - end - - it 'returns the project\'s last update date if it has no events' do - expect(project.last_activity_date).to eq(project.updated_at) - end - end - end - - describe :update_merge_requests do - let(:project) { create(:project) } - let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } - let(:key) { create(:key, user_id: project.owner.id) } - let(:prev_commit_id) { merge_request.commits.last.id } - let(:commit_id) { merge_request.commits.first.id } - - it 'should close merge request if last commit from source branch was pushed to target branch' do - project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.target_branch}", key.user) - merge_request.reload - expect(merge_request.merged?).to be_truthy - end - - it 'should update merge request commits with new one if pushed to source branch' do - project.update_merge_requests(prev_commit_id, commit_id, "refs/heads/#{merge_request.source_branch}", key.user) - merge_request.reload - expect(merge_request.last_commit.id).to eq(commit_id) - end - end - - describe :find_with_namespace do - context 'with namespace' do - before do - @group = create :group, name: 'gitlab' - @project = create(:project, name: 'gitlabhq', namespace: @group) - end - - it { expect(Project.find_with_namespace('gitlab/gitlabhq')).to eq(@project) } - it { expect(Project.find_with_namespace('gitlab-ci')).to be_nil } - end - end - - describe :to_param do - context 'with namespace' do - before do - @group = create :group, name: 'gitlab' - @project = create(:project, name: 'gitlabhq', namespace: @group) - end - - it { expect(@project.to_param).to eq('gitlabhq') } - end - end - - describe :repository do - let(:project) { create(:project) } - - it 'should return valid repo' do - expect(project.repository).to be_kind_of(Repository) - end - end - - describe :issue_exists? do - let(:project) { create(:project) } - let(:existed_issue) { create(:issue, project: project) } - let(:not_existed_issue) { create(:issue) } - let(:ext_project) { create(:redmine_project) } - - it 'should be true or if used internal tracker and issue exists' do - expect(project.issue_exists?(existed_issue.iid)).to be_truthy - end - - it 'should be false or if used internal tracker and issue not exists' do - expect(project.issue_exists?(not_existed_issue.iid)).to be_falsey - end - - it 'should always be true if used other tracker' do - expect(ext_project.issue_exists?(rand(100))).to be_truthy - end - end - - describe :default_issues_tracker? do - let(:project) { create(:project) } - let(:ext_project) { create(:redmine_project) } - - it "should be true if used internal tracker" do - expect(project.default_issues_tracker?).to be_truthy - end - - it "should be false if used other tracker" do - expect(ext_project.default_issues_tracker?).to be_falsey - end - end - - describe :can_have_issues_tracker_id? do - let(:project) { create(:project) } - let(:ext_project) { create(:redmine_project) } - - it 'should be true for projects with external issues tracker if issues enabled' do - expect(ext_project.can_have_issues_tracker_id?).to be_truthy - end - - it 'should be false for projects with internal issue tracker if issues enabled' do - expect(project.can_have_issues_tracker_id?).to be_falsey - end - - it 'should be always false if issues disabled' do - project.issues_enabled = false - ext_project.issues_enabled = false - - expect(project.can_have_issues_tracker_id?).to be_falsey - expect(ext_project.can_have_issues_tracker_id?).to be_falsey - end - end - - describe :open_branches do - let(:project) { create(:project) } - - before do - project.protected_branches.create(name: 'master') - end - - it { expect(project.open_branches.map(&:name)).to include('feature') } - it { expect(project.open_branches.map(&:name)).not_to include('master') } - end - - describe '#star_count' do - it 'counts stars from multiple users' do - user1 = create :user - user2 = create :user - project = create :project, :public - - expect(project.star_count).to eq(0) - - user1.toggle_star(project) - expect(project.reload.star_count).to eq(1) - - user2.toggle_star(project) - project.reload - expect(project.reload.star_count).to eq(2) - - user1.toggle_star(project) - project.reload - expect(project.reload.star_count).to eq(1) - - user2.toggle_star(project) - project.reload - expect(project.reload.star_count).to eq(0) - end - - it 'counts stars on the right project' do - user = create :user - project1 = create :project, :public - project2 = create :project, :public - - expect(project1.star_count).to eq(0) - expect(project2.star_count).to eq(0) - - user.toggle_star(project1) - project1.reload - project2.reload - expect(project1.star_count).to eq(1) - expect(project2.star_count).to eq(0) - - user.toggle_star(project1) - project1.reload - project2.reload - expect(project1.star_count).to eq(0) - expect(project2.star_count).to eq(0) - - user.toggle_star(project2) - project1.reload - project2.reload - expect(project1.star_count).to eq(0) - expect(project2.star_count).to eq(1) - - user.toggle_star(project2) - project1.reload - project2.reload - expect(project1.star_count).to eq(0) - expect(project2.star_count).to eq(0) - end - - it 'is decremented when an upvoter account is deleted' do - user = create :user - project = create :project, :public - user.toggle_star(project) - project.reload - expect(project.star_count).to eq(1) - user.destroy - project.reload - expect(project.star_count).to eq(0) - end - end - - describe :avatar_type do - let(:project) { create(:project) } - - it 'should be true if avatar is image' do - project.update_attribute(:avatar, 'uploads/avatar.png') - expect(project.avatar_type).to be_truthy - end - - it 'should be false if avatar is html page' do - project.update_attribute(:avatar, 'uploads/avatar.html') - expect(project.avatar_type).to eq(['only images allowed']) - end - end - - describe :avatar_url do - subject { project.avatar_url } - - let(:project) { create(:project) } - - context 'When avatar file is uploaded' do - before do - project.update_columns(avatar: 'uploads/avatar.png') - allow(project.avatar).to receive(:present?) { true } - end - - let(:avatar_path) do - "/uploads/project/avatar/#{project.id}/uploads/avatar.png" - end - - it { should eq "http://localhost#{avatar_path}" } - end - - context 'When avatar file in git' do - before do - allow(project).to receive(:avatar_in_git) { true } - end - - let(:avatar_path) do - "/#{project.namespace.name}/#{project.path}/avatar" - end - - it { should eq "http://localhost#{avatar_path}" } - end - end -end diff --git a/spec/models/project_team_spec.rb b/spec/models/project_team_spec.rb deleted file mode 100644 index 19201cc15a7..00000000000 --- a/spec/models/project_team_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -require "spec_helper" - -describe ProjectTeam do - let(:master) { create(:user) } - let(:reporter) { create(:user) } - let(:guest) { create(:user) } - let(:nonmember) { create(:user) } - - context 'personal project' do - let(:project) { create(:empty_project) } - - before do - project.team << [master, :master] - project.team << [reporter, :reporter] - project.team << [guest, :guest] - end - - describe 'members collection' do - it { expect(project.team.masters).to include(master) } - it { expect(project.team.masters).not_to include(guest) } - it { expect(project.team.masters).not_to include(reporter) } - it { expect(project.team.masters).not_to include(nonmember) } - end - - describe 'access methods' do - it { expect(project.team.master?(master)).to be_truthy } - it { expect(project.team.master?(guest)).to be_falsey } - it { expect(project.team.master?(reporter)).to be_falsey } - it { expect(project.team.master?(nonmember)).to be_falsey } - it { expect(project.team.member?(nonmember)).to be_falsey } - it { expect(project.team.member?(guest)).to be_truthy } - end - end - - context 'group project' do - let(:group) { create(:group) } - let(:project) { create(:empty_project, group: group) } - - before do - group.add_user(master, Gitlab::Access::MASTER) - group.add_user(reporter, Gitlab::Access::REPORTER) - group.add_user(guest, Gitlab::Access::GUEST) - - # If user is a group and a project member - GitLab uses highest permission - # So we add group guest as master and add group master as guest - # to this project to test highest access - project.team << [guest, :master] - project.team << [master, :guest] - end - - describe 'members collection' do - it { expect(project.team.reporters).to include(reporter) } - it { expect(project.team.masters).to include(master) } - it { expect(project.team.masters).to include(guest) } - it { expect(project.team.masters).not_to include(reporter) } - it { expect(project.team.masters).not_to include(nonmember) } - end - - describe 'access methods' do - it { expect(project.team.reporter?(reporter)).to be_truthy } - it { expect(project.team.master?(master)).to be_truthy } - it { expect(project.team.master?(guest)).to be_truthy } - it { expect(project.team.master?(reporter)).to be_falsey } - it { expect(project.team.master?(nonmember)).to be_falsey } - it { expect(project.team.member?(nonmember)).to be_falsey } - it { expect(project.team.member?(guest)).to be_truthy } - end - end -end - diff --git a/spec/models/project_wiki_spec.rb b/spec/models/project_wiki_spec.rb deleted file mode 100644 index 2acdb7dfddc..00000000000 --- a/spec/models/project_wiki_spec.rb +++ /dev/null @@ -1,244 +0,0 @@ -require "spec_helper" - -describe ProjectWiki do - let(:project) { create(:empty_project) } - let(:repository) { project.repository } - let(:user) { project.owner } - let(:gitlab_shell) { Gitlab::Shell.new } - let(:project_wiki) { ProjectWiki.new(project, user) } - - subject { project_wiki } - before { project_wiki.wiki } - - describe "#path_with_namespace" do - it "returns the project path with namespace with the .wiki extension" do - expect(subject.path_with_namespace).to eq(project.path_with_namespace + ".wiki") - end - end - - describe "#url_to_repo" do - it "returns the correct ssh url to the repo" do - expect(subject.url_to_repo).to eq(gitlab_shell.url_to_repo(subject.path_with_namespace)) - end - end - - describe "#ssh_url_to_repo" do - it "equals #url_to_repo" do - expect(subject.ssh_url_to_repo).to eq(subject.url_to_repo) - end - end - - describe "#http_url_to_repo" do - it "provides the full http url to the repo" do - gitlab_url = Gitlab.config.gitlab.url - repo_http_url = "#{gitlab_url}/#{subject.path_with_namespace}.git" - expect(subject.http_url_to_repo).to eq(repo_http_url) - end - end - - describe "#wiki" do - it "contains a Gollum::Wiki instance" do - expect(subject.wiki).to be_a Gollum::Wiki - end - - it "creates a new wiki repo if one does not yet exist" do - expect(project_wiki.create_page("index", "test content")).to be_truthy - end - - it "raises CouldNotCreateWikiError if it can't create the wiki repository" do - allow(project_wiki).to receive(:init_repo).and_return(false) - expect { project_wiki.send(:create_repo!) }.to raise_exception(ProjectWiki::CouldNotCreateWikiError) - end - end - - describe "#empty?" do - context "when the wiki repository is empty" do - before do - allow_any_instance_of(Gitlab::Shell).to receive(:add_repository) do - create_temp_repo("#{Rails.root}/tmp/test-git-base-path/non-existant.wiki.git") - end - allow(project).to receive(:path_with_namespace).and_return("non-existant") - end - - describe '#empty?' do - subject { super().empty? } - it { is_expected.to be_truthy } - end - end - - context "when the wiki has pages" do - before do - project_wiki.create_page("index", "This is an awesome new Gollum Wiki") - end - - describe '#empty?' do - subject { super().empty? } - it { is_expected.to be_falsey } - end - end - end - - describe "#pages" do - before do - create_page("index", "This is an awesome new Gollum Wiki") - @pages = subject.pages - end - - after do - destroy_page(@pages.first.page) - end - - it "returns an array of WikiPage instances" do - expect(@pages.first).to be_a WikiPage - end - - it "returns the correct number of pages" do - expect(@pages.count).to eq(1) - end - end - - describe "#find_page" do - before do - create_page("index page", "This is an awesome Gollum Wiki") - end - - after do - destroy_page(subject.pages.first.page) - end - - it "returns the latest version of the page if it exists" do - page = subject.find_page("index page") - expect(page.title).to eq("index page") - end - - it "returns nil if the page does not exist" do - expect(subject.find_page("non-existant")).to eq(nil) - end - - it "can find a page by slug" do - page = subject.find_page("index-page") - expect(page.title).to eq("index page") - end - - it "returns a WikiPage instance" do - page = subject.find_page("index page") - expect(page).to be_a WikiPage - end - end - - describe '#find_file' do - before do - file = Gollum::File.new(subject.wiki) - allow_any_instance_of(Gollum::Wiki). - to receive(:file).with('image.jpg', 'master', true). - and_return(file) - allow_any_instance_of(Gollum::File). - to receive(:mime_type). - and_return('image/jpeg') - allow_any_instance_of(Gollum::Wiki). - to receive(:file).with('non-existant', 'master', true). - and_return(nil) - end - - after do - allow_any_instance_of(Gollum::Wiki).to receive(:file).and_call_original - allow_any_instance_of(Gollum::File).to receive(:mime_type).and_call_original - end - - it 'returns the latest version of the file if it exists' do - file = subject.find_file('image.jpg') - expect(file.mime_type).to eq('image/jpeg') - end - - it 'returns nil if the page does not exist' do - expect(subject.find_file('non-existant')).to eq(nil) - end - - it 'returns a Gollum::File instance' do - file = subject.find_file('image.jpg') - expect(file).to be_a Gollum::File - end - end - - describe "#create_page" do - after do - destroy_page(subject.pages.first.page) - end - - it "creates a new wiki page" do - expect(subject.create_page("test page", "this is content")).not_to eq(false) - expect(subject.pages.count).to eq(1) - end - - it "returns false when a duplicate page exists" do - subject.create_page("test page", "content") - expect(subject.create_page("test page", "content")).to eq(false) - end - - it "stores an error message when a duplicate page exists" do - 2.times { subject.create_page("test page", "content") } - expect(subject.error_message).to match(/Duplicate page:/) - end - - it "sets the correct commit message" do - subject.create_page("test page", "some content", :markdown, "commit message") - expect(subject.pages.first.page.version.message).to eq("commit message") - end - end - - describe "#update_page" do - before do - create_page("update-page", "some content") - @gollum_page = subject.wiki.paged("update-page") - subject.update_page(@gollum_page, "some other content", :markdown, "updated page") - @page = subject.pages.first.page - end - - after do - destroy_page(@page) - end - - it "updates the content of the page" do - expect(@page.raw_data).to eq("some other content") - end - - it "sets the correct commit message" do - expect(@page.version.message).to eq("updated page") - end - end - - describe "#delete_page" do - before do - create_page("index", "some content") - @page = subject.wiki.paged("index") - end - - it "deletes the page" do - subject.delete_page(@page) - expect(subject.pages.count).to eq(0) - end - end - - private - - def create_temp_repo(path) - FileUtils.mkdir_p path - system(*%W(git init --quiet --bare -- #{path})) - end - - def remove_temp_repo(path) - FileUtils.rm_rf path - end - - def commit_details - commit = {name: user.name, email: user.email, message: "test commit"} - end - - def create_page(name, content) - subject.wiki.write_page(name, :markdown, content, commit_details) - end - - def destroy_page(page) - subject.wiki.delete_page(page, commit_details) - end -end diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb deleted file mode 100644 index 1e6937b536c..00000000000 --- a/spec/models/protected_branch_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# == Schema Information -# -# Table name: protected_branches -# -# id :integer not null, primary key -# project_id :integer not null -# name :string(255) not null -# created_at :datetime -# updated_at :datetime -# developers_can_push :boolean default(FALSE), not null -# - -require 'spec_helper' - -describe ProtectedBranch do - describe 'Associations' do - it { is_expected.to belong_to(:project) } - end - - describe "Mass assignment" do - end - - describe 'Validation' do - it { is_expected.to validate_presence_of(:project) } - it { is_expected.to validate_presence_of(:name) } - end -end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb deleted file mode 100644 index f41e5a97ca3..00000000000 --- a/spec/models/repository_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -require 'spec_helper' - -describe Repository do - include RepoHelpers - - let(:repository) { create(:project).repository } - - describe :branch_names_contains do - subject { repository.branch_names_contains(sample_commit.id) } - - it { is_expected.to include('master') } - it { is_expected.not_to include('feature') } - it { is_expected.not_to include('fix') } - end - - describe :tag_names_contains do - subject { repository.tag_names_contains(sample_commit.id) } - - it { is_expected.to include('v1.1.0') } - it { is_expected.not_to include('v1.0.0') } - end - - describe :last_commit_for_path do - subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id } - - it { is_expected.to eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') } - end -end diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb deleted file mode 100644 index 735652aea78..00000000000 --- a/spec/models/service_spec.rb +++ /dev/null @@ -1,92 +0,0 @@ -# == 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) -# - -require 'spec_helper' - -describe Service do - - describe "Associations" do - it { is_expected.to belong_to :project } - it { is_expected.to have_one :service_hook } - end - - describe "Mass assignment" do - end - - describe "Test Button" do - before do - @service = Service.new - end - - describe "Testable" do - let (:project) { create :project } - - before do - @service.stub( - project: project - ) - @testable = @service.can_test? - end - - describe :can_test do - it { expect(@testable).to eq(true) } - end - end - - describe "With commits" do - let (:project) { create :project } - - before do - @service.stub( - project: project - ) - @testable = @service.can_test? - end - - describe :can_test do - it { expect(@testable).to eq(true) } - end - end - end - - describe "Template" do - describe "for pushover service" do - let(:service_template) { - PushoverService.create(template: true, properties: {device: 'MyDevice', sound: 'mic', priority: 4, api_key: '123456789'}) - } - let(:project) { create(:project) } - - describe 'should be prefilled for projects pushover service' do - before do - service_template - project.build_missing_services - end - - it "should have all fields prefilled" do - service = project.pushover_service - expect(service.template).to eq(false) - expect(service.device).to eq('MyDevice') - expect(service.sound).to eq('mic') - expect(service.priority).to eq(4) - expect(service.api_key).to eq('123456789') - end - end - end - end -end diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb deleted file mode 100644 index e37dcc75230..00000000000 --- a/spec/models/snippet_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -# == Schema Information -# -# Table name: snippets -# -# id :integer not null, primary key -# title :string(255) -# content :text -# author_id :integer not null -# project_id :integer -# created_at :datetime -# updated_at :datetime -# file_name :string(255) -# expires_at :datetime -# type :string(255) -# visibility_level :integer default(0), not null -# - -require 'spec_helper' - -describe Snippet do - describe "Associations" do - it { is_expected.to belong_to(:author).class_name('User') } - it { is_expected.to have_many(:notes).dependent(:destroy) } - end - - describe "Mass assignment" do - end - - describe "Validation" do - it { is_expected.to validate_presence_of(:author) } - - it { is_expected.to validate_presence_of(:title) } - it { is_expected.to ensure_length_of(:title).is_within(0..255) } - - it { is_expected.to validate_presence_of(:file_name) } - it { is_expected.to ensure_length_of(:title).is_within(0..255) } - - it { is_expected.to validate_presence_of(:content) } - end -end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb deleted file mode 100644 index 24384e8bf22..00000000000 --- a/spec/models/user_spec.rb +++ /dev/null @@ -1,532 +0,0 @@ -# == Schema Information -# -# 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) -# - -require 'spec_helper' - -describe User do - describe "Associations" do - it { is_expected.to have_one(:namespace) } - it { is_expected.to have_many(:snippets).class_name('Snippet').dependent(:destroy) } - it { is_expected.to have_many(:project_members).dependent(:destroy) } - it { is_expected.to have_many(:groups) } - it { is_expected.to have_many(:keys).dependent(:destroy) } - it { is_expected.to have_many(:events).class_name('Event').dependent(:destroy) } - it { is_expected.to have_many(:recent_events).class_name('Event') } - it { is_expected.to have_many(:issues).dependent(:destroy) } - it { is_expected.to have_many(:notes).dependent(:destroy) } - it { is_expected.to have_many(:assigned_issues).dependent(:destroy) } - it { is_expected.to have_many(:merge_requests).dependent(:destroy) } - it { is_expected.to have_many(:assigned_merge_requests).dependent(:destroy) } - it { is_expected.to have_many(:identities).dependent(:destroy) } - end - - describe "Mass assignment" do - end - - describe 'validations' do - it { is_expected.to validate_presence_of(:username) } - it { is_expected.to validate_presence_of(:projects_limit) } - it { is_expected.to validate_numericality_of(:projects_limit) } - it { is_expected.to allow_value(0).for(:projects_limit) } - it { is_expected.not_to allow_value(-1).for(:projects_limit) } - - it { is_expected.to ensure_length_of(:bio).is_within(0..255) } - - describe 'email' do - it 'accepts info@example.com' do - user = build(:user, email: 'info@example.com') - expect(user).to be_valid - end - - it 'accepts info+test@example.com' do - user = build(:user, email: 'info+test@example.com') - expect(user).to be_valid - end - - it "accepts o'reilly@example.com" do - user = build(:user, email: "o'reilly@example.com") - expect(user).to be_valid - end - - it 'rejects test@test@example.com' do - user = build(:user, email: 'test@test@example.com') - expect(user).to be_invalid - end - - it 'rejects mailto:test@example.com' do - user = build(:user, email: 'mailto:test@example.com') - expect(user).to be_invalid - end - - it "rejects lol!'+=?><#$%^&*()@gmail.com" do - user = build(:user, email: "lol!'+=?><#$%^&*()@gmail.com") - expect(user).to be_invalid - end - end - end - - describe "Respond to" do - it { is_expected.to respond_to(:is_admin?) } - it { is_expected.to respond_to(:name) } - it { is_expected.to respond_to(:private_token) } - end - - describe '#generate_password' do - it "should execute callback when force_random_password specified" do - user = build(:user, force_random_password: true) - expect(user).to receive(:generate_password) - user.save - end - - it "should not generate password by default" do - user = create(:user, password: 'abcdefghe') - expect(user.password).to eq('abcdefghe') - end - - it "should generate password when forcing random password" do - allow(Devise).to receive(:friendly_token).and_return('123456789') - user = create(:user, password: 'abcdefg', force_random_password: true) - expect(user.password).to eq('12345678') - end - end - - describe 'authentication token' do - it "should have authentication token" do - user = create(:user) - expect(user.authentication_token).not_to be_blank - end - end - - describe 'projects' do - before do - @user = create :user - @project = create :project, namespace: @user.namespace - @project_2 = create :project, group: create(:group) # Grant MASTER access to the user - @project_3 = create :project, group: create(:group) # Grant DEVELOPER access to the user - - @project_2.team << [@user, :master] - @project_3.team << [@user, :developer] - end - - it { expect(@user.authorized_projects).to include(@project) } - it { expect(@user.authorized_projects).to include(@project_2) } - it { expect(@user.authorized_projects).to include(@project_3) } - it { expect(@user.owned_projects).to include(@project) } - it { expect(@user.owned_projects).not_to include(@project_2) } - it { expect(@user.owned_projects).not_to include(@project_3) } - it { expect(@user.personal_projects).to include(@project) } - it { expect(@user.personal_projects).not_to include(@project_2) } - it { expect(@user.personal_projects).not_to include(@project_3) } - end - - describe 'groups' do - before do - @user = create :user - @group = create :group - @group.add_owner(@user) - end - - it { expect(@user.several_namespaces?).to be_truthy } - it { expect(@user.authorized_groups).to eq([@group]) } - it { expect(@user.owned_groups).to eq([@group]) } - end - - describe 'group multiple owners' do - before do - @user = create :user - @user2 = create :user - @group = create :group - @group.add_owner(@user) - - @group.add_user(@user2, GroupMember::OWNER) - end - - it { expect(@user2.several_namespaces?).to be_truthy } - end - - describe 'namespaced' do - before do - @user = create :user - @project = create :project, namespace: @user.namespace - end - - it { expect(@user.several_namespaces?).to be_falsey } - end - - describe 'blocking user' do - let(:user) { create(:user, name: 'John Smith') } - - it "should block user" do - user.block - expect(user.blocked?).to be_truthy - end - end - - describe 'filter' do - before do - User.delete_all - @user = create :user - @admin = create :user, admin: true - @blocked = create :user, state: :blocked - end - - it { expect(User.filter("admins")).to eq([@admin]) } - it { expect(User.filter("blocked")).to eq([@blocked]) } - it { expect(User.filter("wop")).to include(@user, @admin, @blocked) } - it { expect(User.filter(nil)).to include(@user, @admin) } - end - - describe :not_in_project do - before do - User.delete_all - @user = create :user - @project = create :project - end - - it { expect(User.not_in_project(@project)).to include(@user, @project.owner) } - end - - describe 'user creation' do - describe 'normal user' do - let(:user) { create(:user, name: 'John Smith') } - - it { expect(user.is_admin?).to be_falsey } - it { expect(user.require_ssh_key?).to be_truthy } - it { expect(user.can_create_group?).to be_truthy } - it { expect(user.can_create_project?).to be_truthy } - it { expect(user.first_name).to eq('John') } - end - - describe 'with defaults' do - let(:user) { User.new } - - it "should apply defaults to user" do - expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit) - expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group) - expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme) - end - end - - describe 'with default overrides' do - let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true, theme_id: Gitlab::Theme::BASIC) } - - it "should apply defaults to user" do - expect(user.projects_limit).to eq(123) - expect(user.can_create_group).to be_falsey - expect(user.theme_id).to eq(Gitlab::Theme::BASIC) - end - end - end - - describe 'search' do - let(:user1) { create(:user, username: 'James', email: 'james@testing.com') } - let(:user2) { create(:user, username: 'jameson', email: 'jameson@example.com') } - - it "should be case insensitive" do - expect(User.search(user1.username.upcase).to_a).to eq([user1]) - expect(User.search(user1.username.downcase).to_a).to eq([user1]) - expect(User.search(user2.username.upcase).to_a).to eq([user2]) - expect(User.search(user2.username.downcase).to_a).to eq([user2]) - expect(User.search(user1.username.downcase).to_a.count).to eq(2) - expect(User.search(user2.username.downcase).to_a.count).to eq(1) - end - end - - describe 'by_username_or_id' do - let(:user1) { create(:user, username: 'foo') } - - it "should get the correct user" do - expect(User.by_username_or_id(user1.id)).to eq(user1) - expect(User.by_username_or_id('foo')).to eq(user1) - expect(User.by_username_or_id(-1)).to be_nil - expect(User.by_username_or_id('bar')).to be_nil - end - end - - describe '.by_login' do - let(:username) { 'John' } - let!(:user) { create(:user, username: username) } - - it 'should get the correct user' do - expect(User.by_login(user.email.upcase)).to eq user - expect(User.by_login(user.email)).to eq user - expect(User.by_login(username.downcase)).to eq user - expect(User.by_login(username)).to eq user - expect(User.by_login(nil)).to be_nil - expect(User.by_login('')).to be_nil - end - end - - describe 'all_ssh_keys' do - it { is_expected.to have_many(:keys).dependent(:destroy) } - - it "should have all ssh keys" do - user = create :user - key = create :key, key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD33bWLBxu48Sev9Fert1yzEO4WGcWglWF7K/AwblIUFselOt/QdOL9DSjpQGxLagO1s9wl53STIO8qGS4Ms0EJZyIXOEFMjFJ5xmjSy+S37By4sG7SsltQEHMxtbtFOaW5LV2wCrX+rUsRNqLMamZjgjcPO0/EgGCXIGMAYW4O7cwGZdXWYIhQ1Vwy+CsVMDdPkPgBXqK7nR/ey8KMs8ho5fMNgB5hBw/AL9fNGhRw3QTD6Q12Nkhl4VZES2EsZqlpNnJttnPdp847DUsT6yuLRlfiQfz5Cn9ysHFdXObMN5VYIiPFwHeYCZp1X2S4fDZooRE8uOLTfxWHPXwrhqSH", user_id: user.id - - expect(user.all_ssh_keys).to include(key.key) - end - end - - describe :avatar_type do - let(:user) { create(:user) } - - it "should be true if avatar is image" do - user.update_attribute(:avatar, 'uploads/avatar.png') - expect(user.avatar_type).to be_truthy - end - - it "should be false if avatar is html page" do - user.update_attribute(:avatar, 'uploads/avatar.html') - expect(user.avatar_type).to eq(["only images allowed"]) - end - end - - describe :requires_ldap_check? do - let(:user) { User.new } - - it 'is false when LDAP is disabled' do - # Create a condition which would otherwise cause 'true' to be returned - user.stub(ldap_user?: true) - user.last_credential_check_at = nil - expect(user.requires_ldap_check?).to be_falsey - end - - context 'when LDAP is enabled' do - before { Gitlab.config.ldap.stub(enabled: true) } - - it 'is false for non-LDAP users' do - user.stub(ldap_user?: false) - expect(user.requires_ldap_check?).to be_falsey - end - - context 'and when the user is an LDAP user' do - before { user.stub(ldap_user?: true) } - - it 'is true when the user has never had an LDAP check before' do - user.last_credential_check_at = nil - expect(user.requires_ldap_check?).to be_truthy - end - - it 'is true when the last LDAP check happened over 1 hour ago' do - user.last_credential_check_at = 2.hours.ago - expect(user.requires_ldap_check?).to be_truthy - end - end - end - end - - describe :ldap_user? do - it "is true if provider name starts with ldap" do - user = create(:omniauth_user, provider: 'ldapmain') - expect( user.ldap_user? ).to be_truthy - end - - it "is false for other providers" do - user = create(:omniauth_user, provider: 'other-provider') - expect( user.ldap_user? ).to be_falsey - end - - it "is false if no extern_uid is provided" do - user = create(:omniauth_user, extern_uid: nil) - expect( user.ldap_user? ).to be_falsey - end - end - - describe :ldap_identity do - it "returns ldap identity" do - user = create :omniauth_user - expect(user.ldap_identity.provider).not_to be_empty - end - end - - describe '#full_website_url' do - let(:user) { create(:user) } - - it 'begins with http if website url omits it' do - user.website_url = 'test.com' - - expect(user.full_website_url).to eq 'http://test.com' - end - - it 'begins with http if website url begins with http' do - user.website_url = 'http://test.com' - - expect(user.full_website_url).to eq 'http://test.com' - end - - it 'begins with https if website url begins with https' do - user.website_url = 'https://test.com' - - expect(user.full_website_url).to eq 'https://test.com' - end - end - - describe '#short_website_url' do - let(:user) { create(:user) } - - it 'does not begin with http if website url omits it' do - user.website_url = 'test.com' - - expect(user.short_website_url).to eq 'test.com' - end - - it 'does not begin with http if website url begins with http' do - user.website_url = 'http://test.com' - - expect(user.short_website_url).to eq 'test.com' - end - - it 'does not begin with https if website url begins with https' do - user.website_url = 'https://test.com' - - expect(user.short_website_url).to eq 'test.com' - end - end - - describe "#starred?" do - it "determines if user starred a project" do - user = create :user - project1 = create :project, :public - project2 = create :project, :public - - expect(user.starred?(project1)).to be_falsey - expect(user.starred?(project2)).to be_falsey - - star1 = UsersStarProject.create!(project: project1, user: user) - expect(user.starred?(project1)).to be_truthy - expect(user.starred?(project2)).to be_falsey - - star2 = UsersStarProject.create!(project: project2, user: user) - expect(user.starred?(project1)).to be_truthy - expect(user.starred?(project2)).to be_truthy - - star1.destroy - expect(user.starred?(project1)).to be_falsey - expect(user.starred?(project2)).to be_truthy - - star2.destroy - expect(user.starred?(project1)).to be_falsey - expect(user.starred?(project2)).to be_falsey - end - end - - describe "#toggle_star" do - it "toggles stars" do - user = create :user - project = create :project, :public - - expect(user.starred?(project)).to be_falsey - user.toggle_star(project) - expect(user.starred?(project)).to be_truthy - user.toggle_star(project) - expect(user.starred?(project)).to be_falsey - end - end - - describe "#sort" do - before do - User.delete_all - @user = create :user, created_at: Date.today, last_sign_in_at: Date.today, name: 'Alpha' - @user1 = create :user, created_at: Date.today - 1, last_sign_in_at: Date.today - 1, name: 'Omega' - end - - it "sorts users as recently_signed_in" do - expect(User.sort('recent_sign_in').first).to eq(@user) - end - - it "sorts users as late_signed_in" do - expect(User.sort('oldest_sign_in').first).to eq(@user1) - end - - it "sorts users as recently_created" do - expect(User.sort('created_desc').first).to eq(@user) - end - - it "sorts users as late_created" do - expect(User.sort('created_asc').first).to eq(@user1) - end - - it "sorts users by name when nil is passed" do - expect(User.sort(nil).first).to eq(@user) - end - end - - describe "#contributed_projects_ids" do - - subject { create(:user) } - let!(:project1) { create(:project) } - let!(:project2) { create(:project, forked_from_project: project3) } - let!(:project3) { create(:project) } - let!(:merge_request) { create(:merge_request, source_project: project2, target_project: project3, author: subject) } - let!(:push_event) { create(:event, action: Event::PUSHED, project: project1, target: project1, author: subject) } - let!(:merge_event) { create(:event, action: Event::CREATED, project: project3, target: merge_request, author: subject) } - - before do - project1.team << [subject, :master] - project2.team << [subject, :master] - end - - it "includes IDs for projects the user has pushed to" do - expect(subject.contributed_projects_ids).to include(project1.id) - end - - it "includes IDs for projects the user has had merge requests merged into" do - expect(subject.contributed_projects_ids).to include(project3.id) - end - - it "doesn't include IDs for unrelated projects" do - expect(subject.contributed_projects_ids).not_to include(project2.id) - end - end -end diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb deleted file mode 100644 index fceb7668cac..00000000000 --- a/spec/models/wiki_page_spec.rb +++ /dev/null @@ -1,210 +0,0 @@ -require "spec_helper" - -describe WikiPage do - let(:project) { create(:empty_project) } - let(:user) { project.owner } - let(:wiki) { ProjectWiki.new(project, user) } - - subject { WikiPage.new(wiki) } - - describe "#initialize" do - context "when initialized with an existing gollum page" do - before do - create_page("test page", "test content") - @page = wiki.wiki.paged("test page") - @wiki_page = WikiPage.new(wiki, @page, true) - end - - it "sets the slug attribute" do - expect(@wiki_page.slug).to eq("test-page") - end - - it "sets the title attribute" do - expect(@wiki_page.title).to eq("test page") - end - - it "sets the formatted content attribute" do - expect(@wiki_page.content).to eq("test content") - end - - it "sets the format attribute" do - expect(@wiki_page.format).to eq(:markdown) - end - - it "sets the message attribute" do - expect(@wiki_page.message).to eq("test commit") - end - - it "sets the version attribute" do - expect(@wiki_page.version).to be_a Gollum::Git::Commit - end - end - end - - describe "validations" do - before do - subject.attributes = {title: 'title', content: 'content'} - end - - it "validates presence of title" do - subject.attributes.delete(:title) - expect(subject.valid?).to be_falsey - end - - it "validates presence of content" do - subject.attributes.delete(:content) - expect(subject.valid?).to be_falsey - end - end - - before do - @wiki_attr = {title: "Index", content: "Home Page", format: "markdown"} - end - - describe "#create" do - after do - destroy_page("Index") - end - - context "with valid attributes" do - it "saves the wiki page" do - subject.create(@wiki_attr) - expect(wiki.find_page("Index")).not_to be_nil - end - - it "returns true" do - expect(subject.create(@wiki_attr)).to eq(true) - end - end - end - - describe "dot in the title" do - let(:title) { 'Index v1.2.3' } - - before do - @wiki_attr = {title: title, content: "Home Page", format: "markdown"} - end - - describe "#create" do - after do - destroy_page(title) - end - - context "with valid attributes" do - it "saves the wiki page" do - subject.create(@wiki_attr) - expect(wiki.find_page(title)).not_to be_nil - end - - it "returns true" do - expect(subject.create(@wiki_attr)).to eq(true) - end - end - end - - describe "#update" do - before do - create_page(title, "content") - @page = wiki.find_page(title) - end - - it "updates the content of the page" do - @page.update("new content") - @page = wiki.find_page(title) - end - - it "returns true" do - expect(@page.update("more content")).to be_truthy - end - end - end - - describe "#update" do - before do - create_page("Update", "content") - @page = wiki.find_page("Update") - end - - after do - destroy_page("Update") - end - - context "with valid attributes" do - it "updates the content of the page" do - @page.update("new content") - @page = wiki.find_page("Update") - end - - it "returns true" do - expect(@page.update("more content")).to be_truthy - end - end - end - - describe "#destroy" do - before do - create_page("Delete Page", "content") - @page = wiki.find_page("Delete Page") - end - - it "should delete the page" do - @page.delete - expect(wiki.pages).to be_empty - end - - it "should return true" do - expect(@page.delete).to eq(true) - end - end - - describe "#versions" do - before do - create_page("Update", "content") - @page = wiki.find_page("Update") - end - - after do - destroy_page("Update") - end - - it "returns an array of all commits for the page" do - 3.times { |i| @page.update("content #{i}") } - expect(@page.versions.count).to eq(4) - end - end - - describe "#title" do - before do - create_page("Title", "content") - @page = wiki.find_page("Title") - end - - after do - destroy_page("Title") - end - - it "should be replace a hyphen to a space" do - @page.title = "Import-existing-repositories-into-GitLab" - expect(@page.title).to eq("Import existing repositories into GitLab") - end - end - - private - - def remove_temp_repo(path) - FileUtils.rm_rf path - end - - def commit_details - commit = {name: user.name, email: user.email, message: "test commit"} - end - - def create_page(name, content) - wiki.wiki.write_page(name, :markdown, content, commit_details) - end - - def destroy_page(title) - page = wiki.wiki.paged(title) - wiki.wiki.delete_page(page, commit_details) - end -end diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb deleted file mode 100644 index 20cb30a39bb..00000000000 --- a/spec/requests/api/api_helpers_spec.rb +++ /dev/null @@ -1,173 +0,0 @@ -require 'spec_helper' - -describe API, api: true do - include API::APIHelpers - include ApiHelpers - let(:user) { create(:user) } - let(:admin) { create(:admin) } - let(:key) { create(:key, user: user) } - - let(:params) { {} } - let(:env) { {} } - - def set_env(token_usr, identifier) - clear_env - clear_param - env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = token_usr.private_token - env[API::APIHelpers::SUDO_HEADER] = identifier - end - - def set_param(token_usr, identifier) - clear_env - clear_param - params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = token_usr.private_token - params[API::APIHelpers::SUDO_PARAM] = identifier - end - - def clear_env - env.delete(API::APIHelpers::PRIVATE_TOKEN_HEADER) - env.delete(API::APIHelpers::SUDO_HEADER) - end - - def clear_param - params.delete(API::APIHelpers::PRIVATE_TOKEN_PARAM) - params.delete(API::APIHelpers::SUDO_PARAM) - end - - def error!(message, status) - raise Exception - end - - describe ".current_user" do - it "should return nil for an invalid token" do - env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = 'invalid token' - allow_any_instance_of(self.class).to receive(:doorkeeper_guard){ false } - expect(current_user).to be_nil - end - - it "should return nil for a user without access" do - env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token - Gitlab::UserAccess.stub(allowed?: false) - expect(current_user).to be_nil - end - - it "should leave user as is when sudo not specified" do - env[API::APIHelpers::PRIVATE_TOKEN_HEADER] = user.private_token - expect(current_user).to eq(user) - clear_env - params[API::APIHelpers::PRIVATE_TOKEN_PARAM] = user.private_token - expect(current_user).to eq(user) - end - - it "should change current user to sudo when admin" do - set_env(admin, user.id) - expect(current_user).to eq(user) - set_param(admin, user.id) - expect(current_user).to eq(user) - set_env(admin, user.username) - expect(current_user).to eq(user) - set_param(admin, user.username) - expect(current_user).to eq(user) - end - - it "should throw an error when the current user is not an admin and attempting to sudo" do - set_env(user, admin.id) - expect { current_user }.to raise_error - set_param(user, admin.id) - expect { current_user }.to raise_error - set_env(user, admin.username) - expect { current_user }.to raise_error - set_param(user, admin.username) - expect { current_user }.to raise_error - end - - it "should throw an error when the user cannot be found for a given id" do - id = user.id + admin.id - expect(user.id).not_to eq(id) - expect(admin.id).not_to eq(id) - set_env(admin, id) - expect { current_user }.to raise_error - - set_param(admin, id) - expect { current_user }.to raise_error - end - - it "should throw an error when the user cannot be found for a given username" do - username = "#{user.username}#{admin.username}" - expect(user.username).not_to eq(username) - expect(admin.username).not_to eq(username) - set_env(admin, username) - expect { current_user }.to raise_error - - set_param(admin, username) - expect { current_user }.to raise_error - end - - it "should handle sudo's to oneself" do - set_env(admin, admin.id) - expect(current_user).to eq(admin) - set_param(admin, admin.id) - expect(current_user).to eq(admin) - set_env(admin, admin.username) - expect(current_user).to eq(admin) - set_param(admin, admin.username) - expect(current_user).to eq(admin) - end - - it "should handle multiple sudo's to oneself" do - set_env(admin, user.id) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - set_env(admin, user.username) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - - set_param(admin, user.id) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - set_param(admin, user.username) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - end - - it "should handle multiple sudo's to oneself using string ids" do - set_env(admin, user.id.to_s) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - - set_param(admin, user.id.to_s) - expect(current_user).to eq(user) - expect(current_user).to eq(user) - end - end - - describe '.sudo_identifier' do - it "should return integers when input is an int" do - set_env(admin, '123') - expect(sudo_identifier).to eq(123) - set_env(admin, '0001234567890') - expect(sudo_identifier).to eq(1234567890) - - set_param(admin, '123') - expect(sudo_identifier).to eq(123) - set_param(admin, '0001234567890') - expect(sudo_identifier).to eq(1234567890) - end - - it "should return string when input is an is not an int" do - set_env(admin, '12.30') - expect(sudo_identifier).to eq("12.30") - set_env(admin, 'hello') - expect(sudo_identifier).to eq('hello') - set_env(admin, ' 123') - expect(sudo_identifier).to eq(' 123') - - set_param(admin, '12.30') - expect(sudo_identifier).to eq("12.30") - set_param(admin, 'hello') - expect(sudo_identifier).to eq('hello') - set_param(admin, ' 123') - expect(sudo_identifier).to eq(' 123') - end - end -end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb deleted file mode 100644 index f40d68b75a4..00000000000 --- a/spec/requests/api/branches_spec.rb +++ /dev/null @@ -1,170 +0,0 @@ -require 'spec_helper' -require 'mime/types' - -describe API::API, api: true do - include ApiHelpers - - let(:user) { create(:user) } - let(:user2) { create(:user) } - let!(:project) { create(:project, creator_id: user.id) } - let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } - let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) } - let!(:branch_name) { 'feature' } - let!(:branch_sha) { '0b4bc9a49b562e85de7cc9e834518ea6828729b9' } - - describe "GET /projects/:id/repository/branches" do - it "should return an array of project branches" do - get api("/projects/#{project.id}/repository/branches", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq(project.repository.branch_names.first) - end - end - - describe "GET /projects/:id/repository/branches/:branch" do - it "should return the branch information for a single branch" do - get api("/projects/#{project.id}/repository/branches/#{branch_name}", user) - expect(response.status).to eq(200) - - expect(json_response['name']).to eq(branch_name) - expect(json_response['commit']['id']).to eq(branch_sha) - expect(json_response['protected']).to eq(false) - end - - it "should return a 403 error if guest" do - get api("/projects/#{project.id}/repository/branches", user2) - expect(response.status).to eq(403) - end - - it "should return a 404 error if branch is not available" do - get api("/projects/#{project.id}/repository/branches/unknown", user) - expect(response.status).to eq(404) - end - end - - describe "PUT /projects/:id/repository/branches/:branch/protect" do - it "should protect a single branch" do - put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user) - expect(response.status).to eq(200) - - expect(json_response['name']).to eq(branch_name) - expect(json_response['commit']['id']).to eq(branch_sha) - expect(json_response['protected']).to eq(true) - end - - it "should return a 404 error if branch not found" do - put api("/projects/#{project.id}/repository/branches/unknown/protect", user) - expect(response.status).to eq(404) - end - - it "should return a 403 error if guest" do - put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user2) - expect(response.status).to eq(403) - end - - it "should return success when protect branch again" do - put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user) - put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user) - expect(response.status).to eq(200) - end - end - - describe "PUT /projects/:id/repository/branches/:branch/unprotect" do - it "should unprotect a single branch" do - put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user) - expect(response.status).to eq(200) - - expect(json_response['name']).to eq(branch_name) - expect(json_response['commit']['id']).to eq(branch_sha) - expect(json_response['protected']).to eq(false) - end - - it "should return success when unprotect branch" do - put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user) - expect(response.status).to eq(404) - end - - it "should return success when unprotect branch again" do - put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user) - put api("/projects/#{project.id}/repository/branches/#{branch_name}/unprotect", user) - expect(response.status).to eq(200) - end - end - - describe "POST /projects/:id/repository/branches" do - it "should create a new branch" do - post api("/projects/#{project.id}/repository/branches", user), - branch_name: 'feature1', - ref: branch_sha - - expect(response.status).to eq(201) - - expect(json_response['name']).to eq('feature1') - expect(json_response['commit']['id']).to eq(branch_sha) - end - - it "should deny for user without push access" do - post api("/projects/#{project.id}/repository/branches", user2), - branch_name: branch_name, - ref: branch_sha - expect(response.status).to eq(403) - end - - it 'should return 400 if branch name is invalid' do - post api("/projects/#{project.id}/repository/branches", user), - branch_name: 'new design', - ref: branch_sha - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Branch name invalid') - end - - it 'should return 400 if branch already exists' do - post api("/projects/#{project.id}/repository/branches", user), - branch_name: 'new_design1', - ref: branch_sha - expect(response.status).to eq(201) - - post api("/projects/#{project.id}/repository/branches", user), - branch_name: 'new_design1', - ref: branch_sha - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Branch already exists') - end - - it 'should return 400 if ref name is invalid' do - post api("/projects/#{project.id}/repository/branches", user), - branch_name: 'new_design3', - ref: 'foo' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Invalid reference name') - end - end - - describe "DELETE /projects/:id/repository/branches/:branch" do - before { Repository.any_instance.stub(rm_branch: true) } - - it "should remove branch" do - delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user) - expect(response.status).to eq(200) - expect(json_response['branch_name']).to eq(branch_name) - end - - it 'should return 404 if branch not exists' do - delete api("/projects/#{project.id}/repository/branches/foobar", user) - expect(response.status).to eq(404) - end - - it "should remove protected branch" do - project.protected_branches.create(name: branch_name) - delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user) - expect(response.status).to eq(405) - expect(json_response['message']).to eq('Protected branch cant be removed') - end - - it "should not remove HEAD branch" do - delete api("/projects/#{project.id}/repository/branches/master", user) - expect(response.status).to eq(405) - expect(json_response['message']).to eq('Cannot remove HEAD branch') - end - end -end diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb deleted file mode 100644 index 9ea60e1a4ad..00000000000 --- a/spec/requests/api/commits_spec.rb +++ /dev/null @@ -1,149 +0,0 @@ -require 'spec_helper' -require 'mime/types' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:user2) { create(:user) } - let!(:project) { create(:project, creator_id: user.id) } - let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } - let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) } - let!(:note) { create(:note_on_commit, author: user, project: project, commit_id: project.repository.commit.id, note: 'a comment on a commit') } - - before { project.team << [user, :reporter] } - - describe "GET /projects/:id/repository/commits" do - context "authorized user" do - before { project.team << [user2, :reporter] } - - it "should return project commits" do - get api("/projects/#{project.id}/repository/commits", user) - expect(response.status).to eq(200) - - expect(json_response).to be_an Array - expect(json_response.first['id']).to eq(project.repository.commit.id) - end - end - - context "unauthorized user" do - it "should not return project commits" do - get api("/projects/#{project.id}/repository/commits") - expect(response.status).to eq(401) - end - end - end - - describe "GET /projects:id/repository/commits/:sha" do - context "authorized user" do - it "should return a commit by sha" do - get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user) - expect(response.status).to eq(200) - expect(json_response['id']).to eq(project.repository.commit.id) - expect(json_response['title']).to eq(project.repository.commit.title) - end - - it "should return a 404 error if not found" do - get api("/projects/#{project.id}/repository/commits/invalid_sha", user) - expect(response.status).to eq(404) - end - end - - context "unauthorized user" do - it "should not return the selected commit" do - get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}") - expect(response.status).to eq(401) - end - end - end - - describe "GET /projects:id/repository/commits/:sha/diff" do - context "authorized user" do - before { project.team << [user2, :reporter] } - - it "should return the diff of the selected commit" do - get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff", user) - expect(response.status).to eq(200) - - expect(json_response).to be_an Array - expect(json_response.length).to be >= 1 - expect(json_response.first.keys).to include "diff" - end - - it "should return a 404 error if invalid commit" do - get api("/projects/#{project.id}/repository/commits/invalid_sha/diff", user) - expect(response.status).to eq(404) - end - end - - context "unauthorized user" do - it "should not return the diff of the selected commit" do - get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/diff") - expect(response.status).to eq(401) - end - end - end - - describe 'GET /projects:id/repository/commits/:sha/comments' do - context 'authorized user' do - it 'should return merge_request comments' do - get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['note']).to eq('a comment on a commit') - expect(json_response.first['author']['id']).to eq(user.id) - end - - it 'should return a 404 error if merge_request_id not found' do - get api("/projects/#{project.id}/repository/commits/1234ab/comments", user) - expect(response.status).to eq(404) - end - end - - context 'unauthorized user' do - it 'should not return the diff of the selected commit' do - get api("/projects/#{project.id}/repository/commits/1234ab/comments") - expect(response.status).to eq(401) - end - end - end - - describe 'POST /projects:id/repository/commits/:sha/comments' do - context 'authorized user' do - it 'should return comment' do - post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment' - expect(response.status).to eq(201) - expect(json_response['note']).to eq('My comment') - expect(json_response['path']).to be_nil - expect(json_response['line']).to be_nil - expect(json_response['line_type']).to be_nil - end - - it 'should return the inline comment' do - post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user), note: 'My comment', path: project.repository.commit.diffs.first.new_path, line: 7, line_type: 'new' - expect(response.status).to eq(201) - expect(json_response['note']).to eq('My comment') - expect(json_response['path']).to eq(project.repository.commit.diffs.first.new_path) - expect(json_response['line']).to eq(7) - expect(json_response['line_type']).to eq('new') - end - - it 'should return 400 if note is missing' do - post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments", user) - expect(response.status).to eq(400) - end - - it 'should return 404 if note is attached to non existent commit' do - post api("/projects/#{project.id}/repository/commits/1234ab/comments", user), note: 'My comment' - expect(response.status).to eq(404) - end - end - - context 'unauthorized user' do - it 'should not return the diff of the selected commit' do - post api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}/comments") - expect(response.status).to eq(401) - end - end - end -end diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb deleted file mode 100644 index 39949a90422..00000000000 --- a/spec/requests/api/doorkeeper_access_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let!(:user) { create(:user) } - let!(:application) { Doorkeeper::Application.create!(:name => "MyApp", :redirect_uri => "https://app.com", :owner => user) } - let!(:token) { Doorkeeper::AccessToken.create! :application_id => application.id, :resource_owner_id => user.id } - - - describe "when unauthenticated" do - it "returns authentication success" do - get api("/user"), :access_token => token.token - expect(response.status).to eq(200) - end - end - - describe "when token invalid" do - it "returns authentication error" do - get api("/user"), :access_token => "123a" - expect(response.status).to eq(401) - end - end - - describe "authorization by private token" do - it "returns authentication success" do - get api("/user", user) - expect(response.status).to eq(200) - end - end -end diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb deleted file mode 100644 index bab8888a631..00000000000 --- a/spec/requests/api/files_spec.rb +++ /dev/null @@ -1,164 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let!(:project) { create(:project, namespace: user.namespace ) } - let(:file_path) { 'files/ruby/popen.rb' } - - before { project.team << [user, :developer] } - - describe "GET /projects/:id/repository/files" do - it "should return file info" do - params = { - file_path: file_path, - ref: 'master', - } - - get api("/projects/#{project.id}/repository/files", user), params - expect(response.status).to eq(200) - expect(json_response['file_path']).to eq(file_path) - expect(json_response['file_name']).to eq('popen.rb') - expect(Base64.decode64(json_response['content']).lines.first).to eq("require 'fileutils'\n") - end - - it "should return a 400 bad request if no params given" do - get api("/projects/#{project.id}/repository/files", user) - expect(response.status).to eq(400) - end - - it "should return a 404 if such file does not exist" do - params = { - file_path: 'app/models/application.rb', - ref: 'master', - } - - get api("/projects/#{project.id}/repository/files", user), params - expect(response.status).to eq(404) - end - end - - describe "POST /projects/:id/repository/files" do - let(:valid_params) { - { - file_path: 'newfile.rb', - branch_name: 'master', - content: 'puts 8', - commit_message: 'Added newfile' - } - } - - it "should create a new file in project repo" do - Gitlab::Satellite::NewFileAction.any_instance.stub( - commit!: true, - ) - - post api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(201) - expect(json_response['file_path']).to eq('newfile.rb') - end - - it "should return a 400 bad request if no params given" do - post api("/projects/#{project.id}/repository/files", user) - expect(response.status).to eq(400) - end - - it "should return a 400 if satellite fails to create file" do - Gitlab::Satellite::NewFileAction.any_instance.stub( - commit!: false, - ) - - post api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(400) - end - end - - describe "PUT /projects/:id/repository/files" do - let(:valid_params) { - { - file_path: file_path, - branch_name: 'master', - content: 'puts 8', - commit_message: 'Changed file' - } - } - - it "should update existing file in project repo" do - Gitlab::Satellite::EditFileAction.any_instance.stub( - commit!: true, - ) - - put api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(200) - expect(json_response['file_path']).to eq(file_path) - end - - it "should return a 400 bad request if no params given" do - put api("/projects/#{project.id}/repository/files", user) - expect(response.status).to eq(400) - end - - it 'should return a 400 if the checkout fails' do - Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!) - .and_raise(Gitlab::Satellite::CheckoutFailed) - - put api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(400) - - ref = valid_params[:branch_name] - expect(response.body).to match("ref '#{ref}' could not be checked out") - end - - it 'should return a 409 if the file was not modified' do - Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!) - .and_raise(Gitlab::Satellite::CommitFailed) - - put api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(409) - expect(response.body).to match("Maybe there was nothing to commit?") - end - - it 'should return a 409 if the push fails' do - Gitlab::Satellite::EditFileAction.any_instance.stub(:commit!) - .and_raise(Gitlab::Satellite::PushFailed) - - put api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(409) - expect(response.body).to match("Maybe the file was changed by another process?") - end - end - - describe "DELETE /projects/:id/repository/files" do - let(:valid_params) { - { - file_path: file_path, - branch_name: 'master', - commit_message: 'Changed file' - } - } - - it "should delete existing file in project repo" do - Gitlab::Satellite::DeleteFileAction.any_instance.stub( - commit!: true, - ) - - delete api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(200) - expect(json_response['file_path']).to eq(file_path) - end - - it "should return a 400 bad request if no params given" do - delete api("/projects/#{project.id}/repository/files", user) - expect(response.status).to eq(400) - end - - it "should return a 400 if satellite fails to create file" do - Gitlab::Satellite::DeleteFileAction.any_instance.stub( - commit!: false, - ) - - delete api("/projects/#{project.id}/repository/files", user), valid_params - expect(response.status).to eq(400) - end - end -end diff --git a/spec/requests/api/fork_spec.rb b/spec/requests/api/fork_spec.rb deleted file mode 100644 index fb3ff552c8d..00000000000 --- a/spec/requests/api/fork_spec.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:user3) { create(:user) } - let(:admin) { create(:admin) } - let(:project) { - create(:project, creator_id: user.id, - namespace: user.namespace) - } - let(:project_user2) { - create(:project_member, user: user2, - project: project, - access_level: ProjectMember::GUEST) - } - - describe 'POST /projects/fork/:id' do - before { project_user2 } - before { user3 } - - context 'when authenticated' do - it 'should fork if user has sufficient access to project' do - post api("/projects/fork/#{project.id}", user2) - expect(response.status).to eq(201) - expect(json_response['name']).to eq(project.name) - expect(json_response['path']).to eq(project.path) - expect(json_response['owner']['id']).to eq(user2.id) - expect(json_response['namespace']['id']).to eq(user2.namespace.id) - expect(json_response['forked_from_project']['id']).to eq(project.id) - end - - it 'should fork if user is admin' do - post api("/projects/fork/#{project.id}", admin) - expect(response.status).to eq(201) - expect(json_response['name']).to eq(project.name) - expect(json_response['path']).to eq(project.path) - expect(json_response['owner']['id']).to eq(admin.id) - expect(json_response['namespace']['id']).to eq(admin.namespace.id) - expect(json_response['forked_from_project']['id']).to eq(project.id) - end - - it 'should fail on missing project access for the project to fork' do - post api("/projects/fork/#{project.id}", user3) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - - it 'should fail if forked project exists in the user namespace' do - post api("/projects/fork/#{project.id}", user) - expect(response.status).to eq(409) - expect(json_response['message']['base']).to eq(['Invalid fork destination']) - expect(json_response['message']['name']).to eq(['has already been taken']) - expect(json_response['message']['path']).to eq(['has already been taken']) - end - - it 'should fail if project to fork from does not exist' do - post api('/projects/fork/424242', user) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - end - - context 'when unauthenticated' do - it 'should return authentication error' do - post api("/projects/fork/#{project.id}") - expect(response.status).to eq(401) - expect(json_response['message']).to eq('401 Unauthorized') - end - end - end -end diff --git a/spec/requests/api/group_members_spec.rb b/spec/requests/api/group_members_spec.rb deleted file mode 100644 index 8ba6876a95b..00000000000 --- a/spec/requests/api/group_members_spec.rb +++ /dev/null @@ -1,199 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:owner) { create(:user) } - let(:reporter) { create(:user) } - let(:developer) { create(:user) } - let(:master) { create(:user) } - let(:guest) { create(:user) } - let(:stranger) { create(:user) } - - let!(:group_with_members) do - group = create(:group) - group.add_users([reporter.id], GroupMember::REPORTER) - group.add_users([developer.id], GroupMember::DEVELOPER) - group.add_users([master.id], GroupMember::MASTER) - group.add_users([guest.id], GroupMember::GUEST) - group - end - - let!(:group_no_members) { create(:group) } - - before do - group_with_members.add_owner owner - group_no_members.add_owner owner - end - - describe "GET /groups/:id/members" do - context "when authenticated as user that is part or the group" do - it "each user: should return an array of members groups of group3" do - [owner, master, developer, reporter, guest].each do |user| - get api("/groups/#{group_with_members.id}/members", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.size).to eq(5) - expect(json_response.find { |e| e['id']==owner.id }['access_level']).to eq(GroupMember::OWNER) - expect(json_response.find { |e| e['id']==reporter.id }['access_level']).to eq(GroupMember::REPORTER) - expect(json_response.find { |e| e['id']==developer.id }['access_level']).to eq(GroupMember::DEVELOPER) - expect(json_response.find { |e| e['id']==master.id }['access_level']).to eq(GroupMember::MASTER) - expect(json_response.find { |e| e['id']==guest.id }['access_level']).to eq(GroupMember::GUEST) - end - end - - it "users not part of the group should get access error" do - get api("/groups/#{group_with_members.id}/members", stranger) - expect(response.status).to eq(403) - end - end - end - - describe "POST /groups/:id/members" do - context "when not a member of the group" do - it "should not add guest as member of group_no_members when adding being done by person outside the group" do - post api("/groups/#{group_no_members.id}/members", reporter), user_id: guest.id, access_level: GroupMember::MASTER - expect(response.status).to eq(403) - end - end - - context "when a member of the group" do - it "should return ok and add new member" do - new_user = create(:user) - - expect { - post api("/groups/#{group_no_members.id}/members", owner), - user_id: new_user.id, access_level: GroupMember::MASTER - }.to change { group_no_members.members.count }.by(1) - - expect(response.status).to eq(201) - expect(json_response['name']).to eq(new_user.name) - expect(json_response['access_level']).to eq(GroupMember::MASTER) - end - - it "should not allow guest to modify group members" do - new_user = create(:user) - - expect { - post api("/groups/#{group_with_members.id}/members", guest), - user_id: new_user.id, access_level: GroupMember::MASTER - }.not_to change { group_with_members.members.count } - - expect(response.status).to eq(403) - end - - it "should return error if member already exists" do - post api("/groups/#{group_with_members.id}/members", owner), user_id: master.id, access_level: GroupMember::MASTER - expect(response.status).to eq(409) - end - - it "should return a 400 error when user id is not given" do - post api("/groups/#{group_no_members.id}/members", owner), access_level: GroupMember::MASTER - expect(response.status).to eq(400) - end - - it "should return a 400 error when access level is not given" do - post api("/groups/#{group_no_members.id}/members", owner), user_id: master.id - expect(response.status).to eq(400) - end - - it "should return a 422 error when access level is not known" do - post api("/groups/#{group_no_members.id}/members", owner), user_id: master.id, access_level: 1234 - expect(response.status).to eq(422) - end - end - end - - describe 'PUT /groups/:id/members/:user_id' do - context 'when not a member of the group' do - it 'should return a 409 error if the user is not a group member' do - put( - api("/groups/#{group_no_members.id}/members/#{developer.id}", - owner), access_level: GroupMember::MASTER - ) - expect(response.status).to eq(404) - end - end - - context 'when a member of the group' do - it 'should return ok and update member access level' do - put( - api("/groups/#{group_with_members.id}/members/#{reporter.id}", - owner), - access_level: GroupMember::MASTER - ) - - expect(response.status).to eq(200) - - get api("/groups/#{group_with_members.id}/members", owner) - json_reporter = json_response.find do |e| - e['id'] == reporter.id - end - - expect(json_reporter['access_level']).to eq(GroupMember::MASTER) - end - - it 'should not allow guest to modify group members' do - put( - api("/groups/#{group_with_members.id}/members/#{developer.id}", - guest), - access_level: GroupMember::MASTER - ) - - expect(response.status).to eq(403) - - get api("/groups/#{group_with_members.id}/members", owner) - json_developer = json_response.find do |e| - e['id'] == developer.id - end - - expect(json_developer['access_level']).to eq(GroupMember::DEVELOPER) - end - - it 'should return a 400 error when access level is not given' do - put( - api("/groups/#{group_with_members.id}/members/#{master.id}", owner) - ) - expect(response.status).to eq(400) - end - - it 'should return a 422 error when access level is not known' do - put( - api("/groups/#{group_with_members.id}/members/#{master.id}", owner), - access_level: 1234 - ) - expect(response.status).to eq(422) - end - end - end - - describe "DELETE /groups/:id/members/:user_id" do - context "when not a member of the group" do - it "should not delete guest's membership of group_with_members" do - random_user = create(:user) - delete api("/groups/#{group_with_members.id}/members/#{owner.id}", random_user) - expect(response.status).to eq(403) - end - end - - context "when a member of the group" do - it "should delete guest's membership of group" do - expect { - delete api("/groups/#{group_with_members.id}/members/#{guest.id}", owner) - }.to change { group_with_members.members.count }.by(-1) - - expect(response.status).to eq(200) - end - - it "should return a 404 error when user id is not known" do - delete api("/groups/#{group_with_members.id}/members/1328", owner) - expect(response.status).to eq(404) - end - - it "should not allow guest to modify group members" do - delete api("/groups/#{group_with_members.id}/members/#{master.id}", guest) - expect(response.status).to eq(403) - end - end - end -end diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb deleted file mode 100644 index d963dbac9f1..00000000000 --- a/spec/requests/api/groups_spec.rb +++ /dev/null @@ -1,187 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:user1) { create(:user) } - let(:user2) { create(:user) } - let(:admin) { create(:admin) } - let!(:group1) { create(:group) } - let!(:group2) { create(:group) } - - before do - group1.add_owner(user1) - group2.add_owner(user2) - end - - describe "GET /groups" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/groups") - expect(response.status).to eq(401) - end - end - - context "when authenticated as user" do - it "normal user: should return an array of groups of user1" do - get api("/groups", user1) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['name']).to eq(group1.name) - end - end - - context "when authenticated as admin" do - it "admin: should return an array of all groups" do - get api("/groups", admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(2) - end - end - end - - describe "GET /groups/:id" do - context "when authenticated as user" do - it "should return one of user1's groups" do - get api("/groups/#{group1.id}", user1) - expect(response.status).to eq(200) - json_response['name'] == group1.name - end - - it "should not return a non existing group" do - get api("/groups/1328", user1) - expect(response.status).to eq(404) - end - - it "should not return a group not attached to user1" do - get api("/groups/#{group2.id}", user1) - expect(response.status).to eq(403) - end - end - - context "when authenticated as admin" do - it "should return any existing group" do - get api("/groups/#{group2.id}", admin) - expect(response.status).to eq(200) - json_response['name'] == group2.name - end - - it "should not return a non existing group" do - get api("/groups/1328", admin) - expect(response.status).to eq(404) - end - end - - context 'when using group path in URL' do - it 'should return any existing group' do - get api("/groups/#{group1.path}", admin) - expect(response.status).to eq(200) - json_response['name'] == group2.name - end - - it 'should not return a non existing group' do - get api('/groups/unknown', admin) - expect(response.status).to eq(404) - end - - it 'should not return a group not attached to user1' do - get api("/groups/#{group2.path}", user1) - expect(response.status).to eq(403) - end - end - end - - describe "POST /groups" do - context "when authenticated as user" do - it "should not create group" do - post api("/groups", user1), attributes_for(:group) - expect(response.status).to eq(403) - end - end - - context "when authenticated as admin" do - it "should create group" do - post api("/groups", admin), attributes_for(:group) - expect(response.status).to eq(201) - end - - it "should not create group, duplicate" do - post api("/groups", admin), {name: "Duplicate Test", path: group2.path} - expect(response.status).to eq(400) - expect(response.message).to eq("Bad Request") - end - - it "should return 400 bad request error if name not given" do - post api("/groups", admin), {path: group2.path} - expect(response.status).to eq(400) - end - - it "should return 400 bad request error if path not given" do - post api("/groups", admin), { name: 'test' } - expect(response.status).to eq(400) - end - end - end - - describe "DELETE /groups/:id" do - context "when authenticated as user" do - it "should remove group" do - delete api("/groups/#{group1.id}", user1) - expect(response.status).to eq(200) - end - - it "should not remove a group if not an owner" do - user3 = create(:user) - group1.add_user(user3, Gitlab::Access::MASTER) - delete api("/groups/#{group1.id}", user3) - expect(response.status).to eq(403) - end - - it "should not remove a non existing group" do - delete api("/groups/1328", user1) - expect(response.status).to eq(404) - end - - it "should not remove a group not attached to user1" do - delete api("/groups/#{group2.id}", user1) - expect(response.status).to eq(403) - end - end - - context "when authenticated as admin" do - it "should remove any existing group" do - delete api("/groups/#{group2.id}", admin) - expect(response.status).to eq(200) - end - - it "should not remove a non existing group" do - delete api("/groups/1328", admin) - expect(response.status).to eq(404) - end - end - end - - describe "POST /groups/:id/projects/:project_id" do - let(:project) { create(:project) } - before(:each) do - Projects::TransferService.any_instance.stub(execute: true) - allow(Project).to receive(:find).and_return(project) - end - - context "when authenticated as user" do - it "should not transfer project to group" do - post api("/groups/#{group1.id}/projects/#{project.id}", user2) - expect(response.status).to eq(403) - end - end - - context "when authenticated as admin" do - it "should transfer project to group" do - post api("/groups/#{group1.id}/projects/#{project.id}", admin) - expect(response.status).to eq(201) - end - end - end -end diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb deleted file mode 100644 index 4c7d15d6594..00000000000 --- a/spec/requests/api/internal_spec.rb +++ /dev/null @@ -1,229 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:key) { create(:key, user: user) } - let(:project) { create(:project) } - let(:secret_token) { File.read Rails.root.join('.gitlab_shell_secret') } - - describe "GET /internal/check", no_db: true do - it do - get api("/internal/check"), secret_token: secret_token - - expect(response.status).to eq(200) - expect(json_response['api_version']).to eq(API::API.version) - end - end - - describe "GET /internal/broadcast_message" do - context "broadcast message exists" do - let!(:broadcast_message) { create(:broadcast_message, starts_at: Time.now.yesterday, ends_at: Time.now.tomorrow ) } - - it do - get api("/internal/broadcast_message"), secret_token: secret_token - - expect(response.status).to eq(200) - expect(json_response["message"]).to eq(broadcast_message.message) - end - end - - context "broadcast message doesn't exist" do - it do - get api("/internal/broadcast_message"), secret_token: secret_token - - expect(response.status).to eq(200) - expect(json_response).to be_empty - end - end - end - - describe "GET /internal/discover" do - it do - get(api("/internal/discover"), key_id: key.id, secret_token: secret_token) - - expect(response.status).to eq(200) - - expect(json_response['name']).to eq(user.name) - end - end - - describe "POST /internal/allowed" do - context "access granted" do - before do - project.team << [user, :developer] - end - - context "git pull" do - it do - pull(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_truthy - end - end - - context "git push" do - it do - push(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_truthy - end - end - end - - context "access denied" do - before do - project.team << [user, :guest] - end - - context "git pull" do - it do - pull(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - - context "git push" do - it do - push(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - end - - context "blocked user" do - let(:personal_project) { create(:project, namespace: user.namespace) } - - before do - user.block - end - - context "git pull" do - it do - pull(key, personal_project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - - context "git push" do - it do - push(key, personal_project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - end - - context "archived project" do - let(:personal_project) { create(:project, namespace: user.namespace) } - - before do - project.team << [user, :developer] - project.archive! - end - - context "git pull" do - it do - pull(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_truthy - end - end - - context "git push" do - it do - push(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - end - - context "deploy key" do - let(:key) { create(:deploy_key) } - - context "added to project" do - before do - key.projects << project - end - - it do - archive(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_truthy - end - end - - context "not added to project" do - it do - archive(key, project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - end - - context 'project does not exist' do - it do - pull(key, OpenStruct.new(path_with_namespace: 'gitlab/notexists')) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - - context 'user does not exist' do - it do - pull(OpenStruct.new(id: 0), project) - - expect(response.status).to eq(200) - expect(json_response["status"]).to be_falsey - end - end - end - - def pull(key, project) - post( - api("/internal/allowed"), - key_id: key.id, - project: project.path_with_namespace, - action: 'git-upload-pack', - secret_token: secret_token - ) - end - - def push(key, project) - post( - api("/internal/allowed"), - changes: 'd14d6c0abdd253381df51a723d58691b2ee1ab08 570e7b2abdd848b95f2f578043fc23bd6f6fd24d refs/heads/master', - key_id: key.id, - project: project.path_with_namespace, - action: 'git-receive-pack', - secret_token: secret_token - ) - end - - def archive(key, project) - post( - api("/internal/allowed"), - ref: 'master', - key_id: key.id, - project: project.path_with_namespace, - action: 'git-upload-archive', - secret_token: secret_token - ) - end -end diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb deleted file mode 100644 index b6b0427debf..00000000000 --- a/spec/requests/api/issues_spec.rb +++ /dev/null @@ -1,330 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let!(:project) { create(:project, namespace: user.namespace ) } - let!(:closed_issue) do - create :closed_issue, - author: user, - assignee: user, - project: project, - state: :closed, - milestone: milestone - end - let!(:issue) do - create :issue, - author: user, - assignee: user, - project: project, - milestone: milestone - end - let!(:label) do - create(:label, title: 'label', color: '#FFAABB', project: project) - end - let!(:label_link) { create(:label_link, label: label, target: issue) } - let!(:milestone) { create(:milestone, title: '1.0.0', project: project) } - let!(:empty_milestone) do - create(:milestone, title: '2.0.0', project: project) - end - - before { project.team << [user, :reporter] } - - describe "GET /issues" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/issues") - expect(response.status).to eq(401) - end - end - - context "when authenticated" do - it "should return an array of issues" do - get api("/issues", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(issue.title) - end - - it "should add pagination headers" do - get api("/issues?per_page=3", user) - expect(response.headers['Link']).to eq( - '; rel="first", ; rel="last"' - ) - end - - it 'should return an array of closed issues' do - get api('/issues?state=closed', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['id']).to eq(closed_issue.id) - end - - it 'should return an array of opened issues' do - get api('/issues?state=opened', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['id']).to eq(issue.id) - end - - it 'should return an array of all issues' do - get api('/issues?state=all', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(2) - expect(json_response.first['id']).to eq(issue.id) - expect(json_response.second['id']).to eq(closed_issue.id) - end - - it 'should return an array of labeled issues' do - get api("/issues?labels=#{label.title}", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['labels']).to eq([label.title]) - end - - it 'should return an array of labeled issues when at least one label matches' do - get api("/issues?labels=#{label.title},foo,bar", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['labels']).to eq([label.title]) - end - - it 'should return an empty array if no issue matches labels' do - get api('/issues?labels=foo,bar', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(0) - end - - it 'should return an array of labeled issues matching given state' do - get api("/issues?labels=#{label.title}&state=opened", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['labels']).to eq([label.title]) - expect(json_response.first['state']).to eq('opened') - end - - it 'should return an empty array if no issue matches labels and state filters' do - get api("/issues?labels=#{label.title}&state=closed", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(0) - end - end - end - - describe "GET /projects/:id/issues" do - let(:base_url) { "/projects/#{project.id}" } - let(:title) { milestone.title } - - it "should return project issues" do - get api("#{base_url}/issues", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(issue.title) - end - - it 'should return an array of labeled project issues' do - get api("#{base_url}/issues?labels=#{label.title}", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['labels']).to eq([label.title]) - end - - it 'should return an array of labeled project issues when at least one label matches' do - get api("#{base_url}/issues?labels=#{label.title},foo,bar", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['labels']).to eq([label.title]) - end - - it 'should return an empty array if no project issue matches labels' do - get api("#{base_url}/issues?labels=foo,bar", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(0) - end - - it 'should return an empty array if no issue matches milestone' do - get api("#{base_url}/issues?milestone=#{empty_milestone.title}", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(0) - end - - it 'should return an empty array if milestone does not exist' do - get api("#{base_url}/issues?milestone=foo", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(0) - end - - it 'should return an array of issues in given milestone' do - get api("#{base_url}/issues?milestone=#{title}", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(2) - expect(json_response.first['id']).to eq(issue.id) - expect(json_response.second['id']).to eq(closed_issue.id) - end - - it 'should return an array of issues matching state in milestone' do - get api("#{base_url}/issues?milestone=#{milestone.title}"\ - '&state=closed', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['id']).to eq(closed_issue.id) - end - end - - describe "GET /projects/:id/issues/:issue_id" do - it "should return a project issue by id" do - get api("/projects/#{project.id}/issues/#{issue.id}", user) - expect(response.status).to eq(200) - expect(json_response['title']).to eq(issue.title) - expect(json_response['iid']).to eq(issue.iid) - end - - it "should return 404 if issue id not found" do - get api("/projects/#{project.id}/issues/54321", user) - expect(response.status).to eq(404) - end - end - - describe "POST /projects/:id/issues" do - it "should create a new project issue" do - post api("/projects/#{project.id}/issues", user), - title: 'new issue', labels: 'label, label2' - expect(response.status).to eq(201) - expect(json_response['title']).to eq('new issue') - expect(json_response['description']).to be_nil - expect(json_response['labels']).to eq(['label', 'label2']) - end - - it "should return a 400 bad request if title not given" do - post api("/projects/#{project.id}/issues", user), labels: 'label, label2' - expect(response.status).to eq(400) - end - - it 'should return 400 on invalid label names' do - post api("/projects/#{project.id}/issues", user), - title: 'new issue', - labels: 'label, ?' - expect(response.status).to eq(400) - expect(json_response['message']['labels']['?']['title']).to eq(['is invalid']) - end - - it 'should return 400 if title is too long' do - post api("/projects/#{project.id}/issues", user), - title: 'g' * 256 - expect(response.status).to eq(400) - expect(json_response['message']['title']).to eq([ - 'is too long (maximum is 255 characters)' - ]) - end - end - - describe "PUT /projects/:id/issues/:issue_id to update only title" do - it "should update a project issue" do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - title: 'updated title' - expect(response.status).to eq(200) - - expect(json_response['title']).to eq('updated title') - end - - it "should return 404 error if issue id not found" do - put api("/projects/#{project.id}/issues/44444", user), - title: 'updated title' - expect(response.status).to eq(404) - end - - it 'should return 400 on invalid label names' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - title: 'updated title', - labels: 'label, ?' - expect(response.status).to eq(400) - expect(json_response['message']['labels']['?']['title']).to eq(['is invalid']) - end - end - - describe 'PUT /projects/:id/issues/:issue_id to update labels' do - let!(:label) { create(:label, title: 'dummy', project: project) } - let!(:label_link) { create(:label_link, label: label, target: issue) } - - it 'should not update labels if not present' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - title: 'updated title' - expect(response.status).to eq(200) - expect(json_response['labels']).to eq([label.title]) - end - - it 'should remove all labels' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - labels: '' - expect(response.status).to eq(200) - expect(json_response['labels']).to eq([]) - end - - it 'should update labels' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - labels: 'foo,bar' - expect(response.status).to eq(200) - expect(json_response['labels']).to include 'foo' - expect(json_response['labels']).to include 'bar' - end - - it 'should return 400 on invalid label names' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - labels: 'label, ?' - expect(response.status).to eq(400) - expect(json_response['message']['labels']['?']['title']).to eq(['is invalid']) - end - - it 'should allow special label names' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - labels: 'label:foo, label-bar,label_bar,label/bar' - expect(response.status).to eq(200) - expect(json_response['labels']).to include 'label:foo' - expect(json_response['labels']).to include 'label-bar' - expect(json_response['labels']).to include 'label_bar' - expect(json_response['labels']).to include 'label/bar' - end - - it 'should return 400 if title is too long' do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - title: 'g' * 256 - expect(response.status).to eq(400) - expect(json_response['message']['title']).to eq([ - 'is too long (maximum is 255 characters)' - ]) - end - end - - describe "PUT /projects/:id/issues/:issue_id to update state and label" do - it "should update a project issue" do - put api("/projects/#{project.id}/issues/#{issue.id}", user), - labels: 'label2', state_event: "close" - expect(response.status).to eq(200) - - expect(json_response['labels']).to include 'label2' - expect(json_response['state']).to eq "closed" - end - end - - describe "DELETE /projects/:id/issues/:issue_id" do - it "should delete a project issue" do - delete api("/projects/#{project.id}/issues/#{issue.id}", user) - expect(response.status).to eq(405) - end - end -end diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb deleted file mode 100644 index aff109a9424..00000000000 --- a/spec/requests/api/labels_spec.rb +++ /dev/null @@ -1,170 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:user) { create(:user) } - let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) } - let!(:label1) { create(:label, title: 'label1', project: project) } - - before do - project.team << [user, :master] - end - - - describe 'GET /projects/:id/labels' do - it 'should return project labels' do - get api("/projects/#{project.id}/labels", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.size).to eq(1) - expect(json_response.first['name']).to eq(label1.name) - end - end - - describe 'POST /projects/:id/labels' do - it 'should return created label' do - post api("/projects/#{project.id}/labels", user), - name: 'Foo', - color: '#FFAABB' - expect(response.status).to eq(201) - expect(json_response['name']).to eq('Foo') - expect(json_response['color']).to eq('#FFAABB') - end - - it 'should return a 400 bad request if name not given' do - post api("/projects/#{project.id}/labels", user), color: '#FFAABB' - expect(response.status).to eq(400) - end - - it 'should return a 400 bad request if color not given' do - post api("/projects/#{project.id}/labels", user), name: 'Foobar' - expect(response.status).to eq(400) - end - - it 'should return 400 for invalid color' do - post api("/projects/#{project.id}/labels", user), - name: 'Foo', - color: '#FFAA' - expect(response.status).to eq(400) - expect(json_response['message']['color']).to eq(['is invalid']) - end - - it 'should return 400 for too long color code' do - post api("/projects/#{project.id}/labels", user), - name: 'Foo', - color: '#FFAAFFFF' - expect(response.status).to eq(400) - expect(json_response['message']['color']).to eq(['is invalid']) - end - - it 'should return 400 for invalid name' do - post api("/projects/#{project.id}/labels", user), - name: '?', - color: '#FFAABB' - expect(response.status).to eq(400) - expect(json_response['message']['title']).to eq(['is invalid']) - end - - it 'should return 409 if label already exists' do - post api("/projects/#{project.id}/labels", user), - name: 'label1', - color: '#FFAABB' - expect(response.status).to eq(409) - expect(json_response['message']).to eq('Label already exists') - end - end - - describe 'DELETE /projects/:id/labels' do - it 'should return 200 for existing label' do - delete api("/projects/#{project.id}/labels", user), name: 'label1' - expect(response.status).to eq(200) - end - - it 'should return 404 for non existing label' do - delete api("/projects/#{project.id}/labels", user), name: 'label2' - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Label Not Found') - end - - it 'should return 400 for wrong parameters' do - delete api("/projects/#{project.id}/labels", user) - expect(response.status).to eq(400) - end - end - - describe 'PUT /projects/:id/labels' do - it 'should return 200 if name and colors are changed' do - put api("/projects/#{project.id}/labels", user), - name: 'label1', - new_name: 'New Label', - color: '#FFFFFF' - expect(response.status).to eq(200) - expect(json_response['name']).to eq('New Label') - expect(json_response['color']).to eq('#FFFFFF') - end - - it 'should return 200 if name is changed' do - put api("/projects/#{project.id}/labels", user), - name: 'label1', - new_name: 'New Label' - expect(response.status).to eq(200) - expect(json_response['name']).to eq('New Label') - expect(json_response['color']).to eq(label1.color) - end - - it 'should return 200 if colors is changed' do - put api("/projects/#{project.id}/labels", user), - name: 'label1', - color: '#FFFFFF' - expect(response.status).to eq(200) - expect(json_response['name']).to eq(label1.name) - expect(json_response['color']).to eq('#FFFFFF') - end - - it 'should return 404 if label does not exist' do - put api("/projects/#{project.id}/labels", user), - name: 'label2', - new_name: 'label3' - expect(response.status).to eq(404) - end - - it 'should return 400 if no label name given' do - put api("/projects/#{project.id}/labels", user), new_name: 'label2' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('400 (Bad request) "name" not given') - end - - it 'should return 400 if no new parameters given' do - put api("/projects/#{project.id}/labels", user), name: 'label1' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Required parameters '\ - '"new_name" or "color" missing') - end - - it 'should return 400 for invalid name' do - put api("/projects/#{project.id}/labels", user), - name: 'label1', - new_name: '?', - color: '#FFFFFF' - expect(response.status).to eq(400) - expect(json_response['message']['title']).to eq(['is invalid']) - end - - it 'should return 400 for invalid name' do - put api("/projects/#{project.id}/labels", user), - name: 'label1', - color: '#FF' - expect(response.status).to eq(400) - expect(json_response['message']['color']).to eq(['is invalid']) - end - - it 'should return 400 for too long color code' do - post api("/projects/#{project.id}/labels", user), - name: 'Foo', - color: '#FFAAFFFF' - expect(response.status).to eq(400) - expect(json_response['message']['color']).to eq(['is invalid']) - end - end -end diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb deleted file mode 100644 index 9e252441a4f..00000000000 --- a/spec/requests/api/merge_requests_spec.rb +++ /dev/null @@ -1,409 +0,0 @@ -require "spec_helper" - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } - let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } - let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") } - let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test") } - let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") } - before { - project.team << [user, :reporters] - } - - describe "GET /projects/:id/merge_requests" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/projects/#{project.id}/merge_requests") - expect(response.status).to eq(401) - end - end - - context "when authenticated" do - it "should return an array of all merge_requests" do - get api("/projects/#{project.id}/merge_requests", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.last['title']).to eq(merge_request.title) - end - - it "should return an array of all merge_requests" do - get api("/projects/#{project.id}/merge_requests?state", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.last['title']).to eq(merge_request.title) - end - - it "should return an array of open merge_requests" do - get api("/projects/#{project.id}/merge_requests?state=opened", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.last['title']).to eq(merge_request.title) - end - - it "should return an array of closed merge_requests" do - get api("/projects/#{project.id}/merge_requests?state=closed", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(2) - expect(json_response.second['title']).to eq(merge_request_closed.title) - expect(json_response.first['title']).to eq(merge_request_merged.title) - end - - it "should return an array of merged merge_requests" do - get api("/projects/#{project.id}/merge_requests?state=merged", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['title']).to eq(merge_request_merged.title) - end - - context "with ordering" do - before do - @mr_later = mr_with_later_created_and_updated_at_time - @mr_earlier = mr_with_earlier_created_and_updated_at_time - end - - it "should return an array of merge_requests in ascending order" do - get api("/projects/#{project.id}/merge_requests?sort=asc", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) - end - - it "should return an array of merge_requests in descending order" do - get api("/projects/#{project.id}/merge_requests?sort=desc", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.first['id']).to eq(@mr_later.id) - expect(json_response.last['id']).to eq(@mr_earlier.id) - end - - it "should return an array of merge_requests ordered by updated_at" do - get api("/projects/#{project.id}/merge_requests?order_by=updated_at", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) - end - - it "should return an array of merge_requests ordered by created_at" do - get api("/projects/#{project.id}/merge_requests?sort=created_at", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) - end - end - end - end - - describe "GET /projects/:id/merge_request/:merge_request_id" do - it "should return merge_request" do - get api("/projects/#{project.id}/merge_request/#{merge_request.id}", user) - expect(response.status).to eq(200) - expect(json_response['title']).to eq(merge_request.title) - expect(json_response['iid']).to eq(merge_request.iid) - end - - it "should return a 404 error if merge_request_id not found" do - get api("/projects/#{project.id}/merge_request/999", user) - expect(response.status).to eq(404) - end - end - - describe 'GET /projects/:id/merge_request/:merge_request_id/changes' do - it 'should return the change information of the merge_request' do - get api("/projects/#{project.id}/merge_request/#{merge_request.id}/changes", user) - expect(response.status).to eq 200 - expect(json_response['changes'].size).to eq(merge_request.diffs.size) - end - - it 'returns a 404 when merge_request_id not found' do - get api("/projects/#{project.id}/merge_request/999/changes", user) - expect(response.status).to eq(404) - end - end - - describe "POST /projects/:id/merge_requests" do - context 'between branches projects' do - it "should return merge_request" do - post api("/projects/#{project.id}/merge_requests", user), - title: 'Test merge_request', - source_branch: 'stable', - target_branch: 'master', - author: user, - labels: 'label, label2' - expect(response.status).to eq(201) - expect(json_response['title']).to eq('Test merge_request') - expect(json_response['labels']).to eq(['label', 'label2']) - end - - it "should return 422 when source_branch equals target_branch" do - post api("/projects/#{project.id}/merge_requests", user), - title: "Test merge_request", source_branch: "master", target_branch: "master", author: user - expect(response.status).to eq(422) - end - - it "should return 400 when source_branch is missing" do - post api("/projects/#{project.id}/merge_requests", user), - title: "Test merge_request", target_branch: "master", author: user - expect(response.status).to eq(400) - end - - it "should return 400 when target_branch is missing" do - post api("/projects/#{project.id}/merge_requests", user), - title: "Test merge_request", source_branch: "stable", author: user - expect(response.status).to eq(400) - end - - it "should return 400 when title is missing" do - post api("/projects/#{project.id}/merge_requests", user), - target_branch: 'master', source_branch: 'stable' - expect(response.status).to eq(400) - end - - it 'should return 400 on invalid label names' do - post api("/projects/#{project.id}/merge_requests", user), - title: 'Test merge_request', - source_branch: 'stable', - target_branch: 'master', - author: user, - labels: 'label, ?' - expect(response.status).to eq(400) - expect(json_response['message']['labels']['?']['title']).to eq( - ['is invalid'] - ) - end - - context 'with existing MR' do - before do - post api("/projects/#{project.id}/merge_requests", user), - title: 'Test merge_request', - source_branch: 'stable', - target_branch: 'master', - author: user - @mr = MergeRequest.all.last - end - - it 'should return 409 when MR already exists for source/target' do - expect do - post api("/projects/#{project.id}/merge_requests", user), - title: 'New test merge_request', - source_branch: 'stable', - target_branch: 'master', - author: user - end.to change { MergeRequest.count }.by(0) - expect(response.status).to eq(409) - end - end - end - - context 'forked projects' do - let!(:user2) { create(:user) } - let!(:fork_project) { create(:project, forked_from_project: project, namespace: user2.namespace, creator_id: user2.id) } - let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) } - - before :each do |each| - fork_project.team << [user2, :reporters] - end - - it "should return merge_request" do - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id, description: 'Test description for Test merge_request' - expect(response.status).to eq(201) - expect(json_response['title']).to eq('Test merge_request') - expect(json_response['description']).to eq('Test description for Test merge_request') - end - - it "should not return 422 when source_branch equals target_branch" do - expect(project.id).not_to eq(fork_project.id) - expect(fork_project.forked?).to be_truthy - expect(fork_project.forked_from_project).to eq(project) - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id - expect(response.status).to eq(201) - expect(json_response['title']).to eq('Test merge_request') - end - - it "should return 400 when source_branch is missing" do - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id - expect(response.status).to eq(400) - end - - it "should return 400 when target_branch is missing" do - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id - expect(response.status).to eq(400) - end - - it "should return 400 when title is missing" do - post api("/projects/#{fork_project.id}/merge_requests", user2), - target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id - expect(response.status).to eq(400) - end - - context 'when target_branch is specified' do - it 'should return 422 if not a forked project' do - post api("/projects/#{project.id}/merge_requests", user), - title: 'Test merge_request', - target_branch: 'master', - source_branch: 'stable', - author: user, - target_project_id: fork_project.id - expect(response.status).to eq(422) - end - - it 'should return 422 if targeting a different fork' do - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', - target_branch: 'master', - source_branch: 'stable', - author: user2, - target_project_id: unrelated_project.id - expect(response.status).to eq(422) - end - end - - it "should return 201 when target_branch is specified and for the same project" do - post api("/projects/#{fork_project.id}/merge_requests", user2), - title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id - expect(response.status).to eq(201) - end - end - end - - describe "PUT /projects/:id/merge_request/:merge_request_id to close MR" do - it "should return merge_request" do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), state_event: "close" - expect(response.status).to eq(200) - expect(json_response['state']).to eq('closed') - end - end - - describe "PUT /projects/:id/merge_request/:merge_request_id/merge" do - it "should return merge_request in case of success" do - MergeRequest.any_instance.stub(can_be_merged?: true, automerge!: true) - put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user) - expect(response.status).to eq(200) - end - - it "should return 405 if branch can't be merged" do - MergeRequest.any_instance.stub(can_be_merged?: false) - put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user) - expect(response.status).to eq(405) - expect(json_response['message']).to eq('Branch cannot be merged') - end - - it "should return 405 if merge_request is not open" do - merge_request.close - put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user) - expect(response.status).to eq(405) - expect(json_response['message']).to eq('405 Method Not Allowed') - end - - it "should return 401 if user has no permissions to merge" do - user2 = create(:user) - project.team << [user2, :reporter] - put api("/projects/#{project.id}/merge_request/#{merge_request.id}/merge", user2) - expect(response.status).to eq(401) - expect(json_response['message']).to eq('401 Unauthorized') - end - end - - describe "PUT /projects/:id/merge_request/:merge_request_id" do - it "should return merge_request" do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), title: "New title" - expect(response.status).to eq(200) - expect(json_response['title']).to eq('New title') - end - - it "should return merge_request" do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), description: "New description" - expect(response.status).to eq(200) - expect(json_response['description']).to eq('New description') - end - - it "should return 422 when source_branch and target_branch are renamed the same" do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), - source_branch: "master", target_branch: "master" - expect(response.status).to eq(422) - end - - it "should return merge_request with renamed target_branch" do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "wiki" - expect(response.status).to eq(200) - expect(json_response['target_branch']).to eq('wiki') - end - - it 'should return 400 on invalid label names' do - put api("/projects/#{project.id}/merge_request/#{merge_request.id}", - user), - title: 'new issue', - labels: 'label, ?' - expect(response.status).to eq(400) - expect(json_response['message']['labels']['?']['title']).to eq(['is invalid']) - end - end - - describe "POST /projects/:id/merge_request/:merge_request_id/comments" do - it "should return comment" do - post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user), note: "My comment" - expect(response.status).to eq(201) - expect(json_response['note']).to eq('My comment') - end - - it "should return 400 if note is missing" do - post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user) - expect(response.status).to eq(400) - end - - it "should return 404 if note is attached to non existent merge request" do - post api("/projects/#{project.id}/merge_request/404/comments", user), - note: 'My comment' - expect(response.status).to eq(404) - end - end - - describe "GET :id/merge_request/:merge_request_id/comments" do - it "should return merge_request comments" do - get api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - expect(json_response.first['note']).to eq("a comment on a MR") - expect(json_response.first['author']['id']).to eq(user.id) - end - - it "should return a 404 error if merge_request_id not found" do - get api("/projects/#{project.id}/merge_request/999/comments", user) - expect(response.status).to eq(404) - end - end - - def mr_with_later_created_and_updated_at_time - merge_request - merge_request.created_at += 1.hour - merge_request.updated_at += 30.minutes - merge_request.save - merge_request - end - - def mr_with_earlier_created_and_updated_at_time - merge_request_closed - merge_request_closed.created_at -= 1.hour - merge_request_closed.updated_at -= 30.minutes - merge_request_closed.save - merge_request_closed - end -end diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb deleted file mode 100644 index effb0723476..00000000000 --- a/spec/requests/api/milestones_spec.rb +++ /dev/null @@ -1,116 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let!(:project) { create(:project, namespace: user.namespace ) } - let!(:milestone) { create(:milestone, project: project) } - - before { project.team << [user, :developer] } - - describe 'GET /projects/:id/milestones' do - it 'should return project milestones' do - get api("/projects/#{project.id}/milestones", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(milestone.title) - end - - it 'should return a 401 error if user not authenticated' do - get api("/projects/#{project.id}/milestones") - expect(response.status).to eq(401) - end - end - - describe 'GET /projects/:id/milestones/:milestone_id' do - it 'should return a project milestone by id' do - get api("/projects/#{project.id}/milestones/#{milestone.id}", user) - expect(response.status).to eq(200) - expect(json_response['title']).to eq(milestone.title) - expect(json_response['iid']).to eq(milestone.iid) - end - - it 'should return 401 error if user not authenticated' do - get api("/projects/#{project.id}/milestones/#{milestone.id}") - expect(response.status).to eq(401) - end - - it 'should return a 404 error if milestone id not found' do - get api("/projects/#{project.id}/milestones/1234", user) - expect(response.status).to eq(404) - end - end - - describe 'POST /projects/:id/milestones' do - it 'should create a new project milestone' do - post api("/projects/#{project.id}/milestones", user), title: 'new milestone' - expect(response.status).to eq(201) - expect(json_response['title']).to eq('new milestone') - expect(json_response['description']).to be_nil - end - - it 'should create a new project milestone with description and due date' do - post api("/projects/#{project.id}/milestones", user), - title: 'new milestone', description: 'release', due_date: '2013-03-02' - expect(response.status).to eq(201) - expect(json_response['description']).to eq('release') - expect(json_response['due_date']).to eq('2013-03-02') - end - - it 'should return a 400 error if title is missing' do - post api("/projects/#{project.id}/milestones", user) - expect(response.status).to eq(400) - end - end - - describe 'PUT /projects/:id/milestones/:milestone_id' do - it 'should update a project milestone' do - put api("/projects/#{project.id}/milestones/#{milestone.id}", user), - title: 'updated title' - expect(response.status).to eq(200) - expect(json_response['title']).to eq('updated title') - end - - it 'should return a 404 error if milestone id not found' do - put api("/projects/#{project.id}/milestones/1234", user), - title: 'updated title' - expect(response.status).to eq(404) - end - end - - describe 'PUT /projects/:id/milestones/:milestone_id to close milestone' do - it 'should update a project milestone' do - put api("/projects/#{project.id}/milestones/#{milestone.id}", user), - state_event: 'close' - expect(response.status).to eq(200) - - expect(json_response['state']).to eq('closed') - end - end - - describe 'PUT /projects/:id/milestones/:milestone_id to test observer on close' do - it 'should create an activity event when an milestone is closed' do - expect(Event).to receive(:create) - - put api("/projects/#{project.id}/milestones/#{milestone.id}", user), - state_event: 'close' - end - end - - describe 'GET /projects/:id/milestones/:milestone_id/issues' do - before do - milestone.issues << create(:issue) - end - it 'should return project issues for a particular milestone' do - get api("/projects/#{project.id}/milestones/#{milestone.id}/issues", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['milestone']['title']).to eq(milestone.title) - end - - it 'should return a 401 error if user not authenticated' do - get api("/projects/#{project.id}/milestones/#{milestone.id}/issues") - expect(response.status).to eq(401) - end - end -end diff --git a/spec/requests/api/namespaces_spec.rb b/spec/requests/api/namespaces_spec.rb deleted file mode 100644 index 6ddaaa0a6dd..00000000000 --- a/spec/requests/api/namespaces_spec.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:admin) { create(:admin) } - let!(:group1) { create(:group) } - let!(:group2) { create(:group) } - - describe "GET /namespaces" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/namespaces") - expect(response.status).to eq(401) - end - end - - context "when authenticated as admin" do - it "admin: should return an array of all namespaces" do - get api("/namespaces", admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - - expect(json_response.length).to eq(Namespace.count) - end - end - end -end diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb deleted file mode 100644 index 8b177af4689..00000000000 --- a/spec/requests/api/notes_spec.rb +++ /dev/null @@ -1,188 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let!(:project) { create(:project, namespace: user.namespace ) } - let!(:issue) { create(:issue, project: project, author: user) } - let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) } - let!(:snippet) { create(:project_snippet, project: project, author: user) } - let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) } - let!(:merge_request_note) { create(:note, noteable: merge_request, project: project, author: user) } - let!(:snippet_note) { create(:note, noteable: snippet, project: project, author: user) } - before { project.team << [user, :reporter] } - - describe "GET /projects/:id/noteable/:noteable_id/notes" do - context "when noteable is an Issue" do - it "should return an array of issue notes" do - get api("/projects/#{project.id}/issues/#{issue.id}/notes", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['body']).to eq(issue_note.note) - end - - it "should return a 404 error when issue id not found" do - get api("/projects/#{project.id}/issues/123/notes", user) - expect(response.status).to eq(404) - end - end - - context "when noteable is a Snippet" do - it "should return an array of snippet notes" do - get api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['body']).to eq(snippet_note.note) - end - - it "should return a 404 error when snippet id not found" do - get api("/projects/#{project.id}/snippets/42/notes", user) - expect(response.status).to eq(404) - end - end - - context "when noteable is a Merge Request" do - it "should return an array of merge_requests notes" do - get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/notes", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['body']).to eq(merge_request_note.note) - end - - it "should return a 404 error if merge request id not found" do - get api("/projects/#{project.id}/merge_requests/4444/notes", user) - expect(response.status).to eq(404) - end - end - end - - describe "GET /projects/:id/noteable/:noteable_id/notes/:note_id" do - context "when noteable is an Issue" do - it "should return an issue note by id" do - get api("/projects/#{project.id}/issues/#{issue.id}/notes/#{issue_note.id}", user) - expect(response.status).to eq(200) - expect(json_response['body']).to eq(issue_note.note) - end - - it "should return a 404 error if issue note not found" do - get api("/projects/#{project.id}/issues/#{issue.id}/notes/123", user) - expect(response.status).to eq(404) - end - end - - context "when noteable is a Snippet" do - it "should return a snippet note by id" do - get api("/projects/#{project.id}/snippets/#{snippet.id}/notes/#{snippet_note.id}", user) - expect(response.status).to eq(200) - expect(json_response['body']).to eq(snippet_note.note) - end - - it "should return a 404 error if snippet note not found" do - get api("/projects/#{project.id}/snippets/#{snippet.id}/notes/123", user) - expect(response.status).to eq(404) - end - end - end - - describe "POST /projects/:id/noteable/:noteable_id/notes" do - context "when noteable is an Issue" do - it "should create a new issue note" do - post api("/projects/#{project.id}/issues/#{issue.id}/notes", user), body: 'hi!' - expect(response.status).to eq(201) - expect(json_response['body']).to eq('hi!') - expect(json_response['author']['username']).to eq(user.username) - end - - it "should return a 400 bad request error if body not given" do - post api("/projects/#{project.id}/issues/#{issue.id}/notes", user) - expect(response.status).to eq(400) - end - - it "should return a 401 unauthorized error if user not authenticated" do - post api("/projects/#{project.id}/issues/#{issue.id}/notes"), body: 'hi!' - expect(response.status).to eq(401) - end - end - - context "when noteable is a Snippet" do - it "should create a new snippet note" do - post api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user), body: 'hi!' - expect(response.status).to eq(201) - expect(json_response['body']).to eq('hi!') - expect(json_response['author']['username']).to eq(user.username) - end - - it "should return a 400 bad request error if body not given" do - post api("/projects/#{project.id}/snippets/#{snippet.id}/notes", user) - expect(response.status).to eq(400) - end - - it "should return a 401 unauthorized error if user not authenticated" do - post api("/projects/#{project.id}/snippets/#{snippet.id}/notes"), body: 'hi!' - expect(response.status).to eq(401) - end - end - end - - describe "POST /projects/:id/noteable/:noteable_id/notes to test observer on create" do - it "should create an activity event when an issue note is created" do - expect(Event).to receive(:create) - - post api("/projects/#{project.id}/issues/#{issue.id}/notes", user), body: 'hi!' - end - end - - describe 'PUT /projects/:id/noteable/:noteable_id/notes/:note_id' do - context 'when noteable is an Issue' do - it 'should return modified note' do - put api("/projects/#{project.id}/issues/#{issue.id}/"\ - "notes/#{issue_note.id}", user), body: 'Hello!' - expect(response.status).to eq(200) - expect(json_response['body']).to eq('Hello!') - end - - it 'should return a 404 error when note id not found' do - put api("/projects/#{project.id}/issues/#{issue.id}/notes/123", user), - body: 'Hello!' - expect(response.status).to eq(404) - end - - it 'should return a 400 bad request error if body not given' do - put api("/projects/#{project.id}/issues/#{issue.id}/"\ - "notes/#{issue_note.id}", user) - expect(response.status).to eq(400) - end - end - - context 'when noteable is a Snippet' do - it 'should return modified note' do - put api("/projects/#{project.id}/snippets/#{snippet.id}/"\ - "notes/#{snippet_note.id}", user), body: 'Hello!' - expect(response.status).to eq(200) - expect(json_response['body']).to eq('Hello!') - end - - it 'should return a 404 error when note id not found' do - put api("/projects/#{project.id}/snippets/#{snippet.id}/"\ - "notes/123", user), body: "Hello!" - expect(response.status).to eq(404) - end - end - - context 'when noteable is a Merge Request' do - it 'should return modified note' do - put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/"\ - "notes/#{merge_request_note.id}", user), body: 'Hello!' - expect(response.status).to eq(200) - expect(json_response['body']).to eq('Hello!') - end - - it 'should return a 404 error when note id not found' do - put api("/projects/#{project.id}/merge_requests/#{merge_request.id}/"\ - "notes/123", user), body: "Hello!" - expect(response.status).to eq(404) - end - end - end - -end diff --git a/spec/requests/api/project_hooks_spec.rb b/spec/requests/api/project_hooks_spec.rb deleted file mode 100644 index 81fe68de662..00000000000 --- a/spec/requests/api/project_hooks_spec.rb +++ /dev/null @@ -1,129 +0,0 @@ -require 'spec_helper' - -describe API::API, 'ProjectHooks', api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:user3) { create(:user) } - let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) } - let!(:hook) { create(:project_hook, project: project, url: "http://example.com") } - - before do - project.team << [user, :master] - project.team << [user3, :developer] - end - - describe "GET /projects/:id/hooks" do - context "authorized user" do - it "should return project hooks" do - get api("/projects/#{project.id}/hooks", user) - expect(response.status).to eq(200) - - expect(json_response).to be_an Array - expect(json_response.count).to eq(1) - expect(json_response.first['url']).to eq("http://example.com") - end - end - - context "unauthorized user" do - it "should not access project hooks" do - get api("/projects/#{project.id}/hooks", user3) - expect(response.status).to eq(403) - end - end - end - - describe "GET /projects/:id/hooks/:hook_id" do - context "authorized user" do - it "should return a project hook" do - get api("/projects/#{project.id}/hooks/#{hook.id}", user) - expect(response.status).to eq(200) - expect(json_response['url']).to eq(hook.url) - end - - it "should return a 404 error if hook id is not available" do - get api("/projects/#{project.id}/hooks/1234", user) - expect(response.status).to eq(404) - end - end - - context "unauthorized user" do - it "should not access an existing hook" do - get api("/projects/#{project.id}/hooks/#{hook.id}", user3) - expect(response.status).to eq(403) - end - end - - it "should return a 404 error if hook id is not available" do - get api("/projects/#{project.id}/hooks/1234", user) - expect(response.status).to eq(404) - end - end - - describe "POST /projects/:id/hooks" do - it "should add hook to project" do - expect { - post api("/projects/#{project.id}/hooks", user), - url: "http://example.com", issues_events: true - }.to change {project.hooks.count}.by(1) - expect(response.status).to eq(201) - end - - it "should return a 400 error if url not given" do - post api("/projects/#{project.id}/hooks", user) - expect(response.status).to eq(400) - end - - it "should return a 422 error if url not valid" do - post api("/projects/#{project.id}/hooks", user), "url" => "ftp://example.com" - expect(response.status).to eq(422) - end - end - - describe "PUT /projects/:id/hooks/:hook_id" do - it "should update an existing project hook" do - put api("/projects/#{project.id}/hooks/#{hook.id}", user), - url: 'http://example.org', push_events: false - expect(response.status).to eq(200) - expect(json_response['url']).to eq('http://example.org') - end - - it "should return 404 error if hook id not found" do - put api("/projects/#{project.id}/hooks/1234", user), url: 'http://example.org' - expect(response.status).to eq(404) - end - - it "should return 400 error if url is not given" do - put api("/projects/#{project.id}/hooks/#{hook.id}", user) - expect(response.status).to eq(400) - end - - it "should return a 422 error if url is not valid" do - put api("/projects/#{project.id}/hooks/#{hook.id}", user), url: 'ftp://example.com' - expect(response.status).to eq(422) - end - end - - describe "DELETE /projects/:id/hooks/:hook_id" do - it "should delete hook from project" do - expect { - delete api("/projects/#{project.id}/hooks/#{hook.id}", user) - }.to change {project.hooks.count}.by(-1) - expect(response.status).to eq(200) - end - - it "should return success when deleting hook" do - delete api("/projects/#{project.id}/hooks/#{hook.id}", user) - expect(response.status).to eq(200) - end - - it "should return success when deleting non existent hook" do - delete api("/projects/#{project.id}/hooks/42", user) - expect(response.status).to eq(200) - end - - it "should return a 405 error if hook id not given" do - delete api("/projects/#{project.id}/hooks", user) - expect(response.status).to eq(405) - end - end -end diff --git a/spec/requests/api/project_members_spec.rb b/spec/requests/api/project_members_spec.rb deleted file mode 100644 index 8419a364ed1..00000000000 --- a/spec/requests/api/project_members_spec.rb +++ /dev/null @@ -1,153 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:user3) { create(:user) } - let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) } - let(:project_member) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } - let(:project_member2) { create(:project_member, user: user3, project: project, access_level: ProjectMember::DEVELOPER) } - - describe "GET /projects/:id/members" do - before { project_member } - before { project_member2 } - - it "should return project team members" do - get api("/projects/#{project.id}/members", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.count).to eq(2) - expect(json_response.map { |u| u['username'] }).to include user.username - end - - it "finds team members with query string" do - get api("/projects/#{project.id}/members", user), query: user.username - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.count).to eq(1) - expect(json_response.first['username']).to eq(user.username) - end - - it "should return a 404 error if id not found" do - get api("/projects/9999/members", user) - expect(response.status).to eq(404) - end - end - - describe "GET /projects/:id/members/:user_id" do - before { project_member } - - it "should return project team member" do - get api("/projects/#{project.id}/members/#{user.id}", user) - expect(response.status).to eq(200) - expect(json_response['username']).to eq(user.username) - expect(json_response['access_level']).to eq(ProjectMember::MASTER) - end - - it "should return a 404 error if user id not found" do - get api("/projects/#{project.id}/members/1234", user) - expect(response.status).to eq(404) - end - end - - describe "POST /projects/:id/members" do - it "should add user to project team" do - expect { - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - }.to change { ProjectMember.count }.by(1) - - expect(response.status).to eq(201) - expect(json_response['username']).to eq(user2.username) - expect(json_response['access_level']).to eq(ProjectMember::DEVELOPER) - end - - it "should return a 201 status if user is already project member" do - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - expect { - post api("/projects/#{project.id}/members", user), user_id: user2.id, - access_level: ProjectMember::DEVELOPER - }.not_to change { ProjectMember.count } - - expect(response.status).to eq(201) - expect(json_response['username']).to eq(user2.username) - expect(json_response['access_level']).to eq(ProjectMember::DEVELOPER) - end - - it "should return a 400 error when user id is not given" do - post api("/projects/#{project.id}/members", user), access_level: ProjectMember::MASTER - expect(response.status).to eq(400) - end - - it "should return a 400 error when access level is not given" do - post api("/projects/#{project.id}/members", user), user_id: user2.id - expect(response.status).to eq(400) - end - - it "should return a 422 error when access level is not known" do - post api("/projects/#{project.id}/members", user), user_id: user2.id, access_level: 1234 - expect(response.status).to eq(422) - end - end - - describe "PUT /projects/:id/members/:user_id" do - before { project_member2 } - - it "should update project team member" do - put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: ProjectMember::MASTER - expect(response.status).to eq(200) - expect(json_response['username']).to eq(user3.username) - expect(json_response['access_level']).to eq(ProjectMember::MASTER) - end - - it "should return a 404 error if user_id is not found" do - put api("/projects/#{project.id}/members/1234", user), access_level: ProjectMember::MASTER - expect(response.status).to eq(404) - end - - it "should return a 400 error when access level is not given" do - put api("/projects/#{project.id}/members/#{user3.id}", user) - expect(response.status).to eq(400) - end - - it "should return a 422 error when access level is not known" do - put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: 123 - expect(response.status).to eq(422) - end - end - - describe "DELETE /projects/:id/members/:user_id" do - before { project_member } - before { project_member2 } - - it "should remove user from project team" do - expect { - delete api("/projects/#{project.id}/members/#{user3.id}", user) - }.to change { ProjectMember.count }.by(-1) - end - - it "should return 200 if team member is not part of a project" do - delete api("/projects/#{project.id}/members/#{user3.id}", user) - expect { - delete api("/projects/#{project.id}/members/#{user3.id}", user) - }.to_not change { ProjectMember.count } - end - - it "should return 200 if team member already removed" do - delete api("/projects/#{project.id}/members/#{user3.id}", user) - delete api("/projects/#{project.id}/members/#{user3.id}", user) - expect(response.status).to eq(200) - end - - it "should return 200 OK when the user was not member" do - expect { - delete api("/projects/#{project.id}/members/1000000", user) - }.to change { ProjectMember.count }.by(0) - expect(response.status).to eq(200) - expect(json_response['message']).to eq("Access revoked") - expect(json_response['id']).to eq(1000000) - end - end -end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb deleted file mode 100644 index cc387378d3a..00000000000 --- a/spec/requests/api/projects_spec.rb +++ /dev/null @@ -1,825 +0,0 @@ -# -*- coding: utf-8 -*- -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - include Gitlab::CurrentSettings - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:user3) { create(:user) } - let(:admin) { create(:admin) } - let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) } - let(:project2) { create(:project, path: 'project2', creator_id: user.id, namespace: user.namespace) } - let(:project3) { create(:project, path: 'project3', creator_id: user.id, namespace: user.namespace) } - let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') } - let(:project_member) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } - let(:project_member2) { create(:project_member, user: user3, project: project, access_level: ProjectMember::DEVELOPER) } - let(:user4) { create(:user) } - let(:project3) do - create(:project, - name: 'second_project', - path: 'second_project', - creator_id: user.id, - namespace: user.namespace, - merge_requests_enabled: false, - issues_enabled: false, wiki_enabled: false, - snippets_enabled: false, visibility_level: 0) - end - let(:project_member3) do - create(:project_member, - user: user4, - project: project3, - access_level: ProjectMember::MASTER) - end - let(:project4) do - create(:project, - name: 'third_project', - path: 'third_project', - creator_id: user4.id, - namespace: user4.namespace) - end - - describe 'GET /projects' do - before { project } - - context 'when unauthenticated' do - it 'should return authentication error' do - get api('/projects') - expect(response.status).to eq(401) - end - end - - context 'when authenticated' do - it 'should return an array of projects' do - get api('/projects', user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq(project.name) - expect(json_response.first['owner']['username']).to eq(user.username) - end - - it 'should include the project labels as the tag_list' do - get api('/projects', user) - response.status.should == 200 - json_response.should be_an Array - json_response.first.keys.should include('tag_list') - end - - context 'and using search' do - it 'should return searched project' do - get api('/projects', user), { search: project.name } - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(1) - end - end - - context 'and using sorting' do - before do - project2 - project3 - end - - it 'should return the correct order when sorted by id' do - get api('/projects', user), { order_by: 'id', sort: 'desc'} - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['id']).to eq(project3.id) - end - end - end - end - - describe 'GET /projects/all' do - before { project } - - context 'when unauthenticated' do - it 'should return authentication error' do - get api('/projects/all') - expect(response.status).to eq(401) - end - end - - context 'when authenticated as regular user' do - it 'should return authentication error' do - get api('/projects/all', user) - expect(response.status).to eq(403) - end - end - - context 'when authenticated as admin' do - it 'should return an array of all projects' do - get api('/projects/all', admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - project_name = project.name - - expect(json_response.detect { - |project| project['name'] == project_name - }['name']).to eq(project_name) - - expect(json_response.detect { - |project| project['owner']['username'] == user.username - }['owner']['username']).to eq(user.username) - end - end - end - - describe 'POST /projects' do - context 'maximum number of projects reached' do - it 'should not create new project and respond with 403' do - allow_any_instance_of(User).to receive(:projects_limit_left).and_return(0) - expect { - post api('/projects', user2), name: 'foo' - }.to change {Project.count}.by(0) - expect(response.status).to eq(403) - end - end - - it 'should create new project without path and return 201' do - expect { post api('/projects', user), name: 'foo' }. - to change { Project.count }.by(1) - expect(response.status).to eq(201) - end - - it 'should create last project before reaching project limit' do - allow_any_instance_of(User).to receive(:projects_limit_left).and_return(1) - post api('/projects', user2), name: 'foo' - expect(response.status).to eq(201) - end - - it 'should not create new project without name and return 400' do - expect { post api('/projects', user) }.to_not change { Project.count } - expect(response.status).to eq(400) - end - - it "should assign attributes to project" do - project = attributes_for(:project, { - path: 'camelCasePath', - description: Faker::Lorem.sentence, - issues_enabled: false, - merge_requests_enabled: false, - wiki_enabled: false - }) - - post api('/projects', user), project - - project.each_pair do |k,v| - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should set a project as public' do - project = attributes_for(:project, :public) - post api('/projects', user), project - expect(json_response['public']).to be_truthy - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - - it 'should set a project as public using :public' do - project = attributes_for(:project, { public: true }) - post api('/projects', user), project - expect(json_response['public']).to be_truthy - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - - it 'should set a project as internal' do - project = attributes_for(:project, :internal) - post api('/projects', user), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL) - end - - it 'should set a project as internal overriding :public' do - project = attributes_for(:project, :internal, { public: true }) - post api('/projects', user), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL) - end - - it 'should set a project as private' do - project = attributes_for(:project, :private) - post api('/projects', user), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) - end - - it 'should set a project as private using :public' do - project = attributes_for(:project, { public: false }) - post api('/projects', user), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) - end - - context 'when a visibility level is restricted' do - before do - @project = attributes_for(:project, { public: true }) - allow_any_instance_of(ApplicationSetting).to( - receive(:restricted_visibility_levels).and_return([20]) - ) - end - - it 'should not allow a non-admin to use a restricted visibility level' do - post api('/projects', user), @project - expect(response.status).to eq(400) - expect(json_response['message']['visibility_level'].first).to( - match('restricted by your GitLab administrator') - ) - end - - it 'should allow an admin to override restricted visibility settings' do - post api('/projects', admin), @project - expect(json_response['public']).to be_truthy - expect(json_response['visibility_level']).to( - eq(Gitlab::VisibilityLevel::PUBLIC) - ) - end - end - end - - describe 'POST /projects/user/:id' do - before { project } - before { admin } - - it 'should create new project without path and return 201' do - expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change {Project.count}.by(1) - expect(response.status).to eq(201) - end - - it 'should respond with 400 on failure and not project' do - expect { post api("/projects/user/#{user.id}", admin) }. - to_not change { Project.count } - - expect(response.status).to eq(400) - expect(json_response['message']['name']).to eq([ - 'can\'t be blank', - 'is too short (minimum is 0 characters)', - Gitlab::Regex.project_name_regex_message - ]) - expect(json_response['message']['path']).to eq([ - 'can\'t be blank', - 'is too short (minimum is 0 characters)', - Gitlab::Regex.send(:project_path_regex_message) - ]) - end - - it 'should assign attributes to project' do - project = attributes_for(:project, { - description: Faker::Lorem.sentence, - issues_enabled: false, - merge_requests_enabled: false, - wiki_enabled: false - }) - - post api("/projects/user/#{user.id}", admin), project - - project.each_pair do |k,v| - next if k == :path - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should set a project as public' do - project = attributes_for(:project, :public) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_truthy - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - - it 'should set a project as public using :public' do - project = attributes_for(:project, { public: true }) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_truthy - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - - it 'should set a project as internal' do - project = attributes_for(:project, :internal) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL) - end - - it 'should set a project as internal overriding :public' do - project = attributes_for(:project, :internal, { public: true }) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::INTERNAL) - end - - it 'should set a project as private' do - project = attributes_for(:project, :private) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) - end - - it 'should set a project as private using :public' do - project = attributes_for(:project, { public: false }) - post api("/projects/user/#{user.id}", admin), project - expect(json_response['public']).to be_falsey - expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) - end - end - - describe 'GET /projects/:id' do - before { project } - before { project_member } - - it 'should return a project by id' do - get api("/projects/#{project.id}", user) - expect(response.status).to eq(200) - expect(json_response['name']).to eq(project.name) - expect(json_response['owner']['username']).to eq(user.username) - end - - it 'should return a project by path name' do - get api("/projects/#{project.id}", user) - expect(response.status).to eq(200) - expect(json_response['name']).to eq(project.name) - end - - it 'should return a 404 error if not found' do - get api('/projects/42', user) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - - it 'should return a 404 error if user is not a member' do - other_user = create(:user) - get api("/projects/#{project.id}", other_user) - expect(response.status).to eq(404) - end - - describe 'permissions' do - context 'personal project' do - it 'Sets project access and returns 200' do - project.team << [user, :master] - get api("/projects/#{project.id}", user) - - expect(response.status).to eq(200) - expect(json_response['permissions']['project_access']['access_level']). - to eq(Gitlab::Access::MASTER) - expect(json_response['permissions']['group_access']).to be_nil - end - end - - context 'group project' do - it 'should set the owner and return 200' do - project2 = create(:project, group: create(:group)) - project2.group.add_owner(user) - get api("/projects/#{project2.id}", user) - - expect(response.status).to eq(200) - expect(json_response['permissions']['project_access']).to be_nil - expect(json_response['permissions']['group_access']['access_level']). - to eq(Gitlab::Access::OWNER) - end - end - end - end - - describe 'GET /projects/:id/events' do - before { project_member2 } - - it 'should return a project events' do - get api("/projects/#{project.id}/events", user) - expect(response.status).to eq(200) - json_event = json_response.first - - expect(json_event['action_name']).to eq('joined') - expect(json_event['project_id'].to_i).to eq(project.id) - expect(json_event['author_username']).to eq(user3.username) - end - - it 'should return a 404 error if not found' do - get api('/projects/42/events', user) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - - it 'should return a 404 error if user is not a member' do - other_user = create(:user) - get api("/projects/#{project.id}/events", other_user) - expect(response.status).to eq(404) - end - end - - describe 'GET /projects/:id/snippets' do - before { snippet } - - it 'should return an array of project snippets' do - get api("/projects/#{project.id}/snippets", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(snippet.title) - end - end - - describe 'GET /projects/:id/snippets/:snippet_id' do - it 'should return a project snippet' do - get api("/projects/#{project.id}/snippets/#{snippet.id}", user) - expect(response.status).to eq(200) - expect(json_response['title']).to eq(snippet.title) - end - - it 'should return a 404 error if snippet id not found' do - get api("/projects/#{project.id}/snippets/1234", user) - expect(response.status).to eq(404) - end - end - - describe 'POST /projects/:id/snippets' do - it 'should create a new project snippet' do - post api("/projects/#{project.id}/snippets", user), - title: 'api test', file_name: 'sample.rb', code: 'test', - visibility_level: '0' - expect(response.status).to eq(201) - expect(json_response['title']).to eq('api test') - end - - it 'should return a 400 error if invalid snippet is given' do - post api("/projects/#{project.id}/snippets", user) - expect(status).to eq(400) - end - end - - describe 'PUT /projects/:id/snippets/:shippet_id' do - it 'should update an existing project snippet' do - put api("/projects/#{project.id}/snippets/#{snippet.id}", user), - code: 'updated code' - expect(response.status).to eq(200) - expect(json_response['title']).to eq('example') - expect(snippet.reload.content).to eq('updated code') - end - - it 'should update an existing project snippet with new title' do - put api("/projects/#{project.id}/snippets/#{snippet.id}", user), - title: 'other api test' - expect(response.status).to eq(200) - expect(json_response['title']).to eq('other api test') - end - end - - describe 'DELETE /projects/:id/snippets/:snippet_id' do - before { snippet } - - it 'should delete existing project snippet' do - expect { - delete api("/projects/#{project.id}/snippets/#{snippet.id}", user) - }.to change { Snippet.count }.by(-1) - expect(response.status).to eq(200) - end - - it 'should return 404 when deleting unknown snippet id' do - delete api("/projects/#{project.id}/snippets/1234", user) - expect(response.status).to eq(404) - end - end - - describe 'GET /projects/:id/snippets/:snippet_id/raw' do - it 'should get a raw project snippet' do - get api("/projects/#{project.id}/snippets/#{snippet.id}/raw", user) - expect(response.status).to eq(200) - end - - it 'should return a 404 error if raw project snippet not found' do - get api("/projects/#{project.id}/snippets/5555/raw", user) - expect(response.status).to eq(404) - end - end - - describe :deploy_keys do - let(:deploy_keys_project) { create(:deploy_keys_project, project: project) } - let(:deploy_key) { deploy_keys_project.deploy_key } - - describe 'GET /projects/:id/keys' do - before { deploy_key } - - it 'should return array of ssh keys' do - get api("/projects/#{project.id}/keys", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(deploy_key.title) - end - end - - describe 'GET /projects/:id/keys/:key_id' do - it 'should return a single key' do - get api("/projects/#{project.id}/keys/#{deploy_key.id}", user) - expect(response.status).to eq(200) - expect(json_response['title']).to eq(deploy_key.title) - end - - it 'should return 404 Not Found with invalid ID' do - get api("/projects/#{project.id}/keys/404", user) - expect(response.status).to eq(404) - end - end - - describe 'POST /projects/:id/keys' do - it 'should not create an invalid ssh key' do - post api("/projects/#{project.id}/keys", user), { title: 'invalid key' } - expect(response.status).to eq(400) - expect(json_response['message']['key']).to eq([ - 'can\'t be blank', - 'is too short (minimum is 0 characters)', - 'is invalid' - ]) - end - - it 'should not create a key without title' do - post api("/projects/#{project.id}/keys", user), key: 'some key' - expect(response.status).to eq(400) - expect(json_response['message']['title']).to eq([ - 'can\'t be blank', - 'is too short (minimum is 0 characters)' - ]) - end - - it 'should create new ssh key' do - key_attrs = attributes_for :key - expect { - post api("/projects/#{project.id}/keys", user), key_attrs - }.to change{ project.deploy_keys.count }.by(1) - end - end - - describe 'DELETE /projects/:id/keys/:key_id' do - before { deploy_key } - - it 'should delete existing key' do - expect { - delete api("/projects/#{project.id}/keys/#{deploy_key.id}", user) - }.to change{ project.deploy_keys.count }.by(-1) - end - - it 'should return 404 Not Found with invalid ID' do - delete api("/projects/#{project.id}/keys/404", user) - expect(response.status).to eq(404) - end - end - end - - describe :fork_admin do - let(:project_fork_target) { create(:project) } - let(:project_fork_source) { create(:project, :public) } - - describe 'POST /projects/:id/fork/:forked_from_id' do - let(:new_project_fork_source) { create(:project, :public) } - - it "shouldn't available for non admin users" do - post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", user) - expect(response.status).to eq(403) - end - - it 'should allow project to be forked from an existing project' do - expect(project_fork_target.forked?).not_to be_truthy - post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin) - expect(response.status).to eq(201) - project_fork_target.reload - expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id) - expect(project_fork_target.forked_project_link).not_to be_nil - expect(project_fork_target.forked?).to be_truthy - end - - it 'should fail if forked_from project which does not exist' do - post api("/projects/#{project_fork_target.id}/fork/9999", admin) - expect(response.status).to eq(404) - end - - it 'should fail with 409 if already forked' do - post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin) - project_fork_target.reload - expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id) - post api("/projects/#{project_fork_target.id}/fork/#{new_project_fork_source.id}", admin) - expect(response.status).to eq(409) - project_fork_target.reload - expect(project_fork_target.forked_from_project.id).to eq(project_fork_source.id) - expect(project_fork_target.forked?).to be_truthy - end - end - - describe 'DELETE /projects/:id/fork' do - - it "shouldn't available for non admin users" do - delete api("/projects/#{project_fork_target.id}/fork", user) - expect(response.status).to eq(403) - end - - it 'should make forked project unforked' do - post api("/projects/#{project_fork_target.id}/fork/#{project_fork_source.id}", admin) - project_fork_target.reload - expect(project_fork_target.forked_from_project).not_to be_nil - expect(project_fork_target.forked?).to be_truthy - delete api("/projects/#{project_fork_target.id}/fork", admin) - expect(response.status).to eq(200) - project_fork_target.reload - expect(project_fork_target.forked_from_project).to be_nil - expect(project_fork_target.forked?).not_to be_truthy - end - - it 'should be idempotent if not forked' do - expect(project_fork_target.forked_from_project).to be_nil - delete api("/projects/#{project_fork_target.id}/fork", admin) - expect(response.status).to eq(200) - expect(project_fork_target.reload.forked_from_project).to be_nil - end - end - end - - describe 'GET /projects/search/:query' do - let!(:query) { 'query'} - let!(:search) { create(:empty_project, name: query, creator_id: user.id, namespace: user.namespace) } - let!(:pre) { create(:empty_project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) } - let!(:post) { create(:empty_project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) } - let!(:pre_post) { create(:empty_project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) } - let!(:unfound) { create(:empty_project, name: 'unfound', creator_id: user.id, namespace: user.namespace) } - let!(:internal) { create(:empty_project, :internal, name: "internal #{query}") } - let!(:unfound_internal) { create(:empty_project, :internal, name: 'unfound internal') } - let!(:public) { create(:empty_project, :public, name: "public #{query}") } - let!(:unfound_public) { create(:empty_project, :public, name: 'unfound public') } - - context 'when unauthenticated' do - it 'should return authentication error' do - get api("/projects/search/#{query}") - expect(response.status).to eq(401) - end - end - - context 'when authenticated' do - it 'should return an array of projects' do - get api("/projects/search/#{query}",user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.size).to eq(6) - json_response.each {|project| expect(project['name']).to match(/.*query.*/)} - end - end - - context 'when authenticated as a different user' do - it 'should return matching public projects' do - get api("/projects/search/#{query}", user2) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.size).to eq(2) - json_response.each {|project| expect(project['name']).to match(/(internal|public) query/)} - end - end - end - - describe 'PUT /projects/:id̈́' do - before { project } - before { user } - before { user3 } - before { user4 } - before { project3 } - before { project4 } - before { project_member3 } - before { project_member2 } - - context 'when unauthenticated' do - it 'should return authentication error' do - project_param = { name: 'bar' } - put api("/projects/#{project.id}"), project_param - expect(response.status).to eq(401) - end - end - - context 'when authenticated as project owner' do - it 'should update name' do - project_param = { name: 'bar' } - put api("/projects/#{project.id}", user), project_param - expect(response.status).to eq(200) - project_param.each_pair do |k, v| - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should update visibility_level' do - project_param = { visibility_level: 20 } - put api("/projects/#{project3.id}", user), project_param - expect(response.status).to eq(200) - project_param.each_pair do |k, v| - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should not update name to existing name' do - project_param = { name: project3.name } - put api("/projects/#{project.id}", user), project_param - expect(response.status).to eq(400) - expect(json_response['message']['name']).to eq(['has already been taken']) - end - - it 'should update path & name to existing path & name in different namespace' do - project_param = { path: project4.path, name: project4.name } - put api("/projects/#{project3.id}", user), project_param - expect(response.status).to eq(200) - project_param.each_pair do |k, v| - expect(json_response[k.to_s]).to eq(v) - end - end - end - - context 'when authenticated as project master' do - it 'should update path' do - project_param = { path: 'bar' } - put api("/projects/#{project3.id}", user4), project_param - expect(response.status).to eq(200) - project_param.each_pair do |k, v| - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should update other attributes' do - project_param = { issues_enabled: true, - wiki_enabled: true, - snippets_enabled: true, - merge_requests_enabled: true, - description: 'new description' } - - put api("/projects/#{project3.id}", user4), project_param - expect(response.status).to eq(200) - project_param.each_pair do |k, v| - expect(json_response[k.to_s]).to eq(v) - end - end - - it 'should not update path to existing path' do - project_param = { path: project.path } - put api("/projects/#{project3.id}", user4), project_param - expect(response.status).to eq(400) - expect(json_response['message']['path']).to eq(['has already been taken']) - end - - it 'should not update name' do - project_param = { name: 'bar' } - put api("/projects/#{project3.id}", user4), project_param - expect(response.status).to eq(403) - end - - it 'should not update visibility_level' do - project_param = { visibility_level: 20 } - put api("/projects/#{project3.id}", user4), project_param - expect(response.status).to eq(403) - end - end - - context 'when authenticated as project developer' do - it 'should not update other attributes' do - project_param = { path: 'bar', - issues_enabled: true, - wiki_enabled: true, - snippets_enabled: true, - merge_requests_enabled: true, - description: 'new description' } - put api("/projects/#{project.id}", user3), project_param - expect(response.status).to eq(403) - end - end - end - - describe 'DELETE /projects/:id' do - context 'when authenticated as user' do - it 'should remove project' do - expect(GitlabShellWorker).to( - receive(:perform_async).with(:remove_repository, - /#{project.path_with_namespace}/) - ).twice - - delete api("/projects/#{project.id}", user) - expect(response.status).to eq(200) - end - - it 'should not remove a project if not an owner' do - user3 = create(:user) - project.team << [user3, :developer] - delete api("/projects/#{project.id}", user3) - expect(response.status).to eq(403) - end - - it 'should not remove a non existing project' do - delete api('/projects/1328', user) - expect(response.status).to eq(404) - end - - it 'should not remove a project not attached to user' do - delete api("/projects/#{project.id}", user2) - expect(response.status).to eq(404) - end - end - - context 'when authenticated as admin' do - it 'should remove any existing project' do - delete api("/projects/#{project.id}", admin) - expect(response.status).to eq(200) - end - - it 'should not remove a non existing project' do - delete api('/projects/1328', admin) - expect(response.status).to eq(404) - end - end - end -end diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb deleted file mode 100644 index 09a79553f72..00000000000 --- a/spec/requests/api/repositories_spec.rb +++ /dev/null @@ -1,247 +0,0 @@ -require 'spec_helper' -require 'mime/types' - -describe API::API, api: true do - include ApiHelpers - include RepoHelpers - - let(:user) { create(:user) } - let(:user2) { create(:user) } - let!(:project) { create(:project, creator_id: user.id) } - let!(:master) { create(:project_member, user: user, project: project, access_level: ProjectMember::MASTER) } - let!(:guest) { create(:project_member, user: user2, project: project, access_level: ProjectMember::GUEST) } - - describe "GET /projects/:id/repository/tags" do - it "should return an array of project tags" do - get api("/projects/#{project.id}/repository/tags", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq(project.repo.tags.sort_by(&:name).reverse.first.name) - end - end - - describe 'POST /projects/:id/repository/tags' do - context 'lightweight tags' do - it 'should create a new tag' do - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'v7.0.1', - ref: 'master' - - expect(response.status).to eq(201) - expect(json_response['name']).to eq('v7.0.1') - end - end - - context 'annotated tag' do - it 'should create a new annotated tag' do - # Identity must be set in .gitconfig to create annotated tag. - repo_path = project.repository.path_to_repo - system(*%W(git --git-dir=#{repo_path} config user.name #{user.name})) - system(*%W(git --git-dir=#{repo_path} config user.email #{user.email})) - - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'v7.1.0', - ref: 'master', - message: 'Release 7.1.0' - - expect(response.status).to eq(201) - expect(json_response['name']).to eq('v7.1.0') - expect(json_response['message']).to eq('Release 7.1.0') - end - end - - it 'should deny for user without push access' do - post api("/projects/#{project.id}/repository/tags", user2), - tag_name: 'v1.9.0', - ref: '621491c677087aa243f165eab467bfdfbee00be1' - expect(response.status).to eq(403) - end - - it 'should return 400 if tag name is invalid' do - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'v 1.0.0', - ref: 'master' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Tag name invalid') - end - - it 'should return 400 if tag already exists' do - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'v8.0.0', - ref: 'master' - expect(response.status).to eq(201) - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'v8.0.0', - ref: 'master' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Tag already exists') - end - - it 'should return 400 if ref name is invalid' do - post api("/projects/#{project.id}/repository/tags", user), - tag_name: 'mytag', - ref: 'foo' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('Invalid reference name') - end - end - - describe "GET /projects/:id/repository/tree" do - context "authorized user" do - before { project.team << [user2, :reporter] } - - it "should return project commits" do - get api("/projects/#{project.id}/repository/tree", user) - expect(response.status).to eq(200) - - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq('encoding') - expect(json_response.first['type']).to eq('tree') - expect(json_response.first['mode']).to eq('040000') - end - - it 'should return a 404 for unknown ref' do - get api("/projects/#{project.id}/repository/tree?ref_name=foo", user) - expect(response.status).to eq(404) - - expect(json_response).to be_an Object - json_response['message'] == '404 Tree Not Found' - end - end - - context "unauthorized user" do - it "should not return project commits" do - get api("/projects/#{project.id}/repository/tree") - expect(response.status).to eq(401) - end - end - end - - describe "GET /projects/:id/repository/blobs/:sha" do - it "should get the raw file contents" do - get api("/projects/#{project.id}/repository/blobs/master?filepath=README.md", user) - expect(response.status).to eq(200) - end - - it "should return 404 for invalid branch_name" do - get api("/projects/#{project.id}/repository/blobs/invalid_branch_name?filepath=README.md", user) - expect(response.status).to eq(404) - end - - it "should return 404 for invalid file" do - get api("/projects/#{project.id}/repository/blobs/master?filepath=README.invalid", user) - expect(response.status).to eq(404) - end - - it "should return a 400 error if filepath is missing" do - get api("/projects/#{project.id}/repository/blobs/master", user) - expect(response.status).to eq(400) - end - end - - describe "GET /projects/:id/repository/commits/:sha/blob" do - it "should get the raw file contents" do - get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user) - expect(response.status).to eq(200) - end - end - - describe "GET /projects/:id/repository/raw_blobs/:sha" do - it "should get the raw file contents" do - get api("/projects/#{project.id}/repository/raw_blobs/#{sample_blob.oid}", user) - expect(response.status).to eq(200) - end - - it 'should return a 404 for unknown blob' do - get api("/projects/#{project.id}/repository/raw_blobs/123456", user) - expect(response.status).to eq(404) - - expect(json_response).to be_an Object - json_response['message'] == '404 Blob Not Found' - end - end - - describe "GET /projects/:id/repository/archive(.:format)?:sha" do - it "should get the archive" do - get api("/projects/#{project.id}/repository/archive", user) - repo_name = project.repository.name.gsub("\.git", "") - expect(response.status).to eq(200) - expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.tar.gz\"/) - expect(response.content_type).to eq(MIME::Types.type_for('file.tar.gz').first.content_type) - end - - it "should get the archive.zip" do - get api("/projects/#{project.id}/repository/archive.zip", user) - repo_name = project.repository.name.gsub("\.git", "") - expect(response.status).to eq(200) - expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.zip\"/) - expect(response.content_type).to eq(MIME::Types.type_for('file.zip').first.content_type) - end - - it "should get the archive.tar.bz2" do - get api("/projects/#{project.id}/repository/archive.tar.bz2", user) - repo_name = project.repository.name.gsub("\.git", "") - expect(response.status).to eq(200) - expect(response.headers['Content-Disposition']).to match(/filename\=\"#{repo_name}\-[^\.]+\.tar.bz2\"/) - expect(response.content_type).to eq(MIME::Types.type_for('file.tar.bz2').first.content_type) - end - - it "should return 404 for invalid sha" do - get api("/projects/#{project.id}/repository/archive/?sha=xxx", user) - expect(response.status).to eq(404) - end - end - - describe 'GET /projects/:id/repository/compare' do - it "should compare branches" do - get api("/projects/#{project.id}/repository/compare", user), from: 'master', to: 'feature' - expect(response.status).to eq(200) - expect(json_response['commits']).to be_present - expect(json_response['diffs']).to be_present - end - - it "should compare tags" do - get api("/projects/#{project.id}/repository/compare", user), from: 'v1.0.0', to: 'v1.1.0' - expect(response.status).to eq(200) - expect(json_response['commits']).to be_present - expect(json_response['diffs']).to be_present - end - - it "should compare commits" do - get api("/projects/#{project.id}/repository/compare", user), from: sample_commit.id, to: sample_commit.parent_id - expect(response.status).to eq(200) - expect(json_response['commits']).to be_empty - expect(json_response['diffs']).to be_empty - expect(json_response['compare_same_ref']).to be_falsey - end - - it "should compare commits in reverse order" do - get api("/projects/#{project.id}/repository/compare", user), from: sample_commit.parent_id, to: sample_commit.id - expect(response.status).to eq(200) - expect(json_response['commits']).to be_present - expect(json_response['diffs']).to be_present - end - - it "should compare same refs" do - get api("/projects/#{project.id}/repository/compare", user), from: 'master', to: 'master' - expect(response.status).to eq(200) - expect(json_response['commits']).to be_empty - expect(json_response['diffs']).to be_empty - expect(json_response['compare_same_ref']).to be_truthy - end - end - - describe 'GET /projects/:id/repository/contributors' do - it 'should return valid data' do - get api("/projects/#{project.id}/repository/contributors", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - contributor = json_response.first - expect(contributor['email']).to eq('dmitriy.zaporozhets@gmail.com') - expect(contributor['name']).to eq('Dmitriy Zaporozhets') - expect(contributor['commits']).to eq(13) - expect(contributor['additions']).to eq(0) - expect(contributor['deletions']).to eq(0) - end - end -end diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb deleted file mode 100644 index 51c543578df..00000000000 --- a/spec/requests/api/services_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require "spec_helper" - -describe API::API, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } - - describe "POST /projects/:id/services/gitlab-ci" do - it "should update gitlab-ci settings" do - put api("/projects/#{project.id}/services/gitlab-ci", user), token: 'secret-token', project_url: "http://ci.example.com/projects/1" - - expect(response.status).to eq(200) - end - - it "should return if required fields missing" do - put api("/projects/#{project.id}/services/gitlab-ci", user), project_url: "http://ci.example.com/projects/1", active: true - - expect(response.status).to eq(400) - end - end - - describe "DELETE /projects/:id/services/gitlab-ci" do - it "should update gitlab-ci settings" do - delete api("/projects/#{project.id}/services/gitlab-ci", user) - - expect(response.status).to eq(200) - expect(project.gitlab_ci_service).to be_nil - end - end - - describe 'PUT /projects/:id/services/hipchat' do - it 'should update hipchat settings' do - put api("/projects/#{project.id}/services/hipchat", user), - token: 'secret-token', room: 'test' - - expect(response.status).to eq(200) - expect(project.hipchat_service).not_to be_nil - end - - it 'should return if required fields missing' do - put api("/projects/#{project.id}/services/gitlab-ci", user), - token: 'secret-token', active: true - - expect(response.status).to eq(400) - end - end - - describe 'DELETE /projects/:id/services/hipchat' do - it 'should delete hipchat settings' do - delete api("/projects/#{project.id}/services/hipchat", user) - - expect(response.status).to eq(200) - expect(project.hipchat_service).to be_nil - end - end -end diff --git a/spec/requests/api/session_spec.rb b/spec/requests/api/session_spec.rb deleted file mode 100644 index fbd57b34a58..00000000000 --- a/spec/requests/api/session_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:user) { create(:user) } - - describe "POST /session" do - context "when valid password" do - it "should return private token" do - post api("/session"), email: user.email, password: '12345678' - expect(response.status).to eq(201) - - expect(json_response['email']).to eq(user.email) - expect(json_response['private_token']).to eq(user.private_token) - expect(json_response['is_admin']).to eq(user.is_admin?) - expect(json_response['can_create_project']).to eq(user.can_create_project?) - expect(json_response['can_create_group']).to eq(user.can_create_group?) - end - end - - context 'when email has case-typo and password is valid' do - it 'should return private token' do - post api('/session'), email: user.email.upcase, password: '12345678' - expect(response.status).to eq 201 - - expect(json_response['email']).to eq user.email - expect(json_response['private_token']).to eq user.private_token - expect(json_response['is_admin']).to eq user.is_admin? - expect(json_response['can_create_project']).to eq user.can_create_project? - expect(json_response['can_create_group']).to eq user.can_create_group? - end - end - - context 'when login has case-typo and password is valid' do - it 'should return private token' do - post api('/session'), login: user.username.upcase, password: '12345678' - expect(response.status).to eq 201 - - expect(json_response['email']).to eq user.email - expect(json_response['private_token']).to eq user.private_token - expect(json_response['is_admin']).to eq user.is_admin? - expect(json_response['can_create_project']).to eq user.can_create_project? - expect(json_response['can_create_group']).to eq user.can_create_group? - end - end - - context "when invalid password" do - it "should return authentication error" do - post api("/session"), email: user.email, password: '123' - expect(response.status).to eq(401) - - expect(json_response['email']).to be_nil - expect(json_response['private_token']).to be_nil - end - end - - context "when empty password" do - it "should return authentication error" do - post api("/session"), email: user.email - expect(response.status).to eq(401) - - expect(json_response['email']).to be_nil - expect(json_response['private_token']).to be_nil - end - end - - context "when empty name" do - it "should return authentication error" do - post api("/session"), password: user.password - expect(response.status).to eq(401) - - expect(json_response['email']).to be_nil - expect(json_response['private_token']).to be_nil - end - end - end -end diff --git a/spec/requests/api/system_hooks_spec.rb b/spec/requests/api/system_hooks_spec.rb deleted file mode 100644 index a9d86bbce6c..00000000000 --- a/spec/requests/api/system_hooks_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:user) { create(:user) } - let(:admin) { create(:admin) } - let!(:hook) { create(:system_hook, url: "http://example.com") } - - before { stub_request(:post, hook.url) } - - describe "GET /hooks" do - context "when no user" do - it "should return authentication error" do - get api("/hooks") - expect(response.status).to eq(401) - end - end - - context "when not an admin" do - it "should return forbidden error" do - get api("/hooks", user) - expect(response.status).to eq(403) - end - end - - context "when authenticated as admin" do - it "should return an array of hooks" do - get api("/hooks", admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['url']).to eq(hook.url) - end - end - end - - describe "POST /hooks" do - it "should create new hook" do - expect { - post api("/hooks", admin), url: 'http://example.com' - }.to change { SystemHook.count }.by(1) - end - - it "should respond with 400 if url not given" do - post api("/hooks", admin) - expect(response.status).to eq(400) - end - - it "should not create new hook without url" do - expect { - post api("/hooks", admin) - }.to_not change { SystemHook.count } - end - end - - describe "GET /hooks/:id" do - it "should return hook by id" do - get api("/hooks/#{hook.id}", admin) - expect(response.status).to eq(200) - expect(json_response['event_name']).to eq('project_create') - end - - it "should return 404 on failure" do - get api("/hooks/404", admin) - expect(response.status).to eq(404) - end - end - - describe "DELETE /hooks/:id" do - it "should delete a hook" do - expect { - delete api("/hooks/#{hook.id}", admin) - }.to change { SystemHook.count }.by(-1) - end - - it "should return success if hook id not found" do - delete api("/hooks/12345", admin) - expect(response.status).to eq(200) - end - end -end diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb deleted file mode 100644 index e6d5545f812..00000000000 --- a/spec/requests/api/users_spec.rb +++ /dev/null @@ -1,524 +0,0 @@ -require 'spec_helper' - -describe API::API, api: true do - include ApiHelpers - - let(:user) { create(:user) } - let(:admin) { create(:admin) } - let(:key) { create(:key, user: user) } - - describe "GET /users" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/users") - expect(response.status).to eq(401) - end - end - - context "when authenticated" do - it "should return an array of users" do - get api("/users", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - username = user.username - expect(json_response.detect { - |user| user['username'] == username - }['username']).to eq(username) - end - end - - context "when admin" do - it "should return an array of users" do - get api("/users", admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first.keys).to include 'email' - expect(json_response.first.keys).to include 'identities' - expect(json_response.first.keys).to include 'can_create_project' - end - end - end - - describe "GET /users/:id" do - it "should return a user by id" do - get api("/users/#{user.id}", user) - expect(response.status).to eq(200) - expect(json_response['username']).to eq(user.username) - end - - it "should return a 401 if unauthenticated" do - get api("/users/9998") - expect(response.status).to eq(401) - end - - it "should return a 404 error if user id not found" do - get api("/users/9999", user) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Not found') - end - end - - describe "POST /users" do - before{ admin } - - it "should create user" do - expect { - post api("/users", admin), attributes_for(:user, projects_limit: 3) - }.to change { User.count }.by(1) - end - - it "should create user with correct attributes" do - post api('/users', admin), attributes_for(:user, admin: true, can_create_group: true) - expect(response.status).to eq(201) - user_id = json_response['id'] - new_user = User.find(user_id) - expect(new_user).not_to eq(nil) - expect(new_user.admin).to eq(true) - expect(new_user.can_create_group).to eq(true) - end - - it "should create non-admin user" do - post api('/users', admin), attributes_for(:user, admin: false, can_create_group: false) - expect(response.status).to eq(201) - user_id = json_response['id'] - new_user = User.find(user_id) - expect(new_user).not_to eq(nil) - expect(new_user.admin).to eq(false) - expect(new_user.can_create_group).to eq(false) - end - - it "should create non-admin users by default" do - post api('/users', admin), attributes_for(:user) - expect(response.status).to eq(201) - user_id = json_response['id'] - new_user = User.find(user_id) - expect(new_user).not_to eq(nil) - expect(new_user.admin).to eq(false) - end - - it "should return 201 Created on success" do - post api("/users", admin), attributes_for(:user, projects_limit: 3) - expect(response.status).to eq(201) - end - - it "should not create user with invalid email" do - post api('/users', admin), - email: 'invalid email', - password: 'password', - name: 'test' - expect(response.status).to eq(400) - end - - it 'should return 400 error if name not given' do - post api('/users', admin), email: 'test@example.com', password: 'pass1234' - expect(response.status).to eq(400) - end - - it 'should return 400 error if password not given' do - post api('/users', admin), email: 'test@example.com', name: 'test' - expect(response.status).to eq(400) - end - - it "should return 400 error if email not given" do - post api('/users', admin), password: 'pass1234', name: 'test' - expect(response.status).to eq(400) - end - - it 'should return 400 error if user does not validate' do - post api('/users', admin), - password: 'pass', - email: 'test@example.com', - username: 'test!', - name: 'test', - bio: 'g' * 256, - projects_limit: -1 - expect(response.status).to eq(400) - expect(json_response['message']['password']). - to eq(['is too short (minimum is 8 characters)']) - expect(json_response['message']['bio']). - to eq(['is too long (maximum is 255 characters)']) - expect(json_response['message']['projects_limit']). - to eq(['must be greater than or equal to 0']) - expect(json_response['message']['username']). - to eq([Gitlab::Regex.send(:namespace_regex_message)]) - end - - it "shouldn't available for non admin users" do - post api("/users", user), attributes_for(:user) - expect(response.status).to eq(403) - end - - context 'with existing user' do - before do - post api('/users', admin), - email: 'test@example.com', - password: 'password', - username: 'test', - name: 'foo' - end - - it 'should return 409 conflict error if user with same email exists' do - expect { - post api('/users', admin), - name: 'foo', - email: 'test@example.com', - password: 'password', - username: 'foo' - }.to change { User.count }.by(0) - expect(response.status).to eq(409) - expect(json_response['message']).to eq('Email has already been taken') - end - - it 'should return 409 conflict error if same username exists' do - expect do - post api('/users', admin), - name: 'foo', - email: 'foo@example.com', - password: 'password', - username: 'test' - end.to change { User.count }.by(0) - expect(response.status).to eq(409) - expect(json_response['message']).to eq('Username has already been taken') - end - end - end - - describe "GET /users/sign_up" do - - it "should redirect to sign in page" do - get "/users/sign_up" - expect(response.status).to eq(302) - expect(response).to redirect_to(new_user_session_path) - end - end - - describe "PUT /users/:id" do - let!(:admin_user) { create(:admin) } - - before { admin } - - it "should update user with new bio" do - put api("/users/#{user.id}", admin), {bio: 'new test bio'} - expect(response.status).to eq(200) - expect(json_response['bio']).to eq('new test bio') - expect(user.reload.bio).to eq('new test bio') - end - - it 'should update user with his own email' do - put api("/users/#{user.id}", admin), email: user.email - expect(response.status).to eq(200) - expect(json_response['email']).to eq(user.email) - expect(user.reload.email).to eq(user.email) - end - - it 'should update user with his own username' do - put api("/users/#{user.id}", admin), username: user.username - expect(response.status).to eq(200) - expect(json_response['username']).to eq(user.username) - expect(user.reload.username).to eq(user.username) - end - - it "should update admin status" do - put api("/users/#{user.id}", admin), {admin: true} - expect(response.status).to eq(200) - expect(json_response['is_admin']).to eq(true) - expect(user.reload.admin).to eq(true) - end - - it "should not update admin status" do - put api("/users/#{admin_user.id}", admin), {can_create_group: false} - expect(response.status).to eq(200) - expect(json_response['is_admin']).to eq(true) - expect(admin_user.reload.admin).to eq(true) - expect(admin_user.can_create_group).to eq(false) - end - - it "should not allow invalid update" do - put api("/users/#{user.id}", admin), {email: 'invalid email'} - expect(response.status).to eq(400) - expect(user.reload.email).not_to eq('invalid email') - end - - it "shouldn't available for non admin users" do - put api("/users/#{user.id}", user), attributes_for(:user) - expect(response.status).to eq(403) - end - - it "should return 404 for non-existing user" do - put api("/users/999999", admin), {bio: 'update should fail'} - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Not found') - end - - it 'should return 400 error if user does not validate' do - put api("/users/#{user.id}", admin), - password: 'pass', - email: 'test@example.com', - username: 'test!', - name: 'test', - bio: 'g' * 256, - projects_limit: -1 - expect(response.status).to eq(400) - expect(json_response['message']['password']). - to eq(['is too short (minimum is 8 characters)']) - expect(json_response['message']['bio']). - to eq(['is too long (maximum is 255 characters)']) - expect(json_response['message']['projects_limit']). - to eq(['must be greater than or equal to 0']) - expect(json_response['message']['username']). - to eq([Gitlab::Regex.send(:namespace_regex_message)]) - end - - context "with existing user" do - before { - post api("/users", admin), { email: 'test@example.com', password: 'password', username: 'test', name: 'test' } - post api("/users", admin), { email: 'foo@bar.com', password: 'password', username: 'john', name: 'john' } - @user = User.all.last - } - - it 'should return 409 conflict error if email address exists' do - put api("/users/#{@user.id}", admin), email: 'test@example.com' - expect(response.status).to eq(409) - expect(@user.reload.email).to eq(@user.email) - end - - it 'should return 409 conflict error if username taken' do - @user_id = User.all.last.id - put api("/users/#{@user.id}", admin), username: 'test' - expect(response.status).to eq(409) - expect(@user.reload.username).to eq(@user.username) - end - end - end - - describe "POST /users/:id/keys" do - before { admin } - - it "should not create invalid ssh key" do - post api("/users/#{user.id}/keys", admin), { title: "invalid key" } - expect(response.status).to eq(400) - expect(json_response['message']).to eq('400 (Bad request) "key" not given') - end - - it 'should not create key without title' do - post api("/users/#{user.id}/keys", admin), key: 'some key' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('400 (Bad request) "title" not given') - end - - it "should create ssh key" do - key_attrs = attributes_for :key - expect { - post api("/users/#{user.id}/keys", admin), key_attrs - }.to change{ user.keys.count }.by(1) - end - end - - describe 'GET /user/:uid/keys' do - before { admin } - - context 'when unauthenticated' do - it 'should return authentication error' do - get api("/users/#{user.id}/keys") - expect(response.status).to eq(401) - end - end - - context 'when authenticated' do - it 'should return 404 for non-existing user' do - get api('/users/999999/keys', admin) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 User Not Found') - end - - it 'should return array of ssh keys' do - user.keys << key - user.save - get api("/users/#{user.id}/keys", admin) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first['title']).to eq(key.title) - end - end - end - - describe 'DELETE /user/:uid/keys/:id' do - before { admin } - - context 'when unauthenticated' do - it 'should return authentication error' do - delete api("/users/#{user.id}/keys/42") - expect(response.status).to eq(401) - end - end - - context 'when authenticated' do - it 'should delete existing key' do - user.keys << key - user.save - expect { - delete api("/users/#{user.id}/keys/#{key.id}", admin) - }.to change { user.keys.count }.by(-1) - expect(response.status).to eq(200) - end - - it 'should return 404 error if user not found' do - user.keys << key - user.save - delete api("/users/999999/keys/#{key.id}", admin) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 User Not Found') - end - - it 'should return 404 error if key not foud' do - delete api("/users/#{user.id}/keys/42", admin) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Key Not Found') - end - end - end - - describe "DELETE /users/:id" do - before { admin } - - it "should delete user" do - delete api("/users/#{user.id}", admin) - expect(response.status).to eq(200) - expect { User.find(user.id) }.to raise_error ActiveRecord::RecordNotFound - expect(json_response['email']).to eq(user.email) - end - - it "should not delete for unauthenticated user" do - delete api("/users/#{user.id}") - expect(response.status).to eq(401) - end - - it "shouldn't available for non admin users" do - delete api("/users/#{user.id}", user) - expect(response.status).to eq(403) - end - - it "should return 404 for non-existing user" do - delete api("/users/999999", admin) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 User Not Found') - end - end - - describe "GET /user" do - it "should return current user" do - get api("/user", user) - expect(response.status).to eq(200) - expect(json_response['email']).to eq(user.email) - expect(json_response['is_admin']).to eq(user.is_admin?) - expect(json_response['can_create_project']).to eq(user.can_create_project?) - expect(json_response['can_create_group']).to eq(user.can_create_group?) - expect(json_response['projects_limit']).to eq(user.projects_limit) - end - - it "should return 401 error if user is unauthenticated" do - get api("/user") - expect(response.status).to eq(401) - end - end - - describe "GET /user/keys" do - context "when unauthenticated" do - it "should return authentication error" do - get api("/user/keys") - expect(response.status).to eq(401) - end - end - - context "when authenticated" do - it "should return array of ssh keys" do - user.keys << key - user.save - get api("/user/keys", user) - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.first["title"]).to eq(key.title) - end - end - end - - describe "GET /user/keys/:id" do - it "should return single key" do - user.keys << key - user.save - get api("/user/keys/#{key.id}", user) - expect(response.status).to eq(200) - expect(json_response["title"]).to eq(key.title) - end - - it "should return 404 Not Found within invalid ID" do - get api("/user/keys/42", user) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Not found') - end - - it "should return 404 error if admin accesses user's ssh key" do - user.keys << key - user.save - admin - get api("/user/keys/#{key.id}", admin) - expect(response.status).to eq(404) - expect(json_response['message']).to eq('404 Not found') - end - end - - describe "POST /user/keys" do - it "should create ssh key" do - key_attrs = attributes_for :key - expect { - post api("/user/keys", user), key_attrs - }.to change{ user.keys.count }.by(1) - expect(response.status).to eq(201) - end - - it "should return a 401 error if unauthorized" do - post api("/user/keys"), title: 'some title', key: 'some key' - expect(response.status).to eq(401) - end - - it "should not create ssh key without key" do - post api("/user/keys", user), title: 'title' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('400 (Bad request) "key" not given') - end - - it 'should not create ssh key without title' do - post api('/user/keys', user), key: 'some key' - expect(response.status).to eq(400) - expect(json_response['message']).to eq('400 (Bad request) "title" not given') - end - - it "should not create ssh key without title" do - post api("/user/keys", user), key: "somekey" - expect(response.status).to eq(400) - end - end - - describe "DELETE /user/keys/:id" do - it "should delete existed key" do - user.keys << key - user.save - expect { - delete api("/user/keys/#{key.id}", user) - }.to change{user.keys.count}.by(-1) - expect(response.status).to eq(200) - end - - it "should return success if key ID not found" do - delete api("/user/keys/42", user) - expect(response.status).to eq(200) - end - - it "should return 401 error if unauthorized" do - user.keys << key - user.save - delete api("/user/keys/#{key.id}") - expect(response.status).to eq(401) - end - end -end diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb deleted file mode 100644 index bf8abcfb00f..00000000000 --- a/spec/routing/admin_routing_spec.rb +++ /dev/null @@ -1,121 +0,0 @@ -require 'spec_helper' - -# team_update_admin_user PUT /admin/users/:id/team_update(.:format) admin/users#team_update -# block_admin_user PUT /admin/users/:id/block(.:format) admin/users#block -# unblock_admin_user PUT /admin/users/:id/unblock(.:format) admin/users#unblock -# admin_users GET /admin/users(.:format) admin/users#index -# POST /admin/users(.:format) admin/users#create -# new_admin_user GET /admin/users/new(.:format) admin/users#new -# edit_admin_user GET /admin/users/:id/edit(.:format) admin/users#edit -# admin_user GET /admin/users/:id(.:format) admin/users#show -# PUT /admin/users/:id(.:format) admin/users#update -# DELETE /admin/users/:id(.:format) admin/users#destroy -describe Admin::UsersController, "routing" do - it "to #team_update" do - expect(put("/admin/users/1/team_update")).to route_to('admin/users#team_update', id: '1') - end - - it "to #block" do - expect(put("/admin/users/1/block")).to route_to('admin/users#block', id: '1') - end - - it "to #unblock" do - expect(put("/admin/users/1/unblock")).to route_to('admin/users#unblock', id: '1') - end - - it "to #index" do - expect(get("/admin/users")).to route_to('admin/users#index') - end - - it "to #show" do - expect(get("/admin/users/1")).to route_to('admin/users#show', id: '1') - end - - it "to #create" do - expect(post("/admin/users")).to route_to('admin/users#create') - end - - it "to #new" do - expect(get("/admin/users/new")).to route_to('admin/users#new') - end - - it "to #edit" do - expect(get("/admin/users/1/edit")).to route_to('admin/users#edit', id: '1') - end - - it "to #show" do - expect(get("/admin/users/1")).to route_to('admin/users#show', id: '1') - end - - it "to #update" do - expect(put("/admin/users/1")).to route_to('admin/users#update', id: '1') - end - - it "to #destroy" do - expect(delete("/admin/users/1")).to route_to('admin/users#destroy', id: '1') - end -end - -# team_admin_project GET /admin/projects/:id/team(.:format) admin/projects#team {id: /[^\/]+/} -# team_update_admin_project PUT /admin/projects/:id/team_update(.:format) admin/projects#team_update {id: /[^\/]+/} -# admin_projects GET /admin/projects(.:format) admin/projects#index {id: /[^\/]+/} -# POST /admin/projects(.:format) admin/projects#create {id: /[^\/]+/} -# new_admin_project GET /admin/projects/new(.:format) admin/projects#new {id: /[^\/]+/} -# edit_admin_project GET /admin/projects/:id/edit(.:format) admin/projects#edit {id: /[^\/]+/} -# admin_project GET /admin/projects/:id(.:format) admin/projects#show {id: /[^\/]+/} -# PUT /admin/projects/:id(.:format) admin/projects#update {id: /[^\/]+/} -# DELETE /admin/projects/:id(.:format) admin/projects#destroy {id: /[^\/]+/} -describe Admin::ProjectsController, "routing" do - it "to #index" do - expect(get("/admin/projects")).to route_to('admin/projects#index') - end - - it "to #show" do - expect(get("/admin/projects/gitlab")).to route_to('admin/projects#show', namespace_id: 'gitlab') - end -end - -# admin_hook_test GET /admin/hooks/:hook_id/test(.:format) admin/hooks#test -# admin_hooks GET /admin/hooks(.:format) admin/hooks#index -# POST /admin/hooks(.:format) admin/hooks#create -# admin_hook DELETE /admin/hooks/:id(.:format) admin/hooks#destroy -describe Admin::HooksController, "routing" do - it "to #test" do - expect(get("/admin/hooks/1/test")).to route_to('admin/hooks#test', hook_id: '1') - end - - it "to #index" do - expect(get("/admin/hooks")).to route_to('admin/hooks#index') - end - - it "to #create" do - expect(post("/admin/hooks")).to route_to('admin/hooks#create') - end - - it "to #destroy" do - expect(delete("/admin/hooks/1")).to route_to('admin/hooks#destroy', id: '1') - end - -end - -# admin_logs GET /admin/logs(.:format) admin/logs#show -describe Admin::LogsController, "routing" do - it "to #show" do - expect(get("/admin/logs")).to route_to('admin/logs#show') - end -end - -# admin_background_jobs GET /admin/background_jobs(.:format) admin/background_jobs#show -describe Admin::BackgroundJobsController, "routing" do - it "to #show" do - expect(get("/admin/background_jobs")).to route_to('admin/background_jobs#show') - end -end - -# admin_root /admin(.:format) admin/dashboard#index -describe Admin::DashboardController, "routing" do - it "to #index" do - expect(get("/admin")).to route_to('admin/dashboard#index') - end -end - diff --git a/spec/routing/notifications_routing_spec.rb b/spec/routing/notifications_routing_spec.rb deleted file mode 100644 index 24592942a96..00000000000 --- a/spec/routing/notifications_routing_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require "spec_helper" - -describe Profiles::NotificationsController do - describe "routing" do - it "routes to #show" do - expect(get("/profile/notifications")).to route_to("profiles/notifications#show") - end - - it "routes to #update" do - expect(put("/profile/notifications")).to route_to("profiles/notifications#update") - end - end -end diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb deleted file mode 100644 index 042352311da..00000000000 --- a/spec/routing/project_routing_spec.rb +++ /dev/null @@ -1,492 +0,0 @@ -require 'spec_helper' - -# Shared examples for a resource inside a Project -# -# By default it tests all the default REST actions: index, create, new, edit, -# show, update, and destroy. You can remove actions by customizing the -# `actions` variable. -# -# It also expects a `controller` variable to be available which defines both -# the path to the resource as well as the controller name. -# -# Examples -# -# # Default behavior -# it_behaves_like 'RESTful project resources' do -# let(:controller) { 'issues' } -# end -# -# # Customizing actions -# it_behaves_like 'RESTful project resources' do -# let(:actions) { [:index] } -# let(:controller) { 'issues' } -# end -shared_examples 'RESTful project resources' do - let(:actions) { [:index, :create, :new, :edit, :show, :update, :destroy] } - - it 'to #index' do - expect(get("/gitlab/gitlabhq/#{controller}")).to route_to("projects/#{controller}#index", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:index) - end - - it 'to #create' do - expect(post("/gitlab/gitlabhq/#{controller}")).to route_to("projects/#{controller}#create", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:create) - end - - it 'to #new' do - expect(get("/gitlab/gitlabhq/#{controller}/new")).to route_to("projects/#{controller}#new", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:new) - end - - it 'to #edit' do - expect(get("/gitlab/gitlabhq/#{controller}/1/edit")).to route_to("projects/#{controller}#edit", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:edit) - end - - it 'to #show' do - expect(get("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#show", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:show) - end - - it 'to #update' do - expect(put("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#update", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:update) - end - - it 'to #destroy' do - expect(delete("/gitlab/gitlabhq/#{controller}/1")).to route_to("projects/#{controller}#destroy", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:destroy) - end -end - -# projects POST /projects(.:format) projects#create -# new_project GET /projects/new(.:format) projects#new -# files_project GET /:id/files(.:format) projects#files -# edit_project GET /:id/edit(.:format) projects#edit -# project GET /:id(.:format) projects#show -# PUT /:id(.:format) projects#update -# DELETE /:id(.:format) projects#destroy -# markdown_preview_project POST /:id/markdown_preview(.:format) projects#markdown_preview -describe ProjectsController, 'routing' do - it 'to #create' do - expect(post('/projects')).to route_to('projects#create') - end - - it 'to #new' do - expect(get('/projects/new')).to route_to('projects#new') - end - - it 'to #edit' do - expect(get('/gitlab/gitlabhq/edit')).to route_to('projects#edit', namespace_id: 'gitlab', id: 'gitlabhq') - end - - it 'to #autocomplete_sources' do - expect(get('/gitlab/gitlabhq/autocomplete_sources')).to route_to('projects#autocomplete_sources', namespace_id: 'gitlab', id: 'gitlabhq') - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq')).to route_to('projects#show', namespace_id: 'gitlab', id: 'gitlabhq') - end - - it 'to #update' do - expect(put('/gitlab/gitlabhq')).to route_to('projects#update', namespace_id: 'gitlab', id: 'gitlabhq') - end - - it 'to #destroy' do - expect(delete('/gitlab/gitlabhq')).to route_to('projects#destroy', namespace_id: 'gitlab', id: 'gitlabhq') - end - - it 'to #markdown_preview' do - expect(post('/gitlab/gitlabhq/markdown_preview')).to( - route_to('projects#markdown_preview', namespace_id: 'gitlab', id: 'gitlabhq') - ) - end -end - -# pages_project_wikis GET /:project_id/wikis/pages(.:format) projects/wikis#pages -# history_project_wiki GET /:project_id/wikis/:id/history(.:format) projects/wikis#history -# project_wikis POST /:project_id/wikis(.:format) projects/wikis#create -# edit_project_wiki GET /:project_id/wikis/:id/edit(.:format) projects/wikis#edit -# project_wiki GET /:project_id/wikis/:id(.:format) projects/wikis#show -# DELETE /:project_id/wikis/:id(.:format) projects/wikis#destroy -describe Projects::WikisController, 'routing' do - it 'to #pages' do - expect(get('/gitlab/gitlabhq/wikis/pages')).to route_to('projects/wikis#pages', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #history' do - expect(get('/gitlab/gitlabhq/wikis/1/history')).to route_to('projects/wikis#history', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it_behaves_like 'RESTful project resources' do - let(:actions) { [:create, :edit, :show, :destroy] } - let(:controller) { 'wikis' } - end -end - -# branches_project_repository GET /:project_id/repository/branches(.:format) projects/repositories#branches -# tags_project_repository GET /:project_id/repository/tags(.:format) projects/repositories#tags -# archive_project_repository GET /:project_id/repository/archive(.:format) projects/repositories#archive -# edit_project_repository GET /:project_id/repository/edit(.:format) projects/repositories#edit -describe Projects::RepositoriesController, 'routing' do - it 'to #archive' do - expect(get('/gitlab/gitlabhq/repository/archive')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #archive format:zip' do - expect(get('/gitlab/gitlabhq/repository/archive.zip')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq', format: 'zip') - end - - it 'to #archive format:tar.bz2' do - expect(get('/gitlab/gitlabhq/repository/archive.tar.bz2')).to route_to('projects/repositories#archive', namespace_id: 'gitlab', project_id: 'gitlabhq', format: 'tar.bz2') - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq/repository')).to route_to('projects/repositories#show', namespace_id: 'gitlab', project_id: 'gitlabhq') - end -end - -describe Projects::BranchesController, 'routing' do - it 'to #branches' do - expect(get('/gitlab/gitlabhq/branches')).to route_to('projects/branches#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - expect(delete('/gitlab/gitlabhq/branches/feature%2345')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') - expect(delete('/gitlab/gitlabhq/branches/feature%2B45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') - expect(delete('/gitlab/gitlabhq/branches/feature@45')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') - expect(delete('/gitlab/gitlabhq/branches/feature%2345/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/branches/feature%2B45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/branches/feature@45/foo/bar/baz')).to route_to('projects/branches#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') - end -end - -describe Projects::TagsController, 'routing' do - it 'to #tags' do - expect(get('/gitlab/gitlabhq/tags')).to route_to('projects/tags#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - expect(delete('/gitlab/gitlabhq/tags/feature%2345')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') - expect(delete('/gitlab/gitlabhq/tags/feature%2B45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') - expect(delete('/gitlab/gitlabhq/tags/feature@45')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') - expect(delete('/gitlab/gitlabhq/tags/feature%2345/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/tags/feature%2B45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45/foo/bar/baz') - expect(delete('/gitlab/gitlabhq/tags/feature@45/foo/bar/baz')).to route_to('projects/tags#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45/foo/bar/baz') - end -end - - -# project_deploy_keys GET /:project_id/deploy_keys(.:format) deploy_keys#index -# POST /:project_id/deploy_keys(.:format) deploy_keys#create -# new_project_deploy_key GET /:project_id/deploy_keys/new(.:format) deploy_keys#new -# project_deploy_key GET /:project_id/deploy_keys/:id(.:format) deploy_keys#show -# DELETE /:project_id/deploy_keys/:id(.:format) deploy_keys#destroy -describe Projects::DeployKeysController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:actions) { [:index, :show, :new, :create] } - let(:controller) { 'deploy_keys' } - end -end - -# project_protected_branches GET /:project_id/protected_branches(.:format) protected_branches#index -# POST /:project_id/protected_branches(.:format) protected_branches#create -# project_protected_branch DELETE /:project_id/protected_branches/:id(.:format) protected_branches#destroy -describe Projects::ProtectedBranchesController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:actions) { [:index, :create, :destroy] } - let(:controller) { 'protected_branches' } - end -end - -# switch_project_refs GET /:project_id/refs/switch(.:format) refs#switch -# logs_tree_project_ref GET /:project_id/refs/:id/logs_tree(.:format) refs#logs_tree -# logs_file_project_ref GET /:project_id/refs/:id/logs_tree/:path(.:format) refs#logs_tree -describe Projects::RefsController, 'routing' do - it 'to #switch' do - expect(get('/gitlab/gitlabhq/refs/switch')).to route_to('projects/refs#switch', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #logs_tree' do - expect(get('/gitlab/gitlabhq/refs/stable/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable') - expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45') - expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45') - expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45') - expect(get('/gitlab/gitlabhq/refs/stable/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable', path: 'foo/bar/baz') - expect(get('/gitlab/gitlabhq/refs/feature%2345/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature#45', path: 'foo/bar/baz') - expect(get('/gitlab/gitlabhq/refs/feature%2B45/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature+45', path: 'foo/bar/baz') - expect(get('/gitlab/gitlabhq/refs/feature@45/logs_tree/foo/bar/baz')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'feature@45', path: 'foo/bar/baz') - expect(get('/gitlab/gitlabhq/refs/stable/logs_tree/files.scss')).to route_to('projects/refs#logs_tree', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'stable', path: 'files.scss') - end -end - -# diffs_project_merge_request GET /:project_id/merge_requests/:id/diffs(.:format) projects/merge_requests#diffs -# automerge_project_merge_request POST /:project_id/merge_requests/:id/automerge(.:format) projects/merge_requests#automerge -# automerge_check_project_merge_request GET /:project_id/merge_requests/:id/automerge_check(.:format) projects/merge_requests#automerge_check -# branch_from_project_merge_requests GET /:project_id/merge_requests/branch_from(.:format) projects/merge_requests#branch_from -# branch_to_project_merge_requests GET /:project_id/merge_requests/branch_to(.:format) projects/merge_requests#branch_to -# project_merge_requests GET /:project_id/merge_requests(.:format) projects/merge_requests#index -# POST /:project_id/merge_requests(.:format) projects/merge_requests#create -# new_project_merge_request GET /:project_id/merge_requests/new(.:format) projects/merge_requests#new -# edit_project_merge_request GET /:project_id/merge_requests/:id/edit(.:format) projects/merge_requests#edit -# project_merge_request GET /:project_id/merge_requests/:id(.:format) projects/merge_requests#show -# PUT /:project_id/merge_requests/:id(.:format) projects/merge_requests#update -# DELETE /:project_id/merge_requests/:id(.:format) projects/merge_requests#destroy -describe Projects::MergeRequestsController, 'routing' do - it 'to #diffs' do - expect(get('/gitlab/gitlabhq/merge_requests/1/diffs')).to route_to('projects/merge_requests#diffs', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #automerge' do - expect(post('/gitlab/gitlabhq/merge_requests/1/automerge')).to route_to( - 'projects/merge_requests#automerge', - namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1' - ) - end - - it 'to #automerge_check' do - expect(get('/gitlab/gitlabhq/merge_requests/1/automerge_check')).to route_to('projects/merge_requests#automerge_check', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #branch_from' do - expect(get('/gitlab/gitlabhq/merge_requests/branch_from')).to route_to('projects/merge_requests#branch_from', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #branch_to' do - expect(get('/gitlab/gitlabhq/merge_requests/branch_to')).to route_to('projects/merge_requests#branch_to', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq/merge_requests/1.diff')).to route_to('projects/merge_requests#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1', format: 'diff') - expect(get('/gitlab/gitlabhq/merge_requests/1.patch')).to route_to('projects/merge_requests#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1', format: 'patch') - end - - it_behaves_like 'RESTful project resources' do - let(:controller) { 'merge_requests' } - let(:actions) { [:index, :create, :new, :edit, :show, :update] } - end -end - -# raw_project_snippet GET /:project_id/snippets/:id/raw(.:format) snippets#raw -# project_snippets GET /:project_id/snippets(.:format) snippets#index -# POST /:project_id/snippets(.:format) snippets#create -# new_project_snippet GET /:project_id/snippets/new(.:format) snippets#new -# edit_project_snippet GET /:project_id/snippets/:id/edit(.:format) snippets#edit -# project_snippet GET /:project_id/snippets/:id(.:format) snippets#show -# PUT /:project_id/snippets/:id(.:format) snippets#update -# DELETE /:project_id/snippets/:id(.:format) snippets#destroy -describe SnippetsController, 'routing' do - it 'to #raw' do - expect(get('/gitlab/gitlabhq/snippets/1/raw')).to route_to('projects/snippets#raw', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #index' do - expect(get('/gitlab/gitlabhq/snippets')).to route_to('projects/snippets#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #create' do - expect(post('/gitlab/gitlabhq/snippets')).to route_to('projects/snippets#create', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #new' do - expect(get('/gitlab/gitlabhq/snippets/new')).to route_to('projects/snippets#new', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #edit' do - expect(get('/gitlab/gitlabhq/snippets/1/edit')).to route_to('projects/snippets#edit', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #update' do - expect(put('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#update', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it 'to #destroy' do - expect(delete('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end -end - -# test_project_hook GET /:project_id/hooks/:id/test(.:format) hooks#test -# project_hooks GET /:project_id/hooks(.:format) hooks#index -# POST /:project_id/hooks(.:format) hooks#create -# project_hook DELETE /:project_id/hooks/:id(.:format) hooks#destroy -describe Projects::HooksController, 'routing' do - it 'to #test' do - expect(get('/gitlab/gitlabhq/hooks/1/test')).to route_to('projects/hooks#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') - end - - it_behaves_like 'RESTful project resources' do - let(:actions) { [:index, :create, :destroy] } - let(:controller) { 'hooks' } - end -end - -# project_commit GET /:project_id/commit/:id(.:format) commit#show {id: /[[:alnum:]]{6,40}/, project_id: /[^\/]+/} -describe Projects::CommitController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/commit/4246fb')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb') - expect(get('/gitlab/gitlabhq/commit/4246fb.diff')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb', format: 'diff') - expect(get('/gitlab/gitlabhq/commit/4246fb.patch')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fb', format: 'patch') - expect(get('/gitlab/gitlabhq/commit/4246fbd13872934f72a8fd0d6fb1317b47b59cb5')).to route_to('projects/commit#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '4246fbd13872934f72a8fd0d6fb1317b47b59cb5') - end -end - -# patch_project_commit GET /:project_id/commits/:id/patch(.:format) commits#patch -# project_commits GET /:project_id/commits(.:format) commits#index -# POST /:project_id/commits(.:format) commits#create -# project_commit GET /:project_id/commits/:id(.:format) commits#show -describe Projects::CommitsController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:actions) { [:show] } - let(:controller) { 'commits' } - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq/commits/master.atom')).to route_to('projects/commits#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'atom') - end -end - -# project_project_members GET /:project_id/project_members(.:format) project_members#index -# POST /:project_id/project_members(.:format) project_members#create -# PUT /:project_id/project_members/:id(.:format) project_members#update -# DELETE /:project_id/project_members/:id(.:format) project_members#destroy -describe Projects::ProjectMembersController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:actions) { [:index, :create, :update, :destroy] } - let(:controller) { 'project_members' } - end -end - -# project_milestones GET /:project_id/milestones(.:format) milestones#index -# POST /:project_id/milestones(.:format) milestones#create -# new_project_milestone GET /:project_id/milestones/new(.:format) milestones#new -# edit_project_milestone GET /:project_id/milestones/:id/edit(.:format) milestones#edit -# project_milestone GET /:project_id/milestones/:id(.:format) milestones#show -# PUT /:project_id/milestones/:id(.:format) milestones#update -# DELETE /:project_id/milestones/:id(.:format) milestones#destroy -describe Projects::MilestonesController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:controller) { 'milestones' } - let(:actions) { [:index, :create, :new, :edit, :show, :update] } - end -end - -# project_labels GET /:project_id/labels(.:format) labels#index -describe Projects::LabelsController, 'routing' do - it 'to #index' do - expect(get('/gitlab/gitlabhq/labels')).to route_to('projects/labels#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - end -end - -# sort_project_issues POST /:project_id/issues/sort(.:format) issues#sort -# bulk_update_project_issues POST /:project_id/issues/bulk_update(.:format) issues#bulk_update -# search_project_issues GET /:project_id/issues/search(.:format) issues#search -# project_issues GET /:project_id/issues(.:format) issues#index -# POST /:project_id/issues(.:format) issues#create -# new_project_issue GET /:project_id/issues/new(.:format) issues#new -# edit_project_issue GET /:project_id/issues/:id/edit(.:format) issues#edit -# project_issue GET /:project_id/issues/:id(.:format) issues#show -# PUT /:project_id/issues/:id(.:format) issues#update -# DELETE /:project_id/issues/:id(.:format) issues#destroy -describe Projects::IssuesController, 'routing' do - it 'to #bulk_update' do - expect(post('/gitlab/gitlabhq/issues/bulk_update')).to route_to('projects/issues#bulk_update', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it_behaves_like 'RESTful project resources' do - let(:controller) { 'issues' } - let(:actions) { [:index, :create, :new, :edit, :show, :update] } - end -end - -# project_notes GET /:project_id/notes(.:format) notes#index -# POST /:project_id/notes(.:format) notes#create -# project_note DELETE /:project_id/notes/:id(.:format) notes#destroy -describe Projects::NotesController, 'routing' do - it_behaves_like 'RESTful project resources' do - let(:actions) { [:index, :create, :destroy] } - let(:controller) { 'notes' } - end -end - -# project_blame GET /:project_id/blame/:id(.:format) blame#show {id: /.+/, project_id: /[^\/]+/} -describe Projects::BlameController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/blame/master/app/models/project.rb')).to route_to('projects/blame#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb') - expect(get('/gitlab/gitlabhq/blame/master/files.scss')).to route_to('projects/blame#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss') - end -end - -# project_blob GET /:project_id/blob/:id(.:format) blob#show {id: /.+/, project_id: /[^\/]+/} -describe Projects::BlobController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/blob/master/app/models/project.rb')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb') - expect(get('/gitlab/gitlabhq/blob/master/app/models/compare.rb')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/compare.rb') - expect(get('/gitlab/gitlabhq/blob/master/app/models/diff.js')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/diff.js') - expect(get('/gitlab/gitlabhq/blob/master/files.scss')).to route_to('projects/blob#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss') - end -end - -# project_tree GET /:project_id/tree/:id(.:format) tree#show {id: /.+/, project_id: /[^\/]+/} -describe Projects::TreeController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/tree/master/app/models/project.rb')).to route_to('projects/tree#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/app/models/project.rb') - expect(get('/gitlab/gitlabhq/tree/master/files.scss')).to route_to('projects/tree#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master/files.scss') - end -end - -describe Projects::BlobController, 'routing' do - it 'to #edit' do - expect(get('/gitlab/gitlabhq/edit/master/app/models/project.rb')).to( - route_to('projects/blob#edit', - namespace_id: 'gitlab', project_id: 'gitlabhq', - id: 'master/app/models/project.rb')) - end - - it 'to #preview' do - expect(post('/gitlab/gitlabhq/preview/master/app/models/project.rb')).to( - route_to('projects/blob#preview', - namespace_id: 'gitlab', project_id: 'gitlabhq', - id: 'master/app/models/project.rb')) - end -end - -# project_compare_index GET /:project_id/compare(.:format) compare#index {id: /[^\/]+/, project_id: /[^\/]+/} -# POST /:project_id/compare(.:format) compare#create {id: /[^\/]+/, project_id: /[^\/]+/} -# project_compare /:project_id/compare/:from...:to(.:format) compare#show {from: /.+/, to: /.+/, id: /[^\/]+/, project_id: /[^\/]+/} -describe Projects::CompareController, 'routing' do - it 'to #index' do - expect(get('/gitlab/gitlabhq/compare')).to route_to('projects/compare#index', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #compare' do - expect(post('/gitlab/gitlabhq/compare')).to route_to('projects/compare#create', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #show' do - expect(get('/gitlab/gitlabhq/compare/master...stable')).to route_to('projects/compare#show', namespace_id: 'gitlab', project_id: 'gitlabhq', from: 'master', to: 'stable') - expect(get('/gitlab/gitlabhq/compare/issue/1234...stable')).to route_to('projects/compare#show', namespace_id: 'gitlab', project_id: 'gitlabhq', from: 'issue/1234', to: 'stable') - end -end - -describe Projects::NetworkController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/network/master')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') - expect(get('/gitlab/gitlabhq/network/master.json')).to route_to('projects/network#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master', format: 'json') - end -end - -describe Projects::GraphsController, 'routing' do - it 'to #show' do - expect(get('/gitlab/gitlabhq/graphs/master')).to route_to('projects/graphs#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: 'master') - end -end - -describe Projects::ForksController, 'routing' do - it 'to #new' do - expect(get('/gitlab/gitlabhq/fork/new')).to route_to('projects/forks#new', namespace_id: 'gitlab', project_id: 'gitlabhq') - end - - it 'to #create' do - expect(post('/gitlab/gitlabhq/fork')).to route_to('projects/forks#create', namespace_id: 'gitlab', project_id: 'gitlabhq') - end -end - -# project_avatar DELETE /project/avatar(.:format) projects/avatars#destroy -describe Projects::AvatarsController, 'routing' do - it 'to #destroy' do - expect(delete('/gitlab/gitlabhq/avatar')).to route_to( - 'projects/avatars#destroy', namespace_id: 'gitlab', project_id: 'gitlabhq') - end -end diff --git a/spec/services/archive_repository_service_spec.rb b/spec/services/archive_repository_service_spec.rb deleted file mode 100644 index f168a913976..00000000000 --- a/spec/services/archive_repository_service_spec.rb +++ /dev/null @@ -1,93 +0,0 @@ -require 'spec_helper' - -describe ArchiveRepositoryService do - let(:project) { create(:project) } - subject { ArchiveRepositoryService.new(project, "master", "zip") } - - describe "#execute" do - it "cleans old archives" do - expect(project.repository).to receive(:clean_old_archives) - - subject.execute(timeout: 0.0) - end - - context "when the repository doesn't have an archive file path" do - before do - allow(project.repository).to receive(:archive_file_path).and_return(nil) - end - - it "raises an error" do - expect { - subject.execute(timeout: 0.0) - }.to raise_error - end - end - - context "when the repository has an archive file path" do - let(:file_path) { "/archive.zip" } - let(:pid_file_path) { "/archive.zip.pid" } - - before do - allow(project.repository).to receive(:archive_file_path).and_return(file_path) - allow(project.repository).to receive(:archive_pid_file_path).and_return(pid_file_path) - end - - context "when the archive file already exists" do - before do - allow(File).to receive(:exist?).with(file_path).and_return(true) - end - - it "returns the file path" do - expect(subject.execute(timeout: 0.0)).to eq(file_path) - end - end - - context "when the archive file doesn't exist yet" do - before do - allow(File).to receive(:exist?).with(file_path).and_return(false) - allow(File).to receive(:exist?).with(pid_file_path).and_return(true) - end - - context "when the archive pid file doesn't exist yet" do - before do - allow(File).to receive(:exist?).with(pid_file_path).and_return(false) - end - - it "queues the RepositoryArchiveWorker" do - expect(RepositoryArchiveWorker).to receive(:perform_async) - - subject.execute(timeout: 0.0) - end - end - - context "when the archive pid file already exists" do - it "doesn't queue the RepositoryArchiveWorker" do - expect(RepositoryArchiveWorker).not_to receive(:perform_async) - - subject.execute(timeout: 0.0) - end - end - - context "when the archive file exists after a little while" do - before do - Thread.new do - sleep 0.1 - allow(File).to receive(:exist?).with(file_path).and_return(true) - end - end - - it "returns the file path" do - expect(subject.execute(timeout: 0.2)).to eq(file_path) - end - end - - context "when the archive file doesn't exist after the timeout" do - it "returns nil" do - expect(subject.execute(timeout: 0.0)).to eq(nil) - end - end - end - end - end -end - diff --git a/spec/services/create_snippet_service_spec.rb b/spec/services/create_snippet_service_spec.rb deleted file mode 100644 index 08689c15ca8..00000000000 --- a/spec/services/create_snippet_service_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -describe CreateSnippetService do - before do - @user = create :user - @admin = create :user, admin: true - @opts = { - title: 'Test snippet', - file_name: 'snippet.rb', - content: 'puts "hello world"', - visibility_level: Gitlab::VisibilityLevel::PRIVATE - } - end - - context 'When public visibility is restricted' do - before do - allow_any_instance_of(ApplicationSetting).to( - receive(:restricted_visibility_levels).and_return( - [Gitlab::VisibilityLevel::PUBLIC] - ) - ) - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - end - - it 'non-admins should not be able to create a public snippet' do - snippet = create_snippet(nil, @user, @opts) - expect(snippet.errors.messages).to have_key(:visibility_level) - expect(snippet.errors.messages[:visibility_level].first).to( - match('Public visibility has been restricted') - ) - end - - it 'admins should be able to create a public snippet' do - snippet = create_snippet(nil, @admin, @opts) - expect(snippet.errors.any?).to be_falsey - expect(snippet.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - end - - def create_snippet(project, user, opts) - CreateSnippetService.new(project, user, opts).execute - end -end diff --git a/spec/services/event_create_service_spec.rb b/spec/services/event_create_service_spec.rb deleted file mode 100644 index 007a9eed192..00000000000 --- a/spec/services/event_create_service_spec.rb +++ /dev/null @@ -1,103 +0,0 @@ -require 'spec_helper' - -describe EventCreateService do - let(:service) { EventCreateService.new } - - describe 'Issues' do - describe :open_issue do - let(:issue) { create(:issue) } - - it { expect(service.open_issue(issue, issue.author)).to be_truthy } - - it "should create new event" do - expect { service.open_issue(issue, issue.author) }.to change { Event.count } - end - end - - describe :close_issue do - let(:issue) { create(:issue) } - - it { expect(service.close_issue(issue, issue.author)).to be_truthy } - - it "should create new event" do - expect { service.close_issue(issue, issue.author) }.to change { Event.count } - end - end - - describe :reopen_issue do - let(:issue) { create(:issue) } - - it { expect(service.reopen_issue(issue, issue.author)).to be_truthy } - - it "should create new event" do - expect { service.reopen_issue(issue, issue.author) }.to change { Event.count } - end - end - end - - describe 'Merge Requests' do - describe :open_mr do - let(:merge_request) { create(:merge_request) } - - it { expect(service.open_mr(merge_request, merge_request.author)).to be_truthy } - - it "should create new event" do - expect { service.open_mr(merge_request, merge_request.author) }.to change { Event.count } - end - end - - describe :close_mr do - let(:merge_request) { create(:merge_request) } - - it { expect(service.close_mr(merge_request, merge_request.author)).to be_truthy } - - it "should create new event" do - expect { service.close_mr(merge_request, merge_request.author) }.to change { Event.count } - end - end - - describe :merge_mr do - let(:merge_request) { create(:merge_request) } - - it { expect(service.merge_mr(merge_request, merge_request.author)).to be_truthy } - - it "should create new event" do - expect { service.merge_mr(merge_request, merge_request.author) }.to change { Event.count } - end - end - - describe :reopen_mr do - let(:merge_request) { create(:merge_request) } - - it { expect(service.reopen_mr(merge_request, merge_request.author)).to be_truthy } - - it "should create new event" do - expect { service.reopen_mr(merge_request, merge_request.author) }.to change { Event.count } - end - end - end - - describe 'Milestone' do - let(:user) { create :user } - - describe :open_milestone do - let(:milestone) { create(:milestone) } - - it { expect(service.open_milestone(milestone, user)).to be_truthy } - - it "should create new event" do - expect { service.open_milestone(milestone, user) }.to change { Event.count } - end - end - - describe :close_mr do - let(:milestone) { create(:milestone) } - - it { expect(service.close_milestone(milestone, user)).to be_truthy } - - it "should create new event" do - expect { service.close_milestone(milestone, user) }.to change { Event.count } - end - end - end -end diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb deleted file mode 100644 index aa9b15dd9ec..00000000000 --- a/spec/services/git_push_service_spec.rb +++ /dev/null @@ -1,238 +0,0 @@ -require 'spec_helper' - -describe GitPushService do - include RepoHelpers - - let (:user) { create :user } - let (:project) { create :project } - let (:service) { GitPushService.new } - - before do - @blankrev = Gitlab::Git::BLANK_SHA - @oldrev = sample_commit.parent_id - @newrev = sample_commit.id - @ref = 'refs/heads/master' - end - - describe 'Push branches' do - context 'new branch' do - subject do - service.execute(project, user, @blankrev, @newrev, @ref) - end - - it { is_expected.to be_truthy } - end - - context 'existing branch' do - subject do - service.execute(project, user, @oldrev, @newrev, @ref) - end - - it { is_expected.to be_truthy } - end - - context 'rm branch' do - subject do - service.execute(project, user, @oldrev, @blankrev, @ref) - end - - it { is_expected.to be_truthy } - end - end - - describe "Git Push Data" do - before do - service.execute(project, user, @oldrev, @newrev, @ref) - @push_data = service.push_data - @commit = project.repository.commit(@newrev) - end - - subject { @push_data } - - it { is_expected.to include(object_kind: 'push') } - it { is_expected.to include(before: @oldrev) } - it { is_expected.to include(after: @newrev) } - it { is_expected.to include(ref: @ref) } - it { is_expected.to include(user_id: user.id) } - it { is_expected.to include(user_name: user.name) } - it { is_expected.to include(project_id: project.id) } - - context "with repository data" do - subject { @push_data[:repository] } - - it { is_expected.to include(name: project.name) } - it { is_expected.to include(url: project.url_to_repo) } - it { is_expected.to include(description: project.description) } - it { is_expected.to include(homepage: project.web_url) } - end - - context "with commits" do - subject { @push_data[:commits] } - - it { is_expected.to be_an(Array) } - it 'has 1 element' do - expect(subject.size).to eq(1) - end - - context "the commit" do - subject { @push_data[:commits].first } - - it { is_expected.to include(id: @commit.id) } - it { is_expected.to include(message: @commit.safe_message) } - it { is_expected.to include(timestamp: @commit.date.xmlschema) } - it do - is_expected.to include( - url: [ - Gitlab.config.gitlab.url, - project.namespace.to_param, - project.to_param, - 'commit', - @commit.id - ].join('/') - ) - end - - context "with a author" do - subject { @push_data[:commits].first[:author] } - - it { is_expected.to include(name: @commit.author_name) } - it { is_expected.to include(email: @commit.author_email) } - end - end - end - end - - describe "Push Event" do - before do - service.execute(project, user, @oldrev, @newrev, @ref) - @event = Event.last - end - - it { expect(@event).not_to be_nil } - it { expect(@event.project).to eq(project) } - it { expect(@event.action).to eq(Event::PUSHED) } - it { expect(@event.data).to eq(service.push_data) } - end - - describe "Web Hooks" do - context "execute web hooks" do - it "when pushing a branch for the first time" do - expect(project).to receive(:execute_hooks) - expect(project.default_branch).to eq("master") - expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false }) - service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') - end - - it "when pushing a branch for the first time with default branch protection disabled" do - ApplicationSetting.any_instance.stub(default_branch_protection: 0) - - expect(project).to receive(:execute_hooks) - expect(project.default_branch).to eq("master") - expect(project.protected_branches).not_to receive(:create) - service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') - end - - it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do - ApplicationSetting.any_instance.stub(default_branch_protection: 1) - - expect(project).to receive(:execute_hooks) - expect(project.default_branch).to eq("master") - expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: true }) - service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') - end - - it "when pushing new commits to existing branch" do - expect(project).to receive(:execute_hooks) - service.execute(project, user, 'oldrev', 'newrev', 'refs/heads/master') - end - end - end - - describe "cross-reference notes" do - let(:issue) { create :issue, project: project } - let(:commit_author) { create :user } - let(:commit) { project.repository.commit } - - before do - commit.stub({ - safe_message: "this commit \n mentions ##{issue.id}", - references: [issue], - author_name: commit_author.name, - author_email: commit_author.email - }) - project.repository.stub(commits_between: [commit]) - end - - it "creates a note if a pushed commit mentions an issue" do - expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author, project) - - service.execute(project, user, @oldrev, @newrev, @ref) - end - - it "only creates a cross-reference note if one doesn't already exist" do - Note.create_cross_reference_note(issue, commit, user, project) - - expect(Note).not_to receive(:create_cross_reference_note).with(issue, commit, commit_author, project) - - service.execute(project, user, @oldrev, @newrev, @ref) - end - - it "defaults to the pushing user if the commit's author is not known" do - commit.stub(author_name: 'unknown name', author_email: 'unknown@email.com') - expect(Note).to receive(:create_cross_reference_note).with(issue, commit, user, project) - - service.execute(project, user, @oldrev, @newrev, @ref) - end - - it "finds references in the first push to a non-default branch" do - allow(project.repository).to receive(:commits_between).with(@blankrev, @newrev).and_return([]) - allow(project.repository).to receive(:commits_between).with("master", @newrev).and_return([commit]) - - expect(Note).to receive(:create_cross_reference_note).with(issue, commit, commit_author, project) - - service.execute(project, user, @blankrev, @newrev, 'refs/heads/other') - end - end - - describe "closing issues from pushed commits" do - let(:issue) { create :issue, project: project } - let(:other_issue) { create :issue, project: project } - let(:commit_author) { create :user } - let(:closing_commit) { project.repository.commit } - - before do - closing_commit.stub({ - issue_closing_regex: /^([Cc]loses|[Ff]ixes) #\d+/, - safe_message: "this is some work.\n\ncloses ##{issue.iid}", - author_name: commit_author.name, - author_email: commit_author.email - }) - - project.repository.stub(commits_between: [closing_commit]) - end - - it "closes issues with commit messages" do - service.execute(project, user, @oldrev, @newrev, @ref) - - expect(Issue.find(issue.id)).to be_closed - end - - it "doesn't create cross-reference notes for a closing reference" do - expect { - service.execute(project, user, @oldrev, @newrev, @ref) - }.not_to change { Note.where(project_id: project.id, system: true, commit_id: closing_commit.id).count } - end - - it "doesn't close issues when pushed to non-default branches" do - project.stub(default_branch: 'durf') - - # The push still shouldn't create cross-reference notes. - expect { - service.execute(project, user, @oldrev, @newrev, 'refs/heads/hurf') - }.not_to change { Note.where(project_id: project.id, system: true).count } - - expect(Issue.find(issue.id)).to be_opened - end - end -end - diff --git a/spec/services/git_tag_push_service_spec.rb b/spec/services/git_tag_push_service_spec.rb deleted file mode 100644 index a050fdf6c0e..00000000000 --- a/spec/services/git_tag_push_service_spec.rb +++ /dev/null @@ -1,89 +0,0 @@ -require 'spec_helper' - -describe GitTagPushService do - include RepoHelpers - - let (:user) { create :user } - let (:project) { create :project } - let (:service) { GitTagPushService.new } - - before do - @oldrev = Gitlab::Git::BLANK_SHA - @newrev = "8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b" # gitlab-test: git rev-parse refs/tags/v1.1.0 - @ref = 'refs/tags/v1.1.0' - end - - describe "Git Tag Push Data" do - before do - service.execute(project, user, @oldrev, @newrev, @ref) - @push_data = service.push_data - @tag_name = Gitlab::Git.ref_name(@ref) - @tag = project.repository.find_tag(@tag_name) - @commit = project.repository.commit(@tag.target) - end - - subject { @push_data } - - it { is_expected.to include(object_kind: 'tag_push') } - it { is_expected.to include(ref: @ref) } - it { is_expected.to include(before: @oldrev) } - it { is_expected.to include(after: @newrev) } - it { is_expected.to include(message: @tag.message) } - it { is_expected.to include(user_id: user.id) } - it { is_expected.to include(user_name: user.name) } - it { is_expected.to include(project_id: project.id) } - - context "with repository data" do - subject { @push_data[:repository] } - - it { is_expected.to include(name: project.name) } - it { is_expected.to include(url: project.url_to_repo) } - it { is_expected.to include(description: project.description) } - it { is_expected.to include(homepage: project.web_url) } - end - - context "with commits" do - subject { @push_data[:commits] } - - it { is_expected.to be_an(Array) } - it 'has 1 element' do - expect(subject.size).to eq(1) - end - - context "the commit" do - subject { @push_data[:commits].first } - - it { is_expected.to include(id: @commit.id) } - it { is_expected.to include(message: @commit.safe_message) } - it { is_expected.to include(timestamp: @commit.date.xmlschema) } - it do - is_expected.to include( - url: [ - Gitlab.config.gitlab.url, - project.namespace.to_param, - project.to_param, - 'commit', - @commit.id - ].join('/') - ) - end - - context "with a author" do - subject { @push_data[:commits].first[:author] } - - it { is_expected.to include(name: @commit.author_name) } - it { is_expected.to include(email: @commit.author_email) } - end - end - end - end - - describe "Web Hooks" do - context "execute web hooks" do - it "when pushing tags" do - expect(project).to receive(:execute_hooks) - service.execute(project, user, 'oldrev', 'newrev', 'refs/tags/v1.0.0') - end - end - end -end diff --git a/spec/services/issues/bulk_update_service_spec.rb b/spec/services/issues/bulk_update_service_spec.rb deleted file mode 100644 index a97c55011c9..00000000000 --- a/spec/services/issues/bulk_update_service_spec.rb +++ /dev/null @@ -1,121 +0,0 @@ -require 'spec_helper' - -describe Issues::BulkUpdateService do - let(:issue) { - create(:issue, project: @project) - } - - before do - @user = create :user - opts = { - name: "GitLab", - namespace: @user.namespace - } - @project = Projects::CreateService.new(@user, opts).execute - end - - describe :close_issue do - - before do - @issues = 5.times.collect do - create(:issue, project: @project) - end - @params = { - state_event: 'close', - issues_ids: @issues.map(&:id) - } - end - - it { - result = Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(result[:success]).to be_truthy - expect(result[:count]).to eq(@issues.count) - - expect(@project.issues.opened).to be_empty - expect(@project.issues.closed).not_to be_empty - } - - end - - describe :reopen_issues do - - before do - @issues = 5.times.collect do - create(:closed_issue, project: @project) - end - @params = { - state_event: 'reopen', - issues_ids: @issues.map(&:id) - } - end - - it { - result = Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(result[:success]).to be_truthy - expect(result[:count]).to eq(@issues.count) - - expect(@project.issues.closed).to be_empty - expect(@project.issues.opened).not_to be_empty - } - - end - - describe :update_assignee do - - before do - @new_assignee = create :user - @params = { - issues_ids: [issue.id], - assignee_id: @new_assignee.id - } - end - - it { - result = Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(result[:success]).to be_truthy - expect(result[:count]).to eq(1) - - expect(@project.issues.first.assignee).to eq(@new_assignee) - } - - it 'allows mass-unassigning' do - @project.issues.first.update_attribute(:assignee, @new_assignee) - expect(@project.issues.first.assignee).not_to be_nil - - @params[:assignee_id] = -1 - - Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(@project.issues.first.assignee).to be_nil - end - - it 'does not unassign when assignee_id is not present' do - @project.issues.first.update_attribute(:assignee, @new_assignee) - expect(@project.issues.first.assignee).not_to be_nil - - @params[:assignee_id] = '' - - Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(@project.issues.first.assignee).not_to be_nil - end - end - - describe :update_milestone do - - before do - @milestone = create :milestone - @params = { - issues_ids: [issue.id], - milestone_id: @milestone.id - } - end - - it { - result = Issues::BulkUpdateService.new(@project, @user, @params).execute - expect(result[:success]).to be_truthy - expect(result[:count]).to eq(1) - - expect(@project.issues.first.milestone).to eq(@milestone) - } - end - -end diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb deleted file mode 100644 index d15dff1b52b..00000000000 --- a/spec/services/issues/close_service_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' - -describe Issues::CloseService do - let(:project) { create(:empty_project) } - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:issue) { create(:issue, assignee: user2) } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context "valid params" do - before do - @issue = Issues::CloseService.new(project, user, {}).execute(issue) - end - - it { expect(@issue).to be_valid } - it { expect(@issue).to be_closed } - - it 'should send email to user2 about assign of new issue' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(issue.title) - end - - it 'should create system note about issue reassign' do - note = @issue.notes.last - expect(note.note).to include "Status changed to closed" - end - end - end -end diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb deleted file mode 100644 index 7f1ebcb3198..00000000000 --- a/spec/services/issues/create_service_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'spec_helper' - -describe Issues::CreateService do - let(:project) { create(:empty_project) } - let(:user) { create(:user) } - - describe :execute do - context "valid params" do - before do - project.team << [user, :master] - opts = { - title: 'Awesome issue', - description: 'please fix' - } - - @issue = Issues::CreateService.new(project, user, opts).execute - end - - it { expect(@issue).to be_valid } - it { expect(@issue.title).to eq('Awesome issue') } - end - end -end diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb deleted file mode 100644 index 22b89bec96d..00000000000 --- a/spec/services/issues/update_service_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -require 'spec_helper' - -describe Issues::UpdateService do - let(:project) { create(:empty_project) } - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:issue) { create(:issue) } - let(:label) { create(:label) } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context "valid params" do - before do - opts = { - title: 'New title', - description: 'Also please fix', - assignee_id: user2.id, - state_event: 'close', - label_ids: [label.id] - } - - @issue = Issues::UpdateService.new(project, user, opts).execute(issue) - @issue.reload - end - - it { expect(@issue).to be_valid } - it { expect(@issue.title).to eq('New title') } - it { expect(@issue.assignee).to eq(user2) } - it { expect(@issue).to be_closed } - it { expect(@issue.labels.count).to eq(1) } - it { expect(@issue.labels.first.title).to eq('Bug') } - - it 'should send email to user2 about assign of new issue' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(issue.title) - end - - it 'should create system note about issue reassign' do - note = @issue.notes.last - expect(note.note).to include "Reassigned to \@#{user2.username}" - end - - it 'should create system note about issue label edit' do - note = @issue.notes[1] - expect(note.note).to include "Added ~#{label.id} label" - end - end - end -end diff --git a/spec/services/merge_requests/close_service_spec.rb b/spec/services/merge_requests/close_service_spec.rb deleted file mode 100644 index b3cbfd4b5b8..00000000000 --- a/spec/services/merge_requests/close_service_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::CloseService do - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:merge_request) { create(:merge_request, assignee: user2) } - let(:project) { merge_request.project } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context 'valid params' do - let(:service) { MergeRequests::CloseService.new(project, user, {}) } - - before do - allow(service).to receive(:execute_hooks) - - @merge_request = service.execute(merge_request) - end - - it { expect(@merge_request).to be_valid } - it { expect(@merge_request).to be_closed } - - it 'should execute hooks with close action' do - expect(service).to have_received(:execute_hooks). - with(@merge_request, 'close') - end - - it 'should send email to user2 about assign of new merge_request' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(merge_request.title) - end - - it 'should create system note about merge_request reassign' do - note = @merge_request.notes.last - expect(note.note).to include 'Status changed to closed' - end - end - end -end diff --git a/spec/services/merge_requests/create_service_spec.rb b/spec/services/merge_requests/create_service_spec.rb deleted file mode 100644 index d9bfdf64308..00000000000 --- a/spec/services/merge_requests/create_service_spec.rb +++ /dev/null @@ -1,34 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::CreateService do - let(:project) { create(:project) } - let(:user) { create(:user) } - - describe :execute do - context 'valid params' do - let(:opts) do - { - title: 'Awesome merge_request', - description: 'please fix', - source_branch: 'stable', - target_branch: 'master' - } - end - let(:service) { MergeRequests::CreateService.new(project, user, opts) } - - before do - project.team << [user, :master] - allow(service).to receive(:execute_hooks) - - @merge_request = service.execute - end - - it { expect(@merge_request).to be_valid } - it { expect(@merge_request.title).to eq('Awesome merge_request') } - - it 'should execute hooks with default action' do - expect(service).to have_received(:execute_hooks).with(@merge_request) - end - end - end -end diff --git a/spec/services/merge_requests/merge_service_spec.rb b/spec/services/merge_requests/merge_service_spec.rb deleted file mode 100644 index 0a25fb12f4e..00000000000 --- a/spec/services/merge_requests/merge_service_spec.rb +++ /dev/null @@ -1,44 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::MergeService do - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:merge_request) { create(:merge_request, assignee: user2) } - let(:project) { merge_request.project } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context 'valid params' do - let(:service) { MergeRequests::MergeService.new(project, user, {}) } - - before do - allow(service).to receive(:execute_hooks) - - service.execute(merge_request, 'Awesome message') - end - - it { expect(merge_request).to be_valid } - it { expect(merge_request).to be_merged } - - it 'should execute hooks with merge action' do - expect(service).to have_received(:execute_hooks). - with(merge_request, 'merge') - end - - it 'should send email to user2 about merge of new merge_request' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(merge_request.title) - end - - it 'should create system note about merge_request merge' do - note = merge_request.notes.last - expect(note.note).to include 'Status changed to merged' - end - end - end -end diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb deleted file mode 100644 index 879df0c9c67..00000000000 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::RefreshService do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:service) { MergeRequests::RefreshService } - - describe :execute do - before do - @user = create(:user) - group = create(:group) - group.add_owner(@user) - - @project = create(:project, namespace: group) - @fork_project = Projects::ForkService.new(@project, @user).execute - @merge_request = create(:merge_request, source_project: @project, - source_branch: 'master', - target_branch: 'feature', - target_project: @project) - - @fork_merge_request = create(:merge_request, source_project: @fork_project, - source_branch: 'master', - target_branch: 'feature', - target_project: @project) - - @commits = @merge_request.commits - - @oldrev = @commits.last.id - @newrev = @commits.first.id - end - - context 'push to origin repo source branch' do - before do - service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/master') - reload_mrs - end - - it { expect(@merge_request.notes).not_to be_empty } - it { expect(@merge_request).to be_open } - it { expect(@fork_merge_request).to be_open } - it { expect(@fork_merge_request.notes).to be_empty } - end - - context 'push to origin repo target branch' do - before do - service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature') - reload_mrs - end - - it { expect(@merge_request.notes.last.note).to include('changed to merged') } - it { expect(@merge_request).to be_merged } - it { expect(@fork_merge_request).to be_merged } - it { expect(@fork_merge_request.notes.last.note).to include('changed to merged') } - end - - context 'push to fork repo source branch' do - before do - service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/master') - reload_mrs - end - - it { expect(@merge_request.notes).to be_empty } - it { expect(@merge_request).to be_open } - it { expect(@fork_merge_request.notes.last.note).to include('Added 4 commits') } - it { expect(@fork_merge_request).to be_open } - end - - context 'push to fork repo target branch' do - before do - service.new(@fork_project, @user).execute(@oldrev, @newrev, 'refs/heads/feature') - reload_mrs - end - - it { expect(@merge_request.notes).to be_empty } - it { expect(@merge_request).to be_open } - it { expect(@fork_merge_request.notes).to be_empty } - it { expect(@fork_merge_request).to be_open } - end - - context 'push to origin repo target branch after fork project was removed' do - before do - @fork_project.destroy - service.new(@project, @user).execute(@oldrev, @newrev, 'refs/heads/feature') - reload_mrs - end - - it { expect(@merge_request.notes.last.note).to include('changed to merged') } - it { expect(@merge_request).to be_merged } - it { expect(@fork_merge_request).to be_open } - it { expect(@fork_merge_request.notes).to be_empty } - end - - def reload_mrs - @merge_request.reload - @fork_merge_request.reload - end - end -end diff --git a/spec/services/merge_requests/reopen_service_spec.rb b/spec/services/merge_requests/reopen_service_spec.rb deleted file mode 100644 index 9401bc3b558..00000000000 --- a/spec/services/merge_requests/reopen_service_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::ReopenService do - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:merge_request) { create(:merge_request, assignee: user2) } - let(:project) { merge_request.project } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context 'valid params' do - let(:service) { MergeRequests::ReopenService.new(project, user, {}) } - - before do - allow(service).to receive(:execute_hooks) - - merge_request.state = :closed - service.execute(merge_request) - end - - it { expect(merge_request).to be_valid } - it { expect(merge_request).to be_reopened } - - it 'should execute hooks with reopen action' do - expect(service).to have_received(:execute_hooks). - with(merge_request, 'reopen') - end - - it 'should send email to user2 about reopen of merge_request' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(merge_request.title) - end - - it 'should create system note about merge_request reopen' do - note = merge_request.notes.last - expect(note.note).to include 'Status changed to reopened' - end - end - end -end diff --git a/spec/services/merge_requests/update_service_spec.rb b/spec/services/merge_requests/update_service_spec.rb deleted file mode 100644 index 916b01e1c45..00000000000 --- a/spec/services/merge_requests/update_service_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'spec_helper' - -describe MergeRequests::UpdateService do - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:merge_request) { create(:merge_request, :simple) } - let(:project) { merge_request.project } - let(:label) { create(:label) } - - before do - project.team << [user, :master] - project.team << [user2, :developer] - end - - describe :execute do - context 'valid params' do - let(:opts) do - { - title: 'New title', - description: 'Also please fix', - assignee_id: user2.id, - state_event: 'close', - label_ids: [label.id] - } - end - - let(:service) { MergeRequests::UpdateService.new(project, user, opts) } - - before do - allow(service).to receive(:execute_hooks) - - @merge_request = service.execute(merge_request) - @merge_request.reload - end - - it { expect(@merge_request).to be_valid } - it { expect(@merge_request.title).to eq('New title') } - it { expect(@merge_request.assignee).to eq(user2) } - it { expect(@merge_request).to be_closed } - it { expect(@merge_request.labels.count).to eq(1) } - it { expect(@merge_request.labels.first.title).to eq('Bug') } - - it 'should execute hooks with update action' do - expect(service).to have_received(:execute_hooks). - with(@merge_request, 'update') - end - - it 'should send email to user2 about assign of new merge_request' do - email = ActionMailer::Base.deliveries.last - expect(email.to.first).to eq(user2.email) - expect(email.subject).to include(merge_request.title) - end - - it 'should create system note about merge_request reassign' do - note = @merge_request.notes.last - expect(note.note).to include "Reassigned to \@#{user2.username}" - end - - it 'should create system note about merge_request label edit' do - note = @merge_request.notes[1] - expect(note.note).to include "Added ~#{label.id} label" - end - end - end -end diff --git a/spec/services/milestones/group_service_spec.rb b/spec/services/milestones/group_service_spec.rb deleted file mode 100644 index 74eb0f99e0f..00000000000 --- a/spec/services/milestones/group_service_spec.rb +++ /dev/null @@ -1,70 +0,0 @@ -require 'spec_helper' - -describe Milestones::GroupService do - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:group) { create(:group) } - let(:project1) { create(:project, group: group) } - let(:project2) { create(:project, path: 'gitlab-ci', group: group) } - let(:project3) { create(:project, path: 'cookbook-gitlab', group: group) } - let(:milestone1_project1) { create(:milestone, title: "Milestone v1.2", project: project1) } - let(:milestone1_project2) { create(:milestone, title: "Milestone v1.2", project: project2) } - let(:milestone1_project3) { create(:milestone, title: "Milestone v1.2", project: project3) } - let(:milestone2_project1) { create(:milestone, title: "VD-123", project: project1) } - let(:milestone2_project2) { create(:milestone, title: "VD-123", project: project2) } - let(:milestone2_project3) { create(:milestone, title: "VD-123", project: project3) } - - describe 'execute' do - context 'with valid projects' do - before do - milestones = - [ - milestone1_project1, - milestone1_project2, - milestone1_project3, - milestone2_project1, - milestone2_project2, - milestone2_project3 - ] - @group_milestones = Milestones::GroupService.new(milestones).execute - end - - it 'should have all project milestones' do - expect(@group_milestones.count).to eq(2) - end - - it 'should have all project milestones titles' do - expect(@group_milestones.map { |group_milestone| group_milestone.title }).to match_array(['Milestone v1.2', 'VD-123']) - end - - it 'should have all project milestones' do - expect(@group_milestones.map { |group_milestone| group_milestone.milestones.count }.sum).to eq(6) - end - end - end - - describe 'milestone' do - context 'with valid title' do - before do - milestones = - [ - milestone1_project1, - milestone1_project2, - milestone1_project3, - milestone2_project1, - milestone2_project2, - milestone2_project3 - ] - @group_milestones = Milestones::GroupService.new(milestones).milestone('Milestone v1.2') - end - - it 'should have exactly one group milestone' do - expect(@group_milestones.title).to eq('Milestone v1.2') - end - - it 'should have all project milestones with the same title' do - expect(@group_milestones.milestones.count).to eq(3) - end - end - end -end diff --git a/spec/services/notes/create_service_spec.rb b/spec/services/notes/create_service_spec.rb deleted file mode 100644 index 1a02299bf19..00000000000 --- a/spec/services/notes/create_service_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'spec_helper' - -describe Notes::CreateService do - let(:project) { create(:empty_project) } - let(:issue) { create(:issue, project: project) } - let(:user) { create(:user) } - - describe :execute do - context "valid params" do - before do - project.team << [user, :master] - opts = { - note: 'Awesome comment', - noteable_type: 'Issue', - noteable_id: issue.id - } - - @note = Notes::CreateService.new(project, user, opts).execute - end - - it { expect(@note).to be_valid } - it { expect(@note.note).to eq('Awesome comment') } - end - end -end - diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb deleted file mode 100644 index bfca2c88264..00000000000 --- a/spec/services/notification_service_spec.rb +++ /dev/null @@ -1,455 +0,0 @@ -require 'spec_helper' - -describe NotificationService do - let(:notification) { NotificationService.new } - - describe 'Keys' do - describe :new_key do - let!(:key) { create(:personal_key) } - - it { expect(notification.new_key(key)).to be_truthy } - - it 'should sent email to key owner' do - expect(Notify).to receive(:new_ssh_key_email).with(key.id) - notification.new_key(key) - end - end - end - - describe 'Email' do - describe :new_email do - let!(:email) { create(:email) } - - it { expect(notification.new_email(email)).to be_truthy } - - it 'should send email to email owner' do - expect(Notify).to receive(:new_email_email).with(email.id) - notification.new_email(email) - end - end - end - - describe 'Notes' do - context 'issue note' do - let(:issue) { create(:issue, assignee: create(:user)) } - let(:mentioned_issue) { create(:issue, assignee: issue.assignee) } - let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@mention referenced') } - - before do - build_team(note.project) - end - - describe :new_note do - it do - add_users_with_subscription(note.project, issue) - - should_email(@u_watcher.id) - should_email(note.noteable.author_id) - should_email(note.noteable.assignee_id) - should_email(@u_mentioned.id) - should_email(@subscriber.id) - should_not_email(note.author_id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - should_not_email(@unsubscriber.id) - - notification.new_note(note) - end - - it 'filters out "mentioned in" notes' do - mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author, issue.project) - - expect(Notify).not_to receive(:note_issue_email) - notification.new_note(mentioned_note) - end - end - - describe 'new note on issue in project that belongs to a group' do - let(:group) { create(:group) } - - before do - note.project.namespace_id = group.id - note.project.group.add_user(@u_watcher, GroupMember::MASTER) - note.project.save - user_project = note.project.project_members.find_by_user_id(@u_watcher.id) - user_project.notification_level = Notification::N_PARTICIPATING - user_project.save - group_member = note.project.group.group_members.find_by_user_id(@u_watcher.id) - group_member.notification_level = Notification::N_GLOBAL - group_member.save - end - - it do - should_email(note.noteable.author_id) - should_email(note.noteable.assignee_id) - should_email(@u_mentioned.id) - should_not_email(@u_watcher.id) - should_not_email(note.author_id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.new_note(note) - end - end - - def should_email(user_id) - expect(Notify).to receive(:note_issue_email).with(user_id, note.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:note_issue_email).with(user_id, note.id) - end - end - - context 'issue note mention' do - let(:issue) { create(:issue, assignee: create(:user)) } - let(:mentioned_issue) { create(:issue, assignee: issue.assignee) } - let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@all mentioned') } - - before do - build_team(note.project) - end - - describe :new_note do - it do - # Notify all team members - note.project.team.members.each do |member| - # User with disabled notification should not be notified - next if member.id == @u_disabled.id - should_email(member.id) - end - should_email(note.noteable.author_id) - should_email(note.noteable.assignee_id) - - should_not_email(note.author_id) - should_not_email(@u_mentioned.id) - should_not_email(@u_disabled.id) - should_not_email(@u_not_mentioned.id) - notification.new_note(note) - end - - it 'filters out "mentioned in" notes' do - mentioned_note = Note.create_cross_reference_note(mentioned_issue, issue, issue.author, issue.project) - - expect(Notify).not_to receive(:note_issue_email) - notification.new_note(mentioned_note) - end - end - - def should_email(user_id) - expect(Notify).to receive(:note_issue_email).with(user_id, note.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:note_issue_email).with(user_id, note.id) - end - end - - context 'commit note' do - let(:note) { create(:note_on_commit) } - - before do - build_team(note.project) - note.stub(:commit_author => @u_committer) - end - - describe :new_note do - it do - should_email(@u_committer.id, note) - should_email(@u_watcher.id, note) - should_not_email(@u_mentioned.id, note) - should_not_email(note.author_id, note) - should_not_email(@u_participating.id, note) - should_not_email(@u_disabled.id, note) - notification.new_note(note) - end - - it do - note.update_attribute(:note, '@mention referenced') - should_email(@u_committer.id, note) - should_email(@u_watcher.id, note) - should_email(@u_mentioned.id, note) - should_not_email(note.author_id, note) - should_not_email(@u_participating.id, note) - should_not_email(@u_disabled.id, note) - notification.new_note(note) - end - - it do - @u_committer.update_attributes(notification_level: Notification::N_MENTION) - should_not_email(@u_committer.id, note) - notification.new_note(note) - end - - def should_email(user_id, n) - expect(Notify).to receive(:note_commit_email).with(user_id, n.id) - end - - def should_not_email(user_id, n) - expect(Notify).not_to receive(:note_commit_email).with(user_id, n.id) - end - end - end - end - - describe 'Issues' do - let(:issue) { create :issue, assignee: create(:user), description: 'cc @participant' } - - before do - build_team(issue.project) - add_users_with_subscription(issue.project, issue) - end - - describe :new_issue do - it do - should_email(issue.assignee_id) - should_email(@u_watcher.id) - should_email(@u_participant_mentioned.id) - should_not_email(@u_mentioned.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.new_issue(issue, @u_disabled) - end - - it do - issue.assignee.update_attributes(notification_level: Notification::N_MENTION) - should_not_email(issue.assignee_id) - notification.new_issue(issue, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:new_issue_email).with(user_id, issue.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:new_issue_email).with(user_id, issue.id) - end - end - - describe :reassigned_issue do - it 'should email new assignee' do - should_email(issue.assignee_id) - should_email(@u_watcher.id) - should_email(@u_participant_mentioned.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - - notification.reassigned_issue(issue, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:reassigned_issue_email).with(user_id, issue.id, nil, @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:reassigned_issue_email).with(user_id, issue.id, issue.assignee_id, @u_disabled.id) - end - end - - describe :close_issue do - it 'should sent email to issue assignee and issue author' do - should_email(issue.assignee_id) - should_email(issue.author_id) - should_email(@u_watcher.id) - should_email(@u_participant_mentioned.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - - notification.close_issue(issue, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:closed_issue_email).with(user_id, issue.id, @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:closed_issue_email).with(user_id, issue.id, @u_disabled.id) - end - end - - describe :reopen_issue do - it 'should send email to issue assignee and issue author' do - should_email(issue.assignee_id) - should_email(issue.author_id) - should_email(@u_watcher.id) - should_email(@u_participant_mentioned.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - - notification.reopen_issue(issue, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:issue_status_changed_email).with(user_id, issue.id, 'reopened', @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:issue_status_changed_email).with(user_id, issue.id, 'reopened', @u_disabled.id) - end - end - end - - describe 'Merge Requests' do - let(:merge_request) { create :merge_request, assignee: create(:user) } - - before do - build_team(merge_request.target_project) - add_users_with_subscription(merge_request.target_project, merge_request) - end - - describe :new_merge_request do - it do - should_email(merge_request.assignee_id) - should_email(@u_watcher.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.new_merge_request(merge_request, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:new_merge_request_email).with(user_id, merge_request.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:new_merge_request_email).with(user_id, merge_request.id) - end - end - - describe :reassigned_merge_request do - it do - should_email(merge_request.assignee_id) - should_email(@u_watcher.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.reassigned_merge_request(merge_request, merge_request.author) - end - - def should_email(user_id) - expect(Notify).to receive(:reassigned_merge_request_email).with(user_id, merge_request.id, nil, merge_request.author_id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:reassigned_merge_request_email).with(user_id, merge_request.id, merge_request.assignee_id, merge_request.author_id) - end - end - - describe :closed_merge_request do - it do - should_email(merge_request.assignee_id) - should_email(@u_watcher.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.close_mr(merge_request, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:closed_merge_request_email).with(user_id, merge_request.id, @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:closed_merge_request_email).with(user_id, merge_request.id, @u_disabled.id) - end - end - - describe :merged_merge_request do - it do - should_email(merge_request.assignee_id) - should_email(@u_watcher.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.merge_mr(merge_request, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:merged_merge_request_email).with(user_id, merge_request.id, @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:merged_merge_request_email).with(user_id, merge_request.id, @u_disabled.id) - end - end - - describe :reopen_merge_request do - it do - should_email(merge_request.assignee_id) - should_email(@u_watcher.id) - should_email(@subscriber.id) - should_not_email(@unsubscriber.id) - should_not_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.reopen_mr(merge_request, @u_disabled) - end - - def should_email(user_id) - expect(Notify).to receive(:merge_request_status_email).with(user_id, merge_request.id, 'reopened', @u_disabled.id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:merge_request_status_email).with(user_id, merge_request.id, 'reopened', @u_disabled.id) - end - end - end - - describe 'Projects' do - let(:project) { create :project } - - before do - build_team(project) - end - - describe :project_was_moved do - it do - should_email(@u_watcher.id) - should_email(@u_participating.id) - should_not_email(@u_disabled.id) - notification.project_was_moved(project) - end - - def should_email(user_id) - expect(Notify).to receive(:project_was_moved_email).with(project.id, user_id) - end - - def should_not_email(user_id) - expect(Notify).not_to receive(:project_was_moved_email).with(project.id, user_id) - end - end - end - - def build_team(project) - @u_watcher = create(:user, notification_level: Notification::N_WATCH) - @u_participating = create(:user, notification_level: Notification::N_PARTICIPATING) - @u_participant_mentioned = create(:user, username: 'participant', notification_level: Notification::N_PARTICIPATING) - @u_disabled = create(:user, notification_level: Notification::N_DISABLED) - @u_mentioned = create(:user, username: 'mention', notification_level: Notification::N_MENTION) - @u_committer = create(:user, username: 'committer') - @u_not_mentioned = create(:user, username: 'regular', notification_level: Notification::N_PARTICIPATING) - - project.team << [@u_watcher, :master] - project.team << [@u_participating, :master] - project.team << [@u_disabled, :master] - project.team << [@u_mentioned, :master] - project.team << [@u_committer, :master] - end - - def add_users_with_subscription(project, issuable) - @subscriber = create :user - @unsubscriber = create :user - - project.team << [@subscriber, :master] - project.team << [@unsubscriber, :master] - - issuable.subscriptions.create(user: @subscriber, subscribed: true) - issuable.subscriptions.create(user: @unsubscriber, subscribed: false) - end -end diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb deleted file mode 100644 index 337dae592dd..00000000000 --- a/spec/services/projects/create_service_spec.rb +++ /dev/null @@ -1,90 +0,0 @@ -require 'spec_helper' - -describe Projects::CreateService do - describe :create_by_user do - before do - @user = create :user - @admin = create :user, admin: true - @opts = { - name: "GitLab", - namespace: @user.namespace - } - end - - context 'user namespace' do - before do - @project = create_project(@user, @opts) - end - - it { expect(@project).to be_valid } - it { expect(@project.owner).to eq(@user) } - it { expect(@project.namespace).to eq(@user.namespace) } - end - - context 'group namespace' do - before do - @group = create :group - @group.add_owner(@user) - - @opts.merge!(namespace_id: @group.id) - @project = create_project(@user, @opts) - end - - it { expect(@project).to be_valid } - it { expect(@project.owner).to eq(@group) } - it { expect(@project.namespace).to eq(@group) } - end - - context 'wiki_enabled creates repository directory' do - context 'wiki_enabled true creates wiki repository directory' do - before do - @project = create_project(@user, @opts) - @path = ProjectWiki.new(@project, @user).send(:path_to_repo) - end - - it { expect(File.exists?(@path)).to be_truthy } - end - - context 'wiki_enabled false does not create wiki repository directory' do - before do - @opts.merge!(wiki_enabled: false) - @project = create_project(@user, @opts) - @path = ProjectWiki.new(@project, @user).send(:path_to_repo) - end - - it { expect(File.exists?(@path)).to be_falsey } - end - end - - context 'restricted visibility level' do - before do - allow_any_instance_of(ApplicationSetting).to( - receive(:restricted_visibility_levels).and_return([20]) - ) - - @opts.merge!( - visibility_level: Gitlab::VisibilityLevel.options['Public'] - ) - end - - it 'should not allow a restricted visibility level for non-admins' do - project = create_project(@user, @opts) - expect(project).to respond_to(:errors) - expect(project.errors.messages).to have_key(:visibility_level) - expect(project.errors.messages[:visibility_level].first).to( - match('restricted by your GitLab administrator') - ) - end - - it 'should allow a restricted visibility level for admins' do - project = create_project(@admin, @opts) - expect(project.errors.any?).to be(false) - expect(project.saved?).to be(true) - end - end - end - - def create_project(user, opts) - Projects::CreateService.new(user, opts).execute - end -end diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb deleted file mode 100644 index c9025bdf133..00000000000 --- a/spec/services/projects/fork_service_spec.rb +++ /dev/null @@ -1,108 +0,0 @@ -require 'spec_helper' - -describe Projects::ForkService do - describe :fork_by_user do - before do - @from_namespace = create(:namespace) - @from_user = create(:user, namespace: @from_namespace ) - @from_project = create(:project, creator_id: @from_user.id, - namespace: @from_namespace, star_count: 107, - description: 'wow such project') - @to_namespace = create(:namespace) - @to_user = create(:user, namespace: @to_namespace) - end - - context 'fork project' do - describe "successfully creates project in the user namespace" do - let(:to_project) { fork_project(@from_project, @to_user) } - - it { expect(to_project.owner).to eq(@to_user) } - it { expect(to_project.namespace).to eq(@to_user.namespace) } - it { expect(to_project.star_count).to be_zero } - it { expect(to_project.description).to eq(@from_project.description) } - end - end - - context 'fork project failure' do - it "fails due to transaction failure" do - @to_project = fork_project(@from_project, @to_user, false) - expect(@to_project.errors).not_to be_empty - expect(@to_project.errors[:base]).to include("Fork transaction failed.") - end - end - - context 'project already exists' do - it "should fail due to validation, not transaction failure" do - @existing_project = create(:project, creator_id: @to_user.id, name: @from_project.name, namespace: @to_namespace) - @to_project = fork_project(@from_project, @to_user) - expect(@existing_project.persisted?).to be_truthy - expect(@to_project.errors[:base]).to include("Invalid fork destination") - expect(@to_project.errors[:base]).not_to include("Fork transaction failed.") - end - end - - context 'GitLab CI is enabled' do - it "calls fork registrator for CI" do - @from_project.build_missing_services - @from_project.gitlab_ci_service.update_attributes(active: true) - - expect(ForkRegistrationWorker).to receive(:perform_async) - - fork_project(@from_project, @to_user) - end - end - end - - describe :fork_to_namespace do - before do - @group_owner = create(:user) - @developer = create(:user) - @project = create(:project, creator_id: @group_owner.id, - star_count: 777, - description: 'Wow, such a cool project!') - @group = create(:group) - @group.add_user(@group_owner, GroupMember::OWNER) - @group.add_user(@developer, GroupMember::DEVELOPER) - @opts = { namespace: @group } - end - - context 'fork project for group' do - it 'group owner successfully forks project into the group' do - to_project = fork_project(@project, @group_owner, true, @opts) - expect(to_project.owner).to eq(@group) - expect(to_project.namespace).to eq(@group) - expect(to_project.name).to eq(@project.name) - expect(to_project.path).to eq(@project.path) - expect(to_project.description).to eq(@project.description) - expect(to_project.star_count).to be_zero - end - end - - context 'fork project for group when user not owner' do - it 'group developer should fail to fork project into the group' do - to_project = fork_project(@project, @developer, true, @opts) - expect(to_project.errors[:namespace]).to eq(['insufficient access rights']) - end - end - - context 'project already exists in group' do - it 'should fail due to validation, not transaction failure' do - existing_project = create(:project, name: @project.name, - namespace: @group) - to_project = fork_project(@project, @group_owner, true, @opts) - expect(existing_project.persisted?).to be_truthy - expect(to_project.errors[:base]).to eq(['Invalid fork destination']) - expect(to_project.errors[:name]).to eq(['has already been taken']) - expect(to_project.errors[:path]).to eq(['has already been taken']) - end - end - end - - def fork_project(from_project, user, fork_success = true, params = {}) - context = Projects::ForkService.new(from_project, user, params) - shell = double('gitlab_shell') - shell.stub(fork_repository: fork_success) - context.stub(gitlab_shell: shell) - context.execute - end -end diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb deleted file mode 100644 index 5650626fb18..00000000000 --- a/spec/services/projects/transfer_service_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'spec_helper' - -describe Projects::TransferService do - let(:user) { create(:user) } - let(:group) { create(:group) } - let(:project) { create(:project, namespace: user.namespace) } - - context 'namespace -> namespace' do - before do - group.add_owner(user) - @result = transfer_project(project, user, new_namespace_id: group.id) - end - - it { expect(@result).to be_truthy } - it { expect(project.namespace).to eq(group) } - end - - context 'namespace -> no namespace' do - before do - @result = transfer_project(project, user, new_namespace_id: nil) - end - - it { expect(@result).not_to be_nil } # { result.should be_false } passes on nil - it { expect(@result).to be_falsey } - it { expect(project.namespace).to eq(user.namespace) } - end - - context 'namespace -> not allowed namespace' do - before do - @result = transfer_project(project, user, new_namespace_id: group.id) - end - - it { expect(@result).not_to be_nil } # { result.should be_false } passes on nil - it { expect(@result).to be_falsey } - it { expect(project.namespace).to eq(user.namespace) } - end - - def transfer_project(project, user, params) - Projects::TransferService.new(project, user, params).execute - end -end diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb deleted file mode 100644 index ea5b8813105..00000000000 --- a/spec/services/projects/update_service_spec.rb +++ /dev/null @@ -1,108 +0,0 @@ -require 'spec_helper' - -describe Projects::UpdateService do - describe :update_by_user do - before do - @user = create :user - @admin = create :user, admin: true - @project = create :project, creator_id: @user.id, namespace: @user.namespace - @opts = {} - end - - context 'should be private when updated to private' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.private?).to be_truthy } - end - - context 'should be internal when updated to internal' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.internal?).to be_truthy } - end - - context 'should be public when updated to public' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.public?).to be_truthy } - end - - context 'respect configured visibility restrictions setting' do - before(:each) do - allow_any_instance_of(ApplicationSetting).to( - receive(:restricted_visibility_levels).and_return([20]) - ) - end - - context 'should be private when updated to private' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.private?).to be_truthy } - end - - context 'should be internal when updated to internal' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.internal?).to be_truthy } - end - - context 'should be private when updated to public' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - update_project(@project, @user, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.private?).to be_truthy } - end - - context 'should be public when updated to public by admin' do - before do - @created_private = @project.private? - - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - update_project(@project, @admin, @opts) - end - - it { expect(@created_private).to be_truthy } - it { expect(@project.public?).to be_truthy } - end - end - end - - def update_project(project, user, opts) - Projects::UpdateService.new(project, user, opts).execute - end -end diff --git a/spec/services/projects/upload_service_spec.rb b/spec/services/projects/upload_service_spec.rb deleted file mode 100644 index e5c47015a03..00000000000 --- a/spec/services/projects/upload_service_spec.rb +++ /dev/null @@ -1,85 +0,0 @@ -require 'spec_helper' - -describe Projects::UploadService do - describe 'File service' do - before do - @user = create :user - @project = create :project, creator_id: @user.id, namespace: @user.namespace - end - - context 'for valid gif file' do - before do - gif = fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') - @link_to_file = upload_file(@project.repository, gif) - end - - it { expect(@link_to_file).to have_key('alt') } - it { expect(@link_to_file).to have_key('url') } - it { expect(@link_to_file).to have_key('is_image') } - it { expect(@link_to_file).to have_value('banana_sample') } - it { expect(@link_to_file['is_image']).to equal(true) } - it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } - it { expect(@link_to_file['url']).to match('banana_sample.gif') } - end - - context 'for valid png file' do - before do - png = fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', - 'image/png') - @link_to_file = upload_file(@project.repository, png) - end - - it { expect(@link_to_file).to have_key('alt') } - it { expect(@link_to_file).to have_key('url') } - it { expect(@link_to_file).to have_value('dk') } - it { expect(@link_to_file).to have_key('is_image') } - it { expect(@link_to_file['is_image']).to equal(true) } - it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } - it { expect(@link_to_file['url']).to match('dk.png') } - end - - context 'for valid jpg file' do - before do - jpg = fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') - @link_to_file = upload_file(@project.repository, jpg) - end - - it { expect(@link_to_file).to have_key('alt') } - it { expect(@link_to_file).to have_key('url') } - it { expect(@link_to_file).to have_key('is_image') } - it { expect(@link_to_file).to have_value('rails_sample') } - it { expect(@link_to_file['is_image']).to equal(true) } - it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } - it { expect(@link_to_file['url']).to match('rails_sample.jpg') } - end - - context 'for txt file' do - before do - txt = fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') - @link_to_file = upload_file(@project.repository, txt) - end - - it { expect(@link_to_file).to have_key('alt') } - it { expect(@link_to_file).to have_key('url') } - it { expect(@link_to_file).to have_key('is_image') } - it { expect(@link_to_file).to have_value('doc_sample.txt') } - it { expect(@link_to_file['is_image']).to equal(false) } - it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } - it { expect(@link_to_file['url']).to match('doc_sample.txt') } - end - - context 'for too large a file' do - before do - txt = fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') - allow(txt).to receive(:size) { 1000.megabytes.to_i } - @link_to_file = upload_file(@project.repository, txt) - end - - it { expect(@link_to_file).to eq(nil) } - end - end - - def upload_file(repository, file) - Projects::UploadService.new(repository, file).execute - end -end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb deleted file mode 100644 index f57bfaea879..00000000000 --- a/spec/services/search_service_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require 'spec_helper' - -describe 'Search::GlobalService' do - let(:user) { create(:user) } - let(:public_user) { create(:user) } - let(:internal_user) { create(:user) } - - let!(:found_project) { create(:empty_project, :private, name: 'searchable_project') } - let!(:unfound_project) { create(:empty_project, :private, name: 'unfound_project') } - let!(:internal_project) { create(:empty_project, :internal, name: 'searchable_internal_project') } - let!(:public_project) { create(:empty_project, :public, name: 'searchable_public_project') } - - before do - found_project.team << [user, :master] - end - - describe '#execute' do - context 'unauthenticated' do - it 'should return public projects only' do - context = Search::GlobalService.new(nil, search: "searchable") - results = context.execute - expect(results.objects('projects')).to match_array [public_project] - end - end - - context 'authenticated' do - it 'should return public, internal and private projects' do - context = Search::GlobalService.new(user, search: "searchable") - results = context.execute - expect(results.objects('projects')).to match_array [public_project, found_project, internal_project] - end - - it 'should return only public & internal projects' do - context = Search::GlobalService.new(internal_user, search: "searchable") - results = context.execute - expect(results.objects('projects')).to match_array [internal_project, public_project] - end - - it 'namespace name should be searchable' do - context = Search::GlobalService.new(user, search: found_project.namespace.path) - results = context.execute - expect(results.objects('projects')).to match_array [found_project] - end - end - end -end diff --git a/spec/services/system_hooks_service_spec.rb b/spec/services/system_hooks_service_spec.rb deleted file mode 100644 index 199ac996608..00000000000 --- a/spec/services/system_hooks_service_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require 'spec_helper' - -describe SystemHooksService do - let (:user) { create :user } - let (:project) { create :project } - let (:project_member) { create :project_member } - let (:key) { create(:key, user: user) } - let (:group) { create(:group) } - let (:group_member) { create(:group_member) } - - context 'event data' do - it { expect(event_data(user, :create)).to include(:event_name, :name, :created_at, :email, :user_id) } - it { expect(event_data(user, :destroy)).to include(:event_name, :name, :created_at, :email, :user_id) } - it { expect(event_data(project, :create)).to include(:event_name, :name, :created_at, :path, :project_id, :owner_name, :owner_email, :project_visibility) } - it { expect(event_data(project, :destroy)).to include(:event_name, :name, :created_at, :path, :project_id, :owner_name, :owner_email, :project_visibility) } - it { expect(event_data(project_member, :create)).to include(:event_name, :created_at, :project_name, :project_path, :project_id, :user_name, :user_email, :access_level, :project_visibility) } - it { expect(event_data(project_member, :destroy)).to include(:event_name, :created_at, :project_name, :project_path, :project_id, :user_name, :user_email, :access_level, :project_visibility) } - it { expect(event_data(key, :create)).to include(:username, :key, :id) } - it { expect(event_data(key, :destroy)).to include(:username, :key, :id) } - - it do - expect(event_data(group, :create)).to include( - :event_name, :name, :created_at, :path, :group_id, :owner_name, - :owner_email - ) - end - it do - expect(event_data(group, :destroy)).to include( - :event_name, :name, :created_at, :path, :group_id, :owner_name, - :owner_email - ) - end - it do - expect(event_data(group_member, :create)).to include( - :event_name, :created_at, :group_name, :group_path, :group_id, :user_id, - :user_name, :user_email, :group_access - ) - end - it do - expect(event_data(group_member, :destroy)).to include( - :event_name, :created_at, :group_name, :group_path, :group_id, :user_id, - :user_name, :user_email, :group_access - ) - end - end - - context 'event names' do - it { expect(event_name(user, :create)).to eq "user_create" } - it { expect(event_name(user, :destroy)).to eq "user_destroy" } - it { expect(event_name(project, :create)).to eq "project_create" } - it { expect(event_name(project, :destroy)).to eq "project_destroy" } - it { expect(event_name(project_member, :create)).to eq "user_add_to_team" } - it { expect(event_name(project_member, :destroy)).to eq "user_remove_from_team" } - it { expect(event_name(key, :create)).to eq 'key_create' } - it { expect(event_name(key, :destroy)).to eq 'key_destroy' } - it { expect(event_name(group, :create)).to eq 'group_create' } - it { expect(event_name(group, :destroy)).to eq 'group_destroy' } - it { expect(event_name(group_member, :create)).to eq 'user_add_to_group' } - it { expect(event_name(group_member, :destroy)).to eq 'user_remove_from_group' } - end - - def event_data(*args) - SystemHooksService.new.send :build_event_data, *args - end - - def event_name(*args) - SystemHooksService.new.send :build_event_name, *args - end -end diff --git a/spec/services/test_hook_service_spec.rb b/spec/services/test_hook_service_spec.rb deleted file mode 100644 index d2b505f55a2..00000000000 --- a/spec/services/test_hook_service_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'spec_helper' - -describe TestHookService do - let (:user) { create :user } - let (:project) { create :project } - let (:hook) { create :project_hook, project: project } - - describe :execute do - it "should execute successfully" do - stub_request(:post, hook.url).to_return(status: 200) - expect(TestHookService.new.execute(hook, user)).to be_truthy - end - end -end diff --git a/spec/services/update_snippet_service_spec.rb b/spec/services/update_snippet_service_spec.rb deleted file mode 100644 index 841ef9bfed1..00000000000 --- a/spec/services/update_snippet_service_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'spec_helper' - -describe UpdateSnippetService do - before do - @user = create :user - @admin = create :user, admin: true - @opts = { - title: 'Test snippet', - file_name: 'snippet.rb', - content: 'puts "hello world"', - visibility_level: Gitlab::VisibilityLevel::PRIVATE - } - end - - context 'When public visibility is restricted' do - before do - allow_any_instance_of(ApplicationSetting).to( - receive(:restricted_visibility_levels).and_return( - [Gitlab::VisibilityLevel::PUBLIC] - ) - ) - - @snippet = create_snippet(@project, @user, @opts) - @opts.merge!(visibility_level: Gitlab::VisibilityLevel::PUBLIC) - end - - it 'non-admins should not be able to update to public visibility' do - old_visibility = @snippet.visibility_level - update_snippet(@project, @user, @snippet, @opts) - expect(@snippet.errors.messages).to have_key(:visibility_level) - expect(@snippet.errors.messages[:visibility_level].first).to( - match('Public visibility has been restricted') - ) - expect(@snippet.visibility_level).to eq(old_visibility) - end - - it 'admins should be able to update to pubic visibility' do - old_visibility = @snippet.visibility_level - update_snippet(@project, @admin, @snippet, @opts) - expect(@snippet.visibility_level).not_to eq(old_visibility) - expect(@snippet.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) - end - end - - def create_snippet(project, user, opts) - CreateSnippetService.new(project, user, opts).execute - end - - def update_snippet(project = nil, user, snippet, opts) - UpdateSnippetService.new(project, user, snippet, opts).execute - end -end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 53ccaa4fd67..00000000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,48 +0,0 @@ -if ENV['SIMPLECOV'] - require 'simplecov' -end - -if ENV['COVERALLS'] - require 'coveralls' - Coveralls.wear_merged! -end - -ENV["RAILS_ENV"] ||= 'test' -require File.expand_path("../../config/environment", __FILE__) -require 'rspec/rails' -require 'capybara/rails' -require 'capybara/rspec' -require 'webmock/rspec' -require 'email_spec' -require 'sidekiq/testing/inline' -require 'capybara/poltergeist' - -Capybara.javascript_driver = :poltergeist -Capybara.default_wait_time = 10 - -# Requires supporting ruby files with custom matchers and macros, etc, -# in spec/support/ and its subdirectories. -Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} - -WebMock.disable_net_connect!(allow_localhost: true) - -RSpec.configure do |config| - config.use_transactional_fixtures = false - config.use_instantiated_fixtures = false - config.mock_with :rspec - - config.include LoginHelpers, type: :feature - config.include LoginHelpers, type: :request - config.include FactoryGirl::Syntax::Methods - config.include Devise::TestHelpers, type: :controller - - config.include TestEnv - config.infer_spec_type_from_file_location! - config.raise_errors_for_deprecations! - - config.before(:suite) do - TestEnv.init - end -end - -ActiveRecord::Migration.maintain_test_schema! diff --git a/spec/support/api_helpers.rb b/spec/support/api_helpers.rb deleted file mode 100644 index ec9a326a1ea..00000000000 --- a/spec/support/api_helpers.rb +++ /dev/null @@ -1,34 +0,0 @@ -module ApiHelpers - # Public: Prepend a request path with the path to the API - # - # path - Path to append - # user - User object - If provided, automatically appends private_token query - # string for authenticated requests - # - # Examples - # - # >> api('/issues') - # => "/api/v2/issues" - # - # >> api('/issues', User.last) - # => "/api/v2/issues?private_token=..." - # - # >> api('/issues?foo=bar', User.last) - # => "/api/v2/issues?foo=bar&private_token=..." - # - # Returns the relative path to the requested API resource - def api(path, user = nil) - "/api/#{API::API.version}#{path}" + - - # Normalize query string - (path.index('?') ? '' : '?') + - - # Append private_token if given a User object - (user.respond_to?(:private_token) ? - "&private_token=#{user.private_token}" : "") - end - - def json_response - JSON.parse(response.body) - end -end diff --git a/spec/support/db_cleaner.rb b/spec/support/db_cleaner.rb deleted file mode 100644 index cca7652093a..00000000000 --- a/spec/support/db_cleaner.rb +++ /dev/null @@ -1,50 +0,0 @@ -# RSpec.configure do |config| - -# config.around(:each) do |example| -# DatabaseCleaner.strategy = :transaction -# DatabaseCleaner.clean_with(:truncation) -# DatabaseCleaner.cleaning do -# example.run -# end -# end - -# config.around(:each, js: true) do |example| -# DatabaseCleaner.strategy = :truncation -# DatabaseCleaner.clean_with(:truncation) -# DatabaseCleaner.cleaning do -# example.run -# end -# end -# end -RSpec.configure do |config| - config.before(:suite) do - DatabaseCleaner.clean_with(:truncation) - end - - config.before(:each) do - DatabaseCleaner.strategy = :transaction - end - - config.before(:each, :js => true) do - DatabaseCleaner.strategy = :truncation - end - - config.before(:each) do - DatabaseCleaner.start - end - - config.after(:each) do - DatabaseCleaner.clean - end - - # rspec-rails 3 will no longer automatically infer an example group's spec type - # from the file location. You can explicitly opt-in to the feature using this - # config option. - # To explicitly tag specs without using automatic inference, set the `:type` - # metadata manually: - # - # describe ThingsController, :type => :controller do - # # Equivalent to being in spec/controllers - # end - config.infer_spec_type_from_file_location! -end diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb deleted file mode 100644 index 791d2a1fd64..00000000000 --- a/spec/support/login_helpers.rb +++ /dev/null @@ -1,26 +0,0 @@ -module LoginHelpers - # Internal: Create and log in as a user of the specified role - # - # role - User role (e.g., :admin, :user) - def login_as(role) - @user = create(role) - - login_with(@user) - end - - # Internal: Login as the specified user - # - # user - User instance to login with - def login_with(user) - visit new_user_session_path - fill_in "user_login", with: user.email - fill_in "user_password", with: "12345678" - click_button "Sign in" - Thread.current[:current_user] = user - end - - # Requires Javascript driver. - def logout - find(:css, ".fa.fa-sign-out").click - end -end diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb deleted file mode 100644 index 52b11bd6323..00000000000 --- a/spec/support/matchers.rb +++ /dev/null @@ -1,79 +0,0 @@ -RSpec::Matchers.define :be_valid_commit do - match do |actual| - actual != nil - actual.id == ValidCommit::ID - actual.message == ValidCommit::MESSAGE - actual.author_name == ValidCommit::AUTHOR_FULL_NAME - end -end - -RSpec::Matchers.define :be_allowed_for do |user| - match do |url| - include UrlAccess - url_allowed?(user, url) - end -end - -RSpec::Matchers.define :be_denied_for do |user| - match do |url| - include UrlAccess - url_denied?(user, url) - end -end - -RSpec::Matchers.define :be_404_for do |user| - match do |url| - include UrlAccess - url_404?(user, url) - end -end - -RSpec::Matchers.define :include_module do |expected| - match do - described_class.included_modules.include?(expected) - end - - failure_message_for_should do - "expected #{described_class} to include the #{expected} module" - end -end - -module UrlAccess - def url_allowed?(user, url) - emulate_user(user) - visit url - (status_code != 404 && current_path != new_user_session_path) - end - - def url_denied?(user, url) - emulate_user(user) - visit url - (status_code == 404 || current_path == new_user_session_path) - end - - def url_404?(user, url) - emulate_user(user) - visit url - status_code == 404 - end - - def emulate_user(user) - user = case user - when :user then create(:user) - when :visitor then nil - when :admin then create(:admin) - else user - end - login_with(user) if user - end -end - -# Extend shoulda-matchers -module Shoulda::Matchers::ActiveModel - class EnsureLengthOfMatcher - # Shortcut for is_at_least and is_at_most - def is_within(range) - is_at_least(range.min) && is_at_most(range.max) - end - end -end diff --git a/spec/support/mentionable_shared_examples.rb b/spec/support/mentionable_shared_examples.rb deleted file mode 100644 index 305592fa5a6..00000000000 --- a/spec/support/mentionable_shared_examples.rb +++ /dev/null @@ -1,115 +0,0 @@ -# Specifications for behavior common to all Mentionable implementations. -# Requires a shared context containing: -# - let(:subject) { "the mentionable implementation" } -# - let(:backref_text) { "the way that +subject+ should refer to itself in backreferences " } -# - let(:set_mentionable_text) { lambda { |txt| "block that assigns txt to the subject's mentionable_text" } } - -def common_mentionable_setup - # Avoid name collisions with let(:project) or let(:author) in the surrounding scope. - let(:mproject) { create :project } - let(:mauthor) { subject.author } - - let(:mentioned_issue) { create :issue, project: mproject } - let(:other_issue) { create :issue, project: mproject } - let(:mentioned_mr) { create :merge_request, :simple, source_project: mproject } - let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object } - - let(:ext_proj) { create :project, :public } - let(:ext_issue) { create :issue, project: ext_proj } - let(:other_ext_issue) { create :issue, project: ext_proj } - let(:ext_mr) { create :merge_request, :simple, source_project: ext_proj } - let(:ext_commit) { ext_proj.repository.commit } - - # Override to add known commits to the repository stub. - let(:extra_commits) { [] } - - # A string that mentions each of the +mentioned_.*+ objects above. Mentionables should add a self-reference - # to this string and place it in their +mentionable_text+. - let(:ref_string) do - "mentions ##{mentioned_issue.iid} twice ##{mentioned_issue.iid}, " + - "!#{mentioned_mr.iid}, " + - "#{ext_proj.path_with_namespace}##{ext_issue.iid}, " + - "#{ext_proj.path_with_namespace}!#{ext_mr.iid}, " + - "#{ext_proj.path_with_namespace}@#{ext_commit.short_id}, " + - "#{mentioned_commit.sha[0..10]} and itself as #{backref_text}" - end - - before do - # Wire the project's repository to return the mentioned commit, and +nil+ for any - # unrecognized commits. - commitmap = { '1234567890a' => mentioned_commit } - extra_commits.each { |c| commitmap[c.short_id] = c } - allow(mproject.repository).to receive(:commit) { |sha| commitmap[sha] } - set_mentionable_text.call(ref_string) - end -end - -shared_examples 'a mentionable' do - common_mentionable_setup - - it 'generates a descriptive back-reference' do - expect(subject.gfm_reference).to eq(backref_text) - end - - it "extracts references from its reference property" do - # De-duplicate and omit itself - refs = subject.references(mproject) - expect(refs.size).to eq(6) - expect(refs).to include(mentioned_issue) - expect(refs).to include(mentioned_mr) - expect(refs).to include(mentioned_commit) - expect(refs).to include(ext_issue) - expect(refs).to include(ext_mr) - expect(refs).to include(ext_commit) - end - - it 'creates cross-reference notes' do - mentioned_objects = [mentioned_issue, mentioned_mr, mentioned_commit, - ext_issue, ext_mr, ext_commit] - - mentioned_objects.each do |referenced| - expect(Note).to receive(:create_cross_reference_note).with(referenced, subject.local_reference, mauthor, mproject) - end - - subject.create_cross_references!(mproject, mauthor) - end - - it 'detects existing cross-references' do - Note.create_cross_reference_note(mentioned_issue, subject.local_reference, mauthor, mproject) - - expect(subject.has_mentioned?(mentioned_issue)).to be_truthy - expect(subject.has_mentioned?(mentioned_mr)).to be_falsey - end -end - -shared_examples 'an editable mentionable' do - common_mentionable_setup - - it_behaves_like 'a mentionable' - - it 'creates new cross-reference notes when the mentionable text is edited' do - new_text = "still mentions ##{mentioned_issue.iid}, " + - "#{mentioned_commit.sha[0..10]}, " + - "#{ext_issue.iid}, " + - "new refs: ##{other_issue.iid}, " + - "#{ext_proj.path_with_namespace}##{other_ext_issue.iid}" - - [mentioned_issue, mentioned_commit, ext_issue].each do |oldref| - expect(Note).not_to receive(:create_cross_reference_note).with(oldref, subject.local_reference, - mauthor, mproject) - end - - [other_issue, other_ext_issue].each do |newref| - expect(Note).to receive(:create_cross_reference_note).with( - newref, - subject.local_reference, - mauthor, - mproject - ) - end - - subject.save - set_mentionable_text.call(new_text) - subject.notice_added_references(mproject, mauthor) - end -end diff --git a/spec/support/repo_helpers.rb b/spec/support/repo_helpers.rb deleted file mode 100644 index aadf791bf3f..00000000000 --- a/spec/support/repo_helpers.rb +++ /dev/null @@ -1,118 +0,0 @@ -module RepoHelpers - extend self - - # Text file in repo - # - # Ex. - # - # # Get object - # blob = RepoHelpers.text_blob - # - # blob.path # => 'files/js/commit.js.coffee' - # blob.data # => 'class Commit...' - # - def sample_blob - OpenStruct.new( - oid: '5f53439ca4b009096571d3c8bc3d09d30e7431b3', - path: "files/js/commit.js.coffee", - data: < - $('.files .diff-file').each -> - new CommitFile(this) - -@Commit = Commit -eos - ) - end - - def sample_commit - OpenStruct.new( - id: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - parent_id: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9', - author_full_name: "Dmitriy Zaporozhets", - author_email: "dmitriy.zaporozhets@gmail.com", - files_changed_count: 2, - line_code: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd_15_14', - line_code_path: 'files/ruby/popen.rb', - del_line_code: '2f6fcd96b88b36ce98c38da085c795a27d92a3dd_13_13', - message: < -eos - ) - end - - def another_sample_commit - OpenStruct.new( - id: "e56497bb5f03a90a51293fc6d516788730953899", - parent_id: '4cd80ccab63c82b4bad16faa5193fbd2aa06df40', - author_full_name: "Sytse Sijbrandij", - author_email: "sytse@gitlab.com", - files_changed_count: 1, - message: < -eos - ) - end - - def sample_image_commit - OpenStruct.new( - id: "2f63565e7aac07bcdadb654e253078b727143ec4", - author_full_name: "Dmitriy Zaporozhets", - author_email: "dmitriy.zaporozhets@gmail.com", - old_blob_id: '33f3729a45c02fc67d00adb1b8bca394b0e761d9', - new_blob_id: '2f63565e7aac07bcdadb654e253078b727143ec4', - message: < -eos - ) - end - - def sample_compare - changes = [ - { - line_code: 'a5cc2925ca8258af241be7e5b0381edf30266302_20_20', - file_path: '.gitignore', - }, - { - line_code: '7445606fbf8f3683cd42bdc54b05d7a0bc2dfc44_4_6', - file_path: '.gitmodules', - } - ] - - commits = [ - '5937ac0a7beb003549fc5fd26fc247adbce4a52e', - '570e7b2abdd848b95f2f578043fc23bd6f6fd24d', - '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9', - 'd14d6c0abdd253381df51a723d58691b2ee1ab08', - 'c1acaa58bbcbc3eafe538cb8274ba387047b69f8', - ].reverse # last commit is recent one - - OpenStruct.new( - source_branch: 'master', - target_branch: 'feature', - changes: changes, - commits: commits - ) - end -end diff --git a/spec/support/select2_helper.rb b/spec/support/select2_helper.rb deleted file mode 100644 index 691f84f39d4..00000000000 --- a/spec/support/select2_helper.rb +++ /dev/null @@ -1,25 +0,0 @@ -# Select2 ajax programmatic helper -# It allows you to select value from select2 -# -# Params -# value - real value of selected item -# opts - options containing css selector -# -# Usage: -# -# select2(2, from: '#user_ids') -# - -module Select2Helper - def select2(value, options={}) - raise "Must pass a hash containing 'from'" if not options.is_a?(Hash) or not options.has_key?(:from) - - selector = options[:from] - - if options[:multiple] - execute_script("$('#{selector}').select2('val', ['#{value}'], true);") - else - execute_script("$('#{selector}').select2('val', '#{value}', true);") - end - end -end diff --git a/spec/support/taskable_shared_examples.rb b/spec/support/taskable_shared_examples.rb deleted file mode 100644 index 490f453d468..00000000000 --- a/spec/support/taskable_shared_examples.rb +++ /dev/null @@ -1,42 +0,0 @@ -# Specs for task state functionality for issues and merge requests. -# -# Requires a context containing: -# let(:subject) { Issue or MergeRequest } -shared_examples 'a Taskable' do - before do - subject.description = < 'e56497b', - 'feature' => '0b4bc9a', - 'feature_conflict' => 'bb5206f', - 'fix' => '12d65c8', - 'improve/awesome' => '5937ac0', - 'markdown' => '0ed8c6c', - 'master' => '5937ac0' - } - - # Test environment - # - # See gitlab.yml.example test section for paths - # - def init(opts = {}) - # Disable mailer for spinach tests - disable_mailer if opts[:mailer] == false - - clean_test_path - - FileUtils.mkdir_p(repos_path) - - # Setup GitLab shell for test instance - setup_gitlab_shell - - # Create repository for FactoryGirl.create(:project) - setup_factory_repo - end - - def disable_mailer - NotificationService.any_instance.stub(mailer: double.as_null_object) - end - - def enable_mailer - allow_any_instance_of(NotificationService).to receive(:mailer).and_call_original - end - - # Clean /tmp/tests - # - # Keeps gitlab-shell and gitlab-test - def clean_test_path - tmp_test_path = Rails.root.join('tmp', 'tests', '**') - - Dir[tmp_test_path].each do |entry| - unless File.basename(entry) =~ /\Agitlab-(shell|test)\z/ - FileUtils.rm_rf(entry) - end - end - end - - def setup_gitlab_shell - unless File.directory?(Rails.root.join(*%w(tmp tests gitlab-shell))) - `rake gitlab:shell:install` - end - end - - def setup_factory_repo - clone_url = "https://gitlab.com/gitlab-org/#{factory_repo_name}.git" - - unless File.directory?(factory_repo_path) - system(*%W(git clone -q #{clone_url} #{factory_repo_path})) - end - - Dir.chdir(factory_repo_path) do - BRANCH_SHA.each do |branch, sha| - # Try to reset without fetching to avoid using the network. - reset = %W(git update-ref refs/heads/#{branch} #{sha}) - unless system(*reset) - if system(*%w(git fetch origin)) - unless system(*reset) - raise 'The fetched test seed '\ - 'does not contain the required revision.' - end - else - raise 'Could not fetch test seed repository.' - end - end - end - end - - # We must copy bare repositories because we will push to them. - system(git_env, *%W(git clone -q --bare #{factory_repo_path} #{factory_repo_path_bare})) - end - - def copy_repo(project) - base_repo_path = File.expand_path(factory_repo_path_bare) - target_repo_path = File.expand_path(repos_path + "/#{project.namespace.path}/#{project.path}.git") - FileUtils.mkdir_p(target_repo_path) - FileUtils.cp_r("#{base_repo_path}/.", target_repo_path) - FileUtils.chmod_R 0755, target_repo_path - end - - def repos_path - Gitlab.config.gitlab_shell.repos_path - end - - private - - def factory_repo_path - @factory_repo_path ||= Rails.root.join('tmp', 'tests', factory_repo_name) - end - - def factory_repo_path_bare - "#{factory_repo_path}_bare" - end - - def factory_repo_name - 'gitlab-test' - end - - # Prevent developer git configurations from being persisted to test - # repositories - def git_env - {'GIT_TEMPLATE_DIR' => ''} - end -end diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb deleted file mode 100644 index a59f74c2121..00000000000 --- a/spec/tasks/gitlab/backup_rake_spec.rb +++ /dev/null @@ -1,152 +0,0 @@ -require 'spec_helper' -require 'rake' - -describe 'gitlab:app namespace rake task' do - before :all do - Rake.application.rake_require "tasks/gitlab/task_helpers" - Rake.application.rake_require "tasks/gitlab/backup" - Rake.application.rake_require "tasks/gitlab/shell" - # empty task as env is already loaded - Rake::Task.define_task :environment - end - - def run_rake_task(task_name) - Rake::Task[task_name].reenable - Rake.application.invoke_task task_name - end - - describe 'backup_restore' do - before do - # avoid writing task output to spec progress - allow($stdout).to receive :write - end - - context 'gitlab version' do - before do - Dir.stub glob: [] - allow(Dir).to receive :chdir - File.stub exists?: true - Kernel.stub system: true - FileUtils.stub cp_r: true - FileUtils.stub mv: true - Rake::Task["gitlab:shell:setup"].stub invoke: true - end - - let(:gitlab_version) { Gitlab::VERSION } - - it 'should fail on mismatch' do - YAML.stub load_file: {gitlab_version: "not #{gitlab_version}" } - expect { run_rake_task('gitlab:backup:restore') }.to( - raise_error SystemExit - ) - end - - it 'should invoke restoration on mach' do - YAML.stub load_file: {gitlab_version: gitlab_version} - expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke - expect(Rake::Task["gitlab:backup:repo:restore"]).to receive :invoke - expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke - expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error - end - end - - end # backup_restore task - - describe 'backup_create' do - def tars_glob - Dir.glob(File.join(Gitlab.config.backup.path, '*_gitlab_backup.tar')) - end - - before :all do - # Record the existing backup tars so we don't touch them - existing_tars = tars_glob - - # Redirect STDOUT and run the rake task - orig_stdout = $stdout - $stdout = StringIO.new - run_rake_task('gitlab:backup:create') - $stdout = orig_stdout - - @backup_tar = (tars_glob - existing_tars).first - end - - after :all do - FileUtils.rm(@backup_tar) - end - - it 'should set correct permissions on the tar file' do - expect(File.exist?(@backup_tar)).to be_truthy - expect(File::Stat.new(@backup_tar).mode.to_s(8)).to eq('100600') - end - - it 'should set correct permissions on the tar contents' do - tar_contents, exit_status = Gitlab::Popen.popen( - %W{tar -tvf #{@backup_tar} db uploads repositories} - ) - expect(exit_status).to eq(0) - expect(tar_contents).to match('db/') - expect(tar_contents).to match('uploads/') - expect(tar_contents).to match('repositories/') - expect(tar_contents).not_to match(/^.{4,9}[rwx].* (db|uploads|repositories)\/$/) - end - - it 'should delete temp directories' do - temp_dirs = Dir.glob( - File.join(Gitlab.config.backup.path, '{db,repositories,uploads}') - ) - - expect(temp_dirs).to be_empty - end - end # backup_create task - - describe "Skipping items" do - def tars_glob - Dir.glob(File.join(Gitlab.config.backup.path, '*_gitlab_backup.tar')) - end - - before :all do - @origin_cd = Dir.pwd - - Rake::Task["gitlab:backup:db:create"].reenable - Rake::Task["gitlab:backup:repo:create"].reenable - Rake::Task["gitlab:backup:uploads:create"].reenable - - # Record the existing backup tars so we don't touch them - existing_tars = tars_glob - - # Redirect STDOUT and run the rake task - orig_stdout = $stdout - $stdout = StringIO.new - ENV["SKIP"] = "repositories" - run_rake_task('gitlab:backup:create') - $stdout = orig_stdout - - @backup_tar = (tars_glob - existing_tars).first - end - - after :all do - FileUtils.rm(@backup_tar) - Dir.chdir @origin_cd - end - - it "does not contain skipped item" do - tar_contents, exit_status = Gitlab::Popen.popen( - %W{tar -tvf #{@backup_tar} db uploads repositories} - ) - - expect(tar_contents).to match('db/') - expect(tar_contents).to match('uploads/') - expect(tar_contents).not_to match('repositories/') - end - - it 'does not invoke repositories restore' do - Rake::Task["gitlab:shell:setup"].stub invoke: true - allow($stdout).to receive :write - - expect(Rake::Task["gitlab:backup:db:restore"]).to receive :invoke - expect(Rake::Task["gitlab:backup:repo:restore"]).not_to receive :invoke - expect(Rake::Task["gitlab:shell:setup"]).to receive :invoke - expect { run_rake_task('gitlab:backup:restore') }.to_not raise_error - end - end -end # gitlab:app namespace diff --git a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb b/spec/tasks/gitlab/mail_google_schema_whitelisting.rb deleted file mode 100644 index 22e746870dc..00000000000 --- a/spec/tasks/gitlab/mail_google_schema_whitelisting.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'spec_helper' -require 'rake' - -describe 'gitlab:mail_google_schema_whitelisting rake task' do - before :all do - Rake.application.rake_require "tasks/gitlab/task_helpers" - Rake.application.rake_require "tasks/gitlab/mail_google_schema_whitelisting" - # empty task as env is already loaded - Rake::Task.define_task :environment - end - - describe 'call' do - before do - # avoid writing task output to spec progress - allow($stdout).to receive :write - end - - let :run_rake_task do - Rake::Task["gitlab:mail_google_schema_whitelisting"].reenable - Rake.application.invoke_task "gitlab:mail_google_schema_whitelisting" - end - - it 'should run the task without errors' do - expect { run_rake_task }.to_not raise_error - end - end -end diff --git a/spec/workers/fork_registration_worker_spec.rb b/spec/workers/fork_registration_worker_spec.rb deleted file mode 100644 index cc6f574b29c..00000000000 --- a/spec/workers/fork_registration_worker_spec.rb +++ /dev/null @@ -1,10 +0,0 @@ - -require 'spec_helper' - -describe ForkRegistrationWorker do - context "as a resque worker" do - it "reponds to #perform" do - expect(ForkRegistrationWorker.new).to respond_to(:perform) - end - end -end diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb deleted file mode 100644 index df1a2b84a53..00000000000 --- a/spec/workers/post_receive_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'spec_helper' - -describe PostReceive do - let(:changes) { "123456 789012 refs/heads/tést\n654321 210987 refs/tags/tag" } - let(:wrongly_encoded_changes) { changes.encode("ISO-8859-1").force_encoding("UTF-8") } - let(:base64_changes) { Base64.encode64(wrongly_encoded_changes) } - - context "as a resque worker" do - it "reponds to #perform" do - expect(PostReceive.new).to respond_to(:perform) - end - end - - context "web hook" do - let(:project) { create(:project) } - let(:key) { create(:key, user: project.owner) } - let(:key_id) { key.shell_id } - - it "fetches the correct project" do - expect(Project).to receive(:find_with_namespace).with(project.path_with_namespace).and_return(project) - PostReceive.new.perform(pwd(project), key_id, base64_changes) - end - - it "does not run if the author is not in the project" do - allow(Key).to receive(:find_by).with(hash_including(id: anything())) { nil } - - expect(project).not_to receive(:execute_hooks) - - expect(PostReceive.new.perform(pwd(project), key_id, base64_changes)).to be_falsey - end - - it "asks the project to trigger all hooks" do - Project.stub(find_with_namespace: project) - expect(project).to receive(:execute_hooks).twice - expect(project).to receive(:execute_services).twice - expect(project).to receive(:update_merge_requests) - - PostReceive.new.perform(pwd(project), key_id, base64_changes) - end - end - - def pwd(project) - File.join(Gitlab.config.gitlab_shell.repos_path, project.path_with_namespace) - end -end diff --git a/spec/workers/repository_archive_worker_spec.rb b/spec/workers/repository_archive_worker_spec.rb deleted file mode 100644 index c2362058cfd..00000000000 --- a/spec/workers/repository_archive_worker_spec.rb +++ /dev/null @@ -1,80 +0,0 @@ -require 'spec_helper' - -describe RepositoryArchiveWorker do - let(:project) { create(:project) } - subject { RepositoryArchiveWorker.new } - - before do - allow(Project).to receive(:find).and_return(project) - end - - describe "#perform" do - it "cleans old archives" do - expect(project.repository).to receive(:clean_old_archives) - - subject.perform(project.id, "master", "zip") - end - - context "when the repository doesn't have an archive file path" do - before do - allow(project.repository).to receive(:archive_file_path).and_return(nil) - end - - it "doesn't archive the repo" do - expect(project.repository).not_to receive(:archive_repo) - - subject.perform(project.id, "master", "zip") - end - end - - context "when the repository has an archive file path" do - let(:file_path) { "/archive.zip" } - let(:pid_file_path) { "/archive.zip.pid" } - - before do - allow(project.repository).to receive(:archive_file_path).and_return(file_path) - allow(project.repository).to receive(:archive_pid_file_path).and_return(pid_file_path) - end - - context "when the archive file already exists" do - before do - allow(File).to receive(:exist?).with(file_path).and_return(true) - end - - it "doesn't archive the repo" do - expect(project.repository).not_to receive(:archive_repo) - - subject.perform(project.id, "master", "zip") - end - end - - context "when the archive file doesn't exist yet" do - before do - allow(File).to receive(:exist?).with(file_path).and_return(false) - allow(File).to receive(:exist?).with(pid_file_path).and_return(true) - end - - context "when the archive pid file doesn't exist yet" do - before do - allow(File).to receive(:exist?).with(pid_file_path).and_return(false) - end - - it "archives the repo" do - expect(project.repository).to receive(:archive_repo) - - subject.perform(project.id, "master", "zip") - end - end - - context "when the archive pid file already exists" do - it "doesn't archive the repo" do - expect(project.repository).not_to receive(:archive_repo) - - subject.perform(project.id, "master", "zip") - end - end - end - end - end -end - diff --git a/tmp/.gitkeep b/tmp/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tmp/pids/.gitkeep b/tmp/pids/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tmp/sockets/.gitkeep b/tmp/sockets/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/vendor/assets/javascripts/chart-lib.min.js b/vendor/assets/javascripts/chart-lib.min.js deleted file mode 100644 index 3a0a2c87345..00000000000 --- a/vendor/assets/javascripts/chart-lib.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Chart.js - * http://chartjs.org/ - * Version: 1.0.2 - * - * Copyright 2015 Nick Downie - * Released under the MIT license - * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md - */ -(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),tthis.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
        <% for (var i=0; i
      • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
      • <%}%>
      '};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
    10. <%if(segments[i].label){%><%=segments[i].label%><%}%>
    11. <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
    12. <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    13. <%}%>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
        <% for (var i=0; i
      • <%if(segments[i].label){%><%=segments[i].label%><%}%>
      • <%}%>
      '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
    14. <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
    15. <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/vendor/assets/javascripts/g.bar-min.js b/vendor/assets/javascripts/g.bar-min.js deleted file mode 100644 index 7620dabda74..00000000000 --- a/vendor/assets/javascripts/g.bar-min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * g.Raphael 0.5 - Charting library, based on Raphaël - * - * Copyright (c) 2009 Dmitry Baranovskiy (http://g.raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - * From: https://github.com/jhurt/g.raphael/blob/master/g.bar.js - */ -(function(){function c(c,d,e,f,g,h,i,j){var k,l={round:"round",sharp:"sharp",soft:"soft",square:"square"};if(g&&!f||!g&&!e)return i?"":j.path();switch(h=l[h]||"square",f=Math.round(f),e=Math.round(e),c=Math.round(c),d=Math.round(d),h){case"round":if(g)m=~~(e/2),m>f?(m=f,k=["M",c-~~(e/2),d,"l",0,0,"a",~~(e/2),m,0,0,1,e,0,"l",0,0,"z"]):k=["M",c-m,d,"l",0,m-f,"a",m,m,0,1,1,e,0,"l",0,f-m,"z"];else{var m=~~(f/2);m>e?(m=e,k=["M",c+.5,d+.5-~~(f/2),"l",0,0,"a",m,~~(f/2),0,0,1,0,f,"l",0,0,"z"]):k=["M",c+.5,d+.5-m,"l",e-m,0,"a",m,m,0,1,1,0,f,"l",m-e,0,"z"]}break;case"sharp":if(g)n=~~(e/2),k=["M",c+n,d,"l",-e,0,0,-b(f-n,0),n,-a(n,f),n,a(n,f),n,"z"];else{var n=~~(f/2);k=["M",c,d+n,"l",0,-f,b(e-n,0),0,a(n,e),n,-a(n,e),n+(f>2*n),"z"]}break;case"square":k=g?["M",c+~~(e/2),d,"l",1-e,0,0,-f,e-1,0,"z"]:["M",c,d+~~(f/2),"l",0,-f,e,0,0,f,"z"];break;case"soft":g?(m=a(Math.round(e/5),f),k=["M",c-~~(e/2),d,"l",0,m-f,"a",m,m,0,0,1,m,-m,"l",e-2*m,0,"a",m,m,0,0,1,m,m,"l",0,f-m,"z"]):(m=a(e,Math.round(f/5)),k=["M",c+.5,d+.5-~~(f/2),"l",e-m,0,"a",m,m,0,0,1,m,m,"l",0,f-2*m,"a",m,m,0,0,1,-m,m,"l",m-e,0,"z"])}return i?k.join(","):j.path(k)}function d(a,b,d,e,f,g,h){h=h||{};var i=this,j=h.type||"square",k=parseFloat(h.gutter||"20%"),l=a.set(),m=a.set(),n=a.set(),o=a.set(),p=Math.max.apply(Math,g),q=[],r=0,s=h.colors||i.colors,t=g.length;if(Raphael.is(g[0],"array")){p=[],r=t,t=0;for(var u=g.length;u--;)m.push(a.set()),p.push(Math.max.apply(Math,g[u])),t=Math.max(t,g[u].length);if(h.stacked)for(var u=t;u--;){for(var v=0,w=g.length;w--;)v+=+g[w][u]||0;q.push(v)}for(var u=g.length;u--;)if(t>g[u].length)for(var w=t;w--;)g[u].push(0);p=Math.max.apply(Math,h.stacked?q:p)}p=h.to||p;var x=100*(e/(t*(100+k)+k)),y=x*k/100,z=null==h.vgutter?20:h.vgutter,A=[],B=b+y,C=(f-2*z)/p;h.stretch||(y=Math.round(y),x=Math.floor(x)),!h.stacked&&(x/=r||1);for(var u=0;t>u;u++){A=[];for(var w=0;(r||1)>w;w++){var D=Math.round((r?g[w][u]:g[u])*C),E=d+f-z-D,F=c(Math.round(B+x/2),E+D,x,D,!0,j,null,a).attr({stroke:"none",fill:s[r?w:u]});r?m[w].push(F):m.push(F),F.y=E,F.x=Math.round(B+x/2),F.w=x,F.h=D,F.value=r?g[w][u]:g[u],h.stacked?A.push(F):B+=x}if(h.stacked){var G;o.push(G=a.rect(A[0].x-A[0].w/2,d,x,f).attr(i.shim)),G.bars=a.set();for(var H=0,I=A.length;I--;)A[I].toFront();for(var I=0,J=A.length;J>I;I++){var K,F=A[I],D=(H+F.value)*C,L=c(F.x,d+f-z-.5*!!H,x,D,!0,j,1,a);G.bars.push(F),H&&F.attr({path:L}),F.h=D,F.y=d+f-z-.5*!!H-D,n.push(K=a.rect(F.x-F.w/2,F.y,x,F.value*C).attr(i.shim)),K.bar=F,K.value=F.value,H+=F.value}B+=x}B+=y}if(o.toFront(),B=b+y,!h.stacked)for(var u=0;t>u;u++){for(var w=0;(r||1)>w;w++){var K;n.push(K=a.rect(Math.round(B),d+z,x,f-z).attr(i.shim)),K.bar=r?m[w][u]:m[u],K.value=K.bar.value,B+=x}B+=y}return l.label=function(b,c){b=b||[],this.labels=a.set();var e,j=-1/0;if(h.stacked){for(var k=0;t>k;k++)for(var l=0,o=0;(r||1)>o;o++)if(l+=r?g[o][k]:g[k],o==r-1){var q=i.labelise(b[k],l,p);e=a.text(m[o][k].x,d+f-z/2,q).attr(i.txtattr).attr({fill:h.legendcolor||"#000","text-anchor":"start"}).insertBefore(n[k*(r||1)+o]);var s=e.getBBox();j>s.x-7?e.remove():(this.labels.push(e),j=s.x+s.width)}}else for(var k=0;t>k;k++)for(var o=0;(r||1)>o;o++){var q=i.labelise(r?b[o]&&b[o][k]:b[k],r?g[o][k]:g[k],p);e=a.text(m[o][k].x-x/2,c?d+f-z/2:m[o][k].y-10,q).attr(i.txtattr).attr({fill:h.legendcolor||"#000","text-anchor":"start"}).insertBefore(n[k*(r||1)+o]);var s=e.getBBox();e.translate((x-s.width)/2,1),j>s.x-7?e.remove():(this.labels.push(e),j=s.x+s.width)}return this},l.hover=function(a,b){return o.hide(),n.show(),n.mouseover(a).mouseout(b),this},l.hoverColumn=function(a,b){return n.hide(),o.show(),b=b||function(){},o.mouseover(a).mouseout(b),this},l.click=function(a){return o.hide(),n.show(),n.click(a),this},l.each=function(a){if(!Raphael.is(a,"function"))return this;for(var b=n.length;b--;)a.call(n[b]);return this},l.eachColumn=function(a){if(!Raphael.is(a,"function"))return this;for(var b=o.length;b--;)a.call(o[b]);return this},l.clickColumn=function(a){return n.hide(),o.show(),o.click(a),this},l.push(m,n,o),l.bars=m,l.covers=n,l}function e(a,b,d,e,f,g,h){h=h||{};var i=this,j=h.type||"square",k=parseFloat(h.gutter||"20%"),l=a.set(),m=a.set(),n=a.set(),o=a.set(),p=Math.max.apply(Math,g),q=[],r=0,s=h.colors||i.colors,t=g.length;if(Raphael.is(g[0],"array")){p=[],r=t,t=0;for(var u=g.length;u--;)m.push(a.set()),p.push(Math.max.apply(Math,g[u])),t=Math.max(t,g[u].length);if(h.stacked)for(var u=t;u--;){for(var v=0,w=g.length;w--;)v+=+g[w][u]||0;q.push(v)}for(var u=g.length;u--;)if(t>g[u].length)for(var w=t;w--;)g[u].push(0);p=Math.max.apply(Math,h.stacked?q:p)}p=h.to||p;var x=Math.floor(100*(f/(t*(100+k)+k))),y=Math.floor(x*k/100),z=[],A=d+y,B=(e-1)/p;!h.stacked&&(x/=r||1);for(var u=0;t>u;u++){z=[];for(var w=0;(r||1)>w;w++){var C=r?g[w][u]:g[u],D=c(b,A+x/2,Math.round(C*B),x-1,!1,j,null,a).attr({stroke:"none",fill:s[r?w:u]});r?m[w].push(D):m.push(D),D.x=b+Math.round(C*B),D.y=A+x/2,D.w=Math.round(C*B),D.h=x,D.value=+C,h.stacked?z.push(D):A+=x}if(h.stacked){var E=a.rect(b,z[0].y-z[0].h/2,e,x).attr(i.shim);o.push(E),E.bars=a.set();for(var F=0,G=z.length;G--;)z[G].toFront();for(var G=0,H=z.length;H>G;G++){var I,D=z[G],C=Math.round((F+D.value)*B),J=c(b,D.y,C,x-1,!1,j,1,a);E.bars.push(D),F&&D.attr({path:J}),D.w=C,D.x=b+C,n.push(I=a.rect(b+F*B,D.y-D.h/2,D.value*B,x).attr(i.shim)),I.bar=D,F+=D.value}A+=x}A+=y}if(o.toFront(),A=d+y,!h.stacked)for(var u=0;t>u;u++){for(var w=0;(r||1)>w;w++){var I=a.rect(b,A,e,x).attr(i.shim);n.push(I),I.bar=r?m[w][u]:m[u],I.value=I.bar.value,A+=x}A+=y}return l.label=function(c,d){c=c||[],this.labels=a.set();for(var e=0;t>e;e++)for(var f=0;r>f;f++){var o,j=i.labelise(r?c[f]&&c[f][e]:c[e],r?g[f][e]:g[e],p),k=d?m[f][e].x-x/2+3:b+5;this.labels.push(o=a.text(k,m[f][e].y,j).attr(i.txtattr).attr({fill:h.legendcolor||"#000","text-anchor":"start"}).insertBefore(n[0])),b+5>o.getBBox().x?o.attr({x:b+5,"text-anchor":"start"}):m[f][e].label=o}return this},l.hover=function(a,b){return o.hide(),n.show(),b=b||function(){},n.mouseover(a).mouseout(b),this},l.hoverColumn=function(a,b){return n.hide(),o.show(),b=b||function(){},o.mouseover(a).mouseout(b),this},l.each=function(a){if(!Raphael.is(a,"function"))return this;for(var b=n.length;b--;)a.call(n[b]);return this},l.eachColumn=function(a){if(!Raphael.is(a,"function"))return this;for(var b=o.length;b--;)a.call(o[b]);return this},l.click=function(a){return o.hide(),n.show(),n.click(a),this},l.clickColumn=function(a){return n.hide(),o.show(),o.click(a),this},l.push(m,n,o),l.bars=m,l.covers=n,l}var a=Math.min,b=Math.max,f=function(){};f.prototype=Raphael.g,e.prototype=d.prototype=new f,Raphael.fn.hbarchart=function(a,b,c,d,f,g){return new e(this,a,b,c,d,f,g)},Raphael.fn.barchart=function(a,b,c,e,f,g){return new d(this,a,b,c,e,f,g)}})(); \ No newline at end of file diff --git a/vendor/assets/javascripts/g.raphael-min.js b/vendor/assets/javascripts/g.raphael-min.js deleted file mode 100644 index f8b381c623b..00000000000 --- a/vendor/assets/javascripts/g.raphael-min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * g.Raphael 0.51 - Charting library, based on Raphaël - * - * Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com) - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. - */ -Raphael.el.popup=function(a,b,c,d){var f,g,h,i,j,e=this.paper||this[0].paper;if(e){switch(this.type){case"text":case"circle":case"ellipse":h=!0;break;default:h=!1}a=null==a?"up":a,b=b||5,f=this.getBBox(),c="number"==typeof c?c:h?f.x+f.width/2:f.x,d="number"==typeof d?d:h?f.y+f.height/2:f.y,i=Math.max(f.width/2-b,0),j=Math.max(f.height/2-b,0),this.translate(c-f.x-(h?f.width/2:0),d-f.y-(h?f.height/2:0)),f=this.getBBox();var k={up:["M",c,d,"l",-b,-b,-i,0,"a",b,b,0,0,1,-b,-b,"l",0,-f.height,"a",b,b,0,0,1,b,-b,"l",2*b+2*i,0,"a",b,b,0,0,1,b,b,"l",0,f.height,"a",b,b,0,0,1,-b,b,"l",-i,0,"z"].join(","),down:["M",c,d,"l",b,b,i,0,"a",b,b,0,0,1,b,b,"l",0,f.height,"a",b,b,0,0,1,-b,b,"l",-(2*b+2*i),0,"a",b,b,0,0,1,-b,-b,"l",0,-f.height,"a",b,b,0,0,1,b,-b,"l",i,0,"z"].join(","),left:["M",c,d,"l",-b,b,0,j,"a",b,b,0,0,1,-b,b,"l",-f.width,0,"a",b,b,0,0,1,-b,-b,"l",0,-(2*b+2*j),"a",b,b,0,0,1,b,-b,"l",f.width,0,"a",b,b,0,0,1,b,b,"l",0,j,"z"].join(","),right:["M",c,d,"l",b,-b,0,-j,"a",b,b,0,0,1,b,-b,"l",f.width,0,"a",b,b,0,0,1,b,b,"l",0,2*b+2*j,"a",b,b,0,0,1,-b,b,"l",-f.width,0,"a",b,b,0,0,1,-b,-b,"l",0,-j,"z"].join(",")};return g={up:{x:-!h*(f.width/2),y:2*-b-(h?f.height/2:f.height)},down:{x:-!h*(f.width/2),y:2*b+(h?f.height/2:f.height)},left:{x:2*-b-(h?f.width/2:f.width),y:-!h*(f.height/2)},right:{x:2*b+(h?f.width/2:f.width),y:-!h*(f.height/2)}}[a],this.translate(g.x,g.y),e.path(k[a]).attr({fill:"#000",stroke:"none"}).insertBefore(this.node?this:this[0])}},Raphael.el.tag=function(a,b,c,d){var e=3,f=this.paper||this[0].paper;if(f){var i,j,k,g=f.path().attr({fill:"#000",stroke:"#000"}),h=this.getBBox();switch(this.type){case"text":case"circle":case"ellipse":k=!0;break;default:k=!1}return a=a||0,c="number"==typeof c?c:k?h.x+h.width/2:h.x,d="number"==typeof d?d:k?h.y+h.height/2:h.y,b=null==b?5:b,j=.5522*b,h.height>=2*b?g.attr({path:["M",c,d+b,"a",b,b,0,1,1,0,2*-b,b,b,0,1,1,0,2*b,"m",0,2*-b-e,"a",b+e,b+e,0,1,0,0,2*(b+e),"L",c+b+e,d+h.height/2+e,"l",h.width+2*e,0,0,-h.height-2*e,-h.width-2*e,0,"L",c,d-b-e].join(",")}):(i=Math.sqrt(Math.pow(b+e,2)-Math.pow(h.height/2+e,2)),g.attr({path:["M",c,d+b,"c",-j,0,-b,j-b,-b,-b,0,-j,b-j,-b,b,-b,j,0,b,b-j,b,b,0,j,j-b,b,-b,b,"M",c+i,d-h.height/2-e,"a",b+e,b+e,0,1,0,0,h.height+2*e,"l",b+e-i+h.width+2*e,0,0,-h.height-2*e,"L",c+i,d-h.height/2-e].join(",")})),a=360-a,g.rotate(a,c,d),this.attrs?(this.attr(this.attrs.x?"x":"cx",c+b+e+(k?h.width/2:"text"==this.type?h.width:0)).attr("y",k?d:d-h.height/2),this.rotate(a,c,d),a>90&&270>a&&this.attr(this.attrs.x?"x":"cx",c-b-e-(k?h.width/2:h.width)).rotate(180,c,d)):a>90&&270>a?(this.translate(c-h.x-h.width-b-e,d-h.y-h.height/2),this.rotate(a-180,h.x+h.width+b+e,h.y+h.height/2)):(this.translate(c-h.x+b+e,d-h.y-h.height/2),this.rotate(a,h.x-b-e,h.y+h.height/2)),g.insertBefore(this.node?this:this[0])}},Raphael.el.drop=function(a,b,c){var f,g,h,i,j,d=this.getBBox(),e=this.paper||this[0].paper;if(e){switch(this.type){case"text":case"circle":case"ellipse":f=!0;break;default:f=!1}return a=a||0,b="number"==typeof b?b:f?d.x+d.width/2:d.x,c="number"==typeof c?c:f?d.y+d.height/2:d.y,g=Math.max(d.width,d.height)+Math.min(d.width,d.height),h=e.path(["M",b,c,"l",g,0,"A",.4*g,.4*g,0,1,0,b+.7*g,c-.7*g,"z"]).attr({fill:"#000",stroke:"none"}).rotate(22.5-a,b,c),a=(a+90)*Math.PI/180,i=b+g*Math.sin(a)-(f?0:d.width/2),j=c+g*Math.cos(a)-(f?0:d.height/2),this.attrs?this.attr(this.attrs.x?"x":"cx",i).attr(this.attrs.y?"y":"cy",j):this.translate(i-d.x,j-d.y),h.insertBefore(this.node?this:this[0])}},Raphael.el.flag=function(a,b,c){var d=3,e=this.paper||this[0].paper;if(e){var i,f=e.path().attr({fill:"#000",stroke:"#000"}),g=this.getBBox(),h=g.height/2;switch(this.type){case"text":case"circle":case"ellipse":i=!0;break;default:i=!1}return a=a||0,b="number"==typeof b?b:i?g.x+g.width/2:g.x,c="number"==typeof c?c:i?g.y+g.height/2:g.y,f.attr({path:["M",b,c,"l",h+d,-h-d,g.width+2*d,0,0,g.height+2*d,-g.width-2*d,0,"z"].join(",")}),a=360-a,f.rotate(a,b,c),this.attrs?(this.attr(this.attrs.x?"x":"cx",b+h+d+(i?g.width/2:"text"==this.type?g.width:0)).attr("y",i?c:c-g.height/2),this.rotate(a,b,c),a>90&&270>a&&this.attr(this.attrs.x?"x":"cx",b-h-d-(i?g.width/2:g.width)).rotate(180,b,c)):a>90&&270>a?(this.translate(b-g.x-g.width-h-d,c-g.y-g.height/2),this.rotate(a-180,g.x+g.width+h+d,g.y+g.height/2)):(this.translate(b-g.x+h+d,c-g.y-g.height/2),this.rotate(a,g.x-h-d,g.y+g.height/2)),f.insertBefore(this.node?this:this[0])}},Raphael.el.label=function(){var a=this.getBBox(),b=this.paper||this[0].paper,c=Math.min(20,a.width+10,a.height+10)/2;if(b)return b.rect(a.x-c/2,a.y-c/2,a.width+c,a.height+c,c).attr({stroke:"none",fill:"#000"}).insertBefore(this.node?this:this[0])},Raphael.el.blob=function(a,b,c){var g,h,i,d=this.getBBox(),e=Math.PI/180,f=this.paper||this[0].paper;if(f){switch(this.type){case"text":case"circle":case"ellipse":h=!0;break;default:h=!1}g=f.path().attr({fill:"#000",stroke:"none"}),a=(+a+1?a:45)+90,i=Math.min(d.height,d.width),b="number"==typeof b?b:h?d.x+d.width/2:d.x,c="number"==typeof c?c:h?d.y+d.height/2:d.y;var j=Math.max(d.width+i,25*i/12),k=Math.max(d.height+i,25*i/12),l=b+i*Math.sin((a-22.5)*e),m=c+i*Math.cos((a-22.5)*e),n=b+i*Math.sin((a+22.5)*e),o=c+i*Math.cos((a+22.5)*e),p=(n-l)/2,q=(o-m)/2,r=j/2,s=k/2,t=-Math.sqrt(Math.abs(r*r*s*s-r*r*q*q-s*s*p*p)/(r*r*q*q+s*s*p*p)),u=t*r*q/s+(n+l)/2,v=t*-s*p/r+(o+m)/2;return g.attr({x:u,y:v,path:["M",b,c,"L",n,o,"A",r,s,0,1,1,l,m,"z"].join(",")}),this.translate(u-d.x-d.width/2,v-d.y-d.height/2),g.insertBefore(this.node?this:this[0])}},Raphael.fn.label=function(a,b,c){var d=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),d.push(c.label(),c)},Raphael.fn.popup=function(a,b,c,d,e){var f=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),f.push(c.popup(d,e),c)},Raphael.fn.tag=function(a,b,c,d,e){var f=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),f.push(c.tag(d,e),c)},Raphael.fn.flag=function(a,b,c,d){var e=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),e.push(c.flag(d),c)},Raphael.fn.drop=function(a,b,c,d){var e=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),e.push(c.drop(d),c)},Raphael.fn.blob=function(a,b,c,d){var e=this.set();return c=this.text(a,b,c).attr(Raphael.g.txtattr),e.push(c.blob(d),c)},Raphael.el.lighter=function(a){a=a||2;var b=[this.attrs.fill,this.attrs.stroke];return this.fs=this.fs||[b[0],b[1]],b[0]=Raphael.rgb2hsb(Raphael.getRGB(b[0]).hex),b[1]=Raphael.rgb2hsb(Raphael.getRGB(b[1]).hex),b[0].b=Math.min(b[0].b*a,1),b[0].s=b[0].s/a,b[1].b=Math.min(b[1].b*a,1),b[1].s=b[1].s/a,this.attr({fill:"hsb("+[b[0].h,b[0].s,b[0].b]+")",stroke:"hsb("+[b[1].h,b[1].s,b[1].b]+")"}),this},Raphael.el.darker=function(a){a=a||2;var b=[this.attrs.fill,this.attrs.stroke];return this.fs=this.fs||[b[0],b[1]],b[0]=Raphael.rgb2hsb(Raphael.getRGB(b[0]).hex),b[1]=Raphael.rgb2hsb(Raphael.getRGB(b[1]).hex),b[0].s=Math.min(b[0].s*a,1),b[0].b=b[0].b/a,b[1].s=Math.min(b[1].s*a,1),b[1].b=b[1].b/a,this.attr({fill:"hsb("+[b[0].h,b[0].s,b[0].b]+")",stroke:"hsb("+[b[1].h,b[1].s,b[1].b]+")"}),this},Raphael.el.resetBrightness=function(){return this.fs&&(this.attr({fill:this.fs[0],stroke:this.fs[1]}),delete this.fs),this},function(){var a=["lighter","darker","resetBrightness"],b=["popup","tag","flag","label","drop","blob"];for(var c in b)(function(a){Raphael.st[a]=function(){return Raphael.el[a].apply(this,arguments)}})(b[c]);for(var c in a)(function(a){Raphael.st[a]=function(){for(var b=0;this.length>b;b++)this[b][a].apply(this[b],arguments);return this}})(a[c])}(),Raphael.g={shim:{stroke:"none",fill:"#000","fill-opacity":0},txtattr:{font:"12px Arial, sans-serif",fill:"#fff"},colors:function(){for(var a=[.6,.2,.05,.1333,.75,0],b=[],c=0;10>c;c++)a.length>c?b.push("hsb("+a[c]+",.75, .75)"):b.push("hsb("+a[c-a.length]+", 1, .5)");return b}(),snapEnds:function(a,b,c){function f(a){return.25>Math.abs(a-.5)?~~a+.5:Math.round(a)}var d=a,e=b;if(d==e)return{from:d,to:e,power:0};var g=(e-d)/c,h=~~g,i=h,j=0;if(h){for(;i;)j--,i=~~(g*Math.pow(10,j))/Math.pow(10,j);j++}else{if(0!=g&&isFinite(g))for(;!h;)j=j||1,h=~~(g*Math.pow(10,j))/Math.pow(10,j),j++;else j=1;j&&j--}return e=f(b*Math.pow(10,j))/Math.pow(10,j),b>e&&(e=f((b+.5)*Math.pow(10,j))/Math.pow(10,j)),d=f((a-(j>0?0:.5))*Math.pow(10,j))/Math.pow(10,j),{from:d,to:e,power:j}},axis:function(a,b,c,d,e,f,g,h,i,j,k){j=null==j?2:j,i=i||"t",f=f||10,k=arguments[arguments.length-1];var t,l="|"==i||" "==i?["M",a+.5,b,"l",0,.001]:1==g||3==g?["M",a+.5,b,"l",0,-c]:["M",a,b+.5,"l",c,0],m=this.snapEnds(d,e,f),n=m.from,o=m.to,p=m.power,q=0,r={font:"11px 'Fontin Sans', Fontin-Sans, sans-serif"},s=k.set();t=(o-n)/f;var u=n,v=p>0?p:0;if(z=c/f,1==+g||3==+g){for(var w=b,x=(g-1?1:-1)*(j+3+!!(g-1));w>=b-c;)"-"!=i&&" "!=i&&(l=l.concat(["M",a-("+"==i||"|"==i?j:2*!(g-1)*j),w+.5,"l",2*j+1,0])),s.push(k.text(a+x,w,h&&h[q++]||(Math.round(u)==u?u:+u.toFixed(v))).attr(r).attr({"text-anchor":g-1?"start":"end"})),u+=t,w-=z;Math.round(w+z-(b-c))&&("-"!=i&&" "!=i&&(l=l.concat(["M",a-("+"==i||"|"==i?j:2*!(g-1)*j),b-c+.5,"l",2*j+1,0])),s.push(k.text(a+x,b-c,h&&h[q]||(Math.round(u)==u?u:+u.toFixed(v))).attr(r).attr({"text-anchor":g-1?"start":"end"})))}else{u=n,v=(p>0)*p,x=(g?-1:1)*(j+9+!g);for(var y=a,z=c/f,A=0,B=0;a+c>=y;){"-"!=i&&" "!=i&&(l=l.concat(["M",y+.5,b-("+"==i?j:2*!!g*j),"l",0,2*j+1])),s.push(A=k.text(y,b+x,h&&h[q++]||(Math.round(u)==u?u:+u.toFixed(v))).attr(r));var C=A.getBBox();B>=C.x-5?s.pop(s.length-1).remove():B=C.x+C.width,u+=t,y+=z}Math.round(y-z-a-c)&&("-"!=i&&" "!=i&&(l=l.concat(["M",a+c+.5,b-("+"==i?j:2*!!g*j),"l",0,2*j+1])),s.push(k.text(a+c,b+x,h&&h[q]||(Math.round(u)==u?u:+u.toFixed(v))).attr(r)))}var D=k.path(l);return D.text=s,D.all=k.set([D,s]),D.remove=function(){this.text.remove(),this.constructor.prototype.remove.call(this)},D},labelise:function(a,b,c){return a?(a+"").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g,function(a,d,e){return d?(+b).toFixed(d.replace(/^#+\.?/g,"").length):e?(100*b/c).toFixed(e.replace(/^%+\.?/g,"").length)+"%":void 0}):(+b).toFixed(0)}}; \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery.blockUI.js b/vendor/assets/javascripts/jquery.blockUI.js deleted file mode 100644 index c8702d79b65..00000000000 --- a/vendor/assets/javascripts/jquery.blockUI.js +++ /dev/null @@ -1,590 +0,0 @@ -/*! - * jQuery blockUI plugin - * Version 2.60.0-2013.04.05 - * @requires jQuery v1.7 or later - * - * Examples at: http://malsup.com/jquery/block/ - * Copyright (c) 2007-2013 M. Alsup - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - * Thanks to Amir-Hossein Sobhi for some excellent contributions! - */ - -;(function() { -/*jshint eqeqeq:false curly:false latedef:false */ -"use strict"; - - function setup($) { - $.fn._fadeIn = $.fn.fadeIn; - - var noOp = $.noop || function() {}; - - // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle - // retarded userAgent strings on Vista) - var msie = /MSIE/.test(navigator.userAgent); - var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent); - var mode = document.documentMode || 0; - var setExpr = $.isFunction( document.createElement('div').style.setExpression ); - - // global $ methods for blocking/unblocking the entire page - $.blockUI = function(opts) { install(window, opts); }; - $.unblockUI = function(opts) { remove(window, opts); }; - - // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) - $.growlUI = function(title, message, timeout, onClose) { - var $m = $('
      '); - if (title) $m.append('

      '+title+'

      '); - if (message) $m.append('

      '+message+'

      '); - if (timeout === undefined) timeout = 3000; - $.blockUI({ - message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, - timeout: timeout, showOverlay: false, - onUnblock: onClose, - css: $.blockUI.defaults.growlCSS - }); - }; - - // plugin method for blocking element content - $.fn.block = function(opts) { - if ( this[0] === window ) { - $.blockUI( opts ); - return this; - } - var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); - this.each(function() { - var $el = $(this); - if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked')) - return; - $el.unblock({ fadeOut: 0 }); - }); - - return this.each(function() { - if ($.css(this,'position') == 'static') { - this.style.position = 'relative'; - $(this).data('blockUI.static', true); - } - this.style.zoom = 1; // force 'hasLayout' in ie - install(this, opts); - }); - }; - - // plugin method for unblocking element content - $.fn.unblock = function(opts) { - if ( this[0] === window ) { - $.unblockUI( opts ); - return this; - } - return this.each(function() { - remove(this, opts); - }); - }; - - $.blockUI.version = 2.60; // 2nd generation blocking at no extra cost! - - // override these in your code to change the default behavior and style - $.blockUI.defaults = { - // message displayed when blocking (use null for no message) - message: '

      Please wait...

      ', - - title: null, // title string; only used when theme == true - draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) - - theme: false, // set to true to use with jQuery UI themes - - // styles for the message when blocking; if you wish to disable - // these and use an external stylesheet then do this in your code: - // $.blockUI.defaults.css = {}; - css: { - padding: 0, - margin: 0, - width: '30%', - top: '40%', - left: '35%', - textAlign: 'center', - color: '#000', - border: '3px solid #aaa', - backgroundColor:'#fff', - cursor: 'wait' - }, - - // minimal style set used when themes are used - themedCSS: { - width: '30%', - top: '40%', - left: '35%' - }, - - // styles for the overlay - overlayCSS: { - backgroundColor: '#000', - opacity: 0.6, - cursor: 'wait' - }, - - // style to replace wait cursor before unblocking to correct issue - // of lingering wait cursor - cursorReset: 'default', - - // styles applied when using $.growlUI - growlCSS: { - width: '350px', - top: '10px', - left: '', - right: '10px', - border: 'none', - padding: '5px', - opacity: 0.6, - cursor: 'default', - color: '#fff', - backgroundColor: '#000', - '-webkit-border-radius':'10px', - '-moz-border-radius': '10px', - 'border-radius': '10px' - }, - - // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w - // (hat tip to Jorge H. N. de Vasconcelos) - /*jshint scripturl:true */ - iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', - - // force usage of iframe in non-IE browsers (handy for blocking applets) - forceIframe: false, - - // z-index for the blocking overlay - baseZ: 1000, - - // set these to true to have the message automatically centered - centerX: true, // <-- only effects element blocking (page block controlled via css above) - centerY: true, - - // allow body element to be stetched in ie6; this makes blocking look better - // on "short" pages. disable if you wish to prevent changes to the body height - allowBodyStretch: true, - - // enable if you want key and mouse events to be disabled for content that is blocked - bindEvents: true, - - // be default blockUI will supress tab navigation from leaving blocking content - // (if bindEvents is true) - constrainTabKey: true, - - // fadeIn time in millis; set to 0 to disable fadeIn on block - fadeIn: 200, - - // fadeOut time in millis; set to 0 to disable fadeOut on unblock - fadeOut: 400, - - // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock - timeout: 0, - - // disable if you don't want to show the overlay - showOverlay: true, - - // if true, focus will be placed in the first available input field when - // page blocking - focusInput: true, - - // elements that can receive focus - focusableElements: ':input:enabled:visible', - - // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) - // no longer needed in 2012 - // applyPlatformOpacityRules: true, - - // callback method invoked when fadeIn has completed and blocking message is visible - onBlock: null, - - // callback method invoked when unblocking has completed; the callback is - // passed the element that has been unblocked (which is the window object for page - // blocks) and the options that were passed to the unblock call: - // onUnblock(element, options) - onUnblock: null, - - // callback method invoked when the overlay area is clicked. - // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used. - onOverlayClick: null, - - // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 - quirksmodeOffsetHack: 4, - - // class name of the message block - blockMsgClass: 'blockMsg', - - // if it is already blocked, then ignore it (don't unblock and reblock) - ignoreIfBlocked: false - }; - - // private data and functions follow... - - var pageBlock = null; - var pageBlockEls = []; - - function install(el, opts) { - var css, themedCSS; - var full = (el == window); - var msg = (opts && opts.message !== undefined ? opts.message : undefined); - opts = $.extend({}, $.blockUI.defaults, opts || {}); - - if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked')) - return; - - opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); - css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); - if (opts.onOverlayClick) - opts.overlayCSS.cursor = 'pointer'; - - themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); - msg = msg === undefined ? opts.message : msg; - - // remove the current block (if there is one) - if (full && pageBlock) - remove(window, {fadeOut:0}); - - // if an existing element is being used as the blocking content then we capture - // its current place in the DOM (and current display style) so we can restore - // it when we unblock - if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { - var node = msg.jquery ? msg[0] : msg; - var data = {}; - $(el).data('blockUI.history', data); - data.el = node; - data.parent = node.parentNode; - data.display = node.style.display; - data.position = node.style.position; - if (data.parent) - data.parent.removeChild(node); - } - - $(el).data('blockUI.onUnblock', opts.onUnblock); - var z = opts.baseZ; - - // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; - // layer1 is the iframe layer which is used to supress bleed through of underlying content - // layer2 is the overlay layer which has opacity and a wait cursor (by default) - // layer3 is the message content that is displayed while blocking - var lyr1, lyr2, lyr3, s; - if (msie || opts.forceIframe) - lyr1 = $(''); - else - lyr1 = $(''); - - if (opts.theme) - lyr2 = $(''); - else - lyr2 = $(''); - - if (opts.theme && full) { - s = ''; - } - else if (opts.theme) { - s = ''; - } - else if (full) { - s = ''; - } - else { - s = ''; - } - lyr3 = $(s); - - // if we have a message, style it - if (msg) { - if (opts.theme) { - lyr3.css(themedCSS); - lyr3.addClass('ui-widget-content'); - } - else - lyr3.css(css); - } - - // style the overlay - if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) - lyr2.css(opts.overlayCSS); - lyr2.css('position', full ? 'fixed' : 'absolute'); - - // make iframe layer transparent in IE - if (msie || opts.forceIframe) - lyr1.css('opacity',0.0); - - //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); - var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); - $.each(layers, function() { - this.appendTo($par); - }); - - if (opts.theme && opts.draggable && $.fn.draggable) { - lyr3.draggable({ - handle: '.ui-dialog-titlebar', - cancel: 'li' - }); - } - - // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) - var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); - if (ie6 || expr) { - // give body 100% height - if (full && opts.allowBodyStretch && $.support.boxModel) - $('html,body').css('height','100%'); - - // fix ie6 issue when blocked element has a border width - if ((ie6 || !$.support.boxModel) && !full) { - var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); - var fixT = t ? '(0 - '+t+')' : 0; - var fixL = l ? '(0 - '+l+')' : 0; - } - - // simulate fixed position - $.each(layers, function(i,o) { - var s = o[0].style; - s.position = 'absolute'; - if (i < 2) { - if (full) - s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); - else - s.setExpression('height','this.parentNode.offsetHeight + "px"'); - if (full) - s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); - else - s.setExpression('width','this.parentNode.offsetWidth + "px"'); - if (fixL) s.setExpression('left', fixL); - if (fixT) s.setExpression('top', fixT); - } - else if (opts.centerY) { - if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); - s.marginTop = 0; - } - else if (!opts.centerY && full) { - var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; - var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; - s.setExpression('top',expression); - } - }); - } - - // show the message - if (msg) { - if (opts.theme) - lyr3.find('.ui-widget-content').append(msg); - else - lyr3.append(msg); - if (msg.jquery || msg.nodeType) - $(msg).show(); - } - - if ((msie || opts.forceIframe) && opts.showOverlay) - lyr1.show(); // opacity is zero - if (opts.fadeIn) { - var cb = opts.onBlock ? opts.onBlock : noOp; - var cb1 = (opts.showOverlay && !msg) ? cb : noOp; - var cb2 = msg ? cb : noOp; - if (opts.showOverlay) - lyr2._fadeIn(opts.fadeIn, cb1); - if (msg) - lyr3._fadeIn(opts.fadeIn, cb2); - } - else { - if (opts.showOverlay) - lyr2.show(); - if (msg) - lyr3.show(); - if (opts.onBlock) - opts.onBlock(); - } - - // bind key and mouse events - bind(1, el, opts); - - if (full) { - pageBlock = lyr3[0]; - pageBlockEls = $(opts.focusableElements,pageBlock); - if (opts.focusInput) - setTimeout(focus, 20); - } - else - center(lyr3[0], opts.centerX, opts.centerY); - - if (opts.timeout) { - // auto-unblock - var to = setTimeout(function() { - if (full) - $.unblockUI(opts); - else - $(el).unblock(opts); - }, opts.timeout); - $(el).data('blockUI.timeout', to); - } - } - - // remove the block - function remove(el, opts) { - var count; - var full = (el == window); - var $el = $(el); - var data = $el.data('blockUI.history'); - var to = $el.data('blockUI.timeout'); - if (to) { - clearTimeout(to); - $el.removeData('blockUI.timeout'); - } - opts = $.extend({}, $.blockUI.defaults, opts || {}); - bind(0, el, opts); // unbind events - - if (opts.onUnblock === null) { - opts.onUnblock = $el.data('blockUI.onUnblock'); - $el.removeData('blockUI.onUnblock'); - } - - var els; - if (full) // crazy selector to handle odd field errors in ie6/7 - els = $('body').children().filter('.blockUI').add('body > .blockUI'); - else - els = $el.find('>.blockUI'); - - // fix cursor issue - if ( opts.cursorReset ) { - if ( els.length > 1 ) - els[1].style.cursor = opts.cursorReset; - if ( els.length > 2 ) - els[2].style.cursor = opts.cursorReset; - } - - if (full) - pageBlock = pageBlockEls = null; - - if (opts.fadeOut) { - count = els.length; - els.fadeOut(opts.fadeOut, function() { - if ( --count === 0) - reset(els,data,opts,el); - }); - } - else - reset(els, data, opts, el); - } - - // move blocking element back into the DOM where it started - function reset(els,data,opts,el) { - var $el = $(el); - els.each(function(i,o) { - // remove via DOM calls so we don't lose event handlers - if (this.parentNode) - this.parentNode.removeChild(this); - }); - - if (data && data.el) { - data.el.style.display = data.display; - data.el.style.position = data.position; - if (data.parent) - data.parent.appendChild(data.el); - $el.removeData('blockUI.history'); - } - - if ($el.data('blockUI.static')) { - $el.css('position', 'static'); // #22 - } - - if (typeof opts.onUnblock == 'function') - opts.onUnblock(el,opts); - - // fix issue in Safari 6 where block artifacts remain until reflow - var body = $(document.body), w = body.width(), cssW = body[0].style.width; - body.width(w-1).width(w); - body[0].style.width = cssW; - } - - // bind/unbind the handler - function bind(b, el, opts) { - var full = el == window, $el = $(el); - - // don't bother unbinding if there is nothing to unbind - if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) - return; - - $el.data('blockUI.isBlocked', b); - - // don't bind events when overlay is not in use or if bindEvents is false - if (!full || !opts.bindEvents || (b && !opts.showOverlay)) - return; - - // bind anchors and inputs for mouse and key events - var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; - if (b) - $(document).bind(events, opts, handler); - else - $(document).unbind(events, handler); - - // former impl... - // var $e = $('a,:input'); - // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); - } - - // event handler to suppress keyboard/mouse events when blocking - function handler(e) { - // allow tab navigation (conditionally) - if (e.keyCode && e.keyCode == 9) { - if (pageBlock && e.data.constrainTabKey) { - var els = pageBlockEls; - var fwd = !e.shiftKey && e.target === els[els.length-1]; - var back = e.shiftKey && e.target === els[0]; - if (fwd || back) { - setTimeout(function(){focus(back);},10); - return false; - } - } - } - var opts = e.data; - var target = $(e.target); - if (target.hasClass('blockOverlay') && opts.onOverlayClick) - opts.onOverlayClick(); - - // allow events within the message content - if (target.parents('div.' + opts.blockMsgClass).length > 0) - return true; - - // allow events for content that is not being blocked - return target.parents().children().filter('div.blockUI').length === 0; - } - - function focus(back) { - if (!pageBlockEls) - return; - var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; - if (e) - e.focus(); - } - - function center(el, x, y) { - var p = el.parentNode, s = el.style; - var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); - var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); - if (x) s.left = l > 0 ? (l+'px') : '0'; - if (y) s.top = t > 0 ? (t+'px') : '0'; - } - - function sz(el, p) { - return parseInt($.css(el,p),10)||0; - } - - } - - - /*global define:true */ - if (typeof define === 'function' && define.amd && define.amd.jQuery) { - define(['jquery'], setup); - } else { - setup(jQuery); - } - -})(); diff --git a/vendor/assets/javascripts/jquery.cookie.js b/vendor/assets/javascripts/jquery.cookie.js deleted file mode 100644 index 6a3e394b403..00000000000 --- a/vendor/assets/javascripts/jquery.cookie.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * jQuery Cookie plugin - * - * Copyright (c) 2010 Klaus Hartl (stilbuero.de) - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ -jQuery.cookie = function (key, value, options) { - - // key and at least value given, set cookie... - if (arguments.length > 1 && String(value) !== "[object Object]") { - options = jQuery.extend({}, options); - - if (value === null || value === undefined) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', - options.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // key and possibly options given, get cookie... - options = value || {}; - var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent; - return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null; -}; diff --git a/vendor/assets/javascripts/jquery.endless-scroll.js b/vendor/assets/javascripts/jquery.endless-scroll.js deleted file mode 100644 index 38db6b05101..00000000000 --- a/vendor/assets/javascripts/jquery.endless-scroll.js +++ /dev/null @@ -1,128 +0,0 @@ -/** - * Endless Scroll plugin for jQuery - * - * v1.4.8 - * - * Copyright (c) 2008 Fred Wu - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -/** - * Usage: - * - * // using default options - * $(document).endlessScroll(); - * - * // using some custom options - * $(document).endlessScroll({ - * fireOnce: false, - * fireDelay: false, - * loader: "
      ", - * callback: function(){ - * alert("test"); - * } - * }); - * - * Configuration options: - * - * bottomPixels integer the number of pixels from the bottom of the page that triggers the event - * fireOnce boolean only fire once until the execution of the current event is completed - * fireDelay integer delay the subsequent firing, in milliseconds, 0 or false to disable delay - * loader string the HTML to be displayed during loading - * data string|function plain HTML data, can be either a string or a function that returns a string, - * when passed as a function it accepts one argument: fire sequence (the number - * of times the event triggered during the current page session) - * insertAfter string jQuery selector syntax: where to put the loader as well as the plain HTML data - * callback function callback function, accepts one argument: fire sequence (the number of times - * the event triggered during the current page session) - * resetCounter function resets the fire sequence counter if the function returns true, this function - * could also perform hook actions since it is applied at the start of the event - * ceaseFire function stops the event (no more endless scrolling) if the function returns true - * - * Usage tips: - * - * The plugin is more useful when used with the callback function, which can then make AJAX calls to retrieve content. - * The fire sequence argument (for the callback function) is useful for 'pagination'-like features. - */ - -(function($){ - - $.fn.endlessScroll = function(options) { - - var defaults = { - bottomPixels : 50, - fireOnce : true, - fireDelay : 150, - loader : "
      Loading...
      ", - data : "", - insertAfter : "div:last", - resetCounter : function() { return false; }, - callback : function() { return true; }, - ceaseFire : function() { return false; } - }; - - var options = $.extend({}, defaults, options), - firing = true, - fired = false, - fireSequence = 0, - is_scrollable; - - if (options.ceaseFire.apply(this) === true) - firing = false; - - if (firing === true) { - $(this).scroll(function() { - if (options.ceaseFire.apply(this) === true) { - firing = false; - return; // Scroll will still get called, but nothing will happen - } - - if (this == document || this == window) { - is_scrollable = $(document).height() - $(window).height() <= $(window).scrollTop() + options.bottomPixels; - } else { - // calculates the actual height of the scrolling container - var inner_wrap = $(".endless_scroll_inner_wrap", this); - if (inner_wrap.length == 0) - inner_wrap = $(this).wrapInner("
      ").find(".endless_scroll_inner_wrap"); - is_scrollable = inner_wrap.length > 0 && - (inner_wrap.height() - $(this).height() <= $(this).scrollTop() + options.bottomPixels); - } - - if (is_scrollable && (options.fireOnce == false || (options.fireOnce == true && fired != true))) { - if (options.resetCounter.apply(this) === true) fireSequence = 0; - - fired = true; - fireSequence++; - - $(options.insertAfter).after("
      " + options.loader + "
      "); - - data = typeof options.data == 'function' ? options.data.apply(this, [fireSequence]) : options.data; - - if (data !== false) { - $(options.insertAfter).after("
      " + data + "
      "); - $("#endless_scroll_data").hide().fadeIn(250, function() {$(this).removeAttr("id");}); - - options.callback.apply(this, [fireSequence]); - - if (options.fireDelay !== false || options.fireDelay !== 0) { - $("body").after("
      "); - // slight delay for preventing event firing twice - $("#endless_scroll_marker").fadeTo(options.fireDelay, 1, function() { - $(this).remove(); - fired = false; - }); - } - else - fired = false; - } - - $("#endless_scroll_loader").remove(); - } - }); - } - }; - -})(jQuery); \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery.highlight.js b/vendor/assets/javascripts/jquery.highlight.js deleted file mode 100644 index 7a67cf99844..00000000000 --- a/vendor/assets/javascripts/jquery.highlight.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - -highlight v3 - -Highlights arbitrary terms. - - - -MIT license. - -Johann Burkard - - - -*/ - -jQuery.fn.highlight = function(pat) { - function innerHighlight(node, pat) { - var skip = 0; - if (node.nodeType == 3) { - var pos = node.data.toUpperCase().indexOf(pat); - if (pos >= 0) { - var spannode = document.createElement('span'); - spannode.className = 'highlight_word'; - var middlebit = node.splitText(pos); - var endbit = middlebit.splitText(pat.length); - var middleclone = middlebit.cloneNode(true); - spannode.appendChild(middleclone); - middlebit.parentNode.replaceChild(spannode, middlebit); - skip = 1; - } - } - else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) { - for (var i = 0; i < node.childNodes.length; ++i) { - i += innerHighlight(node.childNodes[i], pat); - } - } - return skip; - } - return this.each(function() { - innerHighlight(this, pat.toUpperCase()); - }); -}; - -jQuery.fn.removeHighlight = function() { - return this.find("span.highlight").each(function() { - this.parentNode.firstChild.nodeName; - with (this.parentNode) { - replaceChild(this.firstChild, this); - normalize(); - } - }).end(); -}; diff --git a/vendor/assets/javascripts/jquery.history.js b/vendor/assets/javascripts/jquery.history.js deleted file mode 100644 index 8d4edcd210e..00000000000 --- a/vendor/assets/javascripts/jquery.history.js +++ /dev/null @@ -1 +0,0 @@ -window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","<").replace(">",">").replace(" & "," & ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file diff --git a/vendor/assets/javascripts/jquery.sticky-kit.min.js b/vendor/assets/javascripts/jquery.sticky-kit.min.js deleted file mode 100644 index e8bb207c5a5..00000000000 --- a/vendor/assets/javascripts/jquery.sticky-kit.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - Sticky-kit v1.1.1 | WTFPL | Leaf Corcoran 2014 | http://leafo.net -*/ -(function(){var k,e;k=this.jQuery||window.jQuery;e=k(window);k.fn.stick_in_parent=function(d){var v,y,n,p,h,C,s,G,q,H;null==d&&(d={});s=d.sticky_class;y=d.inner_scrolling;C=d.recalc_every;h=d.parent;p=d.offset_top;n=d.spacer;v=d.bottoming;null==p&&(p=0);null==h&&(h=void 0);null==y&&(y=!0);null==s&&(s="is_stuck");null==v&&(v=!0);G=function(a,d,q,z,D,t,r,E){var u,F,m,A,c,f,B,w,x,g,b;if(!a.data("sticky_kit")){a.data("sticky_kit",!0);f=a.parent();null!=h&&(f=f.closest(h));if(!f.length)throw"failed to find stick parent"; -u=m=!1;(g=null!=n?n&&a.closest(n):k("
      "))&&g.css("position",a.css("position"));B=function(){var c,e,l;if(!E&&(c=parseInt(f.css("border-top-width"),10),e=parseInt(f.css("padding-top"),10),d=parseInt(f.css("padding-bottom"),10),q=f.offset().top+c+e,z=f.height(),m&&(u=m=!1,null==n&&(a.insertAfter(g),g.detach()),a.css({position:"",top:"",width:"",bottom:""}).removeClass(s),l=!0),D=a.offset().top-parseInt(a.css("margin-top"),10)-p,t=a.outerHeight(!0),r=a.css("float"),g&&g.css({width:a.outerWidth(!0), -height:t,display:a.css("display"),"vertical-align":a.css("vertical-align"),"float":r}),l))return b()};B();if(t!==z)return A=void 0,c=p,x=C,b=function(){var b,k,l,h;if(!E&&(null!=x&&(--x,0>=x&&(x=C,B())),l=e.scrollTop(),null!=A&&(k=l-A),A=l,m?(v&&(h=l+t+c>z+q,u&&!h&&(u=!1,a.css({position:"fixed",bottom:"",top:c}).trigger("sticky_kit:unbottom"))),lb&&!u&&(c-=k,c=Math.max(b-t,c),c=Math.min(p,c),m&&a.css({top:c+"px"})))):l>D&&(m=!0,b={position:"fixed",top:c},b.width="border-box"===a.css("box-sizing")?a.outerWidth()+"px":a.width()+"px",a.css(b).addClass(s),null==n&&(a.after(g),"left"!==r&&"right"!==r||g.append(a)),a.trigger("sticky_kit:stick")),m&&v&&(null==h&&(h=l+t+c>z+q),!u&&h)))return u=!0,"static"===f.css("position")&&f.css({position:"relative"}),a.css({position:"absolute",bottom:d,top:"auto"}).trigger("sticky_kit:bottom")}, -w=function(){B();return b()},F=function(){E=!0;e.off("touchmove",b);e.off("scroll",b);e.off("resize",w);k(document.body).off("sticky_kit:recalc",w);a.off("sticky_kit:detach",F);a.removeData("sticky_kit");a.css({position:"",bottom:"",top:"",width:""});f.position("position","");if(m)return null==n&&("left"!==r&&"right"!==r||a.insertAfter(g),g.remove()),a.removeClass(s)},e.on("touchmove",b),e.on("scroll",b),e.on("resize",w),k(document.body).on("sticky_kit:recalc",w),a.on("sticky_kit:detach",F),setTimeout(b, -0)}};q=0;for(H=this.length;q