From 0f42b0dbae27926e217e44e82fd7d9a7be5945ef Mon Sep 17 00:00:00 2001 From: Praveen Arimbrathodiyil Date: Wed, 22 Jun 2016 15:30:34 +0530 Subject: [PATCH] Imported Upstream version 8.9.0+dfsg --- CHANGELOG | 89 + Gemfile | 9 +- Gemfile.lock | 18 +- VERSION | 2 +- app/assets/javascripts/LabelManager.js.coffee | 12 +- app/assets/javascripts/api.js.coffee | 7 + app/assets/javascripts/application.js.coffee | 50 +- app/assets/javascripts/awards_handler.coffee | 2 +- .../javascripts/blob/blob_ci_yaml.js.coffee | 23 + .../blob/blob_gitignore_selector.js.coffee | 61 +- .../blob/blob_gitignore_selectors.js.coffee | 17 + .../blob/blob_license_selector.js.coffee | 35 +- .../blob/blob_license_selectors.js.coffee | 17 + .../javascripts/blob/edit_blob.js.coffee | 6 +- .../blob/template_selector.js.coffee | 56 + app/assets/javascripts/dispatcher.js.coffee | 19 +- .../javascripts/due_date_select.js.coffee | 21 +- .../javascripts/gfm_auto_complete.js.coffee | 24 + app/assets/javascripts/gl_dropdown.js.coffee | 15 +- .../javascripts/labels_select.js.coffee | 29 +- .../javascripts/lib/common_utils.js.coffee | 58 +- .../javascripts/merge_request_tabs.js.coffee | 2 +- .../javascripts/milestone_select.js.coffee | 8 +- .../javascripts/network/application.js.coffee | 20 + .../{ => network}/branch-graph.js.coffee | 0 .../{ => network}/network.js.coffee | 0 app/assets/javascripts/notes.js.coffee | 5 +- .../notifications_dropdown.js.coffee | 25 + .../javascripts/notifications_form.js.coffee | 49 + app/assets/javascripts/profile.js.coffee | 4 + app/assets/javascripts/project.js.coffee | 54 +- .../javascripts/right_sidebar.js.coffee | 18 +- .../javascripts/search_autocomplete.js.coffee | 56 +- app/assets/javascripts/shortcuts.js.coffee | 4 +- app/assets/javascripts/shortcuts_blob.coffee | 10 + app/assets/javascripts/sidebar.js.coffee | 24 +- .../javascripts/users/calendar.js.coffee | 17 +- app/assets/javascripts/users_select.js.coffee | 4 +- app/assets/stylesheets/framework.scss | 1 + app/assets/stylesheets/framework/blank.scss | 23 + app/assets/stylesheets/framework/blocks.scss | 20 + .../stylesheets/framework/dropdowns.scss | 10 +- .../stylesheets/framework/gitlab-theme.scss | 4 +- app/assets/stylesheets/framework/header.scss | 49 +- app/assets/stylesheets/framework/lists.scss | 2 +- .../stylesheets/framework/markdown_area.scss | 2 + app/assets/stylesheets/framework/mixins.scss | 14 + app/assets/stylesheets/framework/mobile.scss | 13 + app/assets/stylesheets/framework/nav.scss | 36 +- app/assets/stylesheets/framework/panels.scss | 4 + app/assets/stylesheets/framework/selects.scss | 5 - app/assets/stylesheets/framework/sidebar.scss | 204 +- .../stylesheets/framework/variables.scss | 12 + app/assets/stylesheets/mailers/devise.scss | 4 + app/assets/stylesheets/pages/commits.scss | 148 +- app/assets/stylesheets/pages/diff.scss | 5 + app/assets/stylesheets/pages/editor.scss | 12 +- app/assets/stylesheets/pages/events.scss | 3 +- app/assets/stylesheets/pages/help.scss | 7 + app/assets/stylesheets/pages/issuable.scss | 19 +- app/assets/stylesheets/pages/labels.scss | 18 +- .../stylesheets/pages/merge_requests.scss | 23 +- app/assets/stylesheets/pages/note_form.scss | 13 + app/assets/stylesheets/pages/notes.scss | 35 +- app/assets/stylesheets/pages/profile.scss | 19 + app/assets/stylesheets/pages/projects.scss | 72 +- app/assets/stylesheets/pages/stat_graph.scss | 18 +- app/assets/stylesheets/pages/tree.scss | 4 +- .../admin/runner_projects_controller.rb | 11 +- app/controllers/application_controller.rb | 23 +- app/controllers/dashboard/todos_controller.rb | 25 +- .../notification_settings_controller.rb | 16 - .../import/gitlab_projects_controller.rb | 48 + .../notification_settings_controller.rb | 36 + .../profiles/accounts_controller.rb | 2 +- .../profiles/notifications_controller.rb | 18 +- .../personal_access_tokens_controller.rb | 42 + .../projects/application_controller.rb | 2 +- .../notification_settings_controller.rb | 16 - .../projects/pipelines_controller.rb | 2 +- .../projects/runner_projects_controller.rb | 4 +- .../projects/runners_controller.rb | 7 +- app/controllers/projects/tags_controller.rb | 6 +- app/controllers/projects/todos_controller.rb | 24 +- app/controllers/projects_controller.rb | 73 +- app/finders/todos_finder.rb | 2 +- app/helpers/application_helper.rb | 18 +- app/helpers/blob_helper.rb | 20 +- app/helpers/branches_helper.rb | 2 +- app/helpers/button_helper.rb | 20 +- app/helpers/ci_status_helper.rb | 8 +- app/helpers/commits_helper.rb | 24 +- app/helpers/diff_helper.rb | 5 + app/helpers/gitlab_markdown_helper.rb | 2 - app/helpers/issuables_helper.rb | 6 +- app/helpers/members_helper.rb | 8 +- app/helpers/nav_helper.rb | 20 +- app/helpers/notifications_helper.rb | 28 +- app/helpers/projects_helper.rb | 2 +- app/helpers/todos_helper.rb | 6 +- app/mailers/emails/members.rb | 5 + app/mailers/emails/projects.rb | 13 + app/models/application_setting.rb | 2 +- app/models/ci/build.rb | 9 +- app/models/ci/pipeline.rb | 50 +- app/models/ci/runner.rb | 23 +- app/models/commit.rb | 26 + app/models/commit_status.rb | 5 +- app/models/concerns/importable.rb | 6 + app/models/concerns/participable.rb | 10 + app/models/concerns/referable.rb | 4 + app/models/group.rb | 10 +- app/models/issue.rb | 4 + app/models/jira_issue.rb | 2 - app/models/key.rb | 2 +- app/models/member.rb | 11 +- app/models/merge_request.rb | 11 +- app/models/merge_request_diff.rb | 3 +- app/models/note.rb | 5 +- app/models/notification_setting.rb | 37 +- app/models/personal_access_token.rb | 20 + app/models/project.rb | 52 +- app/models/repository.rb | 32 +- app/models/user.rb | 26 +- app/services/ci/create_builds_service.rb | 56 +- app/services/ci/create_pipeline_service.rb | 28 +- app/services/ci/register_build_service.rb | 25 +- app/services/create_commit_builds_service.rb | 55 +- app/services/notification_service.rb | 128 +- app/services/projects/autocomplete_service.rb | 4 + app/services/projects/create_service.rb | 10 +- .../projects/import_export/export_service.rb | 57 + app/services/projects/import_service.rb | 27 +- app/services/todo_service.rb | 19 +- app/views/admin/appearances/show.html.haml | 2 + .../admin/application_settings/show.html.haml | 1 + app/views/admin/dashboard/_head.html.haml | 4 + app/views/admin/runners/index.html.haml | 124 +- app/views/admin/runners/show.html.haml | 4 +- .../devise/mailer/password_change.html.haml | 10 + .../devise/mailer/password_change.text.erb | 7 + .../reset_password_instructions.html.erb | 8 - .../reset_password_instructions.html.haml | 12 + .../reset_password_instructions.text.erb | 10 + .../mailer/unlock_instructions.html.haml | 19 +- .../mailer/unlock_instructions.text.erb | 7 + app/views/groups/group_members/update.js.haml | 2 +- app/views/help/_shortcuts.html.haml | 6 +- app/views/import/github/status.html.haml | 2 +- .../import/gitlab_projects/new.html.haml | 25 + app/views/layouts/_collapse_button.html.haml | 4 +- app/views/layouts/_page.html.haml | 9 +- app/views/layouts/_search.html.haml | 25 + app/views/layouts/application.html.haml | 2 +- app/views/layouts/header/_default.html.haml | 2 +- app/views/layouts/nav/_admin.html.haml | 99 +- .../layouts/nav/_admin_settings.html.haml | 31 + app/views/layouts/nav/_group.html.haml | 6 +- app/views/layouts/nav/_profile.html.haml | 10 +- app/views/layouts/nav/_project.html.haml | 15 +- .../project_was_exported_email.html.haml | 8 + .../project_was_exported_email.text.erb | 6 + .../project_was_not_exported_email.html.haml | 9 + .../project_was_not_exported_email.text.erb | 6 + app/views/profiles/accounts/show.html.haml | 10 +- .../notifications/_group_settings.html.haml | 3 +- .../notifications/_project_settings.html.haml | 3 +- .../profiles/notifications/show.html.haml | 13 +- .../personal_access_tokens/index.html.haml | 105 + app/views/projects/_home_panel.html.haml | 12 +- app/views/projects/_last_push.html.haml | 22 +- app/views/projects/badges/index.html.haml | 2 +- app/views/projects/blob/_editor.html.haml | 12 +- app/views/projects/branches/_branch.html.haml | 6 +- app/views/projects/builds/show.html.haml | 10 +- .../projects/buttons/_notifications.html.haml | 11 - .../projects/ci/pipelines/_pipeline.html.haml | 6 +- app/views/projects/commits/_commit.html.haml | 43 +- app/views/projects/commits/_commits.html.haml | 17 +- app/views/projects/commits/_head.html.haml | 6 +- app/views/projects/commits/show.html.haml | 11 +- app/views/projects/compare/index.html.haml | 2 +- app/views/projects/compare/show.html.haml | 36 +- .../container_registry/_tag.html.haml | 6 +- app/views/projects/diffs/_diffs.html.haml | 2 + app/views/projects/edit.html.haml | 36 + .../projects/environments/index.html.haml | 16 +- app/views/projects/environments/new.html.haml | 5 +- .../projects/environments/show.html.haml | 12 +- app/views/projects/forks/index.html.haml | 6 - app/views/projects/graphs/_head.html.haml | 26 +- app/views/projects/graphs/ci.html.haml | 25 +- app/views/projects/graphs/commits.html.haml | 90 +- app/views/projects/graphs/languages.html.haml | 36 +- app/views/projects/graphs/show.html.haml | 44 +- app/views/projects/imports/show.html.haml | 2 +- .../projects/issues/_discussion.html.haml | 4 +- app/views/projects/labels/index.html.haml | 8 +- .../merge_requests/_discussion.html.haml | 4 +- .../merge_requests/_new_compare.html.haml | 2 +- .../projects/merge_requests/_show.html.haml | 6 +- .../merge_requests/show/_commits.html.haml | 3 +- .../show/_how_to_merge.html.haml | 6 +- app/views/projects/milestones/_form.html.haml | 8 +- app/views/projects/network/show.html.haml | 12 +- app/views/projects/new.html.haml | 58 +- app/views/projects/notes/_edit_form.html.haml | 2 +- app/views/projects/notes/_form.html.haml | 2 +- app/views/projects/notes/_note.html.haml | 4 +- .../projects/project_members/update.js.haml | 2 +- app/views/projects/runners/_form.html.haml | 6 + app/views/projects/runners/_runner.html.haml | 6 +- .../runners/_specific_runners.html.haml | 10 +- app/views/projects/runners/show.html.haml | 3 + app/views/projects/show.html.haml | 8 +- app/views/projects/tags/_tag.html.haml | 2 +- app/views/projects/tags/index.html.haml | 15 +- app/views/projects/tree/_blob_item.html.haml | 5 +- app/views/projects/tree/_tree_item.html.haml | 6 +- .../projects/wikis/_main_links.html.haml | 3 + app/views/projects/wikis/_nav.html.haml | 11 +- app/views/projects/wikis/_new.html.haml | 31 +- app/views/projects/wikis/edit.html.haml | 31 +- app/views/projects/wikis/git_access.html.haml | 52 +- app/views/projects/wikis/history.html.haml | 66 +- app/views/projects/wikis/pages.html.haml | 18 +- app/views/projects/wikis/show.html.haml | 34 +- app/views/shared/_event_filter.html.haml | 6 +- app/views/shared/_label_row.html.haml | 2 + app/views/shared/_ref_switcher.html.haml | 9 +- app/views/shared/issuable/_filter.html.haml | 2 +- app/views/shared/issuable/_sidebar.html.haml | 37 +- .../members/_access_request_buttons.html.haml | 20 +- app/views/shared/members/_member.html.haml | 4 +- .../shared/milestones/_summary.html.haml | 7 + .../shared/notifications/_button.html.haml | 25 + .../_custom_notifications.html.haml | 31 + .../_notification_dropdown.html.haml | 13 + app/views/shared/projects/_list.html.haml | 6 + .../gitlab_remove_project_export_worker.rb | 9 + app/workers/project_export_worker.rb | 12 + .../single_repository_worker.rb | 6 +- config/application.rb | 1 + config/initializers/1_settings.rb | 5 +- config/initializers/default_url_options.rb | 1 + config/initializers/sidekiq.rb | 4 + config/routes.rb | 30 +- ...415062917_create_personal_access_tokens.rb | 13 + .../20160509091049_add_locked_to_ci_runner.rb | 13 + ...15191922_set_missing_stage_on_ci_builds.rb | 9 + ...616084004_change_project_of_environment.rb | 21 + .../20160616102642_remove_duplicated_keys.rb | 19 + ...remove_keys_fingerprint_index_if_exists.rb | 21 + ...48_add_unique_index_to_keys_fingerprint.rb | 13 + ...627_add_events_to_notification_settings.rb | 7 + ...60620115026_add_index_on_runners_locked.rb | 12 + db/schema.rb | 20 +- doc/api/README.md | 65 +- doc/api/award_emoji.md | 367 + doc/api/sidekiq_metrics.md | 152 + doc/ci/README.md | 1 + doc/ci/environments.md | 58 + doc/ci/examples/README.md | 3 +- doc/ci/examples/test-scala-application.md | 47 + doc/ci/runners/README.md | 8 +- doc/ci/yaml/README.md | 65 +- doc/development/instrumentation.md | 19 +- doc/development/migration_style_guide.md | 16 +- doc/project_services/emails_on_push.md | 17 + .../img/emails_on_push_service.png | Bin 0 -> 98160 bytes doc/project_services/project_services.md | 2 +- doc/workflow/add-user/add-user.md | 24 +- .../img/access_requests_management.png | Bin 0 -> 15105 bytes .../add-user/img/add_user_email_accept.png | Bin 10833 -> 22961 bytes .../add-user/img/add_user_email_ready.png | Bin 16177 -> 40305 bytes .../add-user/img/add_user_email_search.png | Bin 15889 -> 45884 bytes .../img/add_user_give_permissions.png | Bin 22089 -> 56480 bytes ...er_import_members_from_another_project.png | Bin 18897 -> 38874 bytes .../img/add_user_imported_members.png | Bin 23897 -> 37873 bytes .../add-user/img/add_user_list_members.png | Bin 15732 -> 24427 bytes .../add-user/img/add_user_members_menu.png | Bin 8295 -> 42319 bytes .../add-user/img/add_user_search_people.png | Bin 13518 -> 39941 bytes .../add-user/img/request_access_button.png | Bin 0 -> 36588 bytes .../img/withdraw_access_request_button.png | Bin 0 -> 37960 bytes doc/workflow/groups.md | 22 + .../groups/access_requests_management.png | Bin 0 -> 15193 bytes doc/workflow/groups/request_access_button.png | Bin 0 -> 30470 bytes .../groups/withdraw_access_request_button.png | Bin 0 -> 31681 bytes doc/workflow/notifications.md | 6 +- doc/workflow/notifications/settings.png | Bin 114727 -> 90986 bytes doc/workflow/shortcuts.png | Bin 90936 -> 108255 bytes features/dashboard/new_project.feature | 2 +- features/dashboard/todos.feature | 7 +- features/project/active_tab.feature | 30 +- features/project/shortcuts.feature | 6 +- features/steps/dashboard/new_project.rb | 8 +- features/steps/dashboard/todos.rb | 35 +- features/steps/profile/notifications.rb | 6 +- features/steps/project/network_graph.rb | 20 +- features/steps/project/project.rb | 6 +- features/steps/project/project_find_file.rb | 4 +- features/steps/project/source/browse_files.rb | 20 +- features/steps/shared/project_tab.rb | 4 +- lib/api/api.rb | 58 +- lib/api/award_emoji.rb | 116 + lib/api/entities.rb | 19 +- lib/api/gitignores.rb | 29 - lib/api/helpers.rb | 10 +- lib/api/internal.rb | 2 - lib/api/notes.rb | 2 +- lib/api/runners.rb | 12 +- lib/api/sidekiq_metrics.rb | 90 + lib/api/templates.rb | 36 + lib/banzai.rb | 4 - .../filter/abstract_reference_filter.rb | 52 +- lib/banzai/filter/external_link_filter.rb | 13 +- lib/banzai/filter/issue_reference_filter.rb | 31 +- lib/banzai/filter/relative_link_filter.rb | 49 +- lib/banzai/filter/upload_link_filter.rb | 11 +- lib/banzai/renderer.rb | 8 +- lib/ci/api/runners.rb | 9 +- lib/ci/gitlab_ci_yaml_processor.rb | 15 +- lib/container_registry/client.rb | 11 +- lib/container_registry/tag.rb | 1 + lib/gitlab/backend/grack_auth.rb | 2 +- .../ci/config/node/validation_helpers.rb | 17 + lib/gitlab/current_settings.rb | 2 +- lib/gitlab/database.rb | 5 + lib/gitlab/database/migration_helpers.rb | 111 +- lib/gitlab/email/message/repository_push.rb | 2 +- lib/gitlab/github_import/importer.rb | 23 +- lib/gitlab/gitignore.rb | 56 - lib/gitlab/gitlab_import/project_creator.rb | 4 +- lib/gitlab/import_export.rb | 39 + lib/gitlab/import_export/attributes_finder.rb | 47 + lib/gitlab/import_export/command_line_util.rb | 40 + lib/gitlab/import_export/error.rb | 5 + lib/gitlab/import_export/file_importer.rb | 30 + lib/gitlab/import_export/import_export.yml | 54 + lib/gitlab/import_export/importer.rb | 64 + lib/gitlab/import_export/members_mapper.rb | 68 + lib/gitlab/import_export/project_creator.rb | 24 + .../import_export/project_tree_restorer.rb | 105 + .../import_export/project_tree_saver.rb | 29 + lib/gitlab/import_export/reader.rb | 117 + lib/gitlab/import_export/relation_factory.rb | 128 + lib/gitlab/import_export/repo_restorer.rb | 39 + lib/gitlab/import_export/repo_saver.rb | 35 + lib/gitlab/import_export/saver.rb | 42 + lib/gitlab/import_export/shared.rb | 30 + lib/gitlab/import_export/uploads_restorer.rb | 14 + lib/gitlab/import_export/uploads_saver.rb | 36 + lib/gitlab/import_export/version_checker.rb | 36 + lib/gitlab/import_export/version_saver.rb | 25 + lib/gitlab/import_export/wiki_repo_saver.rb | 33 + lib/gitlab/import_sources.rb | 3 +- lib/gitlab/lfs/response.rb | 7 +- lib/gitlab/lfs/router.rb | 7 +- lib/gitlab/metrics/instrumentation.rb | 19 +- lib/gitlab/metrics/method_call.rb | 52 + lib/gitlab/metrics/rack_middleware.rb | 6 +- lib/gitlab/metrics/transaction.rb | 35 +- lib/gitlab/template/base_template.rb | 67 + lib/gitlab/template/gitignore.rb | 22 + lib/gitlab/template/gitlab_ci_yml.rb | 27 + lib/tasks/gitlab/update_gitignore.rake | 46 - lib/tasks/gitlab/update_templates.rake | 54 + .../application_controller_spec.rb | 71 + .../notification_settings_controller_spec.rb | 32 - .../notification_settings_controller_spec.rb | 125 + .../profiles/accounts_controller_spec.rb | 26 + .../notification_settings_controller_spec.rb | 52 - .../projects/todo_controller_spec.rb | 102 + spec/controllers/projects_controller_spec.rb | 20 + .../factories/ci/{commits.rb => pipelines.rb} | 0 spec/factories/personal_access_tokens.rb | 9 + spec/features/admin/admin_runners_spec.rb | 34 + spec/features/container_registry_spec.rb | 3 +- spec/features/environments_spec.rb | 6 +- ...spec.rb => bulk_assignment_labels_spec.rb} | 3 +- spec/features/issues/todo_spec.rb | 10 + spec/features/issues_spec.rb | 4 +- .../profiles/personal_access_tokens_spec.rb | 94 + spec/features/projects/badges/list_spec.rb | 8 +- .../files/gitlab_ci_yml_dropdown_spec.rb | 30 + ...project_owner_creates_license_file_spec.rb | 14 +- ...eate_license_file_in_empty_project_spec.rb | 12 +- .../import_export/import_file_spec.rb | 49 + .../import_export/test_project_export.tar.gz | Bin 0 -> 345686 bytes .../labels/update_prioritization_spec.rb | 1 + ..._member_cannot_leave_group_project_spec.rb | 17 + ...equest_access_to_his_group_project_spec.rb | 50 + ...r_cannot_request_access_to_project_spec.rb | 21 + spec/features/search_spec.rb | 79 + spec/features/todos/todos_spec.rb | 4 + .../container_registry/tag_manifest.json | 17 +- spec/helpers/application_helper_spec.rb | 45 - spec/helpers/members_helper_spec.rb | 58 +- spec/helpers/merge_requests_helper_spec.rb | 6 +- .../fixtures/search_autocomplete.html.haml | 10 + spec/javascripts/notes_spec.js.coffee | 2 +- spec/javascripts/project_title_spec.js.coffee | 2 +- .../search_autocomplete_spec.js.coffee | 149 + .../filter/abstract_link_filter_spec.rb | 52 + .../filter/external_link_filter_spec.rb | 32 +- .../filter/issue_reference_filter_spec.rb | 15 +- .../merge_request_reference_filter_spec.rb | 6 + .../filter/relative_link_filter_spec.rb | 7 +- .../banzai/filter/upload_link_filter_spec.rb | 20 +- spec/lib/ci/gitlab_ci_yaml_processor_spec.rb | 113 +- .../lib/container_registry/repository_spec.rb | 2 +- .../gitlab/database/migration_helpers_spec.rb | 14 +- .../import_export/members_mapper_spec.rb | 52 + spec/lib/gitlab/import_export/project.json | 5341 +++++++++++ .../project_tree_restorer_spec.rb | 23 + .../import_export/project_tree_saver_spec.rb | 149 + spec/lib/gitlab/import_export/reader_spec.rb | 87 + .../gitlab/import_export/repo_bundler_spec.rb | 25 + .../import_export/wiki_repo_bundler_spec.rb | 28 + spec/lib/gitlab/lfs/lfs_router_spec.rb | 565 +- .../gitlab/metrics/instrumentation_spec.rb | 10 +- spec/lib/gitlab/metrics/method_call_spec.rb | 91 + .../gitlab/metrics/rack_middleware_spec.rb | 16 + spec/lib/gitlab/metrics/transaction_spec.rb | 16 + spec/lib/gitlab/reference_extractor_spec.rb | 3 +- .../gitlab/{ => template}/gitignore_spec.rb | 6 +- spec/mailers/notify_spec.rb | 61 +- .../mailers/previews/devise_mailer_preview.rb | 23 +- spec/models/build_spec.rb | 127 +- spec/models/ci/pipeline_spec.rb | 13 + spec/models/ci/runner_spec.rb | 241 +- spec/models/commit_spec.rb | 12 + spec/models/commit_status_spec.rb | 19 +- spec/models/concerns/participable_spec.rb | 10 + spec/models/group_spec.rb | 12 + spec/models/jira_issue_spec.rb | 30 - spec/models/key_spec.rb | 2 +- spec/models/notification_setting_spec.rb | 25 + spec/models/personal_access_token_spec.rb | 15 + .../project_services/jira_service_spec.rb | 6 +- spec/models/project_spec.rb | 18 +- spec/models/repository_spec.rb | 41 + spec/requests/api/api_helpers_spec.rb | 74 +- spec/requests/api/award_emoji_spec.rb | 198 + spec/requests/api/builds_spec.rb | 11 +- spec/requests/api/gitignores_spec.rb | 29 - spec/requests/api/projects_spec.rb | 13 +- spec/requests/api/runners_spec.rb | 24 +- spec/requests/api/sidekiq_metrics_spec.rb | 40 + spec/requests/api/templates_spec.rb | 52 + .../services/ci/create_builds_service_spec.rb | 6 +- .../ci/register_build_service_spec.rb | 62 + .../create_commit_builds_service_spec.rb | 23 +- spec/services/git_push_service_spec.rb | 3 +- spec/services/notification_service_spec.rb | 117 +- spec/services/system_note_service_spec.rb | 2 +- spec/services/todo_service_spec.rb | 106 +- spec/support/import_export/import_export.yml | 20 + .../expire_build_artifacts_worker_spec.rb | 12 + spec/workers/merge_worker_spec.rb | 2 +- .../single_repository_worker_spec.rb | 29 + vendor/assets/javascripts/raphael.js | 8239 +++++++++++++++++ vendor/gitignore/Android.gitignore | 3 +- vendor/gitignore/C++.gitignore | 1 + vendor/gitignore/CMake.gitignore | 1 + vendor/gitignore/D.gitignore | 4 + vendor/gitignore/Global/Bazaar.gitignore | 2 + vendor/gitignore/Global/OSX.gitignore | 3 +- vendor/gitignore/Global/README.md | 10 + vendor/gitignore/Global/SublimeText.gitignore | 13 + vendor/gitignore/Haskell.gitignore | 1 + vendor/gitignore/Julia.gitignore | 4 + vendor/gitignore/LICENSE | 19 + vendor/gitignore/Laravel.gitignore | 1 - vendor/gitignore/Objective-C.gitignore | 9 + vendor/gitignore/Qt.gitignore | 2 +- vendor/gitignore/README.md | 14 - vendor/gitignore/Rails.gitignore | 4 + vendor/gitignore/Swift.gitignore | 2 + vendor/gitignore/UnrealEngine.gitignore | 1 + vendor/gitignore/VisualStudio.gitignore | 1 + vendor/gitlab-ci-yml/Docker.gitlab-ci.yml | 7 + vendor/gitlab-ci-yml/Elixir.gitlab-ci.yml | 18 + vendor/gitlab-ci-yml/LICENSE | 21 + vendor/gitlab-ci-yml/Nodejs.gitlab-ci.yml | 27 + .../gitlab-ci-yml/Pages/brunch.gitlab-ci.yml | 16 + .../gitlab-ci-yml/Pages/doxygen.gitlab-ci.yml | 13 + vendor/gitlab-ci-yml/Pages/harp.gitlab-ci.yml | 16 + vendor/gitlab-ci-yml/Pages/hexo.gitlab-ci.yml | 25 + vendor/gitlab-ci-yml/Pages/html.gitlab-ci.yml | 12 + vendor/gitlab-ci-yml/Pages/hugo.gitlab-ci.yml | 11 + vendor/gitlab-ci-yml/Pages/hyde.gitlab-ci.yml | 25 + .../gitlab-ci-yml/Pages/jekyll.gitlab-ci.yml | 24 + .../gitlab-ci-yml/Pages/lektor.gitlab-ci.yml | 12 + .../Pages/metalsmith.gitlab-ci.yml | 17 + .../Pages/middleman.gitlab-ci.yml | 27 + .../gitlab-ci-yml/Pages/nanoc.gitlab-ci.yml | 12 + .../Pages/octopress.gitlab-ci.yml | 15 + .../gitlab-ci-yml/Pages/pelican.gitlab-ci.yml | 10 + vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml | 30 + 500 files changed, 23391 insertions(+), 2691 deletions(-) create mode 100644 app/assets/javascripts/blob/blob_ci_yaml.js.coffee create mode 100644 app/assets/javascripts/blob/blob_gitignore_selectors.js.coffee create mode 100644 app/assets/javascripts/blob/blob_license_selectors.js.coffee create mode 100644 app/assets/javascripts/blob/template_selector.js.coffee create mode 100644 app/assets/javascripts/network/application.js.coffee rename app/assets/javascripts/{ => network}/branch-graph.js.coffee (100%) rename app/assets/javascripts/{ => network}/network.js.coffee (100%) create mode 100644 app/assets/javascripts/notifications_dropdown.js.coffee create mode 100644 app/assets/javascripts/notifications_form.js.coffee create mode 100644 app/assets/javascripts/shortcuts_blob.coffee create mode 100644 app/assets/stylesheets/framework/blank.scss delete mode 100644 app/controllers/groups/notification_settings_controller.rb create mode 100644 app/controllers/import/gitlab_projects_controller.rb create mode 100644 app/controllers/notification_settings_controller.rb create mode 100644 app/controllers/profiles/personal_access_tokens_controller.rb delete mode 100644 app/controllers/projects/notification_settings_controller.rb create mode 100644 app/models/concerns/importable.rb delete mode 100644 app/models/jira_issue.rb create mode 100644 app/models/personal_access_token.rb create mode 100644 app/services/projects/import_export/export_service.rb create mode 100644 app/views/devise/mailer/password_change.html.haml create mode 100644 app/views/devise/mailer/password_change.text.erb delete mode 100644 app/views/devise/mailer/reset_password_instructions.html.erb create mode 100644 app/views/devise/mailer/reset_password_instructions.html.haml create mode 100644 app/views/devise/mailer/reset_password_instructions.text.erb create mode 100644 app/views/devise/mailer/unlock_instructions.text.erb create mode 100644 app/views/import/gitlab_projects/new.html.haml create mode 100644 app/views/layouts/nav/_admin_settings.html.haml create mode 100644 app/views/notify/project_was_exported_email.html.haml create mode 100644 app/views/notify/project_was_exported_email.text.erb create mode 100644 app/views/notify/project_was_not_exported_email.html.haml create mode 100644 app/views/notify/project_was_not_exported_email.text.erb create mode 100644 app/views/profiles/personal_access_tokens/index.html.haml delete mode 100644 app/views/projects/buttons/_notifications.html.haml create mode 100644 app/views/shared/notifications/_button.html.haml create mode 100644 app/views/shared/notifications/_custom_notifications.html.haml create mode 100644 app/views/shared/notifications/_notification_dropdown.html.haml create mode 100644 app/workers/gitlab_remove_project_export_worker.rb create mode 100644 app/workers/project_export_worker.rb create mode 100644 db/migrate/20160415062917_create_personal_access_tokens.rb create mode 100644 db/migrate/20160509091049_add_locked_to_ci_runner.rb create mode 100644 db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb create mode 100644 db/migrate/20160616084004_change_project_of_environment.rb create mode 100644 db/migrate/20160616102642_remove_duplicated_keys.rb create mode 100644 db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb create mode 100644 db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb create mode 100644 db/migrate/20160617301627_add_events_to_notification_settings.rb create mode 100644 db/migrate/20160620115026_add_index_on_runners_locked.rb create mode 100644 doc/api/award_emoji.md create mode 100644 doc/api/sidekiq_metrics.md create mode 100644 doc/ci/environments.md create mode 100644 doc/ci/examples/test-scala-application.md create mode 100644 doc/project_services/emails_on_push.md create mode 100644 doc/project_services/img/emails_on_push_service.png create mode 100644 doc/workflow/add-user/img/access_requests_management.png create mode 100644 doc/workflow/add-user/img/request_access_button.png create mode 100644 doc/workflow/add-user/img/withdraw_access_request_button.png create mode 100644 doc/workflow/groups/access_requests_management.png create mode 100644 doc/workflow/groups/request_access_button.png create mode 100644 doc/workflow/groups/withdraw_access_request_button.png create mode 100644 lib/api/award_emoji.rb delete mode 100644 lib/api/gitignores.rb create mode 100644 lib/api/sidekiq_metrics.rb create mode 100644 lib/api/templates.rb delete mode 100644 lib/gitlab/gitignore.rb create mode 100644 lib/gitlab/import_export.rb create mode 100644 lib/gitlab/import_export/attributes_finder.rb create mode 100644 lib/gitlab/import_export/command_line_util.rb create mode 100644 lib/gitlab/import_export/error.rb create mode 100644 lib/gitlab/import_export/file_importer.rb create mode 100644 lib/gitlab/import_export/import_export.yml create mode 100644 lib/gitlab/import_export/importer.rb create mode 100644 lib/gitlab/import_export/members_mapper.rb create mode 100644 lib/gitlab/import_export/project_creator.rb create mode 100644 lib/gitlab/import_export/project_tree_restorer.rb create mode 100644 lib/gitlab/import_export/project_tree_saver.rb create mode 100644 lib/gitlab/import_export/reader.rb create mode 100644 lib/gitlab/import_export/relation_factory.rb create mode 100644 lib/gitlab/import_export/repo_restorer.rb create mode 100644 lib/gitlab/import_export/repo_saver.rb create mode 100644 lib/gitlab/import_export/saver.rb create mode 100644 lib/gitlab/import_export/shared.rb create mode 100644 lib/gitlab/import_export/uploads_restorer.rb create mode 100644 lib/gitlab/import_export/uploads_saver.rb create mode 100644 lib/gitlab/import_export/version_checker.rb create mode 100644 lib/gitlab/import_export/version_saver.rb create mode 100644 lib/gitlab/import_export/wiki_repo_saver.rb create mode 100644 lib/gitlab/metrics/method_call.rb create mode 100644 lib/gitlab/template/base_template.rb create mode 100644 lib/gitlab/template/gitignore.rb create mode 100644 lib/gitlab/template/gitlab_ci_yml.rb delete mode 100644 lib/tasks/gitlab/update_gitignore.rake create mode 100644 lib/tasks/gitlab/update_templates.rake delete mode 100644 spec/controllers/groups/notification_settings_controller_spec.rb create mode 100644 spec/controllers/notification_settings_controller_spec.rb create mode 100644 spec/controllers/profiles/accounts_controller_spec.rb delete mode 100644 spec/controllers/projects/notification_settings_controller_spec.rb create mode 100644 spec/controllers/projects/todo_controller_spec.rb rename spec/factories/ci/{commits.rb => pipelines.rb} (100%) create mode 100644 spec/factories/personal_access_tokens.rb rename spec/features/issues/{bulk_assigment_labels_spec.rb => bulk_assignment_labels_spec.rb} (97%) create mode 100644 spec/features/profiles/personal_access_tokens_spec.rb create mode 100644 spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb create mode 100644 spec/features/projects/import_export/import_file_spec.rb create mode 100644 spec/features/projects/import_export/test_project_export.tar.gz create mode 100644 spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb create mode 100644 spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb create mode 100644 spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb create mode 100644 spec/javascripts/fixtures/search_autocomplete.html.haml create mode 100644 spec/javascripts/search_autocomplete_spec.js.coffee create mode 100644 spec/lib/banzai/filter/abstract_link_filter_spec.rb create mode 100644 spec/lib/gitlab/import_export/members_mapper_spec.rb create mode 100644 spec/lib/gitlab/import_export/project.json create mode 100644 spec/lib/gitlab/import_export/project_tree_restorer_spec.rb create mode 100644 spec/lib/gitlab/import_export/project_tree_saver_spec.rb create mode 100644 spec/lib/gitlab/import_export/reader_spec.rb create mode 100644 spec/lib/gitlab/import_export/repo_bundler_spec.rb create mode 100644 spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb create mode 100644 spec/lib/gitlab/metrics/method_call_spec.rb rename spec/lib/gitlab/{ => template}/gitignore_spec.rb (87%) delete mode 100644 spec/models/jira_issue_spec.rb create mode 100644 spec/models/personal_access_token_spec.rb create mode 100644 spec/requests/api/award_emoji_spec.rb delete mode 100644 spec/requests/api/gitignores_spec.rb create mode 100644 spec/requests/api/sidekiq_metrics_spec.rb create mode 100644 spec/requests/api/templates_spec.rb create mode 100644 spec/support/import_export/import_export.yml create mode 100644 vendor/assets/javascripts/raphael.js create mode 100644 vendor/gitignore/Global/Bazaar.gitignore create mode 100644 vendor/gitignore/Global/README.md create mode 100644 vendor/gitignore/Julia.gitignore create mode 100644 vendor/gitignore/LICENSE delete mode 100644 vendor/gitignore/README.md create mode 100644 vendor/gitlab-ci-yml/Docker.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Elixir.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/LICENSE create mode 100644 vendor/gitlab-ci-yml/Nodejs.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/brunch.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/doxygen.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/harp.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/hexo.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/html.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/hugo.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/hyde.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/jekyll.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/lektor.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/metalsmith.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/middleman.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/nanoc.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/octopress.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Pages/pelican.gitlab-ci.yml create mode 100644 vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml diff --git a/CHANGELOG b/CHANGELOG index bb5bde9b08..c09e147833 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,19 +1,29 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.9.0 (unreleased) + - Fix builds API response not including commit data + - Fix error when CI job variables key specified but not defined + - Fix pipeline status when there are no builds in pipeline - Fix Error 500 when using closes_issues API with an external issue tracker - Add more information into RSS feed for issues (Alexander Matyushentsev) - Bulk assign/unassign labels to issues. - Ability to prioritize labels !4009 / !3205 (Thijs Wouters) + - Show Star and Fork buttons on mobile. + - Performance improvements on RelativeLinkFilter - Fix endless redirections when accessing user OAuth applications when they are disabled - Allow enabling wiki page events from Webhook management UI - Bump rouge to 1.11.0 - Fix issue with arrow keys not working in search autocomplete dropdown - Fix an issue where note polling stopped working if a window was in the background during a refresh. + - Pre-processing Markdown now only happens when needed - Make EmailsOnPushWorker use Sidekiq mailers queue + - Redesign all Devise emails. !4297 + - Don't show 'Leave Project' to group members - Fix wiki page events' webhook to point to the wiki repository + - Add a border around images to differentiate them from the background. - Don't show tags for revert and cherry-pick operations + - Show image ID on registry page - Fix issue todo not remove when leave project !4150 (Long Nguyen) - Allow customisable text on the 'nearly there' page after a user signs up - Bump recaptcha gem to 3.0.0 to remove deprecated stoken support @@ -22,12 +32,18 @@ v 8.9.0 (unreleased) - Added descriptions to notification settings dropdown - Improve note validation to prevent errors when creating invalid note via API - Reduce number of fog gem dependencies + - Add number of merge requests for a given milestone to the milestones view. + - Implement a fair usage of shared runners - Remove project notification settings associated with deleted projects - Fix 404 page when viewing TODOs that contain milestones or labels in different projects - Add a metric for the number of new Redis connections created by a transaction - Fix Error 500 when viewing a blob with binary characters after the 1024-byte mark - Redesign navigation for project pages + - Fix images in sign-up confirmation email + - Added shortcut 'y' for copying a files content hash URL #14470 - Fix groups API to list only user's accessible projects + - Fix horizontal scrollbar for long commit message. + - GitLab Performance Monitoring now tracks the total method execution time and call count per method - Add Environments and Deployments - Redesign account and email confirmation emails - Don't fail builds for projects that are deleted @@ -35,30 +51,47 @@ v 8.9.0 (unreleased) - `git clone https://host/namespace/project` now works, in addition to using the `.git` suffix - Bump nokogiri to 1.6.8 - Use gitlab-shell v3.0.0 + - Fixed alignment of download dropdown in merge requests - Upgrade to jQuery 2 + - Adds selected branch name to the dropdown toggle + - Add API endpoint for Sidekiq Metrics !4653 + - Refactoring Award Emoji with API support for Issues and MergeRequests - Use Knapsack to evenly distribute tests across multiple nodes - Add `sha` parameter to MR merge API, to ensure only reviewed changes are merged - Don't allow MRs to be merged when commits were added since the last review / page load - Add DB index on users.state + - Limit email on push diff size to 30 files / 150 KB - Add rake task 'gitlab:db:configure' for conditionally seeding or migrating the database - Changed the Slack build message to use the singular duration if necessary (Aran Koning) - Links from a wiki page to other wiki pages should be rewritten as expected - Add option to project to only allow merge requests to be merged if the build succeeds (Rui Santos) + - Added navigation shortcuts to the project pipelines, milestones, builds and forks page. !4393 - Fix issues filter when ordering by milestone + - Disable SAML account unlink feature - Added artifacts:when to .gitlab-ci.yml - this requires GitLab Runner 1.3 - Bamboo Service: Fix missing credentials & URL handling when base URL contains a path (Benjamin Schmid) - TeamCity Service: Fix URL handling when base URL contains a path - Todos will display target state if issuable target is 'Closed' or 'Merged' + - Validate only and except regexp - Fix bug when sorting issues by milestone due date and filtering by two or more labels + - POST to API /projects/:id/runners/:runner_id would give 409 if the runner was already enabled for this project - Add support for using Yubikeys (U2F) for two-factor authentication - Link to blank group icon doesn't throw a 404 anymore - Remove 'main language' feature + - Toggle whitespace button now available for compare branches diffs #17881 - Pipelines can be canceled only when there are running builds + - Allow authentication using personal access tokens - Use downcased path to container repository as this is expected path by Docker + - Allow to use CI token to fetch LFS objects + - Custom notification settings - Projects pending deletion will render a 404 page - Measure queue duration between gitlab-workhorse and Rails + - Added Gfm autocomplete for labels + - Added edit note 'up' shortcut documentation to the help panel and docs screenshot #18114 - Make Omniauth providers specs to not modify global configuration + - Remove unused JiraIssue class and replace references with ExternalIssue. !4659 (Ilan Shamir) - Make authentication service for Container Registry to be compatible with < Docker 1.11 + - Make it possible to lock a runner from being enabled for other projects - Add Application Setting to configure Container Registry token expire delay (default 5min) - Cache assigned issue and merge request counts in sidebar nav - Use Knapsack only in CI environment @@ -74,8 +107,11 @@ v 8.9.0 (unreleased) - Replace Colorize with Rainbow for coloring console output in Rake tasks. - Add workhorse controller and API helpers - An indicator is now displayed at the top of the comment field for confidential issues. + - Show categorised search queries in the search autocomplete - RepositoryCheck::SingleRepositoryWorker public and private methods are now instrumented + - Dropdown for `.gitlab-ci.yml` templates - Improve issuables APIs performance when accessing notes !4471 + - Add sorting dropdown to tags page !4423 - External links now open in a new tab - Prevent default actions of disabled buttons and links - Markdown editor now correctly resets the input value on edit cancellation !4175 @@ -83,6 +119,7 @@ v 8.9.0 (unreleased) - Improved UX of date pickers on issue & milestone forms - Cache on the database if a project has an active external issue tracker. - Put project Labels and Milestones pages links under Issues and Merge Requests tabs as subnav + - GitLab project import and export functionality - All classes in the Banzai::ReferenceParser namespace are now instrumented - Remove deprecated issues_tracker and issues_tracker_id from project model - Allow users to create confidential issues in private projects @@ -108,9 +145,37 @@ v 8.8.5 (unreleased) - Fix importer for GitHub comments on diff - Disable Webhooks before proceeding with the GitHub import - Fix incremental trace upload API when using multi-byte UTF-8 chars in trace + - Set inverse_of for Project/Service association to reduce the number of queries + - Update tanuki logo highlight/loading colors + - Remove explicit Gitlab::Metrics.action assignments, are already automatic. + - Use Git cached counters for branches and tags on project page + - Cache participable participants in an instance variable. + - Filter parameters for request_uri value on instrumented transactions. + - Remove duplicated keys add UNIQUE index to keys fingerprint column + - ExtractsPath get ref_names from repository cache, if not there access git. + - Cache user todo counts from TodoService + - Ensure Todos counters doesn't count Todos for projects pending delete + - Add tooltip to pin/unpin navbar + - Add left/right arrows horizontal navigation + - Add new sub nav style to Wiki and Graphs sub navigation + +v 8.8.5 + - Import GitHub repositories respecting the API rate limit !4166 + - Fix todos page throwing errors when you have a project pending deletion !4300 + - Disable Webhooks before proceeding with the GitHub import !4470 + - Fix importer for GitHub comments on diff !4488 + - Adjust the SAML control flow to allow LDAP identities to be added to an existing SAML user !4498 + - Fix incremental trace upload API when using multi-byte UTF-8 chars in trace !4541 + - Prevent unauthorized access for projects build traces + - Forbid scripting for wiki files + - Only show notes through JSON on confidential issues that the user has access to + - Banzai::Filter::UploadLinkFilter use XPath instead CSS expressions + - Banzai::Filter::ExternalLinkFilter use XPath instead CSS expressions v 8.8.4 - Fix LDAP-based login for users with 2FA enabled. !4493 + - Added descriptions to notification settings dropdown + - Due date can be removed from milestones v 8.8.3 - Fix 404 page when viewing TODOs that contain milestones or labels in different projects. !4312 @@ -226,6 +291,9 @@ v 8.8.0 v 8.7.7 - Fix import by `Any Git URL` broken if the URL contains a space + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + - Only show notes through JSON on confidential issues that the user has access to v 8.7.6 - Fix links on wiki pages for relative url setups. !4131 (Artem Sidorenko) @@ -388,6 +456,11 @@ v 8.7.0 - Add RAW build trace output and button on build page - Add incremental build trace update into CI API +v 8.6.9 + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + - Only show notes through JSON on confidential issues that the user has access to + v 8.6.8 - Prevent privilege escalation via "impersonate" feature - Prevent privilege escalation via notes API @@ -542,6 +615,10 @@ v 8.6.0 - Trigger a todo for mentions on commits page - Let project owners and admins soft delete issues and merge requests +v 8.5.13 + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + v 8.5.12 - Prevent privilege escalation via "impersonate" feature - Prevent privilege escalation via notes API @@ -703,6 +780,10 @@ v 8.5.0 - Show label row when filtering issues or merge requests by label (Nuttanart Pornprasitsakul) - Add Todos +v 8.4.11 + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + v 8.4.10 - Prevent privilege escalation via "impersonate" feature - Prevent privilege escalation via notes API @@ -839,6 +920,10 @@ v 8.4.0 - Add IP check against DNSBLs at account sign-up - Added cache:key to .gitlab-ci.yml allowing to fine tune the caching +v 8.3.10 + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + v 8.3.9 - Prevent privilege escalation via "impersonate" feature - Prevent privilege escalation via notes API @@ -957,6 +1042,10 @@ v 8.3.0 - Expose Git's version in the admin area - Show "New Merge Request" buttons on canonical repos when you have a fork (Josh Frye) +v 8.2.6 + - Prevent unauthorized access to other projects build traces + - Forbid scripting for wiki files + v 8.2.5 - Prevent privilege escalation via "impersonate" feature - Prevent privilege escalation via notes API diff --git a/Gemfile b/Gemfile index 3b28789300..092ea9d69b 100644 --- a/Gemfile +++ b/Gemfile @@ -48,11 +48,11 @@ gem 'attr_encrypted', '~> 3.0.0' gem 'u2f', '~> 0.2.1' # Browser detection -gem "browser", '~> 2.0.3' +gem "browser", '~> 2.2' # Extracting information from a git repository # Provide access to Gitlab::Git library -gem "gitlab_git", '~> 10.0' +gem "gitlab_git", '~> 10.2' # LDAP Auth # GitLab fork with several improvements to original library. For full list of changes @@ -221,13 +221,12 @@ gem 'jquery-turbolinks', '~> 2.1.0' gem 'addressable', '~> 2.3.8' gem 'bootstrap-sass', '~> 3.3.0' -gem 'font-awesome-rails', '~> 4.2' +gem 'font-awesome-rails', '~> 4.6.1' gem 'gitlab_emoji', '~> 0.3.0' gem 'gon', '~> 6.0.1' gem 'jquery-atwho-rails', '~> 1.3.2' gem 'jquery-rails', '~> 4.1.0' gem 'jquery-ui-rails', '~> 5.0.0' -gem 'raphael-rails', '~> 2.1.2' gem 'request_store', '~> 1.3.0' gem 'select2-rails', '~> 3.5.9' gem 'virtus', '~> 1.0.1' @@ -331,7 +330,7 @@ gem "newrelic_rpm", '~> 3.14' gem 'octokit', '~> 4.3.0' -gem "mail_room", "~> 0.7" +gem "mail_room", "~> 0.8" gem 'email_reply_parser', '~> 0.5.8' diff --git a/Gemfile.lock b/Gemfile.lock index c1c8c175b1..ba16e4bf33 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,7 +98,7 @@ GEM autoprefixer-rails (>= 5.2.1) sass (>= 3.3.4) brakeman (3.3.2) - browser (2.0.3) + browser (2.2.0) builder (3.2.2) bullet (5.0.0) activesupport (>= 3.0.0) @@ -246,7 +246,7 @@ GEM fog-xml (0.1.2) fog-core nokogiri (~> 1.5, >= 1.5.11) - font-awesome-rails (4.5.0.1) + font-awesome-rails (4.6.1.0) railties (>= 3.2, < 5.1) foreman (0.78.0) thor (~> 0.19.1) @@ -277,7 +277,7 @@ GEM posix-spawn (~> 0.3) gitlab_emoji (0.3.1) gemojione (~> 2.2, >= 2.2.1) - gitlab_git (10.1.3) + gitlab_git (10.2.0) activesupport (~> 4.0) charlock_holmes (~> 0.7.3) github-linguist (~> 4.7.0) @@ -398,7 +398,7 @@ GEM systemu (~> 2.6.2) mail (2.6.4) mime-types (>= 1.16, < 4) - mail_room (0.7.0) + mail_room (0.8.0) method_source (0.8.2) mime-types (2.99.2) mimemagic (0.3.0) @@ -556,7 +556,6 @@ GEM rainbow (2.1.0) raindrops (0.15.0) rake (10.5.0) - raphael-rails (2.1.2) rb-fsevent (0.9.6) rb-inotify (0.9.5) ffi (>= 0.5.0) @@ -834,7 +833,7 @@ DEPENDENCIES binding_of_caller (~> 0.7.2) bootstrap-sass (~> 3.3.0) brakeman (~> 3.3.0) - browser (~> 2.0.3) + browser (~> 2.2) bullet bundler-audit byebug @@ -867,7 +866,7 @@ DEPENDENCIES fog-google (~> 0.3) fog-local (~> 0.3) fog-openstack (~> 0.1) - font-awesome-rails (~> 4.2) + font-awesome-rails (~> 4.6.1) foreman fuubar (~> 2.0.0) gemnasium-gitlab-service (~> 0.2) @@ -875,7 +874,7 @@ DEPENDENCIES github-markup (~> 1.3.1) gitlab-flowdock-git-hook (~> 1.0.1) gitlab_emoji (~> 0.3.0) - gitlab_git (~> 10.0) + gitlab_git (~> 10.2) gitlab_meta (= 7.0) gitlab_omniauth-ldap (~> 1.2.1) gollum-lib (~> 4.1.0) @@ -900,7 +899,7 @@ DEPENDENCIES license_finder licensee (~> 8.0.0) loofah (~> 2.0.3) - mail_room (~> 0.7) + mail_room (~> 0.8) method_source (~> 0.8) minitest (~> 5.7.0) mousetrap-rails (~> 1.4.6) @@ -938,7 +937,6 @@ DEPENDENCIES rails (= 4.2.6) rails-deprecated_sanitizer (~> 1.0.3) rainbow (~> 2.1.0) - raphael-rails (~> 2.1.2) rblineprof rdoc (~> 3.6) recaptcha (~> 3.0) diff --git a/VERSION b/VERSION index 141cafb8e0..e5c15102d9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.9.0-rc4 +8.9.0 diff --git a/app/assets/javascripts/LabelManager.js.coffee b/app/assets/javascripts/LabelManager.js.coffee index 365a062bb8..6d8faba40d 100644 --- a/app/assets/javascripts/LabelManager.js.coffee +++ b/app/assets/javascripts/LabelManager.js.coffee @@ -27,6 +27,11 @@ class @LabelManager $btn = $(e.currentTarget) $label = $("##{$btn.data('domId')}") action = if $btn.parents('.js-prioritized-labels').length then 'remove' else 'add' + + # Make sure tooltip will hide + $tooltip = $ "##{$btn.find('.has-tooltip:visible').attr('aria-describedby')}" + $tooltip.tooltip 'destroy' + _this.toggleLabelPriority($label, action) toggleLabelPriority: ($label, action, persistState = true) -> @@ -42,10 +47,10 @@ class @LabelManager $from = @prioritizedLabels if $from.find('li').length is 1 - $from.find('.empty-message').show() + $from.find('.empty-message').removeClass('hidden') if not $target.find('li').length - $target.find('.empty-message').hide() + $target.find('.empty-message').addClass('hidden') $label.detach().appendTo($target) @@ -54,6 +59,9 @@ class @LabelManager if action is 'remove' xhr = $.ajax url: url, type: 'DELETE' + + # Restore empty message + $from.find('.empty-message').removeClass('hidden') unless $from.find('li').length else xhr = @savePrioritySort($label, action) diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index 3f61ea1eaf..cf46f15a15 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -7,6 +7,7 @@ labelsPath: "/api/:version/projects/:id/labels" licensePath: "/api/:version/licenses/:key" gitignorePath: "/api/:version/gitignores/:key" + gitlabCiYmlPath: "/api/:version/gitlab_ci_ymls/:key" group: (group_id, callback) -> url = Api.buildUrl(Api.groupPath) @@ -110,6 +111,12 @@ $.get url, (gitignore) -> callback(gitignore) + gitlabCiYml: (key, callback) -> + url = Api.buildUrl(Api.gitlabCiYmlPath).replace(':key', key) + + $.get url, (file) -> + callback(file) + buildUrl: (url) -> url = gon.relative_url_root + url if gon.relative_url_root? return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 6c16f89cef..397892d15c 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -32,10 +32,6 @@ #= require bootstrap/tooltip #= require bootstrap/popover #= require select2 -#= require raphael -#= require g.raphael -#= require g.bar -#= require branch-graph #= require ace/ace #= require ace/ext-searchbox #= require underscore @@ -128,7 +124,7 @@ $ -> gl.utils.preventDisabledButtons() bootstrapBreakpoint = bp.getBreakpointSize() - $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") + $(".nav-sidebar").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") # Click a .js-select-on-focus field, select the contents $(".js-select-on-focus").on "focusin", -> @@ -258,3 +254,47 @@ $ -> gl.awardsHandler = new AwardsHandler() checkInitialSidebarSize() new Aside() + + # Sidenav pinning + if $(window).width() < 1440 and $.cookie('pin_nav') is 'true' + $.cookie('pin_nav', 'false', { path: '/' }) + $('.page-with-sidebar') + .toggleClass('page-sidebar-collapsed page-sidebar-expanded') + .removeClass('page-sidebar-pinned') + $('.navbar-fixed-top').removeClass('header-pinned-nav') + + $(document) + .off 'click', '.js-nav-pin' + .on 'click', '.js-nav-pin', (e) -> + e.preventDefault() + + $pinBtn = $(e.currentTarget) + $page = $ '.page-with-sidebar' + $topNav = $ '.navbar-fixed-top' + $tooltip = $ "##{$pinBtn.attr('aria-describedby')}" + doPinNav = not $page.is('.page-sidebar-pinned') + tooltipText = 'Pin navigation' + + $(this).toggleClass 'is-active' + + if doPinNav + $page.addClass('page-sidebar-pinned') + $topNav.addClass('header-pinned-nav') + else + $tooltip.remove() # Remove it immediately when collapsing the sidebar + $page.removeClass('page-sidebar-pinned') + .toggleClass('page-sidebar-collapsed page-sidebar-expanded') + $topNav.removeClass('header-pinned-nav') + .toggleClass('header-collapsed header-expanded') + + # Save settings + $.cookie 'pin_nav', doPinNav, { path: '/' } + + if $.cookie('pin_nav') is 'true' or doPinNav + tooltipText = 'Unpin navigation' + + # Update tooltip text immediately + $tooltip.find('.tooltip-inner').text(tooltipText) + + # Persist tooltip title + $pinBtn.attr('title', tooltipText).tooltip('fixTitle') diff --git a/app/assets/javascripts/awards_handler.coffee b/app/assets/javascripts/awards_handler.coffee index 136db8ee14..030f156486 100644 --- a/app/assets/javascripts/awards_handler.coffee +++ b/app/assets/javascripts/awards_handler.coffee @@ -40,7 +40,7 @@ class @AwardsHandler $menu = $ '.emoji-menu' if $addBtn.hasClass 'js-note-emoji' - $addBtn.parents('.note').find('.js-awards-block').addClass 'current' + $addBtn.closest('.note').find('.js-awards-block').addClass 'current' else $addBtn.closest('.js-awards-block').addClass 'current' diff --git a/app/assets/javascripts/blob/blob_ci_yaml.js.coffee b/app/assets/javascripts/blob/blob_ci_yaml.js.coffee new file mode 100644 index 0000000000..d9a03d0552 --- /dev/null +++ b/app/assets/javascripts/blob/blob_ci_yaml.js.coffee @@ -0,0 +1,23 @@ +#= require blob/template_selector + +class @BlobCiYamlSelector extends TemplateSelector + requestFile: (query) -> + Api.gitlabCiYml query.name, @requestFileSuccess.bind(@) + +class @BlobCiYamlSelectors + constructor: (opts) -> + { + @$dropdowns = $('.js-gitlab-ci-yml-selector') + @editor + } = opts + + @$dropdowns.each (i, dropdown) => + $dropdown = $(dropdown) + + new BlobCiYamlSelector( + pattern: /(.gitlab-ci.yml)/, + data: $dropdown.data('data'), + wrapper: $dropdown.closest('.js-gitlab-ci-yml-selector-wrap'), + dropdown: $dropdown, + editor: @editor + ) diff --git a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee index cc8a497d08..8d0e3f363d 100644 --- a/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee +++ b/app/assets/javascripts/blob/blob_gitignore_selector.js.coffee @@ -1,58 +1,5 @@ -class @BlobGitignoreSelector - constructor: (opts) -> - { - @dropdown - @editor - @$wrapper = @dropdown.closest('.gitignore-selector') - @$filenameInput = $('#file_name') - @data = @dropdown.data('filenames') - } = opts +#= require blob/template_selector - @dropdown.glDropdown( - data: @data, - filterable: true, - selectable: true, - search: - fields: ['name'] - clicked: @onClick - text: (gitignore) -> - gitignore.name - ) - - @toggleGitignoreSelector() - @bindEvents() - - bindEvents: -> - @$filenameInput - .on 'keyup blur', (e) => - @toggleGitignoreSelector() - - toggleGitignoreSelector: -> - filename = @$filenameInput.val() or $('.editor-file-name').text().trim() - @$wrapper.toggleClass 'hidden', filename isnt '.gitignore' - - onClick: (item, el, e) => - e.preventDefault() - @requestIgnoreFile(item.name) - - requestIgnoreFile: (name) -> - Api.gitignoreText name, @requestIgnoreFileSuccess.bind(@) - - requestIgnoreFileSuccess: (gitignore) -> - @editor.setValue(gitignore.content, 1) - @editor.focus() - -class @BlobGitignoreSelectors - constructor: (opts) -> - { - @$dropdowns = $('.js-gitignore-selector') - @editor - } = opts - - @$dropdowns.each (i, dropdown) => - $dropdown = $(dropdown) - - new BlobGitignoreSelector( - dropdown: $dropdown, - editor: @editor - ) +class @BlobGitignoreSelector extends TemplateSelector + requestFile: (query) -> + Api.gitignoreText query.name, @requestFileSuccess.bind(@) diff --git a/app/assets/javascripts/blob/blob_gitignore_selectors.js.coffee b/app/assets/javascripts/blob/blob_gitignore_selectors.js.coffee new file mode 100644 index 0000000000..a719ba2512 --- /dev/null +++ b/app/assets/javascripts/blob/blob_gitignore_selectors.js.coffee @@ -0,0 +1,17 @@ +class @BlobGitignoreSelectors + constructor: (opts) -> + { + @$dropdowns = $('.js-gitignore-selector') + @editor + } = opts + + @$dropdowns.each (i, dropdown) => + $dropdown = $(dropdown) + + new BlobGitignoreSelector( + pattern: /(.gitignore)/, + data: $dropdown.data('data'), + wrapper: $dropdown.closest('.js-gitignore-selector-wrap'), + dropdown: $dropdown, + editor: @editor + ) diff --git a/app/assets/javascripts/blob/blob_license_selector.js.coffee b/app/assets/javascripts/blob/blob_license_selector.js.coffee index e17eaa75dc..a3cc8dd844 100644 --- a/app/assets/javascripts/blob/blob_license_selector.js.coffee +++ b/app/assets/javascripts/blob/blob_license_selector.js.coffee @@ -1,30 +1,9 @@ -class @BlobLicenseSelector - licenseRegex: /^(.+\/)?(licen[sc]e|copying)($|\.)/i +#= require blob/template_selector - constructor: (editor) -> - @$licenseSelector = $('.js-license-selector') - $fileNameInput = $('#file_name') +class @BlobLicenseSelector extends TemplateSelector + requestFile: (query) -> + data = + project: @dropdown.data('project') + fullname: @dropdown.data('fullname') - initialFileNameValue = if $fileNameInput.length - $fileNameInput.val() - else if $('.editor-file-name').length - $('.editor-file-name').text().trim() - - @toggleLicenseSelector(initialFileNameValue) - - if $fileNameInput - $fileNameInput.on 'keyup blur', (e) => - @toggleLicenseSelector($(e.target).val()) - - $('select.license-select').on 'change', (e) -> - data = - project: $(this).data('project') - fullname: $(this).data('fullname') - Api.licenseText $(this).val(), data, (license) -> - editor.setValue(license.content, -1) - - toggleLicenseSelector: (fileName) => - if @licenseRegex.test(fileName) - @$licenseSelector.show() - else - @$licenseSelector.hide() + Api.licenseText query.id, data, @requestFileSuccess.bind(@) diff --git a/app/assets/javascripts/blob/blob_license_selectors.js.coffee b/app/assets/javascripts/blob/blob_license_selectors.js.coffee new file mode 100644 index 0000000000..6843873310 --- /dev/null +++ b/app/assets/javascripts/blob/blob_license_selectors.js.coffee @@ -0,0 +1,17 @@ +class @BlobLicenseSelectors + constructor: (opts) -> + { + @$dropdowns = $('.js-license-selector') + @editor + } = opts + + @$dropdowns.each (i, dropdown) => + $dropdown = $(dropdown) + + new BlobLicenseSelector( + pattern: /^(.+\/)?(licen[sc]e|copying)($|\.)/i, + data: $dropdown.data('data'), + wrapper: $dropdown.closest('.js-license-selector-wrap'), + dropdown: $dropdown, + editor: @editor + ) diff --git a/app/assets/javascripts/blob/edit_blob.js.coffee b/app/assets/javascripts/blob/edit_blob.js.coffee index 79141e768b..19e584519d 100644 --- a/app/assets/javascripts/blob/edit_blob.js.coffee +++ b/app/assets/javascripts/blob/edit_blob.js.coffee @@ -12,8 +12,10 @@ class @EditBlob $("#file-content").val(@editor.getValue()) @initModePanesAndLinks() - new BlobLicenseSelector(@editor) - new BlobGitignoreSelectors(editor: @editor) + + new BlobLicenseSelectors { @editor } + new BlobGitignoreSelectors { @editor } + new BlobCiYamlSelectors { @editor } initModePanesAndLinks: -> @$editModePanes = $(".js-edit-mode-pane") diff --git a/app/assets/javascripts/blob/template_selector.js.coffee b/app/assets/javascripts/blob/template_selector.js.coffee new file mode 100644 index 0000000000..e76e303189 --- /dev/null +++ b/app/assets/javascripts/blob/template_selector.js.coffee @@ -0,0 +1,56 @@ +class @TemplateSelector + constructor: (opts = {}) -> + { + @dropdown, + @data, + @pattern, + @wrapper, + @editor, + @fileEndpoint, + @$input = $('#file_name') + } = opts + + @buildDropdown() + @bindEvents() + @onFilenameUpdate() + + buildDropdown: -> + @dropdown.glDropdown( + data: @data, + filterable: true, + selectable: true, + search: + fields: ['name'] + clicked: @onClick + text: (item) -> + item.name + ) + + bindEvents: -> + @$input.on('keyup blur', (e) => + @onFilenameUpdate() + ) + + onFilenameUpdate: -> + return unless @$input.length + + filenameMatches = @pattern.test(@$input.val().trim()) + + if not filenameMatches + @wrapper.addClass('hidden') + return + + @wrapper.removeClass('hidden') + + onClick: (item, el, e) => + e.preventDefault() + @requestFile(item) + + requestFile: (item) -> + # To be implemented on the extending class + # e.g. + # Api.gitignoreText item.name, @requestFileSuccess.bind(@) + + requestFileSuccess: (file) -> + @editor.setValue(file.content, 1) + @editor.focus() diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 8b39e6b090..7fbff9214c 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -29,6 +29,7 @@ class Dispatcher new Todos() when 'projects:milestones:new', 'projects:milestones:edit' new ZenMode() + new DueDateSelect() new GLForm($('.milestone-form')) when 'groups:milestones:new' new ZenMode() @@ -72,13 +73,12 @@ class Dispatcher new Diff() new ZenMode() shortcut_handler = new ShortcutsNavigation() - when 'projects:commits:show' - shortcut_handler = new ShortcutsNavigation() - when 'projects:activity' + when 'projects:commits:show', 'projects:activity' shortcut_handler = new ShortcutsNavigation() when 'projects:show' shortcut_handler = new ShortcutsNavigation() + new NotificationsForm() new TreeView() if $('#tree-slider').length when 'groups:activity' new Activities() @@ -100,6 +100,7 @@ class Dispatcher when 'projects:blob:show', 'projects:blame:show' new LineHighlighter() shortcut_handler = new ShortcutsNavigation() + new ShortcutsBlob true when 'projects:labels:new', 'projects:labels:edit' new Labels() when 'projects:labels:index' @@ -129,19 +130,21 @@ class Dispatcher shortcut_handler = new ShortcutsDashboardNavigation() when 'profiles' new Profile() + new NotificationsForm() + new NotificationsDropdown() 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 ProjectNew() new ProjectShow() + new NotificationsDropdown() when 'wikis' new Wikis() shortcut_handler = new ShortcutsNavigation() @@ -150,9 +153,9 @@ class Dispatcher when 'snippets' shortcut_handler = new ShortcutsNavigation() new ZenMode() if path[2] == 'show' - when 'labels', 'graphs' - shortcut_handler = new ShortcutsNavigation() - when 'project_members', 'deploy_keys', 'hooks', 'services', 'protected_branches' + when 'labels', 'graphs', 'compare', 'pipelines', 'forks', \ + 'milestones', 'project_members', 'deploy_keys', 'builds', \ + 'hooks', 'services', 'protected_branches' shortcut_handler = new ShortcutsNavigation() # If we haven't installed a custom shortcut handler, install the default one diff --git a/app/assets/javascripts/due_date_select.js.coffee b/app/assets/javascripts/due_date_select.js.coffee index 3d009a96d0..d65c018dad 100644 --- a/app/assets/javascripts/due_date_select.js.coffee +++ b/app/assets/javascripts/due_date_select.js.coffee @@ -1,5 +1,21 @@ class @DueDateSelect constructor: -> + # Milestone edit/new form + $datePicker = $('.datepicker') + + if $datePicker.length + $dueDate = $('#milestone_due_date') + $datePicker.datepicker + dateFormat: 'yy-mm-dd' + onSelect: (dateText, inst) -> + $dueDate.val(dateText) + .datepicker('setDate', $.datepicker.parseDate('yy-mm-dd', $dueDate.val())) + + $('.js-clear-due-date').on 'click', (e) -> + e.preventDefault() + $.datepicker._clearDate($datePicker) + + # Issuable sidebar $loading = $('.js-issuable-update .due_date') .find('.block-loading') .hide() @@ -32,7 +48,7 @@ class @DueDateSelect date = new Date value.replace(new RegExp('-', 'g'), ',') mediumDate = $.datepicker.formatDate 'M d, yy', date else - mediumDate = 'None' + mediumDate = 'No due date' data = {} data[abilityName] = {} @@ -50,7 +66,8 @@ class @DueDateSelect $selectbox.hide() $value.css('display', '') - $valueContent.html(mediumDate) + cssClass = if Date.parse(mediumDate) then 'bold' else 'no-value' + $valueContent.html("#{mediumDate}") $sidebarValue.html(mediumDate) if value isnt '' diff --git a/app/assets/javascripts/gfm_auto_complete.js.coffee b/app/assets/javascripts/gfm_auto_complete.js.coffee index 76c3083232..190bb38504 100644 --- a/app/assets/javascripts/gfm_auto_complete.js.coffee +++ b/app/assets/javascripts/gfm_auto_complete.js.coffee @@ -15,6 +15,9 @@ GitLab.GfmAutoComplete = Members: template: '
  • ${username} ${title}
  • ' + Labels: + template: '
  • ${title}
  • ' + # Issues and MergeRequests Issues: template: '
  • ${id} ${title}
  • ' @@ -176,6 +179,25 @@ GitLab.GfmAutoComplete = title: sanitize(m.title) search: "#{m.iid} #{m.title}" + @input.atwho + at: '~' + alias: 'labels' + searchKey: 'search' + displayTpl: @Labels.template + insertTpl: '${atwho-at}${title}' + callbacks: + beforeSave: (merges) -> + sanitizeLabelTitle = (title)-> + if /\w+\s+\w+/g.test(title) + "\"#{sanitize(title)}\"" + else + sanitize(title) + + $.map merges, (m) -> + title: sanitizeLabelTitle(m.title) + color: m.color + search: "#{m.title}" + destroyAtWho: -> @input.atwho('destroy') @@ -195,6 +217,8 @@ GitLab.GfmAutoComplete = @input.atwho 'load', 'mergerequests', data.mergerequests # load emojis @input.atwho 'load', ':', data.emojis + # load labels + @input.atwho 'load', '~', data.labels # This trigger at.js again # otherwise we would be stuck with loading until the user types diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index b49bd4565a..2a7bf0bc30 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -58,7 +58,7 @@ class GitLabDropdownFilter filter: (search_text) -> data = @options.data() - if data? + if data? and not @options.filterByText results = data if search_text isnt '' @@ -102,10 +102,11 @@ class GitLabDropdownFilter $el = $(@) matches = fuzzaldrinPlus.match($el.text().trim(), search_text) - if matches.length - $el.show() - else - $el.hide() + unless $el.is('.dropdown-header') + if matches.length + $el.show() + else + $el.hide() else elements.show() @@ -191,6 +192,7 @@ class GitLabDropdown if @options.filterable @filter = new GitLabDropdownFilter @filterInput, filterInputBlur: @filterInputBlur + filterByText: @options.filterByText remote: @options.filterRemote query: @options.data keys: searchFields @@ -302,6 +304,9 @@ class GitLabDropdown if @options.setIndeterminateIds @options.setIndeterminateIds.call(@) + if @options.setActiveIds + @options.setActiveIds.call(@) + # Makes indeterminate items effective if @fullData and @dropdown.find('.dropdown-menu-toggle').hasClass('js-filter-bulk-update') @parseData @fullData diff --git a/app/assets/javascripts/labels_select.js.coffee b/app/assets/javascripts/labels_select.js.coffee index 9ca88f1226..6a10db10eb 100644 --- a/app/assets/javascripts/labels_select.js.coffee +++ b/app/assets/javascripts/labels_select.js.coffee @@ -39,7 +39,7 @@ class @LabelsSelect <% }); %>' ) - labelNoneHTMLTemplate = _.template('
    None
    ') + labelNoneHTMLTemplate = 'None' if newLabelField.length @@ -145,7 +145,7 @@ class @LabelsSelect template = labelHTMLTemplate(data) labelCount = data.labels.length else - template = labelNoneHTMLTemplate() + template = labelNoneHTMLTemplate $value .removeAttr('style') .html(template) @@ -210,9 +210,21 @@ class @LabelsSelect if $dropdown.hasClass('js-filter-bulk-update') indeterminate = instance.indeterminateIds + active = instance.activeIds + if indeterminate.indexOf(label.id) isnt -1 selectedClass.push 'is-indeterminate' + if active.indexOf(label.id) isnt -1 + # Remove is-indeterminate class if the item will be marked as active + i = selectedClass.indexOf 'is-indeterminate' + selectedClass.splice i, 1 unless i is -1 + + selectedClass.push 'is-active' + + # Add input manually + instance.addInput @fieldName, label.id + if $form.find("input[type='hidden']\ [name='#{$dropdown.data('fieldName')}']\ [value='#{this.id(label)}']").length @@ -328,6 +340,10 @@ class @LabelsSelect setIndeterminateIds: -> if @dropdown.find('.dropdown-menu-toggle').hasClass('js-filter-bulk-update') @indeterminateIds = _this.getIndeterminateIds() + + setActiveIds: -> + if @dropdown.find('.dropdown-menu-toggle').hasClass('js-filter-bulk-update') + @activeIds = _this.getActiveIds() ) @bindEvents() @@ -352,3 +368,12 @@ class @LabelsSelect label_ids.push $("#issue_#{issue_id}").data('labels') _.flatten(label_ids) + + getActiveIds: -> + label_ids = [] + + $('.selected_issue:checked').each (i, el) -> + issue_id = $(el).data('id') + label_ids.push $("#issue_#{issue_id}").data('labels') + + _.intersection.apply _, label_ids diff --git a/app/assets/javascripts/lib/common_utils.js.coffee b/app/assets/javascripts/lib/common_utils.js.coffee index 4f1779b848..e39dcb2daa 100644 --- a/app/assets/javascripts/lib/common_utils.js.coffee +++ b/app/assets/javascripts/lib/common_utils.js.coffee @@ -1,7 +1,45 @@ ((w) -> - window.gl or= {} - window.gl.utils or= {} + w.gl or= {} + w.gl.utils or= {} + + w.gl.utils.isInGroupsPage = -> + + return $('body').data('page').split(':')[0] is 'groups' + + + w.gl.utils.isInProjectPage = -> + + return $('body').data('page').split(':')[0] is 'projects' + + + w.gl.utils.getProjectSlug = -> + + return if @isInProjectPage() then $('body').data 'project' else null + + + w.gl.utils.getGroupSlug = -> + + return if @isInGroupsPage() then $('body').data 'group' else null + + + + gl.utils.updateTooltipTitle = ($tooltipEl, newTitle) -> + + $tooltipEl + .tooltip 'destroy' + .attr 'title', newTitle + .tooltip 'fixTitle' + + + gl.utils.preventDisabledButtons = -> + + $('.btn').click (e) -> + if $(this).hasClass 'disabled' + e.preventDefault() + e.stopImmediatePropagation() + return false + jQuery.timefor = (time, suffix, expiredLabel) -> @@ -24,20 +62,4 @@ return timefor - - gl.utils.updateTooltipTitle = ($tooltipEl, newTitle) -> - - $tooltipEl - .tooltip 'destroy' - .attr 'title', newTitle - .tooltip 'fixTitle' - - gl.utils.preventDisabledButtons = -> - - $('.btn').click (e) -> - if $(this).hasClass 'disabled' - e.preventDefault() - e.stopImmediatePropagation() - return false - ) window diff --git a/app/assets/javascripts/merge_request_tabs.js.coffee b/app/assets/javascripts/merge_request_tabs.js.coffee index 49a4727205..894f80586f 100644 --- a/app/assets/javascripts/merge_request_tabs.js.coffee +++ b/app/assets/javascripts/merge_request_tabs.js.coffee @@ -88,7 +88,7 @@ class @MergeRequestTabs scrollToElement: (container) -> if window.location.hash - navBarHeight = $('.navbar-gitlab').outerHeight() + navBarHeight = $('.navbar-gitlab').outerHeight() + $('.layout-nav').outerHeight() $el = $("#{container} #{window.location.hash}:not(.match)") $.scrollTo("#{container} #{window.location.hash}:not(.match)", offset: -navBarHeight) if $el.length diff --git a/app/assets/javascripts/milestone_select.js.coffee b/app/assets/javascripts/milestone_select.js.coffee index b108f747bd..02480f3a02 100644 --- a/app/assets/javascripts/milestone_select.js.coffee +++ b/app/assets/javascripts/milestone_select.js.coffee @@ -24,14 +24,10 @@ class @MilestoneSelect if issueUpdateURL milestoneLinkTemplate = _.template( - ' - - <%= _.escape(title) %> - - ' + '<%= _.escape(title) %>' ) - milestoneLinkNoneTemplate = '
    None
    ' + milestoneLinkNoneTemplate = 'None' collapsedSidebarLabelTemplate = _.template( ' diff --git a/app/assets/javascripts/network/application.js.coffee b/app/assets/javascripts/network/application.js.coffee new file mode 100644 index 0000000000..cb9eead855 --- /dev/null +++ b/app/assets/javascripts/network/application.js.coffee @@ -0,0 +1,20 @@ +# 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 raphael +#= require g.raphael +#= require g.bar +#= require_tree . + +$ -> + network_graph = new Network({ + url: $(".network-graph").attr('data-url'), + commit_url: $(".network-graph").attr('data-commit-url'), + ref: $(".network-graph").attr('data-ref'), + commit_id: $(".network-graph").attr('data-commit-id') + }) + + new ShortcutsNetwork(network_graph.branch_graph) diff --git a/app/assets/javascripts/branch-graph.js.coffee b/app/assets/javascripts/network/branch-graph.js.coffee similarity index 100% rename from app/assets/javascripts/branch-graph.js.coffee rename to app/assets/javascripts/network/branch-graph.js.coffee diff --git a/app/assets/javascripts/network.js.coffee b/app/assets/javascripts/network/network.js.coffee similarity index 100% rename from app/assets/javascripts/network.js.coffee rename to app/assets/javascripts/network/network.js.coffee diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index e2d3241437..17f7e18012 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -102,12 +102,15 @@ class @Notes keydownNoteText: (e) -> $this = $(this) - if $this.val() is '' and e.which is 38 #aka the up key + if $this.val() is '' and e.which is 38 and not isMetaKey e myLastNote = $("li.note[data-author-id='#{gon.current_user_id}'][data-editable]:last") if myLastNote.length myLastNoteEditBtn = myLastNote.find('.js-note-edit') myLastNoteEditBtn.trigger('click', [true, myLastNote]) + isMetaKey = (e) -> + (e.metaKey or e.ctrlKey or e.altKey or e.shiftKey) + initRefresh: -> clearInterval(Notes.interval) Notes.interval = setInterval => diff --git a/app/assets/javascripts/notifications_dropdown.js.coffee b/app/assets/javascripts/notifications_dropdown.js.coffee new file mode 100644 index 0000000000..0bbd082c15 --- /dev/null +++ b/app/assets/javascripts/notifications_dropdown.js.coffee @@ -0,0 +1,25 @@ +class @NotificationsDropdown + constructor: -> + $(document) + .off 'click', '.update-notification' + .on 'click', '.update-notification', (e) -> + e.preventDefault() + + return if $(this).is('.is-active') and $(this).data('notification-level') is 'custom' + + notificationLevel = $(@).data 'notification-level' + label = $(@).data 'notification-title' + form = $(this).parents('.notification-form:first') + form.find('.js-notification-loading').toggleClass 'fa-bell fa-spin fa-spinner' + form.find('#notification_setting_level').val(notificationLevel) + form.submit() + + $(document) + .off 'ajax:success', '.notification-form' + .on 'ajax:success', '.notification-form', (e, data) -> + if data.saved + $(e.currentTarget) + .closest('.notification-dropdown') + .replaceWith(data.html) + else + new Flash('Failed to save new settings', 'alert') diff --git a/app/assets/javascripts/notifications_form.js.coffee b/app/assets/javascripts/notifications_form.js.coffee new file mode 100644 index 0000000000..3432428702 --- /dev/null +++ b/app/assets/javascripts/notifications_form.js.coffee @@ -0,0 +1,49 @@ +class @NotificationsForm + constructor: -> + @removeEventListeners() + @initEventListeners() + + removeEventListeners: -> + $(document).off 'change', '.js-custom-notification-event' + + initEventListeners: -> + $(document).on 'change', '.js-custom-notification-event', @toggleCheckbox + + toggleCheckbox: (e) => + $checkbox = $(e.currentTarget) + $parent = $checkbox.closest('.checkbox') + @saveEvent($checkbox, $parent) + + showCheckboxLoadingSpinner: ($parent) -> + $parent + .addClass 'is-loading' + .find '.custom-notification-event-loading' + .removeClass 'fa-check' + .addClass 'fa-spin fa-spinner' + .removeClass 'is-done' + + saveEvent: ($checkbox, $parent) -> + form = $parent.parents('form:first') + + $.ajax( + url: form.attr('action') + method: form.attr('method') + dataType: 'json' + data: form.serialize() + + beforeSend: => + @showCheckboxLoadingSpinner($parent) + ).done (data) -> + $checkbox.enable() + + if data.saved + $parent + .find '.custom-notification-event-loading' + .toggleClass 'fa-spin fa-spinner fa-check is-done' + + setTimeout(-> + $parent + .removeClass 'is-loading' + .find '.custom-notification-event-loading' + .toggleClass 'fa-spin fa-spinner fa-check is-done' + , 2000) diff --git a/app/assets/javascripts/profile.js.coffee b/app/assets/javascripts/profile.js.coffee index 26a1242352..1583d1ba6f 100644 --- a/app/assets/javascripts/profile.js.coffee +++ b/app/assets/javascripts/profile.js.coffee @@ -8,6 +8,10 @@ class @Profile $('.js-preferences-form').on 'change.preference', 'input[type=radio]', -> $(this).parents('form').submit() + # Automatically submit email form when it changes + $('#user_notification_email').on 'change', -> + $(this).parents('form').submit() + $('.update-username').on 'ajax:before', -> $('.loading-username').show() $(this).find('.update-success').hide() diff --git a/app/assets/javascripts/project.js.coffee b/app/assets/javascripts/project.js.coffee index 07be85a32a..96e10dd7e8 100644 --- a/app/assets/javascripts/project.js.coffee +++ b/app/assets/javascripts/project.js.coffee @@ -19,6 +19,7 @@ class @Project $('.clone').text(url) # Ref switcher + @initRefSwitcher() $('.project-refs-select').on 'change', -> $(@).parents('form').submit() @@ -34,23 +35,6 @@ class @Project $(@).parents('.no-password-message').remove() e.preventDefault() - $('.update-notification').on 'click', (e) -> - e.preventDefault() - notification_level = $(@).data 'notification-level' - label = $(@).data 'notification-title' - $('#notification_setting_level').val(notification_level) - $('#notification-form').submit() - $('#notifications-button').empty().append("" + label + "") - $(@).parents('ul').find('li.active').removeClass 'active' - $(@).parent().addClass 'active' - - $('#notification-form').on 'ajax:success', (e, data) -> - if data.saved - new Flash("Notification settings saved", "notice") - else - new Flash("Failed to save new settings", "alert") - - @projectSelectDropdown() projectSelectDropdown: -> @@ -66,3 +50,39 @@ class @Project changeProject: (url) -> window.location = url + + initRefSwitcher: -> + $('.js-project-refs-dropdown').each -> + $dropdown = $(@) + selected = $dropdown.data('selected') + + $dropdown.glDropdown( + data: (term, callback) -> + $.ajax( + url: $dropdown.data('refs-url') + data: + ref: $dropdown.data('ref') + ).done (refs) -> + callback(refs) + selectable: true + filterable: true + filterByText: true + fieldName: 'ref' + renderRow: (ref) -> + if ref.header? + "" + else + isActiveClass = if ref is selected then 'is-active' else '' + + "
  • + + #{ref} + +
  • " + id: (obj, $el) -> + $el.data('ref') + toggleLabel: (obj, $el) -> + $el.text().trim() + clicked: (e) -> + $dropdown.closest('form').submit() + ) diff --git a/app/assets/javascripts/right_sidebar.js.coffee b/app/assets/javascripts/right_sidebar.js.coffee index 8eb005b0a2..12340bbce5 100644 --- a/app/assets/javascripts/right_sidebar.js.coffee +++ b/app/assets/javascripts/right_sidebar.js.coffee @@ -51,15 +51,19 @@ class @Sidebar $this = $(e.currentTarget) $todoLoading = $('.js-issuable-todo-loading') $btnText = $('.js-issuable-todo-text', $this) - ajaxType = if $this.attr('data-id') then 'PATCH' else 'POST' - ajaxUrlExtra = if $this.attr('data-id') then "/#{$this.attr('data-id')}" else '' + ajaxType = if $this.attr('data-delete-path') then 'DELETE' else 'POST' + + if $this.attr('data-delete-path') + url = "#{$this.attr('data-delete-path')}" + else + url = "#{$this.data('url')}" $.ajax( - url: "#{$this.data('url')}#{ajaxUrlExtra}" + url: url type: ajaxType dataType: 'json' data: - issuable_id: $this.data('issuable') + issuable_id: $this.data('issuable-id') issuable_type: $this.data('issuable-type') beforeSend: => @beforeTodoSend($this, $todoLoading) @@ -82,15 +86,15 @@ class @Sidebar else $todoPendingCount.removeClass 'hidden' - if data.todo? + if data.delete_path? $btn .attr 'aria-label', $btn.data('mark-text') - .attr 'data-id', data.todo.id + .attr 'data-delete-path', data.delete_path $btnText.text $btn.data('mark-text') else $btn .attr 'aria-label', $btn.data('todo-text') - .removeAttr 'data-id' + .removeAttr 'data-delete-path' $btnText.text $btn.data('todo-text') sidebarDropdownLoading: (e) -> diff --git a/app/assets/javascripts/search_autocomplete.js.coffee b/app/assets/javascripts/search_autocomplete.js.coffee index 5eb915a51e..421328554b 100644 --- a/app/assets/javascripts/search_autocomplete.js.coffee +++ b/app/assets/javascripts/search_autocomplete.js.coffee @@ -67,8 +67,12 @@ class @SearchAutocomplete getData: (term, callback) -> _this = @ - # Do not trigger request if input is empty - return if @searchInput.val() is '' + unless term + if contents = @getCategoryContents() + @searchInput.data('glDropdown').filter.options.callback contents + @enableAutocomplete() + + return # Prevent multiple ajax calls return if @loadingSuggestions @@ -122,6 +126,37 @@ class @SearchAutocomplete ).always -> _this.loadingSuggestions = false + + getCategoryContents: -> + + userId = gon.current_user_id + { utils, projectOptions, groupOptions, dashboardOptions } = gl + + if utils.isInGroupsPage() and groupOptions + options = groupOptions[utils.getGroupSlug()] + + else if utils.isInProjectPage() and projectOptions + options = projectOptions[utils.getProjectSlug()] + + else if dashboardOptions + options = dashboardOptions + + { issuesPath, mrPath, name } = options + + items = [ + { header: "#{name}" } + { text: 'Issues assigned to me', url: "#{issuesPath}/?assignee_id=#{userId}" } + { text: "Issues I've created", url: "#{issuesPath}/?author_id=#{userId}" } + 'separator' + { text: 'Merge requests assigned to me', url: "#{mrPath}/?assignee_id=#{userId}" } + { text: "Merge requests I've created", url: "#{mrPath}/?author_id=#{userId}" } + ] + + items.splice 0, 1 unless name + + return items + + serializeState: -> { # Search Criteria @@ -209,6 +244,12 @@ class @SearchAutocomplete @isFocused = true @wrap.addClass('search-active') + @getData() if @getValue() is '' + + + getValue: -> return @searchInput.val() + + onClearInputClick: (e) => e.preventDefault() @searchInput.val('').focus() @@ -229,6 +270,10 @@ class @SearchAutocomplete @locationBadgeEl.text(badgeText).show() @wrap.addClass('has-location-badge') + + hasLocationBadge: -> return @wrap.is '.has-location-badge' + + restoreOriginalState: -> inputs = Object.keys @originalState @@ -257,13 +302,14 @@ class @SearchAutocomplete @getElement("##{input}").val('') + removeLocationBadge: -> + @locationBadgeEl.hide() - - # Reset state @resetSearchState() - @wrap.removeClass('has-location-badge') + @disableAutocomplete() + disableAutocomplete: -> @searchInput.addClass('disabled') diff --git a/app/assets/javascripts/shortcuts.js.coffee b/app/assets/javascripts/shortcuts.js.coffee index f3d6600413..c03877e9b0 100644 --- a/app/assets/javascripts/shortcuts.js.coffee +++ b/app/assets/javascripts/shortcuts.js.coffee @@ -1,7 +1,7 @@ class @Shortcuts - constructor: -> + constructor: (skipResetBindings) -> @enabledHelp = [] - Mousetrap.reset() + Mousetrap.reset() if not skipResetBindings Mousetrap.bind('?', @onToggleHelp) Mousetrap.bind('s', Shortcuts.focusSearch) Mousetrap.bind(['ctrl+shift+p', 'command+shift+p'], @toggleMarkdownPreview) diff --git a/app/assets/javascripts/shortcuts_blob.coffee b/app/assets/javascripts/shortcuts_blob.coffee new file mode 100644 index 0000000000..6d21e5d115 --- /dev/null +++ b/app/assets/javascripts/shortcuts_blob.coffee @@ -0,0 +1,10 @@ +#= require shortcuts + +class @ShortcutsBlob extends Shortcuts + constructor: (skipResetBindings) -> + super skipResetBindings + Mousetrap.bind('y', ShortcutsBlob.copyToClipboard) + + @copyToClipboard: -> + clipboardButton = $('.btn-clipboard') + clipboardButton.click() if clipboardButton diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index 2ce63c1642..68009e5864 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -3,13 +3,33 @@ expanded = 'page-sidebar-expanded' toggleSidebar = -> $('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}") - $('header').toggleClass("header-collapsed header-expanded") + $('.navbar-fixed-top').toggleClass("header-collapsed header-expanded") + + if $.cookie('pin_nav') is 'true' + $('.navbar-fixed-top').toggleClass('header-pinned-nav') + $('.page-with-sidebar').toggleClass('page-sidebar-pinned') setTimeout ( -> - niceScrollBars = $('.nicescroll').niceScroll(); + niceScrollBars = $('.nav-sidebar').niceScroll(); niceScrollBars.updateScrollBar(); ), 300 +$(document) + .off 'click', 'body' + .on 'click', 'body', (e) -> + unless $.cookie('pin_nav') is 'true' + $target = $(e.target) + $nav = $target.closest('.sidebar-wrapper') + pageExpanded = $('.page-with-sidebar').hasClass('page-sidebar-expanded') + $toggle = $target.closest('.toggle-nav-collapse, .side-nav-toggle') + + if $nav.length is 0 and pageExpanded and $toggle.length is 0 + $('.page-with-sidebar') + .toggleClass('page-sidebar-collapsed page-sidebar-expanded') + + $('.navbar-fixed-top') + .toggleClass('header-collapsed header-expanded') + $(document).on("click", '.toggle-nav-collapse, .side-nav-toggle', (e) -> e.preventDefault() diff --git a/app/assets/javascripts/users/calendar.js.coffee b/app/assets/javascripts/users/calendar.js.coffee index 26a2606153..c081f023b0 100644 --- a/app/assets/javascripts/users/calendar.js.coffee +++ b/app/assets/javascripts/users/calendar.js.coffee @@ -6,12 +6,6 @@ class @Calendar @daySizeWithSpace = @daySize + (@daySpace * 2) @monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] @months = [] - @highestValue = 0 - - # Get the highest value from the timestampes - _.each timestamps, (count) => - if count > @highestValue - @highestValue = count # Loop through the timestamps to create a group of objects # The group of objects will be grouped based on the day of the week they are @@ -39,8 +33,8 @@ class @Calendar i++ # Init color functions - @color = @initColor() @colorKey = @initColorKey() + @color = @initColor() # Init the svg element @renderSvg(group) @@ -104,7 +98,7 @@ class @Calendar .attr 'class', 'user-contrib-cell js-tooltip' .attr 'fill', (stamp) => if stamp.count isnt 0 - @color(stamp.count) + @color(Math.min(stamp.count, 40)) else '#ededed' .attr 'data-container', 'body' @@ -164,10 +158,11 @@ class @Calendar color initColor: -> + colorRange = ['#ededed', @colorKey(0), @colorKey(1), @colorKey(2), @colorKey(3)] d3.scale - .linear() - .range(['#acd5f2', '#254e77']) - .domain([0, @highestValue]) + .threshold() + .domain([0, 10, 20, 30]) + .range(colorRange) initColorKey: -> d3.scale diff --git a/app/assets/javascripts/users_select.js.coffee b/app/assets/javascripts/users_select.js.coffee index 3dbc1d7f14..2548efb218 100644 --- a/app/assets/javascripts/users_select.js.coffee +++ b/app/assets/javascripts/users_select.js.coffee @@ -72,7 +72,7 @@ class @UsersSelect assigneeTemplate = _.template( '<% if (username) { %> - + <% if( avatar ) { %> <% } %> @@ -82,7 +82,7 @@ class @UsersSelect
    <% } else { %> - + No assignee - assign yourself diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss index 3cbddc59f1..a306b8f3f2 100644 --- a/app/assets/stylesheets/framework.scss +++ b/app/assets/stylesheets/framework.scss @@ -37,3 +37,4 @@ @import "framework/timeline.scss"; @import "framework/typography.scss"; @import "framework/zen.scss"; +@import "framework/blank"; diff --git a/app/assets/stylesheets/framework/blank.scss b/app/assets/stylesheets/framework/blank.scss new file mode 100644 index 0000000000..40b5171a8c --- /dev/null +++ b/app/assets/stylesheets/framework/blank.scss @@ -0,0 +1,23 @@ +.blank-state { + padding-top: 20px; + padding-bottom: 20px; + text-align: center; +} + +.blank-state-no-icon { + padding-top: 40px; + padding-bottom: 40px; +} + +.blank-state-title { + margin-top: 0; + margin-bottom: 5px; + font-size: 19px; + font-weight: normal; +} + +.blank-state-text { + margin-top: 0; + margin-bottom: $gl-padding; + font-size: 15px; +} diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss index fab96404a6..3802381870 100644 --- a/app/assets/stylesheets/framework/blocks.scss +++ b/app/assets/stylesheets/framework/blocks.scss @@ -91,6 +91,26 @@ background-color: $white-light; border-top: none; } + + &.top-block .container-fluid { + background-color: inherit; + } +} + +.sub-header-block { + background-color: $white-light; + border-bottom: 1px solid $white-dark; + padding: 11px 0; + margin-bottom: 11px; + + .oneline { + line-height: 35px; + } + + &.no-bottom-space { + border-bottom: 0; + margin-bottom: 0; + } } .cover-block { diff --git a/app/assets/stylesheets/framework/dropdowns.scss b/app/assets/stylesheets/framework/dropdowns.scss index d4d579a083..00111dfa70 100644 --- a/app/assets/stylesheets/framework/dropdowns.scss +++ b/app/assets/stylesheets/framework/dropdowns.scss @@ -461,10 +461,12 @@ } } - .ui-state-active, - .ui-state-hover { - color: $md-link-color; - background-color: $calendar-hover-bg; + .ui-datepicker-calendar { + .ui-state-hover, + .ui-state-active { + color: #fff; + border: 0; + } } .ui-datepicker-prev, diff --git a/app/assets/stylesheets/framework/gitlab-theme.scss b/app/assets/stylesheets/framework/gitlab-theme.scss index 408d4a68e1..0a8603b670 100644 --- a/app/assets/stylesheets/framework/gitlab-theme.scss +++ b/app/assets/stylesheets/framework/gitlab-theme.scss @@ -8,8 +8,8 @@ */ @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { .page-with-sidebar { - - .collapse-nav a { + .toggle-nav-collapse, + .pin-nav-btn { color: $color-light; background: $color; diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index 63996ea44f..a7bcb45656 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -2,8 +2,19 @@ * Application Header * */ +@mixin tanuki-logo-colors($path-color) { + fill: $path-color; + transition: all 0.8s; + + &:hover, + &.highlight { + fill: lighten($path-color, 25%); + transition: all 0.1s; + } +} + header { - transition-duration: .3s; + transition: padding $sidebar-transition-duration; &.navbar-empty { height: $header-height; @@ -79,14 +90,9 @@ header { &.header-collapsed { padding: 0 16px; - - .side-nav-toggle { - display: block; - } } .side-nav-toggle { - display: none; position: absolute; left: -10px; margin: 6px 0; @@ -108,9 +114,7 @@ header { .header-content { position: relative; height: $header-height; - padding-right: 40px; padding-left: 30px; - transition-duration: .3s; @media (min-width: $screen-sm-min) { padding-right: 0; @@ -198,25 +202,24 @@ header { } } -.header-collapsed { - margin-left: 0; +#tanuki-logo { - .header-content { - - @media (min-width: $screen-sm-max) { - padding-left: 30px; - transition-duration: .3s; - } + #tanuki-left-ear, + #tanuki-right-ear, + #tanuki-nose { + @include tanuki-logo-colors($tanuki-red); } -} -.tanuki-shape { - transition: all 0.8s; - - &:hover, &.highlight { - fill: rgb(255, 255, 255); - transition: all 0.1s; + #tanuki-left-eye, + #tanuki-right-eye { + @include tanuki-logo-colors($tanuki-orange); } + + #tanuki-left-cheek, + #tanuki-right-cheek { + @include tanuki-logo-colors($tanuki-yellow); + } + } @media (max-width: $screen-xs-max) { diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index b34ec16cdb..a12c0bba44 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -159,7 +159,7 @@ ul.content-list { background-color: $gray-light; border: dotted 1px $gray-dark; margin: 1px 0; - min-height: 30px; + min-height: 52px; } } } diff --git a/app/assets/stylesheets/framework/markdown_area.scss b/app/assets/stylesheets/framework/markdown_area.scss index fd885b3868..fc89eaa09d 100644 --- a/app/assets/stylesheets/framework/markdown_area.scss +++ b/app/assets/stylesheets/framework/markdown_area.scss @@ -97,5 +97,7 @@ white-space: pre-wrap; word-break: keep-all; } + + @include bulleted-list; } } diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss index 828e722423..5ec5a96a59 100644 --- a/app/assets/stylesheets/framework/mixins.scss +++ b/app/assets/stylesheets/framework/mixins.scss @@ -110,3 +110,17 @@ font-size: 16px; line-height: 24px; } + +@mixin bulleted-list { + > ul { + list-style-type: disc; + + ul { + list-style-type: circle; + + ul { + list-style-type: square; + } + } + } +} \ No newline at end of file diff --git a/app/assets/stylesheets/framework/mobile.scss b/app/assets/stylesheets/framework/mobile.scss index d4e5cc819a..c74682dfef 100644 --- a/app/assets/stylesheets/framework/mobile.scss +++ b/app/assets/stylesheets/framework/mobile.scss @@ -52,6 +52,19 @@ .git-clone-holder { display: none; } + + // Display Star and Fork buttons without counters on mobile. + .project-action-buttons { + display: block; + + .count-buttons .btn { + margin: 0 10px; + } + + .count-buttons .count-with-arrow { + display: none; + } + } } .project-stats { diff --git a/app/assets/stylesheets/framework/nav.scss b/app/assets/stylesheets/framework/nav.scss index 829222509f..0281b06d3b 100644 --- a/app/assets/stylesheets/framework/nav.scss +++ b/app/assets/stylesheets/framework/nav.scss @@ -18,6 +18,13 @@ opacity: 0; transition-duration: .3s; } + + .fa { + position: relative; + top: 3px; + font-size: 13px; + color: $btn-placeholder-gray; + } } @mixin scrolling-links() { @@ -104,10 +111,6 @@ width: 50%; line-height: 28px; - &.wiki-page { - padding: 16px 10px 11px; - } - /* Small devices (phones, tablets, 768px and lower) */ @media (max-width: $screen-sm-min) { width: 100%; @@ -136,7 +139,7 @@ } /* Small devices (phones, tablets, 768px and lower) */ - @media (max-width: $screen-sm-max) { + @media (max-width: $screen-xs-max) { width: 100%; } } @@ -220,6 +223,7 @@ form { display: block; height: auto; + margin-bottom: 14px; input { width: 100%; @@ -242,6 +246,12 @@ } } } + + &.adjust { + .nav-text, .nav-controls { + width: auto; + } + } } .layout-nav { @@ -251,7 +261,7 @@ z-index: 11; background: $background-color; border-bottom: 1px solid $border-color; - transition-duration: .3s; + transition: padding $sidebar-transition-duration; text-align: center; .container-fluid { @@ -313,11 +323,19 @@ .fade-right { @include fade(left, rgba(250, 250, 250, 0.4), $background-color); right: 0; + + .fa { + right: -7px; + } } .fade-left { @include fade(right, rgba(250, 250, 250, 0.4), $background-color); left: 0; + + .fa { + left: -7px; + } } li { @@ -347,6 +365,12 @@ .badge { color: $gl-icon-color; } + + &:hover { + a, i { + color: $black; + } + } } } diff --git a/app/assets/stylesheets/framework/panels.scss b/app/assets/stylesheets/framework/panels.scss index ae7bdf14c4..874416e100 100644 --- a/app/assets/stylesheets/framework/panels.scss +++ b/app/assets/stylesheets/framework/panels.scss @@ -9,6 +9,10 @@ margin-top: -2px; float: right; } + + .dropdown-menu-toggle { + line-height: 20px; + } } .panel-body { diff --git a/app/assets/stylesheets/framework/selects.scss b/app/assets/stylesheets/framework/selects.scss index f242706ebe..21d87cc9d3 100644 --- a/app/assets/stylesheets/framework/selects.scss +++ b/app/assets/stylesheets/framework/selects.scss @@ -165,11 +165,6 @@ background-size: 16px 16px !important; } -/** Branch/tag selector **/ -.project-refs-form .select2-container { - width: 160px !important; -} - .select2-results .select2-no-results, .select2-results .select2-searching, .select2-results .select2-ajax-error, diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index 4668e7e911..98f917ce69 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -1,26 +1,31 @@ .page-with-sidebar { padding-top: $header-height; - transition-duration: .3s; + transition: padding $sidebar-transition-duration; .sidebar-wrapper { position: fixed; top: 0; bottom: 0; - overflow-y: auto; - overflow-x: hidden; left: 0; height: 100%; - transition-duration: .3s; + overflow: hidden; + transition: width $sidebar-transition-duration; } } .sidebar-wrapper { z-index: 1000; background: $background-color; + + .nicescroll-rails-hr { + // TODO: Figure out why nicescroll doesn't hide horizontal bar + display: none!important; + } } .content-wrapper { width: 100%; + transition: padding $sidebar-transition-duration; .container-fluid { background: #fff; @@ -34,50 +39,39 @@ } } -.sidebar-wrapper { +.sidebar-user { + padding: 15px; + position: absolute; + left: 0; + bottom: 0; + width: $sidebar_width; + overflow: hidden; + font-size: 16px; + line-height: 36px; + transition: width $sidebar-transition-duration, padding $sidebar-transition-duration; - .sidebar-user { - padding: 15px 22px; - position: fixed; - bottom: 0; - width: $sidebar_width; - overflow: hidden; - transition-duration: .3s; - - .username { - margin-left: 10px; - width: $sidebar_width - 2 * 10px; - font-size: 16px; - line-height: 34px; - } + @media (min-width: $sidebar-breakpoint) { + bottom: 50px; } } - -.tanuki-shape { - transition: all 0.8s; - - &:hover, &.highlight { - fill: rgb(255, 255, 255); - transition: all 0.1s; - } -} - - .nav-sidebar { - margin-top: 22 + $header-height; - margin-bottom: 116px; - transition-duration: .3s; - list-style: none; - overflow: hidden; + position: absolute; + top: 50px; + bottom: 65px; + width: $sidebar_width; + overflow-y: auto; + overflow-x: hidden; + + @media (min-width: $sidebar-breakpoint) { + bottom: 115px; + } &.navbar-collapse { padding: 0 !important; } li { - width: $sidebar_width; - &.separate-item { padding-top: 10px; margin-top: 10px; @@ -90,8 +84,7 @@ } a { - width: $sidebar_width; - padding: 7px 15px 7px 23px; + padding: 7px 15px 7px 12px; font-size: $gl-font-size; line-height: 24px; display: block; @@ -99,11 +92,9 @@ font-weight: normal; outline: none; - &:hover { - text-decoration: none; - } - - &:active, &:focus { + &:hover, + &:active, + &:focus { text-decoration: none; } @@ -115,10 +106,6 @@ svg { margin-right: 13px; } - - &.back-link i { - transition-duration: .3s; - } } } @@ -129,37 +116,50 @@ } } -.sidebar-subnav { - margin-left: 0; - padding-left: 0; - - li { - list-style: none; - } -} - -.collapse-nav a { +.toggle-nav-collapse { width: $sidebar_width; - position: fixed; + position: absolute; top: 0; left: 0; + min-height: 50px; padding: 5px 0; font-size: 18px; - background: transparent; - height: 50px; - text-align: center; - line-height: 40px; - transition-duration: .3s; - outline: none; + line-height: 30px; +} - &:hover { +.nav-header-btn { + padding: 10px 5px; + color: inherit; + transition-duration: .3s; + + &:hover, + &:focus { + color: $white-light; text-decoration: none; } } -.sidebar-wrapper { - &.hidden-nav { - width: 0; +.pin-nav-btn { + display: none; + position: absolute; + left: 0; + bottom: 0; + height: 50px; + width: $sidebar_width; + line-height: 30px; + + @media (min-width: $sidebar-breakpoint) { + display: block; + } + + .fa { + transition: transform .15s; + } + + &.is-active { + .fa { + transform: rotate(90deg); + } } } @@ -168,62 +168,34 @@ .sidebar-wrapper { width: 0; - - .nav-sidebar { - width: 0; - - li { - width: auto; - - a { - span { - display: none; - } - } - } - } - - .collapse-nav a { - width: 0; - - i { - display: none; - } - } - - .sidebar-user { - width: 0; - padding-left: 0; - padding-right: 0; - - .username { - display: none; - } - } } } .page-sidebar-expanded { - - @media (max-width: $screen-sm-max) { - padding-left: 0; - } - .sidebar-wrapper { width: $sidebar_width; + } +} - .nav-sidebar { - width: $sidebar_width; +.page-sidebar-pinned { + .content-wrapper, + .layout-nav { + @media (min-width: $sidebar-breakpoint) { + padding-left: $sidebar_width; + } + } +} + +header.header-pinned-nav { + @media (min-width: $sidebar-breakpoint) { + padding-left: ($sidebar_width + $gl-padding); + + .side-nav-toggle { + display: none; } - .nav-sidebar li a { - width: $sidebar_width; - - &.back-link { - i { - opacity: 0; - } - } + .header-content { + padding-left: 0; } } } diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 752d8ec878..c37574ca7a 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -6,6 +6,8 @@ $sidebar_width: 220px; $gutter_collapsed_width: 62px; $gutter_width: 290px; $gutter_inner_width: 258px; +$sidebar-transition-duration: .15s; +$sidebar-breakpoint: 1440px; /* * UI elements @@ -154,6 +156,11 @@ $warning-message-border: #f0e2bb; /* header */ $light-grey-header: #faf9f9; +/* tanuki logo colors */ +$tanuki-red: #e24329; +$tanuki-orange: #fc6d26; +$tanuki-yellow: #fca326; + /* * State colors: */ @@ -261,5 +268,10 @@ $calendar-hover-bg: #ecf3fe; $calendar-border-color: rgba(#000, .1); $calendar-unselectable-bg: #faf9f9; +/* + * Personal Access Tokens + */ +$personal-access-tokens-disabled-label-color: #bbb; + $ci-output-bg: #1d1f21; $ci-text-color: #c5c8c6; diff --git a/app/assets/stylesheets/mailers/devise.scss b/app/assets/stylesheets/mailers/devise.scss index 28611a5ec8..9495c5b3f3 100644 --- a/app/assets/stylesheets/mailers/devise.scss +++ b/app/assets/stylesheets/mailers/devise.scss @@ -38,6 +38,10 @@ table { margin: 0 auto; text-align: left; width: 600px; + + & > td { + text-align: center; + } } &#body { diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss index c8c6bbde08..de534d2842 100644 --- a/app/assets/stylesheets/pages/commits.scss +++ b/app/assets/stylesheets/pages/commits.scss @@ -7,84 +7,119 @@ margin-right: 9px; } -.lists-separator { - margin: 10px 0; - border-color: #ddd; -} +.commit-header { + padding: 5px 10px; + background-color: $background-color; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + font-size: 14px; -.commits-row { - ul { - margin: 0; - - li.commit { - padding: 8px 0; - } - } - - .commits-row-date { - font-size: 15px; - line-height: 20px; - margin-bottom: 5px; + &:first-child { + border-top-width: 0; } } -li.commit { - list-style: none; +.commit-row-title { + line-height: 1; + margin-bottom: 7px; - .commit-row-title { - font-size: $list-font-size; - line-height: 20px; - margin-bottom: 2px; + .notes_count { + float: right; + margin-right: 10px; + } - .btn-clipboard { - margin-top: -1px; + .str-truncated { + max-width: 70%; + } + + .commit-row-message { + color: $gl-dark-link-color; + } + + .text-expander { + display: inline-block; + background: $gray-light; + color: $gl-placeholder-color; + padding: 0 5px; + cursor: pointer; + border: 1px solid $border-gray-dark; + border-radius: $border-radius-default; + margin-left: 5px; + + &:hover { + background-color: darken($gray-light, 10%); + text-decoration: none; } + } +} - .notes_count { - float: right; - margin-right: 10px; +.commit-actions { + @media (min-width: $screen-sm-min) { + float: right; + margin-left: $gl-padding; + margin-top: 2px; + font-size: 0; + } + + .btn-transparent { + padding-left: 0; + padding-right: 0; + } + + .btn { + &:not(:first-child) { + margin-left: $gl-padding; } + } +} - .commit_short_id { - min-width: 65px; - color: $gl-dark-link-color; - font-family: $monospace_font; +.commit-short-id { + font-family: $monospace_font; + font-weight: 600; +} + +.commit { + padding: 10px 0; + position: relative; + + @media (min-width: $screen-sm-min) { + padding-left: 20px; + + .commit-info-block { + padding-left: 44px; } + } - .str-truncated { - max-width: 70%; - } + &:not(:last-child) { + border-bottom: 1px solid #eee; + } - .commit-row-message { - color: $gl-dark-link-color; + a, + button { + color: $gl-dark-link-color; + vertical-align: baseline; + } - &:hover { - text-decoration: underline; - } - } - .text-expander { - background: #eee; - color: #555; - padding: 0 5px; - cursor: pointer; - margin-left: 4px; - &:hover { - background-color: #ddd; - } - } + .avatar { + position: absolute; + top: 10px; + left: 16px; } .item-title { display: inline-block; - max-width: 70%; + + @media (min-width: $screen-sm-min) { + max-width: 70%; + } } .commit-row-description { font-size: 14px; border-left: 1px solid #eee; padding: 10px 15px; - margin: 5px 0 10px 5px; + margin: 10px 0; background: #f9f9f9; display: none; @@ -93,6 +128,7 @@ li.commit { background: inherit; padding: 0; margin: 0; + white-space: pre-wrap; } a { @@ -102,7 +138,7 @@ li.commit { .commit-row-info { color: $gl-gray; - line-height: 24px; + line-height: 1; a { color: $gl-gray; @@ -111,10 +147,6 @@ li.commit { .avatar { margin-right: 8px; } - - .committed_ago { - display: inline-block; - } } &.inline-commit { diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 1a7d5f9666..5286b73cc5 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -4,6 +4,11 @@ margin-bottom: $gl-padding; border-radius: 3px; + .commit-short-id { + font-family: $regular_font; + font-weight: 400; + } + .diff-header { position: relative; background: $background-color; diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index 22679c764d..1aa4e06d97 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -60,14 +60,14 @@ .encoding-selector, .license-selector, - .gitignore-selector { + .gitignore-selector, + .gitlab-ci-yml-selector { display: inline-block; vertical-align: top; font-family: $regular_font; } - .gitignore-selector { - + .gitignore-selector, .license-selector, .gitlab-ci-yml-selector { .dropdown { line-height: 21px; } @@ -77,4 +77,10 @@ width: 220px; } } + + .gitlab-ci-yml-selector { + .dropdown-menu-toggle { + width: 250px; + } + } } diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index 6fe57c737b..6c36f603da 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -136,9 +136,10 @@ .event-last-push { overflow: auto; width: 100%; + .event-last-push-text { @include str-truncated(100%); - padding: 5px 0; + padding: 4px 0; font-size: 13px; float: left; margin-right: -150px; diff --git a/app/assets/stylesheets/pages/help.scss b/app/assets/stylesheets/pages/help.scss index 4a95b7b852..0b710ef168 100644 --- a/app/assets/stylesheets/pages/help.scss +++ b/app/assets/stylesheets/pages/help.scss @@ -57,4 +57,11 @@ .documentation { padding: 7px; + + // Border around images in the help pages. + img:not(.emoji) { + border: 1px solid $table-border-gray; + padding: 5px; + margin: 5px; + } } diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index f57845ad9c..21ff6ab71f 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -4,6 +4,13 @@ margin-right: 1px; } } + + // Border around images in issue and MR descriptions. + .description img:not(.emoji) { + border: 1px solid $table-border-gray; + padding: 5px; + margin: 5px; + } } .issuable-filter-count { @@ -145,7 +152,6 @@ .assign-yourself { margin-top: 10px; - font-weight: normal; display: block; } } @@ -158,6 +164,10 @@ font-weight: normal; } + .no-value { + color: $gl-placeholder-color; + } + .sidebar-collapsed-icon { display: none; } @@ -248,11 +258,16 @@ padding-bottom: 0; margin-bottom: 10px; } + + .issuable-header-btn { + display: none; + } } .issuable-header-btn { background: $gray-normal; border: 1px solid $border-gray-normal; + &:hover { background: $gray-dark; border: 1px solid $border-gray-dark; @@ -322,7 +337,7 @@ margin-left: 5px; a { - color: #8c8c8c; + color: $gl-placeholder-color; } } diff --git a/app/assets/stylesheets/pages/labels.scss b/app/assets/stylesheets/pages/labels.scss index bc65404a74..f5f67e2cd8 100644 --- a/app/assets/stylesheets/pages/labels.scss +++ b/app/assets/stylesheets/pages/labels.scss @@ -50,11 +50,10 @@ .label-row { .label-name { - display: block; + display: inline-block; margin-bottom: 10px; @media (min-width: $screen-sm-min) { - display: inline-block; width: 200px; margin-bottom: 0; } @@ -63,6 +62,7 @@ .label-description { display: block; margin-bottom: 10px; + margin-left: 50px; @media (min-width: $screen-sm-min) { display: inline-block; @@ -115,6 +115,13 @@ } } +.draggable-handler { + display: inline-block; + opacity: 0; + transition: opacity .3s; + color: $gray-darkest; +} + .prioritized-labels { margin-bottom: 30px; @@ -122,6 +129,13 @@ display: none; color: $gray-light; } + + li:hover { + .draggable-handler { + display: inline-block; + opacity: 1; + } + } } .other-labels { diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 53bff508c7..aca82f7f7b 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -119,7 +119,12 @@ margin-bottom: 0; } - @media (max-width: $screen-sm-max) { + .btn-grouped { + margin-left: 0; + margin-right: 7px; + } + + @media (max-width: $screen-xs-max) { h4 { font-size: 15px; } @@ -131,10 +136,14 @@ .btn, .btn-group, .accept-action { - width: 100%; margin-bottom: 4px; } + .accept-action { + width: 100%; + text-align: center; + } + .accept-control { width: 100%; text-align: center; @@ -244,6 +253,10 @@ .panel-footer { padding: 5px 10px; + + .btn { + min-width: auto; + } } .commit { @@ -252,9 +265,7 @@ } .avatar { - width: 20px; - height: 20px; - margin-right: 5px; + margin-left: 0; } .commit-row-info { @@ -282,7 +293,7 @@ margin-bottom: 0; } - @media (min-width: $screen-sm-min) { + @media (min-width: $screen-xs-min) { float: left; width: 50%; margin-bottom: 0; diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 577dddae74..de5ccbe2b6 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -219,3 +219,16 @@ float: left; } } + +.note-form-actions { + @media (max-width: $screen-xs-max) { + .btn { + float: none; + width: 100%; + + &:not(:last-child) { + margin-bottom: 10px; + } + } + } +} diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 0c08411875..ffba3dc5bc 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -84,24 +84,14 @@ ul.notes { word-wrap: break-word; @include md-typography; + // Reset ul style types since we're nested inside a ul already + @include bulleted-list; + // On diffs code should wrap nicely and not overflow code { white-space: pre-wrap; } - // Reset ul style types since we're nested inside a ul already - & > ul { - list-style-type: disc; - - ul { - list-style-type: circle; - - ul { - list-style-type: square; - } - } - } - ul.task-list { ul:not(.task-list) { padding-left: 1.3em; @@ -117,6 +107,13 @@ ul.notes { code { word-break: keep-all; } + + // Border around images in issue and MR comments. + img:not(.emoji) { + border: 1px solid $table-border-gray; + padding: 5px; + margin: 5px 0; + } } } @@ -139,6 +136,12 @@ ul.notes { @media (min-width: $screen-sm-min) { padding-right: 0; } + + @media (max-width: $screen-xs-min) { + .inline { + display: block; + } + } } .note-emoji-button { @@ -258,7 +261,11 @@ ul.notes { position: absolute; right: 0; top: 0; - + + .note-action-button { + margin-left: 10px; + } + @media (min-width: $screen-sm-min) { position: relative; } diff --git a/app/assets/stylesheets/pages/profile.scss b/app/assets/stylesheets/pages/profile.scss index 167ab40d88..46371ec687 100644 --- a/app/assets/stylesheets/pages/profile.scss +++ b/app/assets/stylesheets/pages/profile.scss @@ -192,6 +192,25 @@ } } +.personal-access-tokens-never-expires-label { + color: $personal-access-tokens-disabled-label-color; +} + +.datepicker.personal-access-tokens-expires-at .ui-state-disabled span { + text-align: center; +} + +.created-personal-access-token-container { + #created-personal-access-token { + width: 90%; + display: inline; + } + + .btn-clipboard { + margin-left: 5px; + } +} + .user-profile { @media (max-width: $screen-xs-max) { .cover-block { diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 0e4cefc55c..d3e59d7fdb 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -5,10 +5,12 @@ font-weight: normal; } } + .no-ssh-key-message, .project-limit-message { background-color: #f28d35; margin-bottom: 0; } + .new_project, .edit-project { fieldset.features { @@ -18,13 +20,6 @@ } } -.project-name-holder { - .help-inline { - vertical-align: top; - padding: 7px; - } -} - .project-home-panel { background: $white-light; text-align: left; @@ -33,7 +28,7 @@ .container-fluid { position: relative; - @media (min-width: $screen-md-max) { + @media (min-width: $screen-lg-min) { .row { display: flex; -ms-flex-align: center; @@ -106,7 +101,8 @@ .notifications-btn { - .fa-bell { + .fa-bell, + .fa-spinner { margin-right: 6px; } @@ -133,11 +129,6 @@ } } - .btn-group:not(:first-child):not(:last-child) > .btn { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; - } - form { margin-left: 10px; } @@ -229,7 +220,7 @@ right: 16px; bottom: 0; - @media (max-width: $screen-lg-min) { + @media (max-width: $screen-md-max) { top: 0; } @@ -238,7 +229,7 @@ right: 0; bottom: 61px; - @media (max-width: $screen-lg-min) { + @media (max-width: $screen-md-max) { position: relative; bottom: 0; margin-right: 10px; @@ -376,13 +367,14 @@ a.deploy-project-label { .project-import .btn { float: left; + margin-bottom: 10px; margin-right: 10px; } .project-stats { margin-top: $gl-padding; margin-bottom: 0; - padding: 16px 0; + padding: 0; background-color: $white-light; font-size: 0; @@ -391,13 +383,14 @@ a.deploy-project-label { } .nav li { - display: inline; + display: inline-block; + margin: 16px 0; + margin-right: 16px; } .nav > li > a { background-color: transparent; - margin-right: 12px; - padding: 0 10px; + padding: 5px 10px; font-size: 15px; color: $notes-light-color; } @@ -411,12 +404,17 @@ a.deploy-project-label { font-size: 17px; } - li.missing a { - color: #5a6069; - border: 1px dashed #dce0e5; + li.missing { + border: 1px dashed $border-gray-light; + border-radius: $border-radius-default; + + a { + color: $notes-light-color; + display: block; + } &:hover { - background-color: #f0f2f5; + background-color: $gray-normal; } } @@ -503,7 +501,8 @@ pre.light-well { .activity-filter-block { .controls { - padding-bottom: 10px; + padding-bottom: 7px; + margin-top: 8px; border-bottom: 1px solid $border-color; } } @@ -607,3 +606,26 @@ pre.light-well { } } } + +.custom-notifications-form { + .is-loading { + .custom-notification-event-loading { + display: inline-block; + } + } +} + +.custom-notification-event-loading { + display: none; + margin-left: 5px; + + &.is-done { + color: $gl-text-green; + } +} + +.project-refs-form { + .dropdown-menu { + width: 300px; + } +} diff --git a/app/assets/stylesheets/pages/stat_graph.scss b/app/assets/stylesheets/pages/stat_graph.scss index 85a0304196..dd62dd4672 100644 --- a/app/assets/stylesheets/pages/stat_graph.scss +++ b/app/assets/stylesheets/pages/stat_graph.scss @@ -14,18 +14,28 @@ font-size: 10px; } +#contributors-master { + @include make-md-column(12); + + svg { + width: 100%; + } +} + #contributors { .contributors-list { margin: 0 0 10px; list-style: none; padding: 0; + float: left; + + svg { + width: 100%; + } } .person { - &:nth-child(even) { - float: right; - } - float: left; + @include make-md-column(6); margin-top: 10px; } diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index f16fc7f388..99c9e81ddb 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -101,7 +101,7 @@ margin: 0; .commit { - padding: 0; + padding: 0 0 0 55px; .commit-row-title { .commit-row-message { @@ -129,4 +129,6 @@ .tree-controls { float: right; margin-top: 11px; + position: relative; + z-index: 2; } diff --git a/app/controllers/admin/runner_projects_controller.rb b/app/controllers/admin/runner_projects_controller.rb index d25619d94e..bf20c5305a 100644 --- a/app/controllers/admin/runner_projects_controller.rb +++ b/app/controllers/admin/runner_projects_controller.rb @@ -1,15 +1,14 @@ class Admin::RunnerProjectsController < Admin::ApplicationController before_action :project, only: [:create] - def index - @runner_projects = project.runner_projects.all - @runner_project = project.runner_projects.new - end - def create @runner = Ci::Runner.find(params[:runner_project][:runner_id]) - if @runner.assign_to(@project, current_user) + return head(403) if @runner.is_shared? || @runner.locked? + + runner_project = @runner.assign_to(@project, current_user) + + if runner_project.persisted? redirect_to admin_runner_path(@runner) else redirect_to admin_runner_path(@runner), alert: 'Failed adding runner to project' diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cd6ae507cf..dd1bc6f5d5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -8,7 +8,7 @@ class ApplicationController < ActionController::Base include PageLayoutHelper include WorkhorseHelper - before_action :authenticate_user_from_token! + before_action :authenticate_user_from_private_token! before_action :authenticate_user! before_action :validate_user_service_ticket! before_action :reject_blocked! @@ -24,7 +24,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :abilities, :can?, :current_application_settings - helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled? + helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled?, :gitlab_project_import_enabled? rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) @@ -64,17 +64,10 @@ class ApplicationController < ActionController::Base end end - # 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 - elsif request.headers['PRIVATE-TOKEN'].present? - request.headers['PRIVATE-TOKEN'] - end - user = user_token && User.find_by_authentication_token(user_token.to_s) + # This filter handles both private tokens and personal access tokens + def authenticate_user_from_private_token! + token_string = params[:private_token].presence || request.headers['PRIVATE-TOKEN'].presence + user = User.find_by_authentication_token(token_string) || User.find_by_personal_access_token(token_string) if user # Notice we are passing store false, so the user is not @@ -326,6 +319,10 @@ class ApplicationController < ActionController::Base current_application_settings.import_sources.include?('git') end + def gitlab_project_import_enabled? + current_application_settings.import_sources.include?('gitlab_project') + end + def two_factor_authentication_required? current_application_settings.require_two_factor_authentication end diff --git a/app/controllers/dashboard/todos_controller.rb b/app/controllers/dashboard/todos_controller.rb index f9a1929c11..3a2db3e6ee 100644 --- a/app/controllers/dashboard/todos_controller.rb +++ b/app/controllers/dashboard/todos_controller.rb @@ -1,44 +1,39 @@ class Dashboard::TodosController < Dashboard::ApplicationController - before_action :find_todos, only: [:index, :destroy, :destroy_all] + include TodosHelper + + before_action :find_todos, only: [:index, :destroy_all] def index @todos = @todos.page(params[:page]) end def destroy - todo.done - - todo_notice = 'Todo was successfully marked as done.' + TodoService.new.mark_todos_as_done([todo], current_user) respond_to do |format| - format.html { redirect_to dashboard_todos_path, notice: todo_notice } + format.html { redirect_to dashboard_todos_path, notice: 'Todo was successfully marked as done.' } format.js { head :ok } - format.json do - render json: { count: @todos.size, done_count: current_user.todos.done.count } - end + format.json { render json: { count: todos_pending_count, done_count: todos_done_count } } end end def destroy_all - @todos.each(&:done) + TodoService.new.mark_todos_as_done(@todos, current_user) respond_to do |format| format.html { redirect_to dashboard_todos_path, notice: 'All todos were marked as done.' } format.js { head :ok } - format.json do - find_todos - render json: { count: @todos.size, done_count: current_user.todos.done.count } - end + format.json { render json: { count: todos_pending_count, done_count: todos_done_count } } end end private def todo - @todo ||= current_user.todos.find(params[:id]) + @todo ||= find_todos.find(params[:id]) end def find_todos - @todos = TodosFinder.new(current_user, params).execute + @todos ||= TodosFinder.new(current_user, params).execute end end diff --git a/app/controllers/groups/notification_settings_controller.rb b/app/controllers/groups/notification_settings_controller.rb deleted file mode 100644 index de13b16ccf..0000000000 --- a/app/controllers/groups/notification_settings_controller.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Groups::NotificationSettingsController < Groups::ApplicationController - before_action :authenticate_user! - - def update - notification_setting = current_user.notification_settings_for(group) - saved = notification_setting.update_attributes(notification_setting_params) - - render json: { saved: saved } - end - - private - - def notification_setting_params - params.require(:notification_setting).permit(:level) - end -end diff --git a/app/controllers/import/gitlab_projects_controller.rb b/app/controllers/import/gitlab_projects_controller.rb new file mode 100644 index 0000000000..f99aa490d3 --- /dev/null +++ b/app/controllers/import/gitlab_projects_controller.rb @@ -0,0 +1,48 @@ +class Import::GitlabProjectsController < Import::BaseController + before_action :verify_gitlab_project_import_enabled + + def new + @namespace_id = project_params[:namespace_id] + @namespace_name = Namespace.find(project_params[:namespace_id]).name + @path = project_params[:path] + end + + def create + unless file_is_valid? + return redirect_back_or_default(options: { alert: "You need to upload a GitLab project export archive." }) + end + + @project = Gitlab::ImportExport::ProjectCreator.new(project_params[:namespace_id], + current_user, + File.expand_path(project_params[:file].path), + project_params[:path]).execute + + if @project.saved? + redirect_to( + project_path(@project), + notice: "Project '#{@project.name}' is being imported." + ) + else + redirect_to( + new_import_gitlab_project_path, + alert: "Project could not be imported: #{@project.errors.full_messages.join(', ')}" + ) + end + end + + private + + def file_is_valid? + project_params[:file] && project_params[:file].respond_to?(:read) + end + + def verify_gitlab_project_import_enabled + render_404 unless gitlab_project_import_enabled? + end + + def project_params + params.permit( + :path, :namespace_id, :file + ) + end +end diff --git a/app/controllers/notification_settings_controller.rb b/app/controllers/notification_settings_controller.rb new file mode 100644 index 0000000000..eddd03cc22 --- /dev/null +++ b/app/controllers/notification_settings_controller.rb @@ -0,0 +1,36 @@ +class NotificationSettingsController < ApplicationController + before_action :authenticate_user! + + def create + project = Project.find(params[:project][:id]) + + return render_404 unless can?(current_user, :read_project, project) + + @notification_setting = current_user.notification_settings_for(project) + @saved = @notification_setting.update_attributes(notification_setting_params) + + render_response + end + + def update + @notification_setting = current_user.notification_settings.find(params[:id]) + @saved = @notification_setting.update_attributes(notification_setting_params) + + render_response + end + + private + + def render_response + render json: { + html: view_to_html_string("shared/notifications/_button", notification_setting: @notification_setting), + saved: @saved + } + end + + def notification_setting_params + allowed_fields = NotificationSetting::EMAIL_EVENTS.dup + allowed_fields << :level + params.require(:notification_setting).permit(allowed_fields) + end +end diff --git a/app/controllers/profiles/accounts_controller.rb b/app/controllers/profiles/accounts_controller.rb index 175afbf842..69959fe368 100644 --- a/app/controllers/profiles/accounts_controller.rb +++ b/app/controllers/profiles/accounts_controller.rb @@ -5,7 +5,7 @@ class Profiles::AccountsController < Profiles::ApplicationController def unlink provider = params[:provider] - current_user.identities.find_by(provider: provider).destroy + current_user.identities.find_by(provider: provider).destroy unless provider.to_s == 'saml' redirect_to profile_account_path end end diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb index 40d1906a53..b8b71d295f 100644 --- a/app/controllers/profiles/notifications_controller.rb +++ b/app/controllers/profiles/notifications_controller.rb @@ -1,13 +1,13 @@ class Profiles::NotificationsController < Profiles::ApplicationController def show @user = current_user - @group_notifications = current_user.notification_settings.for_groups - @project_notifications = current_user.notification_settings.for_projects + @group_notifications = current_user.notification_settings.for_groups.order(:id) + @project_notifications = current_user.notification_settings.for_projects.order(:id) @global_notification_setting = current_user.global_notification_setting end def update - if current_user.update_attributes(user_params) && update_notification_settings + if current_user.update_attributes(user_params) flash[:notice] = "Notification settings saved" else flash[:alert] = "Failed to save new settings" @@ -19,16 +19,4 @@ class Profiles::NotificationsController < Profiles::ApplicationController def user_params params.require(:user).permit(:notification_email) end - - def global_notification_setting_params - params.require(:global_notification_setting).permit(:level) - end - - private - - def update_notification_settings - return true unless global_notification_setting_params - - current_user.global_notification_setting.update_attributes(global_notification_setting_params) - end end diff --git a/app/controllers/profiles/personal_access_tokens_controller.rb b/app/controllers/profiles/personal_access_tokens_controller.rb new file mode 100644 index 0000000000..508b82a9a6 --- /dev/null +++ b/app/controllers/profiles/personal_access_tokens_controller.rb @@ -0,0 +1,42 @@ +class Profiles::PersonalAccessTokensController < Profiles::ApplicationController + before_action :load_personal_access_tokens, only: :index + + def index + @personal_access_token = current_user.personal_access_tokens.build + end + + def create + @personal_access_token = current_user.personal_access_tokens.generate(personal_access_token_params) + + if @personal_access_token.save + flash[:personal_access_token] = @personal_access_token.token + redirect_to profile_personal_access_tokens_path, notice: "Your new personal access token has been created." + else + load_personal_access_tokens + render :index + end + end + + def revoke + @personal_access_token = current_user.personal_access_tokens.find(params[:id]) + + if @personal_access_token.revoke! + flash[:notice] = "Revoked personal access token #{@personal_access_token.name}!" + else + flash[:alert] = "Could not revoke personal access token #{@personal_access_token.name}." + end + + redirect_to profile_personal_access_tokens_path + end + + private + + def personal_access_token_params + params.require(:personal_access_token).permit(:name, :expires_at) + end + + def load_personal_access_tokens + @active_personal_access_tokens = current_user.personal_access_tokens.active.order(:expires_at) + @inactive_personal_access_tokens = current_user.personal_access_tokens.inactive + end +end diff --git a/app/controllers/projects/application_controller.rb b/app/controllers/projects/application_controller.rb index 776ba92c9a..996909a28c 100644 --- a/app/controllers/projects/application_controller.rb +++ b/app/controllers/projects/application_controller.rb @@ -74,7 +74,7 @@ class Projects::ApplicationController < ApplicationController end def require_branch_head - unless @repository.branch_names.include?(@ref) + unless @repository.branch_exists?(@ref) redirect_to( namespace_project_tree_path(@project.namespace, @project, @ref), notice: "This action is not allowed unless you are on a branch" diff --git a/app/controllers/projects/notification_settings_controller.rb b/app/controllers/projects/notification_settings_controller.rb deleted file mode 100644 index 7d81cc03c7..0000000000 --- a/app/controllers/projects/notification_settings_controller.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Projects::NotificationSettingsController < Projects::ApplicationController - before_action :authenticate_user! - - def update - notification_setting = current_user.notification_settings_for(project) - saved = notification_setting.update_attributes(notification_setting_params) - - render json: { saved: saved } - end - - private - - def notification_setting_params - params.require(:notification_setting).permit(:level) - end -end diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 127bd1a431..487963fdcd 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -54,6 +54,6 @@ class Projects::PipelinesController < Projects::ApplicationController end def commit - @commit ||= @pipeline.commit_data + @commit ||= @pipeline.commit end end diff --git a/app/controllers/projects/runner_projects_controller.rb b/app/controllers/projects/runner_projects_controller.rb index bedeb4a295..dc1a18f8d4 100644 --- a/app/controllers/projects/runner_projects_controller.rb +++ b/app/controllers/projects/runner_projects_controller.rb @@ -6,11 +6,13 @@ class Projects::RunnerProjectsController < Projects::ApplicationController def create @runner = Ci::Runner.find(params[:runner_project][:runner_id]) + return head(403) if @runner.is_shared? || @runner.locked? return head(403) unless current_user.ci_authorized_runners.include?(@runner) path = runners_path(project) + runner_project = @runner.assign_to(project, current_user) - if @runner.assign_to(project, current_user) + if runner_project.persisted? redirect_to path else redirect_to path, alert: 'Failed adding runner to project' diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb index 0b4fa57250..53c36635ef 100644 --- a/app/controllers/projects/runners_controller.rb +++ b/app/controllers/projects/runners_controller.rb @@ -5,10 +5,9 @@ class Projects::RunnersController < Projects::ApplicationController layout 'project_settings' def index - @runners = project.runners.ordered - @specific_runners = current_user.ci_authorized_runners. - where.not(id: project.runners). - ordered.page(params[:page]).per(20) + @project_runners = project.runners.ordered + @assignable_runners = current_user.ci_authorized_runners. + assignable_for(project).ordered.page(params[:page]).per(20) @shared_runners = Ci::Runner.shared.active @shared_runners_count = @shared_runners.count(:all) end diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index 46b242aa5f..6dc495247c 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -6,8 +6,10 @@ class Projects::TagsController < Projects::ApplicationController before_action :authorize_admin_project!, only: [:destroy] def index - sorted = VersionSorter.rsort(@repository.tag_names) - @tags = Kaminari.paginate_array(sorted).page(params[:page]) + @sort = params[:sort] || 'name' + @tags = @repository.tags_sorted_by(@sort) + @tags = Kaminari.paginate_array(@tags).page(params[:page]) + @releases = project.releases.where(tag: @tags) end diff --git a/app/controllers/projects/todos_controller.rb b/app/controllers/projects/todos_controller.rb index a51bd5e2b4..23868d986e 100644 --- a/app/controllers/projects/todos_controller.rb +++ b/app/controllers/projects/todos_controller.rb @@ -1,18 +1,12 @@ class Projects::TodosController < Projects::ApplicationController + before_action :authenticate_user!, only: [:create] + def create - todos = TodoService.new.mark_todo(issuable, current_user) + todo = TodoService.new.mark_todo(issuable, current_user) render json: { - todo: todos, - count: current_user.todos.pending.count, - } - end - - def update - current_user.todos.find_by_id(params[:id]).update(state: :done) - - render json: { - count: current_user.todos.pending.count, + count: current_user.todos_pending_count, + delete_path: dashboard_todo_path(todo) } end @@ -22,7 +16,13 @@ class Projects::TodosController < Projects::ApplicationController @issuable ||= begin case params[:issuable_type] when "issue" - @project.issues.find(params[:issuable_id]) + issue = @project.issues.find(params[:issuable_id]) + + if can?(current_user, :read_issue, issue) + issue + else + render_404 + end when "merge_request" @project.merge_requests.find(params[:issuable_id]) end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a6479c42d9..2b1f50fd01 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,13 +1,13 @@ class ProjectsController < Projects::ApplicationController include ExtractsPath - before_action :authenticate_user!, except: [:show, :activity] + before_action :authenticate_user!, except: [:show, :activity, :refs] before_action :project, except: [:new, :create] before_action :repository, except: [:new, :create] before_action :assign_ref_vars, :tree, only: [:show], if: :repo_exists? # Authorize - before_action :authorize_admin_project!, only: [:edit, :update, :housekeeping] + before_action :authorize_admin_project!, only: [:edit, :update, :housekeeping, :download_export, :export, :remove_export, :generate_new_export] before_action :event_filter, only: [:show, :activity] layout :determine_layout @@ -143,6 +143,7 @@ class ProjectsController < Projects::ApplicationController issues: autocomplete.issues, milestones: autocomplete.milestones, mergerequests: autocomplete.merge_requests, + labels: autocomplete.labels, members: participants } @@ -185,6 +186,48 @@ class ProjectsController < Projects::ApplicationController ) end + def export + @project.add_export_job(current_user: current_user) + + redirect_to( + edit_project_path(@project), + notice: "Project export started. A download link will be sent by email." + ) + end + + def download_export + export_project_path = @project.export_project_path + + if export_project_path + send_file export_project_path, disposition: 'attachment' + else + redirect_to( + edit_project_path(@project), + alert: "Project export link has expired. Please generate a new export from your project settings." + ) + end + end + + def remove_export + if @project.remove_exports + flash[:notice] = "Project export has been deleted." + else + flash[:alert] = "Project export could not be deleted." + end + redirect_to(edit_project_path(@project)) + end + + def generate_new_export + if @project.remove_exports + export + else + redirect_to( + edit_project_path(@project), + alert: "Project export could not be deleted." + ) + end + end + def toggle_star current_user.toggle_star(@project) @project.reload @@ -208,6 +251,24 @@ class ProjectsController < Projects::ApplicationController } end + def refs + options = { + 'Branches' => @repository.branch_names, + } + + unless @repository.tag_count.zero? + options['Tags'] = VersionSorter.rsort(@repository.tag_names) + end + + # If reference is commit id - we should add it to branch/tag selectbox + ref = Addressable::URI.unescape(params[:ref]) + if ref && options.flatten(2).exclude?(ref) && ref =~ /\A[0-9a-zA-Z]{6,52}\z/ + options['Commits'] = [ref] + end + + render json: options.to_json + end + private def determine_layout @@ -242,8 +303,14 @@ class ProjectsController < Projects::ApplicationController project.repository_exists? && !project.empty_repo? end - # Override get_id from ExtractsPath, which returns the branch and file path + # Override extract_ref from ExtractsPath, which returns the branch and file path # for the blob/tree, which in this case is just the root of the default branch. + # This way we avoid to access the repository.ref_names. + def extract_ref(_id) + [get_id, ''] + end + + # Override get_id from ExtractsPath in this case is just the root of the default branch. def get_id project.repository.root_ref end diff --git a/app/finders/todos_finder.rb b/app/finders/todos_finder.rb index aa47c6c157..58a00f88af 100644 --- a/app/finders/todos_finder.rb +++ b/app/finders/todos_finder.rb @@ -123,7 +123,7 @@ class TodosFinder end def by_state(items) - case params[:state] + case params[:state].to_s when 'done' items.done else diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 439b015b3b..4185984183 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -101,22 +101,6 @@ module ApplicationHelper '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 - # Define whenever show last push event # with suggestion to create MR def show_last_push_widget?(event) @@ -132,7 +116,7 @@ module ApplicationHelper 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) + return false unless project.repository.branch_exists?(event.branch_name) true end diff --git a/app/helpers/blob_helper.rb b/app/helpers/blob_helper.rb index 85559fbc5f..16d9d7d2d5 100644 --- a/app/helpers/blob_helper.rb +++ b/app/helpers/blob_helper.rb @@ -180,18 +180,22 @@ module BlobHelper licenses = Licensee::License.all @licenses_for_select = { - Popular: licenses.select(&:featured).map { |license| [license.name, license.key] }, - Other: licenses.reject(&:featured).map { |license| [license.name, license.key] } + Popular: licenses.select(&:featured).map { |license| { name: license.name, id: license.key } }, + Other: licenses.reject(&:featured).map { |license| { name: license.name, id: license.key } } } end def gitignore_names - return @gitignore_names if defined?(@gitignore_names) + @gitignore_names ||= + Gitlab::Template::Gitignore.categories.keys.map do |k| + [k, Gitlab::Template::Gitignore.by_category(k).map { |t| { name: t.name } }] + end.to_h + end - @gitignore_names = { - Global: Gitlab::Gitignore.global.map { |gitignore| { name: gitignore.name } }, - # Note that the key here doesn't cover it really - Languages: Gitlab::Gitignore.languages_frameworks.map{ |gitignore| { name: gitignore.name } } - } + def gitlab_ci_ymls + @gitlab_ci_ymls ||= + Gitlab::Template::GitlabCiYml.categories.keys.map do |k| + [k, Gitlab::Template::GitlabCiYml.by_category(k).map { |t| { name: t.name } }] + end.to_h end end diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index 3ee3fc74f0..c533659b60 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -10,7 +10,7 @@ module BranchesHelper end def can_push_branch?(project, branch_name) - return false unless project.repository.branch_names.include?(branch_name) + return false unless project.repository.branch_exists?(branch_name) ::Gitlab::GitAccess.new(current_user, project).can_push_to_branch?(branch_name) end diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb index f742922d92..9051a493b9 100644 --- a/app/helpers/button_helper.rb +++ b/app/helpers/button_helper.rb @@ -17,7 +17,25 @@ module ButtonHelper def clipboard_button(data = {}) content_tag :button, icon('clipboard'), - class: 'btn btn-clipboard', + class: "btn btn-clipboard", + data: data, + type: :button + end + + # Output a "Copy to Clipboard" button with a custom CSS class + # + # data - Data attributes passed to `content_tag` + # css_class - Class passed to the `content_tag` + # + # Examples: + # + # # Define the target element + # clipboard_button_with_class({clipboard_target: "div#foo"}, css_class: "btn-clipboard") + # # => "" + def clipboard_button_with_class(data = {}, css_class: 'btn-clipboard') + content_tag :button, + icon('clipboard'), + class: "btn #{css_class}", data: data, type: :button end diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb index 07e5c14684..8e4ae1e6ae 100644 --- a/app/helpers/ci_status_helper.rb +++ b/app/helpers/ci_status_helper.rb @@ -38,10 +38,10 @@ module CiStatusHelper icon(icon_name + ' fw') end - def render_commit_status(commit, tooltip_placement: 'auto left') + def render_commit_status(commit, tooltip_placement: 'auto left', cssclass: '') project = commit.project path = builds_namespace_project_commit_path(project.namespace, project, commit) - render_status_with_link('commit', commit.status, path, tooltip_placement) + render_status_with_link('commit', commit.status, path, tooltip_placement, cssclass: cssclass) end def render_pipeline_status(pipeline, tooltip_placement: 'auto left') @@ -57,10 +57,10 @@ module CiStatusHelper private - def render_status_with_link(type, status, path, tooltip_placement) + def render_status_with_link(type, status, path, tooltip_placement, cssclass: '') link_to ci_icon_for_status(status), path, - class: "ci-status-link ci-status-icon-#{status.dasherize}", + class: "ci-status-link ci-status-icon-#{status.dasherize} #{cssclass}", title: "#{type.titleize}: #{ci_label_for_status(status)}", data: { toggle: 'tooltip', placement: tooltip_placement } end diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 493505e0c9..474041eccb 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -16,6 +16,16 @@ module CommitsHelper commit_person_link(commit, options.merge(source: :committer)) end + def commit_author_avatar(commit, options = {}) + options = options.merge(source: :author) + user = commit.send(options[:source]) + + source_email = clean(commit.send "#{options[:source]}_email".to_sym) + person_email = user.try(:email) || source_email + + image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]} hidden-xs", width: options[:size], alt: "") + end + def image_diff_class(diff) if diff.deleted_file "deleted" @@ -102,24 +112,24 @@ module CommitsHelper if current_controller?(:projects, :commits) if @repo.blob_at(commit.id, @path) return link_to( - "Browse File »", + "Browse File", namespace_project_blob_path(project.namespace, project, tree_join(commit.id, @path)), - class: "pull-right" + class: "btn btn-default" ) elsif @path.present? return link_to( - "Browse Directory »", + "Browse Directory", namespace_project_tree_path(project.namespace, project, tree_join(commit.id, @path)), - class: "pull-right" + class: "btn btn-default" ) end end link_to( "Browse Files", namespace_project_tree_path(project.namespace, project, commit), - class: "pull-right" + class: "btn btn-default" ) end @@ -187,12 +197,10 @@ module CommitsHelper 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}} + %Q{#{person_name}} else person_name end diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index cbe4717683..e22dce59d0 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -135,6 +135,11 @@ module DiffHelper toggle_whitespace_link(url, options) end + def diff_compare_whitespace_link(project, from, to, options) + url = namespace_project_compare_path(project.namespace, project, from, to, params_with_whitespace) + toggle_whitespace_link(url, options) + end + private def hide_whitespace? diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 067a00660a..09a429a903 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -50,8 +50,6 @@ module GitlabMarkdownHelper context[:project] ||= @project - text = Banzai.pre_process(text, context) - html = Banzai.render(text, context) context.merge!( diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 8dbc51a689..8231ce49fa 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -67,9 +67,9 @@ module IssuablesHelper end end - def has_todo(issuable) - unless current_user.nil? - current_user.todos.find_by(target_id: issuable.id, state: :pending) + def issuable_todo(issuable) + if current_user + current_user.todos.find_by(target: issuable, state: :pending) end end diff --git a/app/helpers/members_helper.rb b/app/helpers/members_helper.rb index a53828ef4e..ec106418f2 100644 --- a/app/helpers/members_helper.rb +++ b/app/helpers/members_helper.rb @@ -6,10 +6,10 @@ module MembersHelper "#{action}_#{member.type.underscore}".to_sym end - def can_see_member_roles?(source:, user: nil) - return false unless user - - user.is_admin? || source.members.exists?(user_id: user.id) + def default_show_roles(member) + can?(current_user, action_member_permission(:update, member), member) || + can?(current_user, action_member_permission(:destroy, member), member) || + can?(current_user, action_member_permission(:admin, member), member.source) end def remove_member_message(member, user: nil) diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb index 469accf314..3ff8be5e28 100644 --- a/app/helpers/nav_helper.rb +++ b/app/helpers/nav_helper.rb @@ -12,10 +12,10 @@ module NavHelper end def page_sidebar_class - if nav_menu_collapsed? - "page-sidebar-collapsed" + if pinned_nav? + "page-sidebar-expanded page-sidebar-pinned" else - "page-sidebar-expanded" + "page-sidebar-collapsed" end end @@ -36,7 +36,15 @@ module NavHelper end def nav_header_class - class_name = " with-horizontal-nav" if defined?(nav) && nav + class_name = '' + class_name << " with-horizontal-nav" if defined?(nav) && nav + + if pinned_nav? + class_name << " header-expanded header-pinned-nav" + else + class_name << " header-collapsed" + end + class_name end @@ -47,4 +55,8 @@ module NavHelper def nav_control_class "nav-control" if current_user end + + def pinned_nav? + cookies[:pin_nav] == 'true' + end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 50c21fc0d4..77783cd764 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -34,7 +34,7 @@ module NotificationsHelper def notification_description(level) case level.to_sym when :participating - 'You will only receive notifications from related resources' + 'You will only receive notifications for threads you have participated in' when :mention 'You will receive notifications only for comments in which you were @mentioned' when :watch @@ -43,6 +43,8 @@ module NotificationsHelper 'You will not get any notifications via email' when :global 'Use your global notification setting' + when :custom + 'You will only receive notifications for the events you choose' end end @@ -62,22 +64,14 @@ module NotificationsHelper end end - def notification_level_radio_buttons - html = "" + # Identifier to trigger individually dropdowns and custom settings modals in the same view + def notifications_menu_identifier(type, notification_setting) + "#{type}-#{notification_setting.user_id}-#{notification_setting.source_id}-#{notification_setting.source_type}" + end - NotificationSetting.levels.each_key do |level| - level = level.to_sym - next if level == :global - - html << content_tag(:div, class: "radio") do - content_tag(:label, { value: level }) do - radio_button_tag(:"global_notification_setting[level]", level, @global_notification_setting.level.to_sym == level) + - content_tag(:div, level.to_s.capitalize, class: "level-title") + - content_tag(:p, notification_description(level)) - end - end - end - - html.html_safe + # Create hidden field to send notification setting source to controller + def hidden_setting_source_input(notification_setting) + return unless notification_setting.source_type + hidden_field_tag "#{notification_setting.source_type.downcase}[id]", notification_setting.source_id end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 3b4e431a49..d91e3332e4 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -41,7 +41,7 @@ module ProjectsHelper author_html = author_html.html_safe if opts[:name] - link_to(author_html, user_path(author), class: "author_link #{"#{opts[:mobile_classes]}" if opts[:mobile_classes]}").html_safe + link_to(author_html, user_path(author), class: "author_link #{"#{opts[:extra_class]}" if opts[:extra_class]} #{"#{opts[:mobile_classes]}" if opts[:mobile_classes]}").html_safe else title = opts[:title].sub(":name", sanitize(author.name)) link_to(author_html, user_path(author), class: "author_link has-tooltip", title: title, data: { container: 'body' } ).html_safe diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index 9adf5ef29f..a832a6c8df 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -1,10 +1,10 @@ module TodosHelper def todos_pending_count - current_user.todos.pending.count + TodosFinder.new(current_user, state: :pending).execute.count end def todos_done_count - current_user.todos.done.count + TodosFinder.new(current_user, state: :done).execute.count end def todo_action_name(todo) @@ -12,7 +12,7 @@ module TodosHelper when Todo::ASSIGNED then 'assigned you' when Todo::MENTIONED then 'mentioned you on' when Todo::BUILD_FAILED then 'The build failed for your' - when Todo::MARKED then 'marked this as a Todo for' + when Todo::MARKED then 'added a todo for' end end diff --git a/app/mailers/emails/members.rb b/app/mailers/emails/members.rb index 6dde2e9847..4531169029 100644 --- a/app/mailers/emails/members.rb +++ b/app/mailers/emails/members.rb @@ -12,6 +12,11 @@ module Emails @member_id = member_id admins = member_source.members.owners_and_masters.includes(:user).pluck(:notification_email) + # A project in a group can have no explicit owners/masters, in that case + # we fallbacks to the group's owners/masters. + if admins.empty? && member_source.respond_to?(:group) && member_source.group + admins = member_source.group.members.owners_and_masters.includes(:user).pluck(:notification_email) + end mail(to: admins, subject: subject("Request to join the #{member_source.human_name} #{member_source.model_name.singular}")) diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb index 689fb3e0ff..e0af708141 100644 --- a/app/mailers/emails/projects.rb +++ b/app/mailers/emails/projects.rb @@ -9,6 +9,19 @@ module Emails subject: subject("Project was moved")) end + def project_was_exported_email(current_user, project) + @project = project + mail(to: current_user.notification_email, + subject: subject("Project was exported")) + end + + def project_was_not_exported_email(current_user, project, errors) + @project = project + @errors = errors + mail(to: current_user.notification_email, + subject: subject("Project export error")) + end + def repository_push_email(project_id, opts = {}) @message = Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts) diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index a744f93791..d914b0b26e 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -123,7 +123,7 @@ class ApplicationSetting < ActiveRecord::Base default_project_visibility: Settings.gitlab.default_projects_features['visibility_level'], default_snippet_visibility: Settings.gitlab.default_projects_features['visibility_level'], restricted_signup_domains: Settings.gitlab['restricted_signup_domains'], - import_sources: ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'], + import_sources: %w[github bitbucket gitlab gitorious google_code fogbugz git gitlab_project], shared_runners_enabled: Settings.gitlab_ci['shared_runners_enabled'], max_artifacts_size: Settings.artifacts['max_size'], require_two_factor_authentication: false, diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 764d8e4e13..2b0bec3313 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -300,18 +300,12 @@ module Ci project.valid_runners_token? token end - def can_be_served?(runner) - return false unless has_tags? || runner.run_untagged? - - (tag_list - runner.tag_list).empty? - end - def has_tags? tag_list.any? end def any_runners_online? - project.any_runners? { |runner| runner.active? && runner.online? && can_be_served?(runner) } + project.any_runners? { |runner| runner.active? && runner.online? && runner.can_pick?(self) } end def stuck? @@ -341,6 +335,7 @@ module Ci def erase_artifacts! remove_artifacts_file! remove_artifacts_metadata! + save end def erase(opts = {}) diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 4bbfb4cc80..ca5a685dd1 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -37,22 +37,22 @@ module Ci end def git_author_name - commit_data.author_name if commit_data + commit.try(:author_name) end def git_author_email - commit_data.author_email if commit_data + commit.try(:author_email) end def git_commit_message - commit_data.message if commit_data + commit.try(:message) end def short_sha Ci::Pipeline.truncate_sha(sha) end - def commit_data + def commit @commit ||= project.commit(sha) rescue nil @@ -94,10 +94,13 @@ module Ci end def create_builds(user, trigger_request = nil) + ## + # We persist pipeline only if there are builds available + # return unless config_processor - config_processor.stages.any? do |stage| - CreateBuildsService.new(self).execute(stage, user, 'success', trigger_request).present? - end + + build_builds_for_stages(config_processor.stages, user, + 'success', trigger_request) && save end def create_next_builds(build) @@ -115,10 +118,10 @@ module Ci prior_builds = latest_builds.where.not(stage: next_stages) prior_status = prior_builds.status - # create builds for next stages based - next_stages.any? do |stage| - CreateBuildsService.new(self).execute(stage, build.user, prior_status, build.trigger_request).present? - end + # build builds for next stage that has builds available + # and save pipeline if we have builds + build_builds_for_stages(next_stages, build.user, prior_status, + build.trigger_request) && save end def retried @@ -139,10 +142,10 @@ module Ci @config_processor ||= begin Ci::GitlabCiYamlProcessor.new(ci_yaml_file, project.path_with_namespace) rescue Ci::GitlabCiYamlProcessor::ValidationError, Psych::SyntaxError => e - save_yaml_error(e.message) + self.yaml_errors = e.message nil rescue - save_yaml_error("Undefined error") + self.yaml_errors = 'Undefined error' nil end end @@ -167,8 +170,23 @@ module Ci builds.where.not(environment: nil).success.pluck(:environment).uniq end + def notes + Note.for_commit_id(sha) + end + private + def build_builds_for_stages(stages, user, status, trigger_request) + ## + # Note that `Array#any?` implements a short circuit evaluation, so we + # build builds only for the first stage that has builds available. + # + stages.any? do |stage| + CreateBuildsService.new(self) + .execute(stage, user, status, trigger_request).present? + end + end + def update_state statuses.reload self.status = if yaml_errors.blank? @@ -181,11 +199,5 @@ module Ci self.duration = statuses.latest.duration save end - - def save_yaml_error(error) - return if self.yaml_errors? - self.yaml_errors = error - update_state - end end end diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb index adb6529220..b64ec79ec2 100644 --- a/app/models/ci/runner.rb +++ b/app/models/ci/runner.rb @@ -4,7 +4,7 @@ module Ci LAST_CONTACT_TIME = 5.minutes.ago AVAILABLE_SCOPES = %w[specific shared active paused online] - FORM_EDITABLE = %i[description tag_list active run_untagged] + FORM_EDITABLE = %i[description tag_list active run_untagged locked] has_many :builds, class_name: 'Ci::Build' has_many :runner_projects, dependent: :destroy, class_name: 'Ci::RunnerProject' @@ -26,6 +26,13 @@ module Ci .where("ci_runner_projects.gl_project_id = :project_id OR ci_runners.is_shared = true", project_id: project_id) end + scope :assignable_for, ->(project) do + # FIXME: That `to_sql` is needed to workaround a weird Rails bug. + # Without that, placeholders would miss one and couldn't match. + where(locked: false). + where.not("id IN (#{project.runners.select(:id).to_sql})").specific + end + validate :tag_constraints acts_as_taggable @@ -56,7 +63,7 @@ module Ci def assign_to(project, current_user = nil) self.is_shared = false if shared? self.save - project.runner_projects.create!(runner_id: self.id) + project.runner_projects.create(runner_id: self.id) end def display_name @@ -91,6 +98,10 @@ module Ci !shared? end + def can_pick?(build) + assignable_for?(build.project) && accepting_tags?(build) + end + def only_for?(project) projects == [project] end @@ -111,5 +122,13 @@ module Ci 'can not be empty when runner is not allowed to pick untagged jobs') end end + + def assignable_for?(project) + !locked? || projects.exists?(id: project.id) + end + + def accepting_tags?(build) + (run_untagged? || build.has_tags?) && (build.tag_list - tag_list).empty? + end end end diff --git a/app/models/commit.rb b/app/models/commit.rb index d69d518fad..174ccbaea6 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -271,6 +271,32 @@ class Commit merged_merge_request ? 'merge request' : 'commit' end + # Get the URI type of the given path + # + # Used to build URLs to files in the repository in GFM. + # + # path - String path to check + # + # Examples: + # + # uri_type('doc/README.md') # => :blob + # uri_type('doc/logo.png') # => :raw + # uri_type('doc/api') # => :tree + # uri_type('not/found') # => :nil + # + # Returns a symbol + def uri_type(path) + entry = @raw.tree.path(path) + if entry[:type] == :blob + blob = Gitlab::Git::Blob.new(name: entry[:name]) + blob.image? ? :raw : :blob + else + entry[:type] + end + rescue Rugged::TreeError + nil + end + private def repo_changes diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index e53c483b90..e437e3417a 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -1,5 +1,6 @@ class CommitStatus < ActiveRecord::Base include Statuseable + include Importable self.table_name = 'ci_builds' @@ -7,7 +8,9 @@ class CommitStatus < ActiveRecord::Base belongs_to :pipeline, class_name: 'Ci::Pipeline', foreign_key: :commit_id, touch: true belongs_to :user - validates :pipeline, presence: true + delegate :commit, to: :pipeline + + validates :pipeline, presence: true, unless: :importing? validates_presence_of :name diff --git a/app/models/concerns/importable.rb b/app/models/concerns/importable.rb new file mode 100644 index 0000000000..019ef75584 --- /dev/null +++ b/app/models/concerns/importable.rb @@ -0,0 +1,6 @@ +module Importable + extend ActiveSupport::Concern + + attr_accessor :importing + alias_method :importing?, :importing +end diff --git a/app/models/concerns/participable.rb b/app/models/concerns/participable.rb index 9056722f45..9822844357 100644 --- a/app/models/concerns/participable.rb +++ b/app/models/concerns/participable.rb @@ -53,6 +53,16 @@ module Participable # # Returns an Array of User instances. def participants(current_user = nil) + @participants ||= Hash.new do |hash, user| + hash[user] = raw_participants(user) + end + + @participants[current_user] + end + + private + + def raw_participants(current_user = nil) current_user ||= author ext = Gitlab::ReferenceExtractor.new(project, current_user) participants = Set.new diff --git a/app/models/concerns/referable.rb b/app/models/concerns/referable.rb index ce064f675a..dee940a3f8 100644 --- a/app/models/concerns/referable.rb +++ b/app/models/concerns/referable.rb @@ -49,6 +49,10 @@ module Referable raise NotImplementedError, "#{self} does not implement #{__method__}" end + def reference_valid?(reference) + true + end + def link_reference_pattern(route, pattern) %r{ (? diff --git a/app/models/group.rb b/app/models/group.rb index b8dffe9f5b..e66e04371b 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -9,6 +9,12 @@ class Group < Namespace has_many :group_members, dependent: :destroy, as: :source, class_name: 'GroupMember' alias_method :members, :group_members has_many :users, -> { where(members: { requested_at: nil }) }, through: :group_members + + has_many :owners, + -> { where(members: { access_level: Gitlab::Access::OWNER }) }, + through: :group_members, + source: :user + has_many :project_group_links, dependent: :destroy has_many :shared_projects, through: :project_group_links, source: :project has_many :notification_settings, dependent: :destroy, as: :source @@ -88,10 +94,6 @@ class Group < Namespace end end - def owners - @owners ||= group_members.owners.includes(:user).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) diff --git a/app/models/issue.rb b/app/models/issue.rb index 1bdf9c011b..3c5859194b 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -83,6 +83,10 @@ class Issue < ActiveRecord::Base @link_reference_pattern ||= super("issues", /(?\d+)/) end + def self.reference_valid?(reference) + reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE + end + def self.sort(method, excluded_labels: []) case method.to_s when 'due_date_asc' then order_due_date_asc diff --git a/app/models/jira_issue.rb b/app/models/jira_issue.rb deleted file mode 100644 index 5b21aac5e4..0000000000 --- a/app/models/jira_issue.rb +++ /dev/null @@ -1,2 +0,0 @@ -class JiraIssue < ExternalIssue -end diff --git a/app/models/key.rb b/app/models/key.rb index 0532e84f47..b9bc38a043 100644 --- a/app/models/key.rb +++ b/app/models/key.rb @@ -9,7 +9,7 @@ class Key < ActiveRecord::Base 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 :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ } validates :key, format: { without: /\n|\r/, message: 'should be a single line' } validates :fingerprint, uniqueness: true, presence: { message: 'cannot be generated' } diff --git a/app/models/member.rb b/app/models/member.rb index cea6d25976..4ee3f1bb5c 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -1,5 +1,6 @@ class Member < ActiveRecord::Base include Sortable + include Importable include Gitlab::Access attr_accessor :raw_invite_token @@ -41,11 +42,11 @@ class Member < ActiveRecord::Base before_validation :generate_invite_token, on: :create, if: -> (member) { member.invite_email.present? } - after_create :send_invite, if: :invite? - after_create :send_request, if: :request? - after_create :create_notification_setting, unless: :pending? - after_create :post_create_hook, unless: :pending? - after_update :post_update_hook, unless: :pending? + after_create :send_invite, if: :invite?, unless: :importing? + after_create :send_request, if: :request?, unless: :importing? + after_create :create_notification_setting, unless: [:pending?, :importing?] + after_create :post_create_hook, unless: [:pending?, :importing?] + after_update :post_update_hook, unless: [:pending?, :importing?] after_destroy :post_destroy_hook, unless: :pending? after_destroy :post_decline_request, if: :request? diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 7b8858b24d..36bc98bdb1 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -4,6 +4,7 @@ class MergeRequest < ActiveRecord::Base include Referable include Sortable include Taskable + include Importable belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" @@ -13,7 +14,7 @@ class MergeRequest < ActiveRecord::Base serialize :merge_params, Hash - after_create :create_merge_request_diff + after_create :create_merge_request_diff, unless: :importing after_update :update_merge_request_diff delegate :commits, :diffs, :real_size, to: :merge_request_diff, prefix: nil @@ -95,12 +96,12 @@ class MergeRequest < ActiveRecord::Base end end - validates :source_project, presence: true, unless: :allow_broken + validates :source_project, presence: true, unless: [:allow_broken, :importing?] validates :source_branch, presence: true validates :target_project, presence: true validates :target_branch, presence: true validates :merge_user, presence: true, if: :merge_when_build_succeeds? - validate :validate_branches, unless: :allow_broken + validate :validate_branches, unless: [:allow_broken, :importing?] validate :validate_fork scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) } @@ -132,6 +133,10 @@ class MergeRequest < ActiveRecord::Base @link_reference_pattern ||= super("merge_requests", /(?\d+)/) end + def self.reference_valid?(reference) + reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE + end + # Returns all the merge requests from an ActiveRecord:Relation. # # This method uses a UNION as it usually operates on the result of diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 7d5103748f..aca377cc60 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -1,5 +1,6 @@ class MergeRequestDiff < ActiveRecord::Base include Sortable + include Importable # Prevent store of diff if commits amount more then 500 COMMITS_SAFE_SIZE = 100 @@ -22,7 +23,7 @@ class MergeRequestDiff < ActiveRecord::Base serialize :st_commits serialize :st_diffs - after_create :reload_content + after_create :reload_content, unless: :importing? def reload_content reload_commits diff --git a/app/models/note.rb b/app/models/note.rb index 4b6748053f..8d16464755 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -4,6 +4,7 @@ class Note < ActiveRecord::Base include Participable include Mentionable include Awardable + include Importable default_value_for :system, false @@ -28,11 +29,11 @@ class Note < ActiveRecord::Base validates :attachment, file_size: { maximum: :max_attachment_size } validates :noteable_type, presence: true - validates :noteable_id, presence: true, unless: :for_commit? + validates :noteable_id, presence: true, unless: [:for_commit?, :importing?] validates :commit_id, presence: true, if: :for_commit? validates :author, presence: true - validate unless: :for_commit? do |note| + validate unless: [:for_commit?, :importing?] do |note| unless note.noteable.try(:project) == note.project errors.add(:invalid_project, 'Note and noteable project mismatch') end diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb index 0ce87968e4..d41fc7073c 100644 --- a/app/models/notification_setting.rb +++ b/app/models/notification_setting.rb @@ -1,5 +1,5 @@ class NotificationSetting < ActiveRecord::Base - enum level: { global: 3, watch: 2, mention: 4, participating: 1, disabled: 0 } + enum level: { global: 3, watch: 2, mention: 4, participating: 1, disabled: 0, custom: 5 } default_value_for :level, NotificationSetting.levels[:global] @@ -15,6 +15,24 @@ class NotificationSetting < ActiveRecord::Base scope :for_groups, -> { where(source_type: 'Namespace') } scope :for_projects, -> { where(source_type: 'Project') } + EMAIL_EVENTS = [ + :new_note, + :new_issue, + :reopen_issue, + :close_issue, + :reassign_issue, + :new_merge_request, + :reopen_merge_request, + :close_merge_request, + :reassign_merge_request, + :merge_merge_request + ] + + store :events, accessors: EMAIL_EVENTS, coder: JSON + + before_create :set_events + before_save :events_to_boolean + def self.find_or_create_for(source) setting = find_or_initialize_by(source: source) @@ -24,4 +42,21 @@ class NotificationSetting < ActiveRecord::Base setting end + + # Set all event attributes to false when level is not custom or being initialized for UX reasons + def set_events + return if custom? + + EMAIL_EVENTS.each do |event| + events[event] = false + end + end + + # Validates store accessors values as boolean + # It is a text field so it does not cast correct boolean values in JSON + def events_to_boolean + EMAIL_EVENTS.each do |event| + events[event] = ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(events[event]) + end + end end diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb new file mode 100644 index 0000000000..c4b095e0c0 --- /dev/null +++ b/app/models/personal_access_token.rb @@ -0,0 +1,20 @@ +class PersonalAccessToken < ActiveRecord::Base + include TokenAuthenticatable + add_authentication_token_field :token + + belongs_to :user + + scope :active, -> { where(revoked: false).where("expires_at >= NOW() OR expires_at IS NULL") } + scope :inactive, -> { where("revoked = true OR expires_at < NOW()") } + + def self.generate(params) + personal_access_token = self.new(params) + personal_access_token.ensure_token + personal_access_token + end + + def revoke! + self.revoked = true + self.save + end +end diff --git a/app/models/project.rb b/app/models/project.rb index fdbc84474e..5495db579b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -262,7 +262,23 @@ class Project < ActiveRecord::Base # # Returns a Project, or nil if no project could be found. def find_with_namespace(path) - where_paths_in([path]).reorder(nil).take + namespace_path, project_path = path.split('/', 2) + + return unless namespace_path && project_path + + namespace_path = connection.quote(namespace_path) + project_path = connection.quote(project_path) + + # On MySQL we want to ensure the ORDER BY uses a case-sensitive match so + # any literal matches come first, for this we have to use "BINARY". + # Without this there's still no guarantee in what order MySQL will return + # rows. + binary = Gitlab::Database.mysql? ? 'BINARY' : '' + + order_sql = "(CASE WHEN #{binary} namespaces.path = #{namespace_path} " \ + "AND #{binary} projects.path = #{project_path} THEN 0 ELSE 1 END)" + + where_paths_in([path]).reorder(order_sql).take end # Builds a relation to find multiple projects by their full paths. @@ -351,6 +367,11 @@ class Project < ActiveRecord::Base joins(join_body).reorder('join_note_counts.amount DESC') end + + # Deletes gitlab project export files older than 24 hours + def remove_gitlab_exports! + Gitlab::Popen.popen(%W(find #{Gitlab::ImportExport.storage_path} -not -path #{Gitlab::ImportExport.storage_path} -mmin +1440 -delete)) + end end def team @@ -454,7 +475,7 @@ class Project < ActiveRecord::Base end def import? - external_import? || forked? + external_import? || forked? || gitlab_project_import? end def no_import? @@ -485,6 +506,10 @@ class Project < ActiveRecord::Base Gitlab::UrlSanitizer.new(import_url).masked_url end + def gitlab_project_import? + import_type == 'gitlab_project' + end + def check_limit unless creator.can_create_project? or namespace.kind == 'group' projects_limit = creator.projects_limit @@ -1080,4 +1105,27 @@ class Project < ActiveRecord::Base ensure @errors = original_errors end + + def add_export_job(current_user:) + job_id = ProjectExportWorker.perform_async(current_user.id, self.id) + + if job_id + Rails.logger.info "Export job started for project ID #{self.id} with job ID #{job_id}" + else + Rails.logger.error "Export job failed to start for project ID #{self.id}" + end + end + + def export_path + File.join(Gitlab::ImportExport.storage_path, path_with_namespace) + end + + def export_project_path + Dir.glob("#{export_path}/*export.tar.gz").max_by { |f| File.ctime(f) } + end + + def remove_exports + _, status = Gitlab::Popen.popen(%W(find #{export_path} -not -path #{export_path} -delete)) + status.zero? + end end diff --git a/app/models/repository.rb b/app/models/repository.rb index e5b277cb19..221c87164c 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -191,8 +191,12 @@ class Repository end end + def ref_names + branch_names + tag_names + end + def branch_names - cache.fetch(:branch_names) { branches.map(&:name) } + @branch_names ||= cache.fetch(:branch_names) { branches.map(&:name) } end def branch_exists?(branch_name) @@ -243,7 +247,7 @@ class Repository end def cache_keys - %i(size branch_names tag_names commit_count + %i(size branch_names tag_names branch_count tag_count commit_count readme version contribution_guide changelog license_blob license_key gitignore) end @@ -267,6 +271,7 @@ class Repository def expire_branches_cache cache.expire(:branch_names) + @branch_names = nil @local_branches = nil end @@ -332,10 +337,6 @@ class Repository @lookup_cache ||= {} end - def expire_branch_names - cache.expire(:branch_names) - end - def expire_avatar_cache(branch_name = nil, revision = nil) # Avatars are pulled from the default branch, thus if somebody pushes to a # different branch there's no need to expire anything. @@ -598,6 +599,21 @@ class Repository end end + def tags_sorted_by(value) + case value + when 'name' + # Would be better to use `sort_by` but `version_sorter` only exposes + # `sort` and `rsort` + VersionSorter.rsort(tag_names).map { |tag_name| find_tag(tag_name) } + when 'updated_desc' + tags_sorted_by_committed_date.reverse + when 'updated_asc' + tags_sorted_by_committed_date + else + tags + end + end + def contributors commits = self.commits(nil, limit: 2000, offset: 0, skip_merges: true) @@ -995,4 +1011,8 @@ class Repository def file_on_head(regex) tree(:head).blobs.find { |file| file.name =~ regex } end + + def tags_sorted_by_committed_date + tags.sort_by { |tag| commit(tag.target).committed_date } + end end diff --git a/app/models/user.rb b/app/models/user.rb index 8d0427da5a..876ccc69d8 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,6 +51,7 @@ class User < ActiveRecord::Base # Profile has_many :keys, dependent: :destroy has_many :emails, dependent: :destroy + has_many :personal_access_tokens, dependent: :destroy has_many :identities, dependent: :destroy, autosave: true has_many :u2f_registrations, dependent: :destroy @@ -267,6 +268,11 @@ class User < ActiveRecord::Base find_by!('lower(username) = ?', username.downcase) end + def find_by_personal_access_token(token_string) + personal_access_token = PersonalAccessToken.active.find_by_token(token_string) if token_string + personal_access_token.user if personal_access_token + end + def by_username_or_id(name_or_id) find_by('users.username = ? OR users.id = ?', name_or_id.to_s, name_or_id.to_i) end @@ -481,9 +487,8 @@ class User < ActiveRecord::Base events.recent.find do |event| project = Project.find_by_id(event.project_id) next unless project - repo = project.repository - if repo.branch_names.include?(event.branch_name) + if project.repository.branch_exists?(event.branch_name) merge_requests = MergeRequest.where("created_at >= ?", event.created_at). where(source_project_id: project.id, source_branch: event.branch_name) @@ -821,6 +826,23 @@ class User < ActiveRecord::Base assigned_open_issues_count(force: true) end + def todos_done_count(force: false) + Rails.cache.fetch(['users', id, 'todos_done_count'], force: force) do + todos.done.count + end + end + + def todos_pending_count(force: false) + Rails.cache.fetch(['users', id, 'todos_pending_count'], force: force) do + todos.pending.count + end + end + + def update_todos_count_cache + todos_done_count(force: true) + todos_pending_count(force: true) + end + private def projects_union(min_access_level = nil) diff --git a/app/services/ci/create_builds_service.rb b/app/services/ci/create_builds_service.rb index 3a74ae094e..2dcb052d27 100644 --- a/app/services/ci/create_builds_service.rb +++ b/app/services/ci/create_builds_service.rb @@ -2,10 +2,11 @@ module Ci class CreateBuildsService def initialize(pipeline) @pipeline = pipeline + @config = pipeline.config_processor end def execute(stage, user, status, trigger_request = nil) - builds_attrs = config_processor.builds_for_stage_and_ref(stage, @pipeline.ref, @pipeline.tag, trigger_request) + builds_attrs = @config.builds_for_stage_and_ref(stage, @pipeline.ref, @pipeline.tag, trigger_request) # check when to create next build builds_attrs = builds_attrs.select do |build_attrs| @@ -19,34 +20,37 @@ module Ci end end - builds_attrs.map do |build_attrs| - # don't create the same build twice - unless @pipeline.builds.find_by(ref: @pipeline.ref, tag: @pipeline.tag, - trigger_request: trigger_request, name: build_attrs[:name]) - build_attrs.slice!(:name, - :commands, - :tag_list, - :options, - :allow_failure, - :stage, - :stage_idx, - :environment) - - build_attrs.merge!(ref: @pipeline.ref, - tag: @pipeline.tag, - trigger_request: trigger_request, - user: user, - project: @pipeline.project) - - @pipeline.builds.create!(build_attrs) - end + # don't create the same build twice + builds_attrs.reject! do |build_attrs| + @pipeline.builds.find_by(ref: @pipeline.ref, + tag: @pipeline.tag, + trigger_request: trigger_request, + name: build_attrs[:name]) end - end - private + builds_attrs.map do |build_attrs| + build_attrs.slice!(:name, + :commands, + :tag_list, + :options, + :allow_failure, + :stage, + :stage_idx, + :environment) - def config_processor - @config_processor ||= @pipeline.config_processor + build_attrs.merge!(pipeline: @pipeline, + ref: @pipeline.ref, + tag: @pipeline.tag, + trigger_request: trigger_request, + user: user, + project: @pipeline.project) + + ## + # We do not persist new builds here. + # Those will be persisted when @pipeline is saved. + # + @pipeline.builds.new(build_attrs) + end end end end diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index a7751b8eff..b1ee687419 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -8,7 +8,9 @@ module Ci return pipeline end - unless commit + if commit + pipeline.sha = commit.id + else pipeline.errors.add(:base, 'Commit not found') return pipeline end @@ -18,22 +20,18 @@ module Ci return pipeline end - begin - Ci::Pipeline.transaction do - pipeline.sha = commit.id - - unless pipeline.config_processor - pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file') - raise ActiveRecord::Rollback - end - - pipeline.save! - pipeline.create_builds(current_user) - end - rescue - pipeline.errors.add(:base, 'The pipeline could not be created. Please try again.') + unless pipeline.config_processor + pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file') + return pipeline end + pipeline.save! + + unless pipeline.create_builds(current_user) + pipeline.errors.add(:base, 'No builds for this pipeline.') + end + + pipeline.save pipeline end diff --git a/app/services/ci/register_build_service.rb b/app/services/ci/register_build_service.rb index 4ff268a6f0..9a187f5d69 100644 --- a/app/services/ci/register_build_service.rb +++ b/app/services/ci/register_build_service.rb @@ -7,17 +7,21 @@ module Ci builds = if current_runner.shared? - # don't run projects which have not enables shared runners - builds.joins(:project).where(projects: { builds_enabled: true, shared_runners_enabled: true }) + builds. + # don't run projects which have not enabled shared runners + joins(:project).where(projects: { builds_enabled: true, shared_runners_enabled: true }). + + # this returns builds that are ordered by number of running builds + # we prefer projects that don't use shared runners at all + joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.gl_project_id=project_builds.gl_project_id"). + order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC') else - # do run projects which are only assigned to this runner - builds.where(project: current_runner.projects.where(builds_enabled: true)) + # do run projects which are only assigned to this runner (FIFO) + builds.where(project: current_runner.projects.where(builds_enabled: true)).order('created_at ASC') end - builds = builds.order('created_at ASC') - build = builds.find do |build| - build.can_be_served?(current_runner) + current_runner.can_pick?(build) end if build @@ -35,5 +39,12 @@ module Ci rescue StateMachines::InvalidTransition nil end + + private + + def running_builds_for_shared_runners + Ci::Build.running.where(runner: Ci::Runner.shared). + group(:gl_project_id).select(:gl_project_id, 'count(*) AS running_builds') + end end end diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index 418f5cf809..f947e8f452 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -1,15 +1,11 @@ class CreateCommitBuildsService def execute(project, user, params) - return false unless project.builds_enabled? + return unless project.builds_enabled? before_sha = params[:checkout_sha] || params[:before] sha = params[:checkout_sha] || params[:after] origin_ref = params[:ref] - unless origin_ref && sha.present? - return false - end - ref = Gitlab::Git.ref_name(origin_ref) tag = Gitlab::Git.tag_ref?(origin_ref) @@ -18,23 +14,50 @@ class CreateCommitBuildsService return false end - pipeline = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) + @pipeline = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) - # Skip creating pipeline when no gitlab-ci.yml is found - unless pipeline.ci_yaml_file + ## + # Skip creating pipeline if no gitlab-ci.yml is found + # + unless @pipeline.ci_yaml_file return false end - # Create a new pipeline - pipeline.save! - + ## # Skip creating builds for commits that have [ci skip] - unless pipeline.skip_ci? - # Create builds for commit - pipeline.create_builds(user) + # but save pipeline object + # + if @pipeline.skip_ci? + return save_pipeline! end - pipeline.touch - pipeline + ## + # Skip creating builds when CI config is invalid + # but save pipeline object + # + unless @pipeline.config_processor + return save_pipeline! + end + + ## + # Skip creating pipeline object if there are no builds for it. + # + unless @pipeline.create_builds(user) + @pipeline.errors.add(:base, 'No builds created') + return false + end + + save_pipeline! + end + + private + + ## + # Create a new pipeline and touch object to calculate status + # + def save_pipeline! + @pipeline.save! + @pipeline.touch + @pipeline end end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index f804ac171c..19832a19b2 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -29,9 +29,10 @@ class NotificationService # * issue assignee if their notification level is not Disabled # * project team members with notification level higher then Participating # * watchers of the issue's labels + # * users with custom level checked with "new issue" # def new_issue(issue, current_user) - new_resource_email(issue, issue.project, 'new_issue_email') + new_resource_email(issue, issue.project, :new_issue_email) end # When we close an issue we should send an email to: @@ -39,18 +40,20 @@ class NotificationService # * 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 + # * users with custom level checked with "close issue" # def close_issue(issue, current_user) - close_resource_email(issue, issue.project, current_user, 'closed_issue_email') + close_resource_email(issue, issue.project, current_user, :closed_issue_email) end # When we reassign an issue we should send an email to: # # * issue old assignee if their notification level is not Disabled # * issue new assignee if their notification level is not Disabled + # * users with custom level checked with "reassign issue" # def reassigned_issue(issue, current_user) - reassign_resource_email(issue, issue.project, current_user, 'reassigned_issue_email') + reassign_resource_email(issue, issue.project, current_user, :reassigned_issue_email) end # When we add labels to an issue we should send an email to: @@ -58,7 +61,7 @@ class NotificationService # * watchers of the issue's labels # def relabeled_issue(issue, added_labels, current_user) - relabeled_resource_email(issue, added_labels, current_user, 'relabeled_issue_email') + relabeled_resource_email(issue, added_labels, current_user, :relabeled_issue_email) end # When create a merge request we should send an email to: @@ -66,18 +69,20 @@ class NotificationService # * mr assignee if their notification level is not Disabled # * project team members with notification level higher then Participating # * watchers of the mr's labels + # * users with custom level checked with "new merge request" # def new_merge_request(merge_request, current_user) - new_resource_email(merge_request, merge_request.target_project, 'new_merge_request_email') + new_resource_email(merge_request, merge_request.target_project, :new_merge_request_email) end # When we reassign a merge_request we should send an email to: # # * merge_request old assignee if their notification level is not Disabled # * merge_request assignee if their notification level is not Disabled + # * users with custom level checked with "reassign merge request" # def reassigned_merge_request(merge_request, current_user) - reassign_resource_email(merge_request, merge_request.target_project, current_user, 'reassigned_merge_request_email') + reassign_resource_email(merge_request, merge_request.target_project, current_user, :reassigned_merge_request_email) end # When we add labels to a merge request we should send an email to: @@ -85,15 +90,15 @@ class NotificationService # * watchers of the mr's labels # def relabeled_merge_request(merge_request, added_labels, current_user) - relabeled_resource_email(merge_request, added_labels, current_user, 'relabeled_merge_request_email') + relabeled_resource_email(merge_request, added_labels, current_user, :relabeled_merge_request_email) end def close_mr(merge_request, current_user) - close_resource_email(merge_request, merge_request.target_project, current_user, 'closed_merge_request_email') + 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') + reopen_resource_email(issue, issue.project, current_user, :issue_status_changed_email, 'reopened') end def merge_mr(merge_request, current_user) @@ -101,7 +106,7 @@ class NotificationService merge_request, merge_request.target_project, current_user, - 'merged_merge_request_email' + :merged_merge_request_email ) end @@ -110,7 +115,7 @@ class NotificationService merge_request, merge_request.target_project, current_user, - 'merge_request_status_email', + :merge_request_status_email, 'reopened' ) end @@ -153,6 +158,9 @@ class NotificationService # Merge project watchers recipients = add_project_watchers(recipients, note.project) + # Merge project with custom notification + recipients = add_custom_notifications(recipients, note.project, :new_note) + # Reject users with Mention notification level, except those mentioned in _this_ note. recipients = reject_mention_users(recipients - mentioned_users, note.project) recipients = recipients + mentioned_users @@ -222,7 +230,7 @@ class NotificationService end def accept_group_invite(group_member) - mailer.member_invite_accepted_email(group_member.id).deliver_later + mailer.member_invite_accepted_email(group_member.real_source_type, group_member.id).deliver_later end def decline_group_invite(group_member) @@ -266,14 +274,41 @@ class NotificationService end end + def project_exported(project, current_user) + mailer.project_was_exported_email(current_user, project).deliver_later + end + + def project_not_exported(project, current_user, errors) + mailer.project_was_not_exported_email(current_user, project, errors).deliver_later + end + protected + # Get project/group users with CUSTOM notification level + def add_custom_notifications(recipients, project, action) + user_ids = [] + + # Users with a notification setting on group or project + user_ids += notification_settings_for(project, :custom, action) + user_ids += notification_settings_for(project.group, :custom, action) + + # Users with global level custom + users_with_project_level_global = notification_settings_for(project, :global) + users_with_group_level_global = notification_settings_for(project.group, :global) + + global_users_ids = users_with_project_level_global.concat(users_with_group_level_global) + user_ids += users_with_global_level_custom(global_users_ids, action) + + recipients.concat(User.find(user_ids)) + end + # Get project users with WATCH notification level def project_watchers(project) - project_members = project_member_notification(project) + project_members = notification_settings_for(project) + + users_with_project_level_global = notification_settings_for(project, :global) + users_with_group_level_global = notification_settings_for(project.group, :global) - users_with_project_level_global = project_member_notification(project, :global) - users_with_group_level_global = group_member_notification(project, :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) @@ -282,33 +317,39 @@ class NotificationService User.where(id: users_with_project_setting.concat(users_with_group_setting).uniq).to_a end - def project_member_notification(project, notification_level=nil) - if notification_level - project.notification_settings.where(level: NotificationSetting.levels[notification_level]).pluck(:user_id) - else - project.notification_settings.pluck(:user_id) - end - end + def notification_settings_for(resource, notification_level = nil, action = nil) + return [] unless resource - def group_member_notification(project, notification_level) - if project.group - project.group.notification_settings.where(level: NotificationSetting.levels[notification_level]).pluck(:user_id) + if notification_level + settings = resource.notification_settings.where(level: NotificationSetting.levels[notification_level]) + settings = settings.select { |setting| setting.events[action] } if action.present? + settings.map(&:user_id) else - [] + resource.notification_settings.pluck(:user_id) end end def users_with_global_level_watch(ids) + settings_with_global_level_of(:watch, ids).pluck(:user_id) + end + + def users_with_global_level_custom(ids, action) + settings = settings_with_global_level_of(:custom, ids) + settings = settings.select { |setting| setting.events[action] } + settings.map(&:user_id) + end + + def settings_with_global_level_of(level, ids) NotificationSetting.where( user_id: ids, source_type: nil, - level: NotificationSetting.levels[:watch] - ).pluck(:user_id) + level: NotificationSetting.levels[level] + ) 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, :watch) + users = notification_settings_for(project, :watch) # If project setting is global, add to watch list if global setting is watch global_setting.each do |user_id| @@ -322,7 +363,7 @@ class NotificationService # 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, :watch) + uids = notification_settings_for(project, :watch) # Group setting is watch, add to users list if user is not project member users = [] @@ -343,7 +384,7 @@ class NotificationService end def add_project_watchers(recipients, project) - recipients.concat(project_watchers(project)).compact.uniq + recipients.concat(project_watchers(project)).compact end # Remove users with disabled notifications from array @@ -428,7 +469,7 @@ class NotificationService end def new_resource_email(target, project, method) - recipients = build_recipients(target, project, target.author, action: :new) + recipients = build_recipients(target, project, target.author, action: "new") recipients.each do |recipient| mailer.send(method, recipient.id, target.id).deliver_later @@ -436,7 +477,8 @@ class NotificationService end def close_resource_email(target, project, current_user, method) - recipients = build_recipients(target, project, current_user) + action = method == :merged_merge_request_email ? "merge" : "close" + recipients = build_recipients(target, project, current_user, action: action) recipients.each do |recipient| mailer.send(method, recipient.id, target.id, current_user.id).deliver_later @@ -447,7 +489,7 @@ class NotificationService previous_assignee_id = previous_record(target, 'assignee_id') previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id - recipients = build_recipients(target, project, current_user, action: :reassign, previous_assignee: previous_assignee) + recipients = build_recipients(target, project, current_user, action: "reassign", previous_assignee: previous_assignee) recipients.each do |recipient| mailer.send( @@ -470,7 +512,7 @@ class NotificationService end def reopen_resource_email(target, project, current_user, method, status) - recipients = build_recipients(target, project, current_user) + recipients = build_recipients(target, project, current_user, action: "reopen") recipients.each do |recipient| mailer.send(method, recipient.id, target.id, status, current_user.id).deliver_later @@ -478,14 +520,20 @@ class NotificationService end def build_recipients(target, project, current_user, action: nil, previous_assignee: nil) + custom_action = build_custom_key(action, target) + recipients = target.participants(current_user) recipients = add_project_watchers(recipients, project) + + recipients = add_custom_notifications(recipients, project, custom_action) recipients = reject_mention_users(recipients, project) + recipients = recipients.uniq + # Re-assign is considered as a mention of the new assignee so we add the # new assignee to the list of recipients after we rejected users with # the "on mention" notification level - if action == :reassign + if [:reassign_merge_request, :reassign_issue].include?(custom_action) recipients << previous_assignee if previous_assignee recipients << target.assignee end @@ -493,7 +541,7 @@ class NotificationService recipients = reject_muted_users(recipients, project) recipients = add_subscribed_users(recipients, target) - if action == :new + if [:new_issue, :new_merge_request].include?(custom_action) recipients = add_labels_subscribers(recipients, target) end @@ -523,4 +571,10 @@ class NotificationService end end end + + # Build event key to search on custom notification level + # Check NotificationSetting::EMAIL_EVENTS + def build_custom_key(action, object) + "#{action}_#{object.class.name.underscore}".to_sym + end end diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb index eb73948006..23b6668e0d 100644 --- a/app/services/projects/autocomplete_service.rb +++ b/app/services/projects/autocomplete_service.rb @@ -11,5 +11,9 @@ module Projects def merge_requests @project.merge_requests.opened.select([:iid, :title]) end + + def labels + @project.labels.select([:title, :color]) + end end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 61cac5419a..55956be284 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -80,16 +80,18 @@ module Projects def after_create_actions log_info("#{@project.owner.name} created a new project \"#{@project.name_with_namespace}\"") - @project.create_wiki if @project.wiki_enabled? + unless @project.gitlab_project_import? + @project.create_wiki if @project.wiki_enabled? - @project.build_missing_services + @project.build_missing_services - @project.create_labels + @project.create_labels + end event_service.create_project(@project, current_user) system_hook_service.execute_hooks_for(@project, :create) - unless @project.group + unless @project.group || @project.gitlab_project_import? @project.team << [current_user, :master, current_user] end end diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb new file mode 100644 index 0000000000..80c7193efc --- /dev/null +++ b/app/services/projects/import_export/export_service.rb @@ -0,0 +1,57 @@ +module Projects + module ImportExport + class ExportService < BaseService + + def execute(_options = {}) + @shared = Gitlab::ImportExport::Shared.new(relative_path: File.join(project.path_with_namespace, 'work')) + save_all + end + + private + + def save_all + if [version_saver, project_tree_saver, uploads_saver, repo_saver, wiki_repo_saver].all?(&:save) + Gitlab::ImportExport::Saver.save(shared: @shared) + notify_success + else + cleanup_and_notify + end + end + + def version_saver + Gitlab::ImportExport::VersionSaver.new(shared: @shared) + end + + def project_tree_saver + Gitlab::ImportExport::ProjectTreeSaver.new(project: project, shared: @shared) + end + + def uploads_saver + Gitlab::ImportExport::UploadsSaver.new(project: project, shared: @shared) + end + + def repo_saver + Gitlab::ImportExport::RepoSaver.new(project: project, shared: @shared) + end + + def wiki_repo_saver + Gitlab::ImportExport::WikiRepoSaver.new(project: project, shared: @shared) + end + + def cleanup_and_notify + FileUtils.rm_rf(@shared.export_path) + + notify_error + raise Gitlab::ImportExport::Error.new(@shared.errors.join(', ')) + end + + def notify_success + notification_service.project_exported(@project, @current_user) + end + + def notify_error + notification_service.project_not_exported(@project, @current_user, @shared.errors) + end + end + end +end diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb index c4838d31f2..9159ec0895 100644 --- a/app/services/projects/import_service.rb +++ b/app/services/projects/import_service.rb @@ -9,26 +9,31 @@ module Projects 'fogbugz', 'gitlab', 'github', - 'google_code' + 'google_code', + 'gitlab_project' ] def execute + add_repository_to_project unless project.gitlab_project_import? + + import_data + + success + rescue => e + error(e.message) + end + + private + + def add_repository_to_project if unknown_url? # In this case, we only want to import issues, not a repository. create_repository else import_repository end - - import_data - - success - rescue Error => e - error(e.message) end - private - def create_repository unless project.create_repository raise Error, 'The repository could not be created.' @@ -46,7 +51,7 @@ module Projects def import_data return unless has_importer? - project.repository.before_import + project.repository.before_import unless project.gitlab_project_import? unless importer.execute raise Error, 'The remote data could not be imported.' @@ -58,6 +63,8 @@ module Projects end def importer + return Gitlab::ImportExport::Importer.new(project) if @project.gitlab_project_import? + class_name = "Gitlab::#{project.import_type.camelize}Import::Importer" class_name.constantize.new(project) end diff --git a/app/services/todo_service.rb b/app/services/todo_service.rb index e1f9ea64dc..540bf54b92 100644 --- a/app/services/todo_service.rb +++ b/app/services/todo_service.rb @@ -1,6 +1,6 @@ # TodoService class # -# Used for creating todos after certain user actions +# Used for creating/updating todos after certain user actions # # Ex. # TodoService.new.new_issue(issue, current_user) @@ -137,6 +137,15 @@ class TodoService def mark_pending_todos_as_done(target, user) attributes = attributes_for_target(target) pending_todos(user, attributes).update_all(state: :done) + user.update_todos_count_cache + end + + # When user marks some todos as done + def mark_todos_as_done(todos, current_user) + todos = current_user.todos.where(id: todos.map(&:id)) unless todos.respond_to?(:update_all) + + todos.update_all(state: :done) + current_user.update_todos_count_cache end # When user marks an issue as todo @@ -151,6 +160,7 @@ class TodoService Array(users).map do |user| next if pending_todos(user, attributes).exists? Todo.create(attributes.merge(user_id: user.id)) + user.update_todos_count_cache end end @@ -161,11 +171,16 @@ class TodoService def update_issuable(issuable, author) # Skip toggling a task list item in a description - return if issuable.tasks? && issuable.updated_tasks.any? + return if toggling_tasks?(issuable) create_mention_todos(issuable.project, issuable, author) end + def toggling_tasks?(issuable) + issuable.previous_changes.include?('description') && + issuable.tasks? && issuable.updated_tasks.any? + end + def handle_note(note, author) # Skip system notes, and notes on project snippet return if note.system? || note.for_snippet? diff --git a/app/views/admin/appearances/show.html.haml b/app/views/admin/appearances/show.html.haml index 089e8e4cb7..454b779842 100644 --- a/app/views/admin/appearances/show.html.haml +++ b/app/views/admin/appearances/show.html.haml @@ -1,7 +1,9 @@ - page_title "Appearance" + %h3.page-title Appearance settings %p.light You can modify the look and feel of GitLab here +%hr = render 'form' diff --git a/app/views/admin/application_settings/show.html.haml b/app/views/admin/application_settings/show.html.haml index e9c7ca9d5a..ecc46d86af 100644 --- a/app/views/admin/application_settings/show.html.haml +++ b/app/views/admin/application_settings/show.html.haml @@ -1,4 +1,5 @@ - page_title "Settings" + %h3.page-title Settings %hr = render 'form' diff --git a/app/views/admin/dashboard/_head.html.haml b/app/views/admin/dashboard/_head.html.haml index 7b3f88c24d..b74da64f82 100644 --- a/app/views/admin/dashboard/_head.html.haml +++ b/app/views/admin/dashboard/_head.html.haml @@ -20,3 +20,7 @@ = link_to admin_builds_path, title: 'Builds' do %span Builds + = nav_link path: ['runners#index', 'runners#show'] do + = link_to admin_runners_path, title: 'Runners' do + %span + Runners diff --git a/app/views/admin/runners/index.html.haml b/app/views/admin/runners/index.html.haml index 2dad64b8d0..5eff77aff2 100644 --- a/app/views/admin/runners/index.html.haml +++ b/app/views/admin/runners/index.html.haml @@ -1,67 +1,73 @@ -%p.lead.prepend-top-default - %span - To register a new runner you should enter the following registration token. - With this token the runner will request a unique runner token and use that for future communication. - Registration token is - %code{ id: 'runners-token' } #{current_application_settings.runners_registration_token} +- @no_container = true += render "admin/dashboard/head" -.bs-callout.clearfix - .pull-left +%div{ class: (container_class) } + + %p.prepend-top-default + %span + To register a new runner you should enter the following registration token. + With this token the runner will request a unique runner token and use that for future communication. + %br + Registration token is + %code{ id: 'runners-token' } #{current_application_settings.runners_registration_token} + + .bs-callout.clearfix + .pull-left + %p + You can reset runners registration token by pressing a button below. + %p + = button_to reset_runners_token_admin_application_settings_path, + method: :put, class: 'btn btn-default', + data: { confirm: 'Are you sure you want to reset registration token?' } do + = icon('refresh') + Reset runners registration token + + .bs-callout %p - You can reset runners registration token by pressing a button below. - %p - = button_to reset_runners_token_admin_application_settings_path, - method: :put, class: 'btn btn-default', - data: { confirm: 'Are you sure you want to reset registration token?' } do - = icon('refresh') - Reset runners registration token + A 'runner' is a process which runs a build. + You can setup as many runners as you need. + %br + Runners can be placed on separate users, servers, and even on your local machine. + %br -.bs-callout - %p - A 'runner' is a process which runs a build. - You can setup as many runners as you need. - %br - Runners can be placed on separate users, servers, and even on your local machine. - %br + %div + %span Each runner can be in one of the following states: + %ul + %li + %span.label.label-success shared + \- run builds from all unassigned projects + %li + %span.label.label-info specific + \- run builds from assigned projects + %li + %span.label.label-danger paused + \- runner will not receive any new builds - %div - %span Each runner can be in one of the following states: - %ul - %li - %span.label.label-success shared - \- run builds from all unassigned projects - %li - %span.label.label-info specific - \- run builds from assigned projects - %li - %span.label.label-danger paused - \- runner will not receive any new builds + .append-bottom-20.clearfix + .pull-left + = form_tag admin_runners_path, id: 'runners-search', class: 'form-inline', method: :get do + .form-group + = search_field_tag :search, params[:search], class: 'form-control', placeholder: 'Runner description or token', spellcheck: false + = submit_tag 'Search', class: 'btn' -.append-bottom-20.clearfix - .pull-left - = form_tag admin_runners_path, id: 'runners-search', class: 'form-inline', method: :get do - .form-group - = search_field_tag :search, params[:search], class: 'form-control', placeholder: 'Runner description or token', spellcheck: false - = submit_tag 'Search', class: 'btn' + .pull-right.light + Runners with last contact less than a minute ago: #{@active_runners_cnt} - .pull-right.light - Runners with last contact less than a minute ago: #{@active_runners_cnt} + %br -%br + .table-holder + %table.table + %thead + %tr + %th Type + %th Runner token + %th Description + %th Projects + %th Builds + %th Tags + %th Last contact + %th -.table-holder - %table.table - %thead - %tr - %th Type - %th Runner token - %th Description - %th Projects - %th Builds - %th Tags - %th Last contact - %th - - - @runners.each do |runner| - = render "admin/runners/runner", runner: runner -= paginate @runners + - @runners.each do |runner| + = render "admin/runners/runner", runner: runner + = paginate @runners diff --git a/app/views/admin/runners/show.html.haml b/app/views/admin/runners/show.html.haml index e049b40bfa..61abfc6ecb 100644 --- a/app/views/admin/runners/show.html.haml +++ b/app/views/admin/runners/show.html.haml @@ -28,7 +28,7 @@ .col-md-6 %h4 Restrict projects for this runner - if @runner.projects.any? - %table.table + %table.table.assigned-projects %thead %tr %th Assigned projects @@ -44,7 +44,7 @@ .pull-right = link_to 'Disable', [:admin, project.namespace.becomes(Namespace), project, runner_project], method: :delete, class: 'btn btn-danger btn-xs' - %table.table + %table.table.unassigned-projects %thead %tr %th Project diff --git a/app/views/devise/mailer/password_change.html.haml b/app/views/devise/mailer/password_change.html.haml new file mode 100644 index 0000000000..3349ee8480 --- /dev/null +++ b/app/views/devise/mailer/password_change.html.haml @@ -0,0 +1,10 @@ +.center + #content + %h2 Hello, #{@resource.name}! + %p + The password for your GitLab account on + #{link_to(Gitlab.config.gitlab.url, Gitlab.config.gitlab.url)} + has successfully been changed. + %p + If you did not initiate this change, please contact your administrator + immediately. diff --git a/app/views/devise/mailer/password_change.text.erb b/app/views/devise/mailer/password_change.text.erb new file mode 100644 index 0000000000..95923d9f8d --- /dev/null +++ b/app/views/devise/mailer/password_change.text.erb @@ -0,0 +1,7 @@ +Hello, <%= @resource.name %>! + +The password for your GitLab account on <%= Gitlab.config.gitlab.url %> +has successfully been changed. + +If you did not initiate this change, please contact your administrator +immediately. 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 23b31da92d..0000000000 --- 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/reset_password_instructions.html.haml b/app/views/devise/mailer/reset_password_instructions.html.haml new file mode 100644 index 0000000000..e91c952252 --- /dev/null +++ b/app/views/devise/mailer/reset_password_instructions.html.haml @@ -0,0 +1,12 @@ +.center + #content + %h2 Hello, #{@resource.name}! + %p + Someone, hopefully you, has requested to reset the password for your + GitLab account on #{link_to(Gitlab.config.gitlab.url, Gitlab.config.gitlab.url)}. + %p + If you did not perform this request, you can safely ignore this email. + %p + Otherwise, click the link below to complete the process. + #cta + = link_to('Reset password', edit_password_url(@resource, reset_password_token: @token)) diff --git a/app/views/devise/mailer/reset_password_instructions.text.erb b/app/views/devise/mailer/reset_password_instructions.text.erb new file mode 100644 index 0000000000..116313ee11 --- /dev/null +++ b/app/views/devise/mailer/reset_password_instructions.text.erb @@ -0,0 +1,10 @@ +Hello, <%= @resource.name %>! + +Someone, hopefully you, has requested to reset the password for your GitLab +account on <%= Gitlab.config.gitlab.url %> + +If you did not perform this request, you can safely ignore this email. + +Otherwise, click the link below to complete the process: + +<%= edit_password_url(@resource, reset_password_token: @token) %> diff --git a/app/views/devise/mailer/unlock_instructions.html.haml b/app/views/devise/mailer/unlock_instructions.html.haml index 52b327e20c..9990d1ccac 100644 --- a/app/views/devise/mailer/unlock_instructions.html.haml +++ b/app/views/devise/mailer/unlock_instructions.html.haml @@ -1,10 +1,9 @@ -%p -Hello #{@resource.name}! - -%p - Your GitLab account has been locked due to an excessive amount of unsuccessful - sign in attempts. Your account will automatically unlock in - = time_ago_in_words(Devise.unlock_in.from_now) - or you may click the link below to unlock now. - -%p= link_to 'Unlock your account', unlock_url(@resource, unlock_token: @token) +.center + #content + %h2 Hello, #{@resource.name}! + %p + Your GitLab account has been locked due to an excessive amount of unsuccessful + sign in attempts. Your account will automatically unlock in #{time_ago_in_words(Devise.unlock_in.from_now)} + or you may click the link below to unlock now. + #cta + = link_to('Unlock account', unlock_url(@resource, unlock_token: @token)) diff --git a/app/views/devise/mailer/unlock_instructions.text.erb b/app/views/devise/mailer/unlock_instructions.text.erb new file mode 100644 index 0000000000..3aea3e2014 --- /dev/null +++ b/app/views/devise/mailer/unlock_instructions.text.erb @@ -0,0 +1,7 @@ +Hello, <%= @resource.name %>! + +Your GitLab account has been locked due to an excessive amount of unsuccessful +sign in attempts. Your account will automatically unlock in <%= time_ago_in_words(Devise.unlock_in.from_now) %> +or you may click the link below to unlock now. + +<%= unlock_url(@resource, unlock_token: @token) %> diff --git a/app/views/groups/group_members/update.js.haml b/app/views/groups/group_members/update.js.haml index b0b3a51ce5..da71de4cd1 100644 --- a/app/views/groups/group_members/update.js.haml +++ b/app/views/groups/group_members/update.js.haml @@ -1,2 +1,2 @@ :plain - $("##{dom_id(@group_member)}").replaceWith('#{escape_javascript(render(@group_member, member: @group_member))}'); + $("##{dom_id(@group_member)}").replaceWith('#{escape_javascript(render('shared/members/member', member: @group_member))}'); diff --git a/app/views/help/_shortcuts.html.haml b/app/views/help/_shortcuts.html.haml index 01648047ce..8cc0b59ede 100644 --- a/app/views/help/_shortcuts.html.haml +++ b/app/views/help/_shortcuts.html.haml @@ -28,8 +28,12 @@ .key ⌘ shift p - else .key ctrl shift p - %td Toggle Markdown preview + %tr + %td.shortcut + .key + %i.fa.fa-arrow-up + %td Edit last comment (when focused on an empty textarea) %tbody %tr %th diff --git a/app/views/import/github/status.html.haml b/app/views/import/github/status.html.haml index 6c4a9d68d1..7486b1423e 100644 --- a/app/views/import/github/status.html.haml +++ b/app/views/import/github/status.html.haml @@ -6,7 +6,7 @@ %p %i.fa.fa-warning - To import GitHub pull requests, any pull request source branches that had been deleted are temporarily restored on GitHub. To prevent any connected CI services from being overloaded with dozens of irrelevant branches being created and deleted again, GitHub webhooks are temporarily disabled during the import process. + To import GitHub pull requests, any pull request source branches that had been deleted are temporarily restored on GitHub. To prevent any connected CI services from being overloaded with dozens of irrelevant branches being created and deleted again, GitHub webhooks are temporarily disabled during the import process, but only if you have admin access to the GitHub repository. %p.light Select projects you want to import. diff --git a/app/views/import/gitlab_projects/new.html.haml b/app/views/import/gitlab_projects/new.html.haml new file mode 100644 index 0000000000..44e2653ca4 --- /dev/null +++ b/app/views/import/gitlab_projects/new.html.haml @@ -0,0 +1,25 @@ +- page_title "GitLab Import" +- header_title "Projects", root_path +%h3.page-title + = icon('gitlab') + Import an exported GitLab project +%hr + += form_tag import_gitlab_project_path, class: 'form-horizontal', multipart: true do + %p + Project will be imported as + %strong + #{@namespace_name}/#{@path} + + %p + To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here. + .form-group + = hidden_field_tag :namespace_id, @namespace_id + = hidden_field_tag :path, @path + = label_tag :file, class: 'control-label' do + %span GitLab project export + .col-sm-10 + = file_field_tag :file, class: '' + + .form-actions + = submit_tag 'Import project', class: 'btn btn-create' diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml index e4fab89737..8c140a5943 100644 --- a/app/views/layouts/_collapse_button.html.haml +++ b/app/views/layouts/_collapse_button.html.haml @@ -1 +1,3 @@ -= link_to icon('bars'), '#', class: 'toggle-nav-collapse', title: "Open/Close" += link_to '#', class: 'nav-header-btn text-center toggle-nav-collapse', title: "Open/Close" do + %span.sr-only Toggle navigation + = icon('bars') diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index f89e858279..2234bf79c8 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,6 +1,6 @@ -.page-with-sidebar.page-sidebar-collapsed{ class: "#{page_gutter_class}" } +.page-with-sidebar{ class: "#{page_sidebar_class} #{page_gutter_class}" } .sidebar-wrapper.nicescroll{ class: nav_sidebar_class } - + = render partial: 'layouts/collapse_button' - if defined?(sidebar) && sidebar = render "layouts/nav/#{sidebar}" - elsif current_user @@ -8,13 +8,14 @@ - else = render 'layouts/nav/explore' - .collapse-nav - = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user', title: "Profile", data: {user: current_user.username} do = image_tag avatar_icon(current_user, 60), alt: 'Profile', class: 'avatar avatar s36' .username = current_user.username + = link_to '#', class: "nav-header-btn text-center pin-nav-btn has-tooltip #{'is-active' if pinned_nav?} js-nav-pin", title: pinned_nav? ? "Unpin navigation" : "Pin Navigation", data: {placement: 'right', container: 'body'} do + %span.sr-only Toggle navigation pinning + = icon('thumb-tack') - if defined?(nav) && nav .layout-nav .container-fluid diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml index b49207fc31..245b9c3b4d 100644 --- a/app/views/layouts/_search.html.haml +++ b/app/views/layouts/_search.html.haml @@ -36,6 +36,31 @@ - else = hidden_field_tag :search_code, true + :javascript + gl.projectOptions = gl.projectOptions || {}; + gl.projectOptions["#{j(@project.path)}"] = { + issuesPath: "#{namespace_project_issues_path(@project.namespace, @project)}", + mrPath: "#{namespace_project_merge_requests_path(@project.namespace, @project)}", + name: "#{j(@project.name)}" + }; + + - if @group and @group.path + :javascript + gl.groupOptions = gl.groupOptions || {}; + gl.groupOptions["#{j(@group.path)}"] = { + name: "#{j(@group.name)}", + issuesPath: "#{issues_group_path(j(@group.path))}", + mrPath: "#{merge_requests_group_path(j(@group.path))}" + }; + + + :javascript + gl.dashboardOptions = { + issuesPath: "#{issues_dashboard_url}", + mrPath: "#{merge_requests_dashboard_url}" + }; + + - if @snippet || @snippets = hidden_field_tag :snippets, true = hidden_field_tag :repository_ref, @ref diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 2b86b289bb..33cedaaf2e 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en"} = render "layouts/head" - %body{class: "#{user_application_theme}", 'data-page' => body_data_page} + %body{class: "#{user_application_theme}", data: {page: body_data_page, project: "#{@project.path if @project}", group: "#{@group.path if @group}"}} = Gon::Base.render_data -# Ideally this would be inside the head, but turbolinks only evaluates page-specific JS in the body. diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index ef31520f5c..40a2c81eeb 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -1,4 +1,4 @@ -%header.navbar.navbar-fixed-top.navbar-gitlab.header-collapsed{ class: nav_header_class } +%header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content %button.side-nav-toggle{type: 'button'} diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 54aa34bee0..66e5ec1ad1 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -1,64 +1,41 @@ -%ul.nav-links.scrolling-tabs - .fade-left - = nav_link(controller: %w(dashboard admin projects users groups builds), html_options: {class: 'home'}) do - = link_to admin_root_path, title: 'Overview', class: 'shortcuts-tree' do - %span - Overview - = nav_link(controller: %w(background_jobs logs health_check)) do - = link_to admin_background_jobs_path, title: 'Monitoring' do - %span - Monitoring - = nav_link(controller: :deploy_keys) do - = link_to admin_deploy_keys_path, title: 'Deploy Keys' do - %span - Deploy Keys - = nav_link path: ['runners#index', 'runners#show'] do - = link_to admin_runners_path, title: 'Runners' do - %span - Runners - = nav_link(controller: :broadcast_messages) do - = link_to admin_broadcast_messages_path, title: 'Messages' do - %span - Messages - = nav_link(controller: :hooks) do - = link_to admin_hooks_path, title: 'Hooks' do - %span - Hooks +%div{ class: nav_control_class } + = render 'layouts/nav/admin_settings' - = nav_link(controller: :appearances) do - = link_to admin_appearances_path, title: 'Appearances' do - %span - Appearance - - = nav_link(controller: :applications) do - = link_to admin_applications_path, title: 'Applications' do - %span - Applications - - = nav_link(controller: :services) do - = link_to admin_application_settings_services_path, title: 'Service Templates' do - %span - Service Templates - - = nav_link(controller: :labels) do - = link_to admin_labels_path, title: 'Labels' do - %span - Labels - - = nav_link(controller: :abuse_reports) do - = link_to admin_abuse_reports_path, title: "Abuse Reports" do - %span - Abuse Reports - %span.badge.count= number_with_delimiter(AbuseReport.count(:all)) - - - if askimet_enabled? - = nav_link(controller: :spam_logs) do - = link_to admin_spam_logs_path, title: "Spam Logs" do + %ul.nav-links.scrolling-tabs + %li.fade-left + = icon('arrow-left') + = nav_link(controller: %w(dashboard admin projects users groups builds runners), html_options: {class: 'home'}) do + = link_to admin_root_path, title: 'Overview', class: 'shortcuts-tree' do %span - Spam Logs + Overview + = nav_link(controller: %w(background_jobs logs health_check)) do + = link_to admin_background_jobs_path, title: 'Monitoring' do + %span + Monitoring + = nav_link(controller: :broadcast_messages) do + = link_to admin_broadcast_messages_path, title: 'Messages' do + %span + Messages + = nav_link(controller: :hooks) do + = link_to admin_hooks_path, title: 'Hooks' do + %span + System Hooks - = nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do - = link_to admin_application_settings_path, title: 'Settings' do - %span - Settings - .fade-right + = nav_link(controller: :applications) do + = link_to admin_applications_path, title: 'Applications' do + %span + Applications + + = nav_link(controller: :abuse_reports) do + = link_to admin_abuse_reports_path, title: "Abuse Reports" do + %span + Abuse Reports + %span.badge.count= number_with_delimiter(AbuseReport.count(:all)) + + - if askimet_enabled? + = nav_link(controller: :spam_logs) do + = link_to admin_spam_logs_path, title: "Spam Logs" do + %span + Spam Logs + %li.fade-right + = icon('arrow-right') diff --git a/app/views/layouts/nav/_admin_settings.html.haml b/app/views/layouts/nav/_admin_settings.html.haml new file mode 100644 index 0000000000..38e9b80d12 --- /dev/null +++ b/app/views/layouts/nav/_admin_settings.html.haml @@ -0,0 +1,31 @@ +.controls + .dropdown.admin-settings-dropdown + %a.dropdown-new.btn.btn-default{href: '#', 'data-toggle' => 'dropdown'} + = icon('cog') + = icon('caret-down') + %ul.dropdown-menu.dropdown-menu-align-right + = nav_link(controller: :deploy_keys) do + = link_to admin_deploy_keys_path, title: 'Deploy Keys' do + %span + Deploy Keys + + = nav_link(controller: :services) do + = link_to admin_application_settings_services_path, title: 'Service Templates' do + %span + Service Templates + + = nav_link(controller: :labels) do + = link_to admin_labels_path, title: 'Labels' do + %span + Labels + + = nav_link(controller: :appearances) do + = link_to admin_appearances_path, title: 'Appearances' do + %span + Appearance + + %li.divider + = nav_link(controller: :application_settings) do + = link_to admin_application_settings_path, title: 'Settings' do + %span + Settings diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 66361a644d..f7aa9fab7c 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -2,7 +2,8 @@ = render 'layouts/nav/group_settings' %ul.nav-links.scrolling-tabs - .fade-left + %li.fade-left + = icon('arrow-left') = nav_link(path: 'groups#show', html_options: {class: 'home'}) do = link_to group_path(@group), title: 'Home' do %span @@ -31,4 +32,5 @@ = link_to group_group_members_path(@group), title: 'Members' do %span Members - .fade-right + %li.fade-right + = icon('arrow-right') diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index d4b1f477f3..44ea939b7e 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -1,5 +1,6 @@ %ul.nav-links.scrolling-tabs - .fade-left + %li.fade-left + = icon('arrow-left') = nav_link(path: 'profiles#show', html_options: {class: 'home'}) do = link_to profile_path, title: 'Profile Settings' do %span @@ -13,6 +14,10 @@ = link_to applications_profile_path, title: 'Applications' do %span Applications + = nav_link(controller: :personal_access_tokens) do + = link_to profile_personal_access_tokens_path, title: 'Personal Access Tokens' do + %span + Personal Access Tokens = nav_link(controller: :emails) do = link_to profile_emails_path, title: 'Emails' do %span @@ -39,4 +44,5 @@ = link_to audit_log_profile_path, title: 'Audit Log' do %span Audit Log - .fade-right + %li.fade-right + = icon('arrow-right') diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index a851cae4b5..7762746f84 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -5,18 +5,19 @@ = icon('cog') = icon('caret-down') %ul.dropdown-menu.dropdown-menu-align-right + - is_project_member = @project.users.exists?(current_user.id) - access = @project.team.max_member_access(current_user.id) - can_edit = can?(current_user, :admin_project, @project) = render 'layouts/nav/project_settings', access: access, can_edit: can_edit - - if can_edit || access + - if can_edit || is_project_member %li.divider - if can_edit %li = link_to edit_project_path(@project) do Edit Project - - if access + - if is_project_member %li = link_to polymorphic_path([:leave, @project, :members]), data: { confirm: leave_confirmation_message(@project) }, method: :delete, title: 'Leave project' do @@ -24,7 +25,8 @@ %div{ class: nav_control_class } %ul.nav-links.scrolling-tabs - .fade-left + %li.fade-left + = icon('arrow-left') = nav_link(path: 'projects#show', html_options: {class: 'home'}) do = link_to project_path(@project), title: 'Project', class: 'shortcuts-project' do %span @@ -37,9 +39,9 @@ - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree find_file commit commits compare repositories tags branches releases network)) do - = link_to project_files_path(@project), title: 'Code', class: 'shortcuts-tree' do + = link_to project_files_path(@project), title: 'Repository', class: 'shortcuts-tree' do %span - Code + Repository - if project_nav_tab? :pipelines = nav_link(controller: [:pipelines, :builds, :environments]) do @@ -108,4 +110,5 @@ %li.hidden = link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits' do Commits - .fade-right + %li.fade-right + = icon('arrow-right') diff --git a/app/views/notify/project_was_exported_email.html.haml b/app/views/notify/project_was_exported_email.html.haml new file mode 100644 index 0000000000..b28fea35ad --- /dev/null +++ b/app/views/notify/project_was_exported_email.html.haml @@ -0,0 +1,8 @@ +%p + Project #{@project.name} was exported successfully. +%p + The project export can be downloaded from: + = link_to download_export_namespace_project_url(@project.namespace, @project) do + = @project.name_with_namespace + " export" +%p + The download link will expire in 24 hours. diff --git a/app/views/notify/project_was_exported_email.text.erb b/app/views/notify/project_was_exported_email.text.erb new file mode 100644 index 0000000000..42c4d17687 --- /dev/null +++ b/app/views/notify/project_was_exported_email.text.erb @@ -0,0 +1,6 @@ +Project <%= @project.name %> was exported successfully. + +The project export can be downloaded from: +<%= download_export_namespace_project_url(@project.namespace, @project) %> + +The download link will expire in 24 hours. diff --git a/app/views/notify/project_was_not_exported_email.html.haml b/app/views/notify/project_was_not_exported_email.html.haml new file mode 100644 index 0000000000..c9e9ade2cf --- /dev/null +++ b/app/views/notify/project_was_not_exported_email.html.haml @@ -0,0 +1,9 @@ +%p + Project #{@project.name} couldn't be exported. +%p + The errors we encountered were: + + %ul + - @errors.each do |error| + %li + error diff --git a/app/views/notify/project_was_not_exported_email.text.erb b/app/views/notify/project_was_not_exported_email.text.erb new file mode 100644 index 0000000000..a07f6edacf --- /dev/null +++ b/app/views/notify/project_was_not_exported_email.text.erb @@ -0,0 +1,6 @@ +Project <%= @project.name %> couldn't be exported. + +The errors we encountered were: + +- @errors.each do |error| +<%= error %> \ No newline at end of file diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 3d2a245ecb..8efe486e01 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -62,10 +62,14 @@ .provider-btn-image = provider_image_tag(provider) - if auth_active?(provider) - = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'provider-btn' do - Disconnect + - if provider.to_s == 'saml' + %a.provider-btn + Active + - else + = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'provider-btn' do + Disconnect - else - = link_to user_omniauth_authorize_path(provider), method: :post, class: "provider-btn #{'not-active' if !auth_active?(provider)}", "data-no-turbolink" => "true" do + = link_to user_omniauth_authorize_path(provider), method: :post, class: 'provider-btn not-active', "data-no-turbolink" => "true" do Connect %hr - if current_user.can_change_username? diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml index f0cf82afe8..537bba21f4 100644 --- a/app/views/profiles/notifications/_group_settings.html.haml +++ b/app/views/profiles/notifications/_group_settings.html.haml @@ -9,5 +9,4 @@ = link_to group.name, group_path(group) .pull-right - = form_for [group, setting], remote: true, html: { class: 'update-notifications' } do |f| - = f.select :level, NotificationSetting.levels.keys, {}, class: 'form-control trigger-submit' + = render 'shared/notifications/button', notification_setting: setting diff --git a/app/views/profiles/notifications/_project_settings.html.haml b/app/views/profiles/notifications/_project_settings.html.haml index e0fad555c0..5b2a69b889 100644 --- a/app/views/profiles/notifications/_project_settings.html.haml +++ b/app/views/profiles/notifications/_project_settings.html.haml @@ -9,5 +9,4 @@ = link_to_project(project) .pull-right - = form_for [project.namespace.becomes(Namespace), project, setting], remote: true, html: { class: 'update-notifications' } do |f| - = f.select :level, NotificationSetting.levels.keys, {}, class: 'form-control trigger-submit' + = render 'shared/notifications/button', notification_setting: setting diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index f2659ac14b..f77738f97f 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -24,12 +24,15 @@ .form-group = f.label :notification_email, class: "label-light" = f.select :notification_email, @user.all_emails, { include_blank: false }, class: "select2" - .form-group - = f.label :notification_level, class: 'label-light' - = notification_level_radio_buttons - .prepend-top-default - = f.submit 'Update settings', class: "btn btn-create" + = label_tag :global_notification_level, "Global notification level", class: "label-light" + %br + .clearfix + .form-group.pull-left.global-notification-setting + = render 'shared/notifications/button', notification_setting: @global_notification_setting, left_align: true + + .clearfix + %hr %h5 Groups (#{@group_notifications.count}) diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml new file mode 100644 index 0000000000..1b45548bd0 --- /dev/null +++ b/app/views/profiles/personal_access_tokens/index.html.haml @@ -0,0 +1,105 @@ +- page_title "Personal Access Tokens" + +.row.prepend-top-default + .col-lg-3.profile-settings-sidebar + %h4.prepend-top-0 + = page_title + %p + You can generate a personal access token for each application you use that needs access to the GitLab API. + .col-lg-9 + + - if flash[:personal_access_token] + .created-personal-access-token-container + %h5.prepend-top-0 + Your New Personal Access Token + .form-group + = text_field_tag 'created-personal-access-token', flash[:personal_access_token], readonly: true, class: "form-control", 'aria-describedby' => "created-personal-access-token-help-block" + = clipboard_button(clipboard_text: flash[:personal_access_token]) + %span#created-personal-access-token-help-block.help-block.text-danger Make sure you save it - you won't be able to access it again. + + %hr + + %h5.prepend-top-0 + Add a Personal Access Token + %p.profile-settings-content + Pick a name for the application, and we'll give you a unique token. + = form_for [:profile, @personal_access_token], + method: :post, html: { class: 'js-requires-input' } do |f| + + = form_errors(@personal_access_token) + + .form-group + = f.label :name, class: 'label-light' + = f.text_field :name, class: "form-control", required: true + + .form-group + = f.label :expires_at, class: 'label-light' + = f.text_field :expires_at, class: "datepicker form-control", required: false + + .prepend-top-default + = f.submit 'Create Personal Access Token', class: "btn btn-create" + + %hr + + %h5 Active Personal Access Tokens (#{@active_personal_access_tokens.length}) + + - if @active_personal_access_tokens.present? + .table-responsive + %table.table.active-personal-access-tokens + %thead + %tr + %th Name + %th Created + %th Expires + %th + %tbody + - @active_personal_access_tokens.each do |token| + %tr + %td= token.name + %td= token.created_at.to_date.to_s(:medium) + %td + - if token.expires_at.present? + = token.expires_at.to_date.to_s(:medium) + - else + %span.personal-access-tokens-never-expires-label Never + %td= link_to "Revoke", revoke_profile_personal_access_token_path(token), method: :put, class: "btn btn-danger pull-right", data: { confirm: "Are you sure you want to revoke this token? This action cannot be undone." } + + - else + .settings-message.text-center + You don't have any active tokens yet. + + %hr + + %h5 Inactive Personal Access Tokens (#{@inactive_personal_access_tokens.length}) + + - if @inactive_personal_access_tokens.present? + .table-responsive + %table.table.inactive-personal-access-tokens + %thead + %tr + %th Name + %th Created + %tbody + - @inactive_personal_access_tokens.each do |token| + %tr + %td= token.name + %td= token.created_at.to_date.to_s(:medium) + + - else + .settings-message.text-center + There are no inactive tokens. + + +:javascript + var date = $('#personal_access_token_expires_at').val(); + + var datepicker = $(".datepicker").datepicker({ + dateFormat: "yy-mm-dd", + minDate: 0 + }); + + $("#created-personal-access-token").click(function() { + this.select(); + }); + + $("#created-personal-access-token").effect('highlight', { color: '#ffff99' }, 2000); diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 2b19ee93ee..86ea08dd22 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -21,7 +21,7 @@ = link_to project_path(forked_from_project) do = forked_from_project.namespace.try(:name) - .project-repo-buttons + .project-repo-buttons.project-action-buttons .count-buttons = render 'projects/buttons/star' = render 'projects/buttons/fork' @@ -29,13 +29,13 @@ .project-clone-holder = render "shared/clone_panel" - .project-repo-buttons.project-right-buttons + .project-repo-buttons.btn-group.project-right-buttons - if current_user = render 'shared/members/access_request_buttons', source: @project - .btn-group - = render "projects/buttons/download" - = render 'projects/buttons/dropdown' - = render 'projects/buttons/notifications' + + = render "projects/buttons/download" + = render 'projects/buttons/dropdown' + = render 'shared/notifications/button', notification_setting: @notification_setting :javascript new Star(); diff --git a/app/views/projects/_last_push.html.haml b/app/views/projects/_last_push.html.haml index 7c2b8d0150..e0ca2a3109 100644 --- a/app/views/projects/_last_push.html.haml +++ b/app/views/projects/_last_push.html.haml @@ -1,15 +1,15 @@ - if event = last_push_event - if show_last_push_widget?(event) - .row-content-block.top-block.clear-block.hidden-xs - .event-last-push - .event-last-push-text - %span You pushed to - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - branch - #{time_ago_with_tooltip(event.created_at)} + %div{ class: (container_class) } + .event-last-push + .event-last-push-text + %span You pushed to + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do + %strong= event.ref_name + branch + #{time_ago_with_tooltip(event.created_at)} - .pull-right - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do - Create Merge Request + .pull-right + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do + Create Merge Request diff --git a/app/views/projects/badges/index.html.haml b/app/views/projects/badges/index.html.haml index ee63bc55a3..ac80951dd4 100644 --- a/app/views/projects/badges/index.html.haml +++ b/app/views/projects/badges/index.html.haml @@ -7,7 +7,7 @@ %b Builds badge · = @build_badge.to_html .pull-right - = render 'shared/ref_switcher', destination: 'badges' + = render 'shared/ref_switcher', destination: 'badges', align_right: true .panel-body .row .col-md-2.text-center diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 4071b59c00..29c7d45074 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -13,12 +13,12 @@ required: true, class: 'form-control new-file-name' .pull-right - .license-selector.js-license-selector.hide - = select_tag :license_type, grouped_options_for_select(licenses_for_select, @project.repository.license_key), include_blank: true, class: 'select2 license-select', data: {placeholder: 'Choose a license template', project: @project.name, fullname: @project.namespace.human_name} - - .gitignore-selector.hidden - = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { filenames: gitignore_names } } ) - + .license-selector.js-license-selector-wrap.hidden + = dropdown_tag("Choose a License template", options: { toggle_class: 'js-license-selector', title: "Choose a license", filter: true, placeholder: "Filter", data: { data: licenses_for_select, project: @project.name, fullname: @project.namespace.human_name } } ) + .gitignore-selector.js-gitignore-selector-wrap.hidden + = dropdown_tag("Choose a .gitignore template", options: { toggle_class: 'js-gitignore-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { data: gitignore_names } } ) + .gitlab-ci-yml-selector.js-gitlab-ci-yml-selector-wrap.hidden + = dropdown_tag("Choose a GitLab CI Yaml template", options: { toggle_class: 'js-gitlab-ci-yml-selector', title: "Choose a template", filter: true, placeholder: "Filter", data: { data: gitlab_ci_ymls } } ) .encoding-selector = select_tag :encoding, options_for_select([ "base64", "text" ], "text"), class: 'select2' diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index 87c732626a..4bd8506124 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -20,15 +20,15 @@ protected .controls.hidden-xs - if create_mr_button?(@repository.root_ref, branch.name) - = link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-grouped btn-xs' do + = link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-default' do Merge Request - 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 + = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: branch.name), class: 'btn btn-default', method: :post, title: "Compare" do 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 has-tooltip', title: "Delete branch", method: :delete, data: { confirm: "Deleting the '#{branch.name}' branch cannot be undone. Are you sure?", container: 'body' }, remote: true do + = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), class: 'btn btn-remove remove-row has-tooltip', title: "Delete branch", method: :delete, data: { confirm: "Deleting the '#{branch.name}' branch cannot be undone. Are you sure?", container: 'body' }, remote: true do = icon("trash-o") - if branch.name != @repository.root_ref diff --git a/app/views/projects/builds/show.html.haml b/app/views/projects/builds/show.html.haml index a26f8aeb31..4e2702c2e4 100644 --- a/app/views/projects/builds/show.html.haml +++ b/app/views/projects/builds/show.html.haml @@ -48,16 +48,16 @@ - if @build.active? .autoscroll-container %button.btn.btn-success.btn-sm#autoscroll-button{:type => "button", :data => {:state => 'disabled'}} enable autoscroll - #js-build-scroll.scroll-controls - = link_to '#build-trace', class: 'btn' do - %i.fa.fa-angle-up - = link_to '#down-build-trace', class: 'btn' do - %i.fa.fa-angle-down - if @build.erased? .erased.alert.alert-warning - erased_by = "by #{link_to @build.erased_by.name, user_path(@build.erased_by)}" if @build.erased_by Build has been erased #{erased_by.html_safe} #{time_ago_with_tooltip(@build.erased_at)} - else + #js-build-scroll.scroll-controls + = link_to '#build-trace', class: 'btn' do + %i.fa.fa-angle-up + = link_to '#down-build-trace', class: 'btn' do + %i.fa.fa-angle-down %pre.build-trace#build-trace %code.bash.js-build-output = icon("refresh spin", class: "js-build-refresh") diff --git a/app/views/projects/buttons/_notifications.html.haml b/app/views/projects/buttons/_notifications.html.haml deleted file mode 100644 index a7a9718109..0000000000 --- a/app/views/projects/buttons/_notifications.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -- if @notification_setting - = form_for @notification_setting, url: namespace_project_notification_setting_path(@project.namespace.becomes(Namespace), @project), method: :patch, remote: true, html: { class: 'inline', id: 'notification-form' } do |f| - = f.hidden_field :level - .dropdown.hidden-sm - %button.btn.btn-default.notifications-btn#notifications-button{ data: { toggle: "dropdown" }, aria: { haspopup: "true", expanded: "false" } } - = icon('bell') - = notification_title(@notification_setting.level) - = icon('caret-down') - %ul.dropdown-menu.dropdown-menu-no-wrap.dropdown-menu-align-right.dropdown-menu-selectable.dropdown-menu-large{ role: "menu" } - - NotificationSetting.levels.each do |level| - = notification_list_item(level.first, @notification_setting) diff --git a/app/views/projects/ci/pipelines/_pipeline.html.haml b/app/views/projects/ci/pipelines/_pipeline.html.haml index a0ffa06506..e38d1ff5ff 100644 --- a/app/views/projects/ci/pipelines/_pipeline.html.haml +++ b/app/views/projects/ci/pipelines/_pipeline.html.haml @@ -24,8 +24,8 @@ %span.label.label-warning stuck %p.commit-title - - if commit_data = pipeline.commit_data - = link_to_gfm truncate(commit_data.title, length: 60), namespace_project_commit_path(@project.namespace, @project, commit_data.id), class: "commit-row-message" + - if commit = pipeline.commit + = link_to_gfm truncate(commit.title, length: 60), namespace_project_commit_path(@project.namespace, @project, commit.id), class: "commit-row-message" - else Cant find HEAD commit for this branch @@ -60,7 +60,7 @@ %li = link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, build), rel: 'nofollow' do = icon("download") - %span #{build.name} + %span Download '#{build.name}' artifacts - if can?(current_user, :update_pipeline, @project) - if pipeline.retryable? diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml index 367027182b..929496f81d 100644 --- a/app/views/projects/commits/_commit.html.haml +++ b/app/views/projects/commits/_commit.html.haml @@ -9,26 +9,31 @@ = cache(cache_key) do %li.commit.js-toggle-container{ id: "commit-#{commit.short_id}" } - .commit-row-title - %span.item-title - = 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 ... + = commit_author_avatar(commit, size: 36) + .commit-info-block + .commit-row-title + %span.item-title + = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" + %span.commit-row-message.visible-xs-inline + · + = commit.short_id + - if commit.status + = render_commit_status(commit, cssclass: 'visible-xs-inline') + - if commit.description? + %a.text-expander.hidden-xs.js-toggle-button ... - .pull-right - - if commit.status - = render_commit_status(commit) - = clipboard_button(clipboard_text: commit.id) - = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" + .commit-actions.hidden-xs + - if commit.status + = render_commit_status(commit, cssclass: 'btn btn-transparent') + = clipboard_button_with_class({ clipboard_text: commit.id }, css_class: 'btn-transparent') + = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit-short-id btn btn-transparent" + = link_to_browse_code(project, commit) - - if commit.description? - .commit-row-description.js-toggle-content - %pre + - if commit.description? + %pre.commit-row-description.js-toggle-content = preserve(markdown(escape_once(commit.description), pipeline: :single_line, author: commit.author)) - .commit-row-info - by - = commit_author_link(commit, avatar: true, size: 24) - .committed_ago - #{time_ago_with_tooltip(commit.committed_date)}   - = link_to_browse_code(project, commit) + .commit-row-info + = commit_author_link(commit, avatar: false, size: 24) + authored + #{time_ago_with_tooltip(commit.committed_date)} diff --git a/app/views/projects/commits/_commits.html.haml b/app/views/projects/commits/_commits.html.haml index 7283a78a64..dd12eae8f7 100644 --- a/app/views/projects/commits/_commits.html.haml +++ b/app/views/projects/commits/_commits.html.haml @@ -4,18 +4,11 @@ - commits, hidden = limited_commits(@commits) - commits.chunk { |c| c.committed_date.in_time_zone.to_date }.each do |day, commits| - .row.commits-row - .col-md-2.hidden-xs.hidden-sm - %h5.commits-row-date - %i.fa.fa-calendar - %span= day.strftime('%d %b, %Y') - .light - = pluralize(commits.count, 'commit') - .col-md-10.col-sm-12 - %ul.content-list - = render commits, project: project - %hr.lists-separator + %li.commit-header= "#{day.strftime('%d %b, %Y')} #{pluralize(commits.count, 'commit')}" + %li.commits-row + %ul.list-unstyled.commit-list + = render commits, project: project - if hidden > 0 - .alert.alert-warning + %li.alert.alert-warning #{number_with_delimiter(hidden)} additional commits have been omitted to prevent performance issues. diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml index c8aa849c21..54dab4bff0 100644 --- a/app/views/projects/commits/_head.html.haml +++ b/app/views/projects/commits/_head.html.haml @@ -1,7 +1,8 @@ .scrolling-tabs-container .nav-links.sub-nav.scrolling-tabs %ul{ class: (container_class) } - .fade-left + %li.fade-left + = icon('arrow-left') = nav_link(controller: %w(tree blob blame edit_tree new_tree find_file)) do = link_to project_files_path(@project) do Files @@ -25,4 +26,5 @@ = nav_link(controller: [:tags, :releases]) do = link_to namespace_project_tags_path(@project.namespace, @project) do Tags - .fade-right + %li.fade-right + = icon('arrow-right') diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 76ba0bea36..51ca4eb903 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -23,21 +23,18 @@ Create Merge Request .control - = form_tag(namespace_project_commits_path(@project.namespace, @project, @id), method: :get, class: 'pull-left commits-search-form') do - = search_field_tag :search, params[:search], { placeholder: 'Filter by commit message', id: 'commits-search', class: 'form-control search-text-input', spellcheck: false } - + = form_tag(namespace_project_commits_path(@project.namespace, @project, @id), method: :get, class: 'commits-search-form') do + = search_field_tag :search, params[:search], { placeholder: 'Filter by commit message', id: 'commits-search', class: 'form-control search-text-input input-short', spellcheck: false } - if current_user && current_user.private_token .control = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'btn' do = icon("rss") - - %ul.breadcrumb.repo-breadcrumb = commits_breadcrumbs %div{id: dom_id(@project)} - #commits-list.content_list= render "commits", project: @project - .clear + %ol#commits-list.list-unstyled.content_list + = render "commits", project: @project = spinner :javascript diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml index c322942aeb..b22285c11e 100644 --- a/app/views/projects/compare/index.html.haml +++ b/app/views/projects/compare/index.html.haml @@ -3,7 +3,7 @@ = render "projects/commits/head" %div{ class: (container_class) } - .row-content-block.second-block.content-component-block + .sub-header-block Compare branches, tags or commit ranges. %br Fill input field with commit id like diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml index cdc34f51d6..f4ec7b767f 100644 --- a/app/views/projects/compare/show.html.haml +++ b/app/views/projects/compare/show.html.haml @@ -1,24 +1,24 @@ +- @no_container = true - page_title "#{params[:from]}...#{params[:to]}" = render "projects/commits/head" +%div{ class: (container_class) } + .sub-header-block.no-bottom-space + = render "form" -.row-content-block - = render "form" - -- if @commits.present? - .prepend-top-default + - if @commits.present? = render "projects/commits/commit_list" = render "projects/diffs/diffs", diffs: @diffs, project: @project, diff_refs: @diff_refs -- else - .light-well.prepend-top-default - .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. + - 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/container_registry/_tag.html.haml b/app/views/projects/container_registry/_tag.html.haml index f35faa6afb..10822b6184 100644 --- a/app/views/projects/container_registry/_tag.html.haml +++ b/app/views/projects/container_registry/_tag.html.haml @@ -3,9 +3,9 @@ = escape_once(tag.name) = clipboard_button(clipboard_text: "docker pull #{tag.path}") %td - - if layer = tag.layers.first - %span.has-tooltip{ title: "#{layer.revision}" } - = layer.short_revision + - if tag.revision + %span.has-tooltip{ title: "#{tag.revision}" } + = tag.short_revision - else \- %td diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml index 6c11afbe42..f18bc8c41b 100644 --- a/app/views/projects/diffs/_diffs.html.haml +++ b/app/views/projects/diffs/_diffs.html.haml @@ -11,6 +11,8 @@ = commit_diff_whitespace_link(@project, @commit, class: 'hidden-xs') - elsif current_controller?(:merge_requests) = diff_merge_request_whitespace_link(@project, @merge_request, class: 'hidden-xs') + - elsif current_controller?(:compare) + = diff_compare_whitespace_link(@project, params[:from], params[:to], class: 'hidden-xs') .btn-group = inline_diff_btn = parallel_diff_btn diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 8449fe1e4e..27a94fe02d 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -120,6 +120,42 @@ = link_to 'Housekeeping', housekeeping_namespace_project_path(@project.namespace, @project), method: :post, class: "btn btn-save" %hr + .row.prepend-top-default + .col-lg-3 + %h4.prepend-top-0 + Export project + %p.append-bottom-0 + %p + Export this project with all its related data in order to move your project to a new GitLab instance. Once the export is finished, you can import the file from the "New Project" page. + %p + Once the exported file is ready, you will receive a notification email with a download link. + + .col-lg-9 + + - if @project.export_project_path + = link_to 'Download export', download_export_namespace_project_path(@project.namespace, @project), + method: :get, class: "btn btn-default" + = link_to 'Generate new export', generate_new_export_namespace_project_path(@project.namespace, @project), + method: :post, class: "btn btn-default" + - else + = link_to 'Export project', export_namespace_project_path(@project.namespace, @project), + method: :post, class: "btn btn-default" + + .bs-callout.bs-callout-info + %p.append-bottom-0 + %p + The following items will be exported: + %ul + %li Project and wiki repositories + %li Project uploads + %li Project configuration including web hooks and services + %li Issues with comments, merge requests with diffs and comments, labels, milestones, snippets, and other project entities + %p + The following items will NOT be exported: + %ul + %li Build traces and artifacts + %li LFS objects + %hr - if can? current_user, :archive_project, @project .row.prepend-top-default .col-lg-3 diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index ae9e77e7d8..a03f117291 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -3,16 +3,24 @@ = render "projects/pipelines/head" %div{ class: (container_class) } - - if can?(current_user, :create_environment, @project) + - if can?(current_user, :create_environment, @project) && !@environments.blank? .top-area .nav-controls = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do New environment - if @environments.blank? - %ul.content-list.environments - %li.nothing-here-block - No environments to show + .blank-state.blank-state-no-icon + %h2.blank-state-title + You don't have any environments right now. + %p.blank-state-text + Environments are places where code gets deployed, such as staging or production. + %br + = succeed "." do + = link_to "Read more about environments", help_page_path("ci", "environments") + - if can?(current_user, :create_environment, @project) + = link_to new_namespace_project_environment_path(@project.namespace, @project), class: 'btn btn-create' do + New environment - else .table-holder %table.table.environments diff --git a/app/views/projects/environments/new.html.haml b/app/views/projects/environments/new.html.haml index 54465828ba..da325efecd 100644 --- a/app/views/projects/environments/new.html.haml +++ b/app/views/projects/environments/new.html.haml @@ -4,6 +4,9 @@ .col-lg-3 %h4.prepend-top-0 New Environment - %p Environments allow you to track deployments of your application + %p + Environments allow you to track deployments of your application + = succeed "." do + = link_to "Read more about environments", help_page_path("ci", "environments") = render 'form' diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index 069b77b5ad..4c15e2759d 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -13,10 +13,14 @@ = link_to 'Destroy', namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to delete this environment?' }, class: 'btn btn-danger', method: :delete - if @deployments.blank? - %ul.content-list.environments - %li.nothing-here-block - No deployments for - %strong= @environment.name + .blank-state.blank-state-no-icon + %h2.blank-state-title + You don't have any deployments right now. + %p.blank-state-text + Define environments in the deploy stage(s) in + %code .gitlab-ci.yml + to track deployments here. + = link_to "Read more", help_page_path("ci", "environments"), class: "btn btn-success" - else .table-holder %table.table.environments diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml index 4bcf2d9d53..dbe9ddfde2 100644 --- a/app/views/projects/forks/index.html.haml +++ b/app/views/projects/forks/index.html.haml @@ -40,9 +40,3 @@ = render 'projects', projects: @forks - -- if @private_forks_count > 0 - .private-forks-notice - = icon('lock fw', base: 'circle', class: 'fa-lg private-fork-icon') - %strong= pluralize(@private_forks_count, 'private fork') - %span you have no access to. diff --git a/app/views/projects/graphs/_head.html.haml b/app/views/projects/graphs/_head.html.haml index 8becaea246..a388d9a0a6 100644 --- a/app/views/projects/graphs/_head.html.haml +++ b/app/views/projects/graphs/_head.html.haml @@ -1,12 +1,14 @@ -- page_specific_javascripts asset_path("graphs/application.js") -%ul.nav-links - = 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 - = nav_link(action: :languages) do - = link_to 'Languages', languages_namespace_project_graph_path - - if @project.builds_enabled? - = nav_link(action: :ci) do - = link_to ci_namespace_project_graph_path do - Continuous Integration +.nav-links.sub-nav + %ul{ class: (container_class) } + + - page_specific_javascripts asset_path("graphs/application.js") + = 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 + = nav_link(action: :languages) do + = link_to 'Languages', languages_namespace_project_graph_path + - if @project.builds_enabled? + = nav_link(action: :ci) do + = link_to ci_namespace_project_graph_path do + Continuous Integration diff --git a/app/views/projects/graphs/ci.html.haml b/app/views/projects/graphs/ci.html.haml index 19ccc125ea..e695d3ae36 100644 --- a/app/views/projects/graphs/ci.html.haml +++ b/app/views/projects/graphs/ci.html.haml @@ -1,15 +1,18 @@ +- @no_container = true - page_title "Continuous Integration", "Graphs" = render 'head' -.row-content-block.append-bottom-default - .oneline - A collection of graphs for Continuous Integration -#charts.ci-charts - .row - .col-md-6 - = render 'projects/graphs/ci/overall' - .col-md-6 - = render 'projects/graphs/ci/build_times' +%div{ class: (container_class) } + .sub-header-block + .oneline + A collection of graphs for Continuous Integration - %hr - = render 'projects/graphs/ci/builds' + #charts.ci-charts + .row + .col-md-6 + = render 'projects/graphs/ci/overall' + .col-md-6 + = render 'projects/graphs/ci/build_times' + + %hr + = render 'projects/graphs/ci/builds' diff --git a/app/views/projects/graphs/commits.html.haml b/app/views/projects/graphs/commits.html.haml index d9b2fb6c06..0daffe68f6 100644 --- a/app/views/projects/graphs/commits.html.haml +++ b/app/views/projects/graphs/commits.html.haml @@ -1,52 +1,54 @@ +- @no_container = true - page_title "Commits", "Graphs" = render 'head' -.row-content-block.append-bottom-default - .tree-ref-holder - = render 'shared/ref_switcher', destination: 'graphs_commits' - %ul.breadcrumb.repo-breadcrumb - = commits_breadcrumbs +%div{ class: (container_class) } + .sub-header-block + .tree-ref-holder + = render 'shared/ref_switcher', destination: 'graphs_commits' + %ul.breadcrumb.repo-breadcrumb + = commits_breadcrumbs -%p.lead - Commit statistics for - %strong #{@ref} - #{@commits_graph.start_date.strftime('%b %d')} - #{@commits_graph.end_date.strftime('%b %d')} + %p.lead + Commit statistics for + %strong #{@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 -.row - .col-md-6 - %div - %p.slead - Commits per day hour (UTC) - %canvas#hour-chart - .col-md-6 - %div - %p.slead - Commits per weekday - %canvas#weekday-chart + .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 + .row + .col-md-6 + %div + %p.slead + Commits per day hour (UTC) + %canvas#hour-chart + .col-md-6 + %div + %p.slead + Commits per weekday + %canvas#weekday-chart :javascript var responsiveChart = function (selector, data) { diff --git a/app/views/projects/graphs/languages.html.haml b/app/views/projects/graphs/languages.html.haml index 249c16f470..6d97f552a8 100644 --- a/app/views/projects/graphs/languages.html.haml +++ b/app/views/projects/graphs/languages.html.haml @@ -1,24 +1,26 @@ +- @no_container = true - page_title "Languages", "Graphs" = render 'head' -.row-content-block.append-bottom-default - .oneline - Programming languages used in this repository +%div{ class: (container_class) } + .sub-header-block + .oneline + Programming languages used in this repository -.row - .col-md-8 - %canvas#languages-chart{ height: 400 } - .col-md-4 - %ul.bordered-list - - @languages.each do |language| - %li - %span{ style: "color: #{language[:color]}" } - = icon('circle') -   - = language[:label] - .pull-right - = language[:value] - \% + .row + .col-md-8 + %canvas#languages-chart{ height: 400 } + .col-md-4 + %ul.bordered-list + - @languages.each do |language| + %li + %span{ style: "color: #{language[:color]}" } + = icon('circle') +   + = language[:label] + .pull-right + = language[:value] + \% :javascript var data = #{@languages.to_json}; diff --git a/app/views/projects/graphs/show.html.haml b/app/views/projects/graphs/show.html.haml index 33970e7b90..9f7e2a361f 100644 --- a/app/views/projects/graphs/show.html.haml +++ b/app/views/projects/graphs/show.html.haml @@ -1,29 +1,31 @@ +- @no_container = true - page_title "Contributors", "Graphs" = render 'head' -.row-content-block.append-bottom-default - .tree-ref-holder - = render 'shared/ref_switcher', destination: 'graphs' - %ul.breadcrumb.repo-breadcrumb - = commits_breadcrumbs +%div{ class: (container_class) } + .sub-header-block + .tree-ref-holder + = render 'shared/ref_switcher', destination: 'graphs' + %ul.breadcrumb.repo-breadcrumb + = commits_breadcrumbs -.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. + .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 #{@ref}, excluding merge commits. Limited to 6,000 commits. - %input#brush_change{:type => "hidden"} - .graphs - #contributors-master - #contributors.clearfix - %ol.contributors-list.clearfix + .stat-graph.hide + .header.clearfix + %h3#date_header.page-title + %p.light + Commits to #{@ref}, excluding merge commits. Limited to 6,000 commits. + %input#brush_change{:type => "hidden"} + .graphs.row + #contributors-master + #contributors.clearfix + %ol.contributors-list.clearfix diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index c0d1ce0d12..4d8ee562e6 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -7,7 +7,7 @@ Forking in progress. - else Import in progress. - - unless @project.forked? + - if @project.external_import? %p.monospace git clone --bare #{@project.safe_import_url} %p Please wait while we import the repository for you. Refresh at will. :javascript diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index b151393aba..c2f4457b60 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -1,7 +1,7 @@ - content_for :note_actions do - if can?(current_user, :update_issue, @issue) - = link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true, original_text: "Reopen issue", alternative_text: "Comment & reopen issue"}, class: "btn btn-nr btn-grouped btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue' - = link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true, original_text: "Close issue", alternative_text: "Comment & close issue"}, class: "btn btn-nr btn-grouped btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue' + = link_to 'Reopen issue', issue_path(@issue, issue: {state_event: :reopen}, status_only: true, format: 'json'), data: {no_turbolink: true, original_text: "Reopen issue", alternative_text: "Comment & reopen issue"}, class: "btn btn-nr btn-reopen btn-comment js-note-target-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue' + = link_to 'Close issue', issue_path(@issue, issue: {state_event: :close}, status_only: true, format: 'json'), data: {no_turbolink: true, original_text: "Close issue", alternative_text: "Comment & close issue"}, class: "btn btn-nr btn-close btn-comment js-note-target-close #{issue_button_visibility(@issue, true)}", title: 'Close issue' #notes = render 'projects/notes/notes_with_form' diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index 6e1baa46b0..aa4d69550e 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -4,9 +4,10 @@ = render "projects/issues/head" %div{ class: (container_class) } - .top-area + .top-area.adjust .nav-text - Labels can be applied to issues and merge requests. + Labels can be applied to issues and merge requests. Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging. + .nav-controls - if can?(current_user, :admin_label, @project) = link_to new_namespace_project_label_path(@project.namespace, @project), class: "btn btn-new" do @@ -19,10 +20,9 @@ .prioritized-labels{ class: ('hide' if hide) } %h5 Prioritized Labels %ul.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_namespace_project_labels_path(@project.namespace, @project) } + %p.empty-message{ class: ('hidden' unless @prioritized_labels.empty?) } No prioritized labels yet - if @prioritized_labels.present? = render @prioritized_labels - - else - %p.empty-message No prioritized labels yet .other-labels - if can?(current_user, :admin_label, @project) %h5{ class: ('hide' if hide) } Other Labels diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 393998f15b..53dd300c35 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -1,8 +1,8 @@ - content_for :note_actions do - if can?(current_user, :update_merge_request, @merge_request) - if @merge_request.open? - = link_to 'Close merge request', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-nr btn-comment btn-grouped btn-close close-mr-link js-note-target-close", title: "Close merge request", data: {original_text: "Close merge request", alternative_text: "Comment & close merge request"} + = link_to 'Close merge request', merge_request_path(@merge_request, merge_request: {state_event: :close }), method: :put, class: "btn btn-nr btn-comment btn-close close-mr-link js-note-target-close", title: "Close merge request", data: {original_text: "Close merge request", alternative_text: "Comment & close merge request"} - if @merge_request.closed? - = link_to 'Reopen merge request', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-nr btn-comment btn-grouped btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request", data: {original_text: "Reopen merge request", alternative_text: "Comment & reopen merge request"} + = link_to 'Reopen merge request', merge_request_path(@merge_request, merge_request: {state_event: :reopen }), method: :put, class: "btn btn-nr btn-comment btn-reopen reopen-mr-link js-note-target-reopen", title: "Reopen merge request", data: {original_text: "Reopen merge request", alternative_text: "Comment & reopen merge request"} #notes= render "projects/notes/notes_with_form" diff --git a/app/views/projects/merge_requests/_new_compare.html.haml b/app/views/projects/merge_requests/_new_compare.html.haml index b08524574e..de39964fca 100644 --- a/app/views/projects/merge_requests/_new_compare.html.haml +++ b/app/views/projects/merge_requests/_new_compare.html.haml @@ -21,7 +21,7 @@ selected: f.object.source_project_id .merge-request-select.dropdown = f.hidden_field :source_branch - = dropdown_toggle "Select source branch", { toggle: "dropdown", field_name: "#{f.object_name}[source_branch]" }, { toggle_class: "js-compare-dropdown js-source-branch" } + = dropdown_toggle f.object.source_branch || "Select source branch", { toggle: "dropdown", field_name: "#{f.object_name}[source_branch]" }, { toggle_class: "js-compare-dropdown js-source-branch" } .dropdown-menu.dropdown-menu-selectable.dropdown-source-branch = dropdown_title("Select source branch") = dropdown_filter("Search branches") diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index c4df8bd504..2ec96308fd 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -17,11 +17,11 @@ = link_to "#modal_merge_info", class: "btn inline btn-grouped btn-sm", "data-toggle" => "modal" do Check out branch - %span.dropdown + %span.dropdown.inline.prepend-left-5 %a.btn.btn-sm.dropdown-toggle{ data: {toggle: :dropdown} } Download as %span.caret - %ul.dropdown-menu + %ul.dropdown-menu.dropdown-menu-align-right %li= link_to "Email Patches", merge_request_path(@merge_request, format: :patch) %li= link_to "Plain Diff", merge_request_path(@merge_request, format: :diff) .normal @@ -37,7 +37,7 @@ = render "projects/merge_requests/widget/show.html.haml" - if @merge_request.source_branch_exists? && @merge_request.mergeable? && @merge_request.can_be_merged_by?(current_user) - .light.prepend-top-default + .light.prepend-top-default.append-bottom-default You can also accept this merge request manually using the = succeed '.' do = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" diff --git a/app/views/projects/merge_requests/show/_commits.html.haml b/app/views/projects/merge_requests/show/_commits.html.haml index a8f09f855d..0b05785430 100644 --- a/app/views/projects/merge_requests/show/_commits.html.haml +++ b/app/views/projects/merge_requests/show/_commits.html.haml @@ -2,4 +2,5 @@ = icon("sort-amount-desc") Most recent commits displayed first -= render "projects/commits/commits", project: @merge_request.project +%ol#commits-list.list-unstyled + = render "projects/commits/commits", project: @merge_request.project 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 index 0dbd159298..b3bea900d4 100644 --- a/app/views/projects/merge_requests/show/_how_to_merge.html.haml +++ b/app/views/projects/merge_requests/show/_how_to_merge.html.haml @@ -8,7 +8,7 @@ %p %strong Step 1. Fetch and check out the branch for this merge request - = clipboard_button(clipboard_target: 'pre#merge-info-1') + = clipboard_button_with_class({clipboard_target: "pre#merge-info-1"}, css_class: "btn-clipboard") %pre.dark#merge-info-1 - if @merge_request.for_fork? :preserve @@ -25,7 +25,7 @@ %p %strong Step 3. Merge the branch and fix any conflicts that come up - = clipboard_button(clipboard_target: 'pre#merge-info-3') + = clipboard_button_with_class({clipboard_target: "pre#merge-info-3"}, css_class: "btn-clipboard") %pre.dark#merge-info-3 - if @merge_request.for_fork? :preserve @@ -38,7 +38,7 @@ %p %strong Step 4. Push the result of the merge to GitLab - = clipboard_button(clipboard_target: 'pre#merge-info-4') + = clipboard_button_with_class({clipboard_target: "pre#merge-info-4"}, css_class: "btn-clipboard") %pre.dark#merge-info-4 :preserve git push origin #{h @merge_request.target_branch} diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index f5e2b927da..cbf1ba0417 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -19,6 +19,7 @@ = f.label :due_date, "Due Date", class: "control-label" .col-sm-10 = f.text_field :due_date, class: "datepicker form-control", placeholder: "Select due date" + %a.inline.prepend-top-5.js-clear-due-date{ href: "#" } Clear due date .form-actions - if @milestone.new_record? @@ -27,10 +28,3 @@ -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 - $(".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())); diff --git a/app/views/projects/network/show.html.haml b/app/views/projects/network/show.html.haml index bf9baaea88..e4ab064eda 100644 --- a/app/views/projects/network/show.html.haml +++ b/app/views/projects/network/show.html.haml @@ -1,4 +1,5 @@ - page_title "Network", @ref +- page_specific_javascripts asset_path("network/application.js") = render "projects/commits/head" = render "head" %div{ class: (container_class) } @@ -14,14 +15,5 @@ = check_box_tag :filter_ref, 1, @options[:filter_ref] %span Begin with the selected commit - .network-graph + .network-graph{ data: { url: '#{escape_javascript(@url)}', commit_url: '#{escape_javascript(@commit_url)}', ref: '#{escape_javascript(@ref)}', commit_id: '#{escape_javascript(@commit.id)}' } } = spinner nil, true - -:javascript - network_graph = new Network({ - url: "#{escape_javascript(@url)}", - commit_url: "#{escape_javascript(@commit_url)}", - ref: "#{escape_javascript(@ref)}", - commit_id: '#{@commit.id}' - }) - new ShortcutsNetwork(network_graph.branch_graph) diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index f9ac16b32f..3c1c606050 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -11,26 +11,22 @@ .project-edit-content = form_for @project, html: { class: 'new_project form-horizontal js-requires-input' } do |f| - .form-group.project-name-holder + .form-group = f.label :path, class: 'control-label' do - Project path + Project owner .col-sm-10 - .input-group - - if current_user.can_select_namespace? - .input-group-addon - = root_url - = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user, display_path: true), {}, {class: 'select2 js-select-namespace', tabindex: 1} - .input-group-addon - \/ - - else - .input-group-addon - #{root_url}#{current_user.username}/ - = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 2, autofocus: true, required: true - + = f.select :namespace_id, namespaces_options(:current_user), {}, {class: 'select2 js-select-namespace', tabindex: 1} + - if current_user.can_create_group? .help-block Want to house several dependent projects under the same namespace? = link_to "Create a group", new_group_path + + .form-group + = f.label :path, class: 'control-label' do + Project name + .col-sm-10 + = f.text_field :path, placeholder: "my-awesome-project", class: "form-control", tabindex: 2, autofocus: true, required: true - if import_sources_enabled? .project-import.js-toggle-container @@ -88,7 +84,12 @@ - if git_import_enabled? = link_to "#", class: 'btn js-toggle-button import_git' do %i.fa.fa-git - %span Any repo by URL + %span Repo by URL + + - if gitlab_project_import_enabled? + = link_to new_import_gitlab_project_path, class: 'btn import_gitlab_project project-submit' do + %i.fa.fa-gitlab + %span GitLab export .js-toggle-content.hide = render "shared/import_form", f: f @@ -119,6 +120,33 @@ e.preventDefault(); var import_modal = $(this).next(".modal").show(); }); + $('.modal-header .close').bind('click', function() { $(".modal").hide(); }); + + $('.import_gitlab_project').bind('click', function() { + var _href = $("a.import_gitlab_project").attr("href"); + $(".import_gitlab_project").attr("href", _href + '?namespace_id=' + $("#project_namespace_id").val() + '&path=' + $("#project_path").val()); + }); + + $('.import_gitlab_project').attr('disabled',true) + $('.import_gitlab_project').attr('title', 'Project path required.'); + + $('.import_gitlab_project').click(function( event ) { + if($('.import_gitlab_project').attr('disabled')) { + event.preventDefault(); + new Flash("Please enter a path for the project to be imported to."); + } + }); + + $('#project_path').keyup(function(){ + if($(this).val().length !=0) { + $('.import_gitlab_project').attr('disabled', false); + $('.import_gitlab_project').attr('title',''); + $(".flash-container").html("") + } else { + $('.import_gitlab_project').attr('disabled',true); + $('.import_gitlab_project').attr('title', 'Project path required.'); + } + }) diff --git a/app/views/projects/notes/_edit_form.html.haml b/app/views/projects/notes/_edit_form.html.haml index c87a3fadf7..8620f49228 100644 --- a/app/views/projects/notes/_edit_form.html.haml +++ b/app/views/projects/notes/_edit_form.html.haml @@ -6,6 +6,6 @@ = render 'projects/notes/hints' .note-form-actions.clearfix - = f.submit 'Save Comment', class: 'btn btn-nr btn-save btn-grouped js-comment-button' + = f.submit 'Save Comment', class: 'btn btn-nr btn-save js-comment-button' %button.btn.btn-nr.btn-cancel.note-edit-cancel{ type: 'button' } Cancel diff --git a/app/views/projects/notes/_form.html.haml b/app/views/projects/notes/_form.html.haml index 67ed38a7b2..03b3f6935d 100644 --- a/app/views/projects/notes/_form.html.haml +++ b/app/views/projects/notes/_form.html.haml @@ -14,7 +14,7 @@ .error-alert .note-form-actions.clearfix - = f.submit 'Comment', class: "btn btn-nr btn-create comment-btn btn-grouped js-comment-button" + = f.submit 'Comment', class: "btn btn-nr btn-create append-right-10 comment-btn js-comment-button" = yield(:note_actions) %a.btn.btn-cancel.js-note-discard{role: "button", data: {cancel_text: "Cancel"}} Discard draft diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index bcdbff0801..c04d291412 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -18,9 +18,9 @@ = time_ago_with_tooltip(note.created_at, placement: 'bottom', html_class: 'note-created-ago') .note-actions - access = note.project.team.human_max_access(note.author.id) - - if access + - if access and not note.system %span.note-role.hidden-xs= access - - if current_user + - if current_user and not note.system = link_to '#', title: 'Award Emoji', class: 'note-action-button note-emoji-button js-add-award js-note-emoji', data: { position: 'right' } do = icon('spinner spin') = icon('smile-o') diff --git a/app/views/projects/project_members/update.js.haml b/app/views/projects/project_members/update.js.haml index 2fb3a41d54..45f8ef8906 100644 --- a/app/views/projects/project_members/update.js.haml +++ b/app/views/projects/project_members/update.js.haml @@ -1,2 +1,2 @@ :plain - $("##{dom_id(@project_member)}").replaceWith('#{escape_javascript(render("project_member", member: @project_member))}'); + $("##{dom_id(@project_member)}").replaceWith('#{escape_javascript(render('shared/members/member', member: @project_member))}'); diff --git a/app/views/projects/runners/_form.html.haml b/app/views/projects/runners/_form.html.haml index d62f5c8f13..c45a9d4f81 100644 --- a/app/views/projects/runners/_form.html.haml +++ b/app/views/projects/runners/_form.html.haml @@ -12,6 +12,12 @@ .checkbox = f.check_box :run_untagged %span.light Indicates whether this runner can pick jobs without tags + .form-group + = label :locked, 'Lock to current projects', class: 'control-label' + .col-sm-10 + .checkbox + = f.check_box :locked + %span.light When a runner is locked, it cannot be assigned to other projects .form-group = label_tag :token, class: 'control-label' do Token diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml index 96e2aac451..8522585775 100644 --- a/app/views/projects/runners/_runner.html.haml +++ b/app/views/projects/runners/_runner.html.haml @@ -2,8 +2,10 @@ %h4 = runner_status_icon(runner) %span.monospace - - if @runners.include?(runner) + - if @project_runners.include?(runner) = link_to runner.short_sha, runner_path(runner) + - if runner.locked? + = icon('lock', class: 'has-tooltip', title: 'Locked to current projects') %small = link_to edit_namespace_project_runner_path(@project.namespace, @project, runner) do %i.fa.fa-edit.btn @@ -11,7 +13,7 @@ = runner.short_sha .pull-right - - if @runners.include?(runner) + - if @project_runners.include?(runner) - if runner.belongs_to_one_project? = link_to 'Remove runner', runner_path(runner), data: { confirm: "Are you sure?" }, method: :delete, class: 'btn btn-danger btn-sm' - else diff --git a/app/views/projects/runners/_specific_runners.html.haml b/app/views/projects/runners/_specific_runners.html.haml index 8ae9f0d95f..d469dda5b8 100644 --- a/app/views/projects/runners/_specific_runners.html.haml +++ b/app/views/projects/runners/_specific_runners.html.haml @@ -17,13 +17,13 @@ Start runner! -- if @runners.any? +- if @project_runners.any? %h4.underlined-title Runners activated for this project %ul.bordered-list.activated-specific-runners - = render partial: 'runner', collection: @runners, as: :runner + = render partial: 'runner', collection: @project_runners, as: :runner -- if @specific_runners.any? +- if @assignable_runners.any? %h4.underlined-title Available specific runners %ul.bordered-list.available-specific-runners - = render partial: 'runner', collection: @specific_runners, as: :runner - = paginate @specific_runners + = render partial: 'runner', collection: @assignable_runners, as: :runner + = paginate @assignable_runners diff --git a/app/views/projects/runners/show.html.haml b/app/views/projects/runners/show.html.haml index f24e1b9144..61b99f35d7 100644 --- a/app/views/projects/runners/show.html.haml +++ b/app/views/projects/runners/show.html.haml @@ -22,6 +22,9 @@ %tr %td Can run untagged jobs %td= @runner.run_untagged? ? 'Yes' : 'No' + %tr + %td Locked to this project + %td= @runner.locked? ? 'Yes' : 'No' %tr %td Tags %td diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 4afa902b4e..15f0d85194 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -23,10 +23,10 @@ #{'Commit'.pluralize(@project.commit_count)} (#{number_with_delimiter(@project.commit_count)}) %li = link_to namespace_project_branches_path(@project.namespace, @project) do - #{'Branch'.pluralize(@repository.branch_names.count)} (#{number_with_delimiter(@repository.branch_names.count)}) + #{'Branch'.pluralize(@repository.branch_count)} (#{number_with_delimiter(@repository.branch_count)}) %li = link_to namespace_project_tags_path(@project.namespace, @project) do - #{'Tag'.pluralize(@repository.tag_names.count)} (#{number_with_delimiter(@repository.tag_names.count)}) + #{'Tag'.pluralize(@repository.tag_count)} (#{number_with_delimiter(@repository.tag_count)}) - if default_project_view != 'readme' && @repository.readme %li @@ -57,6 +57,10 @@ %li.missing = link_to add_special_file_path(@project, file_name: 'CONTRIBUTING.md', commit_message: 'Add contribution guide') do Add Contribution guide + - unless @repository.gitlab_ci_yml + %li.missing + = link_to add_special_file_path(@project, file_name: '.gitlab-ci.yml') do + Set Up CI - if @repository.commit .content-block.second-block.white diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 844e105581..2c11c0e5b2 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -15,7 +15,7 @@ = render 'projects/tags/download', ref: tag.name, project: @project - if can?(current_user, :push_code, @project) - = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, tag.name), class: 'btn has-tooltip', title: "Edit release notes" do + = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, tag.name), class: 'btn has-tooltip', title: "Edit release notes", data: { container: "body" } do = icon("pencil") - if can?(current_user, :admin_project, @project) diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index 2779084fe3..4ca1f58ac5 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -11,12 +11,23 @@ .nav-controls = link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do New tag + .dropdown.inline + %button.dropdown-toggle.btn{ type: 'button', data: { toggle: 'dropdown'} } + %span.light= @sort.humanize + %b.caret + %ul.dropdown-menu.dropdown-menu-align-right + %li + = link_to namespace_project_tags_path(sort: nil) do + Name + = link_to namespace_project_tags_path(sort: sort_value_recently_updated) do + = sort_title_recently_updated + = link_to namespace_project_tags_path(sort: sort_value_oldest_updated) do + = sort_title_oldest_updated .tags - unless @tags.empty? %ul.content-list - - @tags.each do |tag| - = render 'tag', tag: @repository.find_tag(tag) + = render partial: 'tag', collection: @tags = paginate @tags, theme: 'gitlab' diff --git a/app/views/projects/tree/_blob_item.html.haml b/app/views/projects/tree/_blob_item.html.haml index 2ddc5d504f..a3a4dba3fa 100644 --- a/app/views/projects/tree/_blob_item.html.haml +++ b/app/views/projects/tree/_blob_item.html.haml @@ -1,8 +1,9 @@ %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)) + - file_name = blob_item.name + = link_to namespace_project_blob_path(@project.namespace, @project, tree_join(@id || @commit.id, blob_item.name)), title: file_name do + %span.str-truncated= file_name %td.tree_time_ago.cgray = render 'projects/tree/spinner' %td.hidden-xs.tree_commit diff --git a/app/views/projects/tree/_tree_item.html.haml b/app/views/projects/tree/_tree_item.html.haml index cf65057e70..9577696fc0 100644 --- a/app/views/projects/tree/_tree_item.html.haml +++ b/app/views/projects/tree/_tree_item.html.haml @@ -1,9 +1,9 @@ %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)) + - path = flatten_tree(tree_item) + = link_to namespace_project_tree_path(@project.namespace, @project, tree_join(@id || @commit.id, path)), title: path do + %span.str-truncated= path %td.tree_time_ago.cgray = render 'projects/tree/spinner' %td.hidden-xs.tree_commit diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 4faa547769..4ea75dbbf0 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,4 +1,7 @@ - if (@page && @page.persisted?) + - if can?(current_user, :create_wiki, @project) + = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do + New Page = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn" do Page History - if can?(current_user, :create_wiki, @project) diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index 988fe024e2..f8ea479e0b 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -1,5 +1,5 @@ -.top-area - %ul.nav-links +.nav-links.sub-nav + %ul{ class: (container_class) } = nav_link(html_options: {class: params[:id] == 'home' ? 'active' : '' }) do = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) @@ -10,9 +10,4 @@ = link_to namespace_project_wikis_git_access_path(@project.namespace, @project) do Git Access - .nav-controls - - if can?(current_user, :create_wiki, @project) - = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do - New Page - -= render 'projects/wikis/new' + = render 'projects/wikis/new' diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index 919daf0a7b..4f8abcdc8e 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -1,14 +1,17 @@ -%div#modal-new-wiki.modal - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3.page-title New Wiki Page - .modal-body - %form.new-wiki-page - .form-group - = 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), autofocus: true - .form-actions - = button_tag 'Create Page', class: 'build-new-wiki btn btn-create' +- @no_container = true + +%div{ class: (container_class) } + %div#modal-new-wiki.modal + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3.page-title New Wiki Page + .modal-body + %form.new-wiki-page + .form-group + = 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), autofocus: true + .form-actions + = button_tag 'Create Page', 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 index cbd69ee1a7..bf5d09d50c 100644 --- a/app/views/projects/wikis/edit.html.haml +++ b/app/views/projects/wikis/edit.html.haml @@ -1,19 +1,24 @@ +- @no_container = true - page_title "Edit", @page.title.capitalize, "Wiki" = render 'nav' -.top-area - .nav-text.wiki-page - %strong - - if @page.persisted? - = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) - - else - = @page.title.capitalize - %span.light - · - Edit Page +%div{ class: (container_class) } + .top-area + .nav-text + %strong + - if @page.persisted? + = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) + - else + = @page.title.capitalize + %span.light + · + Edit Page - .nav-controls - = render 'main_links' + .nav-controls + - if can?(current_user, :create_wiki, @project) + = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do + New Page + = render 'main_links' -= render 'form' + = render 'form' diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index ccceab6155..6caf7230f3 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -1,32 +1,34 @@ +- @no_container = true - page_title "Git Access", "Wiki" = render 'nav' -.row-content-block - %span.oneline - Git access for - %strong= @project_wiki.path_with_namespace +%div{ class: (container_class) } + .sub-header-block + %span.oneline + Git access for + %strong= @project_wiki.path_with_namespace - .pull-right - = render "shared/clone_panel", project: @project_wiki + .pull-right + = render "shared/clone_panel", project: @project_wiki -.git-empty.prepend-top-default - %fieldset - %legend Install Gollum: - %pre.dark - :preserve - gem install gollum + .prepend-top-default + %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 #{h @project_wiki.path} + %legend Clone Your Wiki: + %pre.dark + :preserve + git clone #{ content_tag(:span, default_url_to_repo(@project_wiki), class: 'clone')} + cd #{h @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 + %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 index 45460ed9f4..630ee35b70 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,37 +1,37 @@ - page_title "History", @page.title.capitalize, "Wiki" = render 'nav' +%div{ class: (container_class) } + .top-area + .nav-text + %strong + = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) + %span.light + · + History -.top-area - .nav-text - %strong - = link_to @page.title.capitalize, namespace_project_wiki_path(@project.namespace, @project, @page) - %span.light - · - History - -.table-holder - %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 + .table-holder + %table.table + %thead %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) + %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 index 2f6162fa3c..81d9f391c1 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -1,12 +1,14 @@ +- @no_container = true - page_title "Pages", "Wiki" = render 'nav' -%ul.content-list - - @wiki_pages.each do |wiki_page| - %li - = 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' +%div{ class: (container_class) } + %ul.content-list + - @wiki_pages.each do |wiki_page| + %li + = 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 index 9166c0edb3..76f9b1ecd7 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -1,24 +1,26 @@ +- @no_container = true - page_title @page.title.capitalize, "Wiki" = render 'nav' -.top-area - .nav-text - %strong= @page.title.capitalize +%div{ class: (container_class) } + .top-area + .nav-text + %strong= @page.title.capitalize - %span.wiki-last-edit-by - · - last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} + %span.wiki-last-edit-by + · + last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} - .nav-controls - = render 'main_links' + .nav-controls + = 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", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. + - 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", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. -.wiki-holder.prepend-top-default.append-bottom-default - .wiki - = preserve do - = render_wiki_content(@page) + .wiki-holder.prepend-top-default.append-bottom-default + .wiki + = preserve do + = render_wiki_content(@page) diff --git a/app/views/shared/_event_filter.html.haml b/app/views/shared/_event_filter.html.haml index 3005500221..aa18e6f236 100644 --- a/app/views/shared/_event_filter.html.haml +++ b/app/views/shared/_event_filter.html.haml @@ -1,7 +1,9 @@ %ul.nav-links.event-filter.scrolling-tabs - .fade-left + %li.fade-left + = icon('arrow-left') = 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' - .fade-right + %li.fade-right + = icon('arrow-right') diff --git a/app/views/shared/_label_row.html.haml b/app/views/shared/_label_row.html.haml index 478c04318c..77676454b5 100644 --- a/app/views/shared/_label_row.html.haml +++ b/app/views/shared/_label_row.html.haml @@ -1,5 +1,7 @@ %span.label-row - if can?(current_user, :admin_label, @project) + .draggable-handler + = icon('bars') .js-toggle-priority.toggle-priority{ data: { url: remove_priority_namespace_project_label_path(@project.namespace, @project, label), dom_id: dom_id(label) } } %button.add-priority.btn.has-tooltip{ title: 'Prioritize', :'data-placement' => 'top' } diff --git a/app/views/shared/_ref_switcher.html.haml b/app/views/shared/_ref_switcher.html.haml index eb2e1919e1..ea7162d4d6 100644 --- a/app/views/shared/_ref_switcher.html.haml +++ b/app/views/shared/_ref_switcher.html.haml @@ -1,7 +1,14 @@ +- dropdown_toggle_text = @ref || @project.default_branch = 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 + .dropdown + = dropdown_toggle dropdown_toggle_text, { toggle: "dropdown", selected: dropdown_toggle_text, ref: @ref, refs_url: refs_namespace_project_path(@project.namespace, @project) }, { toggle_class: "js-project-refs-dropdown" } + .dropdown-menu.dropdown-menu-selectable{ class: ("dropdown-menu-align-right" if local_assigns[:align_right]) } + = dropdown_title "Switch branch/tag" + = dropdown_filter "Search branches and tags" + = dropdown_content + = dropdown_loading diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 380ab465bf..094d6636c6 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -12,7 +12,7 @@ - if params[:author_id].present? = hidden_field_tag(:author_id, params[:author_id]) = dropdown_tag(user_dropdown_label(params[:author_id], "Author"), options: { toggle_class: "js-user-search js-filter-submit js-author-search", title: "Filter by author", filter: true, dropdown_class: "dropdown-menu-user dropdown-menu-selectable dropdown-menu-author js-filter-submit", - placeholder: "Search authors", data: { any_user: "Any Author", first_user: (current_user.username if current_user), current_user: true, project_id: (@project.id if @project), selected: params[:author], field_name: "author_id", default_label: "Author" } }) + placeholder: "Search authors", data: { any_user: "Any Author", first_user: (current_user.username if current_user), current_user: true, project_id: (@project.id if @project), selected: params[:author_id], field_name: "author_id", default_label: "Author" } }) .filter-item.inline - if params[:assignee_id].present? diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml index 539c4f3630..adfab1af53 100644 --- a/app/views/shared/issuable/_sidebar.html.haml +++ b/app/views/shared/issuable/_sidebar.html.haml @@ -1,4 +1,4 @@ -- todo = has_todo(issuable) +- todo = issuable_todo(issuable) %aside.right-sidebar{ class: sidebar_gutter_collapsed_class } .issuable-sidebar - can_edit_issuable = can?(current_user, :"admin_#{issuable.to_ability_name}", @project) @@ -9,12 +9,12 @@ %a.gutter-toggle.pull-right.js-sidebar-toggle{ role: "button", href: "#", aria: { label: "Toggle sidebar" } } = sidebar_gutter_toggle_icon - if current_user - %button.btn.btn-default.issuable-header-btn.pull-right.js-issuable-todo{ type: "button", aria: { label: (todo.nil? ? "Add Todo" : "Mark Done") }, data: { todo_text: "Add Todo", mark_text: "Mark Done", id: (todo.id unless todo.nil?), issuable: issuable.id, issuable_type: issuable.class.name.underscore, url: namespace_project_todos_path(@project.namespace, @project) } } + %button.btn.btn-default.issuable-header-btn.pull-right.js-issuable-todo{ type: "button", aria: { label: (todo.nil? ? "Add Todo" : "Mark Done") }, data: { todo_text: "Add Todo", mark_text: "Mark Done", issuable_id: issuable.id, issuable_type: issuable.class.name.underscore, url: namespace_project_todos_path(@project.namespace, @project), delete_path: (dashboard_todo_path(todo) if todo) } } %span.js-issuable-todo-text - - if todo.nil? - Add Todo - - else + - if todo Mark Done + - else + Add Todo = icon('spin spinner', class: 'hidden js-issuable-todo-loading') = form_for [@project.namespace.becomes(Namespace), @project, issuable], remote: true, format: :json, html: {class: 'issuable-context-form inline-update js-issuable-update'} do |f| @@ -29,20 +29,21 @@ = icon('spinner spin', class: 'block-loading') - if can_edit_issuable = link_to 'Edit', '#', class: 'edit-link pull-right' - .value.bold.hide-collapsed + .value.hide-collapsed - if issuable.assignee - = link_to_member(@project, issuable.assignee, size: 32) do + = link_to_member(@project, issuable.assignee, size: 32, extra_class: 'bold') do - if issuable.instance_of?(MergeRequest) && !issuable.can_be_merged_by?(issuable.assignee) %span.pull-right.cannot-be-merged{ data: { toggle: 'tooltip', placement: 'left' }, title: 'Not allowed to merge' } = icon('exclamation-triangle') %span.username = issuable.assignee.to_reference - else - %span.assign-yourself + %span.assign-yourself.no-value No assignee - if can_edit_issuable + \- %a.js-assign-yourself{ href: '#' } - \- assign yourself + assign yourself .selectbox.hide-collapsed = f.hidden_field 'assignee_id', value: issuable.assignee_id, id: 'issue_assignee_id' @@ -62,13 +63,11 @@ = icon('spinner spin', class: 'block-loading') - if can_edit_issuable = link_to 'Edit', '#', class: 'edit-link pull-right' - .value.bold.hide-collapsed + .value.hide-collapsed - if issuable.milestone - = link_to namespace_project_milestone_path(@project.namespace, @project, issuable.milestone) do - %span.has-tooltip{title: milestone_remaining_days(issuable.milestone), data: {container: 'body', html: 1}} - = issuable.milestone.title + = link_to issuable.milestone.title, namespace_project_milestone_path(@project.namespace, @project, issuable.milestone), class: "bold has-tooltip", title: milestone_remaining_days(issuable.milestone), data: { container: "body", html: 1 } - else - .light None + %span.no-value None .selectbox.hide-collapsed = f.hidden_field 'milestone_id', value: issuable.milestone_id, id: nil @@ -85,14 +84,14 @@ = icon('spinner spin', class: 'block-loading') - if can?(current_user, :"admin_#{issuable.to_ability_name}", @project) = link_to 'Edit', '#', class: 'edit-link pull-right' - .value.bold.hide-collapsed + .value.hide-collapsed %span.value-content - if issuable.due_date - = issuable.due_date.to_s(:medium) + %span.bold= issuable.due_date.to_s(:medium) - else - None + %span.no-value No due date - if can?(current_user, :"admin_#{issuable.to_ability_name}", @project) - %span.light.js-remove-due-date-holder{ class: ("hidden" if issuable.due_date.nil?) } + %span.no-value.js-remove-due-date-holder{ class: ("hidden" if issuable.due_date.nil?) } \- %a.js-remove-due-date{ href: "#", role: "button" } remove due date @@ -124,7 +123,7 @@ - issuable.labels_array.each do |label| = link_to_label(label, type: issuable.to_ability_name) - else - .light None + %span.no-value None .selectbox.hide-collapsed - issuable.labels_array.each do |label| = hidden_field_tag "#{issuable.to_ability_name}[label_names][]", label.id, id: nil diff --git a/app/views/shared/members/_access_request_buttons.html.haml b/app/views/shared/members/_access_request_buttons.html.haml index ed0a6ebcf8..480e8ba6c8 100644 --- a/app/views/shared/members/_access_request_buttons.html.haml +++ b/app/views/shared/members/_access_request_buttons.html.haml @@ -1,12 +1,14 @@ - member = source.members.find_by(user_id: current_user.id) +- group_member = source.group.members.find_by(user_id: current_user.id) if source.respond_to?(:group) && source.group -- if member - - if member.request? - = link_to 'Withdraw Access Request', polymorphic_path([:leave, source, :members]), - method: :delete, - data: { confirm: remove_member_message(member) }, +- unless group_member + - if member + - if member.request? + = link_to 'Withdraw Access Request', polymorphic_path([:leave, source, :members]), + method: :delete, + data: { confirm: remove_member_message(member) }, + class: 'btn access-request-button hidden-xs' + - else + = link_to 'Request Access', polymorphic_path([:request_access, source, :members]), + method: :post, class: 'btn access-request-button hidden-xs' -- else - = link_to 'Request Access', polymorphic_path([:request_access, source, :members]), - method: :post, - class: 'btn access-request-button hidden-xs' diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml index c69d4cbfbe..a884e78e6e 100644 --- a/app/views/shared/members/_member.html.haml +++ b/app/views/shared/members/_member.html.haml @@ -1,4 +1,4 @@ -- show_roles = local_assigns.fetch(:show_roles, true) +- show_roles = local_assigns.fetch(:show_roles, default_show_roles(member)) - show_controls = local_assigns.fetch(:show_controls, true) - user = member.user @@ -36,7 +36,7 @@ method: :post, class: 'btn-xs btn' - - if show_roles && can_see_member_roles?(source: member.source, user: current_user) + - if show_roles %span.pull-right %strong= member.human_access - if show_controls diff --git a/app/views/shared/milestones/_summary.html.haml b/app/views/shared/milestones/_summary.html.haml index 385c659660..975c74f4ea 100644 --- a/app/views/shared/milestones/_summary.html.haml +++ b/app/views/shared/milestones/_summary.html.haml @@ -10,6 +10,13 @@ open and %strong= milestone.issues_visible_to_user(current_user).closed.size closed + %strong= milestone.merge_requests.size + merge requests: + %span.milestone-stat + %strong= milestone.merge_requests.opened.size + open and + %strong= milestone.merge_requests.merged.size + merged %span.milestone-stat %strong== #{milestone.percent_complete(current_user)}% complete diff --git a/app/views/shared/notifications/_button.html.haml b/app/views/shared/notifications/_button.html.haml new file mode 100644 index 0000000000..ff1cf966a9 --- /dev/null +++ b/app/views/shared/notifications/_button.html.haml @@ -0,0 +1,25 @@ +- left_align = local_assigns[:left_align] +- if notification_setting + .dropdown.notification-dropdown.pull-right + = form_for notification_setting, remote: true, html: { class: "inline notification-form" } do |f| + = hidden_setting_source_input(notification_setting) + = f.hidden_field :level, class: "notification_setting_level" + .js-notification-toggle-btns + %div{ class: ("btn-group" if notification_setting.custom?) } + - if notification_setting.custom? + %button.dropdown-new.btn.btn-default.notifications-btn#notifications-button{ type: "button", data: { toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting) } } + = icon("bell", class: "js-notification-loading") + = notification_title(notification_setting.level) + %button.btn.dropdown-toggle{ data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting) } } + %span.caret + .sr-only Toggle dropdown + - else + %button.dropdown-new.btn.btn-default.notifications-btn#notifications-button{ type: "button", data: { toggle: "dropdown", target: notifications_menu_identifier("dropdown", notification_setting) } } + = icon("bell", class: "js-notification-loading") + = notification_title(notification_setting.level) + = icon("caret-down") + + = render "shared/notifications/notification_dropdown", notification_setting: notification_setting, left_align: left_align + + = content_for :scripts_body do + = render "shared/notifications/custom_notifications", notification_setting: notification_setting diff --git a/app/views/shared/notifications/_custom_notifications.html.haml b/app/views/shared/notifications/_custom_notifications.html.haml new file mode 100644 index 0000000000..b704981e3d --- /dev/null +++ b/app/views/shared/notifications/_custom_notifications.html.haml @@ -0,0 +1,31 @@ +.modal.fade{ tabindex: "-1", role: "dialog", id: notifications_menu_identifier("modal", notification_setting), aria: { labelledby: "custom-notifications-title" } } + .modal-dialog + .modal-content + .modal-header + %button.close{ type: "button", data: { dismiss: "modal" }, aria: { label: "close" } } + %span{ aria: { hidden: "true" } } × + %h4#custom-notifications-title.modal-title + Custom notification events + + .modal-body + .container-fluid + = form_for notification_setting, html: { class: "custom-notifications-form" } do |f| + = hidden_setting_source_input(notification_setting) + .row + .col-lg-4 + %h4.prepend-top-0 + Notification events + %p + Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out + = succeed "." do + %a{ href: "http://docs.gitlab.com/ce/workflow/notifications.html", target: "_blank"} notification emails + .col-lg-8 + - NotificationSetting::EMAIL_EVENTS.each_with_index do |event, index| + - field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]" + .form-group + .checkbox{ class: ("prepend-top-0" if index == 0) } + %label{ for: field_id } + = check_box("notification_setting", event, id: field_id, class: "js-custom-notification-event", checked: notification_setting.events[event]) + %strong + = event.to_s.humanize + = icon("spinner spin", class: "custom-notification-event-loading") diff --git a/app/views/shared/notifications/_notification_dropdown.html.haml b/app/views/shared/notifications/_notification_dropdown.html.haml new file mode 100644 index 0000000000..d3258ee64c --- /dev/null +++ b/app/views/shared/notifications/_notification_dropdown.html.haml @@ -0,0 +1,13 @@ +- left_align = local_assigns[:left_align] +%ul.dropdown-menu.dropdown-menu-no-wrap.dropdown-menu-selectable.dropdown-menu-large{ role: "menu", class: [notifications_menu_identifier("dropdown", notification_setting), ("dropdown-menu-align-right" unless left_align)] } + - NotificationSetting.levels.each_key do |level| + - next if level == "custom" + - next if level == "global" && notification_setting.source.nil? + + = notification_list_item(level, notification_setting) + + %li.divider + %li + %a.update-notification{ href: "#", role: "button", class: ("is-active" if notification_setting.custom?), data: { toggle: "modal", target: "#" + notifications_menu_identifier("modal", notification_setting), notification_level: "custom", notification_title: "Custom" } } + %strong.dropdown-menu-inner-title Custom + %span.dropdown-menu-inner-content= notification_description("custom") diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml index 2e08bb2ac0..3a9dd37dc7 100644 --- a/app/views/shared/projects/_list.html.haml +++ b/app/views/shared/projects/_list.html.haml @@ -16,6 +16,12 @@ = render "shared/projects/project", project: project, skip_namespace: skip_namespace, avatar: avatar, stars: stars, css_class: css_class, ci: ci, use_creator_avatar: use_creator_avatar, forks: forks, show_last_commit_as_description: show_last_commit_as_description + + - if @private_forks_count && @private_forks_count > 0 + %li.project-row.private-forks-notice + = icon('lock fw', base: 'circle', class: 'fa-lg private-fork-icon') + %strong= pluralize(@private_forks_count, 'private fork') + %span you have no access to. = paginate(projects, remote: remote, theme: "gitlab") if projects.respond_to? :total_pages - else .nothing-here-block No projects found diff --git a/app/workers/gitlab_remove_project_export_worker.rb b/app/workers/gitlab_remove_project_export_worker.rb new file mode 100644 index 0000000000..1d91897d52 --- /dev/null +++ b/app/workers/gitlab_remove_project_export_worker.rb @@ -0,0 +1,9 @@ +class GitlabRemoveProjectExportWorker + include Sidekiq::Worker + + sidekiq_options queue: :default + + def perform + Project.remove_gitlab_exports! + end +end diff --git a/app/workers/project_export_worker.rb b/app/workers/project_export_worker.rb new file mode 100644 index 0000000000..39f6037e07 --- /dev/null +++ b/app/workers/project_export_worker.rb @@ -0,0 +1,12 @@ +class ProjectExportWorker + include Sidekiq::Worker + + sidekiq_options queue: :gitlab_shell, retry: true + + def perform(current_user_id, project_id) + current_user = User.find(current_user_id) + project = Project.find(project_id) + + ::Projects::ImportExport::ExportService.new(project, current_user).execute + end +end diff --git a/app/workers/repository_check/single_repository_worker.rb b/app/workers/repository_check/single_repository_worker.rb index f2d12ba5a7..98ddf5d068 100644 --- a/app/workers/repository_check/single_repository_worker.rb +++ b/app/workers/repository_check/single_repository_worker.rb @@ -15,7 +15,7 @@ module RepositoryCheck private def check(project) - if !git_fsck(project.repository) + if has_pushes?(project) && !git_fsck(project.repository) false elsif project.wiki_enabled? # Historically some projects never had their wiki repos initialized; @@ -44,5 +44,9 @@ module RepositoryCheck false end end + + def has_pushes?(project) + Project.with_push.exists?(project.id) + end end end diff --git a/config/application.rb b/config/application.rb index 49d4d3ba55..05fec995ed 100644 --- a/config/application.rb +++ b/config/application.rb @@ -83,6 +83,7 @@ module Gitlab config.assets.precompile << "mailers/*.css" config.assets.precompile << "graphs/application.js" config.assets.precompile << "users/application.js" + config.assets.precompile << "network/application.js" # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0' diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 916fd33e76..c6dc1e4ab3 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -215,7 +215,7 @@ Settings.gitlab.default_projects_features['container_registry'] = true if Settin 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.join(Settings.shared['path'], 'cache/archive') if Settings.gitlab['repository_downloads_path'].nil? Settings.gitlab['restricted_signup_domains'] ||= [] -Settings.gitlab['import_sources'] ||= ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'] +Settings.gitlab['import_sources'] ||= %w[github bitbucket gitlab gitorious google_code fogbugz git gitlab_project] Settings.gitlab['trusted_proxies'] ||= [] @@ -291,6 +291,9 @@ Settings.cron_jobs['admin_email_worker']['job_class'] = 'AdminEmailWorker' Settings.cron_jobs['repository_archive_cache_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['repository_archive_cache_worker']['cron'] ||= '0 * * * *' Settings.cron_jobs['repository_archive_cache_worker']['job_class'] = 'RepositoryArchiveCacheWorker' +Settings.cron_jobs['gitlab_remove_project_export_worker'] ||= Settingslogic.new({}) +Settings.cron_jobs['gitlab_remove_project_export_worker']['cron'] ||= '0 * * * *' +Settings.cron_jobs['gitlab_remove_project_export_worker']['job_class'] = 'GitlabRemoveProjectExportWorker' # # GitLab Shell diff --git a/config/initializers/default_url_options.rb b/config/initializers/default_url_options.rb index 8fd27b1d88..de2cdc6eca 100644 --- a/config/initializers/default_url_options.rb +++ b/config/initializers/default_url_options.rb @@ -9,3 +9,4 @@ unless Gitlab.config.gitlab_on_standard_port? end Rails.application.routes.default_url_options = default_url_options +ActionMailer::Base.asset_host = Settings.gitlab['base_url'] diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index f1eec67488..7a2b9a7f6c 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -23,6 +23,10 @@ Sidekiq.configure_server do |config| config['pool'] = Sidekiq.options[:concurrency] + 2 ActiveRecord::Base.establish_connection(config) Rails.logger.debug("Connection Pool size for Sidekiq Server is now: #{ActiveRecord::Base.connection.pool.instance_variable_get('@size')}") + + # Avoid autoload issue such as 'Mail::Parsers::AddressStruct' + # https://github.com/mikel/mail/issues/912#issuecomment-214850355 + Mail.eager_autoload! end Sidekiq.configure_client do |config| diff --git a/config/routes.rb b/config/routes.rb index d52cbb2242..e45293cdf7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -123,9 +123,17 @@ Rails.application.routes.draw do end end + # # Spam reports + # resources :abuse_reports, only: [:new, :create] + # + # Notification settings + # + resources :notification_settings, only: [:create, :update] + + # # Import # @@ -171,6 +179,10 @@ Rails.application.routes.draw do get :new_user_map, path: :user_map post :create_user_map, path: :user_map end + + resource :gitlab_project, only: [:create, :new] do + post :create + end end # @@ -283,7 +295,7 @@ Rails.application.routes.draw do post :repository_check end - resources :runner_projects + resources :runner_projects, only: [:create, :destroy] end end @@ -348,6 +360,13 @@ Rails.application.routes.draw do resources :keys resources :emails, only: [:index, :create, :destroy] resource :avatar, only: [:destroy] + + resources :personal_access_tokens, only: [:index, :create] do + member do + put :revoke + end + end + resource :two_factor_auth, only: [:show, :create, :destroy] do member do post :create_u2f @@ -421,7 +440,6 @@ Rails.application.routes.draw do resource :avatar, only: [:destroy] resources :milestones, constraints: { id: /[^\/]+/ }, only: [:index, :show, :update, :new, :create] - resource :notification_setting, only: [:update] end end @@ -455,8 +473,13 @@ Rails.application.routes.draw do post :housekeeping post :toggle_star post :markdown_preview + post :export + post :remove_export + post :generate_new_export + get :download_export get :autocomplete_sources get :activity + get :refs end scope module: :projects do @@ -653,7 +676,6 @@ Rails.application.routes.draw do resources :forks, only: [:index, :new, :create] resource :import, only: [:new, :create, :show] - resource :notification_setting, only: [:update] resources :refs, only: [] do collection do @@ -797,7 +819,7 @@ Rails.application.routes.draw do end end - resources :todos, only: [:create, :update], constraints: { id: /\d+/ } + resources :todos, only: [:create] resources :uploads, only: [:create] do collection do diff --git a/db/migrate/20160415062917_create_personal_access_tokens.rb b/db/migrate/20160415062917_create_personal_access_tokens.rb new file mode 100644 index 0000000000..ce0b33f32b --- /dev/null +++ b/db/migrate/20160415062917_create_personal_access_tokens.rb @@ -0,0 +1,13 @@ +class CreatePersonalAccessTokens < ActiveRecord::Migration + def change + create_table :personal_access_tokens do |t| + t.references :user, index: true, foreign_key: true, null: false + t.string :token, index: { unique: true }, null: false + t.string :name, null: false + t.boolean :revoked, default: false + t.datetime :expires_at + + t.timestamps null: false + end + end +end diff --git a/db/migrate/20160509091049_add_locked_to_ci_runner.rb b/db/migrate/20160509091049_add_locked_to_ci_runner.rb new file mode 100644 index 0000000000..3fbaef3b7f --- /dev/null +++ b/db/migrate/20160509091049_add_locked_to_ci_runner.rb @@ -0,0 +1,13 @@ +class AddLockedToCiRunner < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + disable_ddl_transaction! + + def up + add_column_with_default(:ci_runners, :locked, :boolean, + default: false, allow_null: false) + end + + def down + remove_column(:ci_runners, :locked) + end +end diff --git a/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb b/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb new file mode 100644 index 0000000000..bd0463886b --- /dev/null +++ b/db/migrate/20160615191922_set_missing_stage_on_ci_builds.rb @@ -0,0 +1,9 @@ +class SetMissingStageOnCiBuilds < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + def up + update_column_in_batches(:ci_builds, :stage, :test) do |table, query| + query.where(table[:stage].eq(nil)) + end + end +end diff --git a/db/migrate/20160616084004_change_project_of_environment.rb b/db/migrate/20160616084004_change_project_of_environment.rb new file mode 100644 index 0000000000..cc1daf9b62 --- /dev/null +++ b/db/migrate/20160616084004_change_project_of_environment.rb @@ -0,0 +1,21 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class ChangeProjectOfEnvironment < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + change_column_null :environments, :project_id, true + end +end diff --git a/db/migrate/20160616102642_remove_duplicated_keys.rb b/db/migrate/20160616102642_remove_duplicated_keys.rb new file mode 100644 index 0000000000..00a45d7fe7 --- /dev/null +++ b/db/migrate/20160616102642_remove_duplicated_keys.rb @@ -0,0 +1,19 @@ +# rubocop:disable all +class RemoveDuplicatedKeys < ActiveRecord::Migration + def up + select_all("SELECT fingerprint FROM #{quote_table_name(:keys)} GROUP BY fingerprint HAVING COUNT(*) > 1").each do |row| + fingerprint = connection.quote(row['fingerprint']) + execute(%Q{ + DELETE FROM keys + WHERE fingerprint = #{fingerprint} + AND id != ( + SELECT id FROM ( + SELECT max(id) AS id + FROM keys + WHERE fingerprint = #{fingerprint} + ) max_ids + ) + }) + end + end +end diff --git a/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb b/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb new file mode 100644 index 0000000000..4bb4204ceb --- /dev/null +++ b/db/migrate/20160616103005_remove_keys_fingerprint_index_if_exists.rb @@ -0,0 +1,21 @@ +class RemoveKeysFingerprintIndexIfExists < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + # https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/250 + # That MR was added on gitlab-ee so we need to check if the index + # already exists because we want to do is create an unique index instead. + + def up + if index_exists?(:keys, :fingerprint) + remove_index :keys, :fingerprint + end + end + + def down + unless index_exists?(:keys, :fingerprint) + add_concurrent_index :keys, :fingerprint + end + end +end diff --git a/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb b/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb new file mode 100644 index 0000000000..e35af38aac --- /dev/null +++ b/db/migrate/20160616103948_add_unique_index_to_keys_fingerprint.rb @@ -0,0 +1,13 @@ +class AddUniqueIndexToKeysFingerprint < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def up + add_concurrent_index :keys, :fingerprint, unique: true + end + + def down + remove_index :keys, :fingerprint + end +end diff --git a/db/migrate/20160617301627_add_events_to_notification_settings.rb b/db/migrate/20160617301627_add_events_to_notification_settings.rb new file mode 100644 index 0000000000..609596f45e --- /dev/null +++ b/db/migrate/20160617301627_add_events_to_notification_settings.rb @@ -0,0 +1,7 @@ +class AddEventsToNotificationSettings < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + def change + add_column :notification_settings, :events, :text + end +end diff --git a/db/migrate/20160620115026_add_index_on_runners_locked.rb b/db/migrate/20160620115026_add_index_on_runners_locked.rb new file mode 100644 index 0000000000..dfa5110dea --- /dev/null +++ b/db/migrate/20160620115026_add_index_on_runners_locked.rb @@ -0,0 +1,12 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddIndexOnRunnersLocked < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def change + add_concurrent_index :ci_runners, :locked + end +end diff --git a/db/schema.rb b/db/schema.rb index 6a3be7297e..7a8377f687 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160615142710) do +ActiveRecord::Schema.define(version: 20160620115026) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -287,9 +287,11 @@ ActiveRecord::Schema.define(version: 20160615142710) do t.string "platform" t.string "architecture" t.boolean "run_untagged", default: true, null: false + t.boolean "locked", default: false, null: false end add_index "ci_runners", ["description"], name: "index_ci_runners_on_description_trigram", using: :gin, opclasses: {"description"=>"gin_trgm_ops"} + add_index "ci_runners", ["locked"], name: "index_ci_runners_on_locked", using: :btree add_index "ci_runners", ["token"], name: "index_ci_runners_on_token", using: :btree add_index "ci_runners", ["token"], name: "index_ci_runners_on_token_trigram", using: :gin, opclasses: {"token"=>"gin_trgm_ops"} @@ -507,6 +509,7 @@ ActiveRecord::Schema.define(version: 20160615142710) do end add_index "keys", ["created_at", "id"], name: "index_keys_on_created_at_and_id", using: :btree + add_index "keys", ["fingerprint"], name: "index_keys_on_fingerprint", unique: true, using: :btree add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree create_table "label_links", force: :cascade do |t| @@ -707,6 +710,7 @@ ActiveRecord::Schema.define(version: 20160615142710) do t.integer "level", default: 0, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.text "events" end add_index "notification_settings", ["source_id", "source_type"], name: "index_notification_settings_on_source_id_and_source_type", using: :btree @@ -756,6 +760,19 @@ ActiveRecord::Schema.define(version: 20160615142710) do add_index "oauth_applications", ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type", using: :btree add_index "oauth_applications", ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree + create_table "personal_access_tokens", force: :cascade do |t| + t.integer "user_id", null: false + t.string "token", null: false + t.string "name", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "revoked", default: false + t.datetime "expires_at" + end + + add_index "personal_access_tokens", ["token"], name: "index_personal_access_tokens_on_token", unique: true, using: :btree + add_index "personal_access_tokens", ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree + create_table "project_group_links", force: :cascade do |t| t.integer "project_id", null: false t.integer "group_id", null: false @@ -1095,5 +1112,6 @@ ActiveRecord::Schema.define(version: 20160615142710) do add_index "web_hooks", ["created_at", "id"], name: "index_web_hooks_on_created_at_and_id", using: :btree add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree + add_foreign_key "personal_access_tokens", "users" add_foreign_key "u2f_registrations", "users" end diff --git a/doc/api/README.md b/doc/api/README.md index e3fc5a09f2..288f7f9ee6 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -8,6 +8,7 @@ under [`/lib/api`](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/api). Documentation for various API resources can be found separately in the following locations: +- [Award Emoji](award_emoji.md) - [Branches](branches.md) - [Builds](builds.md) - [Build triggers](build_triggers.md) @@ -31,6 +32,7 @@ following locations: - [Services](services.md) - [Session](session.md) - [Settings](settings.md) +- [Sidekiq metrics](sidekiq_metrics.md) - [System Hooks](system_hooks.md) - [Tags](tags.md) - [Users](users.md) @@ -44,13 +46,11 @@ The following documentation is for the [internal CI API](ci/README.md): ## Authentication -All API requests require authentication. You need to pass a `private_token` -parameter via query string or header. If passed as a header, the header name -must be `PRIVATE-TOKEN` (uppercase and with a dash instead of an underscore). -You can find or reset your private token in your account page (`/profile/account`). +All API requests require authentication via a token. There are three types of tokens +available: private tokens, OAuth 2 tokens, and personal access tokens. -If `private_token` is invalid or omitted, then an error message will be -returned with status code `401`: +If a token is invalid or omitted, an error message will be returned with +status code `401`: ```json { @@ -58,6 +58,39 @@ returned with status code `401`: } ``` +### Private Tokens + +You need to pass a `private_token` parameter via query string or header. If passed as a +header, the header name must be `PRIVATE-TOKEN` (uppercase and with a dash instead of +an underscore). You can find or reset your private token in your account page +(`/profile/account`). + +### OAuth 2 Tokens + +You can use an OAuth 2 token to authenticate with the API by passing it either in the +`access_token` parameter or in the `Authorization` header. + +Example of using the OAuth2 token in the header: + +```shell +curl -H "Authorization: Bearer OAUTH-TOKEN" https://gitlab.example.com/api/v3/projects +``` + +Read more about [GitLab as an OAuth2 client](oauth2.md). + +### Personal Access Tokens + +> **Note:** This feature was [introduced][ce-3749] in GitLab 8.8 + +You can create as many personal access tokens as you like from your GitLab +profile (`/profile/personal_access_tokens`); perhaps one for each application +that needs access to the GitLab API. + +Once you have your token, pass it to the API using either the `private_token` +parameter or the `PRIVATE-TOKEN` header. + +## Basic Usage + API requests should be prefixed with `api` and the API version. The API version is defined in [`lib/api.rb`][lib-api-url]. @@ -76,25 +109,6 @@ curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/ The API uses JSON to serialize data. You don't need to specify `.json` at the end of an 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. - -Example of OAuth2 token as a parameter: - -```shell -curl https://gitlab.example.com/api/v3/user?access_token=OAUTH-TOKEN -``` - -Example of OAuth2 token as a header: - -```shell -curl -H "Authorization: Bearer OAUTH-TOKEN" https://example.com/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 @@ -330,3 +344,4 @@ programming languages. Visit the [GitLab website] for a complete list. [GitLab website]: https://about.gitlab.com/applications/#api-clients "Clients using the GitLab API" [lib-api-url]: https://gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/api/api.rb +[ce-3749]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3749 diff --git a/doc/api/award_emoji.md b/doc/api/award_emoji.md new file mode 100644 index 0000000000..b44f8cfd62 --- /dev/null +++ b/doc/api/award_emoji.md @@ -0,0 +1,367 @@ +# Award Emoji + + >**Note:** This feature was introduced in GitLab 8.9 + +An awarded emoji tells a thousand words, and can be awarded on issues, merge +requests and notes/comments. Issues, merge requests and notes are further called +`awardables`. + +## Issues and merge requests + +### List an awardable's award emoji + +Gets a list of all award emoji + +``` +GET /projects/:id/issues/:issue_id/award_emoji +GET /projects/:id/merge_requests/:merge_request_id/award_emoji +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `awardable_id` | integer | yes | The ID of an awardable | + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/award_emoji +``` + +Example Response: + +```json +[ + { + "id": 4, + "name": "1234", + "user": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/root" + }, + "created_at": "2016-06-15T10:09:34.206Z", + "updated_at": "2016-06-15T10:09:34.206Z", + "awardable_id": 80, + "awardable_type": "Issue" + }, + { + "id": 1, + "name": "microphone", + "user": { + "name": "User 4", + "username": "user4", + "id": 26, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/7e65550957227bd38fe2d7fbc6fd2f7b?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/user4" + }, + "created_at": "2016-06-15T10:09:34.177Z", + "updated_at": "2016-06-15T10:09:34.177Z", + "awardable_id": 80, + "awardable_type": "Issue" + } +] +``` + +### Get single issue note + +Gets a single award emoji + +``` +GET /projects/:id/issues/:issue_id/award_emoji/:award_id +GET /projects/:id/merge_requests/:merge_request_id/award_emoji/:award_id +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `awardable_id` | integer | yes | The ID of an awardable | +| `award_id` | integer | yes | The ID of the award emoji | + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/award_emoji/1 +``` + +Example Response: + +```json +{ + "id": 1, + "name": "microphone", + "user": { + "name": "User 4", + "username": "user4", + "id": 26, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/7e65550957227bd38fe2d7fbc6fd2f7b?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/user4" + }, + "created_at": "2016-06-15T10:09:34.177Z", + "updated_at": "2016-06-15T10:09:34.177Z", + "awardable_id": 80, + "awardable_type": "Issue" +} +``` + +### Award a new emoji + +This end point creates an award emoji on the specified resource + +``` +POST /projects/:id/issues/:issue_id/award_emoji +POST /projects/:id/merge_requests/:merge_request_id/award_emoji +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `awardable_id` | integer | yes | The ID of an awardable | +| `name` | string | yes | The name of the emoji, without colons | + +```bash +curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/award_emoji?name=blowfish +``` + +Example Response: + +```json +{ + "id": 344, + "name": "blowfish", + "user": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/root" + }, + "created_at": "2016-06-17T17:47:29.266Z", + "updated_at": "2016-06-17T17:47:29.266Z", + "awardable_id": 80, + "awardable_type": "Issue" +} +``` + +### Delete an award emoji + +Sometimes its just not meant to be, and you'll have to remove your award. Only available to +admins or the author of the award. Status code 200 on success, 401 if unauthorized. + +``` +DELETE /projects/:id/issues/:issue_id/award_emoji/:award_id +DELETE /projects/:id/merge_requests/:merge_request_id/award_emoji/:award_id +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `issue_id` | integer | yes | The ID of an issue | +| `award_id` | integer | yes | The ID of a award_emoji | + +```bash +curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/award_emoji/344 +``` + +Example Response: + +```json +{ + "id": 344, + "name": "blowfish", + "user": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/root" + }, + "created_at": "2016-06-17T17:47:29.266Z", + "updated_at": "2016-06-17T17:47:29.266Z", + "awardable_id": 80, + "awardable_type": "Issue" +} +``` + +## Award Emoji on Notes + +The endpoints documented above are available for Notes as well. Notes +are a sub-resource of Issues and Merge Requests. The examples below +describe working with Award Emoji on notes for an Issue, but can be +easily adapted for notes on a Merge Request. + +### List a note's award emoji + +``` +GET /projects/:id/issues/:issue_id/notes/:note_id/award_emoji +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `issue_id` | integer | yes | The ID of an issue | +| `note_id` | integer | yes | The ID of an note | + + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/notes/1/award_emoji +``` + +Example Response: + +```json +[ + { + "id": 2, + "name": "mood_bubble_lightning", + "user": { + "name": "User 4", + "username": "user4", + "id": 26, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/7e65550957227bd38fe2d7fbc6fd2f7b?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/user4" + }, + "created_at": "2016-06-15T10:09:34.197Z", + "updated_at": "2016-06-15T10:09:34.197Z", + "awardable_id": 1, + "awardable_type": "Note" + } +] +``` + +### Get single note's award emoji + +``` +GET /projects/:id/issues/:issue_id/notes/:note_id/award_emoji/:award_id +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `issue_id` | integer | yes | The ID of an issue | +| `note_id` | integer | yes | The ID of a note | +| `award_id` | integer | yes | The ID of the award emoji | + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/notes/1/award_emoji/2 +``` + +Example Response: + +```json +{ + "id": 2, + "name": "mood_bubble_lightning", + "user": { + "name": "User 4", + "username": "user4", + "id": 26, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/7e65550957227bd38fe2d7fbc6fd2f7b?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/user4" + }, + "created_at": "2016-06-15T10:09:34.197Z", + "updated_at": "2016-06-15T10:09:34.197Z", + "awardable_id": 1, + "awardable_type": "Note" +} +``` + +### Award a new emoji on a note + +``` +POST /projects/:id/issues/:issue_id/notes/:note_id/award_emoji +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `issue_id` | integer | yes | The ID of an issue | +| `note_id` | integer | yes | The ID of a note | +| `name` | string | yes | The name of the emoji, without colons | + +```bash +curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/notes/1/award_emoji?name=rocket +``` + +Example Response: + +```json +{ + "id": 345, + "name": "rocket", + "user": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/root" + }, + "created_at": "2016-06-17T19:59:55.888Z", + "updated_at": "2016-06-17T19:59:55.888Z", + "awardable_id": 1, + "awardable_type": "Note" +} +``` + +### Delete an award emoji + +Sometimes its just not meant to be, and you'll have to remove your award. Only available to +admins or the author of the award. Status code 200 on success, 401 if unauthorized. + +``` +DELETE /projects/:id/issues/:issue_id/notes/:note_id/award_emoji/:award_id +``` + +Parameters: + +| Attribute | Type | Required | Description | +| --------- | ---- | -------- | ----------- | +| `id` | integer | yes | The ID of a project | +| `issue_id` | integer | yes | The ID of an issue | +| `note_id` | integer | yes | The ID of a note | +| `award_id` | integer | yes | The ID of a award_emoji | + +```bash +curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" http://gitlab.example.com/api/v3/projects/1/issues/80/award_emoji/345 +``` + +Example Response: + +```json +{ + "id": 345, + "name": "rocket", + "user": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", + "web_url": "http://gitlab.example.com/u/root" + }, + "created_at": "2016-06-17T19:59:55.888Z", + "updated_at": "2016-06-17T19:59:55.888Z", + "awardable_id": 1, + "awardable_type": "Note" +} +``` diff --git a/doc/api/sidekiq_metrics.md b/doc/api/sidekiq_metrics.md new file mode 100644 index 0000000000..ebd131c94c --- /dev/null +++ b/doc/api/sidekiq_metrics.md @@ -0,0 +1,152 @@ +# Sidekiq Metrics + +>**Note:** This endpoint is only available on GitLab 8.9 and above. + +This API endpoint allows you to retrieve some information about the current state +of Sidekiq, its jobs, queues, and processes. + +## Get the current Queue Metrics + +List information about all the registered queues, their backlog and their +latency. + +``` +GET /sidekiq/queue_metrics +``` + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/sidekiq/queue_metrics +``` + +Example response: + +```json +{ + "queues": { + "default": { + "backlog": 0, + "latency": 0 + } + } +} +``` + +## Get the current Process Metrics + +List information about all the Sidekiq workers registered to process your queues. + +``` +GET /sidekiq/process_metrics +``` + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/sidekiq/process_metrics +``` + +Example response: + +```json +{ + "processes": [ + { + "hostname": "gitlab.example.com", + "pid": 5649, + "tag": "gitlab", + "started_at": "2016-06-14T10:45:07.159-05:00", + "queues": [ + "post_receive", + "mailers", + "archive_repo", + "system_hook", + "project_web_hook", + "gitlab_shell", + "incoming_email", + "runner", + "common", + "default" + ], + "labels": [], + "concurrency": 25, + "busy": 0 + } + ] +} +``` + +## Get the current Job Statistics + +List information about the jobs that Sidekiq has performed. + +``` +GET /sidekiq/job_stats +``` + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/sidekiq/job_stats +``` + +Example response: + +```json +{ + "jobs": { + "processed": 2, + "failed": 0, + "enqueued": 0 + } +} +``` + +## Get a compound response of all the previously mentioned metrics + +List all the currently available information about Sidekiq. + +``` +GET /sidekiq/compound_metrics +``` + +```bash +curl -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/sidekiq/compound_metrics +``` + +Example response: + +```json +{ + "queues": { + "default": { + "backlog": 0, + "latency": 0 + } + }, + "processes": [ + { + "hostname": "gitlab.example.com", + "pid": 5649, + "tag": "gitlab", + "started_at": "2016-06-14T10:45:07.159-05:00", + "queues": [ + "post_receive", + "mailers", + "archive_repo", + "system_hook", + "project_web_hook", + "gitlab_shell", + "incoming_email", + "runner", + "common", + "default" + ], + "labels": [], + "concurrency": 25, + "busy": 0 + } + ], + "jobs": { + "processed": 2, + "failed": 0, + "enqueued": 0 + } +} +``` + diff --git a/doc/ci/README.md b/doc/ci/README.md index ef72df97ce..5a1cb5319c 100644 --- a/doc/ci/README.md +++ b/doc/ci/README.md @@ -5,6 +5,7 @@ - [Get started with GitLab CI](quick_start/README.md) - [CI examples for various languages](examples/README.md) - [Learn how to enable or disable GitLab CI](enable_or_disable_ci.md) +- [Environments and deployments](environments.md) - [Learn how `.gitlab-ci.yml` works](yaml/README.md) - [Configure a Runner, the application that runs your builds](runners/README.md) - [Use Docker images with GitLab Runner](docker/using_docker_images.md) diff --git a/doc/ci/environments.md b/doc/ci/environments.md new file mode 100644 index 0000000000..040379bb38 --- /dev/null +++ b/doc/ci/environments.md @@ -0,0 +1,58 @@ +# Introduction to environments and deployments + +>**Note:** +Introduced in GitLab 8.9. + +## Environments + +Environments are places where code gets deployed, such as staging or production. +CI/CD [Pipelines] usually have one or more [jobs] that deploy to an environment. +Defining environments in a project's `.gitlab-ci.yml` lets developers track +[deployments] to these environments. + +## Deployments + +Deployments are created when [jobs] deploy versions of code to [environments]. + +## Defining environments + +You can create and delete environments manually in the web interface, but we +recommend that you define your environments in `.gitlab-ci.yml` first, which +will automatically create environments for you after the first deploy. + +The `environment` is just a hint for GitLab that this job actually deploys to +this environment. Each time the job succeeds, a deployment is recorded, +remembering the git SHA and environment. + +Add something like this to your `.gitlab-ci.yml`: +``` +production: + stage: deploy + script: dpl... + environment: production +``` + +See full [documentation](yaml/README.md#environment). + +## Seeing environment status + +You can find the environment list under **Pipelines > Environments** for your +project. You'll see the git SHA and date of the last deployment to each +environment defined. + +>**Note:** +Only deploys that happen after your `.gitlab-ci.yml` is properly configured will +show up in the environments and deployments lists. + +## Seeing deployment history + +Clicking on an environment will show the history of deployments. + +>**Note:** +Only deploys that happen after your `.gitlab-ci.yml` is properly configured will +show up in the environments and deployments lists. + +[Pipelines]: quick_start/README.md +[jobs]: yaml/README.md#jobs +[environments]: #environments +[deployments]: #deployments diff --git a/doc/ci/examples/README.md b/doc/ci/examples/README.md index 61294be599..27bc21c292 100644 --- a/doc/ci/examples/README.md +++ b/doc/ci/examples/README.md @@ -4,7 +4,8 @@ - [Test and deploy a Ruby application to Heroku](test-and-deploy-ruby-application-to-heroku.md) - [Test and deploy a Python application to Heroku](test-and-deploy-python-application-to-heroku.md) - [Test a Clojure application](test-clojure-application.md) -- [Using `dpl` as deployment tool](../deployment/README.md) +- [Test a Scala application](test-scala-application.md) +- [Using `dpl` as deployment tool](deployment/README.md) - Help your favorite programming language and GitLab by sending a merge request with a guide for that language. diff --git a/doc/ci/examples/test-scala-application.md b/doc/ci/examples/test-scala-application.md new file mode 100644 index 0000000000..7412fdbbc7 --- /dev/null +++ b/doc/ci/examples/test-scala-application.md @@ -0,0 +1,47 @@ +## Test a Scala application + +This example demonstrates the integration of Gitlab CI with Scala +applications using SBT. Checkout the example +[project](https://gitlab.com/gitlab-examples/scala-sbt) and +[build status](https://gitlab.com/gitlab-examples/scala-sbt/builds). + +### Add `.gitlab-ci.yml` file to project + +The following `.gitlab-ci.yml` should be added in the root of your +repository to trigger CI: + +``` yaml +image: java:8 + +before_script: + - apt-get update -y + - apt-get install apt-transport-https -y + # Install SBT + - echo "deb http://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list + - apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823 + - apt-get update -y + - apt-get install sbt -y + - sbt sbt-version + +test: + script: + - sbt clean coverage test coverageReport +``` + +The `before_script` installs [SBT](http://www.scala-sbt.org/) and +displays the version that is being used. The `test` stage executes SBT +to compile and test the project. +[scoverage](https://github.com/scoverage/sbt-scoverage) is used as an SBT +plugin to measure test coverage. + +You can use other versions of Scala and SBT by defining them in +`build.sbt`. + +### Display test coverage in build + +Add the `Coverage was \[\d+.\d+\%\]` regular expression in the +**Settings > Edit Project > Test coverage parsing** project setting to +retrieve the test coverage rate from the build trace and have it +displayed with your builds. + +**Builds** must be enabled for this option to appear. diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md index 400784da61..ddebd98765 100644 --- a/doc/ci/runners/README.md +++ b/doc/ci/runners/README.md @@ -96,6 +96,12 @@ To register the runner, run the command below and follow instructions: sudo gitlab-ci-multi-runner register ``` +### Lock a specific runner from being enabled for other projects + +You can configure a runner to assign it exclusively to a project. When a +runner is locked this way, it can no longer be enabled for other projects. +This setting is available on each runner in *Project Settings* > *Runners*. + ### Making an existing Shared Runner Specific If you are an admin on your GitLab instance, @@ -128,7 +134,7 @@ the appropriate dependencies to run Rails test suites. ### Prevent runner with tags from picking jobs without tags You can configure a runner to prevent it from picking jobs with tags when -the runnner does not have tags assigned. This setting is available on each +the runner does not have tags assigned. This setting is available on each runner in *Project Settings* > *Runners*. ### Be careful with sensitive information diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index 9c98f9c98c..d0fbcbe998 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -167,7 +167,7 @@ There are also two edge cases worth mentioning: 1. If no `stages` is defined in `.gitlab-ci.yml`, then by default the `build`, `test` and `deploy` are allowed to be used as job's stage by default. -2. If a job doesn't specify `stage`, the job is assigned the `test` stage. +2. If a job doesn't specify a `stage`, the job is assigned the `test` stage. ### types @@ -178,9 +178,9 @@ Alias for [stages](#stages). >**Note:** Introduced in GitLab Runner v0.5.0. -GitLab CI allows you to add to `.gitlab-ci.yml` variables that are set in build -environment. The variables are stored in the git repository and are meant to -store non-sensitive project configuration, for example: +GitLab CI allows you to add variables to `.gitlab-ci.yml` that are set in the +build environment. The variables are stored in the git repository and are meant +to store non-sensitive project configuration, for example: ```yaml variables: @@ -253,8 +253,8 @@ rspec: - binaries/ ``` -The cache is provided on best effort basis, so don't expect that cache will be -always present. For implementation details please check GitLab Runner. +The cache is provided on a best-effort basis, so don't expect that the cache +will be always present. For implementation details, please check GitLab Runner. #### cache:key @@ -479,10 +479,10 @@ failure. `when` can be set to one of the following values: 1. `on_success` - execute build only when all builds from prior stages - succeeded. This is the default. + succeed. This is the default. 1. `on_failure` - execute build only when at least one build from prior stages - failed. -1. `always` - execute build despite the status of builds from prior stages. + fails. +1. `always` - execute build regardless of the status of builds from prior stages. For example: @@ -530,14 +530,18 @@ The above script will: ### environment >**Note:** -Introduced in GitLab v8.9.0. +Introduced in GitLab 8.9. -`environment` is used to define that job does deployment to specific environment. -This allows to easily track all deployments to your environments straight from GitLab. +`environment` is used to define that a job deploys to a specific environment. +This allows easy tracking of all deployments to your environments straight from +GitLab. -If `environment` is specified and no environment under that name does exist a new one will be created automatically. +If `environment` is specified and no environment under that name exists, a new +one will be created automatically. -The `environment` name must contain only letters, digits, '-' and '_'. +The `environment` name must contain only letters, digits, '-' and '_'. Common +names are `qa`, `staging`, and `production`, but you can use whatever name works +with your workflow. --- @@ -550,7 +554,8 @@ deploy to production: environment: production ``` -The `deploy to production` job will be marked as doing deployment to `production` environment. +The `deploy to production` job will be marked as doing deployment to +`production` environment. ### artifacts @@ -559,10 +564,10 @@ The `deploy to production` job will be marked as doing deployment to `production > - Introduced in GitLab Runner v0.7.0 for non-Windows platforms. > - Windows support was added in GitLab Runner v.1.0.0. > - Currently not all executors are supported. -> - Build artifacts are only collected for successful builds. +> - Build artifacts are only collected for successful builds by default. -`artifacts` is used to specify list of files and directories which should be -attached to build after success. To pass artifacts between different builds, +`artifacts` is used to specify a list of files and directories which should be +attached to the build after success. To pass artifacts between different builds, see [dependencies](#dependencies). Below are some examples. @@ -690,9 +695,9 @@ failure. `artifacts:when` can be set to one of the following values: -1. `on_success` - upload artifacts only when build succeeds. This is the default -1. `on_failure` - upload artifacts only when build fails -1. `always` - upload artifacts despite the build status +1. `on_success` - upload artifacts only when the build succeeds. This is the default. +1. `on_failure` - upload artifacts only when the build fails. +1. `always` - upload artifacts regardless of the build status. --- @@ -711,16 +716,18 @@ job: >**Note:** Introduced in GitLab 8.9 and GitLab Runner v1.3.0. -`artifacts:expire_in` is used to remove uploaded artifacts after specified time. -By default artifacts are stored on GitLab forver. -`expire_in` allows to specify after what time the artifacts should be removed. -The artifacts will expire counting from the moment when they are uploaded and stored on GitLab. +`artifacts:expire_in` is used to delete uploaded artifacts after the specified +time. By default, artifacts are stored on GitLab forever. `expire_in` allows you +to specify how long artifacts should live before they expire, counting from the +time they are uploaded and stored on GitLab. -After artifacts uploading you can use the **Keep** button on build page to keep the artifacts forever. +You can use the **Keep** button on the build page to override expiration and +keep artifacts forever. -Artifacts are removed every hour, but they are not accessible after expire date. +By default, artifacts are deleted hourly (via a cron job), but they are not +accessible after expiry. -The value of `expire_in` is a elapsed time. The example of parsable values: +The value of `expire_in` is an elapsed time. Examples of parseable values: - '3 mins 4 sec' - '2 hrs 20 min' - '2h20min' @@ -732,7 +739,7 @@ The value of `expire_in` is a elapsed time. The example of parsable values: **Example configurations** -To expire artifacts after 1 week from the moment that they are uploaded: +To expire artifacts 1 week after being uploaded: ```yaml job: diff --git a/doc/development/instrumentation.md b/doc/development/instrumentation.md index 6cd9b274d1..c2272ab0a2 100644 --- a/doc/development/instrumentation.md +++ b/doc/development/instrumentation.md @@ -94,23 +94,8 @@ Visibility: public Number of lines: 21 def #{name}(#{args_signature}) - trans = Gitlab::Metrics::Instrumentation.transaction - - if trans - start = Time.now - cpu_start = Gitlab::Metrics::System.cpu_time - retval = super - duration = (Time.now - start) * 1000.0 - - if duration >= Gitlab::Metrics.method_call_threshold - cpu_duration = Gitlab::Metrics::System.cpu_time - cpu_start - - trans.add_metric(Gitlab::Metrics::Instrumentation::SERIES, - { duration: duration, cpu_duration: cpu_duration }, - method: #{label.inspect}) - end - - retval + if trans = Gitlab::Metrics::Instrumentation.transaction + trans.measure_method(#{label.inspect}) { super } else super end diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md index 02e024ca15..8a7547e532 100644 --- a/doc/development/migration_style_guide.md +++ b/doc/development/migration_style_guide.md @@ -34,6 +34,15 @@ First, you need to provide information on whether the migration can be applied: 3. online with errors on new instances while migrating 4. offline (needs to happen without app servers to prevent db corruption) +For example: + +``` +# rubocop:disable all +# Migration type: online without errors (works on previous version and new one) +class MyMigration < ActiveRecord::Migration +... +``` + It is always preferable to have a migration run online. If you expect the migration to take particularly long (for instance, if it loops through all notes), this is valuable information to add. @@ -48,7 +57,6 @@ be possible to downgrade in case of a vulnerability or bugs. In your migration, add a comment describing how the reversibility of the migration was tested. - ## Removing indices If you need to remove index, please add a condition like in following example: @@ -70,6 +78,7 @@ so: ``` class MyMigration < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers disable_ddl_transaction! def change @@ -90,8 +99,11 @@ value of `10` you'd write the following: ``` class MyMigration < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + disable_ddl_transaction! + def up - add_column_with_default(:projects, :foo, :integer, 10) + add_column_with_default(:projects, :foo, :integer, default: 10) end def down diff --git a/doc/project_services/emails_on_push.md b/doc/project_services/emails_on_push.md new file mode 100644 index 0000000000..2f9f36f962 --- /dev/null +++ b/doc/project_services/emails_on_push.md @@ -0,0 +1,17 @@ +## Enabling emails on push + +To receive email notifications for every change that is pushed to the project, visit +your project's **Settings > Services > Emails on push** and activate the service. + +In the _Recipients_ area, provide a list of emails separated by commas. + +You can configure any of the following settings depending on your preference. + ++ **Push events** - Email will be triggered when a push event is recieved ++ **Tag push events** - Email will be triggered when a tag is created and pushed ++ **Send from committer** - Send notifications from the committer's email address if the domain is part of the domain GitLab is running on (e.g. `user@gitlab.com`). ++ **Disable code diffs** - Don't include possibly sensitive code diffs in notification body. + +--- + +![Email on push service settings](img/emails_on_push_service.png) diff --git a/doc/project_services/img/emails_on_push_service.png b/doc/project_services/img/emails_on_push_service.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6f79ad1eb9c3635e00e62b0e16c62482e4a790 GIT binary patch literal 98160 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

    H*2)>Qo|MkM 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 literal 0 HcmV?d00001 diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md index a5af620d9b..f81a035f70 100644 --- a/doc/project_services/project_services.md +++ b/doc/project_services/project_services.md @@ -33,7 +33,7 @@ further configuration instructions and details. Contributions are welcome. | Campfire | Simple web-based real-time group chat | | Custom Issue Tracker | Custom issue tracker | | Drone CI | Continuous Integration platform built on Docker, written in Go | -| Emails on push | Email the commits and diff of each push to a list of recipients | +| [Emails on push](emails_on_push.md) | Email the commits and diff of each push to a list of recipients | | External Wiki | Replaces the link to the internal wiki with a link to an external wiki | | Flowdock | Flowdock is a collaboration web app for technical teams | | Gemnasium | Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities | diff --git a/doc/workflow/add-user/add-user.md b/doc/workflow/add-user/add-user.md index fffa0aba57..4b55113025 100644 --- a/doc/workflow/add-user/add-user.md +++ b/doc/workflow/add-user/add-user.md @@ -8,7 +8,7 @@ You should have `master` or `owner` permissions to add or import a new user to your project. The first step to add or import a user, go to your project and click on -**Members** on the left side of your screen. +**Members** in the drop-down menu on the right side of your screen. ![Members](img/add_user_members_menu.png) @@ -87,3 +87,25 @@ invitation, change their access level or even delete them. Once the user accepts the invitation, they will be prompted to create a new GitLab account using the same e-mail address the invitation was sent to. + +## Request access to a project + +As a user, you can request to be a member of a project. Go to the project you'd +like to be a member of, and click the **Request Access** button on the right +side of your screen. + +![Request access button](img/request_access_button.png) + +--- + +Project owners & masters will be notified of your request and will be able to approve or +decline it on the members page. + +![Manage access requests](img/access_requests_management.png) + +--- + +If you change your mind before your request is approved, just click the +**Withdraw Access Request** button. + +![Withdraw access request button](img/withdraw_access_request_button.png) diff --git a/doc/workflow/add-user/img/access_requests_management.png b/doc/workflow/add-user/img/access_requests_management.png new file mode 100644 index 0000000000000000000000000000000000000000..e9641cb4f85b9112a2ab2bfc4868081fe28caaae GIT binary patch literal 15105 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 literal 0 HcmV?d00001 diff --git a/doc/workflow/add-user/img/add_user_email_accept.png b/doc/workflow/add-user/img/add_user_email_accept.png index 910affc9659eb1a298be9d55af5492950ba295b7..18aabf93d50bd9d5b24a9f5d9ce4b4491d19b01f 100644 GIT binary patch literal 22961 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 literal 10833 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 Z?Y!c;ekAI)u1Gq?!Pdp5>caOw{R?W2lBfUx literal 16177 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 diff --git a/doc/workflow/add-user/img/add_user_email_search.png b/doc/workflow/add-user/img/add_user_email_search.png index 140979fbe13103533deba4ad8feb14f3df0c3585..84741edbca405049c15e9b3e07054279bfb53918 100644 GIT binary patch literal 45884 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 z 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 diff --git a/doc/workflow/add-user/img/add_user_imported_members.png b/doc/workflow/add-user/img/add_user_imported_members.png index dea4b3f40adff254643ae04223be61b7e1523862..abac1f59c026baaf201fd0977f21528b6768441c 100644 GIT binary patch literal 37873 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 RKwIII8XK7Fm+GCr^>5_65aR#< diff --git a/doc/workflow/add-user/img/add_user_list_members.png b/doc/workflow/add-user/img/add_user_list_members.png index 7daa6ca7d9e96b3692231615acf05ec11af3e05d..e17d88c6f5f964ec47c1afbdd1ac2b1076ac542b 100644 GIT binary patch literal 24427 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

    X?W4o!gAIX~< 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 literal 0 HcmV?d00001 diff --git a/doc/workflow/notifications.md b/doc/workflow/notifications.md index cbca94c0b5..fe4485e148 100644 --- a/doc/workflow/notifications.md +++ b/doc/workflow/notifications.md @@ -4,7 +4,7 @@ GitLab has a notification system in place to notify a user of events that are im ## Notification settings -Under user profile page you can find the notification settings. +You can find notification settings under the user profile. ![notification settings](notifications/settings.png) @@ -20,6 +20,7 @@ Each of these settings have levels of notification: * 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 +* Custom - user will receive notifications when mentioned, is participant and custom selected events. #### Global Settings @@ -55,7 +56,7 @@ Below is the table of events users can be notified of: | 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 | -| Group access level changed | User | Sent when user group access level is changed | +| Group access level changed | User | Sent when user group access level is changed | | Project moved | Project members [1] | [1] not disabled | ### Issue / Merge Request events @@ -71,6 +72,7 @@ In all of the below cases, the notification will be sent to: - Watchers: users with notification level "Watch" - Subscribers: anyone who manually subscribed to the issue/merge request +- Custom: Users with notification level "custom" who turned on notifications for any of the events present in the table below | Event | Sent to | |------------------------|---------| diff --git a/doc/workflow/notifications/settings.png b/doc/workflow/notifications/settings.png index e5b50ee249478f8d5cd3601e801fe7b7d93d10c2..7c6857aad1a88f92b42b5ea30656d0ff0b75fc63 100644 GIT binary patch literal 90986 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℘mh0|lZS9P5=*sanZ$tT-^)hC$ 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 literal 114727 zcma&N1yo#3vo1`6J3)d4OR(U<2{J%%4;Ea4yF<_+Xdt-z;DbvDuEE{i-Q8he_=mjj zIrlsNU3cBP*Iqq6y?d&w>#45l*OhonD{9&?)Er|$@c)gmsre}Qh7tODtUloEekq#TTezFS2BSGM(%CESJ z3XjXm$~-!Prq=9vK_l)h&CShCO`W{y3KSF+4tgw!0vjW+8Fl81t)Ck^&@--b9-x4>6i`;iXnJFfF7?D@UKs0XPB-!} ziSLqW7fbBEKWBaVzu!Q`hw?fOvna7c`_XhZF{%c{r>&1|iR8XQYQr2u3XW;xzrW%z z_@ETimGc%-CdX3!h=LbPl}`Z)l9LGU+!nMI_@q_Q3KkD1y#2$kb-Wmea)hT#C3T2z zwmql(=@ass-xEw3=%zgHd*y`S{X8eg@f%Tw?Mm3}xr9enFKH+8M|&jTH4BDBs28aR z7`^xIRsDzkaCnDIxvassq3YaB;%zJboBGhL|LgsfajS1ry8xIugM4IT_tBLMyYe7= z$9Qm((9*3xGBJVoYJJg~TX#C#{pkIby%?C?!`7cIeymHZ%&B(4#rvlF2e{ARCY~BX z&8`waQ#n5}GNPJ4Tt*E;QdrV8nvaz4Co_>Tmtd*hr=baAv3Jl#Pwlk`@u7Nt=7V~7 zA4GUJDy*}tz&Dh}4&E{{F(BnJp=o;Z&Jo6*t`*Z)p(rN5wCmU%G?@M$Kw*8l>3l+4 zBwXwDpZ~mzG0h}It!}!Q5o(s;*xo$*@)u`|glFuSZbdI;?3}-CNpQo8snm=}y(_Xx zfF;&Ni8$*WTpeQEX`1I<+I~~BP&xCfW;pM5$3$`d-S=Q4HgOf9NBlD$UTss8?bYCT z?3PB9@!K?ZPY(!HGz0P1#qJW!X7u_0yToCTJPTd$;hXC2*$(af^&^$X?MbmAX1ub@ z`@FdSE+$)Po}icI{8k13tL<;?0W#5g9LJ^lKYGV0Lm&6_-KLfPlf-lP|E96e>gg&6 z4_ob&1wbqRUWu3bFJNEbDgdSYn15@3tDFeWjc{$y-^c$};UE(Y6F7fc;SLoK6h8f1 z9pV39b;Sd$|Df?){gDpwv|tF^;Dz=eEF(qN%|}*M9i>$r$?+@=OXb<1h`iwA0hY;mi1yCaJZg}}Gc90~c* z=bzY9UY~xu7WK)mP-?1G)$_rE6IP5#imiz4ja{vZQv|}n6#%A+0Y(<(L|6(JU!1=PZqwpR42J6I)aL`?34;RfKSGm((GAsQe)Us6rtC zR1w*`SXfiWfWpI8K#kzklhwWPQUA)j^4P@wVv`pM=lb98FY2a2HSZ=srn6=0#jRG= zksxk~p6y-A$6$28@NoAkS14n1}gLSKwLOq@^?o$oY7BdOdZNlZ6zT2#NJ5s z<*iqi{nh;8bZx16admC0exWKyJ!<4iT=KxD-|@ste_M#W|5>K%ZS0S0aZ+&uJ5~`!;x% z;h_tMAYo;-jJdT-)6xkYRHHkBIKbSt!b#Xz8?J^&b zHVv3uKbK*w{^-O}H7F6=WnEoE#`lqr@BJU;iQoKgKJPu6zipS)zcwoyI*RZ5wWV)o z{e3LsHLzo?P%<%_K3K@gX1>a7Bi|DK>5dtOg>NpG_qqK;;Fuzua08}q{{pB9 zb$$ZM^8(J`IF?xH+>B&P(eT%f&+TUwH@A_P_PobOD(_z9ClU;wohxQ;jSQ$o=6U8^ zvYEs7TpBreV(qLBo7{Tu@MBg{k&mBG7lp1ei=wkj_3tVyN|+8nx3#6Rs0h5X5Hrrx3j+fVE`|>HKoC3*Jz0hGbhC(MQ zjz(zfPQrbl_lbbKceW)(5n^vmtY)TpI6J>;eXVbDxaf|U*D9Vca%K9xgTFg9v45Rn zoslNqaupvB^#HQrBqb$Dg{9xuMwWN>Y4QyoY#r`Q zWJCng%kN7RC-Lx@>a`gDrly+Haq-^3v+QLdyc~<&`N(nt0`G~rxv{Zm8`rr-p>w)t zAw8Fyif~eRJnBO-Ll5tHOcfztf*+E#?k3jz6JHHhnT>=mwd(7gsc!`_+#!s%rfh(! z9gV4*n)6NP!}v6jjEszO!a`|-`ffS&fGeaSVO*Tt!|5Dm_m>v>Zf|7MXr@{va>i0p zQnqMlVk{o7u9A_07y0h+o(F#}VGQJkoUvPk7fRUP*9r+-Zid#rXbR#$J z2T8W4ZW|z(h~!E$}I(Bq{6AzQ8lF5Lunk zr~H?Np7WCIQ5|1;=Tzw&lI3RH%?|sVE*;FW`N2u?u`_b8Yq-_r!vSh4*+;+ zsL>%KA83f83oF!bAzk9Mv%IY#H!%*!@b33Nk7J55`K19{zV0$u(K(yKdDv9BnKk_C->tHa)= z*w5Y+*T&QXW6yZgd=VL8$hTx6RwKpv-ZO}2AzjHtkethnL zfAFp2x4p5ku^&r~;a68rUZ+a&X}_*+vPOSTf?zy8^ZP70s(|}grtnVhvRU6U@J&`p ze*i_%^kn79YGp4^ggVdfHT+mAAz*NnO93E!j3wAxp?tB$a$uezF{i2)@R}@4w{=7h z$9&|v_Ta5UC?8WFB3%q6fqL}ozCu7DfS?fY=Q{Jps_t5)WF!(2qPN3^tmc5WB8d{4 zo0rFigsQ5lj#s;#KI-iInr5{aXxJEN?}&c|@`s~-)@|*pTd*eCPXlZ`I{^SMCpUCy z_BMS@8`x+a5jIOv_`%11?d`5@ug;G!Ij$V3QS}7;^$UH$e>CH9&h=i-%F`{UUJYD6 z%t|jKFRQ2^Jv6?FpBOhoB0t1THXV_nws~T~p6t9upk?#fR`0XVXN&sf+1c@M8k$j~ zO4s4B<%#2qmhaDM2I?vX{s>hZ9Gu>lVIZZeFAv|&{N9E2h@~Nmz7eso>IJ5kfD{?j10`y zC(d!3@tszWzu0#sUeR^ZO`1AcNqQSqEh}kj=)62Yy-AKsi^&=u9GXc;_@X|;oisR| zP{V>y&IvSRy{* zZAGm;gDFSV4A*G2I0xX@m+5w&lW?zgt}JF`BKCxA2Ip4*A0F|(m3Ce33`r^;+~!*e zX?*Ncc>j+Kz*pd1A*+27^q(@5$tjzgah+oEGV#3F)z4K3f#@ZHMPa4%+jJsCekR0Cc|M1fObq26p!so&c(&UlUQZ(GH;*QT&EpLA$vqGwM1@RIagZB-VJEIoZNgW4)^x9}1v60e1LO^{( z@J#gjF0HqpI`)mgW`a;W4|W%3*4S@87mZYmLb~lNI}Zj~8y( z)si!S@TX2J=8yJ%@W6Nc@1p#-rUFQf*G=DP(of&?)xKCH%+?tdZNBJb+8vWf#N^K2(9kO7wc4r`zJtr3py&;JBQny70uK-}VrGKasHqV|dtmMBIwg`H;@VaDp{NW&&ViO`{W(xJ*s2Wjpb5$e8$j{#%F3VVO zI~MQ}sFy=!SOMH`_6_#-_JTYhgF^{2-fG3wNAuOKit_RURcrV(S!{7&gGatc&CB%< zXWIj{xwy`kqNv+5QSkR;?gQ@9kQ|!oyjtLDhb+9mcf!kmY%`AN<9ozLz5|j$#K5k- zJgoM3{D?ADO1!0b=UspjNon-kjb{%8B>v&egPP1$UZsPenpLX{^n>Dr->YUW`fJ0=no{CP4X!9MmJKVp`?=zRuo zhl_xu5@V*cDhXNAWE=uN>$R?5f^}#-7N!M%6H2&;Shy2WxF6_R48hFcF-_RnSY0#x zE!bdxq#7>rPUl(ZiE*Lj6?LD9^fa>46F0QICET zP;?`y+*fI6iPAsrcu?ut+9?B(0*)~;uqf&rO|E-h;u;+eAM!a}o3xguf`C37-QgpG zwR?etKF6&#lHY4iw};9T?1a0Bz!UCn#<|lP6gWhe>#RQY78CiHq}&hI7u))e9zU0r zIQY1>5-{lK_i~_&FZer@a+R;ZM~qWd@1}N6-gbUU_%MCnMnfJs{}n_m@vMSRCMP7JVyudZILTx&XDh5QIhG{Q|kzkvm7w#Wdc`-WJ zI5IN>T}#y7Mw%8_(4CKM!)sShsjJG#DI-Kb_6PDOdYai!ejH|NeYztbZf=D@o}jIK z_JZKMOUR=XHExL5ZESJVLwi_BS^>=%{aL4?y^^mYoPxn;+0P+!zi{D2CdRA2s-ga* z#=ZO_ub|oBCEhaE&>z1_+|Pz&SL8@`pIAgAG8j7aejC877jMS7wN2t&FY!sltVa{g z2Fd@G#XAT8KGXNF?@MZ4FO&cIo;-wOV@H-hq$it5eV($yu8*Q}v7rCuTMqw|wx54$ZfHg=3$DB^ z^z?@5!Ch0Z%>60hb%_&zJH?N!>0Jxz={cXU5@be+n|U18vyu_~qo{Vt;_(_v>0Vk;P{D{O%SN@A3ZfG2LLv zbLEjyR_2dn;H%-u41y5CmXD^PJL@B>!vc843yj05mNoYr-M*s+mG~*7quZ}bCd(g< zt+vX@xLwS9{1hxgvo<$EOH*r)3dD}KNv!-NtIe~V;tvjvawPJc_#|&fj1(}M zKRgg;_Od5tnf`WMz`~DANV)p+Vi_6~^B3c{(GBEKu`DxXM+T2&QR%+-!oGK=snxq$ zp4uozA|fBhPG9>2K9h&OR8sZJMr85QLD4IU|4Gz9oNnl_8(SQL@hULz$2$%*b*IDP z@%5Zfejm$DdpY4L{I+*;Wx7QCXhKyFm|VYE7_6H3wM<&}#)ZzOeN7;!6;=N!@g7eM z<>%Nw^UH_#Av1g9>+T_0g?43A3seXpVsG84pvIP08d>U&+i8?$!vzSsDK?w;M*N4h zffQ{F4OG`*OE2U3M=m4q+S zO7_1ZbRLe>P!Fpm>vVuZ&%L>@u*;X#*H5la-ovC94Fk83aZQnOgjemQ3}9^ewMk}s zcMS%Dco$t89j$M+D5rF+U&`m1l$D?=;SW>;#xCz^WSO}6G*QzS#=S0wU0SFu;n7(M zYuLxkt4RnCLq(b`qCbqg2SgRf6_Wv78^j#$^hT&)!}JxO(yii6kS3_9mL%LD>aOy? zt;s2gQZ?lFTfBY{k>3uKO0SnkPeR`BJLOZw%ifJjY^7UQ#L?%W&iuK_FmndxeH%2F zCnsmdv`9P1h6}x{*{+onV(~yjEudRd+&dkZ<0$u1GX)*qeU5oXsDxMq2kiwa5Y|)a zA!K}n2meFA3Rr=^WYxH7h^b>s0CWlgI=*l2smCQeG;p6TWQ&= zS|%5C&`RtCd1{U{l>6~(U6;Ktw*AVYNjV=1*rK7+E~_eH{1qUHLimj#(pirJILtvN zqCWg(BBa!*8LCF}j0X%B7vhJ)Fg0<;uer*^+aCJ~q@x$Fn__q1fBrF7r=#)r?%#?o zLbwVQsABxX95fk`#3rCz2>ZW~lU$02-|&%HX7ZRUYj|{rVD_?pZp@XEVS?a8sYCd< zYpe#Aq?6D0q0AArzK;3QGg`V+c50p1rC}qSrISoGX0LOGrcO9*@n5mldjG=08J>83~>!zVWE_m6T4z>XFMMv$8U)oB_gAYgYAVG?+QQTp* zH~zlE+nWSbv8g!R?DjKc_)Tm@7uIX5HMg;MUwXyA`+7)REW}BFarK^cJoAz@`g9Rp zPRf|TGf$1_P~H#$SPNsG{c(iir-bsOA^?C2^mqeJ3yJu}VTyRX+}vY0qgkT)y^7c% zgvj4J8tue4#hVBKJH z<@Mj#;sEniojN$Dj>_jhx0v)m@m$E1=S|2?uIw29YsFfvju4qF#+U~>S7H$I4O}pl z!W>oviuf3vz}7jvn%7$-zXqa}s8S-;Bju z%FhUBRy6QdzmsN;AmA8soHBg@4Nxm)wFNN74~bdnELGCj@xO=%Yx7G)6rhEFTB7#Hk!`S$B!(r?nyY>gcSHSi5C6wLC z_ZOkz6H!2P<@=@vi>Oyc;oQKal z-?>3pUuJbxq3pWMnk_O80S+zd=NHGnoyp{tQmwfV+1Xyx1^kOPio$K|DVT0;WTyMk zs5iEQPTsxBapAg~wr9$#-lL=KyFbyx-A*w1-0!=K3&4|r>ESn!)$PR2BO;Z)sx63s zcjvefIUAiN-}C&`OhqMjO5ORUO#~i!N&9LjgW|~zw<~8g-y3o*Khj(Dv_+`aL}DcN zYO!3A!b|@2A`smVKZ*Ct_2C>TujloT=$syflw-r&DxcaaWhtP^TpukK`(nPEAK;+1 zjNUNVBc*7c7v~~LZ#bM-ORLL<(u?W4=U3k=9Z%r}fyT$6Q?uzB63=!u6DXOGLf;v! zrzr(v^P|mwTL#PrVo(yoDe)^R-CttSr4vTubXrSjOX@^Jr(t1QxYc4=3gaZ_=(>P* zE%WhiM#50Pv=S8gvhW!u9&R%NfI_9nxC9%Q>7tfALp{c%dc4Wn)o{4sDR}k;RMnw< zfAUqBgJF}ej@FfOv=q~8=?xdMGqc=`9gBVpL%+_wpH1ZA&zq~8)sZ;44i^VeKUZRz zn_1=)Bh%=E7pLtJldXaeEP$WyyUb}NfFWEz9e}7xoS1)9i?ko ztUpk?TB8GzL`Y|9dB}6F)BMLt8yD`Pi4zNk%e~v1UDn%*)$+DJ%%CwaI>rt_$b_<*lc-gI?Un z9)dqMyn5ZzX~Mf8Br$oQukmd9VIDx4unkmbk&GHbvZ^?EC8wG4{g*Wa{rf+?BT ziKg28LDjEGF@nOv1_OAJexaR#?M3N46Mis1Ix~nFfWMzp5K{*Lq+wnfataF%KwUT> zi+(irOSH0j^JoMo;lz9slCVH)be#vL3jCb+WfG}q!VJ-3o!wnvGnN6Kg*p*itUy!q zxU|YlqN#cr0`kpvv=QS|vq~BQ@w~4>(gf>@$N@2e=xo)!?io!eXGm-B+Cl&P@uK6T z-1<1;!^3H#DRgN26ObkDNbmz|01?(rZm7l<5f`?twp4O!UmSE#C47t=x;>fkBTuy_KJW zi|{7<3bw@%>FBowZv;=5p#Ihe<5)K%jOX=jA81L+d)59YoPwfyGA0$}CsN@iQFhnnBhOIXfi;o^_TA?yT zV*7HhjZB?YIdf$=_%A-}Sn?@VY0%g++Ef z0IfZlojmxbG@bDJxHKy?0$mGi+#072bUd{i`P~+pY9{!AtK|)jWm+RzdDqSasG`D{ z2vSl%h~5SXqeSUH#4%J%9jK*U^_229lPMP?3gr3%@_(qlN|TTm9#}pPEXPLuo@6Td zRcNF+!ZYLK;?5_-j=T@h^x)OfyPX9ULmCGmh~VS`ByD_1YXs6Hvz0KqGOZT@sVnEN z>lWv~LX=yW>G|E+Q&vL1#x5rF9hUH^gAgqj8@FqBQ+_%C{aek-m+0~%*Vbd>h>xd( z2(cEIy2LDfAiznG_-A;Ttzmhcdl}$MYU9t}5cU+uLEp0gX2W_(HG-wZ#ppg~HACuZ z)vZn0xOr&`STVZuM-e%ak!5<#9_zV%BLWv4Jj)NCoaLAvOm-g-sqp9=|J?b5LC}(Y ziXUcpR;>beK`J(TM+3Z9o0LiJSsAvWLnlWwc05J+^$Xn{_ zl39LY)v5c@KL-0F9kRhaqFcwAc?mvxn9JWzP^TN#ubb7-Z>&|S9emW$_734MN9Abv zW074oeAx_TD!q~0KL)a2do?7S1<1BK1eWi>t$)_V%@K_`@Z$}tS%%`iq&>&z-EjMsS7IUl?wa1lcR2I z+Lwde45seTVAz$`&cgM~1-zODikaZoZL`i;xn-}arGAmQkA)3=31(!EcSZQ=t6tl* zbA&>Uk}y_2ZO4}AT}SoWO;dJOXQ0P=5qsuj0jWs9r$o5^D8(f;fFvp@s=o`Dn!gEq?U);pS zw;;tcav&k^b0^jSIS&@&@e4e8J8<|cNtk(j)S2Ek7FI@%X}WQVRY(83x2ZW zBb{S1zJ?7l|Et7O@Z)_Et<8y2=5fi3Z1lJ%cPY(L*dF)@=rx#P zuZsyhdiqgAYoJH`7fKDG%NZ5svm5r4SFzAbcVc>;O!^zK4sBmN9W+SEId@mVoXN7s zUD4IRvUZOLiBZ%gc*dnzBYwu9;c0gyjx*iucmkNZGH>%Z-DVgG2`|5-Q>LO4jY>;d ziGgAeJ)(*dvZj(X(5ry0?CgU59ly()3a7Py^s_~xRb zZ;JqxD`3tKd>?6%uJMpK*_9EfQkXtr7A$irW76B1qDRtC5!NHAnr~J5zi>pC`CQ8X z4ymlx7%RMXce5$scV{zn5-g2G@t!NfoF3gtwdtg+TZ^hGKCi6^DPQS|4mSSYh#?P3 zfRp16ZomRU!_Pm?i&q_2IXY^E!+MZtqDDANCo~B?z~0D*S9Y@n@k25SOMSA~ce)rc z&`YG{>p4LmJ?ta*++xV3+hgIKll~46$vMC=;u)4o9O|BTQow&6q`Io^E=0z@ux~M9fs^sqmjoRVkhO;M0Dq-+XT+CI8x=BAv&U$;Ya%&S7J^R3CUS z%{){8u5sjGraW2BlwOf(d%4*YQdHCqJwGmS_u3c{9tV*&r7vh~FZSxW?`G5STP4)a zB7>GUJGN^p2M0JzExBTLC2y!n z81b_AOTCyFq|;5<2vY}5t3}%-RWKS~<P8F*73t9;NikEzH zIiv$T&PAlpFE2y9h=_%jRbJt;7Z%h75X+A&nSF6fRL+}M(L1*1W&3t}8ckz(a>@+w zmj-_P0t_O|SUcI@cUU?l76Y9I-_($4Zu379+X@VUe5`v;o9B%N6c!F^Y*UXcAI%2* zp#QxZr0?;#GTAZ%X&RXW^D08_wncsO>t;9b-reQDJj6y@L4_S~qP{@Gp4W#@iAj!+ zwPSEjoKB*8GXMRlgbgJiTdiSCmy#(*q@r?nH+ZnZllqgU0ZwCTUpNze--6gbR%u6R zG@g^Oe3t()B;+3{D|qC;3b)r3ASvtaW;E2iy_W{wN7V(Wwm4>4YXIE1;UMkBGDHLXRO$~OVlIEi-K7uro52?pa@tUDJ{#v zT%WPa(p-!Kyn&A))KY;E*eNIx)uZ%1N82S`QtfTJrqk=gh1%8|sJHb?EnVI4X?fWD z&u$v$T)OsO)mLe6)m-izNn`W9dPcQtZRrNKs;jFb)o$Ejr&1->&FYC$OH1Kglapy0 z_rsx@S$0N+xd6hlN!{a(9(mgjh+enusp*oFSw53y_jtLWlP&CWvSTOljHWw!Uj{MM zzwZ2p@C0btAFI|ryWmP}L|a3#PSN=fL5SFHemc%@9b%MXpIBC(E6d@T$MFX050Zp^LM)dmf1HAT3()3h-KfyE3QRhTjx zs;0H~Dli{PiSoAYl1|uDW7%1?cVS?<0xqp?xeH&;_ytVasVE+}f(}N8l;iCma{=Dy zp3U}y-=@ADDLkPO;mhLlMkW@fFT-`x4fx`%@$QZE1bUM-Ax-pHZq1euqK|I9{$n1Y z1HZp11TO{5*0}I-`3!n=r5GHH?(@S4yT^A$lYt^n zfi(YYy8I-8+1!^|FRI&ox9RV#gx7?|(0Md7vImB{Zg-{oT~i0AORVAFSem+KENhrE z7ZN$h)FawBhN~Me%pTF^w`(a`i-pyXDqqs)*A);|g-!p$#ReG6jhZ1gt3KPs$33d( z_0Aq;T9j^lp{0=-kOh5!%O@hO((GTO!0AZ#Mmj~{ubV-I_Jm+`z`!_xRr<>Sw==Lo z834YZ1~(B}BdU&l#FZqZ&e(IKn%8%hOG}Wr=#7*FML;dT@nX6=me8i)KXw+Z^QkV&s+%9Y-0{Drm6XP4L!AJ@)=~f!kqTQhjqr0+4>jHMGJ*N2&2>_aovqDn zQ8m$z%Plq>$xJeNzaXZy!ANn0-e|~ybQ#9J!h-gz!oTE}$LB+3nIu3)-@LbVwuPjD zSTXbFCwS!7sboWDsVNH|J%d}OjP82_g{DE2&F;GsHe@#8S7s!v&J~8xLL-0Zg3LdD z86h6J$(6Yq_|vv_*PSsWv40co5H-atz>jHx;1c+Q4kj``dEhyT40b7Md)hwjqu1k; z(aABes0f}nf)&UBeeo2$k4*7v{Q>%X1`aRXn|DV z8U}$BPqDsSC3E%ntWO3PMSmJ@xOau@qlFgjjA-rc7gdjkQ=7Yo`ECTf+}3QvZia8H zS(mHWt zY*Ue}ELNcXWs#>a7y7Z_Nc2)Yq;08@S$dcaw4O8w%3k2)8A54L4~W z<%FzP5-r0#X&}%nfDMy%`+TPhIT2v;*&%1=lP?(Y1WMS%b&3AKkb}rGp8LN5lix?h$g>Eh@D=XT50DI+@#_JH1 z)n%41(CDy{4@thAra+l|186xc-Mm);%d@yNE+wCsSV>i$l4}Y1R#{!%U1axxK51`# zyhx>E6T3aE^J$r#>@mDB12b;5UetgN9^5JtgL*;pyx*dxcFJ6?Fj_n^w-((NZ=OR6 z7q%614%^mPuMcM~gr-DfEnu;k3pci=tx-AeGu^dA2TN;jr1=kU=IQS6Hb*3rk2!k|f3l8DFIIUNfcMge zzLYm#*iI*IA%Dt>n)~W-v(pz_ttfPL3EQEO|MU`sis@L+pKos$PcKcT)l?Q*xO;fm z=z1$E&I)|sq~meB51S)V4%-?DW_k2~SYO&IQ+6OAvumsfHRFx+Ps6|-B>JhI<8ycDPd^zfv)>O`MwGn?4=b2y*n4; z8k(-Iu5b##a{b(1i@PjoDfZY+&2`OSNlDQ= zNjc*ykLCq*q2z}}&IzIa3~oIe&A_nK5C~?c?WAKG)=95r;+iP26e*tHt#~|v#c#qQ zTER!>;K7uOpm#!9_q(6*-fV9Yhwy`j2iqCbNz2%tuHLH^I7F`*g1q8jvo+RuCCVX zXQ>A{01tJ>d*dgH=~zgg9uE@4s~Q{mi7+B&g{~ewthDb#Tmgs*4XyQcvy?AoxWnlO}`>7@L5m= ziO*w^ZYd`7@t;lcUFeiOl1F}VS0?+Noh>@@!p7QCxrx)o312@y%%f>JMp0Hsr>gtN z^`_iIpz-F=sk1fz=l(b>wi&DBV+aPMLt zEXp4&&~^cbOG~mUhHyP+tuk*bw{<+yf|v&~Im6k&@Km(+Wl|IU8^pM}{>?9SO8m{$e1@?`bkVtj>tAFvzcQ z4&Z(`am|x+FX$)dQlW3c*5+%@+C%oC#Qx;5n-iCgVPQ%(KE7m+$dNU=cj5B<{XFWL z3=BMX+Be!jdHG!UNF>YJX-rJay>Hfoi!D`rJ(`(RoH+kOsVJweh9WKpK^{gyM*y<( zowo{Zh+QUFU&eyY!}BeQzIJaofJSEK=J>d-y7p71heWDHFP-||MJG+_itfyVBTg3U zwb#!uuq2$VQ;a^YIev*&D5LtH3f5}Qq#d7er(!o)@d*9|)w$eb89C)m8-`lV#ICfw zw@oP1bt~HW&0Qt03xB@=e{g$t8vEea-graqB~Qz$U!QU?=tM$(F!+x?p;L`I=@9}u zYFbgS;40!zt)Y|D=CjaLSZ)kuK%NCANV;}WiQ}g>fq*!fU>8Iqvk~`i0m319AvZ;yr&qO zX$Y}<2^S^(cKPtq0_4E~6V|J9Gl{&$hit9^-Q%Eco17e035g7Kb(;nkNDX&YHT%xP zX`v)1Nojfc$wA}kw{LY>m4DV852!y9`~{%RuV|s>%M7ql5oGp)9R5x^P#i8--Q4Z|oP1gIi5cbbc5h-VB0|{Bjg4qf zFQGW`dB9a<{+qIKHXBYy7y8Epm@TdBLT!aa_8t#T?@ye}_FaDDB#Ifa0T(RTC+PE#9f!s1==8WyqN}FcS z-33~IYs2`P^9CFIO{DXelF4?FI=onwBiDoG6$*@?NX5v{oWw&W?fRxD&&Caw!?DAg z*Z9@sU23_Uq*D(ao!L%lUb{>kCLo3CpANksqvYfBElbn-H~9T(9M2fRt~-?mj(=0? zHWl}<{%wY_cRcu<{3kS5Wkdq|L^3=-Juw%Z&PDqMW9vVX2md2u@VVMhp7rl=*I*ZL z7EBn=*DPo{{okqqP|JybyJ)|F}osqqhDPz z`$8sM%>HH59@ubf{qLlY6=%}_%|Lu^uK1VQe>AUdK${}b{*DJn+4eV45B5d%cqE!y zI_94{SL|5PVy+4vHZfQd$kU9(tP;$Tsi{ptON#zp^Ps=q)zlzW|1?+v)&FVv-x`ia z{^?QlsHvtl`~Ro;|3LA-2>kaD|JCr9;{Q(bzc~0m^Y~u`{!bL2X&RCG8sdcdL0GL2 z?)N%gz8|lzv%(ZShyTYy!~IQ*`76VJj1#Q-zdd>O;D0aJlT|Ef)BMKbeXm(C*=!{> zHXK~U$G;BPcY%8E_+p~$mK7e(e)4bH)#)!cpA~5<%{Nac+uqw(LMt=L?#XLiO-aF7 zR!d#FSQ~OKQwKIzj?JnT1Y|nvzsWvZ7OTF*q;%jS!HmImr2O{MbzjTrB{Sb0>|mq< z@!G8N_knY;^~SK!inpr|EYUOKRQuh9K5NH6+`;{Taq{v-BSizP(deRrUzl#klfo9e}R=?t6bAK+3Duvp&o_2q^9)}6ZNtmKK4hX-+!Z29JUl1ws89ou~# z*u%C=kIb2AYwOG^W(UpbNK>y@Y6xUVmF3pQ+^Xs34ZLkl){^cVV#WnyfQZ9u8Nh3&+{_+Ygrt@*YF( zEon3ecmrm99ML~MF(3>K{+TeOPx0mSgT;QSKepv(Z*`kvzpb`BYfKf@P;EjMovLde zLl?r0^9~K*W@F&Yx6LH1oAg>JA3v*)9Y0eW!uQTj9eOt3IgR;roUS3UAHa?JJFEFv>)3f z5Kk_h`ZRCEAL_V?& zfo_6ZE2D z$bx9MTiohFU-g|iPvbmk?o9-S|Md<;f8bl^;r5q3s8#Eb=7zdWFrrLYh)7?+OCPq2 z>!`fJAsPElp(? zl%}^h`zPJC(OXaDTmL$;K=5$4-Vdv z(A#Sp0+)|N)E{^WPOxUhO2BDq>&vN1H>cX4^oS`bSR1FVV}rp z*#-yUG=iG-#msO=s2>?#O7|fX*K15k#z#e71pIE#gIim7BF;#Vc#(pT8EK>K$@WRD zX@M(B5$}#7y;>`EdS|?w#inEFF5DIvgS1(B9cVj04>C=y;?Y#?4@9=A-<(+VS7Xt( zx#|v=xQmRF1xB1xxW>=K%spJ1e0atA12^B0rF^@~qq$7AbF#Vk1?eGrSDS{5K-})R-TTiUYH=>!_Xu=K z)Oh?+(aHZgm)vBEh@JkOEC#jlG!4zn){ep}wZER+(doj*vwVWs5P~PR)Vc8`tO7$& z0r`pEVTLR!>bsGDKmdOLu)g-5Jyo8@h~ot^71nYEVi+>C|9j0I^U`P+W#8{QEjfy^ z2EYQn_s7sQUl=%tFmNtS`yyIw24ZdkSh-31in+T|zfH6uEWNx@+QRKIVQ&g!3oMg* zX%}I}n?Y!T$UiDi)z~bjmiz?-TwYmOSU7N|0z8zX|9_OdWprG*(k|?n62}zB6f;B2 z%yyfZVrJ%;ncFeMF*8G(DKRrMJ7#8PW^8{wGiT=B_ndpyyFUHs)l1SYZIx6dskWY~ zhwPIHa7!2ufrP7gsLE!u*S5QmKkr%LI}wjgcs>M7TzJCpvY{@+@pxFNnRYYUu$O2C zDFMbox8Bzf2asn8U97J23L1t9s|}90&C+bfqvW*gPq?uyz?laZcsC6D>FJ3a$MsQa z3=Oe~Ch=bH5dA>ZI#T=dmwuS>7}>6bv%ZfAltS^U+Zx~RpC6n6B)j?LRZ= zo@Q>h5E~@vjc4YH5_# z;y6tkzpsp!i}va|ms%6bPUZWnbY~LVNIXU#rR;>@IN)&+td=vvQY#H5y@(9tky0}9 z62h8)I>Y|d^pHYo_VzZAf1>V9bI~WteAA`n+6W%sld7b`p!)jX7S=79F1G^Z z?X0(@)qM!Du+=>ER)Oema%>$h7{zaE?v}ooNBz((Z^${NmSHZT3rVy6 zE6u0HKK_jcL6P=mo#2b=;KUKjhJD9a4hgYVDRF}mkyTWqD#>Oo8VawW=*;#*bd6Z7bZ@H}v3=h258F;ePboiJf zfb?KeBMhFoGLI^I?a;7WD&YwBZN&IR4`Pihmy#uC;2vhlB;k|@PFJueT!^hdNamhc zOw6qhzfyBm7^_y{7&VA99>wi+mrCL^UubhsIXKZ7YS{izeSf^O0%RHoKLfnfZ)f@@ zc3zu3h}wMzzwXix#tjB|jmj>v5)Fk@>=HYE00lvR>^n}gHWbxB9v~JZ9v>wYv|gOi zVjfMg!jxM(v@OP4(2pcLbmIzHDJfyt(5^piZEvbi#ktv6nBr{p@GfxCPCi6h5DoCxQ2=XxL%CfYT+d z(Bt`CiQwAkN)n#Nm~Cpxcjgj*N*RWcXDzE<0`Z3FM=}1I3c~MM@3A zZtsUJiTPfD=E+2tn_(&KGDr|8FDjjH!AQ0vfcn)D6mnCXbV=}KZL3F}L)zzjv=M*8 z>#g?ySGT3rG{2*{Xx1z1l;rK#HTpt+45u1_{I|&82B)g^md+ZIu5_%cCCs*w%53Fp z!<3g~F~}+7e65^-52|7Q+M|$yVp;_(B_=!tYTb8*^Uaq&QV{2}LFz@t)s-dYeN|c5|v^pmY%n5$jhb9|a zQE>{a4aRQ|k9&%9%?%3W5#v{UtQM@z`(Smw5itMhIi-0TOQuBflGIbY+}!kzN}sy} zO!s!FT4zQogt;*TYH;*dJtp6R92T0D*iw`qH*LR+r-;TC;*|&BLsQ)ZYPIhAS*fcB z+V`F|n3`yj_RqNa>XGt6bc6$Lf;bdGAD+syd+ z9H6e50u`5$R=mrC;uQ(Zf=Q({| z)>&hO7(OpLd2StukCYD}LVkHr87gW;G5^UXYgrHf;&G}8eX;{+mkVTpQ|wcV0qe+_ z{xbQZqhYNk&y(|Djk>gsF2u6+a2>eN0ia3hmU2ffm1va zK!@UNM{a?USOTP#YP`1UBRZ?7sR;qqZ>ag03Hu5P_^qkK2XGKM3eWMHnmO|zr+nrMH znINCs3F5F5)lcizRikxDrWBQlHig_BIiz2wP>;(}jwg+u)}$t%yW&7rW1g{*xdTnfHcw#I89^_voA5J!l%u09~5=3g-83 z&hpoU^^$O}BLypyQ_70zT_9g4LG_+r&4C3lC^MY$a25!!X5y5R1AbS}lv{Nj$ex-? zAgan@Tcs-FdAbz>6+2$)=zQFrc4Ef(vG>8H9TMXoI(@U?lcO4q2()2MX~v80=Ag5J zNo3Wk@iR_#J=QXk4KFM{l|tiGo0+{6Q8Ta6Duq|;bf1w2N~g=t8dPaDyX39#HtCCy zd}WAD}A7}wSNsku}wPKfj}`Ergr z9alT@AvXW{TSy-3g^G`BtI>~W-pt_KCWd>vx%D!Vx2(=VLmabs-?7?lYzL|Vzt@C6 zUN0P55f*Ju)3yVe%bm`0mXo&`eNuCm3^!C z^g*ceuuos3ppDGqD2Wa3`btf7!z4SgZ@T_&(OfrX>WGE9;tK<|nq0W!TQxhvD&Tow zc{PP%H2OG*#v%}`GP12H6TMvcBT%HgEyE<5u))4^oPC}Pdv%oFnZ=J*4?#{jx9lK0 zojb4>PlQ@54cAnA+pUG47$Xj`CXTjq+UA7gkX%nXhw{aPy~vEY)9DI#C4cl`3tH@I zhyw?6;$-)E-cnva=vztO-l&&bziXinDQ8QTVE3IU#!NzdMlsnGWTpmS>-Y{JCj4>8&PFq2A%fzsMh2R$A-Hu`mc4|+b-TDTsVE~a{~Xh|v#N?vl^rakWiBj#PVsz4}t z^Koi&6Y8Wv3GS^ zQ|Yic)R>IU;V!WgBVjFl)xJA7;yOK`V*B2Uvo#)Zm>{!;FLN*^AqfOm`8G7mVx;-F zDTRS`*wD#A4kTKF{u+bj3Q_2RJ4~Q*O={A{q1%d0rx!JG$-;r#PF^85WjAiu;`8>9 zt?SZ4nj(*HcKYH@@PQVANh5(#1{x`rb}fMgPA(Ns=-y>+B(~?yJ16ZQ$kvQ7B3GiZ zYT;R*30<7x=JlcTEzHYH3eZv;1HmoELB_nWv?DwhvQ_3AuaxdXb3`Sy7^u*`@aZw` zjY{u-aUm2;9ZEzPE*{ml!@=?^r!sx8EQSje{}vG#fRn405vJCB^g*I~0%&*HiK6P- zYYmV!zP$j+0BP>(N@*QHTu%PiwlvS9JD~cGy{T+E$7=I+ULI_&V?Psb`zKsfljp7J zBCot_Dh#G?q%^kkS^X=(K5TVa3)J2$KCwZc>S3J!Fn{+MTRWK}D8n%fB$;x<^l>F8Ad%GjhuIJ#@vE;&Y z-%u>9fI{C$MMPFe4_pj$HRDOcX#A^^2V_wWemh0vuRI}~nG+U-~003qJ6!{UyaX~Z z?jjwG$qGKkI3M7oV>;Mli=?u+J2+%Z-Ft1^i%B1hwO0_@5?tooIv$OCXtcxyrjZFB zHqY9^1xmP#*R;}*n($4DP%Dp`Ro`gB*P(9`05acHRgN&@t;$f-m|TwoP}JY>GPV0) zja`fykZ!v+bI#7HVPWgGA&QY$6DxgR{eguT5znucMvi@T?dEpH5*|3efmvQ6ZGAML zEnJIOIGYHTVf%IrW||&uvo4Om8Eo%OW(-nW{)NVt!7aFgx5!T1^qhkCTuO_H5`p?M zwoTY;x6@cS`(V>kcA=)Zw^ zto{lZLnMjPA#%69EO0R8#;AHii;iDv8YENCE`V05Fe$rksJA~G@x4Nf$U=u zS(KNtF|wgyr_bo;djc*})F@sM3>j6OwdEHi{5M>=yFk_Ib>~|!hAj42mn^`&sZB_P z-@gebV8A(Bq6u#8=vFTTOjYHZFEwBk>b|QR+*b(Hv4_rd9Z^eS;{SLvllA7&Ng)J0 z{oqIh_hyvaFIr>Ph!dLYHSgJkNWQb2P(=>^-c=oI4f!r$vp%cR^^ujSO!*g%c}>JG z50MLKzzmOY5%WO8powAyUDEK*l}8JrpJa;oc&NWV8g9Lmy%A27^z*TSxzEi?nqlQV z{dnkNkg}Hy_#|KQZ63GC!(=C$EwT*u;mL;5XA>x6`i#q!yFR>Sb|%X12ki;?;SNo= z5zq%bHHt;CgE6zH@BD^p z;N{`>wIbCYAFpilw^4~-8dDlsCCL|x){ybDs4ApS;?}(L4ifme8h+q|g30zK+#y)5 za##ih1>LfY&cU@;Y>f6GkD_-e9i-2g`EYW=Z4pzuD02Va#@NR#aZ)u~xXJ!_Or0j+ zkzetTol*ukUaiG|YJ8C8Bs-ZzC6gL4lr<&+Q^IUkxDr;YoQRUQ0j zIT?(EQd|g51MK^U@i$wt@nCDMbEB!>9o2CTg1{lWU<$@n=@|sC#3?TxmW_|N@(KHV z_{g!v(G%DxSb1x)*M)q?0Sd_olk&gFni=y=O()RLr$c5XfmY6e!|!TEBK4;Sd*3Ly zE;(}}qi%ii#10l_8V8A>z=UsY?L~tF z?_@2q0jvqq^S09^YpvH%F6hF(A#}!Us)ig@+fLPph=Q}`!HLK6YT=z5(ftyH8tYSb zNaF^#Yhi4ZXAUwO(3!`_BHQf(FN4JsAoMnTT;*h^SrS^=_x-`OQU^5mi)1LdUZ8lt zWvpjLhG9IyMyy}5JwUFkXjmtWI8Q@>-r`K#)iis(C#hjQK}wanMmfV z(eF_G50jvV%JkiyDaps}Yjax_MwF)>tk_?QXBZ>e$TDxulP0^!^J|W(;n;lh-6wiy z)2>j}6d=bc(A&XQTabIa5;odhmr9cNmIZ-~U;4xo!;Upg)n4WyOcUX<4@EA(#p?m^ zLEz2vg@mj09rv|)+7q=wOp6{WgCk6>{qzJ+W(ipShj2kbg3@Oze{*MsdyeU%+-oWg z>0*RBF{N&Oehd-9vDSI~vbi73W%vbO$3b&U5mA*kXyWpYam5P2LwiNN33^X_7zSd?K7guF6rB{;=&YoN^t4pw+a>E{@9STbUO_nPYiz1=$Uv> z-4!o7SL}k~%Y;*`;Vi?G)$~gYmF-f9w<_q?S*w(to|l+0zj^sm=;$lqtYCP~h`7 ziqVD@dvqER90$c>N>74fw3cavUHWy%S81m|-2N&9_cQWuZyPEd=zYsE%!4UkT;l!7 zl=>@ePfXH^G>;UKXHq%Yt!+}>D>+>J2v0%EBC7fMg88NmB5|Lt1`iYfZJz_6_AJuD z)=v6BQM<9={3qRJR`)f;X;U6gPNe zeUAL_WvUBdxj#nG=qA(oZl(}mI1f3s4!y~LkIgiV7m)`*q*{^HeRKlINP6vf`>`F= zmj8kln-ZePf{jL1u*w6}+P%~YNA6!FIXW^=M__3^BnlJ6gY&eMRB#P-M)mwOR^Rl^ zVQ_!4*89+Fr*F4PODr2Xiu29rS@@dDLo$zX$YC69NZo}qQ@l*D5kx6EP-Zs~t~ZCn zsAY+|&8C}_V~_=a%_vt~?zZM|bFI5$47~gPO;Xz<1`ChM$6KX$q~693h&d!630AEF z81^Da0*4}YAFrugPTI_FDsii$s8GlQCydFO3*f$2oix^>*|@sy@3QabO~+{*owoY?Df^ zeBkvUIC*q%FT+^j=FD~K^U)aW(L(J9p0?3l4+{HR^jFa!uxOel{Uf@e6YNOOE|t24 z?J|`6(Bd_fYs_{HE%Z2RkjC}?N&JeAD19tXq zXTY+`H8_1<@4lbMitJLXwd$C3#TQG@$yjQ)KUs7K% z?nH{3YOQSsOSKPI1ZOtsUE(a_d+r)YLPE-#+Hx#<{QN_+h=~Wzc?1V$PqIz9Sl{;T z=GT#4E3474UtibUr%&yrn>T4EI02TL$jOU;Vu<`ayrg}1pfO)tZ-k?ScsF)pm_8x7 zbBO~J9!lClqJPqQY!nA57TM)?3?`QOprh1SPeu}U3orQ_w?+-vRYldRUi)xT$6`N} z-WJ??VmSTjyX z=-YaDdhY|Ow}=hTgRObT6tuzAiXExEvSsHZx;9QBdgjpg4a3O%;mMrcc|KQ{=0jJ( zo3LQ_3n#e7l?4)IAn;YOeS&LO$}xD}7heEakPPht&mMn9d($HIBZsEvIK}mi(fwOu znR*c#Y2J7F!(94rY+S||kG26rpKj`YJW~neE+o|bQL8KbK&c~S= zJLrK+RSH*RDOXnqY;89k4cLiznezoIDT8G_h&uSy&E*Yy4Lv?A-`fjB|D*&q#nQ(E zIx#PeE5D5oH?twaU)}QI5kXxRI#7LafSwD!!`W645&?^nEvRbjgX^F3I z!YTn%J6tM0V#1&DlSidFy#Y8iu)QVZvBhpE=CDRHSHQFsz8gx}uH7hGzoH~?E-3^2 zeh&aUljZBUdiz{!1(yUL{zwlPlfe%M0C(ngr18SHCz&8loxbEbKAMkC%)Q>ws zaA5z`ccHy+Gj9^=hHN#{_fF2bH?kd}s$>FXzcytmS8vaEktc1|Wd#u>j&;H^038`M zJ)}f^r_c**YWTyRQ-aGEJ~~J71TcT(2p+SB34N|kGWlMr0fFmf_(e^lp1S95TdBP( zi@Xyq^z0-sS`xBvQ&NfNB-5wvAiP@=;TedEm@GKIHH1?DmE-p!$mQxC`RTcEi3+q7 z=UjhLB(@nlRuh|=Sn+(&e=h`9EU9LU@@FRTzBPj?Nd7$x!f2YfTN?Fw8Z{*DzLpAUaVuzQp7Avt}HlP7NdL2!OC>p2Bkq4UOkE3G(<9g90@rpIweo+ahkoW^up z2q%)4D6VHcjg<1|&tD1e5zPpcp5_N}3=5f8BB*Kvez;=Sh`xu-@n)eeqFJ;Q*E;)^ z{be{Ht+A6EPF_O?d@TD=UDZb7L|Oj5r@5jGg|=tn)t4)hoHgWr=5QIK1#Hlj)(wGy zFt=#)aOtf$>*i?_19wFtpX{RntuC-3bupLL<-)xeOXdtLNDa!TQRVW(^2FRW`1iYN z4_BQXBGsvH0{x}lj2LU4451)pV?H%aso%rEcT*e8uItkF2)T8%NNE;kzXTn8^goJj5nT<6 zu0vao^LavZ7h!h7#m}#Hg#hKemYXRtV@}g0Xo!0DO@6_>?4uYKbL4NJH03Sv+$*s5 zh4<%8lzBW{8Q{AWc(uiCG<09?`TpEi@PrdIXN&VmZ~g+Uv9?>^oa<>?z9L@TsP1B8 zPp|7$_5hiAIFZdnaRY(D&ScFoZn-@_$e)k5N46ckM%XC*oZe4!T~QdA#-|TSiDY@^ zQl5-Nd%xFvC$fHNPBjQ}H&>@g59C}kcwm)I>g-*1e%1aBvMkj2VD|yfGZ62&&2{Dd z11o6Fli6{}Ad@c8@%)|AqtjWTLlxtxn@XC>04N0SVd~<|o$Fcg&ywdsj*m`B?2`2H zx)4BLIY7Cr--qjYoa<&i#?fFm>a$*w-Me)t4)OhZ(pXoNvD~hXv#N>#P#`Yy0EmmX zUa^|5BY~)bm4* zfbQng?><7+yPw~XMtS$EN3lkbVAzfw9^!J5coLpEO4tL%x5t#uUt@gBLcqqA_T8&) z;t{SIV3W@Iw(YV7`mn2(DGsK&L_k{k-iK*w?nUi{Z6%Ah^xk{gC~Ec(abAN>+hZw< z4p1u+7M1#im~t9*mObIOuo9P4p+=Q%1-zb(dr!@526~c^b<%a9?-r9e!}5zL6{Ykr zfg=^A=^_!eZdCIgyCsiIdDttFJiv#ocR5IMlrOh^4l*D-eR;v@!c_sPQ66>J1V-O z-{-e3Mnxsh9w!f(s^GlrBqm$jaYg)yCH0z}nNDah#_O{cW3c$e7SVX&T13-CWrm{; z)reK(_7j?Us1|iBKqU3jT!6^qd7q<|8}f}Aa_#D7^l=s$$v<)i?RSzQbsi_(_a!?f zO|pDhA!)OIWDRi7LG|W**W-?Yz0wLC%{E{)D#4o119lHR9CbCm$Qe;xySrrJ1W8tj zuV`!V$NPeX){(t2djkz+bo4&3fT)CQoSO3tJ8q569febh9WjBbq#nP140WA(ZH4#!Z%lMs+>Gl` zd3jnbeHrf?F_?$Ny07wunEbRZ3nvmpFAIfkN0kK8uYO(Qjgz^wRv+1JDm|F2`ARnI z#p7;c3NXifbac~*x@%9UlL%{~dO}VvNEDMO7*R@@%uJ99Kw(|nd}oSi>Oa%_>e!dO zn#op-m#WX}YVPvB1f4wQKs5?Jhp&Ui})c7-(LFk|GEfmLOBdj?TJY^T z<+7#pUhInHv&eYs2Xi^k+Br6)@?Wz1>oN6nJtiz)13c%e3q;!LG$9LnGF=!p&LAwC zWU_oAUP=5-h5FC{8DwY1M%l^eykrIxcY0kvGVQXl;5yzmu|uF8z#a~;Kjy6z_JBvA z9i1eo69Uiie$8tk5;UoSQgBZE8Qt5kYyw&a9W zJjpkq)$?gWy^A8?kyITOqT4R>Q2?8F@+?QS+dWo^O$w^eQOVKE$&%9oio1p34`%@)du1`8|*6BV!La1h{h$`Cgj4G$i{`^3bhjyyll>&`d^Yf z<>^{IVc=2Qu3}EAV?i4QizYMLm!S{)-{~R^2%Jn-u^E-bC)(XVmoI-hd}@3|jy1o< z4ikGgBV5G~5)POCV`_sJurwG3c`$_mApQ*X{$OSK1G2|qd9}}+wj@_OC2fb9Xn$j!6WJZ>plRZN!6{@P^y=^n*tQY zBC8X)F~)}mFV`YeHz~73KNkB~9n+5Qgyr>%_-ghpxPzd$C9m?|o-UnMy&}H3o^)X{ zq68VDNmT>&(O4$z_Hj4(C$VIWtFh!s!eka3*(`5)Au<-?hl9c2uQ9qgZ2Ot;Pp!Dkj0wj~qC(w6+tv_*o4N)p8waCs1#MjMVez>tRmQ5P7uO)1w0P8rBX zg9fOcZlTOlM^;Nn2*^KfCwuEQ>0)&GmKVYTnJ8(zl$Cj~ZYS&XfOPaWj=S*>bq?X`1 z&S=Rll<`lODL;_Dxh8+ksHlUbFEjjZ;92BPdQ%uA%Z1O)cflRWAP+5^=t%fQ-ON~T zghDw*R7o~uQua*&i6XubGZIpuiduP9mP>VT#??vRGs#G{kGZn3URbTx2zLC_b&$J z#@ZD9efL^47Vw!)5DzrQj~uvf$+>h0fn1dS?eD;0*rMNh_85Y5odW{kUumdNUmK#W zU4Gk!M^ut@cXmYW*GMWGl>?}M41`LJsIYXb@491mbcvyeNByayk>XYF2u!9zJm`Q;kS8$slJvG z3Ws~?sZ?%1MMeCG4psA&5rf*ER5gcqr&>i(_#3*ltQo16;w4;8-f2KLW-Y`m?ymq1 zqyv2hjTsxwXZxN}`5e<&!2)*8u?Yt5*rQSz$69}^%o)e&Hw-{mx*|Xhm2tp9$_>_G zsXac_(!iI`KCq3EUzzQpxK{ifm|EX8$KnmYbOguJ>O5I*aT8W2<>NFeVVg7Me^w!w z9R`j#&BsE6t#Av}kH{?aG2q%hJ|4kPBEjzB-3BTu1`}ek3W;fHdG(4?2H;xVn_NjxVSU(~a$`Dg9d1KpxHY}2oVV|^*g$>pJP^BROIEzqUsm7IX!%_|G z8ff`GE~XtKZkz?W_)o&%_~RK&jYsB_?0psEt-z@>iufc>hGu}!dgus^n~g@m%~F=A zN$pMDEV21U`^s;Pm7F7o(=;CIuEgv;F1USlA)=L;!$kE>C6;bBCNT9lk<%-1m^#Pc znXd?Df7}H2NlMnPuLie1u%nIOX=M6=)a0k3^#e-`<%>jXn)v-U4+53dT6`9Th$Xz_ ze0K&v(R@nc>Y)7NK|(H}&CWzF(f&&+?nOo0@e0$6fp(ZU3t4s5Uz6Va63yH5CFJU~ z78{!M61wY`RAN;9Z!o4ED%Sj$wm2SG47d=rH&NIL0~t4c*U=wj*AR|_rj5wC5zXg6 zuXr0Te~i-XzWxN*#JW&r)kF_BDM})*mGukq4euU+nHB>mJsACpNAQoP{`MSv7Ck%2 z91_}{TnXW(~v^bL?u(R~TFU!j;lx(LsG-;U#WqSz|aYWv`RYp zOWA&^iEy~vU3A0o0(O!b@$s%T{Re>8-Pxw-2RNvE#`>xz>91i+qzI1G{v2p@^cX+= zg4QwB<}!?8e;ZswqkIpXKxiB+!@Jyi3Jqw^`2BrL?)HLkq2IO!Fs3Q_yr$emxul+` zLrq?%KVhSHZL6t?%eumd0yh)@0GKG_w<-Q&fMl_CsxMC{yv1k)xwwhHN8@y zISvfUji%NFWls98vCsFOa5{QkZ&d@IBvF6XyIih+kXmW91aSw-ZtT*unD!)G9o*~$ z*sw|mgKVeDk!?Jv1gv{K2)zvR<)GKvF431jjB(jv3KI1fr5y8`q|dVPfnVot(xWXw z!fT)!cW3VANk~j06gk~FIEsoKtJHD`^eym%t$4Xtt6uwBdCB2nZ`wps`4K``wY=n^ z#n&5)o`pTPZmK9oa7lnZUlVRyd&;UuGJXH4!cWWRjR#XzWcYxR5)zEEKL*jeH%D~h>&`XtGZ zBcTwU$B|KAWot<-*%uRY2$-tl&CjDIp;o%g%_j&F%){elZ-|hJSo+XH8&?1OX}Re0 z%(O|Q?&?9*wL7tbmiOY+k6S7z`}4!5Oj*iGaP7{9<%Ocohos_|H&E6Ll$5suMDj`! zOXDvwitqR0^R9T|IJTw2vg_D#{si&ab6~o%i$-#K_A*h)S_kC8oj~B-f2P0xK#)#Q zzSZV${{$Nfg3BW+Ai>Na>DK%&?B0KX@%|&@KkXk$G_~P-#HL|{aFI_cg8^ zs7X%?74R=F8-Kp{e+P#CpOQHL{I;)YpNyw;7;NrX^Zsx=0!a`9268aX@*|%MDqszN zY3{Xf0TS#f*iy=iXZokTIrh_9GxID^;^@RJ^?d>eNiz}U&&LKpJ9}f^WP^ZmR|n5B zw(DxN3|{*`acn!>qDyq5W}wMmruS$zCkTe zgi*cXqz+svycqD9nCJnP0hUuaa3U*nWVY#eQuKSM(u zj^*DJR<9s~G=Z*i#ObmbNjLnuTV)s1Adn93gK;*(mBt*6=HD1os4TFK4v;5>$4BSo zKubzpRiKFD1=aRem97oJNHfutr2dP_p{?9aApi@=!e;nYgF@!*pS^?pOoJGwLGsp* zs zMkSuwLdrv2_FL`#|M6blm0)L+snRU)wU!F7teq9+=3jFY63G-2QVc^mgg~GKJRM`7 zcbX{oIcG3>=Ayp~kuamSJT@PqEdEM|V>>tIIz=K_KVpcLUn{_T1UF^zgB+1vY1FG` z9-5r9Q>#dOYF~}R+2t_bQ5DD6?sAsec;PWQmrnF8zaING)B#eCFtjBAD9nrVt_`4t z#la6z;G!cXvo(NPEOr7*KX`NGdv$pz-3u=IO8;|a+>WFAkyATgqQqc}p(exO*PIiJ zH)Zi6zWdUoKaR2Ju^BE-E*FIx@n~p4b+h@5~&zFS~ z8kE2}N_y4TEwpdR*aN4YE^$%jC8x8w@iEEugJboqs^>lfFafJO-_8-k0$SZ`f1lz; z>MNBPYSN*`dURJ6ytM&)Q$*Ijnr*e-sA}FS1{#ScW7IW|c)fn6;;;VA^>fj1f%Ew$ zzujC}zI@1eORj=jAD*9wQ< z#Y21Ety(f0fpT}8BEkz1dcU{`SX^i}Biu*Lv@?k?id+ao3gI+c$rIoH!N9429N{IO zOIhLkH1^rEDM3D3rS|z|5ejt=D5P%e1nqVB^Ls72sw#*&P&HJfhD17o4-lFr{_sgu z6qfXr+i4dhScfe0nHBTQSj{<&?ZI`<8;|8sRbrH7WlHf`S|!TUEB;C3)my1=n&R7i zPz5#m*kf)b6-pWZ-%M5n8kM%Icu?=kTVC0|e7+h$UlNVbnFY0J>`_EMI&~AbmjZ&X z$vG|<62RHCV@A0(gq-CAm8?W4!?HCiafz+Jg)2iqNS?pHRLjnII$7)gYGxjK$p-R# zHkO3G_)c65K>NQW%Kk3tlJEz2`F;WC;TR8cU@v01=}MGiDkVj~gl=#49#>mIZAsX1 zdCR~@{gHHrIli%KV5nB>sn-axX6D}9xD#rX9&puYO>g!UMg5oI#NX0l$%sW8d57r}Z%LOkJ{m(A8x-d;B^p)Q1DLxpHG{h?bE~t&0{XAC9YqFUp z#Vxn)%<*T~?U5l}LCH6-Wfc1fvJ4B${aoY9HMFGuqO;BIZ*LRkWsdTGSk@%)&TtZd zRB!UYw323=PW|r~T%nV%Wsi4_s7$E!`*her`YQE` zsmvVS;r^IT&eM@7fn%GL&S7Y#fch@jS5V2!d_+^W|MKMVip;?t;@;%1l$Jh9!c+uYD)OwtuO1?){CrSbE9eZwcuev~D8q^5Z4&@M`O``x*ex^?=hL}kqHkl(^N%v zO&y4$N{3W_Oy%>5BKQx9pbA%*1qBD1Dmb4m=W?Oc$=gu-Ugq9w&73gNw61|QkAY}h zGr6(y(k_+eFSFi4FAug#x(=)N-MLk9wa@hbbQrR3mfjSWGV(KHFZbWn&q)!7SA1El z@>MPXMXsp<7mq>- zUkTbeU?L@Q520aMTNc=xx7f4I8-P=j=A&vAJ#E(~g!vxoKB|>>+EMi_4E3|3M^K9( zA0b|t=c|y%RlcHHL1q;gTKF%y7D;f|#csnyqgCs)_J1~JgcG_>I?FL{WuUI_qb zX+933`02_vym;`S>dFF20-UMR(0S;9b#&2WirXZ!!}`1}&G*n8d~a1jHkW%?-HQUi zroPieDrt?ct~=k$H}y1p2*72}4_u~3IToH_2XColF z6w8cfnf@l7A6B}AVP~e(=c;{mv8Ok8N5gE9#-%R!{Zc+ezEdE$>aGQf%``ur2R#PDT9b<#?bl4ANhGNTTBLcsz5L z;{)Ix^>?2BePn~UZpnU_3a{@;0+c>EfW;e|k#~c#7e6!S4^ydDwu^QRrGYtj6^{5& zJ7`M9uY}z~1E2h4(*UJC)lXM7QGA>a*ZNqm2@56~8()6w?MZ4pZt_lOSnct6wR&LQ zsr5BAB+nhH@ZbT}!&$ud@njFxtoDM}FE;Vto;*yv`)jFMC%Qe29{lnNY3n|CNPQh~ z{X)Z<;$yJLMhTNDwX7@>C44}~AG-`#=*|;Y+wY0C%1!uAZq=_KO1WE~`Bd{P$aKj9 z_ryI;jqXn?0ky&=1v$+0n16HI_q6`PX}8wvep(w&2aCUO-}N3g*t#DOMY2o>F`kN+ zfX)ubg79{>S~ya6y&Zc)(Ou4>dIeHm3<(rVO4nj((kqVp9uSQ^1XdIzNAZr=dRh1x zhn^0YC-e$BeNL^u#=i}0V=eC0cx&`>cQm?8f98Cw-OhH~|F;xE-B2Ch?A1}tTMq}b zprI}kk2n_7>JIUR_?HV5)}-HNZuvT<6SD@-feA-ZGJriYr zG-QbcnKY{8gYjjtGWae;-M`R`sqoqohWW5Ob@ODYXydlsc#I}(^5iKEk;;&bp)odJ z)xx+QsM5`*6H7Z5JKu1((RnYwV7@a1Gv1K{~qOB~q+2`&=XMwj&DnIywTBQox)nA;>A2)R01^KEd zg;`QxT@7lZb~wC{E3Y(wH?$cio;KGr>i^b-hYHWC1!pw6Lz|rW&Qsu5{?e+oo^8{vaU)Gxo{H)U%GUMxTlT7ft1;T40#*PM9jmikenM<-f{L`d%N*)d zd&4lBa|8p>{1GiprRm_iCHQl}1d`91&;C=V>=m-d6iRal*cSiqrk|asK~U#=a#Ib- zdV0EVjnIDj{>v)#$H5fp+>WW3whr)n0W-THM$PQ+qGzKs6bC$bf2dGGtMYY3I!;bx zb~YqLRvK0s1e*5<%*@Q65#BLVztc1@_^>Vsr@E-3I$SsDp(n9RXH5gZ|HrwQ+_l%zR5=du?5%vQ^w-R&nb4FLw!`YMD%2c zAKVQtW+0++UG@Fb@aOl85Dj8e*-+rfZT^d~e>7wzP@DG2mt+=l&FC+|eLyGvYKaS4 zvcU{H&-$TSee}IL?w{()2bT=_9+jtm87(fU{$dn_y1nrj%AdZ}{GRpk3`PF5 zE&iK<<^SPI?7thC{xl&O{yWWo>i_SCv;StL`Zt>YKPdiV)%p)xli^sT>ZibLs8H}L zCpQ-t#_|da?0b|T{}1o@2FAr|6hmdSExbmlKY~b7%Kmg=31J(A|9>&>|6<}_8UK|0 z<+c%G*ldsc+bs5f{Eam0pdCfOP2{1f+!CJ48jKgY-@Wl+cl0LXlnq1PHxL3mqW@2npc}D))Wvz5lb` z|6AWI*CFnc%-K`+?7e5tnTb=ex>ZQ$Lb(xJT4-oKvKNMz{et)Y{;%(9U49%r!X-=8W!C+ooR}KogI=nbS-%Qo{%O)nKvV>z1`&3?K;B&*L z*~5NOwF5cll$u)G?DPI1i#Gz?W@X2f>XI4roJP>VV~I^v2Ea9Qo;5tLCn|6z8#NW- z+#ofsbhxNF0I4tJ%UpygylP&%FJ^%=2;>=rq39#acy4{eTrmi|gSKIHU%6wky(?)H zp6m=e4t&y@|G*|Zz;xRG836c8TW|R{@V5te4U153rbDkb$rk)}e;eMk}EZi@X7)=W8A@G%7zwv_ zM^#8;)uoC4CW!`y4zSzuz^whnQ53+d0~|b2LIJ2$ z+&v#A{IS`llp+_Ix2Uwi@}viAynF2v>C#BNzjqUX-XpH!)ZfIG{Dat;YYR$#)o8Nd zFGkS1n%&QV*@GJ@z6Z!jbL!YKalxZ79BXUKve30=p_{T0?e$LZ72SCs+p&Yz`xXuUofPbZ1L_rOS$42XN3^QsLIFWSB&9C3Vn|pJ(hIjoY%2VhFwb& z_1+oO^wIW(#9?ZWOCE|Bu5h!=Yq&)5<{l0NabbT3g;6K-#>ZWe^+2`B6{RjnOCJx@ zvM%x8`p~DH(sLyQ2Rs12P*if#f^=4S4;ZVXi$c0?@S-atg_Cb5+B!a@6rA5%S>~ux z{d&DJ%K?^QpHGUdqC#>!PN1bdYDLk?OJq7um)pOz5`&uIUHI{=p?U8NyUGzRE-!9Wm!79^6O#O)&ORRSATKHt z2qVdeoA$`%>J1Uv6-bSc5thM{%e|u_**c~e*&P=c*0zV|wYm4-V^N^6))z4iTSZ#* zId|XhzW4x?dt4!r>PZhX;@N3!RVPQnT(W9Ebl;zP((;?Fj2CUq(8V^^SY5)dyW9#u*2e9LWmKXmC^q`dfV~Y0PPu9HkM0* zdrHMNeYY|;zSV5dr!HO|o!MO4R=nY97gdi+156ro2%T*^RK`=RfPj;X9}B}T6K#BLbGV+J28Aq@t({i2Rb zg$xgs$U-&LCSw7rc11KFbew$!phB4mqH?|U?4ZqPvC;QgZBUBghx^lKSJkbS9|SR~ z$$jG4C$NQ)xw@pD4I~m9+aK^SFw3b!be73({zk`g&7pJ|g|+2tEIr{{CpOrO-eb`x7e-ww+yk#|l?0*?nMitFF$hhDp=aNnw{ zq)^2N0nN^>j7v-0F~7ce^b(Tj^40YYqknWBGiQ8qqDb77kb-K1j}U)HvTu^P$RGqp z<~tyw=?}%Ne7c6rjaFD#apybIHRR!Q_?-DTaDQ9I0rk{+;Od(+NHJT)NZyfi4KIUm zg}S!-O8>Fe)o24}-!_I+%)zT1um*#8yVt|$`Tb7tGlPcY2R65s1&YDxOp^=aucZ7^ z8k9j@E)w zz&Q6PqoywhH652wo6PuQlh>7wj`k+U6cZPF?v7u}!>ZCx&ENa3=N1(wSn@{AWxkqt zVrKyev1HcI6j>VKP9<5o)n5#s|0$xv%S8|f{+nA{VIh<9E&RUS$$V>M;y@ol!OG6A za-N<2JhdMC`9`K+wRJX4XA;PrqL#U;J8ieI(`>grMA8z4!)M!RuiX7`{rP3WWfcy; zN12j!O~!|)@L}*y5*WPtY)vVrSh#!37S>6$0{?+K+}DbLMMP}g9*wadv(|jEbF<=z z^oSKpdhuvZ7MW3|zmF7$+WG#B-?YyTM@9OI+gkrTGjHuT=~zoVF)P(Nz=lO_Eq?fr z`%clYH^z`Op5E6J`I=fbFQ`DcT!fF!{^&|KSAxqt>l3opf!kSo<|ww0McJ)rHiD9M(M?tWI<>8zy|$FOFGBj(|SYFuF+-3PhA1po6iku52*L1r?Bgf)> z6|E{yM#nw=eTtObdG&@pSI4u#BI?9w^|~U;FSFTQku$JV+tTl83LHl)r>rCJZxGBV zHNnHOs#(cLvC(gJ#A@dotN1+^5Z#Auj7VDR;j#u@F=0rSYR&E{m#x7TDgPiF(tC*KaM zcynG&Czd$#gaY#Fzm)3v<#arbdz@Drda(~YMZXI%TTW8de$)Aw*xRYz)2}E`{(jWVAXpVz zT3C@a$rzn)OBH`x3E3nqD)Pd}xzosv>XuP)P9ya$f(G|EY#JqKxGREe$+DIM{LHU~ zCOfE<&^3B;%LCMLaXQH;=K00KI>25(Iy98yy3bDyynNuD*Ag1aw zD@xv+3)mJmqLmLHwyzxtr@e)GnWmpZLvp-hS>9)n*#OVesB2$(1DW%2?(V9gXZ|&w z{#?*VP$)%~#Wr`Di#iEJHSs*SA8eC&KF!33ql&90W!)@V->j(Cxox3+kP5$%uzp8Y z)FZn7eOdLuZ0Vt@jN#NhcC`zhHF3I895rofd7@&3QBwVc!F?E=UJCp)&=8Y*>~d5s zoKOp31cnr9l-T_=~iF{#M4U7dff79Yqcq`@lnuhJ!I$6>Avi&+9%jTN>_ z{rlMOZtMjYn_QK7tfm%OGQLd?-uVnLN)HKm^cGUIrqoGXu-QjYZsah=zqF9VMqJAC zQ*DD|4!|oOKY2_3?jb@J>b9(OX&BsOZ_fot9NVU`hWMsA*z9CM%ZvCwe^y7I;ywF zPEwc#_t3_x|Dp+{QSuBGmyNGzO#l2&d%9Jg*cCmiZ5cwEt08T=&yAHUaLwobiXe5+ zS?x2cO5P&h^XU=a1sE7_8(3}nQ+|mywg^6O51r3v0FQum{UU7~-}Ttd6aoA>1vU4> zAvp?5pplXvx%(H^or&{_o_;zw`<1>Oips~oa6H!s*7~_M0Detl*9ZP(hPI}0R1Gri z>Eh}#6bY1we6hbo@W*a@ans?(m@LMf_wjb1u9ac8+@{G+sT|mTZ5&uW*xI~kX!0fX zy3Z4i9I|Os={5lrLwj+mM})%N8L(BrqcQnWVmk4U9u^bfHc$s~Yis)ud^dOiJRy-v z(YI2xs`Qs-R{v73&RUkfHX6Qhv6DNcJV5taZqN6dA$$4w^Y5#L2BsII?*~+Zjum{L4}(jT-ro;k!6H3L{uV2 zmp|PZ8rq_65D4OL*SOl39qzF_5x#NI{;XBRu%8XX@ajKCRyF_-LM8U`P9bwE>%_4K z8#Du;E)zWrHWHSnbE#o?qnXhS5FJ0bZ)ak@r(Mbp5lzrixG-T^oMXsEGAWO+%+rEJ ze63y_x#X9hn)P_QV61l``VPGd-d-$BmtHM9>_Mudw-mu}xTrjZG!Tluo?6{71+n9~ z#ni%dzVry{uS2e%!eN%u`*Qc&5rle_W^_v1@r@!eA;MNFP748O$P=xfoLSxH?E>R& z2$(VOdLapHxP3qFQH?{bsM4C!9YLa_pbN(WM^`?kgN=*U;011i6@4qxZ?CBYS0B$x z!K!U~m3-M=HY#r{Nlw=n<}k>@`D(0AEes~0PSn*#BWz9xzXh$T5+dY4?wFgMo&D7K ztfTK)#~q=|(`!H9-Z_8%*>bY3-3(%nuNbl@U{^f@R~tBR_ZEA!5I{JV2?T5byCsx9 zU`s3yjcD{{)J#iA#ENf#I5#oo&Y*aP;GOhT!*;My%$F^>JsJGS%-4PE__$Q)V4u1v zoqJP6$g@q=8_GHrbT$-~Y2l$2@{5SA z2tez>tRaVlfD@(ZBBI`!nALz8VSkaE3TR0wUghKTgb_sN*?b+86nwljrzA&9uUV|r z24)nmA!Vt_izm|m@}(i~4yRH9y`Cy%Bv+Wy!SdAK+tfMk}t3y?R!y}Mj($oVrZ9@xY)d%Wd6-;!1C%RVMp=5)6NXW9nYKOWRU$;qqwckDz{Axa zS^<;B(mo9yL|bKP^!rT+wqFP3)|o7mO5lJGr|CdCpSR0QZ_2oYO9+sUpwOlhT zy(mc!%9I+I?2MKGLzB>TRp9~t;_O(J$-?Fu~0QS9^Yf#Y?Pjt+R zF@!jWhmkJpaC&IF8@vyD?t z_FBan9I~!w^Pt@kqB`ILCbt5sZVcxe>Bf706!uzXXSc+p5tWSF14ZQs3jbMk6VOclQ$X>}L z90_FJ|5M^35O4-Zb9e-*3dy+!YS4?*INdShwr+sV-a#A&WfcOa`WE4EtbA_dUw7Xg zkP{^i!+FcA_oKk!Wq*!@iHKUjMD-b+&$nb`v(R-}%&3-4KKB2)+b~+{ca`YrowphL z4JILhRQ&=U)0c_+SL=9jQsEVRXi9X*<~rIk9eHYPH^eImbtHwoJM{q#`q+o{*{ z^v@9{m&N zUl>mj{Hx*L7*Czme;)AaVO zp8;D}PeLtCPE`KGvm;d~-R)PuPQb5SJ<9nbn?CUW9u@mnQ0Hlw?C*v^anY07DukLX zAe#@Q|M#Z@Cqg=9(J2%C|AzA~=l;JA1OC-;ir`-u2@U@c*sq|`|Bm2arvs;b{7Z}{ z4gbdZ|AO(iX8jZAf5&**rGHWVS07J@0|9686(a7-MBk3L*g0(#Ihp(w#hEMSD`1)IEDQbem<8FYX z3a8Aw7@5a+{|b*fAh$^3A2**e_Ux^4K}mDF8a-22*GU*#)M<_{N^>x5uRT7WXsJI2 zdAzi_xw*6B2m*n;ys*2wyN8E|cszcedguAI#V>kMXIZ0-fp^cG`hKs2&W5QtjP5ue zl56rRh@yh;6ix=OvzZileI>X1P?(znNxEh8p%LepV1e9mHu25Kn}m4Lx|{h5FrF_r z1#0=6G0}d?sOmF{LZORK#Iy*ZFJ-}cv^YfWr0e>DCDFt-P4?)OtY30_(Y$JE-+_Le23`4u#;al5}5vTJ0M7A6as6Owufw^+TW-$ScsA zMe6~td~Vhp{F|ujDa~_A-mn8zXK7QDZOB8G%*NT59q@cU62DKbV(eYsN%5dzb1pO& z>7x-tO3*luXi|>@UpM=+`N|MLLAjfoTYG!^rAwC#_Nv)|1Wv{$cNCW$U zg79nG<|a@;rk3#O)3#aafjCwH<~_z1u!bf=CaZ0}SY?c_NWS2ESHz=j)HerKNUeOf zhGE#zve_%GN_IA3V3t8!C$nVE6jolnYe6ONi!)D8$iUzw<)Gs=_>#fLg5VLElG=PK z>bj%?GtPTQdaw)~={}3#l{Xc)5nWZ~-0F`(OOoiLIi<0pobvjrs^xvGsdi25%gi#E z!h(ilGdvvNe@t45aBgmhd6RSyO_YY2-vO+z3H9;u? zesi5G;l9QGN5no)f~#E$gNqeMs*$Zm7yzAJNlVz=Yv_zh9*^>mK1zWI?RW}8N~y#d zY^9$0^r}(Lu;OFtk|mYbH#S(mF8uU(Fz|50k-R!~@~6qR`M04ph)-k|5U}Y<)=2GK zmpz>@ktJI0wgr2Mi2DqyCZBcjY=RP?B<5*cuVv zlcVSmh->4K4ds|dDcruWT zMyEOz5b#K#LQ9*i{7X6#KCjqT`r$T%N3m*V>nHathon++YqnlNfkay#T=s7 z%;9N1*uAjl%&oAM=guFl4LHy}&$O70SX7d3Xm-?W%W`0+sM7#+mer){1@XX3_-(hV8g-O7DV_aCEWV3gQ}LTu2SWu`xd7u!1urIgj&29RS)d z7G}c{ch2MP_|bmO&C{dg6QVKXx4-W}fQhnmYl1t-S2}Ilw)X@p0R`WZ!$lLVqnt2^ z{!B^Au{PmI8nXf9QvY-YHc$`>OHN{nlbvm0zOm(p-q zIJy^E)QVo!+VA5>Glp^6wykx54I6xYFgp*#tD|o&fv)*B^f?BHBd*g)o&&Li3b$T$ zF+V1aO?`>x^7lneRE&<{Xw0j%hu}%|z2d%7re07pAvA!h(mL0EF~6J*Dz}4FGmk9y z?Nk>3b{-b-B^}?G1to9oeQ~;kB+y0(F=T^-6$glO9b|V!Vga!4JPF)+i$*Zn`)Q4% zP)qa}_}Q4VC$f&%}1u{kK$ zjVjfwB#q!AtrSyl4s{6l$ag8leg#`D7QLpJfHRH zbW9+epvC3=h^!RIAU}<6M|Ds+u3C+_o~I)w{p)TMT2|0@QEBgn&OtwlrQx|T$+Wy9 zSid{mS9(*D5DVkxOGC0ZJTR<#Ln#PH3--h>jI^;){4kBV^!mw*x*y!E-g1ecXZRRz zG(sUsHK&`nOJZN)YPoZictne<*zF?Unx2-A*ZjZASAE1`el!O_l)%2YgUFjpm3|;Y z3t`E2;N`H4cl*%*OvJ|qCvn0Uv9yqPGUYG5wbVM=LN6`EV$0bBzHhTwjbl|EsX7+` z3aROa#Q#-YjX>Tfz>hQ9GwbVeaz4aaFDK{sLt_ifZiXKQ-@b>wy+;V$!w1t+@UjF{ z0IwX?FlK2#M(f`T77M!Pikj%b0aH7{l)4V(O^!>0A50{Nwy*O}!YgC4tPEoS7`B!@ zpRJFe3AM38 zvvUgGU#kDRS10(zaCrLY(0mR~IPjGZv+ZL=-o!Q^y3vms%jo1~9p9Sc`OrXdzwECm zK4phq)fN-X5#^6ovK)Cq*O+)HG!m#3M);XT$1fAocg!q{ZJc#=KBKQ|7U_Q)J3^qI z5OPDt0*d~eo*(WPc?oaawiD#sSY4|bj~ zFt<2B8sU5Qgkk}@E-V9b^iSG{Lq6BY%Lf~oC1t)A&POUqe^b@zJ$rzn8!>VSUBzTNN?m*C$i%RWP z^t^N$RIXF(5raPUupM)E$_en+Oao|V;mXnBB8)mW0So}u^MM9#h`ek+zJ*3q0PZ=6 zfU?rkc^J49L$cN$3P8wJo@DoPFb}AF5eh$_=1N05l8sur=Ru zj6KdbR)X*%1Bmu_!B+xr2|!S;^aZ858~BJBTt%?;qDS1MRzTqzrp0OMTO@8ikk&L~ z?UHc6i{K`_7PE1*sD!2j*ewc8(n)uA3wqwJMcaNcAiFZ|aEr!t*_jlM|I)XQ!=N;a z4Ei^hA{LZ>4{)6J1X!crP7KTYSh4h$T|AWy7n0v(X2>+MMS0dM+=ezZ4S-(zamZ7v zi`T=?=E!dVXuLH0KX>z@kqM4`RDUe^Y{U9gLvX4*P5XAp4pr?t#Kgq7j?Vbll`|pN z@7_6+oX{pk$c=YXRo>+88Iq89)JCLNJMVA%>{&YwJGh2JWfUW)W*}Xg4rbs4Ku^5# z3Hb|3?$0sNgXwqeEFe9TF&tU`t}R>n&erwaP(aW`uzJg*bEY)tY>To&CRLv*X*|V} zSdLOti^zf6+EH_`AvdTduDB^&eHJ5a5aX8BZ0{*}Q@^HA(o!kP#c>jCZsL0t6Mbl^ z9cMRPo9-*aA_U?B4LsLTOzzXzO_f`O=RC2{Oxj^t+4(*`|DasY7OlRjl{7^tKkjYG zRQDtag?zH{;$XUfUXK3nlUSM>Ud`Zcj=pMM(R>K808BDCr_a&YZ@t}+cGC1=gMAv<%X<(q_jm>}td zK7LD$Cs|ZFnhN&SnMtu@(Eh<1af89`+|ny85kc}iV@ftR-fZlO=MS;CV(2yK{0_|y z5(x(r6jo_#eIX?o41yjn=>DRw?1%r3d0yF*xyKHipePRuL?2+(oW!CnF0=k8$2qJ4 z1~J3}7R2xxf!ILfg2&xt!rs7=V~cC;ou3Q^=UO3daTVLCL6Y$3!~09$2Duh^FsgMEW&$o<{I{*- z-aBe(?CPeIu;x4=OhxFm5hd`GI&aL*#zf`XxzBGZeF`Id2OP&gRAi8HeFBv4DdAK& zKjLx{F@3|5x7;hf3b%}qoOfc6C0|gVi14Nw0efOGs8`{R%3-U=95SNxDD&ipGbAvh zTZiRFG)l`ODQ!`)j_y-gXMXoLe}Ak_c1>8(GtOON8L|%m${2_z8Hfuf6AEJ>oagu z=OqkCei$f#E5)twR9koZEb8c9Nv3wf-%1h-wtFGdI1DIaGnruO3h|Nz=cs-u6<9F9 zf03NZxSnGLETwf#ru+Kl;#Xft%^tNtpy;KSqZyXQm;SDwx9=KAc10`h_r@_aS*E^T zXo>n>&S#LI?BCa|J~uIeV};G`vD}9!GGo8jr*_8x#2@6n)Mz;r?)9VQ&*V`sTrt15 zafjpPmc6LSv|zfvrdsu^ zt4hnc_Dh%mYFUWQ`-pSGR)xpGEEn|Y`ujuEG-Q!MT}DPV>*pE;>=(nn-=mNOlZgWc z0OQQ1J<`4wZ{22Zj#O~Mrwlf&kR?A_v4&rgGk}h(S}L{ilyzee&P2`+C5|Xdml8yz zD$3(>L8%Ez8zJ*#DtR2mC|iSLXeP(sZR?q<3*GJMYcwYM0QX`?K{w&X%hs%RcfLA!aEbczALF-~r>FXKPuxea2UnHHv zR22jB-7g6rnHq)_PqdKT!QIXsX4)!l);7cs2}JPT)9{CmNPR1c*REs28<3t z!X;is7%P_tWg?Y$H2U$rMjpgLK0kE#7awnb!_lhGKQ9x+TiP`1o+rXB9$qMcLTk*N*VQiFRZU5$85Dm}Q`ORRq57KJ->BK6eW zoavl0_nU%jaV5KKR#jr2jeFv&XS}9kD*?GwQ(3Nf-%`u{`JENl>VmJf>$?GxspA~0 zosha|lw$d%Mdty~jFepGq@^uQR7gup2LuE#{%8M$ zN9)XbczS@ak_35XNo6tTO?`oe9N&kW!Gm$8>L7hQ+J56(OcjJ3Bm)KjO=;^7I&2sC+7+ zK)(DPvOlLpWB?%)NvyCz$xLJcHS&f`F7=&$>vwD^VIz#A=6XhMzvN>My^CP?-2N4s zed4wM1y4`cj09SLw-9>p-ED9E>97BF9GBk^Q2Wc>ed5|Y^;ZAOdHS!0zo!(SB)rQa z<8qsr@Gi@$<}!75QTs4cWK~VB2*pMJrq|pFNlAf(_ve#>0|Nsm-O@=X6gpGu$0MF}X%%d|%ehqmc-Ow3O#p*QStU z&E0c+5)-3u9$%N+p#=0C@!1r1sqDP;`^B;oVrLC4BG1>^`|$0j4lDP`eGq8Si$o7) zNeUhX7see`ly0imjp*dWORM?ZNU#iXE4-L1!u~#)n@zp09F`{X+&0p#$RL2Xcg5Tq zfqDD;)aL~4>ubfj7yT4idng`MG~N*}Um9WC5vuC=cs{$EI#csae^H4?NWjE;u# zit&wWO|cSt=1G{a7mU~3Tm-#Puk6B!9IiuB;03zp-!T!-nu;!({$KeXs&=fO4+fLw@${39gE~RWs zC9#!P<}7c(SfCR1#D0uTLrV{P1akx1;qYp^0}Qa$ph&TXZD?egB(w&&Uq6VU!kSW!T9B_Ot0j* zuN=(+Z>*IcZpBbQTY5W}H^GCGSvii`cSI`Ml#4!|FYy?k+O9MelROF(NzD#bKGOYB zLFZB`tmMokJCH#us4s}+ORRFO6&dORJnzkhk7BdW89hqk(Z^X^)=LR0&GbU|Tra&+} zC-6%jGnYN7uWH1;?$KQc?^wV${95dQHD?z518%2RJ|4uP9Nc@jTf(NGZkHNNJiIe+n8;Ili|1HC6~ zs>k@?W=U@2g$IQ*>)o3r96dAA>q9567W}fP?s=Q?PnvvbO{DmBGV8}++;@050)T0d zdimZw_FRT-$UNBEr6r%jyut9zx-f5Ymoz)wh%AU5PoX?a8m+Tb5x8P3U~TRz@2*zi zr-JIEh`P|$*o4)imQ-gpw}_2jEMl8lzYIW?GKdw7Yv%whqCaVGvxE&yJt%@|=M)#2 z+(?Or0_zl9v>#CC>OkWNwh>(`dUoX!C&DaYa7*Az6r*Nzt5aXaW5F4@-Zy+3BX+&v zR$ATaWqI`vyLcK(AexqSiQ6pbm`&~d`I78(j@~N^L7u*Yg)d=dNwG$5J3FEoejIMEr z!CK!^vFQ4cOEpzxL{d#le&C|=u!5zsYN~9_F#E9)?DOg2ArXG&F2T6GRr)-@My?bu z{Xw;_JYToF<~wgt&XCs}{HsDZLTLh=?8Yikz#9Mc+-m>@$bcua+~jV~hc(RSS#Djt zicQ;Gl5xVl{@PvantyeMvJ_UfGi?s;^C&{DWG3`#`KQpGbx4`ampa#R;9hf+^;VSq zBRv!ipXZkT;|;)z0`{~9QPEAK;*r>CYzVpwEsUQ8Cb_F^fUd;CCN5jY_)^W=+6J&q zA<92=OL?NFf&tC8{2Fih&OP@ueUs)q(Snn=JT|81nOED8a8sMfnzGzbEpo9yjWH~( zMzwzKoJP1r(ojysZij`9Bn6*N&_qNh2FQC{VBy`nSaaFV3$1RAa-x1hgof;-Jum(X zP6sZBLKHDsnaZ)Yl!d0#YanbM-a_bT{4x%-7 z;1L=dyqz>iG3!Aa{s?tCJX5JQy_!ucc<*Kj{mP7+CzPGpW;8;ab3FF;fJbw)vzCBD zTyf#5VZ+7phMx)~{p`c!-hLJ(s!tmTR8KPK?(d@7>0A|yi^O+|_$mL`S;D|Mu`UO} z0yhBSFYQEgGe-;LdrDkaZh&0vf&e*Y;fhNsYeH3#3dyA?3q)y@d|WhM9@m*|5n(Nk zelKgX5*vpWs#7~?2dmxautFnJ;aD2{<&#QyE>O$6Jq}ooKoc8ropQr_7L5p z?uW6k!y$sW&nZUxFnSgzTO3Q^s^RK%B)w-z!oG}r?w2qKiyZUJjN4x;MeQ9#*V8`T za8~u940wNm>i7UrxwY#`+(EE4!(Q>7vn;rqBl8(kYLYoWW%nV`pEfA^>=?$y+yX@L zd`e^G$f+^4lll8MoU9CHVauRt$r@iKyq@Tf(8+bpi$*zUN7Dv7@E%f?j0;m(sn!=6 z%NPQP-Xw&SIXmZy;`LN+PZl?jyzhe^I<57532|_U?C0lFF$?`-xMOooABB|QED9S~ z2rES$9h3?ZXHI?8qs#0*cn~wf2hZSY2RAW*q7=f^(>g*fv&-a_!IEeJDuWL9t)GkY z?d8mflwsDxHRqHzLjh9?lBWw;qF-y;`oAD;cH!oW7l1}89`HJ(S|sgyV~F1h(B7rC)tnRW>M}m zv2T)Dlby!iyL1@3)!REUuOyO^*jip;?W9R1sV!g$sXdl5E7yUyZA$FzmIpcJwfXR2oz0ie>_0^i@`I5F;seZP~IQ+$hhqaxLv`0 z!1COKc#XnY;+I+!fL`cEh)p`ySWx3vy_y*+(J###p^ZNSl-@9V3}OqT)!gBjl#~sU8<#S-d~KSeY{cht~J&t(>za8 zut3&so_eY_SX*&q67@)2kMT%IFxn-4HF-Jr_^8(wJ2MBb_{6C<*qCueo5Q%_XuGr2 zBz|#i8!19a584(h5bstsBUlZxy*`r1%_36sXyhi3sE7S}z#N>Fw4&Fbr*quS4jpae zf|vj$UpJ~2st>uAFEJ50wM{>-8x!d|bQJ23q z$>~s-igIqE>?C92dX9YAZn9=Am=E(^kkPIiG;kTQ1|^l3?vBmWP-S^2Pv=*n^QQ@0 zU+Wqpni{Xzv~zYyWRHEBMTRG%--WTVU`TIxCc9xEU<8x4$>^(?tQeMQS+Q}4UfOY! z+DN5dK~J4oDmK$t>y}){@yk|yPLsGZ@-ppX? zajfomZ$L0}T;b19>RYWSvvzGNZAs~QxI(mlc=cLkb@EQMQ&dkFkn3(BWUEbl_BWcnbId?;a!Nf?v%Q>nk4epCBE z*_m&8pkrU&H(}(+QpLrUc!65N0}0Q{Wk2}*jK88tZ83VXHQZgRgBa=LIxl6-uub9e1yy+#>Y35Zu`# z0`0&jgR7{KbT2othP*Gyzh|NoS>Rk2mO8$REV|^AZz*W8uaPlJSD10QG5ncgPrfos zCLs8(vYG4(HB^M6)ER zI^A+mIQ)}s?}X^L0I)5n*eyWgY7-HKWPtGns%47QujDUWE>h$&pTNa;&+c#s5}!YN zD~sITbL*lZU>p0>!neGr(7Ij0XU4|KnG3f!+v^ngpYrP)14j) z{Hx*ZDXPw$`ilRe?{=W z$DaKPM*BC;{}+tEom->O__&A7+*iK?x*BE~?PuyY*qN?}+UID|UXV0>efiz9{-(gs z=YnXn6f!=4jP`i=m4Yl(VfyN&goXKDsVhzm~6(IAdkNS-2UUkcaVsP zNbc=h)>|=}BlTSD?C|b5X2=o`PbW{Zu7?paDe*9$2FGM8R*#fB|=4mzig za1{z49f+twXXf7W9guvgB3f#?@r`-gEzVJ;!ZQ37ZpVr)RXBlaH^e?(pgqsb=5mt-o$g(kKG&+Se9Pt0!2Uf(;|4ft)UMF5 z^)6Ez_{EE|&d0t{YdE;*8ZM+#R=;n=6m{($A zIs_c;qKYQ)3xln0WWFN&ZdQ)fw(J+p=*XgxpE z^(vH#FM~mXoA{g?AO5_so$Z%ThmjQgX_YmHpD8l4E}N)^j&me0!t8n*B~9hrEr-}{bCs8y0Zoyhc| z6bW5__+1+RcRp=kLX3#U=8l-AkR%6}97BoX!FBS+t2Y~~9^y1(jJ<=Ep{AuT{(?|I zP@siiUcrU01B*vn4EW7)9iu{x1l?r&_o^glyLdYDI0=cedPAT>VHvz|TKMM~NLAni ziqBVDEuP&Qe|$cZ`&+{SuT?pVFw)}xn?@V~$ zA-G^0Di?h&d=y|d&t_9qT@6qwph#ct=M7HoIUO{Q{efn38!6!KC=cxvpWeQ5dus`Ff~X)X?| z%ybIIIGGnOd>riD-GLj*K2p#cSK};!L&P|BDVhsOZz$YTMBPM=0Eywd*&@WY*O#_O z5hb20ntxXT(d(d#Q*%n`$S=nN-x8HYEZ1$vYR4nTJBwt+-wb{>d2TLC9UH)-V%PPF z+J@-9^n;>(fozgNiIZNA;mr_$^dGh@TFrHI{~QCWu%@Oi?4@fFF?POYLuz>fjt_)9 z%AW{K(17j24M_|^Sd$lN4DE7uzHk4oA@Bo)Y#TT-Il8i=?QFWtl@fNjE7}UyY?Tus z)0+!M4d%ENi!mFi_eP*?^Bw9$)_PKDn6*ji5x~fnm#ipBLdg7tFMr^d#zMM#IW|DZ z%wo362*nZmTb1wOMT1JCVf|xS0@Rz4dk^N}(qPXUau1)<2KPG_QJ)M#>=D|W#xUF) zu87M}Vb!d3_sNSwusw6GWc^mwh=o`-x;lztqG_cs%V}$oE9@Pg*RjAGI-Z5(1h zTG)AMUrfo|cf^iIf+E#ryYe6@J=Gkqhn=4h8dj*H4_$35El&rpCbJOsqeUiHECcLS`q5 zzgxYI-&H)1YF;f#rU0N=om-v!kI6x81%=vanVoYV!{TxF&>K5Oer^vTw~m3TK&{C4 z`t{M#=Zn21y&s+!?LW|R5FHrER8lnk(!16qc{3mEUS&J?V}2baZ(~tX-@2=!8s_%o z<%M~;;Pes2Z&|*VDl@q(HKuInJ7HKjdo-fUD$?36+ZP*$DJ&q9GoD56$x~scqIh01 zEt^q1j$#ktgDVBd4_7`LnOz zMXLQnT1>%j%$D|+I1FvO@F^m?Qx;Vc=6N}the*}wJ*Th@M9;n9rjVlgu~eV>pTT0T zKc2+BddowRc_GZA{e-8KVE}{~t57oswGE=f6p{0WDeFq-#@hwzveuO&dEvKv|Zbi z@h25tH5Ehow#m60LYgx!^~KodP75Q$#k7VEJMFr8BXzj(2`-sDjk-YI%4Vx!yy-tDV;UL`yc!?OA*D%Gh&8S&t$}7?`AW{EYC9Y&b4dR@Jb?z} z$wmi?3ww&AH51He2hTBFyA7JlfSst&A2<Fx#v>F#EwyStI@TDrTt7nbF} z;G@6q_wo0CulIfT;)3Puy>s7Z=A1cm&U|L(Ac}Qw6_#6jmYp-9!uaX#)lcJj`w2Xs zXZQO02S^D$d zR`7#XAz$Nx)UKZF-p0?bwAtVDm_%NJ-h83prw!>9FV5`_zn^vg!7>^7F{3?yb=>)i zgNTCb5UgAua|fNbL22v>oo3)p^QtDG>5g?0hCSg@Giu^8>3U&55JX*>Wp6f+uXd`f_5gOXbT5Dkz%-j&Hoo7&E*y1PrG>$Zk| zDg@!F+ae}T$@hnmDY$e7g52JpN38<@ydn|sOmj3&)sF`0aN`UXpye{;p<@m_nQhi) zMS^HFnWTP^-_2AMHKcRHU+X#Fv0c#TI=& z*bf^SKUTcHBQiJWmAsN&xn>WFqow3nS3ijhVDrbt*hyD(A%GC?e#dclM)FnYWk_f1 z5_J1YufQ(v{ASPD9fj+9r2>}vG3|7zx4R>6OV7q-Q&8M=JN%h^rglZP%wDZ1r9Otc zSne!6tlHeA+_HDn7nPi)dclt^dKHnLGlZ+L1%17!%b@xoeAK$lOF7|2f!_zccjvr^ zUIYXL6r!b77v>v3(-Opk#3!QNA+Dx6mwMNdwXUINofy^}V<{MP6*=NGALIPTQiUsa zD4+WQoGqi}nrtf~mBwCGLq_!j>|0k!4yWnkj2t|f>=H}dM=L$64jSKQ2r>3SgPT;Hd zA|o!F)C@LT(Z@7$B`UkSC%Y7B`~b$xiMRY{C?ZGiZ*f^gmpS~kMMnk=14V8ahwRaH zTC^g+IQHEdD$jkqxVEVJ0SJ6nAM_Aa^~3D>w$j|~m}|sT;LWJ|$S)W1eIV%9WyH-d z%%b6fHR~rE&eFh}hKjS*C87|eiQ50XKlAEGawrcfx*WA~JXPlVv>(cql!`m8NWTUe zET;VdTmWN|6o_T)Q`W-)SYQ)JFe=}WU-a}S1y(lgqa%F{!x_3kh)2=Pq3fWn7+WXm z+kd`#=X;^GLzjP$wayK~C?BQ7fJKO8y}-+g^jtY<{guJ+E@=J%90ygP{nG09FAM_% zAzhla7(morhXR1_QPk4CA$E894u* zRPg!bhlNh$r(vtNtzWK^nD4!c|8VCn`0MxEU+%`=|J{9{ryI2Y+Vs{oO|dm8FIIkV z@}Mvq+7c3C@ucslNm?PNM1%Pvlcu*cH$kMyJaFHPCE5zUQM1gdJicW?bF$avb(QSQ?x;m5Pb%%SqE(YeK(&O=~T_VV(|Iq7SvI54l65cpDV4q zm3PVpX_oX4NOLOz_*z~vb{c*%mN=|Yb^aji)XhSKcSOr1q1)cb;d?r41( zizk>e`|`VqGuQ}^)|b;<$b3Pi^6mT@f>r^mHxElGD5ho?{TA==Mrz<38s-~JTXA;+ z0&_inRylK|dXgnp$COFmw&>tm-Tp?G(g}R{LX?7CTFGYXpex<(o^~bVH=rnw#;(a(5;yIN=%g7jOQ;eEg*m-K?JWHxBrcACE+RC|zgJ-0A&l*G%-` zQvvS{;{2tY>bV82uSVSJ<3@`H-;nCg55D0X8iPH?oht37jzctum>+a9y_nzEo_kh~ z1Kh%{co~8xx#ce92iVAd|K&&@7Mk`%a4XazK1{;K-FW|^a%>>(3e&|>3-$oH_$%T# zWs8<9{OwexRLg^pWgWN03lnv?S4@M^u2!$9>xM;-5*xisGi96jiej^kX}IdFS73L) zQ)#iEF4if`Fp6mX`jZI|%bCIDDS`XA+#q5l zZR1^HM7 z2lV6Fv-{#Aq~gmKukoLGzSm;Jg}I1eDUD+h1mQhE3JrB5Tas@RByc{|Sa zL7umwsXvp!U}xkyTOkrsMMaTk?~+{C^KlyhrL7*ySg3p_w@07VqN-#{a5z6HOM9-> zgr2ak{heV&$@z0Ms2L43WE-*!qGjuU5y9*w1NC#hh z2;+Kd!G55QutK@8zw-m=b=#(eSbUMX7LP{TlT*bG2KJr~@a8GG3M_z7$(M+P#%!Ew zA5W`?pyqn7WZn?lEiyMh_6t~t6*>(~Gujm245r!ZY;~e_M|lY`XE(BIlb^r6EG8OV zT(gQ%z;|IqydW*qalLS}14tP29M;f1M0n(d*EUCM|2RX+#M)tI>vFvG%s7CDmLdZY z$!x;UrzYeE=;qtIRO+506}ZstGes)Wj{coK*F;_{JR)SIZFfe^!fEb81!t`eeJz+}w+Y?%pW0Y02GU4M zarw<^y{+`&xok*Oy|t5CZ?oA^{w}RxGg6cuSJBK!y4N234lhkA(h$X$`{?kMi_N?7 zBC6w!kv8@~H*s)HCw0N2R9@DgXLz2}z9!$Hv}UQVmOEOQZT1D9Tc)G6gcOc%ni{sZg&f%j zdU?icwnJ`p1vu9ipjK)ZX=uGe*cQ*81&{HOjQg3Q====9>n8n(!yuRNL#4Gh*G?tc z(S%gmm9pqcNeYGxYh;#DjuMg?oEiKy9eoG;3P~cO80Jm2Dcg}gbTXWhI4SLuQ_a|y z6dDkv3ggaiuiVw7xbZn4jIzVR-}`9)SzAh?>gLtbj(qmutn(B~FEgs-i}%(v*&jc{ zx2GMBDEOV|+&1oGlVmnJDJ*v&FWCxstvr@VEI(0MAiyfKWoPJ}oCwRh8WJaW&t15M zn`JchHdKx_ghju&KKAB7?R6!qM4>9vJc}N5iMt|2357ViJ|nf)>C$L*z;tfwAJPpg zs`P6&GknQqo9c2hYmiL#F2>oqkGT09mBQy}cuI9WYp&nq` zzT`+lAP_Pb#HPAzbGWk1^hlBbe_7u4%UrpyZZ7EXOquN5o&%vkdFCE&Cw9@-TlzZJ z44U_yv~HxCyUi>I~Os|@f9xS!FAv2mR-%t+=l`>5wz;2s6c}}kFxL4aG z0%gHxUer%&e2ks@Ry7-7RJ_U8%H;EHZYM6Aw_1j}oNAfy`_+6E{<9ktErpQ=rJ)Dp zt&t$R45?i&)(h4gq#({we&`aVTR~cVE zzRpG24V>hUsY@}c-m%AK3(K>4=-fM0f??Vhw9c7oJeC|kE3qL#d+Q)t_6W@<_#4D9 zcEDz1T1PtIb zyT_+$c+C4tHcd;CreU>=#Tv4e-%kZnWn-{xulkgl^iVRrl^)4-4_T^BAjj*bO*n3P zWdw(&7w{qVZpl{N8Uz)`+65u2Wqz^Bbst;De5Q^s&d~)6?yjA>aLpfC^khu156Xa2 zyDv*Ehn8W_5bJqzZu5gsr)#e+v%aA+P1=+rD2W7HbT-%LDT>N7TuDTv6brr-i~xYl z+RH>95|K(GczeD_&{#&|`;Y+c%+^+lY9nl#=Zbyo66BBlKpiS?t8w7XHM;p^i#VNz zvZFQ^0DViFkfFQT=Eruoggv-X1=Jh!=`S<2g!^MYti78?F^R_1Nq)v96&!6HoE?mO zF!N*g)LirO$>%ENL7NP;la&=R6xk}&QXKnn|D#RV0J8J@BEC3bMqatnpg#g5SpQ{lC zFzq-;=LYOQk?_xbsjrn8vxp#)W%onLm(^Aatrmh9=6!=6y;4Xbo6bt=7V&I#$Ho^U z!|^hxS5hmM8nq`Pips;?$`B(4;DCP=^pzc1>NC7#Z* zs2Ji%bfzL0V}Q|)hc6ff=*Q^c*)F#4!!cV%%We<7vlcEX{P|9r85CPiAh8s7$goJj zTz*>NLAijkhF#aFf&1~#_)9ef5{w?Oat{aY&w8dkimmVhUQZd(yD#%T&oCYjyM`Fo z%yz=Xzxpg7XuAtD55S=ys7qJpwUc;8GB)VIxA$oc@ax6PvC28lA&S?Cyq&nCeyh@_ z>BemN@nkJlb(3v5tncJFBLEEG2@i-U8+Y-k0_Im}24gs&pyRyJX33Ia?scA5jmEo%`8Me5zF8;5Ek8ZlHqlA+KBt*jjTLpO^;AUt(4vl0I z3y|%q#&~t=oTWKoV#lN`h)>7i^;^UH_=6MuR;c#!dw|~!NVq4Yxa7vQ^DKRXJZsQ_ z-es^ja>VUxu%Ol^F$NgKlhT)l;@s)7M2YfE1u1TTxYJKFb@MGM%eP>NMzj|r)JZdKUqhPtKraw_P9Z-i?{h1{UxO%EvfY8 z9MHOQB@|P5(+g}7g0|5~hXDxCxAU{PGc4q?-kEqyY=o|~!IVVQ)6@4H0M}@UXzr^~ zy;YvG;^{OHkW?QWac5-3n(F*|!*f`{lAT9xQMcEx#f@d_^imhcm4k`#XHd`<;{}si z4y$Qa7jQt%E(Y)|qv;7FPE8KwyAvl#=U6=c(y|6#j=pK+lnrNf1=~4l0XNFzG$FkQ zmp1d2l*mg#;p=N!?$S_~;U>aWm^xmloc~&GFlHoT+|j}hJ;j;9ZOAS$FXez(%K4lqd3sxsFm8-cA zx6_bPqM;MQ7x+w|$2T0^8OAPPx<<HecM_3Qmu~hJb^m)^rQGy{bf$=15DQ#4@YO8 zd#?32@!fOnma)Ek2F2OsoGsr54AL~g8_STv^vlLSQ)0jh4miSWfJgF0-JhH|nVZR{2)oS^e5e zHGTdy>fB_ZETt%fnAfg(HNB7Cm2Yq9A8eHaBru;AnPkzsVt(31uF{iu*sOtNTL}Z& z9*Z7RxtNI>t+>q(vlw1Zw(M0A(BKRSQ1n;Q9b9XY8u!mbuO;7Hy*C8{#qXW)KhT(5Od~SwwlrPnff)fK3{HQlfuI4g&i8u zgZAl6OHDSc1X#Zs;7QEsb3R!_v$sWEK+guTBho6*V)Bc|fbYfl<4G@64YuwSQ3;Q% zDi84Ih`__Nx&gPIp>G(j`9TZ4FHVMZ1hZzxC3wsG7e@QxHvA=%cu0wJ6!FcSdl#t^ zBVlIQm6*N}-8q^MOscGWTX}0m(Ey^8peL~f0>hkdwu4h(M-7<1{h?b3ocpBijpfI& z7l+RytZwBUvAzXBMDt;j`jqFaVtUZ@+}Gbw=YHcf#dg0{#a+)@m2Mt2Jd_GoY9(K@ zVJK4cMJmHS=y@zN9%PlARp@Q{ARL02uZv%gf%Awj8onv{oY*})%f$nN_&W3nb@(GK z_L|ZaiNZbC#0|&Y9r@k0FO#m11j8@VIV$8O z5C=m~?#uErh$#E@Jn>P*6?fb!%o=|2sii#e4CjvTxHIBZe0|vsO}w`CN;P}=xJpD$ zqQoP)c&oGrrg7ix&Yg*2Am!R3Ux|zP3^Z0{Sis60d9N< z;@SrebPbsOGe*4fXox7sSphGc5cCb$B+Qp46^Y6;uBio{N}U$7xv`6UNg@qFtMdjo z>mPRLIdB~Me>OO#n%`@8{v`JpxDvxQchY4RwhQ=qyirPmpNV9b zCMxK_gRS22fNN1G3UE}QEtf>#@I$Ur7Znu@+hE7VB>Qdn9tf7z<9ma@Yvo z*9>@h!G?b0uj2=s-2IK1G8XR)FwQ~zr1qDArXM5%c~e&lV?G0W&YgzT=kwBHbAUZ@_(nECTTYEn=Zv(2I)z&Oo0 zxOvNwMc!(HQEpdmY6!^-Xd%lbm$dUX$**Ek6JLAfbK(k&gUgSJW-K^E0n(Oeh05oJ zD&h`%1n50Kqv+>TU{)38hyG@p{rdwnO~)T=6da2j?8EiGcT7x%G4Xos34d%LWc}_C z0Cs}r@aqK4MLSd6K$F4e(+nxbWz(T<2wsRJAzy{K*@}zw($Pgw%LwANQ}P_c&eGB{ z`0|HQ5vsEMiu7k`Z1oS1Ii#nWQN%q?c{T^6UIsmF!t7zo>;-OpVe4aNF~of0yqq6f z96lPw6t5pY(NoQXF*sa0uVYh@zf=4mJz&Ow-`oEnPv=ALJ~kpQ7SGdm^ka@6o#?@J zb1^afg;}asv#%R5trUbH<+i?0{brZmR6dxB@oRQ&kkLTpc#lf>A@I=F=%cusrfc4cZ#u(pGDD~6X&@<%ezX3 zBA-+a2;h}ViKDsVszfWJ6Q{B?y;&(k(xSRjgBc26n#2k9$^<49>yh$A4^Fb{D2MmI zsLc0S6U{8--~)d0CglvAB@RTY>@vW@I38>siE7dzK5sOnUj{wL9ZxA9+k=1Vs$N!J zpTYDAeRn#t4&fHw9mnGQ7Ww;n0GsT@k&h-P>nvC{e3BTD;E`TQb1d-``P(wUp zezNOTH16V1kCnP1M1lJi0yrD&)5hwMl}-k6e{Sj~ug&0&mKvS3>ULdBZzhvnp1N=v zWfhimpVjh7n4Z>7yVIGThgOU)s9D@hXfIf9Hu*xJVg_&a?IBlw(7 zPEOuNPMl6mOx{dPOe~itwa23HIBB%|s*$_?g8cRz=7@tquDc|S5*&7CZZ2f2_Ow31 zEzZYGZZNJGP7s~7IH}sUx;VmN*|T4Bij?7M2n22H)pFP7+rZq+F!#(Cs&?0Eg~;G{ zaMe1m1FZE*@?tiE&L|-tF_*@j6Z*6ruvn8TESpfMj1gJx9ZFV_@#@vn@;CKx&1p{s zh&l}&=W%~DNV`sSWcuw5BfG#6CS*m9urRpm zzVe}GQ&1p~+AbvO*S>r@>M$_is&M|OuezkmG`5c@ygv%~g(3fseho7h^s ze+SL~PMi7vGm0MT@3{OwQTM-Z@u%T0(Dq*q_Ymv9X#PduuZF)t+yBB`|BL2d1paFH zo8teHg0$GYlLqCX4CcGrTan6P8x^0gL}>6o6{8WtSV%s!#K$&FnpX+=Tj$0(Ubz0$ z{YNst>$Ssb8UJee_}kf;{TpfztJDXnvQ-BTZrr#vX%vB2lBBW@BvESCnbP3Vo$uUM zaIkNG4WZ+U(XE*?Tj8)%pJ0(xpU_oyGqvhs4S9J7rWX5!z=qLs(Y}Z?Pue)CF`dcH z^-tx%M{!-yq>lmqrYO$w=GFgP96GVXI(Wi}bbaGiHA4{6*|~D0!~wf6>?-BHE4)kH zgJ1=`r>U=z0HgID8t)pMs*DtBZ8ip?>M;3(M4N?35yajFC6Khi%fI$|#y{#y>}zLV z+BaX_<@8;WR_Fc0+liMuYG0~+xbORM-xIh)f^)u%78fU{@T7sA9pkCv@~5Glt6F{^ zJ}!IOzf&d1Hg!|M+sQ4HOuKMA`sPgnhwh2gHWC_J3Ya9mYs z8@15-+}zyEOagB#5A6#?F_%l~>ajMt8A?N4^{qCgU`FO6X7pHxW5piaJ#CRv+!xKfoOl3n;Q^-nnp|LY2qL`X@S2q9iA2(&DH_Cf1 zNe;OTf!1{yYQkpMaj`lxV%xuA3U{4>n3UEjD~zqJWsIxvL3#b*Dd+{hj27PvQ=W`f zejb}dRp650z1aasqH`i|apde8ZcC#y{Z85nqtq-7vYmtB5@2~&cXskH<774Bzmb#j z`}Lx|qDKW&XL176p2(W zQ0}zP7NKw2G`-9ILrZO!hhPGzXGf+PIJVJZYiyb&;xh)!6nk{$XQ;w;wxN}(dk4Hf zgsmuwrUZTu86h7}o;f`@+n%en%^69mlNa?zKqCFoV>lZ76;EJUIOy4u;De`q4Knl* z>iqJ3$&)|M_}T0$21@&Hu|$hqqzD&9?vWnvU@}ZRSX7%Z73Ba22dlLBwTzdSS6x$6ygh%%X@L*mG>!A|Wenhs@Xh20pB9dyH4w|Ggt0}O zu)s-`%y5@dCB_(wX9llTd?67f-VDd^q%O;LqoGkRPwxr&sX}OAj8L+^awSk*$|cQV z#X%!-jV9=cFdq3?H!LflUci_Yb`LXM&%M|DPSkgSLHa616G}=-O?J7tS2ZUqMAtQB zp4Z5wV%W9G#|{SHxn}Gza-Z|RRTW%so>1CtVc!-X_v0F$ved|N&mg>t8S^VMS|h4e ztUw4vCxF?VH#U*%d+)I%0y2}PBp?GX>V6L?SW=-yiNV1^c6RpTlbaiLn)R6()ddJO z8T0FvJ(>wQ^)@czOuGc9ZFrTPc!eMPy|a_ME%>-#Y9HZ!pNL1S56G+Mq?F<^f2Iq;DmF1+SF*2mrw z>FqI$*T_DAHyu;{pB$fe-ANE_k^sTd>PTH>)c*t@9A_c*RMUnj9Q*AQ#3A>KLfg+j zeLUs0{v69*sL+?zoHzn-x8pLtg>ZfvSA4T^3YPk}wbgTW3bq=Ifvb3> z8>1|hN%Ov>>_`$l$pc5|QoVHAj=`n0o#B%%I)+w3Ugp#O$@FzMmTo6EHa46ZlBKdP zE-ri+zWOgz4z?=&>9TQ8oPKZuZRH+C;x|sSNX)&Q(r?2ajB!Q&{o~`B(mwhdgZoQW z3XQ%iU#O%;6krF)_maB|XyCRp#J@-Tt!ZuoLK~dN3xf%`lRVMTNPUz1El})e#G*My zTYcL|1o)p}BhF&QlNjY5++?erQdB6NR&%)kidMXP(Xg<+d5f?sXjG(eEj2`D{0j<0Db>^rfp@cBIEX8 zq1^%;_a{d?YJ}J0M8-ZHY?GziGE#qJeg}6!ruKgi&QQcbMMaG=P(j?3wL8ywifp9j zv-$c&MyqaVl(q8h35`awdu8Vswjs81j!tMSJEiA9Jiu)Rk!nny^JR5#MuNQcGqvkn zm0QM{-}cxYm}N2&>{5vNRy5qx({p8Ih2}xjmPeEmeYU(V@YV2-jN5K&nI47k~f z5-cwMi4whsPqB%De-xh7S65FiEKJa3opb1yDPwtz=cGTW$WbPHHCm0r1Pt>kB#V}c zeaU@mQn*izF{rHiwkzhQ#gs0#oB_FF?Be6^sNs8)v{)2217Unoj#k&uICpA*EwGG8 zXYm{0d|@I5SXv>QXGR9?7?v6nfg z^d3Hd;pWU#rm;H2u-zYPqKL|8tJyv&UbqY|BkZ8zW|RnLOg^q1s(2!uQ9>J==sg#_ zGs?;}XJJHZSfsm=pSL_n+>QK?UbzQunqv%gc8cuT!xBnsz;d4@CvR7oUYwuX+1WMH zZSoggWrx2S&D0Ar7;@nhVk4xmw$sXIYF%A(XpV%%0lrSn0>_{Gy9Y*X&t+^4+G_q~8EF~k?r9@rcS z2Z_K+g80k(sdu;V+`sO$^!@9P!uUP!|MyQc&UZg{TH+$WZHlbnoIma96_26k`J||b zsVHwnWbvgtoPv_%F~#G@;twApA-NbueTc5z%dxLgD0M@HY!gXpw=vG(Wss;aG3B0K>^;>e46IfVJE}H+kI-*+YiS0a zOp+yx@Yk%3<0@2=TfHU561mvdal6Gzi4qx?*Hs>aMJwJtgBA5&a^5`Xm{s$lGEt#n zL%oL#XWX?sZ^*4N{G8!Nzi5Vs(`OCj;MpW`z=57D8^|U0S=6^p5ZPdE(D~pn zG3xrLi4Yc)c5s-MD;BWFx6j^QSp*tu{jkB2lFY5gTeRe9W}k+|9Xd>}?dk@EQp(X$4_ocrp|4o}xC4MFE3a5=_l7?{4vD>h;+s%-stCz=FdQHNEX}fi9YNtIPtMXQ#+jYL9W068y z$v3s8C#$iKjrP5bVFWd`|6SDSKsjoCW<3JvyA^cysNPjs|?R#_|TFU@g+X zEqY?v{Q--u9QmMOC@AddH7)4%>j!#oA32N#dZGdI@V)!FD%J}o`QPqH23FWrC2>a; zRo<%5QIvjDJmGD8|Ix)Xw$SeMlX~K3})Wwk@eqDw$bu3S7M1T=4 zKaaMf&&}>duvJ{c>FwQeHM3g^Bt9p@BK=*}<6f5^;{5PwAzL1#%Ce3b@%jDzVMMcore3l?@lI(*osdA*~S359BJ?MmileMrI^XkMm3bv|xT9B|1gr6z*~GSd?MCfPJcd#oQz4fvQ(@ro$>a1+ zmcIlDG#OhA!Sd)%Wz@-48jZQ?^-!g9sA8+2Y`++9%}p7iRWCL-GZvivX%`I<35^xp z7Fs1hS2JqZx8AI6R}|d8_T$##D`MkP86|=05|;r@o(qAr-hze4m94g@Nani*E+=s}(f2mK7j6oZM755}KP)`kQRAbO+l!!he~{h865|GAS@Jo`JQ}}Y1NyUaJ_RU`>C9QGcz9*nGLZx_!-P~Y==IJ{JDJqQT8>8z74`N^ zvmxfJp(r=g&SuumKHJChGm29}ewk}oZC6CXT2_JHH|-f#u`QXR3y1^CWZs7HPlok2 zz7}Sl$gK@B4%E%io=jq+cCNo?`k9QdT#7}MZ0dh9C+HMW_G-ISOxlK8tS6V&-)VHF zZAeZNQ`b=v(%)sP0Lx+A=ps(GqcLzoK23VOWfUqkQ?%i&JcUGr$XKp`?T~N(F~n9z zUia!ll(F)Bp-tKn@6(x!(*(w%=_NK5wwOapNtv=&H>V;_E~8bO$IsPIJ+9t~^VlR+ zVh%6Y1JSb5FS{C3#B<`Jc*5*kS)>J$l6Y&!cMHHD@Pbda^WNvt>M7;by#X3O7dqii z@DsQb-BS`a#r;pkl(UD#2~{|*0<8Gj%my}b@u|BSO(<*D-)oaU#U0S3X*JewJJ?D) zUnDKihPvPG0B#%H%&o0ak-g3?rgS;^8y(YsuZ#0{tHF?u-RrmR>lr7X@w& z*RD>0tdj=^OvQ?PO)p~XQ#*cidae|!k1tTVduKQxlu#f_ZsdJ>DTcXwRi;TQZ9*-kZ3Ov&(oeb(AR1EWGeUM zV>8{ZWr>OFy@WWj?Zdb61~=jjG9Cg>k2kecWA~*yy1cr93GfKZVnn`eYd>nB>K|^5 zy{R&rrM0_rCa|ZvyY1)^1qm)1qxH`NlS2X%bah!`nnNv+kS3-Ax?Eu;Z|U0fgtvo@ zm4w@&w|?f^@1}~#Ht5}bJwVo`DF$37lqkyj-5Eq)u|=~LpE=jZm%RE-$}h`ciMJtJ zixvs-`F2H`KF1}5U&;poq2;%oXP2cbW4wDw_HJeG)Y#ZBhCY6B2daxu`L>4rse5+6 z#sPxSC-wr?33+|KRDDo8B7|Q|rEsQw`9Ty)P96p(INR$kcmRZ}7 z84K46VmvNS&gus0*G#Y3fdo4|vJC9{3_4FobcXAtVUa$wy zTKwYY)b11SP7ggMc*3XP2$db&Q60 zFugk#Uc(_xxNMca{J8pF ztt{T|CZ&|7bD?V~?vjAdnYVkj-+vT8M8y=91j7a(;K z7^dflUB(x7zA7s8L#Q|)BVEA7UwMCJh}AZVq9nC~LkyZ8on479wf?aL^JYYk#Fn3c z!CiJ3l^T{HZ8ocD)(9*Q|5#Wn(D{5zaI&0EVc4nHfd|AY%?B42Y z(YC!mkEtHR0kaZn@|HhO5af)($h6L(+Lhq(#R@|>i9p=EE_P6@TuZ&rIgD$^Hx5~kHnkH}I?5mIPnIDN z5wmu!RPJixV72b`)wP30d5~9QO^aa=!cq&nW1aV`Q@*+xSkA>r;P=ky?yL_EPO9Ct zQ_{cX=y=0QZs1z^Iz~g@Z02Tz&N0@`8K;C%lRbjQuFNGIQp2v}+}$ZZ6RCd5_1T=n zsd1+%aCaM~pOW!eKqs!<>U?bnOiAY)Za?0;)~pL{6Vbak;Pi45u8^hTB0ikM$2TAumTyXkt5LjF}I{7u>#-XG0(xR&(n$UWNbzgsSXya4q5G z-f_H-eiv|I<46^xPyTK^!7I*8S0+;TZBe=~{WznDKme%G)k)a~ViGu)`m=6XZojpLSiBMJ4s$M$xX%U*=_R77Cp)to)wlV1& zPw8?4ZdH?rKTHSl_hekVjYpqC#PNA^J^EHU5*v3!+=m>wrJ*e922H3EeWtJAX%Jeh z7}ayLr_-y5meU%wx|5<~&U{w-46`3%eYe!z?Vbq^IIbL0qzn6uuyImf87Ur>xlId> zNH(Z6T`f4*Kc( zuab2!GT|ggX=vm|g!QVlrc#2CHFE5(%?~;jeNkqx(`bV)#kTnze0(`Oak7raAGS4T9c&X(&{!ZDQWck{n+VWmV2sEwx5`pMUs!q44&A=IC`bylUXn5bwbPC}F%Cj;I#vDT8;bgK)P-B{aA zQTakX{PyX<3SYr?W15{gg;DY9^OQpDfh!ihMK4^*+P&zRh_b7f8EzHo*{4j|VR{Q@1({>&F~d z4^DD6)YX5e%rJHzr*8MD9#ff5Z9bM6IbY!kp%dcR^UC5tENUNoTokYa%H48dj?Q-z zJ+9x>(0IA$ZBC-^x7Pv5HIZtnR!E(jn@4=vc3Ee3ZN`0cD z=+2P}7=kA;vZ-}kZTr)clsC@@H4vt~9tzO7qnln$mq5MZG3Vc|aUM=-tQ1kpQfL?# zBv0BoeN(OgZnI}jBzyiy9^Zp?DOq~aV;yN!FwA3??Z}fb^8NOQ(9X5uXI@@_r z+VRHwe_T}b^f%_7CMga3d1pcx7Mfc2PBdC+iJX@8Kz?z%p_?9{5T7}_B8cBVXAJQihFbOd$=xHFg*etj)BpixZ0_iJju0@o5x;=VDc)s-J*2M#!*6e}63hIu)OvNEQ zc>S0CP7F)Xc4=r*l)ec?lRfJ#>Qm=WDJRef8y535);A~{($`T6Odn|t_X>aT-s}b6 z>HBOA)ZneP$p`ef z>B*>xh_TCs!BJpCPCC0ph(Q1liu6h1VH&-Qucpd7X}$r@fQB+ECD(dyAJ@yCrtzWt zg~CG-8lw7pr8IJ9oityqcRnp_Wuw1QK7Hhd>^kK{Rl_Ge`8MhP3^D!w4EmTt3N4Rb z!IoCe{@GGDii2Zq0UpWBi0e5k_nVRL<@avgclVfxOW4SA^-E)@i@-nJwt;0@kSzRw zF+zX8R&L!Hhl~8%+IT_7SjQBZ^TJA7jm(cUfQ12@;2|H5ms>}%KG!|`;KOh1#U1f`+HgewuAuz?r6}`nkjTHv(*C>9 z?O&+`|7!Rb0a(7m|0?qg`~Sab8n`RoB`^HD!0?~?z<&|=1Nr$+4A4JSnc?8Us;E|m zznloafhzBQGwZL0ziR2u{^BJpi2Lq4@BU)xzdQ54KFfW7{zB&b)9~Nj&;Gyn?hk?g zH+Uqi!C*r;xX-w7V0P~3N&b|)&A;*MDJ)8=6CFO19A2mJ0Z zG{)lZ%$UTt6T*`p@49zw{cpMb-#hZ3V)_r(wEP#Y>pup{|79$~uK0@+|8Dpf&A+7e zSHr&v{C$gQ;J+|f_g(m_Pk%N15#MjH*nc(rP4h1Te>MCUf%~WU4Ho-#3#{{j&|U=s z-xZ=<&2J1}Hw*_HbB`4i$Cnhx6tq6_ZX|i;vrQjR8pU^`wJBL7ozIx%J1Fmz52TU)qJ$^1GhkGw8sKj;bsh-=hftsAO~C2utMEr zUFBpPU0tYf=e7!UKZkC@jm_bLtL^6;53)*f*mre0vr#0}iiUHYdt_TubdR>8U*`_K z7|%82n9@#04L2HkUGmWj1x}I{caPev=+#>y*mr^fR6Z|Glmn`!2@c9M!IevDpHJMr z?xqEOiX0OeA`zqsYKdzFWS0~Y>Xc_@nA98(yxC4`Jdn?{MX%K>`u<7O6MrvcL1gN0 zG&WypP8GEuU`%V6^1Zz2^SPT5UsnbPe7`W2nH3KyR;;F}C(vuM{Ulq^#Mkmshd7%0>t^TRzN-(g*i(44x# z9*SQ-rI$)a8fC~5#wQC1`040QGw%bMkVu+i6VG;R_DB2(ya84-gbkhVxouB}r8;$8 zvT2kRjmpoKI(qg!Yi&Fhht8Ihi?jUh3bo%FHyVlRdkexDce8NA?U=idGo zxNi(mElOv;-o~lJXS6)(+F`At*k*Z#261$Yera@OwtmxIR(ADu^10W*Lv|z zmi-ep+%H!bPvOS38Ld}!5znzAL(gJ)@?X6iFRCse6Zx9uvxm(Ywa-@@&=W)}RBRT_ zF6BqXm6qSPtHx83Zm$Rjod5D718}tALrEm8K2JMl?Wm--2OI*TN8>G8w^Xna9L}2& zprG(Kh;*G8Noxd9K2aM~ok6&5KkvO^UV2G>=v>Jxc(^*6Au_qv%RAvTSl4~$;*y!la!77tBTwo&)Ra8 z%5KtY;}%S(Hv+EB23|Fctvlug%+_HWmva6(iIvss+^5}9hJY1jUmo3HXl1F9{8-P!h{(ZEO6x{O1Rmm=S zkK%{>0ed63)-!Q($pA-S$*HQ{_^03sJ{pkJ?9w1i&4g`d{S|EadM9=wfVZ$ty8+)O ze!luXKj`FS!D&aE%Wt5lul}2tCCeDr%QfN|aY0ZjO&4&+y*Ws-J*wP7dpC!Ag3I;FDYMlTQ`mMB8Dm!pUS!g#_~*Tk1%}b?mtQ z+>Ss+AF6b#!(xgw{7Bn&s=;OMA3f$MBOH4TQtek64HD1$qCsiBxfX`w3HwiGf1!n3>na=rRQAbFV53=uDbhWM^t=ANpz5tr9e{8 zXGHVqR+nMnXmJ4n%kbNHJiO*yq%G{ZbF3lX@(G3BR1kUjCD-oZf$Cm=# zHKn72R&j2>cH}R@2OF9(+ntZI7I&KksKMHzK6V37@7~?_t<7Ez4u9Gt;{pZ%{0B^` z20v(SI8gC){WqD>h!w#J>wOai&s+JPwo$&3nd`Z0?weaNH};zh%?u6}U48Wz^$Ec? z)Idlw3#0Kt{7A?VnXyyp_opmF6d;+E&=qAc&b1gS#ZLfaBVc%9OnoiQaV*I@T>Bo6 z@3;{6)|Ky>O9A$=^SQjpDt?CF`9$wGYnx9*aI7go+I>sD@H*^!3;Z3{)&ce^7U+Wn z1&A&Qe~Ox_O$QBw0xpgZfG^7nOW$x8Z)&8FqM;Eo6=cC`sfsXHa+|Ay8oWc_FXcS$ z3J9VHQ0^Z+U(^s}b`P8kGyTJwW8yc0xzDlSm ziXGLHiQeK|T40Ur;gvQcZRzjoZzKFL*#C4r%aEVO%8C-MJX?hKhg0pnhdFJx`@0Z4 zQJ8pl$0gk=8L-fX{zqc{NU*$$BGSK zge+aL3q|3LVb?Tq;?;mkXk`tS)`EiUlWx)bB*1#K>|}{jGm+I6i$U<|t)ar+huce+ z&SgiTZY!TJ2#+&gyd9MWB$s>#d*H+}Fx^pF=S`zPc5^nu-Hr~55U=hs1(o?izc#`|gPE@LOt zMm{PcTFM%3B}4V+pYCnIa|O6Q)!nuGcFeA3xM>@I!mLR)bQnJEbO?xUW9#qS0f)~lnp)_*S-0#*DNjrX|W zG)Vvz%Z|ip?2eJ%rCsM#l5(oQWt!ov{BAum@@3-HU&C#ODCQ`5g4Q*q$X)oUALKw4 z(RsQ<$mO?TQ6t|8MOyU91ip1n=x3P+p!&v{TW@)GWN%MfG{jC@tCa~y`lfnx>ZE&C zJj)OmO&%m$hbAF6wtF{-9;3kdwwG#Mmb{bSnSHd;-OGaQEzE+gVYMtbz(}sS{_@$y zbN}UXS3)yCAfPE~<$i`5uhL0=WEWQ^t}z|w^Omr%_B(1^DJhM*9#&3uH?Ar(ltV(g ziM7;Bga8AW)$Tq%$tK^?u|?xwl= z(l76i`SZ`E4yMRvRD5PTU_s#!{49O zHp%F>Jf3=$ft|;$ z7g}g>wE2Wm(9*6KF(IH%9ONuH8Gho`w8!nSZzs}%8d!3?t1DYDozP*^{HgKBLL(=g zC|K}or+DJU?Wzz$J3Me?@5op_sbF|Kwm1q6 zTlwg{NvefocCX~3FI|rmoM7PoO2%7Zv`@fxlwBIImkb)QaP@}z0>a`f2DhB;Lrt`e z6m)?sQ0b4dt`fPt~(@A{IZF4-=eJdhj?B&*Pszv5eaj z3=7qJL1SAHV*}h1mp2{eT46H%P?xs^Zfgi$#;F!ZpkLaZ;s=gpD;zmx+T=lv1slIf ziSZjs2ml9bk7F)B-i?47#cK>s`6dVfX*e|X*xR@7RC zC~hqB9$jxxXZ_)qw7%}VF|x$fXBfq&G0d*U-q0rR=xp~?5G{X3fA7B5rU7DV;RpNy z3o``NTqpe_C!PI<9Y}dkipo<6f-kF$q{dvr?C*W8@~e0!|56?c&lm>=Xg{VQ0nD{kQ)UN4cx=B@BE_3Dcffy6u5RD-I(D)KFd zAgpHebVQyX*Aw(r1d)nN_Nr21;g-`%xEl`;4Mo)c2i@z}_0tD=eleGpWEw~&F$&xk z-XJJ(byJYRv9n#gxOr2ikaY9NgoA86A5(e|6c&7-vScVr?U1yV@Q-O4yg$;+ae2Kk zo!>n;8@-t+xyYf|SLKN63&6!QzN0`P>PGqH<@zeFE=|+UuArN;PD>RDhE+4Ly39StIUgMPPYkIWEhTFJzc2 zi)TmjAxz9~ZB8qNC>Xr1F-NzaFRTu2_9qeWPW*O<3nYInqp~F>EDUi5zJMo&LGUOZ zkkoY0>f}i6Vw7%Zv-Z16PoVCXnJ<%cE4~t}VHu*?6UhXZMc+E!KV03qLzkd4LQ}(S zbywUI8H7g(f{VS>6isC#6{d5qDkmKgdM)V?&z}|4(7mDflmQDdtmBANh;mpXAjl_P zc<(4ao;nczOsTsi@qNH5mPYU?CviA)VQ}<+4%bRy&U?vIgSI$mD+&@cd9*XysxS=x z^CF#~pI*?xHm_RI4DcykW^hoat5-|NXmbL#6;+Ibrh3aK@DwLx@<0vZ@p$9D1f!nS0&mo;^8BTq0h9ck@vUA#D zkddk(ctxm_yf9QitG^phfej0_xTA)AJQ>l>95+q+L||58fgUj zJCkrDkCz3#4buW~%s@;mSYvSFvrO2jqvh9!1c=^S69EhQ%YGqzimrbS=TPmGW1hwP z?B8X`45Y-(m$L-Yzv)wZ28xN4cA~+1WVIYf+=ojRxLr@NjgXAw&Aw?7qy3N*vVkND zL&gTew@Ca|#tIn`{W}das2-R*%%&d|6R7CZ-W3Pogrqmb1V3XgKVH(}+Sxng`lR4~ zD+*V;EC@3rZKjD36z4_!EOTi$x;2@YY9X#F%2ia}{y`DrF10CHPGY_F!tb=CZuw6w zK5p?dqFGgf3z>NROWVsm{R37!@NuUB!d&ssG7&G3y)RT&YJU3`j)K?wLA|Z36VdcD zs=!AcjU22yxzkjKD|9oTVwR4+jv^>gLwBXGFUvub_%x7e)pFnS+-J)`m9L}u?V$7$8%D5H$vhqj|yT& zp8Idi>&U59k$%HcB%#+!U1&w1VtIiP(kRI3eR5ymt9JUgAy6YZYdPQLAkb%s zul#akl8b5DDS_Z+TjQg^%@>*K_ajP;Np;-8_Q6arpAT|FL(+`}g6+lVIp(>W(Fv;c zLUsw$EelSb&-vY3vf|_?pqlGc!S8EN3pQCJh#PD72DTNgE^|_txppRC-~?sBRDFIy z&ocN%gJRdf+i{I9Wpl*0Eg%ONNRoU+B&0lABOMA7&YP=?|2|(583j7vTbz9YVo_`w zT2W6oO{mw(IJ><1&6(Vd3tm$wS_uVqSmcz*J`09oW7%ySx0B6CJ@G525~jxnUM>Hp z(Oqgb7nRxwEW6oYll*J=(c&epN-9#=_?fKyJoltIR97@RgYfHXS|+8DqYtk9-`(xe ze# z4vzWx38E~Y=noXXE3Bu_eT?k4Zm!fzW5Or?=J&yzOst0DH{f6?1CnCAdA;{4`luQ{ zgU_dccgK#7YSKItsGn!Rq5WYynho$yv0|lCQ6*=ZwjcAlWE4r^h7aMpPbLSVA;Ve^ z1+4*t-*k}vw^hFz%VlgmS0lK1Ow+cwO*%^zkLm07F97?lZboBf5E>PmF=8R}{FL`@ ziq9ub@4LwDzdCq}xj+55*|HgFM%Z;8vB1a zcU*r!L2w~EU7t}5IT2tfO*khXN3@4rp2Ky&$k|?P2y4+fK`Z8+-qY|LD4%r1_jbm5 zx!byC=+GLERD+_%CfXO%Ij8NjqXVcf0zWwMvs0IQzAkFx#oy>j{bw4KD8f`B zy>fuC_9293%pXSJS`qJ$>TEH`8-kG7V*;mu4L!9+s(aYMM3Jzh^@wfW`z+4n0>HY4 z@q3x4a2052%Xt+svZ@{P?CuUX9Hhw;!whgQzi*6A3@c&9ez%ily^#a?gJi1j;22!) ziRiVbZS3qpXsh|q00hzDVB$;$2+eR4DPWhP7KI^C0AFsr!9|I{+H-rQ^LcUG@>|YR zCz}$qplz@vg(>49<#lPO_H9yX;9`4WUZQJiaJd=OZdL5aG)R`JKMacs4E!I@sIZ8jtpXb(*{Jpkfa!>jSD`N%hj2Wg_(?IjUq6AN4tK1Ko2wyD7 z>eY730i3pHlyjW$(t3|H7Hf8)vBNM?=fl@6p>rMtwLcB zCU6L!8;wZtjukv26I8jfH&lHLDPCl(jp+R0nqiZ)$hqOfk03&^e+lT3B={0M?Dwl<^(sU+M# zF|9`h64iNPNk&6ABvt|Om`gIwqK{YdI8t%7AO>osL^noigb%st0Z6a?>U7`j0HQ7! zE{}e7S$>=btHC>eY=$;OE+ROeV$)HjmIL>%bUZ;0qp{Rv5Y8w708-j(UGZud-*qEw zNt~FTW!dk0I7hAFM(6Cra%aD+k(Yu6zvYTkd}ds-qfEe{>9uXWf2Yt~D6|EuL4(6I z=#?h%#IS&d!hFPresiv5bJ$Th`rK7Y>12?&xI!#Rkya5#;f7M{=maO0r}`b8Ho)JC zIcvt_j{Su|^wGHt4tP_Tm1Kz{gd{wB*ItX~QzK$e%gO2!11pRXuJJbP2P~bF_q!2O z75-myeA|P0$I#1af+Ie$UI+D=G@2O^;+IiLq34=M<|uM{!Shr|cs(Xy7w+7IZS!;q z3{UsOY|R9X=M{Rv&@N9hWD$k@z70Bx07CnX@8Boet_s*dm@by?V{uz8B&JvH}@nBsqPBm0wL?b^t_#%xJ?5z|g<=uf_7R0fh(7e)dV5Qm4Gy?73Z6>}%3dP+$GweBF`+AQBcYRqm@A8njX9bss`Ob?h z7--f1z})tf_|Srj%i)%yfpipG`Z;iqyhW4}NA^{Nc7hwUdKZIg;ILN}h;rVI4WWTo z0cEpbwn4c41*_stl&?yHz7mzz@%xwAK>eKc>F@&|P8 z*u)G)_fNLr;Kcf-h~eewFbD#(@9?sPg0mjvf6}1qc~?sV1ZA{&&tc*5 zqLGJuX5^T71|?%i%X;=`%jilMe!_&00?W`(5dMet%NRcphr%RZ$HLUL zl3s+;es}N9K}6@hFV7yCvwQj4Cb5g*VAy@de{9 z@OonWBoPgcqdEzdMa0f)lR2gu>p{b8jt&renaed?_ z%4NTPDvBkvECPPdI?PDD=tBYe-ns>85S-^t4bhCXA-`vpsvhM$`VS0KhMqA63bWJ@c{yT*br$L{hDc^hZCRg&#O(B{0d=~15Q=_5 z&764d1wZqosGl-is4Wp`+oBCeMG?(Ikw*K|8~)ie2&G2Ii{ujLI#_5ezjJ*xRsS|w zxEf`QfS0{;L#iAIwCB|PD-DZ;cEqjPrIHA_WidIi^NvLVCj!yj;srLnt3(O4^k$bD zC8mGH#!vjF&R$=hPs8F3vj+0;9>Qax$L7+Y(%cJjOn~(SO3eTmT5PKFrPXrQcHRZY zpfpe*miJ}oU_!uF-&Ffh8xH946#^yVMo+Ew(+rO(F8Ger$!wLmEDZYc$B=X>KP_Bfpfjfg7d5rXthMI!r9mTtM)NnBG zU^DCe)ns!!wTHd&!ghL-I@p`fWA`?US`@B?5Y?^HFTZEcaQJ{4z#sL-;orHB7WZusiN z8@wi|2X*^_+I&6vl3orHc4`!JWX6Y5Fo{#W<`z^%^kf621Qe^^CHwtKaMpzGvcI&z zS#|P)2YqD5p0A6Sj?q0|Va@aVOTJ|q6$@K(cp4ea9du<09UIZ~WdB0%!g>&*TeCq@ z&;P5taBo-%|7mZK2mfgz|CSc~9~uG#7T}-u55j>zncIodkS#t!=ehU+&NKAxZhj6t zOiVCADs1q3SQ2`)4{ThB2ncK#7#K>lq!V-`b*n`Mb2htR^!cr_PquD#@Q|>Rf71-# z9*qBQbOPkJ(f@LKA%7qVd2i?c)BGjrCo4D8h zy^S$^sqShM_6nxZJ?l{`rICNyO+6NhPT4w#TzRyN?z0k zxaTD0uMO!3trfjUoUV>C@xpU(kUy~2W_An26Q#NjNW=&u45_y*rj4K*BW2R3?Wx_fU?h_-Gl$Bu`p+z?6!=;2VLBY0-aNf*Z=_WR z{Oft>@H;;3M(qe_mW&?QePo+&_(N-85CkU$4hjlPrcj8y?-RYm(`3xrChIV~1&{;z zrNEr5Z|!oAhZq9<`;dSR_JbX}eZ_xJ1*VHEC$UjK9z8lEd<+t@X?v%i&#XM*qSbGwr)Evp z!}E)d@-2h+;fq2wnefOUn3sjb`473)vEnRCWJI;Uj&^>_gEP#DQx&pM*B|rBN}7oZ zR@IgleQI73%Xp$Pwem%Xl@qs|%cJ%~5Su&;fAvv`@&RkzFDn;nEIYH_50ZDe>9gMI ztG?p9Suk;y*iYA$;kWNm;p`}Ced0B#k089g2gPxTkk zYr-8KcFg;(A@njlJb8>|5^k_M&lI9X8Z(tt3SJ!?-$8^y*|bYLTwhwb*H9G$umc5; z5N&_|m#)i;vV2Pjh@#3iR|hjM^tQ!dE1d}m1||@I@)%AAI*gr75{g%>KSQMuo2 zh|eCjd74Ct8q(RBoS8)@@VVIL{DDjPL-+f`{9jcxFFO}NpP}9L8x`&@3w#V}ZL^8Y z*0_Lj0o)`O^cVB6oCgzeFeubEavnio{;`FJOlTa)9E*FCmp$(C2-^Zagart0KPnQd zrxO1!rs5p7S<_^~5(^omQmb=>#9)`t-v9l<80Yp5UVc(9x3 zt|U+S>#9Yj^Mrg|slL^&YWZ}24mHx0EcS~ANp0-~xEPRvQ4#<1$`y*IcwINULS;fY zWk!gZS{2+I?GR5nkbm|4I+$tXaZh?nO2PJ2C=@=SLT)oVZ?s> zYqj&TpS!E7*9MKiXGX-k=uPHVA?~R$zFOKYUjosuu=1Mlr^4R@OGS}O`)ZsZ9u&^D zqB70CO2c!Ucf}rKa@_&dB};0>-PhnASXy?CcOEMj2@4Ikepi2r*I&dEq{riekwqIn z8*7+Sv3^e=&@rL}*dKlpL1g(hd1uM<0kPn!%$1;BCerDFh2G_7}Ux!+#Z`zuo+@1!_@`ZlzDn!$_<@@+xnqD6668CFIF^!?-q{oKUQWMu! zH|Pn8G>Ic&fcdstgW((lb^hx=^bZzg;qmH#7OC-VbgZx`nXD_aOKi7B)kO+Az!x-h z6+oC2LQC>LfmNrKS^j#w%=q`nr(eMxiGkubqvdpTE*3p-v+$(TD1v@w%+NsymOlPz zEz%$nFAjd0JR?fL@1P^=J<3~)e14#~+Jm8XtpQGPZ1t4~ns zPeIbJ9;7C>` zrS;kKQN1BX=@+ig;~x@VLZ$#=Q+N;frfQDy=ZdW~!m_ z-23%+Ux~{^!-c94mR6v)Q{v1B7K0gY^;&o{@+Zv5x%}6ljv6xTxoojVe#5dB8DX}% z_7~=1fe>|d2z=|L2=a*_+zOF+xl$Oj4tR!mHprUO>~r%qq&8a3MHIA^k90+l zPs5@UQHKQ>*a(76hVRH1+QoQ=$t6dbV7pxev(EI^(V#gGPR8^&DAt#8P1X%Ef%+UK z1DW4t5e{UQ=7|SvnDL3QB}PB~mwr{W-nmYOT$kLZ_j!gCi1@G&X6x)61c9#RK>_#! z#(lik`npsODzk=Y@Q*O8 zv*Xf>MrRVW)68-#Sg5FmsyW9>nmQYb8o(lnKYtxPDF|K;g1@&kGFPc-fis#Z<*#gL zcJ>cxQ_@@&ZkZS?kgtDvO7M8Ar@_}hBlbYu@!IbZ*zLQBO3KuW#eb9!6@Wt2@l z_k{;MMUyNn`H?N;TmASAKf7dpD_(FH)fZ^M{rEW>c7n|LzCQ1))8cX?wt~cb{i9?i z+?wlyD)+@ajT&itc^`6u<+oS1ia)$e3aJblIo9-!%+|SOIZUz(%0&u!ja<%h z6~?wJXdXG154N5tpO&Vg>f2Y?ts;l0TRy1fKp4swxLTUAWQr3$t3t*EJd8PXp8qxy z>vEuc4bc(lv|I%E_&(&O=^~jz%2K&rYDU<-q;y~w;aTOvdZdqBu_sq)g=)W9X9}x} zeeY3scNUvP`Ct7DyUD82-r;EeBJ)y~Xt=3S2?+hxm_)gwl)CH*2yP0*3;;G51~`u2 z&NeFx(|^T(SaB&91XYo|m%*HKQf}y({f$TpC1aJ zbo?B7XJt%FVhjXI9LwpgGic|nxVEL5g-H>u?kwrY zD_ApF##y8~lHX~m8ITk?9wfKzL>$pa(6--ET%Ldn!CJg5XnES9aJ$>QXiWsPqkNi^ zu16un#>jY{TuL8|D$x`=fTO+mx#E)M;Ly)2ANd)qrWJ^EfLu0LBQwk$?Dym< zc}>lkDp_GPTXI<-n-j2wU`H7f-7h^`h@lU`ReDkO-6hN>X79JOrD~i z?E-=co>IPsy+PQs0@tEFiXC-a=@G}>+dPzA5n{w%x-f1 z`$5mM_vgTH&8Ox1*20XrFiDp(FDL%xh%`~V&)T}%l5u$QF;6gdv7g$S7gqn&Fu9Xv z_hfQGsUGU{#TvBii%zF}F|p&<{kbJk|7^LFa&{Zs=6f=LFdgk<4jl zqU66sP2HdSIuiJlxDtegMggQeqIgg>MrHV2kudwnthw-R@cCO0@(yEn@%*-8o*2x8 zwkx;Y;rE@M7A09<$RP+h{}Pt{mz>r<5K9jssAABd9j|MQIs(xg%I$ap;6W|4ynbHV zihMbgD^64a1G}hNXL-b)RYvn~G6K|I?Z`!<65BoctBw!EJfPmG;v2&Be>|NCdnx1rj@BV1-3`xQ?0~Fb;79KzETO7MsNC$vwe-ejc6}1QFVqYzM zby%%A>L zX+v{WD;lrgQoBJ!7_ks8{HN>mGI?D1U9j|DL=(W@f{aB!nFZs$>uL+WxHhEj&GY1W z9Ey(Q`Z{kym6Tnx<(!JkoeAr>Y}}0FNoXt*BEz{!ox*0Bj_2?>at_~%ZN=2~wnr_= z*h86;;$e_gFdX5GF3m$i)eix1evyg5EkxQBVKkZ z^sgaAiv{qhNf#{{kUo%+F6PT{1!j=bshGh&?HhfATH5O5J3A?%4q^w7y#+7MiW0$n6Z_@WeN|>D_Vb8ffkS0$1JOu+&W?wj0Y zO3sh1I|#iblBA$8V>$4F`$;;kr)3~E{J%3P{0FS8lo&Qd54NYrujj(+ZM!w$$<3LZ zm%}?Y*YR$(^c}GbmV;ldtS(p!j6i+F>ce9b3XIaA1y$I~3{{G%>-7j*$J>bP-oQ4th z!I_(WIy_R{f1X`9mWT&1Z0cGQt-n3cmkj~o|0v1?F^;e_-7io&E>?DbSb)E{24x@# zZCJP?j_ri6=4VK=#AZqR;yXAV?*vIBB&GgW_)aeXlKh1)@wW9Ratx#uuaC$6l6QDy z%JX!i+`{pt`JlL*f3{#+-_SdG6k_*w6wQAHtnB5Zv+)sW)Vohz?#ZU(KX_c~OC3~Dt#NT)=4Cc)_omlnFDJwYVi!*0ecCliK*1z@zVF#@Hc;2sh(zwN&F zLZ-zPaWeJ9V*<7hmsDADN_^HhG+xp_+eo(u5<)x^Le`2ByE7xS66Gtx{T1GQ&9B8h z!}W>)ZMmUaNL7I}29CwBjGUnz#V1;s_=NAlwnOyr1@Ch!HwdS1B^w3H>IX>jV zD$3v^gWhqY5Lxr{dKh#p0i!y>B9-{0l@mh&w7RyUjFtUJ#dA}6%uL`@1G5O33>v<- z;S=)gsW9y8=YFx9b%Q3gshOq)vR5;0$xtljJ5#1-7&#QNoA^k;?jG$ZW_)*Tpw1`G zXrEe&Z`AUucrFUSu7dOIFcHgQ(MHoL|2=~=oVi|1Gf^#A(XZa}{J`H2rrl9wT>%L{ zYd~=2J+IpGY0)}_s7c(yC@K*iuIh?FXwbXox)9F;<|EKA?b%a}P{Gw@iGIxs$hi2I z@&YYJqLT-Sn5?$?mi|0&IkZeKmfbaZ7rMv z`0K8_j+qYiNfX4s1Tifv=k_I&G~4e_Q4dEHG+W;5V<6+3%vX^tqyE_0HSpy*IQJyf zWz^s#!91#q_Fb+b0q9PG3=O-iKY$Vi5aru9Z%!(Oe>WLPdsQ2;P;M*Me~_#((sg~j zxsrT2(t3#AT0j#fZi%kEd6&^NbRJ}pnXsvIc^Pk+-{b!=89?A1`=K4-0juvvZiO_q z1@bV%$t5jdO60YzcHGC5OKRU+3OsW*8=60bPjN8QQ`fTA#j{ix5YV;vb?}8L0;ega zFh8@5EVjA=(sv_QksAK*Ud251rhp9%TB`Cb*UL4dQIY*l6ZFFLu8R z+!GCaZlWlj=^4VuP5jIFRoO%HCjZAuLxEAKqtdCHtNO!DOq*Bta#h2W;hEiy15({D z)tqd5c-_(b5{?D*bgWG)ct(jG*m)U`ZEupxX*fpPvn-9B+s8zb`IQ#GpyaVZb%cim zONpsZ{tAUpRU?8&Jj(4Uyv^V{3fa!OuCBEQjtm1f!A4DB78* z`Cki;9MFIbyGb(Me&#)nxFJaD!D_c0rerGv0=9JV;kgz_&1%dOo;zw2lh(IZ+VJP8 zY3{YZJYmKAGKYazP;2aztoDaL)ha@bD9%Dho)C%ZpynPfGki~q_MC;`0!Uk?)qT`R z*p$JjI~*b6GTUBtWhnZI_TU_dXKo89%wd`C{0=f_6#dRK*V1)cQ%o{5nRpOYRhp>- z``hk*i=?hh%iK6H+%*RIt0oV65=SSm(M3=F_6KozC z)&HsbyDh2hO|XkigN)sowxg)Y2;bvz#`%7?=O%(IW%{7V zE+9bf-Gzm%V+$xDXy6s=?C3ho(EX!cQB9v%X@}#n{iT0C*hm-{wSNXDo|Ad%vJZ>i zMNumvAqZ|=p)UyM5}N%VZm1`&wQUIYsyPjDB(_5MHi=|%5K?uSn_gA3J<+sCC>okL z{GEHk!NrjR#Ow5s5XZA_=7o|t_)J%lp8t6hOSDOv+spEB5AL0+0c4hskNuwP*2*OCW1=bK{<`fO0sT-qFveq-9s_TPCYt5}=^PSszM63oD)@ zxG>XETz=bOd%{F(&(2ep1Aq8D$luNpu#qN*UW?Ebez@FY?YDoycV<5!&<6Yi{`*~S z?{!~sXFOBHhcshD{O)nq0EQ~FdArb!md=uMnXD0v zr}ef1cvHHq0by-B6;zY-mAS*loGO$G%}EwT-?pOCD~G4MlYFLNw9%jh$q&2jD0-$$ zETth24$j0zpD5RtJQqnTv5;=?Ua= z?|zwMLl@$7QBIX!XTjj%WXgDAxXxJKyvh|T^0H<*I2G8qE13!VrS0Ifl|Qa`bdg&l zB}7=RAVd_3Pdlu;Vy0d3O>sk@V5M%(&N=zFz$cb1DRUZP2ZwL`x1(l6++nr7#MnU< zfr~%*5mQE}Dy!JD=4x#ILvb2HViVizG4v4koE(wKgIP85Squt$RYj@aq#>)W=)&z& z3_J}1Z;m5&|D@QIuIzI&r5F|SsoIvf?5w2gzRie_ib8!+2AzzG)+J*5(Ng6x;dh3s z0cisxcKIe;3-7y@f~(sq)@});xrHQur%B(Q8|)CDW@DXb(HdVjF4>N{XlhtN7oYaf zWNeA6uZ1djTwBr)jqxTCT{;g_6AK5!(Gc(-(R6O&kFmr5V}lZTMU(PB=W_#00}}$X zz09pGrke^`k05mD{8sjVHo5@O?3J6f?!rly#E-8gN?Wz@=o4G4HZc>Udd=ergdt~1 z=HD!plVj48aJXt+kACubXG*yqOtUInjinUIO<(&9x;Jk0P{X0wM>KAmzeq|Kf?&#UYc^9@?bo*}RDW)AwWDXs)@ zDX@usdzRjE=X*k*bjjfI`cv5wlq*cL$Q=}#tPeoekD?Qzp7-(aQiI56!GcqRZOGys znj;i3u@Z-IOZvk1Z?@+ZrQeCMbNsc+J@ktej53rz5F1DVgaQiJ*JHkID5|HZs^foo zYwzJcd)OYFzabzE|PbO-5fJNoO;KhlW1uM!aB3X z;<7ezgr9Q@>(X<43GWV&?#9Z?`qrUB?~6ARhxma-K?nd!1fxN9MY9P5r7}-M*G2mM zK$H7vh!#%|&&TxJ@tU&uzU>%~RUa^wkpwgyusx}H@X}Yil(|57v|%(^wRSLP*0>)X^ ztEJNizd3YiR|S6Bs@f#EhbA!sp|hU}R5B}QES&6{hN-`{q}mRD6zBVWv8{l;>Z^x$ zLn~b5;rXBo!P(i!IqZ0J8N(vLHXe!$c13*4THKS zEE>ZT{v>#A`C2=CApc@n-5|5~6w_}g5#OA)3>H;XwoJr?>kq! z>8Ec(v}>FuUN=%hB~wp(P%ap`{aPv<2ZDwYG*5mEk{{?jX8(#5$VLkj` z2eSWt%k|#>1^n>;hd%I6+C3x_|KB|P|Dj?0Uk4zV1`yx}3bgM^Q2v|Zp0Ld4&6!rz zn6`SI=D$+Dm?H&WB5mTp1jv$OI5^N^&e7Jqa$!yl7=+ycxea{`vUo* zD+n5`J5?&7j|Yjx-xr+z5VG0@jiW8RGFN-P_BT8ge@KM1JOj>pRgqWp^&7%w=d>&2 zZxR8XL2vr?-3+K)z8BzW{U4ADC187=_E5U!s=23fA?3Qc%1UfKb~fZ5sB`bbiIh*P zik#8Ky4trE&07Bi@XUbhhp<)j;#;gze8V0dv`%|}*8WA)d%MHK_@&7*WKmlH;4=%;$*3w>!iR=Pb~W%avV;OaUDtM4a#C^XsP~?8yieldwal!*^Pyj zkJe`TiIl|e!)|Y_3P4j0B=H&w>SpiB@=8L2yTu&wbvijU%;tz9!_z`B1KkjphcvzT zK6cMlAehnbR98Q_`2Lrg>!f+DaH-ZW*rXfyzd{)ejzW|2Jyk^$$jLW3Bo<_+TKPHC zq4{bBj%Mmd_30$AtdLjuC(nZZG*%ARt4LHYbKC9*XmfZ@ydW zhw1p9a*#`oyC=FwL-GpUMEbJc#;4f+Hk2YS52QZH;VFVk4xvJJ5~c-;95-fazi@?v z+SejJ$ESZ=ty(JhDjC0XvfYzsCMa=4Q`X`cVUKy%l{LrC4lXbvRIAt4ZrDFQF{lI3 z(QBA_3hBo$s+8$#oag)4E57bB|d+)zN$3R;y~1 zW&*Q{a#b_;HQ81ZHw=^V0RoNiHg*CInV40!HG=H>g*O*Hd(wa>BGo)uOa#|yDflSRfp5VwVPVHj7A?-=b~T}ks;9?aUIEI=gg<()(y!{NjhrFYFGL&Qe*?|SGZ_bm6wjFZuRML9Za?Uc4ao$2j(#=T>qpYHF+LnoVYFNC^Ow` z7`0el<;+*q;yAtZtu9iZQ~;5OW6yH_7~dPm3*o^R$V(( zD2TeU(@O+r(|F2tzYJHuT8s&z^>DhG84X$SMQxoM>v8@|J)%mudk+Cgp_@ydN8`D* zM~>3%<5P+H;AG`=A@u@dBblR%of`{17jwmlD4g#nG#*UBx)BiEKEzMSc3kMXANVg) zYK$RWgYxMBqx_KKr!TWUQ_q4cKj%K0?n&za&rI8{_sP~YxCHCY36th8b@b>k))a*H zlGr>&oSuZzKY=s{-QVsn1g!UIJRB*~?mmRuc^d$ePW`l2O*ff;C@u-!JD1YU&Ch{0 z&Da!2?><#h&3E}YxQj^FWkktWv?adK((lw-mT;d64^6}<6TCg`-tEOx&ue=3xpKDx zkRDM9Y!%G>Y^qsoEG%I7IDkDQCg}Nb?v-_0;O*iWQ0vQq#&5qkA01%7=FXGA9XzwP zl){{^@k^?nw8;haLt$*kDZz`on3`jo>r11JslnTAK(iP6OX)yQJFP3O=u@EtFV2a= zc8A?DehRhiOix*+Emq+#hGY`5{|Ye83=?WcDM0Rm_QqnWteoe zI$WK=|A(=!j*Gf$9`$*!PyuNa3F+>xRX{qV8>Djq>0XuY?pWz=7NiA1nx$b$>F$PQ zxx4uKyzhH|_kQj@|G?+Fr{>I@IWu$S%(zD!O@jXbVi%V+XR@K}xGu6oCGNys@)B)IXWHh5FuU?XK+hjsbxh-58?zHTes`0HpXRrks)`YKxW1Yh)7)1~ zS1K{*hb`?M0EJ8B&3e;7AUrGc2%)959eV=B#p&Bzpe#YUtb{dQjCq+fEwP?JvXsYTkbc~ ze^AP!ntGM-x<8N>&H83#2Fwefe7PcOuuaxBDbBp!Tg{_YMPj?lJ+g6;3^3TZpCM5kV(-mf<5DlS?X%lGE0yQkWnwuWu>^MEL=BXfP zz9Fy0qkS|(g97nl^XhojaA1zF=(y!=Pu8oq{qqr06O|D3-Of_HwNk%T!`2(i{dCzs z;6<>0N{Oi=l+lTBmO_KBl>u0@cinRf7NC6v+=8r!8@15Yt^+P@()Aver^4oVfY1~h`E$WXQ>Ta*wf~Kk!gVpA$Y-egC z^j^51wG9Lr4j$A1s1Q62)yp?MY{y z{4GNRC%zgr(916+R?~S5Mf(2`ZlbYVlg{2Gcyh(b^L49!4o}H|Yc|5Xa>tzcse9{snc$p-!mXZb;CL z;OmN%PUWtjv9%H6yO;}>2SRY3zD%GesShuXWXt7Qenr+r=@F*|K_PVFY;o@Wvuk<> z+~3C)#`z<9J5NhZ$4T(R`kKX2MzhkffEiyUb~>QW)(XQG{-ZyqfTwmBP59sDbn>BE znwR_;E9Dm2*AkB*xR704CToEJxm357su-j6{FZ%@eOKKHJqF}V z5Qh7hABh9n*q)K~Y8*Uh?~|2$iq_Zb5%%?KR8-9K*pZmepQHXl^Zf+Wep4)8MB$to zx9R>3>tHk92d#o5G7_?iycUg5>~qifptpc!sc-mH?((Vv*f?tc;y7zj^JqI?x7P%9 z`XABWN=oZUh9Hq>g9v$78`vmhUm?TUlY@?C@+$38 zT_%E2EdiNnuIzq9KLRy(F~b#6I>&$K=J}N_EchH*4><-1=!c=E_J0pp_K%|UC)V5l z`0yv3od19K`A4z(zpGwMD|0#|j-=-3~e|dBsI^t-~L^u8jYUk6kGeAuBIj(SXuKlAgl)6a?5UE z7>KD?i{KYuyY`oCgZEz_9U_Bz-<3(!(tj7`PL}gpaD9b*@a@z%hfE$w@civjloS;{ zx2rIGaIFjW!l4oaUz0hVU45dhMf^#U^ zq+HDRl&%F5hQ8CA+&*pidyNVvB@`3o*Rf8IIt>1!W7>st;_#pI z^Q4R~`)n+wr9@-W{bY#?#g5 z#4^E^;}m1IGf>k5*05{ofQ(%)5Hdv4C->89Z@o$4@PNM)$dU7miEZB(E!Qe1F?nja zYcj*;8rf@hy41%Ort38*x2%v5Bz!`U^4YK>QuE9HL=ohsq@LM)Y$Yt-q3=kwU!b#k za{A+ynB>4uk`wvrChH^zzZxYzHfzZIWTo=$Xlm6XLIBh)W{@Bv1T2`SfAZHQDlI4q z-0!FBSw9!W2l`7%0h-<~E+J<;hN=Q${;=>LL&v_A+V3ytCQcG>v$lS^hv;8ku_HlT z8?&ubDIBxlQvQxZ^%`B;p~0@0ImI()lM(xPcagE$-LX+C7_wOvbdY4&Au%=ncmV}Uw7L{ubvZ~ zQ)3NuOUQnA@-LyJ*BasIa^mUe!@2`+MU|)){-pWTGXQHO+cYQ`UahjQoyDKY5O9)mwy z*Q+OWzO5HikqZ;(p;sz(61(21kPJ-ZsG5j1p;{@JqMRox?&MHbhrpA=<9f@P1ofBO zKaZXMjeWPhDtI)B@8)kl3`+8p;9l0NToORMGSHg|_df;h^79IVdd&lx+2Id9K3t*3 z+O6!oxw>_PCyU-a?)enCK9I_*m?1PQf-x-F+9ZC_nSJyja<`c0mt3{~8qVGP+qF}j zk6z9FgnP+FSz)}h?am^%DYGG(1#-`SNFIGW$A79^3s(V|P+MDQxyUKzTdn7^t>&;_ zr|Aa&?6lf`X)Q|gA}N2EMD{*_b!+Vz{`zj##M9^nj6TFwgzW zNNR{KA-bw)6>61ZltaoxK%DwWw332X?HxnnxAmC-SWinufhOzo+e#$nkf{3rtl;@{ zF$#GH@`7(JuCkoUSnC5)(LCOde@|Y968+BKtotF_2YzuFh((6DM!z_Rm&*FFt}*%w z*OpIz;+!Wa!+c%$ygs@>%0SB6c&EJLz;3f5G_fbZJ(jY~xOT!=PXso`ayv#Q9C$Gb z%PElin3bjV9BTtEJAGli>!>U}a$-vnv#+(2ME#A^OQ|}`zHRXR)n$m;3;IV8q4Q{~ z5G9@`ZGI(M?`0j+<0g-lYjw#{lSfTmllTpMb1>^V7_d7hjqd54^J&hv%po^raAk@9 zb#f0OW5|!qUS$r-G&}+sWxZX;VEL*|z4x+tRi!*}IRV3sCU5O6h?!|ZE=@wXm}uin z8yzd#O9hsb)1sg(tnxc3^vaJ1|;My)KUqg9u?8j{)+%aq;i#! z9DK}w?Ct3A7X*|-t2rE(C|`(SMhBla{d#TYT9C3%Kk)T2UY z6^kcp?;(>SbUDthsuFLM8P}gi^j@2Z9ix&?jy$&}?VZeai;A_yUZUyYsb;eB6h<^h z0)KST;mcf6k&NdZ4OWLF3}Fn+W)(u_F;ESd^eznRDt#@V!<=en#kR*J4%5mVL76MD z=Izl!9KU;C#m({+O)VJ=DKXr;XYC7Vn?`0IKPQ+2!8e&^KF9U%2soa6U*=5raAW8| z*Q1gW3R9Scl(=$KlQ7Z|yfFS^0uL52(OD+m^%u)KKiX_2QGwtx_Tavqn{iJ+b9OA`Y5wXx1(?0r17EZ_F;CkQrd0C~N;3)az&L)Um786Tn{ zQw}1_hDMHB`q~@*q(<1tB)?@v*O?me#yg01v-|N{xpoxRiuEYET42b@gSuL`g5Ado zteEknPI>qfGoE=}$$Lta6*hg90rCZTGK;^8PNNJJg9sbx`kgjbPvW39=4}>A&e%o6 zg~exM1WvgrIk@b^e*-U-B`lvv;x2nAcxhVSXloy{q^8#Rbd*-}jbcxPA4|#)WC-m3 za5461A?F?2llG|0i{8pjSQl2d@hE0h-r$y#>4-3*2;ugFpyc_k>!eT)9h&{h8>nc z2{ZOY#ykD^o^vY%#v)LE*gbdKT8mx9J26N|N5`u2bSVnIf^>%AhJ?BKY-c>R$|w`Q zw_8k@BVOD+;ksWWY=zdGl#)X6U|Ge1tfek_AY?9BN1 zDfxidGPKi{`EY--F~CZh)?$Y=Wdb8>@q?Vsmm=5?3b`s^NJ+tu`|ll;cKB5noPs#> z0vyFnw%T*Ni<#zEYz98Z?Ys|rVPqFK!8UG%p;jHC$_f!$k1nEiIibpMC3q*$I^p#h zm4g#0<|0}0#KY&H={Md#lydfOjZ?i4HwNn4N7slY#XM=_*PlzzhDF%$MEddjl#j>- z_y>=gq}~FFza5OQ-8!VouI9>cORv3+aJ8DE&){zebq)n|eHqTtWDbG(k1AF~xLqb` z#`jX&djF_u3h8wh^iP~Tt1_xjQJ~J#B5!zU=fporSIDWtpq_K{IGpO#+*2($RGhL= zFr75Xlk{n|z< z8L`AL-IkBOK15f=1&PyO;BKRkjujC$+_g-f!|@c{G&E$`HGiQN>@4dELEgN z*Uggh>ld+B(YU9^#!)}D2lIr=6dt*rJq47>voD|@bah<#^&hr}LDk?r84pPpa3K0Q zl*9q(CEj5u1a?ImaS!<$&l!-L{nvT=%1??>{uGM9O^gs%@$LjW<>J!t%eYAZCZDCs zS*9rR?f%;=j1KXgyhmOv%0N`WqEgfF2$v-IU;y zcMu*PV8memsKRiGY^69)29AOqOp}3i#!SIR@8_^{n@GAck23}gZ)}t?%$8H7!q4ij zQ5;hA7D^Ibt!goXtN`@%XEP;n!j)Db0Ky+HwpDUM;e{%UV}o+@D;Euu!R!2`gf-Q8fp*`^yyf$4an#o%)`+0_~ zhq!`i##4xi(KcbP6kBi=X_mEo=`Y-q2nT!kW0N`Ek1zNEAAmbuz8AQM=EUMDm7YqASq?&zuR+)X=1Z^2d za+M47h5*{w25zUHj=ktup18J>HO6d%F-*k`-8L>EF&D1FqW)bz&;2Dq>3CPyR+Cfe zL!9*~{MWkQHWvplxS>mX?B{Dr3N?N1K3%M5PLQk8k@R~iQ!}j6T({C=PATJ5(Jhe^ z5_@7E6s6(}WI6l}YvPzv1fvyZqEGoBuD{CGE>f1{v3Xep`DD>74ZP8{^rzPNGQS01+B&i9z(7SU>2{P;^yeRfq}E_XXv8x{~z zz4RSm^<-V(uxcvfybxphrK(V*%tL41Lt5q(aYdOu$%dJoufrWDkE`0Xy1-lMZz77u zW}bLU3I7VgdwI+Dd;9!Kpcv5II62`;>;tE*C@>9?kf zK3g^fyvEt|v;fAPC7U=Cng=&KQP4+>9Y(C#8N!oqYJ}M~YPsb#!?WHVQ|1;X9DR7N zRnmb-QD4bQuTd_eGEMj^-v+pbch2Qrm3`Hcv}zO5OfC>pxFQwl0f!-Y-$AD=A?M~+ zvfv{t&X%F2HTK`f(ZoZfy!TfJn0ION3@|62b9>;jxxJtmkgdFu_X@Q3Xvf%q2sCnU z9I ztM$-_+!&^-J>P_jwL%*#^Ots@wXO7*FOK8Q#Pjr;*0$|Qe^c?lWLqe4W%W7hzCrE9 z;ri-;fw$oB`yAQCRnTod9Yj3>aIDi8(D@-g!8mugibtd7?RY;z+1_~5n@K0(h`&cc z=OrkivxUYs#t_$*1XScAx=q*`Zx_aT8`^1yl2HzBsYk-h?aIRs^oU!Mr8pbhbkG{- z1HJqzUXslD+8rFEfqZMp_9D6@Ad65r3bZpM!uS4e zbng2MWM?}jTta9NOgpX5&o@urRX{&D0QJB_T zluBoK2z{sv0~F#mcuV59XNe3DK%U5qFGJ5-3;X(AfDxNsRbwmM%>?5FvDCk%Y?Mr8 zjTQuG^#j3=gLG5Gwc8mG{k$a~Uz#USj5HFR6D(@5$Rjd}Fo)T6ii8>+Uo-CAhb6vl z2*q2e{9YOkU}Rrl;y-pC%$xrv=&3hXw!4I6Cmv5a6~11p?f~OOa!5DQA~YUfng8{h z>Sh-?WE#D(>c0tyOc0;xtQF-^$OG$Hy2`iR7slUtH#!5!j%&qNfQ02RG66p6a=mmR zCkae{%W@2{oYt^6Br6 z1R^^A(?Y4t6nBS0`9|9+fgj|aOId*jb zX|2Zvj_Ig{eU2n>UooZ;xoR9L@A{<6=m%)83|}k#oWD~{{w$f@`bb>}z!Q>1#S>h5 zO1QF)`?f_C6U;}a-q|xrJRxXn!8IEFkleK)D^a<^YK(tw+qU2Y8!NVkpbMP%VveSU z-(lKfiBeGFRCe_u_ACkZdQNTQzA?OTYR1ajEqTP+&L!izf*jvW_|xxbBChl!mgjw# z>@WGKR@BJW{PQT7r}cyFx^gl^*neRU1WsaZPrLA);8K3fJk+zcbP=9wQ#82h?z!>S z&AIs)RD)B0eC&8;d=dVaOYakyS#nSK~w^>L4+J5B9lOB1IO#5~YL>%pNOd^oop*+baMm*Mdvu>cYQFooFMre@t}xvg8!7uveW zRtG-U230nAmawK(Xk2%OMX=VNI%l%!Nwrc-fIZ)u==$2y}+`(6NS3ux!6X zmoP5$VsNfmS(T9YHNjtoI=s(`pIa_I{v4jJE1ij(bD@%1H+~hB=XSIVvAcG}qKXY2 zb=<-G%}DmdbAp{rjy``~KID9u_`y0l?`=yM3wSUT%j-tZXq~W-IeR(R9LTFzy182% zPJ9MFa84E{0h0oRru06ZkK6uq=cal=;jMCk^=rIXLr-mrY&JIjC-#DYHRWKDVG^H* zcj)4ccmTbeHkRG9rjNstd55&H+4yak`2x~w2V$aBBn^9goU)0rCzJV$_XIVGR>`Gkq1 zH+h1U5?V->{PJ4gn>D?61=sUBRDbJvC=6_NCxjRZ!A?FYnok-+ zi9#jve`1iq0Q<=y|0$Myx~S%6NgvR8>YpZ`Lblhrp_Q9q;s(p%(CBEm!meW4tRNK0$yeG~Yq^Bmg1f|CYt)+H=(?U-^ZBAA)c3D0m^uLHDh+ho^3Y3kZH+0FL7Y@yA zd0WgQ`BU5NRHJVq&j?$@@{K2)@QUz6d#X8jr%*UA(f`%`%puXY(_)SOMK;7Waq@cF z+HYl*W?oU0@^sk5aPLh;Y0=6Xy(BRY+W5W``(i+LiHM|8r(xjyhi6hpPg1f_A{kWh z`0slMr@l3s8OSj24(uE+cPm4}I9$c%pE+%6)hh49OOTG9U-iW!%!m_BR#QkHQmCXl ze{p)O{4iN=jW*JzyRYFfZqBs;gnlhnuoUZz=-iCpk)j2t$ZLgYKDEdjVnentdbAdw z!N*dpo?umU+AZiWd@g6Re0D&OZfb9nJIonJudq6QKyM)DI{PO02Sm!;iMK{ue-1$; zWZO(i=INw-T|LaG?L*lb7aIolDM(vbz~Xz0yalqNghWrjx#rAiMa-w@T#X7>`&#)N zxpZ3>@U87EZyE>c$u;SnD880JIjwn>k~7O})(=}yaX3)E z44zL@t>xr*`8_ zYa6=isg|wW_Ss{H@{dRItC_4vD2bhi7v5^;)*kRE?`QqM{Y$=0&=FlPtF2|>S*UX@ zfc1LYqu@i#w=7JGzg}BFn`L$q_wG3WnF?ptVs)xWhE$0`<;`w8K-YOAO_y1=l)mFo z4Ij*qf=O^|x6K2;D*fUtp4f7IPf3+W$v0Dc+G0)ugvf|Lqvc3r6*yGy^5(EcCWYi& zhJfi(8*wtbU361e1}e9>#JEw0oC0iJ9w?qVQOkFZeZocF!R7EM6BlCC09xH2)vB@B z0XOiQXDxR4^Y6n*R9H1k*25isI4H~yh|J2Dr^uf(PL-?a#s-#W$;y zL$GoPmbD=AI`BK;qs{B{ec2}*@{XRKGtiOsm&MqpM7h;Fb|twQ)zuXQlErOrbj|q;6cyjSPY&kTZi~>rz*Tl=F`g1+PsjmZQT}Tob-T&*iw~ z_~k@B9(kLbrKHJ9qvCHO(dS*lWwQ>5^i&&lQ2oSEH!`YjPxUbcQgqc_&n;rNdZfMm zN=4gau3&ekF_SOCl$ZJXKxIG}X3K-sT0yVarZm@eFCt?SXa8x#t`D{(OI-9I-U?H~ z@s-4Q%;19SnXL4|tR^c<{u2ai{3x+JA@ag|G_mK6%nKh!Hqoq4M*u}@A?|NO(Rz*O|og=$lS+zpqggr#Vl7||F9htCJ_2O{Ga?pe#L>G&x~ z!Q#KWiuGu2si-(OT9xgqnpO$E;T!mHLNv2vfm4YW85e~Y6Bqk5Eil%zabpf`nw!QJ zO6b1BjLZ}yja;>dh2du?gWxC5DxhHMfP#WTo-%!~7{}|elbw6Q$)xl|{{b3b>y37O z%phJ&p%+E6!Jx*=2$XxKGO-k}=FaNoXK!zRusNE~Yd7CvREbfF`j=W z+mq~VvI>X4K0Y9@{q7Q_ia8}ITlwOrco1}hdLnrOZ@pyEn&p<#uzg`eK!zun7M(h0 z~f7WLq~gZUxaVKfeYaUwZk2sAF^9v&- z>tc-J0aSv~i?7Nu^L`l$`3+^fsq$)SeX9^anP$vg7BIxSG=ZAHK_nKw>(-tu zA8uSDTpA(3YlMG4tDM`d6ip#jl1Z#viN(Ep71I^dX~?Dd#6P&H-0MB|!|$4|Flp#N zMntaPJ-$1F`1e0eQ`KllFo^DdKvZdLJVdXteD*s59jfyG+mZPzAQXA6mV}M0JOoBn zzsuzI>27-vg3Yr7MY=Mh%AZ_l|Koc5egRVo3K0S4wp&e!VifoL>PmOGjg5zGbGG6E2-rm}p*%x|b zGv$@v9rsX%OQySQJ1%c`O%EzJ*VlSa30)mJvbC(+kF#Fgyp2b!R=ryFRZ8>fz?ee> zZ^qwDC|PF@>xP(@baMI#3T=kt+`FfkH?wP|MQ}SK%jPddCmNE5{B|!10Iu#kq!N|@ zH6}Etc^)q*P8Qb<4E~z9oNtHkE3UV$Z2r8cDv?;$d1`ikIy=x4xXC4=xA6VvIfH!p zPO0}dM0?|8qrXHka&_JQHa9nCWMo9G4jx73V|oV}xY0hQ!89KlU&QsJdQcnYl^N>} zvEak4Ui}MEBJWW`7bh|LAY2Yf?X*HUvHa)ejM$+Ac^|~ApJW1!@+;A)Ql>~flKf`n zSR0S`cB%s#=Nu$#}f$y>3`m-Y_%kMHlzCDJ}Z0)i~v;9Y6;F|xedi=*p$kcmH6 zPJ8$^^XO@kPBm|LZ`)UPkyqH7ZwJJ~dQ{5&7&s*qZJ|B%QV4QlslebxsxG1e0S>7OQpl6qJ zW5$%rBm@dlXd(JK*G=q%b8GjN)Ty+V_-&mxqnV#SjIF}wE`Q;hkvLKhcL#2MVmoTX z;EdzR0Fc$vfD%T|&fGoeGgkVpT=D94J?0532;XPi^{#Suc9xf)-_seiaMR>_wPRbD z?5Wd)Q=m8={c!kEu!sVZr0&XPwfBtq@+D`jNoQ-Pcybyg>`Y!?XR2<#S1VfF!@|$- z((&Ln9+2CqG$De9t^a!cpd6fnyRmc_!+>o6$?SN&+4Ee)>%!jUFT~NQ>-$76+JV`b zrT91AoDJ0yLy|!v$aoIFhx!DE?d?`q!rf!?Qu#^^N=n~KRR|C*akUpr)aQ*@76xfa zk2*<}rUJNgqgeACbvaz)Rzv-9bJY=PP`VRk0qiO#hX7f}cS> z=${M|IJ*l<-DI>XuM8>!RJB$dB&8d2bd{pGj|sv_QILMsGv#;zhPvjBYKOn;YE7-L z>ty^a;Ns%Kvbhm_W;y8ezoBOI4CaQA3$QRSX*JvyCE{JU_p%huyVTs1MYA0jvAkHT zO9`@SpB6oUGYe;D(v_z{!Sh41SmhopqHr`GFg%NnrF0|yMcFvxIa*23ah z*YM(Jnw>{?I?$DFtv|Z2WjabTHb%#jTNj`fXg3YO9XqXDo_}?+!AH&IXcwySw{7pL zgMq;Up@4@d>$nFOF3OJzRmefL{+R~qB;%!42smd-!}SLh5jAP~k*3Syiup;?C7Gh2 zc64E?aj*0BuZJJAB@oY4b$WD5l(|7qn7Gs<^YA4RCEl~T>s(7;sO3CLj%pf{^-DLMZKd9Y|2J3_(6t-zsUJ7f;@92Mnw7ZaYQfI0?&>^$8to4rAge)%+4 zo{6lP;zhi2wH`3cK8m~ja)2w5mGG!jlgsGlnVo1!3ZP4@5hj%Gg{P0MwanSLmA?XA z%zvP)Xu2@r1nb>RRq>to&##1En?}aFt!H0*751;5neSgj|Gw5kaJ8>*ZWh9WJNj4N zm<)7c8E$6^4zt#yme*0A z{dr?D4@&wjtX=nqrly>&sm1K(Wy65f@AX8$`9b8wR3#OV z$(Mz}UhE{0jXTMcl^m>=)kw1yV>zJ8Cpf#!uW#qEAFg*6xA2H;>oCo;ywJ{Iuo=mV z;KA@huQT(!_nCIBr+!W@_VbZ+BOfT6OI;2mHxslGHaq^Fm!qi~P_PLAr*>+R={TC> zg?&wS3SaUR>Jjb2O}!Q=1&9YBhETPbWbA6(+?h}}v7HxNFIZLd5!8(U zD*!-M9fJLP(9;rlZS!cVq~Btr#$}nx>ayxxx4(*(FJm>z@-W-Dt)4gEo>b5iI);V( zz{~_Vgoe{iL@-QNO>G9D`%+HoLLcRo`FtE8cc@H$GQN(vi3iPv#%ugtgisn*?V_an zH$$QTVXi<+JLbF22>=a^2MxL^<=zaXdpl0IZ>CtQG%nqEalUoH-D}Pr2KU$*%XGOx z9u!7UwK=Ox@(ButD|F8HG#*x)A3Li7_y&>y`&#uV)NcIM8+$~{tVv5ti}bV5E>&~R zVUl2Hjp$!1LTj%!9&vl?yb`ab+b8)=)NO)1<)q`$L`quV_+Ry(#>uPvSJnwR%9k=f zEvz5c192aIG%Yxou=ed!%LWi%EoTB=|M4Y#gJ{ALNk`#GWFYTJil zp}=w>>XZ}e(B7h7OiA3SIFu2y^Y9X`%i_2(4G!yH zFq^bI&5umcYj?t=_%R3PDRn;9VQDADw#ooW*Nm;_c@mz<=P0Nin_ma(W#^MZB^D*5I%CeXOZ=*McHe9Q(0Gd*Mkt z>8pqOq3ep_4llIyjV?JA$DBig5uKx9MHH(#rlS*8dRZBOo-%{9!dL5{zkctqt$@}` z;7=Z-=UVz0F2nxpz6yvHYe^e^Q&q?*<`(o>2{*m3sh43pc?t$$k!a1iS;tF&i8t4l zIKqp!?Zd&<={8yKP@Pjn(LMPgSKNof*s8#|3X3>QCq@9)|T#vFE3uj-B9v|X5$A_$FF z@hEVkGD?s3e(M>gpQDagId5I9oJbAIKh{BJpwvW!-O&%yryC0P@cTCNok-poj}hE( z8EZF?Lj$L`{Pqi+&L$-n0-;#W;Z4ErNERVp*nRQ*kthvM7r2*%fa7&!xIq}CE*kIh zI4g(j``Fl+Ul2m9D0S*j81(y>xGef_ZcX=n^hdjY@I|ce9~yKUL|Gf26SQZfWP75! z(c%3~k4MFygONkbqZ31IQ#F)}UXsgYC`{B4A}6l58-cGEAKX9_`$A&mGb~Vvwm6*# zLzAw>Kq#<0b|3y&s16G%*KEqSJbXSeyK!>n;o`&rl7+(@Ja&pahl;^VYwLpH&8vpI z9=}X;_2K+E2@yv?b1F0E@o@gYF?guowV!JzxP2l+xM8`iw-%`gzk%}`!ReP8Gn4ESIKbeXY$3+-ZLu zt^8;SvFe;}+SMIs?A|BSkvUHW4b+eziEIfvysW6COtJW$?ZS;3?^)@-giMUJNCt5j zV3H8tx^T%LBpBtz5}xHxtu{9sA|NI$XqR~)hpsVYIGvqn0HRO4@D|KDWzsi)}$9O1Srg{qdswSK3Q0Oop z=bZbM&b*2NP_uP&Dnu(87q*q55Uw`zFp))TwqEO{M6L9()Kh87-;TKV zf&ia;II3vp>ZhRkAv%gJyO_Qr-gf-R)l-pC8y^@LU|)uA9U>5x1~^(%`xv?`@FWWb z?=KgS#J!kK&BJ`In3`CWL-M_QhqP>O^8^+=7k6WMFFnlPOtcJk&1%+M`>O^ZPrmOb z38pjDu=j|KxY1~LjJ!BGR9L*q6kamaV*MxIL)9SU-De6Tcn>=T_!v4+f9@}FA(bf}KA7nk@b7e_KTFGMGi^?dV zjIDRZlKmq$p{<7bU6*Q@jS#6~{^+TPqYx?ULAiL0Dvn&0w2(C2YwCQIqLqZQs_`=9 zu23)dv>LD^s;PxbWG~wD5j|`9DtRPDB~9H%mD&;OC-YGsrTZTv+Z_Cb^+uK+`7Xgp z09ZGpYv1ph7uvZ*>_HXzPw(BMsHxo9mGYUso?kaxrp)ZBPo8cctYe+HrQgckSpi9B zP%~IV*(7l#hm>VzEWb+5NHYZdX^Z^v_s@6#poYG8(3L@geE9vH{N8b5vna3BS9xRP z*FPZ#?hJIO%6~rG`@?Vl9fQF9Bl34n6f9RNsMGAO>d&wCCVqr=l-tsp}JxX&EaE(Mio`cPX+x; zJ1D+3TRg8-y8q(6>%smCW&CrTSsTOe>x-&rqs?<&Y5%gMpkNoOJ-*bPbXHR<9^YDB zHLcWye*#F622=gElA_*^+~M-JZPkJQ6=v#ynFu&iB3r+F(h8C?V3s|6@uXFnsE0C| zD*k?~4UQs?j1=lA%pH!rO}}ZEPsaA-jBX-RDwb$n-?V%;_z!b%A+q8pl#KChKfUhK z$xevWwQ+9KN&8p$Z*y@E^S3|4dlqeb@T5X!fHSoFT5n=eRQb;^&8lkLuQ0D~d_KEM zp=`|f$VO}+htS=<(=$h=+ZCrN^_ks4WR}N!q}>kn{R6p|w&mXisWScI(td+S20L_O zsk^+`>CxU>yM3-{T`Qjo33En*u4`UgT#PibGVqFqDmFGY zUjH;ZO@j{jaIb{?S9kp)t+t*P)Ir-if(%dR3t@+a{=v)ZJvn`tf{oJ|d|Mp-yH8&d zB0cZ@Acwgb1dcxJc<(8UQHR|mthZN2QZleN9F`FIv_q0P^RE9iW?SWTDnjY9*gInX zbioO(Run`u-4kmBma}~`Dd_t!1;*s&=txte?EtIY`K(L=5KXT8^TWf#hM4eieI;_+ zn*9|o+q2?DoAf+K`DjKe!r^%SWvB%?Ht39bM{lW4ip1btm0?G=X%*JW zlzS0;$`wHR%$DgILVfGWoKyVl*}DGXKsYrx4>{)p@bUG{?(S|N&2kkqhZv;c>MK$ZF zrDs4O$E5iVr{Df0_#zSW;>< zi{rB5oiJI6BQ(ce>T3+*$pDtoAIA4H%F8y>BjvaA^Ua`Ieh0I+;T!tI7 zncnVGuDeib%Ox+hX%#DT&426SnD2TFT05Z{7skB(a*ILs2?@X1c7knct(autE6-cUU}IYqmAO)r)=gMS z2FGOPP^Gl#E%98{X-W4LB&Vbyb5Z?>YTOPn{BBx03WiK_)VJE;er)#cU1uVVrIbd< zQLN9G<@<3LxEG1d*WU8W5ommS3&yu!uxlT|Vqq2G_#9U`7hDy>7O$Nz$SI%OM_~(e z5X5lD-e*dVF{0Im zc++Qky)w3l#9dK2# z9{B|M-tA{N{ga8kJzGeFN}(#Fut}2wCF_~|3Ik71@LR`>eLgK>eCt*5ctr)iXJVN( zz*5HdB~vR#*_ghpnHjBVda|@e+FUO&u4XZfO({Sdc0Ue_Li!|hg_dwA?sR&TMdm4) zM~izh{PJ?FT@w62g9o`>esFq|EW_jOr!yWvZZkNEz8z^(g=5*!Y~qc>na@qqkvY(% zB zt!oizn059~G)q>^{d1dHxJ zPE4+|xlQiqIav)2GlPn(uf6Ke3bv{-i%fymdb@2L!mBPsG%=Sl{HDN@@VwBf$h^N- zpc=T5UDwyw3u-~~>?KbBvW!FlGVz8c;{gx0^As%7KL=~9YwVAEtUxi6`LiGB zZ3rwZ45n2^2!ZFv)fCkUOJntWc4ASsMFkfGQ(!>a5$Rx#TtxCG_MK=zr#7R8fN!$H zJM8E_w8AW4>1b+UfdfZNgNo_Lrm)G`S0k7*R{iE{P|XPVWx1*~B;^~Ch&pmYcn1Hn z*RCj@uzW3N1x=8#&?j>?A#@3P+o8Q)`u&aT&>LngF5$)E>7#*M(dL<^diz}GgXF$C zUYn9_R`oyq;N~_3d=5%-j%`GN z{0ZeJF~QZ&7qQ%u;rZ14LD^@Qc!eG}y}xT#rUx0ARO6n{ItZstKA1 zSR}F49#1P5nJYNlAJ!%52rCD$+MNq#XEJbG|42Rt+n&tMT|ks-+|E%HkzEFepU#L* zs>(AD)7nR<%FJ+t#S5|N*=;q3BLibYs;x9$$uDfXkAa^?5!Gmynq${TMRMf) zHjnweKBZkd*xkuey}=0y90Tj*+7c}<&$L2Yy?s^+44vLMnsb5l&W-K9iD-qoY{!Qa z3T}~G8uNLwz?YW-PYd@Pw{IF7JkRS!x@?gO)F(+z(33``UZRGKc^)UqMvbc6Njcj5 zZKw?c;wJr3GNf?Lky9moR<$Q=&kQdcEj=Wmcg$lR>BIymwvf&?(U!Ez0nXswqMxqc zd?BY3UlA2i{>?{_nf?xoK|UX+olU)OKjI?!!7o4=z_C8fNuy;S>!Gg_+LdB)VR7KX zAY{RkH^uDQI@@KWHa!WW%y>qx(RHuKdB0}ZqF14MF1$I_l*iQ9vamIyPCnVIHmkgv z;D6P2BMKw1{`gU=9t3$4>+4d`43AO%0h zmE!=UARf#;x$n8&p+q)?Q(9v2y@A%|j&1DKbBi?$yDr2P+mgx=+4=wnsDgm-iXS}x zHbQkCulkib^buTAps{9sPg=$`3=TUOo{I-yh1Z5Nt{YubF8|;SfsPHG%yDhWUB;=| zO$Gu`hK%AAw60^jnk^Q8`Hjzm?@yjlItUYi&h3TupR58i`)6HY7~ld3W|T*pOBDhs ze?a-0gBum`H%y_OSYVCbpgtA6KE#EjT{+-^+)CJnHi~!PgIYmU%B4{ouY+$RisN+; zfZYyy$n*rdz4Qd44{PS_Oh9+vJmg1tk9c;HuOkiMCV`}%?JRyf0QJs;f8h?bj{tcs z!7*FHg4yX=w?T)`eRLKQaG<@_bFEkN{}|Q~q!RsrO!Upf&F9QN&pl;Atn_c=mp`b^ zr11E2$MXhdj(t+V6&T?k6%M0z7X^jDs3lCCa&pED`+Z?DT?@4$L$eHS^kD*ul&R6%B0sxIh1t>$WLtQ8^696UH!;Q1`OZvmbZ3_DM-1YyJPh?%=VRE#= z0osxe;8ucbs$cm=)xhPM+p`dwnvt<6V=s|dtbsDR!b_*pe5)r__`Pq<(3A@c$0?T3 z2p;UV)`;m_6~^(q5FfJw>0JrV>3VD;Q-Fi*5D0m&lhed?@C9vdn$O=t2!sFJl_b;BMz~@%FiJnAGh1%)yr`4AB}~ zOu3~LyPpCuGlX_kUV~k=3!AblW)Axip1sj=4~t7KGgf)@irBtBVI2@N5-Ps0?of_)C@j z@uzp~D$Xk@Dap%o@btX9i}R485(l4S5)i2aNKKd(U14jpHrmSYiNUVl(}CRHM8a24TamAa@!g%?lLNQ+U-o@bI_!TfJGdsO1!XZHe>O=&)s zU*q53KQ~2iW#inMox`JC{R6VIv!$a-J58L=h4}NKqPI;2r7Lij{B99@>F&7(mlqA2 zmxi~T>!#8@KD8qsS-Nz&9gK&w?-$V(XE(Z4zM>%4^niZRc3n$2ouE7 zI0N~UMhjUGz5s&1cEdG(DNEI&k5qT7`yN{RvTPFtpY-7R+8gds^iC@OrYTfWQ}J5B zvgynN;>O)*LdT=7siVVWUgd${#;9Xz-@F6YQ$i{CX`AaoDWzLW{f&YF1;>4{YkRIgC zruB|0;UYWX&y%P5nSEa6!CX?9xQ@!AWwBXM>EO)$OguN_`Q=5gOFgokY`G`eY#dvt zYQy`EKid&s*mu#v&C|}#4yF7^DCg)Z)q$(B#!G!JU}E;Yn$B*;?0bD)&sJMPc+ui( z(;;PZC^pW9w=s}QTCd%1rmQC2hdGGpX|9|_=?;vwtjWFkGB%+#Ivw&@`n)Oh&Shm{ zUBN?HAC`}Ct(LQ{UN$zQbR8^5)S7%!=(AGYS1(MjG;hD_0Jlu186(FNdkkylF2|4v zC##B$H;+a2oerZI4J|K@yeFGfEMlpN?5(0Q5|*ZyNhVrk;-riEkVuJ3xy!Qg=6Miz zw0EK%wV#izCx%^%g1cA+M$0QZKPeqP%isAz-pJYg&g58*@?s-I>}EM6v3{xDPR!Vq z?_*UUWc9i$Dd58VvHnl7Cd!ZBi(%RlHk<~X-vt%5JaN;*?71I;q|To8Lh|Dd>t^xo z_^o3a`~Y=CIk;=#b8a~KPS0{kpO;R_h+bpWna=Z{Hp>bUo<2pX?J-|4)iO}1f{@@x z^vJ~V3Q9S%W-{E%Qex?D!2G(Z2Ho3oA0=b;%AQI_I2Kubke1Ys-R~?f;v^IET0k&6 zB)>#~AY`B-@62|8F^*K6zl0aGw~kWH$tw2sYAS88C6}-By&}y^t@LW6Qg%#K^k({4 z`&6%gcU$KwjMJks&L#=Iac93LXM+oHf$-{*j7PC6ZK=g>TKwK1+%~HQYVfKFgKdoV z6bYkgU$0t!l>!))&j;Hu&u`k=*-bc|B$3LN_l^+M@T#r;%FA-@d96>d)9T09#}Jpa zUe@`eKhA}m^|GzcoW@zCXhbJH!)@GQ+25&IJ5Qzzs0RtS1!{|94l)P{R!fY$=dG68 z(UXiE_Rq0jjfQ(ErolE_eC}8)oM4}5hZqTE8Y$;H(qi@*Y_twxeGm!o#=5c*MA_2F zJw!8Rb=i0XCWeI3nE@Pen+f~+3ggjjUSi#aw`f^422~c$fmv0{a_ML|@1SgA8aIH2 z&vD^L!KjtVqUJl#un_BpSuF?BP2&em1H zO;PX8lsxs<+qr5pdRG-W&=*TfxVA8rC02JaXcG%U-H|l z!0?x)qA`tAQZUQot%kBj<@ZyE^l%A-FLNd|98D93I)siwTKlqljdbVuQM3f{8%8h> z>q1j)Hy2>daiBL7778U3<{biC$5^@I>i1G~X6{>QM@v67%Ka=}!mOwtTct*D9G_Db ztCr$nTku%08!aT*$A0wdYQj9=qma#-$H^WGx7S`hgdUT34B6?P=Z-)5T&5IoBNhsI zQjzO+o+2AAj-7=GPsNjmEtE3EN2Yg6RUdn!;#L6wcP3P zw^93g%-SYiy{ox_4;x}`cR)bG>+LrdlK_1MC`YCMp*q^m5yH^% zT=1sk!!|@}toMWJ%}aI^)Oq9*R)46JO2XiP>(_Td^l3-2UcNnkzu4E-Kz~DqenAg# z;CxczNW15Y&V-KSd(5{5Pe|PEu?ls|)f7awU3teHt8)2uQ$S@*;`WO4Q>MMWSnZn` zU~bluPR%lvnY*mMGXA8oxm&`Qi{uSli>_a#l9e@gps+dhgdlOKBCRwYZsya?G-TLA z4U$zQ+!9p7C>}{)>w3VnK0_E*s0Vh#wel?(o_I!vO~gD7JwzHB*iU?ElT*q-CZ^q4 zn|FikIldQ1bmH!=Im15bgN9phP8ObdT5CPrK7TkGX`?eh%gf;GFNrBK9g;kSRJUZk z*1>aP5xA2MXfi&W5A!%?zPj-p=;TU|Q7 zFBL&EwQx$d9A{{ z(Ed6g2&z*-(AN`ZJ@7O+S@~_0xp#T$FOO19EN)udvv9Zg!y>{W3Cy;u_Wa5mtHQ0* zkLo7Z8L~{T?C}b_cO{PjA_lbW4~zbE=>Z17&i6k59pCah(!k#z z?8ua*b^DvLgH!3dPn5oU@Ey-#W(q_(#UNUzv;L$ zt~)Zn4%0t7{72lA@5v|t@&zV8+8_7=b8yK0K(W0h^x+2(#vQn7>03q+(g4!h&${Ve UU&3@Wo56p|3hGyLmjD0& diff --git a/doc/workflow/shortcuts.png b/doc/workflow/shortcuts.png index beb6c53ec771f8aa10660e20ce4f5b7a1e16c04c..16be0413b64ac6be977d54ad78e9f23b0c5e6a13 100644 GIT binary patch literal 108255 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 z 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 diff --git a/features/dashboard/new_project.feature b/features/dashboard/new_project.feature index 7639206835..56b4a639c0 100644 --- a/features/dashboard/new_project.feature +++ b/features/dashboard/new_project.feature @@ -14,7 +14,7 @@ Background: @javascript Scenario: I should see instructions on how to import from Git URL Given I see "New Project" page - When I click on "Any repo by URL" + When I click on "Repo by URL" Then I see instructions on how to import from Git URL @javascript diff --git a/features/dashboard/todos.feature b/features/dashboard/todos.feature index 8677b45081..42f5d6d2af 100644 --- a/features/dashboard/todos.feature +++ b/features/dashboard/todos.feature @@ -14,7 +14,12 @@ Feature: Dashboard Todos Scenario: I mark todos as done Then I should see todos assigned to me And I mark the todo as done - And I click on the "Done" tab + Then I should see the todo marked as done + + @javascript + Scenario: I mark all todos as done + Then I should see todos assigned to me + And I mark all todos as done Then I should see all todos marked as done @javascript diff --git a/features/project/active_tab.feature b/features/project/active_tab.feature index c4f987a792..57dda9c223 100644 --- a/features/project/active_tab.feature +++ b/features/project/active_tab.feature @@ -10,9 +10,9 @@ Feature: Project Active Tab Then the active main tab should be Home And no other main tabs should be active - Scenario: On Project Code + Scenario: On Project Repository Given I visit my project's files page - Then the active main tab should be Code + Then the active main tab should be Repository And no other main tabs should be active Scenario: On Project Issues @@ -59,46 +59,46 @@ Feature: Project Active Tab And no other sub navs should be active And the active main tab should be Settings - # Sub Tabs: Code + # Sub Tabs: Repository - Scenario: On Project Code/Files + Scenario: On Project Repository/Files Given I visit my project's files page Then the active sub tab should be Files And no other sub tabs should be active - And the active main tab should be Code + And the active main tab should be Repository - Scenario: On Project Code/Commits + Scenario: On Project Repository/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 Code + And the active main tab should be Repository - Scenario: On Project Code/Network + Scenario: On Project Repository/Network Given I visit my project's network page Then the active sub tab should be Network And no other sub tabs should be active - And the active main tab should be Code + And the active main tab should be Repository - Scenario: On Project Code/Compare + Scenario: On Project Repository/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 Code + And the active main tab should be Repository - Scenario: On Project Code/Branches + Scenario: On Project Repository/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 Code + And the active main tab should be Repository - Scenario: On Project Code/Tags + Scenario: On Project Repository/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 Code + And the active main tab should be Repository Scenario: On Project Issues/Browse Given I visit my project's issues page diff --git a/features/project/shortcuts.feature b/features/project/shortcuts.feature index c73d0b3233..f71f69ef06 100644 --- a/features/project/shortcuts.feature +++ b/features/project/shortcuts.feature @@ -8,21 +8,21 @@ Feature: Project Shortcuts @javascript Scenario: Navigate to files tab Given I press "g" and "f" - Then the active main tab should be Code + Then the active main tab should be Repository Then the active sub tab should be Files @javascript Scenario: Navigate to commits tab Given I visit my project's files page Given I press "g" and "c" - Then the active main tab should be Code + Then the active main tab should be Repository Then the active sub tab should be Commits @javascript Scenario: Navigate to network tab Given I press "g" and "n" Then the active sub tab should be Network - And the active main tab should be Code + And the active main tab should be Repository @javascript Scenario: Navigate to graphs tab diff --git a/features/steps/dashboard/new_project.rb b/features/steps/dashboard/new_project.rb index a0aad66184..29e6b9f1a0 100644 --- a/features/steps/dashboard/new_project.rb +++ b/features/steps/dashboard/new_project.rb @@ -10,7 +10,8 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps end step 'I see "New Project" page' do - expect(page).to have_content('Project path') + expect(page).to have_content('Project owner') + expect(page).to have_content('Project name') end step 'I see all possible import optios' do @@ -19,7 +20,8 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps expect(page).to have_link('GitLab.com') expect(page).to have_link('Gitorious.org') expect(page).to have_link('Google Code') - expect(page).to have_link('Any repo by URL') + expect(page).to have_link('Repo by URL') + expect(page).to have_link('GitLab export') end step 'I click on "Import project from GitHub"' do @@ -36,7 +38,7 @@ class Spinach::Features::NewProject < Spinach::FeatureSteps end end - step 'I click on "Any repo by URL"' do + step 'I click on "Repo by URL"' do first('.import_git').click end diff --git a/features/steps/dashboard/todos.rb b/features/steps/dashboard/todos.rb index 19fedfbfcd..60152d3da5 100644 --- a/features/steps/dashboard/todos.rb +++ b/features/steps/dashboard/todos.rb @@ -26,14 +26,15 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps end step 'I should see todos assigned to me' do + page.within('.todos-pending-count') { expect(page).to have_content '4' } expect(page).to have_content 'To do 4' expect(page).to have_content 'Done 0' expect(page).to have_link project.name_with_namespace should_see_todo(1, "John Doe assigned you merge request #{merge_request.to_reference}", merge_request.title) - should_see_todo(2, "John Doe mentioned you on issue ##{issue.iid}", "#{current_user.to_reference} Wdyt?") - should_see_todo(3, "John Doe assigned you issue ##{issue.iid}", issue.title) - should_see_todo(4, "Mary Jane mentioned you on issue ##{issue.iid}", issue.title) + should_see_todo(2, "John Doe mentioned you on issue #{issue.to_reference}", "#{current_user.to_reference} Wdyt?") + should_see_todo(3, "John Doe assigned you issue #{issue.to_reference}", issue.title) + should_see_todo(4, "Mary Jane mentioned you on issue #{issue.to_reference}", issue.title) end step 'I mark the todo as done' do @@ -41,18 +42,40 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps click_link 'Done' end + page.within('.todos-pending-count') { expect(page).to have_content '3' } expect(page).to have_content 'To do 3' expect(page).to have_content 'Done 1' should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference}" end - step 'I click on the "Done" tab' do + step 'I mark all todos as done' do + click_link 'Mark all as done' + + page.within('.todos-pending-count') { expect(page).to have_content '0' } + expect(page).to have_content 'To do 0' + expect(page).to have_content 'Done 4' + expect(page).not_to have_link project.name_with_namespace + should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference}" + should_not_see_todo "John Doe mentioned you on issue #{issue.to_reference}" + should_not_see_todo "John Doe assigned you issue #{issue.to_reference}" + should_not_see_todo "Mary Jane mentioned you on issue #{issue.to_reference}" + end + + step 'I should see the todo marked as done' do click_link 'Done 1' + + expect(page).to have_link project.name_with_namespace + should_see_todo(1, "John Doe assigned you merge request #{merge_request.to_reference}", merge_request.title, false) end step 'I should see all todos marked as done' do + click_link 'Done 4' + expect(page).to have_link project.name_with_namespace should_see_todo(1, "John Doe assigned you merge request #{merge_request.to_reference}", merge_request.title, false) + should_see_todo(2, "John Doe mentioned you on issue #{issue.to_reference}", "#{current_user.to_reference} Wdyt?", false) + should_see_todo(3, "John Doe assigned you issue #{issue.to_reference}", issue.title, false) + should_see_todo(4, "Mary Jane mentioned you on issue #{issue.to_reference}", issue.title, false) end step 'I filter by "Enterprise"' do @@ -76,7 +99,7 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps end step 'I should not see todos related to "Mary Jane" in the list' do - should_not_see_todo "Mary Jane mentioned you on issue ##{issue.iid}" + should_not_see_todo "Mary Jane mentioned you on issue #{issue.to_reference}" end step 'I should not see todos related to "Merge Requests" in the list' do @@ -85,7 +108,7 @@ class Spinach::Features::DashboardTodos < Spinach::FeatureSteps step 'I should not see todos related to "Assignments" in the list' do should_not_see_todo "John Doe assigned you merge request #{merge_request.to_reference}" - should_not_see_todo "John Doe assigned you issue ##{issue.iid}" + should_not_see_todo "John Doe assigned you issue #{issue.to_reference}" end step 'I click on the todo' do diff --git a/features/steps/profile/notifications.rb b/features/steps/profile/notifications.rb index a96f35ada5..7e339443b7 100644 --- a/features/steps/profile/notifications.rb +++ b/features/steps/profile/notifications.rb @@ -11,12 +11,10 @@ class Spinach::Features::ProfileNotifications < Spinach::FeatureSteps end step 'I select Mention setting from dropdown' do - select 'mention', from: 'notification_setting_level' + first(:link, "On mention").trigger('click') end step 'I should see Notification saved message' do - page.within '.flash-container' do - expect(page).to have_content 'Notification settings saved' - end + expect(page).to have_content 'On mention' end end diff --git a/features/steps/project/network_graph.rb b/features/steps/project/network_graph.rb index 9b59b68267..019b3124a8 100644 --- a/features/steps/project/network_graph.rb +++ b/features/steps/project/network_graph.rb @@ -20,11 +20,11 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps end step 'page should select "master" in select box' do - expect(page).to have_selector '.select2-chosen', text: "master" + expect(page).to have_selector '.dropdown-menu-toggle', text: "master" end step 'page should select "v1.0.0" in select box' do - expect(page).to have_selector '.select2-chosen', text: "v1.0.0" + expect(page).to have_selector '.dropdown-menu-toggle', text: "v1.0.0" end step 'page should have "master" on graph' do @@ -40,11 +40,19 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps end When 'I switch ref to "feature"' do - select 'feature', from: 'ref' + first('.js-project-refs-dropdown').click + + page.within '.project-refs-form' do + click_link 'feature' + end end When 'I switch ref to "v1.0.0"' do - select 'v1.0.0', from: 'ref' + first('.js-project-refs-dropdown').click + + page.within '.project-refs-form' do + click_link 'v1.0.0' + end end When 'click "Show only selected branch" checkbox' do @@ -68,11 +76,11 @@ class Spinach::Features::ProjectNetworkGraph < Spinach::FeatureSteps end step 'page should select "feature" in select box' do - expect(page).to have_selector '.select2-chosen', text: "feature" + expect(page).to have_selector '.dropdown-menu-toggle', text: "feature" end step 'page should select "v1.0.0" in select box' do - expect(page).to have_selector '.select2-chosen', text: "v1.0.0" + expect(page).to have_selector '.dropdown-menu-toggle', text: "v1.0.0" end step 'page should have "feature" on graph' do diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb index 2a1a8e776f..76fefee925 100644 --- a/features/steps/project/project.rb +++ b/features/steps/project/project.rb @@ -126,7 +126,7 @@ class Spinach::Features::Project < Spinach::FeatureSteps end step 'I click notifications drop down button' do - find('#notifications-button').click + first('.notifications-btn').click end step 'I choose Mention setting' do @@ -134,8 +134,8 @@ class Spinach::Features::Project < Spinach::FeatureSteps end step 'I should see Notification saved message' do - page.within '.flash-container' do - expect(page).to have_content 'Notification settings saved' + page.within '#notifications-button' do + expect(page).to have_content 'On mention' end end diff --git a/features/steps/project/project_find_file.rb b/features/steps/project/project_find_file.rb index 47de4b91df..9077184790 100644 --- a/features/steps/project/project_find_file.rb +++ b/features/steps/project/project_find_file.rb @@ -13,12 +13,12 @@ class Spinach::Features::ProjectFindFile < Spinach::FeatureSteps end step 'I should see "find file" page' do - ensure_active_main_tab('Code') + ensure_active_main_tab('Repository') expect(page).to have_selector('.file-finder-holder', count: 1) end step 'I fill in Find by path with "git"' do - ensure_active_main_tab('Code') + ensure_active_main_tab('Repository') expect(page).to have_selector('.file-finder-holder', count: 1) end diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb index 2c0498de3b..0fe046dcbf 100644 --- a/features/steps/project/source/browse_files.rb +++ b/features/steps/project/source/browse_files.rb @@ -202,8 +202,8 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps end step 'I see Browse dir link' do - expect(page).to have_link 'Browse Directory »' - expect(page).not_to have_link 'Browse Code »' + expect(page).to have_link 'Browse Directory' + expect(page).not_to have_link 'Browse Code' end step 'I click on readme file' do @@ -219,7 +219,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps step 'I see Browse code link' do expect(page).to have_link 'Browse Files' - expect(page).not_to have_link 'Browse Directory »' + expect(page).not_to have_link 'Browse Directory' end step 'I click on Permalink' do @@ -290,15 +290,23 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps end step "I switch ref to 'test'" do - select "'test'", from: 'ref' + first('.js-project-refs-dropdown').click + + page.within '.project-refs-form' do + click_link 'test' + end end step "I switch ref to fix" do - select "fix", from: 'ref' + first('.js-project-refs-dropdown').click + + page.within '.project-refs-form' do + click_link 'fix' + end end step "I see the ref 'test' has been selected" do - expect(page).to have_selector '.select2-chosen', text: "'test'" + expect(page).to have_selector '.dropdown-toggle-text', text: "'test'" end step "I visit the 'test' tree" do diff --git a/features/steps/shared/project_tab.rb b/features/steps/shared/project_tab.rb index bfee879330..d602421260 100644 --- a/features/steps/shared/project_tab.rb +++ b/features/steps/shared/project_tab.rb @@ -8,8 +8,8 @@ module SharedProjectTab ensure_active_main_tab('Project') end - step 'the active main tab should be Code' do - ensure_active_main_tab('Code') + step 'the active main tab should be Repository' do + ensure_active_main_tab('Repository') end step 'the active main tab should be Graphs' do diff --git a/lib/api/api.rb b/lib/api/api.rb index 6cd909f611..f8f680a631 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -26,38 +26,40 @@ module API # Ensure the namespace is right, otherwise we might load Grape::API::Helpers helpers ::API::Helpers - mount ::API::Groups + mount ::API::AwardEmoji + mount ::API::Branches + mount ::API::Builds + mount ::API::CommitStatuses + mount ::API::Commits + mount ::API::DeployKeys + mount ::API::Files mount ::API::GroupMembers - mount ::API::Users + mount ::API::Groups + mount ::API::Internal + mount ::API::Issues + mount ::API::Keys + mount ::API::Labels + mount ::API::Licenses + mount ::API::MergeRequests + mount ::API::Milestones + mount ::API::Namespaces + mount ::API::Notes + mount ::API::ProjectHooks + mount ::API::ProjectMembers + mount ::API::ProjectSnippets mount ::API::Projects mount ::API::Repositories - mount ::API::Issues - mount ::API::Milestones - mount ::API::Session - mount ::API::MergeRequests - mount ::API::Notes - mount ::API::Internal - mount ::API::SystemHooks - mount ::API::ProjectSnippets - mount ::API::ProjectMembers - mount ::API::DeployKeys - mount ::API::ProjectHooks - mount ::API::Services - mount ::API::Files - mount ::API::Commits - mount ::API::CommitStatuses - mount ::API::Namespaces - mount ::API::Branches - mount ::API::Labels - mount ::API::Settings - mount ::API::Keys - mount ::API::Tags - mount ::API::Triggers - mount ::API::Builds - mount ::API::Variables mount ::API::Runners - mount ::API::Licenses + mount ::API::Services + mount ::API::Session + mount ::API::Settings + mount ::API::SidekiqMetrics mount ::API::Subscriptions - mount ::API::Gitignores + mount ::API::SystemHooks + mount ::API::Tags + mount ::API::Templates + mount ::API::Triggers + mount ::API::Users + mount ::API::Variables end end diff --git a/lib/api/award_emoji.rb b/lib/api/award_emoji.rb new file mode 100644 index 0000000000..985590312e --- /dev/null +++ b/lib/api/award_emoji.rb @@ -0,0 +1,116 @@ +module API + class AwardEmoji < Grape::API + before { authenticate! } + AWARDABLES = [Issue, MergeRequest] + + resource :projects do + AWARDABLES.each do |awardable_type| + awardable_string = awardable_type.to_s.underscore.pluralize + awardable_id_string = "#{awardable_type.to_s.underscore}_id" + + [ ":id/#{awardable_string}/:#{awardable_id_string}/award_emoji", + ":id/#{awardable_string}/:#{awardable_id_string}/notes/:note_id/award_emoji" + ].each do |endpoint| + + # Get a list of project +awardable+ award emoji + # + # Parameters: + # id (required) - The ID of a project + # awardable_id (required) - The ID of an issue or MR + # Example Request: + # GET /projects/:id/issues/:awardable_id/award_emoji + get endpoint do + if can_read_awardable? + awards = paginate(awardable.award_emoji) + present awards, with: Entities::AwardEmoji + else + not_found!("Award Emoji") + end + end + + # Get a specific award emoji + # + # Parameters: + # id (required) - The ID of a project + # awardable_id (required) - The ID of an issue or MR + # award_id (required) - The ID of the award + # Example Request: + # GET /projects/:id/issues/:awardable_id/award_emoji/:award_id + get "#{endpoint}/:award_id" do + if can_read_awardable? + present awardable.award_emoji.find(params[:award_id]), with: Entities::AwardEmoji + else + not_found!("Award Emoji") + end + end + + # Award a new Emoji + # + # Parameters: + # id (required) - The ID of a project + # awardable_id (required) - The ID of an issue or mr + # name (required) - The name of a award_emoji (without colons) + # Example Request: + # POST /projects/:id/issues/:awardable_id/award_emoji + post endpoint do + required_attributes! [:name] + + not_found!('Award Emoji') unless can_read_awardable? + + award = awardable.award_emoji.new(name: params[:name], user: current_user) + + if award.save + present award, with: Entities::AwardEmoji + else + not_found!("Award Emoji #{award.errors.messages}") + end + end + + # Delete a +awardables+ award emoji + # + # Parameters: + # id (required) - The ID of a project + # awardable_id (required) - The ID of an issue or MR + # award_emoji_id (required) - The ID of an award emoji + # Example Request: + # DELETE /projects/:id/issues/:issue_id/notes/:note_id/award_emoji/:award_id + delete "#{endpoint}/:award_id" do + award = awardable.award_emoji.find(params[:award_id]) + + unauthorized! unless award.user == current_user || current_user.admin? + + award.destroy + present award, with: Entities::AwardEmoji + end + end + end + end + + helpers do + def can_read_awardable? + ability = "read_#{awardable.class.to_s.underscore}".to_sym + + can?(current_user, ability, awardable) + end + + def awardable + @awardable ||= + begin + if params.include?(:note_id) + noteable.notes.find(params[:note_id]) + else + noteable + end + end + end + + def noteable + if params.include?(:issue_id) + user_project.issues.find(params[:issue_id]) + else + user_project.merge_requests.find(params[:merge_request_id]) + end + end + end + end +end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index cc29c7ef42..5a23a18fe9 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -225,6 +225,14 @@ module API expose(:downvote?) { |note| false } end + class AwardEmoji < Grape::Entity + expose :id + expose :name + expose :user, using: Entities::UserBasic + expose :created_at, :updated_at + expose :awardable_id, :awardable_type + end + class MRNote < Grape::Entity expose :note expose :author, using: Entities::UserBasic @@ -415,6 +423,7 @@ module API class RunnerDetails < Runner expose :tag_list expose :run_untagged + expose :locked expose :version, :revision, :platform, :architecture expose :contacted_at expose :token, if: lambda { |runner, options| options[:current_user].is_admin? || !runner.is_shared? } @@ -436,11 +445,7 @@ module API expose :created_at, :started_at, :finished_at expose :user, with: User expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? } - expose :commit, with: RepoCommit do |repo_obj, _options| - if repo_obj.respond_to?(:commit) - repo_obj.commit.commit_data - end - end + expose :commit, with: RepoCommit expose :runner, with: Runner end @@ -464,11 +469,11 @@ module API expose :content end - class GitignoresList < Grape::Entity + class TemplatesList < Grape::Entity expose :name end - class Gitignore < Grape::Entity + class Template < Grape::Entity expose :name, :content end end diff --git a/lib/api/gitignores.rb b/lib/api/gitignores.rb deleted file mode 100644 index 270c9501dd..0000000000 --- a/lib/api/gitignores.rb +++ /dev/null @@ -1,29 +0,0 @@ -module API - class Gitignores < Grape::API - - # Get the list of the available gitignore templates - # - # Example Request: - # GET /gitignores - get 'gitignores' do - present Gitlab::Gitignore.all, with: Entities::GitignoresList - end - - # Get the text for a specific gitignore - # - # Parameters: - # name (required) - The name of a license - # - # Example Request: - # GET /gitignores/Elixir - # - get 'gitignores/:name' do - required_attributes! [:name] - - gitignore = Gitlab::Gitignore.find(params[:name]) - not_found!('.gitignore') unless gitignore - - present gitignore, with: Entities::Gitignore - end - end -end diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index de5959e3aa..77e407b54c 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -9,9 +9,13 @@ module API [ true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON' ].include?(value) end + def find_user_by_private_token + token_string = (params[PRIVATE_TOKEN_PARAM] || env[PRIVATE_TOKEN_HEADER]).to_s + User.find_by_authentication_token(token_string) || User.find_by_personal_access_token(token_string) + 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) + @current_user ||= (find_user_by_private_token || doorkeeper_guard) unless @current_user && Gitlab::UserAccess.allowed?(@current_user) return nil @@ -33,7 +37,7 @@ module API identifier ||= params[SUDO_PARAM] || env[SUDO_HEADER] # Regex for integers - if !!(identifier =~ /^[0-9]+$/) + if !!(identifier =~ /\A[0-9]+\z/) identifier.to_i else identifier diff --git a/lib/api/internal.rb b/lib/api/internal.rb index 3ac7b50c4c..1d361569d5 100644 --- a/lib/api/internal.rb +++ b/lib/api/internal.rb @@ -23,8 +23,6 @@ module API end post "/allowed" do - Gitlab::Metrics.action = 'Grape#/internal/allowed' - status 200 actor = diff --git a/lib/api/notes.rb b/lib/api/notes.rb index d4fcfd3d4d..8bfa998dc5 100644 --- a/lib/api/notes.rb +++ b/lib/api/notes.rb @@ -144,7 +144,7 @@ module API helpers do def noteable_read_ability_name(noteable) - "read_#{noteable.class.to_s.underscore.downcase}".to_sym + "read_#{noteable.class.to_s.underscore}".to_sym end end end diff --git a/lib/api/runners.rb b/lib/api/runners.rb index 4faba9dc87..ecc8f2fc5a 100644 --- a/lib/api/runners.rb +++ b/lib/api/runners.rb @@ -49,7 +49,7 @@ module API runner = get_runner(params[:id]) authenticate_update_runner!(runner) - attrs = attributes_for_keys [:description, :active, :tag_list, :run_untagged] + attrs = attributes_for_keys [:description, :active, :tag_list, :run_untagged, :locked] if runner.update(attrs) present runner, with: Entities::RunnerDetails, current_user: current_user else @@ -96,9 +96,14 @@ module API runner = get_runner(params[:runner_id]) authenticate_enable_runner!(runner) - Ci::RunnerProject.create(runner: runner, project: user_project) - present runner, with: Entities::Runner + runner_project = runner.assign_to(user_project) + + if runner_project.persisted? + present runner, with: Entities::Runner + else + conflict!("Runner was already enabled for this project") + end end # Disable project's runner @@ -163,6 +168,7 @@ module API def authenticate_enable_runner!(runner) forbidden!("Runner is shared") if runner.is_shared? + forbidden!("Runner is locked") if runner.locked? return if current_user.is_admin? forbidden!("No access granted") unless user_can_access_runner?(runner) end diff --git a/lib/api/sidekiq_metrics.rb b/lib/api/sidekiq_metrics.rb new file mode 100644 index 0000000000..d3d6827dc5 --- /dev/null +++ b/lib/api/sidekiq_metrics.rb @@ -0,0 +1,90 @@ +require 'sidekiq/api' + +module API + class SidekiqMetrics < Grape::API + before { authenticated_as_admin! } + + helpers do + def queue_metrics + Sidekiq::Queue.all.each_with_object({}) do |queue, hash| + hash[queue.name] = { + backlog: queue.size, + latency: queue.latency.to_i + } + end + end + + def process_metrics + Sidekiq::ProcessSet.new.map do |process| + { + hostname: process['hostname'], + pid: process['pid'], + tag: process['tag'], + started_at: Time.at(process['started_at']), + queues: process['queues'], + labels: process['labels'], + concurrency: process['concurrency'], + busy: process['busy'] + } + end + end + + def job_stats + stats = Sidekiq::Stats.new + { + processed: stats.processed, + failed: stats.failed, + enqueued: stats.enqueued + } + end + end + + # Get Sidekiq Queue metrics + # + # Parameters: + # None + # + # Example: + # GET /sidekiq/queue_metrics + # + get 'sidekiq/queue_metrics' do + { queues: queue_metrics } + end + + # Get Sidekiq Process metrics + # + # Parameters: + # None + # + # Example: + # GET /sidekiq/process_metrics + # + get 'sidekiq/process_metrics' do + { processes: process_metrics } + end + + # Get Sidekiq Job statistics + # + # Parameters: + # None + # + # Example: + # GET /sidekiq/job_stats + # + get 'sidekiq/job_stats' do + { jobs: job_stats } + end + + # Get Sidekiq Compound metrics. Includes all previous metrics + # + # Parameters: + # None + # + # Example: + # GET /sidekiq/compound_metrics + # + get 'sidekiq/compound_metrics' do + { queues: queue_metrics, processes: process_metrics, jobs: job_stats } + end + end +end diff --git a/lib/api/templates.rb b/lib/api/templates.rb new file mode 100644 index 0000000000..1840879775 --- /dev/null +++ b/lib/api/templates.rb @@ -0,0 +1,36 @@ +module API + class Templates < Grape::API + TEMPLATE_TYPES = { + gitignores: Gitlab::Template::Gitignore, + gitlab_ci_ymls: Gitlab::Template::GitlabCiYml + }.freeze + + TEMPLATE_TYPES.each do |template, klass| + # Get the list of the available template + # + # Example Request: + # GET /gitignores + # GET /gitlab_ci_ymls + get template.to_s do + present klass.all, with: Entities::TemplatesList + end + + # Get the text for a specific template + # + # Parameters: + # name (required) - The name of a template + # + # Example Request: + # GET /gitignores/Elixir + # GET /gitlab_ci_ymls/Ruby + get "#{template}/:name" do + required_attributes! [:name] + + new_template = klass.find(params[:name]) + not_found!(template.to_s.singularize) unless new_template + + present new_template, with: Entities::Template + end + end + end +end diff --git a/lib/banzai.rb b/lib/banzai.rb index b467413a7d..093382261a 100644 --- a/lib/banzai.rb +++ b/lib/banzai.rb @@ -7,10 +7,6 @@ module Banzai Renderer.render_result(text, context) end - def self.pre_process(text, context) - Renderer.pre_process(text, context) - end - def self.post_process(html, context) Renderer.post_process(html, context) end diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index db95d7c908..81d6627113 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -103,7 +103,7 @@ module Banzai ref_pattern = object_class.reference_pattern link_pattern = object_class.link_reference_pattern - each_node do |node| + nodes.each do |node| if text_node?(node) && ref_pattern replace_text_when_pattern_matches(node, ref_pattern) do |content| object_link_filter(content, ref_pattern) @@ -206,6 +206,56 @@ module Banzai text end + # Returns a Hash containing all object references (e.g. issue IDs) per the + # project they belong to. + def references_per_project + @references_per_project ||= begin + refs = Hash.new { |hash, key| hash[key] = Set.new } + + regex = Regexp.union(object_class.reference_pattern, + object_class.link_reference_pattern) + + nodes.each do |node| + node.to_html.scan(regex) do + project = $~[:project] || current_project_path + symbol = $~[object_sym] + + refs[project] << symbol if object_class.reference_valid?(symbol) + end + end + + refs + end + end + + # Returns a Hash containing referenced projects grouped per their full + # path. + def projects_per_reference + @projects_per_reference ||= begin + hash = {} + refs = Set.new + + references_per_project.each do |project_ref, _| + refs << project_ref + end + + find_projects_for_paths(refs.to_a).each do |project| + hash[project.path_with_namespace] = project + end + + hash + end + end + + # Returns the projects for the given paths. + def find_projects_for_paths(paths) + Project.where_paths_in(paths).includes(:namespace) + end + + def current_project_path + @current_project_path ||= project.path_with_namespace + end + private def project_refs_cache diff --git a/lib/banzai/filter/external_link_filter.rb b/lib/banzai/filter/external_link_filter.rb index f73ecfc941..0a29c547a4 100644 --- a/lib/banzai/filter/external_link_filter.rb +++ b/lib/banzai/filter/external_link_filter.rb @@ -3,17 +3,8 @@ module Banzai # HTML Filter to modify the attributes of external links class ExternalLinkFilter < HTML::Pipeline::Filter def call - doc.search('a').each do |node| - link = node.attr('href') - - next unless link - - # Skip non-HTTP(S) links - next unless link.start_with?('http') - - # Skip internal links - next if link.start_with?(internal_url) - + # Skip non-HTTP(S) links and internal links + doc.xpath("descendant-or-self::a[starts-with(@href, 'http') and not(starts-with(@href, '#{internal_url}'))]").each do |node| node.set_attribute('rel', 'nofollow noreferrer') node.set_attribute('target', '_blank') end diff --git a/lib/banzai/filter/issue_reference_filter.rb b/lib/banzai/filter/issue_reference_filter.rb index 2496e70400..2614261f9e 100644 --- a/lib/banzai/filter/issue_reference_filter.rb +++ b/lib/banzai/filter/issue_reference_filter.rb @@ -11,13 +11,40 @@ module Banzai Issue end - def find_object(project, id) - project.get_issue(id) + def find_object(project, iid) + issues_per_project[project][iid] end def url_for_object(issue, project) IssuesHelper.url_for_issue(issue.iid, project, only_path: context[:only_path]) end + + def project_from_ref(ref) + projects_per_reference[ref || current_project_path] + end + + # Returns a Hash containing the issues per Project instance. + def issues_per_project + @issues_per_project ||= begin + hash = Hash.new { |h, k| h[k] = {} } + + projects_per_reference.each do |path, project| + issue_ids = references_per_project[path] + + next unless project.default_issues_tracker? + + project.issues.where(iid: issue_ids.to_a).each do |issue| + hash[project][issue.iid] = issue + end + end + + hash + end + end + + def find_projects_for_paths(paths) + super(paths).includes(:gitlab_issue_tracker_service) + end end end end diff --git a/lib/banzai/filter/relative_link_filter.rb b/lib/banzai/filter/relative_link_filter.rb index ea21c7b041..c78da40460 100644 --- a/lib/banzai/filter/relative_link_filter.rb +++ b/lib/banzai/filter/relative_link_filter.rb @@ -14,6 +14,8 @@ module Banzai def call return doc unless linkable_files? + @uri_types = {} + doc.search('a:not(.gfm)').each do |el| process_link_attr el.attribute('href') end @@ -48,7 +50,7 @@ module Banzai uri.path = [ relative_url_root, context[:project].path_with_namespace, - path_type(file_path), + uri_type(file_path), ref || context[:project].default_branch, # if no ref exists, point to the default branch file_path ].compact.join('/').squeeze('/').chomp('/') @@ -87,7 +89,7 @@ module Banzai return path unless request_path parts = request_path.split('/') - parts.pop if path_type(request_path) != 'tree' + parts.pop if uri_type(request_path) != :tree while path.start_with?('../') parts.pop @@ -98,45 +100,20 @@ module Banzai end def file_exists?(path) - return false if path.nil? - repository.blob_at(current_sha, path).present? || - repository.tree(current_sha, path).entries.any? + path.present? && !!uri_type(path) end - # Get the type of the given path - # - # path - String path to check - # - # Examples: - # - # path_type('doc/README.md') # => 'blob' - # path_type('doc/logo.png') # => 'raw' - # path_type('doc/api') # => 'tree' - # - # Returns a String - def path_type(path) - unescaped_path = Addressable::URI.unescape(path) + def uri_type(path) + @uri_types[path] ||= begin + unescaped_path = Addressable::URI.unescape(path) - if tree?(unescaped_path) - 'tree' - elsif image?(unescaped_path) - 'raw' - else - 'blob' + current_commit.uri_type(unescaped_path) end end - def tree?(path) - repository.tree(current_sha, path).entries.any? - end - - def image?(path) - repository.blob_at(current_sha, path).try(:image?) - end - - def current_sha - context[:commit].try(:id) || - ref ? repository.commit(ref).try(:sha) : repository.head_commit.sha + def current_commit + @current_commit ||= context[:commit] || + ref ? repository.commit(ref) : repository.head_commit end def relative_url_root @@ -148,7 +125,7 @@ module Banzai end def repository - context[:project].try(:repository) + @repository ||= context[:project].try(:repository) end end end diff --git a/lib/banzai/filter/upload_link_filter.rb b/lib/banzai/filter/upload_link_filter.rb index c0f503c9af..45bb66dc99 100644 --- a/lib/banzai/filter/upload_link_filter.rb +++ b/lib/banzai/filter/upload_link_filter.rb @@ -10,11 +10,11 @@ module Banzai def call return doc unless project - doc.search('a').each do |el| + doc.xpath('descendant-or-self::a[starts-with(@href, "/uploads/")]').each do |el| process_link_attr el.attribute('href') end - doc.search('img').each do |el| + doc.xpath('descendant-or-self::img[starts-with(@src, "/uploads/")]').each do |el| process_link_attr el.attribute('src') end @@ -24,12 +24,7 @@ module Banzai protected def process_link_attr(html_attr) - return if html_attr.blank? - - uri = html_attr.value - if uri.starts_with?("/uploads/") - html_attr.value = build_url(uri).to_s - end + html_attr.value = build_url(html_attr.value).to_s end def build_url(uri) diff --git a/lib/banzai/renderer.rb b/lib/banzai/renderer.rb index c14a9c4c72..6718acdef7 100644 --- a/lib/banzai/renderer.rb +++ b/lib/banzai/renderer.rb @@ -30,15 +30,11 @@ module Banzai end def self.render_result(text, context = {}) + text = Pipeline[:pre_process].to_html(text, context) if text + Pipeline[context[:pipeline]].call(text, context) end - def self.pre_process(text, context) - pipeline = Pipeline[:pre_process] - - pipeline.to_html(text, context) - end - # Perform post-processing on an HTML String # # This method is used to perform state-dependent changes to a String of diff --git a/lib/ci/api/runners.rb b/lib/ci/api/runners.rb index 0c41f22c7c..bcc82969eb 100644 --- a/lib/ci/api/runners.rb +++ b/lib/ci/api/runners.rb @@ -28,12 +28,9 @@ module Ci post "register" do required_attributes! [:token] - attributes = { description: params[:description], - tag_list: params[:tag_list] } - - unless params[:run_untagged].nil? - attributes[:run_untagged] = params[:run_untagged] - end + attributes = attributes_for_keys( + [:description, :tag_list, :run_untagged, :locked] + ) runner = if runner_registration_token_valid? diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index 68246497e9..ed86de819e 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -30,7 +30,10 @@ module Ci end def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) - builds.select{|build| build[:stage] == stage && process?(build[:only], build[:except], ref, tag, trigger_request)} + builds.select do |build| + build[:stage] == stage && + process?(build[:only], build[:except], ref, tag, trigger_request) + end end def builds @@ -51,7 +54,7 @@ module Ci job = @jobs[name.to_sym] return [] unless job - job.fetch(:variables, []) + job[:variables] || [] end private @@ -201,12 +204,12 @@ module Ci raise ValidationError, "#{name} job: tags parameter should be an array of strings" end - if job[:only] && !validate_array_of_strings(job[:only]) - raise ValidationError, "#{name} job: only parameter should be an array of strings" + if job[:only] && !validate_array_of_strings_or_regexps(job[:only]) + raise ValidationError, "#{name} job: only parameter should be an array of strings or regexps" end - if job[:except] && !validate_array_of_strings(job[:except]) - raise ValidationError, "#{name} job: except parameter should be an array of strings" + if job[:except] && !validate_array_of_strings_or_regexps(job[:except]) + raise ValidationError, "#{name} job: except parameter should be an array of strings or regexps" end if job[:allow_failure] && !validate_boolean(job[:allow_failure]) diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb index e0b3f14d38..42232b7129 100644 --- a/lib/container_registry/client.rb +++ b/lib/container_registry/client.rb @@ -15,11 +15,11 @@ module ContainerRegistry end def repository_tags(name) - @faraday.get("/v2/#{name}/tags/list").body + response_body @faraday.get("/v2/#{name}/tags/list") end def repository_manifest(name, reference) - @faraday.get("/v2/#{name}/manifests/#{reference}").body + response_body @faraday.get("/v2/#{name}/manifests/#{reference}") end def repository_tag_digest(name, reference) @@ -34,7 +34,7 @@ module ContainerRegistry def blob(name, digest, type = nil) headers = {} headers['Accept'] = type if type - @faraday.get("/v2/#{name}/blobs/#{digest}", nil, headers).body + response_body @faraday.get("/v2/#{name}/blobs/#{digest}", nil, headers) end def delete_blob(name, digest) @@ -47,6 +47,7 @@ module ContainerRegistry conn.request :json conn.headers['Accept'] = MANIFEST_VERSION + conn.response :json, content_type: 'application/json' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v1+prettyjws' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v1+json' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v2+json' @@ -59,5 +60,9 @@ module ContainerRegistry conn.adapter :net_http end + + def response_body(response) + response.body if response.success? + end end end diff --git a/lib/container_registry/tag.rb b/lib/container_registry/tag.rb index 7a0929d774..708d01b95a 100644 --- a/lib/container_registry/tag.rb +++ b/lib/container_registry/tag.rb @@ -3,6 +3,7 @@ module ContainerRegistry attr_reader :repository, :name delegate :registry, :client, to: :repository + delegate :revision, :short_revision, to: :config_blob, allow_nil: true def initialize(repository, name) @repository, @name = repository, name diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index 7e3f5abba6..ab7b811c5d 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -31,7 +31,7 @@ module Grack auth! - lfs_response = Gitlab::Lfs::Router.new(project, @user, @request).try_call + lfs_response = Gitlab::Lfs::Router.new(project, @user, @ci, @request).try_call return lfs_response unless lfs_response.nil? if @user.nil? && !@ci diff --git a/lib/gitlab/ci/config/node/validation_helpers.rb b/lib/gitlab/ci/config/node/validation_helpers.rb index 3900fc8939..72f648975d 100644 --- a/lib/gitlab/ci/config/node/validation_helpers.rb +++ b/lib/gitlab/ci/config/node/validation_helpers.rb @@ -15,6 +15,10 @@ module Gitlab values.is_a?(Array) && values.all? { |value| validate_string(value) } end + def validate_array_of_strings_or_regexps(values) + values.is_a?(Array) && values.all? { |value| validate_string_or_regexp(value) } + end + def validate_variables(variables) variables.is_a?(Hash) && variables.all? { |key, value| validate_string(key) && validate_string(value) } @@ -24,6 +28,19 @@ module Gitlab value.is_a?(String) || value.is_a?(Symbol) end + def validate_string_or_regexp(value) + return true if value.is_a?(Symbol) + return false unless value.is_a?(String) + + if value.first == '/' && value.last == '/' + Regexp.new(value[1...-1]) + else + true + end + rescue RegexpError + false + end + def validate_environment(value) value.is_a?(String) && value =~ Gitlab::Regex.environment_name_regex end diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 5e7532f57a..28c34429c1 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -36,7 +36,7 @@ module Gitlab default_project_visibility: Settings.gitlab.default_projects_features['visibility_level'], default_snippet_visibility: Settings.gitlab.default_projects_features['visibility_level'], restricted_signup_domains: Settings.gitlab['restricted_signup_domains'], - import_sources: ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'], + import_sources: %w[github bitbucket gitlab gitorious google_code fogbugz git gitlab_project], shared_runners_enabled: Settings.gitlab_ci['shared_runners_enabled'], max_artifacts_size: Settings.artifacts['max_size'], require_two_factor_authentication: false, diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index d76ecb5401..078609c86f 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -1,5 +1,10 @@ module Gitlab module Database + # The max value of INTEGER type is the same between MySQL and PostgreSQL: + # https://www.postgresql.org/docs/9.2/static/datatype-numeric.html + # http://dev.mysql.com/doc/refman/5.7/en/integer-types.html + MAX_INT_VALUE = 2147483647 + def self.adapter_name connection.adapter_name end diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb index dd3ff0ab18..dec20d8659 100644 --- a/lib/gitlab/database/migration_helpers.rb +++ b/lib/gitlab/database/migration_helpers.rb @@ -28,65 +28,79 @@ module Gitlab # Updates the value of a column in batches. # # This method updates the table in batches of 5% of the total row count. - # Any data inserted while running this method (or after it has finished - # running) is _not_ updated automatically. + # This method will continue updating rows until no rows remain. + # + # When given a block this method will yield two values to the block: + # + # 1. An instance of `Arel::Table` for the table that is being updated. + # 2. The query to run as an Arel object. + # + # By supplying a block one can add extra conditions to the queries being + # executed. Note that the same block is used for _all_ queries. + # + # Example: + # + # update_column_in_batches(:projects, :foo, 10) do |table, query| + # query.where(table[:some_column].eq('hello')) + # end + # + # This would result in this method updating only rows where + # `projects.some_column` equals "hello". # # table - The name of the table. # column - The name of the column to update. # value - The value for the column. + # + # Rubocop's Metrics/AbcSize metric is disabled for this method as Rubocop + # determines this method to be too complex while there's no way to make it + # less "complex" without introducing extra methods (which actually will + # make things _more_ complex). + # + # rubocop: disable Metrics/AbcSize def update_column_in_batches(table, column, value) - quoted_table = quote_table_name(table) - quoted_column = quote_column_name(column) + table = Arel::Table.new(table) - ## - # Workaround for #17711 - # - # It looks like for MySQL `ActiveRecord::Base.conntection.quote(true)` - # returns correct value (1), but `ActiveRecord::Migration.new.quote` - # returns incorrect value ('true'), which causes migrations to fail. - # - quoted_value = connection.quote(value) - processed = 0 + count_arel = table.project(Arel.star.count.as('count')) + count_arel = yield table, count_arel if block_given? - total = exec_query("SELECT COUNT(*) AS count FROM #{quoted_table}"). - to_hash. - first['count']. - to_i + total = exec_query(count_arel.to_sql).to_hash.first['count'].to_i + + return if total == 0 # Update in batches of 5% until we run out of any rows to update. batch_size = ((total / 100.0) * 5.0).ceil + start_arel = table.project(table[:id]).order(table[:id].asc).take(1) + start_arel = yield table, start_arel if block_given? + start_id = exec_query(start_arel.to_sql).to_hash.first['id'].to_i + loop do - start_row = exec_query(%Q{ - SELECT id - FROM #{quoted_table} - ORDER BY id ASC - LIMIT 1 OFFSET #{processed} - }).to_hash.first + stop_arel = table.project(table[:id]). + where(table[:id].gteq(start_id)). + order(table[:id].asc). + take(1). + skip(batch_size) - # There are no more rows to process - break unless start_row + stop_arel = yield table, stop_arel if block_given? + stop_row = exec_query(stop_arel.to_sql).to_hash.first - stop_row = exec_query(%Q{ - SELECT id - FROM #{quoted_table} - ORDER BY id ASC - LIMIT 1 OFFSET #{processed + batch_size} - }).to_hash.first - - query = %Q{ - UPDATE #{quoted_table} - SET #{quoted_column} = #{quoted_value} - WHERE id >= #{start_row['id']} - } + update_arel = Arel::UpdateManager.new(ActiveRecord::Base). + table(table). + set([[table[column], value]]). + where(table[:id].gteq(start_id)) if stop_row - query += " AND id < #{stop_row['id']}" + stop_id = stop_row['id'].to_i + start_id = stop_id + update_arel = update_arel.where(table[:id].lt(stop_id)) end - execute(query) + update_arel = yield table, update_arel if block_given? - processed += batch_size + execute(update_arel.to_sql) + + # There are no more rows left to update. + break unless stop_row end end @@ -95,9 +109,9 @@ module Gitlab # This method runs the following steps: # # 1. Add the column with a default value of NULL. - # 2. Update all existing rows in batches. - # 3. Change the default value of the column to the specified value. - # 4. Update any remaining rows. + # 2. Change the default value of the column to the specified value. + # 3. Update all existing rows in batches. + # 4. Set a `NOT NULL` constraint on the column if desired (the default). # # These steps ensure a column can be added to a large and commonly used # table without locking the entire table for the duration of the table @@ -109,7 +123,10 @@ module Gitlab # default - The default value for the column. # allow_null - When set to `true` the column will allow NULL values, the # default is to not allow NULL values. - def add_column_with_default(table, column, type, default:, allow_null: false) + # + # This method can also take a block which is passed directly to the + # `update_column_in_batches` method. + def add_column_with_default(table, column, type, default:, allow_null: false, &block) if transaction_open? raise 'add_column_with_default can not be run inside a transaction, ' \ 'you can disable transactions by calling disable_ddl_transaction! ' \ @@ -125,11 +142,9 @@ module Gitlab end begin - transaction do - update_column_in_batches(table, column, default) + update_column_in_batches(table, column, default, &block) - change_column_null(table, column, false) unless allow_null - end + change_column_null(table, column, false) unless allow_null # We want to rescue _all_ exceptions here, even those that don't inherit # from StandardError. rescue Exception => error # rubocop: disable all diff --git a/lib/gitlab/email/message/repository_push.rb b/lib/gitlab/email/message/repository_push.rb index e2fee6b9f3..047c77c6fc 100644 --- a/lib/gitlab/email/message/repository_push.rb +++ b/lib/gitlab/email/message/repository_push.rb @@ -37,7 +37,7 @@ module Gitlab end def diffs - @diffs ||= (safe_diff_files(compare.diffs, diff_refs) if compare) + @diffs ||= (safe_diff_files(compare.diffs(max_files: 30), diff_refs) if compare) end def diffs_count diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb index e5cf66a037..2286ac8829 100644 --- a/lib/gitlab/github_import/importer.rb +++ b/lib/gitlab/github_import/importer.rb @@ -66,8 +66,7 @@ module Gitlab end def import_pull_requests - hooks = client.hooks(repo).map { |raw| HookFormatter.new(raw) }.select(&:valid?) - disable_webhooks(hooks) + disable_webhooks pull_requests = client.pull_requests(repo, state: :all, sort: :created, direction: :asc, per_page: 100) pull_requests = pull_requests.map { |raw| PullRequestFormatter.new(project, raw) }.select(&:valid?) @@ -90,14 +89,14 @@ module Gitlab raise Projects::ImportService::Error, e.message ensure clean_up_restored_branches(branches_removed) - clean_up_disabled_webhooks(hooks) + clean_up_disabled_webhooks end - def disable_webhooks(hooks) + def disable_webhooks update_webhooks(hooks, active: false) end - def clean_up_disabled_webhooks(hooks) + def clean_up_disabled_webhooks update_webhooks(hooks, active: true) end @@ -107,6 +106,20 @@ module Gitlab end end + def hooks + @hooks ||= + begin + client.hooks(repo).map { |raw| HookFormatter.new(raw) }.select(&:valid?) + + # The GitHub Repository Webhooks API returns 404 for users + # without admin access to the repository when listing hooks. + # In this case we just want to return gracefully instead of + # spitting out an error and stop the import process. + rescue Octokit::NotFound + [] + end + end + def restore_branches(branches) branches.each do |name, sha| client.create_ref(repo, "refs/heads/#{name}", sha) diff --git a/lib/gitlab/gitignore.rb b/lib/gitlab/gitignore.rb deleted file mode 100644 index f46b43b61a..0000000000 --- a/lib/gitlab/gitignore.rb +++ /dev/null @@ -1,56 +0,0 @@ -module Gitlab - class Gitignore - FILTER_REGEX = /\.gitignore\z/.freeze - - def initialize(path) - @path = path - end - - def name - File.basename(@path, '.gitignore') - end - - def content - File.read(@path) - end - - class << self - def all - languages_frameworks + global - end - - def find(key) - file_name = "#{key}.gitignore" - - directory = select_directory(file_name) - directory ? new(File.join(directory, file_name)) : nil - end - - def global - files_for_folder(global_dir).map { |file| new(File.join(global_dir, file)) } - end - - def languages_frameworks - files_for_folder(gitignore_dir).map { |file| new(File.join(gitignore_dir, file)) } - end - - private - - def select_directory(file_name) - [gitignore_dir, global_dir].find { |dir| File.exist?(File.join(dir, file_name)) } - end - - def global_dir - File.join(gitignore_dir, 'Global') - end - - def gitignore_dir - Rails.root.join('vendor/gitignore') - end - - def files_for_folder(dir) - Dir.glob("#{dir.to_s}/*.gitignore").map { |file| file.gsub(FILTER_REGEX, '') } - end - end - end -end diff --git a/lib/gitlab/gitlab_import/project_creator.rb b/lib/gitlab/gitlab_import/project_creator.rb index 77c33db4b5..3d0418261b 100644 --- a/lib/gitlab/gitlab_import/project_creator.rb +++ b/lib/gitlab/gitlab_import/project_creator.rb @@ -11,7 +11,7 @@ module Gitlab end def execute - project = ::Projects::CreateService.new( + ::Projects::CreateService.new( current_user, name: repo["name"], path: repo["path"], @@ -22,8 +22,6 @@ module Gitlab import_source: repo["path_with_namespace"], import_url: repo["http_url_to_repo"].sub("://", "://oauth2:#{@session_data[:gitlab_access_token]}@") ).execute - - project end end end diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb new file mode 100644 index 0000000000..99cf85d9a3 --- /dev/null +++ b/lib/gitlab/import_export.rb @@ -0,0 +1,39 @@ +module Gitlab + module ImportExport + extend self + + VERSION = '0.1.0' + + def export_path(relative_path:) + File.join(storage_path, relative_path) + end + + def storage_path + File.join(Settings.shared['path'], 'tmp/project_exports') + end + + def project_filename + "project.json" + end + + def project_bundle_filename + "project.bundle" + end + + def config_file + Rails.root.join('lib/gitlab/import_export/import_export.yml') + end + + def version_filename + 'VERSION' + end + + def version + VERSION + end + + def reset_tokens? + true + end + end +end diff --git a/lib/gitlab/import_export/attributes_finder.rb b/lib/gitlab/import_export/attributes_finder.rb new file mode 100644 index 0000000000..d230de781d --- /dev/null +++ b/lib/gitlab/import_export/attributes_finder.rb @@ -0,0 +1,47 @@ +module Gitlab + module ImportExport + class AttributesFinder + + def initialize(included_attributes:, excluded_attributes:, methods:) + @included_attributes = included_attributes || {} + @excluded_attributes = excluded_attributes || {} + @methods = methods || {} + end + + def find(model_object) + parsed_hash = find_attributes_only(model_object) + parsed_hash.empty? ? model_object : { model_object => parsed_hash } + end + + def parse(model_object) + parsed_hash = find_attributes_only(model_object) + yield parsed_hash unless parsed_hash.empty? + end + + def find_included(value) + key = key_from_hash(value) + @included_attributes[key].nil? ? {} : { only: @included_attributes[key] } + end + + def find_excluded(value) + key = key_from_hash(value) + @excluded_attributes[key].nil? ? {} : { except: @excluded_attributes[key] } + end + + def find_method(value) + key = key_from_hash(value) + @methods[key].nil? ? {} : { methods: @methods[key] } + end + + private + + def find_attributes_only(value) + find_included(value).merge(find_excluded(value)).merge(find_method(value)) + end + + def key_from_hash(value) + value.is_a?(Hash) ? value.keys.first : value + end + end + end +end diff --git a/lib/gitlab/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb new file mode 100644 index 0000000000..78664f076e --- /dev/null +++ b/lib/gitlab/import_export/command_line_util.rb @@ -0,0 +1,40 @@ +module Gitlab + module ImportExport + module CommandLineUtil + def tar_czf(archive:, dir:) + tar_with_options(archive: archive, dir: dir, options: 'czf') + end + + def untar_zxf(archive:, dir:) + untar_with_options(archive: archive, dir: dir, options: 'zxf') + end + + def git_bundle(repo_path:, bundle_path:) + execute(%W(#{git_bin_path} --git-dir=#{repo_path} bundle create #{bundle_path} --all)) + end + + def git_unbundle(repo_path:, bundle_path:) + execute(%W(#{git_bin_path} clone --bare #{bundle_path} #{repo_path})) + end + + private + + def tar_with_options(archive:, dir:, options:) + execute(%W(tar -#{options} #{archive} -C #{dir} .)) + end + + def untar_with_options(archive:, dir:, options:) + execute(%W(tar -#{options} #{archive} -C #{dir})) + end + + def execute(cmd) + _output, status = Gitlab::Popen.popen(cmd) + status.zero? + end + + def git_bin_path + Gitlab.config.git.bin_path + end + end + end +end diff --git a/lib/gitlab/import_export/error.rb b/lib/gitlab/import_export/error.rb new file mode 100644 index 0000000000..e341c4d9cf --- /dev/null +++ b/lib/gitlab/import_export/error.rb @@ -0,0 +1,5 @@ +module Gitlab + module ImportExport + class Error < StandardError; end + end +end diff --git a/lib/gitlab/import_export/file_importer.rb b/lib/gitlab/import_export/file_importer.rb new file mode 100644 index 0000000000..0e70d9282d --- /dev/null +++ b/lib/gitlab/import_export/file_importer.rb @@ -0,0 +1,30 @@ +module Gitlab + module ImportExport + class FileImporter + include Gitlab::ImportExport::CommandLineUtil + + def self.import(*args) + new(*args).import + end + + def initialize(archive_file:, shared:) + @archive_file = archive_file + @shared = shared + end + + def import + FileUtils.mkdir_p(@shared.export_path) + decompress_archive + rescue => e + @shared.error(e) + false + end + + private + + def decompress_archive + untar_zxf(archive: @archive_file, dir: @shared.export_path) + end + end + end +end diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml new file mode 100644 index 0000000000..164ab6238c --- /dev/null +++ b/lib/gitlab/import_export/import_export.yml @@ -0,0 +1,54 @@ +# Model relationships to be included in the project import/export +project_tree: + - issues: + - notes: + :author + - :labels + - :milestones + - snippets: + - notes: + :author + - :releases + - :events + - project_members: + - :user + - merge_requests: + - notes: + :author + - :merge_request_diff + - pipelines: + - notes: + :author + - :statuses + - :variables + - :triggers + - :deploy_keys + - :services + - :hooks + - :protected_branches + +# Only include the following attributes for the models specified. +included_attributes: + project: + - :description + - :issues_enabled + - :merge_requests_enabled + - :wiki_enabled + - :snippets_enabled + - :visibility_level + - :archived + user: + - :id + - :email + - :username + author: + - :name + +# Do not include the following attributes for the models specified. +excluded_attributes: + snippets: + - :expired_at + +methods: + statuses: + - :type \ No newline at end of file diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb new file mode 100644 index 0000000000..d209e04f7b --- /dev/null +++ b/lib/gitlab/import_export/importer.rb @@ -0,0 +1,64 @@ +module Gitlab + module ImportExport + class Importer + + def initialize(project) + @archive_file = project.import_source + @current_user = project.creator + @project = project + @shared = Gitlab::ImportExport::Shared.new(relative_path: path_with_namespace) + end + + def execute + Gitlab::ImportExport::FileImporter.import(archive_file: @archive_file, + shared: @shared) + if check_version! && [project_tree, repo_restorer, wiki_restorer, uploads_restorer].all?(&:restore) + project_tree.restored_project + else + raise Projects::ImportService::Error.new(@shared.errors.join(', ')) + end + end + + private + + def check_version! + Gitlab::ImportExport::VersionChecker.check!(shared: @shared) + end + + def project_tree + @project_tree ||= Gitlab::ImportExport::ProjectTreeRestorer.new(user: @current_user, + shared: @shared, + project: @project) + end + + def repo_restorer + Gitlab::ImportExport::RepoRestorer.new(path_to_bundle: repo_path, + shared: @shared, + project: project_tree.restored_project) + end + + def wiki_restorer + Gitlab::ImportExport::RepoRestorer.new(path_to_bundle: wiki_repo_path, + shared: @shared, + project: ProjectWiki.new(project_tree.restored_project), + wiki: true) + end + + def uploads_restorer + Gitlab::ImportExport::UploadsRestorer.new(project: project_tree.restored_project, shared: @shared) + end + + def path_with_namespace + File.join(@project.namespace.path, @project.path) + end + + def repo_path + File.join(@shared.export_path, 'project.bundle') + end + + def wiki_repo_path + File.join(@shared.export_path, 'project.wiki.bundle') + end + end + end +end diff --git a/lib/gitlab/import_export/members_mapper.rb b/lib/gitlab/import_export/members_mapper.rb new file mode 100644 index 0000000000..c569a35a48 --- /dev/null +++ b/lib/gitlab/import_export/members_mapper.rb @@ -0,0 +1,68 @@ +module Gitlab + module ImportExport + class MembersMapper + + attr_reader :missing_author_ids + + def initialize(exported_members:, user:, project:) + @exported_members = exported_members + @user = user + @project = project + @missing_author_ids = [] + + # This needs to run first, as second call would be from #map + # which means project members already exist. + ensure_default_member! + end + + def map + @map ||= + begin + @exported_members.inject(missing_keys_tracking_hash) do |hash, member| + existing_user = User.where(find_project_user_query(member)).first + old_user_id = member['user']['id'] + if existing_user && add_user_as_team_member(existing_user, member) + hash[old_user_id] = existing_user.id + end + hash + end + end + end + + def default_user_id + @user.id + end + + private + + def missing_keys_tracking_hash + Hash.new do |_, key| + @missing_author_ids << key + default_user_id + end + end + + def ensure_default_member! + ProjectMember.create!(user: @user, access_level: ProjectMember::MASTER, source_id: @project.id, importing: true) + end + + def add_user_as_team_member(existing_user, member) + member['user'] = existing_user + + ProjectMember.create(member_hash(member)).persisted? + end + + def member_hash(member) + member.except('id').merge(source_id: @project.id, importing: true) + end + + def find_project_user_query(member) + user_arel[:username].eq(member['user']['username']).or(user_arel[:email].eq(member['user']['email'])) + end + + def user_arel + @user_arel ||= User.arel_table + end + end + end +end diff --git a/lib/gitlab/import_export/project_creator.rb b/lib/gitlab/import_export/project_creator.rb new file mode 100644 index 0000000000..89388d1984 --- /dev/null +++ b/lib/gitlab/import_export/project_creator.rb @@ -0,0 +1,24 @@ +module Gitlab + module ImportExport + class ProjectCreator + + def initialize(namespace_id, current_user, file, project_path) + @namespace_id = namespace_id + @current_user = current_user + @file = file + @project_path = project_path + end + + def execute + ::Projects::CreateService.new( + @current_user, + name: @project_path, + path: @project_path, + namespace_id: @namespace_id, + import_type: "gitlab_project", + import_source: @file + ).execute + end + end + end +end diff --git a/lib/gitlab/import_export/project_tree_restorer.rb b/lib/gitlab/import_export/project_tree_restorer.rb new file mode 100644 index 0000000000..dd71b92c52 --- /dev/null +++ b/lib/gitlab/import_export/project_tree_restorer.rb @@ -0,0 +1,105 @@ +module Gitlab + module ImportExport + class ProjectTreeRestorer + + def initialize(user:, shared:, project:) + @path = File.join(shared.export_path, 'project.json') + @user = user + @shared = shared + @project = project + end + + def restore + json = IO.read(@path) + @tree_hash = ActiveSupport::JSON.decode(json) + @project_members = @tree_hash.delete('project_members') + create_relations + rescue => e + @shared.error(e) + false + end + + def restored_project + @restored_project ||= restore_project + end + + private + + def members_mapper + @members_mapper ||= Gitlab::ImportExport::MembersMapper.new(exported_members: @project_members, + user: @user, + project: restored_project) + end + + # Loops through the tree of models defined in import_export.yml and + # finds them in the imported JSON so they can be instantiated and saved + # in the DB. The structure and relationships between models are guessed from + # the configuration yaml file too. + # Finally, it updates each attribute in the newly imported project. + def create_relations + saved = [] + default_relation_list.each do |relation| + next unless relation.is_a?(Hash) || @tree_hash[relation.to_s].present? + + create_sub_relations(relation, @tree_hash) if relation.is_a?(Hash) + + relation_key = relation.is_a?(Hash) ? relation.keys.first : relation + relation_hash = create_relation(relation_key, @tree_hash[relation_key.to_s]) + saved << restored_project.update_attribute(relation_key, relation_hash) + end + saved.all? + end + + def default_relation_list + Gitlab::ImportExport::Reader.new(shared: @shared).tree.reject do |model| + model.is_a?(Hash) && model[:project_members] + end + end + + def restore_project + return @project unless @tree_hash + + project_params = @tree_hash.reject { |_key, value| value.is_a?(Array) } + @project.update(project_params) + @project + end + + # Given a relation hash containing one or more models and its relationships, + # loops through each model and each object from a model type and + # and assigns its correspondent attributes hash from +tree_hash+ + # Example: + # +relation_key+ issues, loops through the list of *issues* and for each individual + # issue, finds any subrelations such as notes, creates them and assign them back to the hash + def create_sub_relations(relation, tree_hash) + relation_key = relation.keys.first.to_s + tree_hash[relation_key].each do |relation_item| + relation.values.flatten.each do |sub_relation| + relation_hash, sub_relation = assign_relation_hash(relation_item, sub_relation) + relation_item[sub_relation.to_s] = create_relation(sub_relation, relation_hash) unless relation_hash.blank? + end + end + end + + def assign_relation_hash(relation_item, sub_relation) + if sub_relation.is_a?(Hash) + relation_hash = relation_item[sub_relation.keys.first.to_s] + sub_relation = sub_relation.keys.first + else + relation_hash = relation_item[sub_relation.to_s] + end + [relation_hash, sub_relation] + end + + def create_relation(relation, relation_hash_list) + relation_array = [relation_hash_list].flatten.map do |relation_hash| + Gitlab::ImportExport::RelationFactory.create(relation_sym: relation.to_sym, + relation_hash: relation_hash.merge('project_id' => restored_project.id), + members_mapper: members_mapper, + user: @user) + end + + relation_hash_list.is_a?(Array) ? relation_array : relation_array.first + end + end + end +end diff --git a/lib/gitlab/import_export/project_tree_saver.rb b/lib/gitlab/import_export/project_tree_saver.rb new file mode 100644 index 0000000000..9153088e96 --- /dev/null +++ b/lib/gitlab/import_export/project_tree_saver.rb @@ -0,0 +1,29 @@ +module Gitlab + module ImportExport + class ProjectTreeSaver + attr_reader :full_path + + def initialize(project:, shared:) + @project = project + @shared = shared + @full_path = File.join(@shared.export_path, ImportExport.project_filename) + end + + def save + FileUtils.mkdir_p(@shared.export_path) + + File.write(full_path, project_json_tree) + true + rescue => e + @shared.error(e) + false + end + + private + + def project_json_tree + @project.to_json(Gitlab::ImportExport::Reader.new(shared: @shared).project_tree) + end + end + end +end diff --git a/lib/gitlab/import_export/reader.rb b/lib/gitlab/import_export/reader.rb new file mode 100644 index 0000000000..19defd8f03 --- /dev/null +++ b/lib/gitlab/import_export/reader.rb @@ -0,0 +1,117 @@ +module Gitlab + module ImportExport + class Reader + + attr_reader :tree + + def initialize(shared:) + @shared = shared + config_hash = YAML.load_file(Gitlab::ImportExport.config_file).deep_symbolize_keys + @tree = config_hash[:project_tree] + @attributes_finder = Gitlab::ImportExport::AttributesFinder.new(included_attributes: config_hash[:included_attributes], + excluded_attributes: config_hash[:excluded_attributes], + methods: config_hash[:methods]) + end + + # Outputs a hash in the format described here: http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html + # for outputting a project in JSON format, including its relations and sub relations. + def project_tree + @attributes_finder.find_included(:project).merge(include: build_hash(@tree)) + rescue => e + @shared.error(e) + false + end + + private + + # Builds a hash in the format described here: http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html + # + # +model_list+ - List of models as a relation tree to be included in the generated JSON, from the _import_export.yml_ file + def build_hash(model_list) + model_list.map do |model_objects| + if model_objects.is_a?(Hash) + build_json_config_hash(model_objects) + else + @attributes_finder.find(model_objects) + end + end + end + + # Called when the model is actually a hash containing other relations (more models) + # Returns the config in the right format for calling +to_json+ + # +model_object_hash+ - A model relationship such as: + # {:merge_requests=>[:merge_request_diff, :notes]} + def build_json_config_hash(model_object_hash) + @json_config_hash = {} + + model_object_hash.values.flatten.each do |model_object| + current_key = model_object_hash.keys.first + + @attributes_finder.parse(current_key) { |hash| @json_config_hash[current_key] ||= hash } + + handle_model_object(current_key, model_object) + process_sub_model(current_key, model_object) if model_object.is_a?(Hash) + end + @json_config_hash + end + + + # If the model is a hash, process the sub_models, which could also be hashes + # If there is a list, add to an existing array, otherwise use hash syntax + # +current_key+ main model that will be a key in the hash + # +model_object+ model or list of models to include in the hash + def process_sub_model(current_key, model_object) + sub_model_json = build_json_config_hash(model_object).dup + @json_config_hash.slice!(current_key) + + if @json_config_hash[current_key] && @json_config_hash[current_key][:include] + @json_config_hash[current_key][:include] << sub_model_json + else + @json_config_hash[current_key] = { include: sub_model_json } + end + end + + # Creates or adds to an existing hash an individual model or list + # +current_key+ main model that will be a key in the hash + # +model_object+ model or list of models to include in the hash + def handle_model_object(current_key, model_object) + if @json_config_hash[current_key] + add_model_value(current_key, model_object) + else + create_model_value(current_key, model_object) + end + end + + # Constructs a new hash that will hold the configuration for that particular object + # It may include exceptions or other attribute detail configuration, parsed by +@attributes_finder+ + # +current_key+ main model that will be a key in the hash + # +value+ existing model to be included in the hash + def create_model_value(current_key, value) + parsed_hash = { include: value } + + @attributes_finder.parse(value) do |hash| + parsed_hash = { include: hash_or_merge(value, hash) } + end + @json_config_hash[current_key] = parsed_hash + end + + # Adds new model configuration to an existing hash with key +current_key+ + # It may include exceptions or other attribute detail configuration, parsed by +@attributes_finder+ + # +current_key+ main model that will be a key in the hash + # +value+ existing model to be included in the hash + def add_model_value(current_key, value) + @attributes_finder.parse(value) { |hash| value = { value => hash } } + old_values = @json_config_hash[current_key][:include] + @json_config_hash[current_key][:include] = ([old_values] + [value]).compact.flatten + end + + # Construct a new hash or merge with an existing one a model configuration + # This is to fulfil +to_json+ requirements. + # +value+ existing model to be included in the hash + # +hash+ hash containing configuration generated mainly from +@attributes_finder+ + def hash_or_merge(value, hash) + value.is_a?(Hash) ? value.merge(hash) : { value => hash } + end + end + end +end diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb new file mode 100644 index 0000000000..b872780f20 --- /dev/null +++ b/lib/gitlab/import_export/relation_factory.rb @@ -0,0 +1,128 @@ +module Gitlab + module ImportExport + class RelationFactory + + OVERRIDES = { snippets: :project_snippets, + pipelines: 'Ci::Pipeline', + statuses: 'commit_status', + variables: 'Ci::Variable', + triggers: 'Ci::Trigger', + builds: 'Ci::Build', + hooks: 'ProjectHook' }.freeze + + USER_REFERENCES = %w[author_id assignee_id updated_by_id user_id].freeze + + def self.create(*args) + new(*args).create + end + + def initialize(relation_sym:, relation_hash:, members_mapper:, user:) + @relation_name = OVERRIDES[relation_sym] || relation_sym + @relation_hash = relation_hash.except('id', 'noteable_id') + @members_mapper = members_mapper + @user = user + end + + # Creates an object from an actual model with name "relation_sym" with params from + # the relation_hash, updating references with new object IDs, mapping users using + # the "members_mapper" object, also updating notes if required. + def create + set_note_author if @relation_name == :notes + update_user_references + update_project_references + reset_ci_tokens if @relation_name == 'Ci::Trigger' + + generate_imported_object + end + + private + + def update_user_references + USER_REFERENCES.each do |reference| + if @relation_hash[reference] + @relation_hash[reference] = @members_mapper.map[@relation_hash[reference]] + end + end + end + + # Sets the author for a note. If the user importing the project + # has admin access, an actual mapping with new project members + # will be used. Otherwise, a note stating the original author name + # is left. + def set_note_author + old_author_id = @relation_hash['author_id'] + + # Users with admin access can map users + @relation_hash['author_id'] = admin_user? ? @members_mapper.map[old_author_id] : @members_mapper.default_user_id + + author = @relation_hash.delete('author') + + update_note_for_missing_author(author['name']) if missing_author?(old_author_id) + end + + def missing_author?(old_author_id) + !admin_user? || @members_mapper.missing_author_ids.include?(old_author_id) + end + + def missing_author_note(updated_at, author_name) + timestamp = updated_at.split('.').first + "\n\n *By #{author_name} on #{timestamp} (imported from GitLab project)*" + end + + def generate_imported_object + if @relation_sym == 'commit_status' # call #trace= method after assigning the other attributes + trace = @relation_hash.delete('trace') + imported_object do |object| + object.trace = trace + object.commit_id = nil + end + else + imported_object + end + end + + def update_project_references + project_id = @relation_hash.delete('project_id') + + # project_id may not be part of the export, but we always need to populate it if required. + @relation_hash['project_id'] = project_id if relation_class.column_names.include?('project_id') + @relation_hash['gl_project_id'] = project_id if @relation_hash['gl_project_id'] + @relation_hash['target_project_id'] = project_id if @relation_hash['target_project_id'] + @relation_hash['source_project_id'] = -1 if @relation_hash['source_project_id'] + + # If source and target are the same, populate them with the new project ID. + if @relation_hash['source_project_id'] && @relation_hash['target_project_id'] && + @relation_hash['target_project_id'] == @relation_hash['source_project_id'] + @relation_hash['source_project_id'] = project_id + end + end + + def reset_ci_tokens + return unless Gitlab::ImportExport.reset_tokens? + + # If we import/export a project to the same instance, tokens will have to be reset. + @relation_hash['token'] = nil + end + + def relation_class + @relation_class ||= @relation_name.to_s.classify.constantize + end + + def imported_object + imported_object = relation_class.new(@relation_hash) + yield(imported_object) if block_given? + imported_object.importing = true if imported_object.respond_to?(:importing) + imported_object + end + + def update_note_for_missing_author(author_name) + @relation_hash['note'] = '*Blank note*' if @relation_hash['note'].blank? + @relation_hash['note'] += missing_author_note(@relation_hash['updated_at'], author_name) + end + + def admin_user? + @user.is_admin? + end + end + end +end diff --git a/lib/gitlab/import_export/repo_restorer.rb b/lib/gitlab/import_export/repo_restorer.rb new file mode 100644 index 0000000000..546dae4d12 --- /dev/null +++ b/lib/gitlab/import_export/repo_restorer.rb @@ -0,0 +1,39 @@ +module Gitlab + module ImportExport + class RepoRestorer + include Gitlab::ImportExport::CommandLineUtil + + def initialize(project:, shared:, path_to_bundle:, wiki: false) + @project = project + @path_to_bundle = path_to_bundle + @shared = shared + @wiki = wiki + end + + def restore + return wiki? unless File.exist?(@path_to_bundle) + + FileUtils.mkdir_p(path_to_repo) + + git_unbundle(repo_path: path_to_repo, bundle_path: @path_to_bundle) + rescue => e + @shared.error(e) + false + end + + private + + def repos_path + Gitlab.config.gitlab_shell.repos_path + end + + def path_to_repo + @project.repository.path_to_repo + end + + def wiki? + @wiki + end + end + end +end diff --git a/lib/gitlab/import_export/repo_saver.rb b/lib/gitlab/import_export/repo_saver.rb new file mode 100644 index 0000000000..cce43fe994 --- /dev/null +++ b/lib/gitlab/import_export/repo_saver.rb @@ -0,0 +1,35 @@ +module Gitlab + module ImportExport + class RepoSaver + include Gitlab::ImportExport::CommandLineUtil + + attr_reader :full_path + + def initialize(project:, shared:) + @project = project + @shared = shared + end + + def save + return false if @project.empty_repo? + + @full_path = File.join(@shared.export_path, ImportExport.project_bundle_filename) + bundle_to_disk + end + + private + + def bundle_to_disk + FileUtils.mkdir_p(@shared.export_path) + git_bundle(repo_path: path_to_repo, bundle_path: @full_path) + rescue => e + @shared.error(e) + false + end + + def path_to_repo + @project.repository.path_to_repo + end + end + end +end diff --git a/lib/gitlab/import_export/saver.rb b/lib/gitlab/import_export/saver.rb new file mode 100644 index 0000000000..f38229c6c5 --- /dev/null +++ b/lib/gitlab/import_export/saver.rb @@ -0,0 +1,42 @@ +module Gitlab + module ImportExport + class Saver + include Gitlab::ImportExport::CommandLineUtil + + def self.save(*args) + new(*args).save + end + + def initialize(shared:) + @shared = shared + end + + def save + if compress_and_save + remove_export_path + Rails.logger.info("Saved project export #{archive_file}") + archive_file + else + false + end + rescue => e + @shared.error(e) + false + end + + private + + def compress_and_save + tar_czf(archive: archive_file, dir: @shared.export_path) + end + + def remove_export_path + FileUtils.rm_rf(@shared.export_path) + end + + def archive_file + @archive_file ||= File.join(@shared.export_path, '..', "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_project_export.tar.gz") + end + end + end +end diff --git a/lib/gitlab/import_export/shared.rb b/lib/gitlab/import_export/shared.rb new file mode 100644 index 0000000000..6aff05b886 --- /dev/null +++ b/lib/gitlab/import_export/shared.rb @@ -0,0 +1,30 @@ +module Gitlab + module ImportExport + class Shared + + attr_reader :errors, :opts + + def initialize(opts) + @opts = opts + @errors = [] + end + + def export_path + @export_path ||= Gitlab::ImportExport.export_path(relative_path: opts[:relative_path]) + end + + def error(error) + error_out(error.message, caller[0].dup) + @errors << error.message + # Debug: + Rails.logger.error(error.backtrace) + end + + private + + def error_out(message, caller) + Rails.logger.error("Import/Export error raised on #{caller}: #{message}") + end + end + end +end diff --git a/lib/gitlab/import_export/uploads_restorer.rb b/lib/gitlab/import_export/uploads_restorer.rb new file mode 100644 index 0000000000..df19354b76 --- /dev/null +++ b/lib/gitlab/import_export/uploads_restorer.rb @@ -0,0 +1,14 @@ +module Gitlab + module ImportExport + class UploadsRestorer < UploadsSaver + def restore + return true unless File.directory?(uploads_export_path) + + copy_files(uploads_export_path, uploads_path) + rescue => e + @shared.error(e) + false + end + end + end +end diff --git a/lib/gitlab/import_export/uploads_saver.rb b/lib/gitlab/import_export/uploads_saver.rb new file mode 100644 index 0000000000..7292e9d971 --- /dev/null +++ b/lib/gitlab/import_export/uploads_saver.rb @@ -0,0 +1,36 @@ +module Gitlab + module ImportExport + class UploadsSaver + + def initialize(project:, shared:) + @project = project + @shared = shared + end + + def save + return true unless File.directory?(uploads_path) + + copy_files(uploads_path, uploads_export_path) + rescue => e + @shared.error(e) + false + end + + private + + def copy_files(source, destination) + FileUtils.mkdir_p(destination) + FileUtils.copy_entry(source, destination) + true + end + + def uploads_export_path + File.join(@shared.export_path, 'uploads') + end + + def uploads_path + File.join(Rails.root.join('public/uploads'), @project.path_with_namespace) + end + end + end +end diff --git a/lib/gitlab/import_export/version_checker.rb b/lib/gitlab/import_export/version_checker.rb new file mode 100644 index 0000000000..cf5c62c5e3 --- /dev/null +++ b/lib/gitlab/import_export/version_checker.rb @@ -0,0 +1,36 @@ +module Gitlab + module ImportExport + class VersionChecker + + def self.check!(*args) + new(*args).check! + end + + def initialize(shared:) + @shared = shared + end + + def check! + version = File.open(version_file, &:readline) + verify_version!(version) + rescue => e + @shared.error(e) + false + end + + private + + def version_file + File.join(@shared.export_path, Gitlab::ImportExport.version_filename) + end + + def verify_version!(version) + if Gem::Version.new(version) > Gem::Version.new(Gitlab::ImportExport.version) + raise Gitlab::ImportExport::Error("Import version mismatch: Required <= #{Gitlab::ImportExport.version} but was #{version}") + else + true + end + end + end + end +end diff --git a/lib/gitlab/import_export/version_saver.rb b/lib/gitlab/import_export/version_saver.rb new file mode 100644 index 0000000000..f7f73dc934 --- /dev/null +++ b/lib/gitlab/import_export/version_saver.rb @@ -0,0 +1,25 @@ +module Gitlab + module ImportExport + class VersionSaver + + def initialize(shared:) + @shared = shared + end + + def save + FileUtils.mkdir_p(@shared.export_path) + + File.write(version_file, Gitlab::ImportExport.version, mode: 'w') + rescue => e + @shared.error(e) + false + end + + private + + def version_file + File.join(@shared.export_path, Gitlab::ImportExport.version_filename) + end + end + end +end diff --git a/lib/gitlab/import_export/wiki_repo_saver.rb b/lib/gitlab/import_export/wiki_repo_saver.rb new file mode 100644 index 0000000000..1eedae39f8 --- /dev/null +++ b/lib/gitlab/import_export/wiki_repo_saver.rb @@ -0,0 +1,33 @@ +module Gitlab + module ImportExport + class WikiRepoSaver < RepoSaver + def save + @wiki = ProjectWiki.new(@project) + return true unless wiki_repository_exists? # it's okay to have no Wiki + bundle_to_disk(File.join(@shared.export_path, project_filename)) + end + + def bundle_to_disk(full_path) + FileUtils.mkdir_p(@shared.export_path) + git_bundle(repo_path: path_to_repo, bundle_path: full_path) + rescue => e + @shared.error(e) + false + end + + private + + def project_filename + "project.wiki.bundle" + end + + def path_to_repo + @wiki.repository.path_to_repo + end + + def wiki_repository_exists? + File.exist?(@wiki.repository.path_to_repo) && !@wiki.repository.empty? + end + end + end +end diff --git a/lib/gitlab/import_sources.rb b/lib/gitlab/import_sources.rb index ccfdfbe73e..948d43582c 100644 --- a/lib/gitlab/import_sources.rb +++ b/lib/gitlab/import_sources.rb @@ -20,7 +20,8 @@ module Gitlab 'Gitorious.org' => 'gitorious', 'Google Code' => 'google_code', 'FogBugz' => 'fogbugz', - 'Any repo by URL' => 'git', + 'Repo by URL' => 'git', + 'GitLab export' => 'gitlab_project' } end diff --git a/lib/gitlab/lfs/response.rb b/lib/gitlab/lfs/response.rb index 9d9617761b..e3ed2f6791 100644 --- a/lib/gitlab/lfs/response.rb +++ b/lib/gitlab/lfs/response.rb @@ -2,10 +2,11 @@ module Gitlab module Lfs class Response - def initialize(project, user, request) + def initialize(project, user, ci, request) @origin_project = project @project = storage_project(project) @user = user + @ci = ci @env = request.env @request = request end @@ -189,7 +190,7 @@ module Gitlab return render_not_enabled unless Gitlab.config.lfs.enabled unless @project.public? - return render_unauthorized unless @user + return render_unauthorized unless @user || @ci return render_forbidden unless user_can_fetch? end @@ -210,7 +211,7 @@ module Gitlab def user_can_fetch? # Check user access against the project they used to initiate the pull - @user.can?(:download_code, @origin_project) + @ci || @user.can?(:download_code, @origin_project) end def user_can_push? diff --git a/lib/gitlab/lfs/router.rb b/lib/gitlab/lfs/router.rb index 78d0289110..69bd5e6230 100644 --- a/lib/gitlab/lfs/router.rb +++ b/lib/gitlab/lfs/router.rb @@ -1,9 +1,12 @@ module Gitlab module Lfs class Router - def initialize(project, user, request) + attr_reader :project, :user, :ci, :request + + def initialize(project, user, ci, request) @project = project @user = user + @ci = ci @env = request.env @request = request end @@ -80,7 +83,7 @@ module Gitlab def lfs return unless @project - Gitlab::Lfs::Response.new(@project, @user, @request) + Gitlab::Lfs::Response.new(@project, @user, @ci, @request) end def sanitize_tmp_filename(name) diff --git a/lib/gitlab/metrics/instrumentation.rb b/lib/gitlab/metrics/instrumentation.rb index d81d26754f..dcec7543c1 100644 --- a/lib/gitlab/metrics/instrumentation.rb +++ b/lib/gitlab/metrics/instrumentation.rb @@ -148,23 +148,8 @@ module Gitlab proxy_module.class_eval <<-EOF, __FILE__, __LINE__ + 1 def #{name}(#{args_signature}) - trans = Gitlab::Metrics::Instrumentation.transaction - - if trans - start = Time.now - cpu_start = Gitlab::Metrics::System.cpu_time - retval = super - duration = (Time.now - start) * 1000.0 - - if duration >= Gitlab::Metrics.method_call_threshold - cpu_duration = Gitlab::Metrics::System.cpu_time - cpu_start - - trans.add_metric(Gitlab::Metrics::Instrumentation::SERIES, - { duration: duration, cpu_duration: cpu_duration }, - method: #{label.inspect}) - end - - retval + if trans = Gitlab::Metrics::Instrumentation.transaction + trans.measure_method(#{label.inspect}) { super } else super end diff --git a/lib/gitlab/metrics/method_call.rb b/lib/gitlab/metrics/method_call.rb new file mode 100644 index 0000000000..faf0d9b631 --- /dev/null +++ b/lib/gitlab/metrics/method_call.rb @@ -0,0 +1,52 @@ +module Gitlab + module Metrics + # Class for tracking timing information about method calls + class MethodCall + attr_reader :real_time, :cpu_time, :call_count + + # name - The full name of the method (including namespace) such as + # `User#sign_in`. + # + # series - The series to use for storing the data. + def initialize(name, series) + @name = name + @series = series + @real_time = 0.0 + @cpu_time = 0.0 + @call_count = 0 + end + + # Measures the real and CPU execution time of the supplied block. + def measure + start_real = Time.now + start_cpu = System.cpu_time + retval = yield + + @real_time += (Time.now - start_real) * 1000.0 + @cpu_time += System.cpu_time.to_f - start_cpu + @call_count += 1 + + retval + end + + # Returns a Metric instance of the current method call. + def to_metric + Metric.new( + @series, + { + duration: real_time, + cpu_duration: cpu_time, + call_count: call_count + }, + method: @name + ) + end + + # Returns true if the total runtime of this method exceeds the method call + # threshold. + def above_threshold? + real_time >= Metrics.method_call_threshold + end + end + end +end diff --git a/lib/gitlab/metrics/rack_middleware.rb b/lib/gitlab/metrics/rack_middleware.rb index 3fe27779d0..e61670f491 100644 --- a/lib/gitlab/metrics/rack_middleware.rb +++ b/lib/gitlab/metrics/rack_middleware.rb @@ -35,7 +35,7 @@ module Gitlab def transaction_from_env(env) trans = Transaction.new - trans.set(:request_uri, env['REQUEST_URI']) + trans.set(:request_uri, filtered_path(env)) trans.set(:request_method, env['REQUEST_METHOD']) trans @@ -54,6 +54,10 @@ module Gitlab private + def filtered_path(env) + ActionDispatch::Request.new(env).filtered_path.presence || env['REQUEST_URI'] + end + def endpoint_paths_cache @endpoint_paths_cache ||= Hash.new do |hash, http_method| hash[http_method] = Hash.new do |inner_hash, raw_path| diff --git a/lib/gitlab/metrics/transaction.rb b/lib/gitlab/metrics/transaction.rb index 2578ddc49f..4bc5081aa0 100644 --- a/lib/gitlab/metrics/transaction.rb +++ b/lib/gitlab/metrics/transaction.rb @@ -4,7 +4,7 @@ module Gitlab class Transaction THREAD_KEY = :_gitlab_metrics_transaction - attr_reader :tags, :values + attr_reader :tags, :values, :methods attr_accessor :action @@ -16,6 +16,7 @@ module Gitlab # plus method name. def initialize(action = nil) @metrics = [] + @methods = {} @started_at = nil @finished_at = nil @@ -51,9 +52,23 @@ module Gitlab end def add_metric(series, values, tags = {}) - prefix = sidekiq? ? 'sidekiq_' : 'rails_' + @metrics << Metric.new("#{series_prefix}#{series}", values, tags) + end - @metrics << Metric.new("#{prefix}#{series}", values, tags) + # Measures the time it takes to execute a method. + # + # Multiple calls to the same method add up to the total runtime of the + # method. + # + # name - The full name of the method to measure (e.g. `User#sign_in`). + def measure_method(name, &block) + unless @methods[name] + series = "#{series_prefix}#{Instrumentation::SERIES}" + + @methods[name] = MethodCall.new(name, series) + end + + @methods[name].measure(&block) end def increment(name, value) @@ -84,7 +99,13 @@ module Gitlab end def submit - metrics = @metrics.map do |metric| + submit = @metrics.dup + + @methods.each do |name, method| + submit << method.to_metric if method.above_threshold? + end + + submit_hashes = submit.map do |metric| hash = metric.to_hash hash[:tags][:action] ||= @action if @action @@ -92,12 +113,16 @@ module Gitlab hash end - Metrics.submit_metrics(metrics) + Metrics.submit_metrics(submit_hashes) end def sidekiq? Sidekiq.server? end + + def series_prefix + sidekiq? ? 'sidekiq_' : 'rails_' + end end end end diff --git a/lib/gitlab/template/base_template.rb b/lib/gitlab/template/base_template.rb new file mode 100644 index 0000000000..760ff3e614 --- /dev/null +++ b/lib/gitlab/template/base_template.rb @@ -0,0 +1,67 @@ +module Gitlab + module Template + class BaseTemplate + def initialize(path) + @path = path + end + + def name + File.basename(@path, self.class.extension) + end + + def content + File.read(@path) + end + + class << self + def all + self.categories.keys.flat_map { |cat| by_category(cat) } + end + + def find(key) + file_name = "#{key}#{self.extension}" + + directory = select_directory(file_name) + directory ? new(File.join(category_directory(directory), file_name)) : nil + end + + def categories + raise NotImplementedError + end + + def extension + raise NotImplementedError + end + + def base_dir + raise NotImplementedError + end + + def by_category(category) + templates_for_directory(category_directory(category)) + end + + def category_directory(category) + File.join(base_dir, categories[category]) + end + + private + + def select_directory(file_name) + categories.keys.find do |category| + File.exist?(File.join(category_directory(category), file_name)) + end + end + + def templates_for_directory(dir) + dir << '/' unless dir.end_with?('/') + Dir.glob(File.join(dir, "*#{self.extension}")).select { |f| f =~ filter_regex }.map { |f| new(f) } + end + + def filter_regex + @filter_reges ||= /#{Regexp.escape(extension)}\z/ + end + end + end + end +end diff --git a/lib/gitlab/template/gitignore.rb b/lib/gitlab/template/gitignore.rb new file mode 100644 index 0000000000..964fbfd4de --- /dev/null +++ b/lib/gitlab/template/gitignore.rb @@ -0,0 +1,22 @@ +module Gitlab + module Template + class Gitignore < BaseTemplate + class << self + def extension + '.gitignore' + end + + def categories + { + "Languages" => '', + "Global" => 'Global' + } + end + + def base_dir + Rails.root.join('vendor/gitignore') + end + end + end + end +end diff --git a/lib/gitlab/template/gitlab_ci_yml.rb b/lib/gitlab/template/gitlab_ci_yml.rb new file mode 100644 index 0000000000..7f480fe33c --- /dev/null +++ b/lib/gitlab/template/gitlab_ci_yml.rb @@ -0,0 +1,27 @@ +module Gitlab + module Template + class GitlabCiYml < BaseTemplate + def content + explanation = "# This file is a template, and might need editing before it works on your project." + [explanation, super].join("\n") + end + + class << self + def extension + '.gitlab-ci.yml' + end + + def categories + { + "General" => '', + "Pages" => 'Pages' + } + end + + def base_dir + Rails.root.join('vendor/gitlab-ci-yml') + end + end + end + end +end diff --git a/lib/tasks/gitlab/update_gitignore.rake b/lib/tasks/gitlab/update_gitignore.rake deleted file mode 100644 index 4fd48cccb1..0000000000 --- a/lib/tasks/gitlab/update_gitignore.rake +++ /dev/null @@ -1,46 +0,0 @@ -namespace :gitlab do - desc "GitLab | Update gitignore" - task :update_gitignore do - unless clone_gitignores - puts "Cloning the gitignores failed".color(:red) - return - end - - remove_unneeded_files(gitignore_directory) - remove_unneeded_files(global_directory) - - puts "Done".color(:green) - end - - def clone_gitignores - FileUtils.rm_rf(gitignore_directory) if Dir.exist?(gitignore_directory) - FileUtils.cd vendor_directory - - system('git clone --depth=1 --branch=master https://github.com/github/gitignore.git') - end - - # Retain only certain files: - # - The LICENSE, because we have to - # - The sub dir global - # - The gitignores themself - # - Dir.entires returns also the entries '.' and '..' - def remove_unneeded_files(path) - Dir.foreach(path) do |file| - FileUtils.rm_rf(File.join(path, file)) unless file =~ /(\.{1,2}|LICENSE|Global|\.gitignore)\z/ - end - end - - private - - def vendor_directory - Rails.root.join('vendor') - end - - def gitignore_directory - File.join(vendor_directory, 'gitignore') - end - - def global_directory - File.join(gitignore_directory, 'Global') - end -end diff --git a/lib/tasks/gitlab/update_templates.rake b/lib/tasks/gitlab/update_templates.rake new file mode 100644 index 0000000000..4f76dad728 --- /dev/null +++ b/lib/tasks/gitlab/update_templates.rake @@ -0,0 +1,54 @@ +namespace :gitlab do + desc "GitLab | Update templates" + task :update_templates do + TEMPLATE_DATA.each { |template| update(template) } + end + + def update(template) + sub_dir = template.repo_url.match(/([a-z-]+)\.git\z/)[1] + dir = File.join(vendor_directory, sub_dir) + + unless clone_repository(template.repo_url, dir) + puts "Cloning the #{sub_dir} templates failed".red + return + end + + remove_unneeded_files(dir, template.cleanup_regex) + puts "Done".green + end + + def clone_repository(url, directory) + FileUtils.rm_rf(directory) if Dir.exist?(directory) + + system("git clone #{url} --depth=1 --branch=master #{directory}") + end + + # Retain only certain files: + # - The LICENSE, because we have to + # - The sub dirs so we can organise the file by category + # - The templates themself + # - Dir.entries returns also the entries '.' and '..' + def remove_unneeded_files(directory, regex) + Dir.foreach(directory) do |file| + FileUtils.rm_rf(File.join(directory, file)) unless file =~ regex + end + end + + private + + Template = Struct.new(:repo_url, :cleanup_regex) + TEMPLATE_DATA = [ + Template.new( + "https://github.com/github/gitignore.git", + /(\.{1,2}|LICENSE|Global|\.gitignore)\z/ + ), + Template.new( + "https://gitlab.com/gitlab-org/gitlab-ci-yml.git", + /(\.{1,2}|LICENSE|Pages|\.gitlab-ci.yml)\z/ + ) + ] + + def vendor_directory + Rails.root.join('vendor') + end +end diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 186239d309..ff5b391627 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -30,4 +30,75 @@ describe ApplicationController do controller.send(:check_password_expiration) end end + + describe "#authenticate_user_from_token!" do + describe "authenticating a user from a private token" do + controller(ApplicationController) do + def index + render text: "authenticated" + end + end + + let(:user) { create(:user) } + + context "when the 'private_token' param is populated with the private token" do + it "logs the user in" do + get :index, private_token: user.private_token + expect(response.status).to eq(200) + expect(response.body).to eq("authenticated") + end + end + + + context "when the 'PRIVATE-TOKEN' header is populated with the private token" do + it "logs the user in" do + @request.headers['PRIVATE-TOKEN'] = user.private_token + get :index + expect(response.status).to eq(200) + expect(response.body).to eq("authenticated") + end + end + + it "doesn't log the user in otherwise" do + @request.headers['PRIVATE-TOKEN'] = "token" + get :index, private_token: "token", authenticity_token: "token" + expect(response.status).not_to eq(200) + expect(response.body).not_to eq("authenticated") + end + end + + describe "authenticating a user from a personal access token" do + controller(ApplicationController) do + def index + render text: 'authenticated' + end + end + + let(:user) { create(:user) } + let(:personal_access_token) { create(:personal_access_token, user: user) } + + context "when the 'personal_access_token' param is populated with the personal access token" do + it "logs the user in" do + get :index, private_token: personal_access_token.token + expect(response.status).to eq(200) + expect(response.body).to eq('authenticated') + end + end + + context "when the 'PERSONAL_ACCESS_TOKEN' header is populated with the personal access token" do + it "logs the user in" do + @request.headers["PRIVATE-TOKEN"] = personal_access_token.token + get :index + expect(response.status).to eq(200) + expect(response.body).to eq('authenticated') + end + end + + it "doesn't log the user in otherwise" do + get :index, private_token: "token" + expect(response.status).not_to eq(200) + expect(response.body).not_to eq('authenticated') + end + end + end end diff --git a/spec/controllers/groups/notification_settings_controller_spec.rb b/spec/controllers/groups/notification_settings_controller_spec.rb deleted file mode 100644 index 0786e45515..0000000000 --- a/spec/controllers/groups/notification_settings_controller_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -require 'spec_helper' - -describe Groups::NotificationSettingsController do - let(:group) { create(:group) } - let(:user) { create(:user) } - - describe '#update' do - context 'when not authorized' do - it 'redirects to sign in page' do - put :update, - group_id: group.to_param, - notification_setting: { level: :participating } - - expect(response).to redirect_to(new_user_session_path) - end - end - - context 'when authorized' do - before do - sign_in(user) - end - - it 'returns success' do - put :update, - group_id: group.to_param, - notification_setting: { level: :participating } - - expect(response.status).to eq 200 - end - end - end -end diff --git a/spec/controllers/notification_settings_controller_spec.rb b/spec/controllers/notification_settings_controller_spec.rb new file mode 100644 index 0000000000..15d155833b --- /dev/null +++ b/spec/controllers/notification_settings_controller_spec.rb @@ -0,0 +1,125 @@ +require 'spec_helper' + +describe NotificationSettingsController do + let(:project) { create(:empty_project) } + let(:user) { create(:user) } + + before do + project.team << [user, :developer] + end + + describe '#create' do + context 'when not authorized' do + it 'redirects to sign in page' do + post :create, + project: { id: project.id }, + notification_setting: { level: :participating } + + expect(response).to redirect_to(new_user_session_path) + end + end + + context 'when authorized' do + before do + sign_in(user) + end + + it 'returns success' do + post :create, + project: { id: project.id }, + notification_setting: { level: :participating } + + expect(response.status).to eq 200 + end + + context 'and setting custom notification setting' do + let(:custom_events) do + events = {} + + NotificationSetting::EMAIL_EVENTS.each do |event| + events[event] = "true" + end + end + + it 'returns success' do + post :create, + project: { id: project.id }, + notification_setting: { level: :participating, events: custom_events } + + expect(response.status).to eq 200 + end + end + end + + context 'not authorized' do + let(:private_project) { create(:project, :private) } + before { sign_in(user) } + + it 'returns 404' do + post :create, + project: { id: private_project.id }, + notification_setting: { level: :participating } + + expect(response.status).to eq(404) + end + end + end + + describe '#update' do + let(:notification_setting) { user.global_notification_setting } + + context 'when not authorized' do + it 'redirects to sign in page' do + put :update, + id: notification_setting, + notification_setting: { level: :participating } + + expect(response).to redirect_to(new_user_session_path) + end + end + + context 'when authorized' do + before{ sign_in(user) } + + it 'returns success' do + put :update, + id: notification_setting, + notification_setting: { level: :participating } + + expect(response.status).to eq 200 + end + + context 'and setting custom notification setting' do + let(:custom_events) do + events = {} + + NotificationSetting::EMAIL_EVENTS.each do |event| + events[event] = "true" + end + end + + it 'returns success' do + put :update, + id: notification_setting, + notification_setting: { level: :participating, events: custom_events } + + expect(response.status).to eq 200 + end + end + end + + context 'not authorized' do + let(:other_user) { create(:user) } + + before { sign_in(other_user) } + + it 'returns 404' do + put :update, + id: notification_setting, + notification_setting: { level: :participating } + + expect(response.status).to eq(404) + end + end + end +end diff --git a/spec/controllers/profiles/accounts_controller_spec.rb b/spec/controllers/profiles/accounts_controller_spec.rb new file mode 100644 index 0000000000..4eafc11aba --- /dev/null +++ b/spec/controllers/profiles/accounts_controller_spec.rb @@ -0,0 +1,26 @@ +require 'spec_helper' + +describe Profiles::AccountsController do + + let(:user) { create(:omniauth_user, provider: 'saml') } + + before do + sign_in(user) + end + + it 'does not allow to unlink SAML connected account' do + identity = user.identities.last + delete :unlink, provider: 'saml' + updated_user = User.find(user.id) + + expect(response.status).to eq(302) + expect(updated_user.identities.size).to eq(1) + expect(updated_user.identities).to include(identity) + end + + it 'does allow to delete other linked accounts' do + user.identities.create(provider: 'twitter', extern_uid: 'twitter_123') + + expect { delete :unlink, provider: 'twitter' }.to change(Identity.all, :size).by(-1) + end +end diff --git a/spec/controllers/projects/notification_settings_controller_spec.rb b/spec/controllers/projects/notification_settings_controller_spec.rb deleted file mode 100644 index c5d17d97ec..0000000000 --- a/spec/controllers/projects/notification_settings_controller_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'spec_helper' - -describe Projects::NotificationSettingsController do - let(:project) { create(:empty_project) } - let(:user) { create(:user) } - - before do - project.team << [user, :developer] - end - - describe '#update' do - context 'when not authorized' do - it 'redirects to sign in page' do - put :update, - namespace_id: project.namespace.to_param, - project_id: project.to_param, - notification_setting: { level: :participating } - - expect(response).to redirect_to(new_user_session_path) - end - end - - context 'when authorized' do - before do - sign_in(user) - end - - it 'returns success' do - put :update, - namespace_id: project.namespace.to_param, - project_id: project.to_param, - notification_setting: { level: :participating } - - expect(response.status).to eq 200 - end - end - - context 'not authorized' do - let(:private_project) { create(:project, :private) } - before { sign_in(user) } - - it 'returns 404' do - put :update, - namespace_id: private_project.namespace.to_param, - project_id: private_project.to_param, - notification_setting: { level: :participating } - - expect(response.status).to eq(404) - end - end - end -end diff --git a/spec/controllers/projects/todo_controller_spec.rb b/spec/controllers/projects/todo_controller_spec.rb new file mode 100644 index 0000000000..40a3403b66 --- /dev/null +++ b/spec/controllers/projects/todo_controller_spec.rb @@ -0,0 +1,102 @@ +require('spec_helper') + +describe Projects::TodosController do + let(:user) { create(:user) } + let(:project) { create(:project) } + let(:issue) { create(:issue, project: project) } + let(:merge_request) { create(:merge_request, source_project: project) } + + context 'Issues' do + describe 'POST create' do + context 'when authorized' do + before do + sign_in(user) + project.team << [user, :developer] + end + + it 'should create todo for issue' do + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: issue.id, + issuable_type: 'issue') + end.to change { user.todos.count }.by(1) + + expect(response.status).to eq(200) + end + end + + context 'when not authorized' do + it 'should not create todo for issue that user has no access to' do + sign_in(user) + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: issue.id, + issuable_type: 'issue') + end.to change { user.todos.count }.by(0) + + expect(response.status).to eq(404) + end + + it 'should not create todo for issue when user not logged in' do + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: issue.id, + issuable_type: 'issue') + end.to change { user.todos.count }.by(0) + + expect(response.status).to eq(302) + end + end + end + end + + context 'Merge Requests' do + describe 'POST create' do + context 'when authorized' do + before do + sign_in(user) + project.team << [user, :developer] + end + + it 'should create todo for merge request' do + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: merge_request.id, + issuable_type: 'merge_request') + end.to change { user.todos.count }.by(1) + + expect(response.status).to eq(200) + end + end + + context 'when not authorized' do + it 'should not create todo for merge request user has no access to' do + sign_in(user) + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: merge_request.id, + issuable_type: 'merge_request') + end.to change { user.todos.count }.by(0) + + expect(response.status).to eq(404) + end + + it 'should not create todo for merge request user has no access to' do + expect do + post(:create, namespace_id: project.namespace.path, + project_id: project.path, + issuable_id: merge_request.id, + issuable_type: 'merge_request') + end.to change { user.todos.count }.by(0) + + expect(response.status).to eq(302) + end + end + end + end +end diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index fba545560c..146b2c2e13 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -237,4 +237,24 @@ describe ProjectsController do expect(response.status).to eq(401) end end + + describe "GET refs" do + it "should get a list of branches and tags" do + get :refs, namespace_id: public_project.namespace.path, id: public_project.path + + parsed_body = JSON.parse(response.body) + expect(parsed_body["Branches"]).to include("master") + expect(parsed_body["Tags"]).to include("v1.0.0") + expect(parsed_body["Commits"]).to be_nil + end + + it "should get a list of branches, tags and commits" do + get :refs, namespace_id: public_project.namespace.path, id: public_project.path, ref: "123456" + + parsed_body = JSON.parse(response.body) + expect(parsed_body["Branches"]).to include("master") + expect(parsed_body["Tags"]).to include("v1.0.0") + expect(parsed_body["Commits"]).to include("123456") + end + end end diff --git a/spec/factories/ci/commits.rb b/spec/factories/ci/pipelines.rb similarity index 100% rename from spec/factories/ci/commits.rb rename to spec/factories/ci/pipelines.rb diff --git a/spec/factories/personal_access_tokens.rb b/spec/factories/personal_access_tokens.rb new file mode 100644 index 0000000000..da4c72bcb5 --- /dev/null +++ b/spec/factories/personal_access_tokens.rb @@ -0,0 +1,9 @@ +FactoryGirl.define do + factory :personal_access_token do + user + token { SecureRandom.hex(50) } + name { FFaker::Product.brand } + revoked false + expires_at { 5.days.from_now } + end +end diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index 9499cd4e02..2d297776cb 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -60,6 +60,40 @@ describe "Admin Runners" do it { expect(page).to have_content(@project1.name_with_namespace) } it { expect(page).not_to have_content(@project2.name_with_namespace) } end + + describe 'enable/create' do + before do + @project1.runners << runner + visit admin_runner_path(runner) + end + + it 'enables specific runner for project' do + within '.unassigned-projects' do + click_on 'Enable' + end + + assigned_project = page.find('.assigned-projects') + + expect(assigned_project).to have_content(@project2.path) + end + end + + describe 'disable/destroy' do + before do + @project1.runners << runner + visit admin_runner_path(runner) + end + + it 'enables specific runner for project' do + within '.assigned-projects' do + click_on 'Disable' + end + + new_runner_project = page.find('.unassigned-projects') + + expect(new_runner_project).to have_content(@project1.path) + end + end end describe 'runners registration token' do diff --git a/spec/features/container_registry_spec.rb b/spec/features/container_registry_spec.rb index 53b4f02711..203e55a36f 100644 --- a/spec/features/container_registry_spec.rb +++ b/spec/features/container_registry_spec.rb @@ -26,7 +26,8 @@ describe "Container Registry" do end context 'when there are tags' do - it { expect(page).to have_content(tag_name)} + it { expect(page).to have_content(tag_name) } + it { expect(page).to have_content('d7a513a66') } end end diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 40fea5211e..7fb28f4174 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -20,7 +20,7 @@ feature 'Environments', feature: true do context 'without environments' do scenario 'does show no environments' do - expect(page).to have_content('No environments to show') + expect(page).to have_content('You don\'t have any environments right now.') end end @@ -61,7 +61,7 @@ feature 'Environments', feature: true do context 'without deployments' do scenario 'does show no deployments' do - expect(page).to have_content('No deployments for') + expect(page).to have_content('You don\'t have any deployments right now.') end end @@ -108,7 +108,7 @@ feature 'Environments', feature: true do end scenario 'does create a new pipeline' do - expect(page).to have_content('production') + expect(page).to have_content('Production') end end diff --git a/spec/features/issues/bulk_assigment_labels_spec.rb b/spec/features/issues/bulk_assignment_labels_spec.rb similarity index 97% rename from spec/features/issues/bulk_assigment_labels_spec.rb rename to spec/features/issues/bulk_assignment_labels_spec.rb index 0fbc2062e3..7143d0e40f 100644 --- a/spec/features/issues/bulk_assigment_labels_spec.rb +++ b/spec/features/issues/bulk_assignment_labels_spec.rb @@ -190,7 +190,8 @@ feature 'Issues > Labels bulk assignment', feature: true do end if unmark items.map do |item| - click_link item + # Make sure we are unmarking the item no matter the state it has currently + click_link item until find('a', text: item)[:class] == 'label-item' end end end diff --git a/spec/features/issues/todo_spec.rb b/spec/features/issues/todo_spec.rb index b69cce3e7d..bc0f437a8c 100644 --- a/spec/features/issues/todo_spec.rb +++ b/spec/features/issues/todo_spec.rb @@ -20,6 +20,12 @@ feature 'Manually create a todo item from issue', feature: true, js: true do page.within '.header-content .todos-pending-count' do expect(page).to have_content '1' end + + visit namespace_project_issue_path(project.namespace, project, issue) + + page.within '.header-content .todos-pending-count' do + expect(page).to have_content '1' + end end it 'should mark a todo as done' do @@ -29,5 +35,9 @@ feature 'Manually create a todo item from issue', feature: true, js: true do end expect(page).to have_selector('.todos-pending-count', visible: false) + + visit namespace_project_issue_path(project.namespace, project, issue) + + expect(page).to have_selector('.todos-pending-count', visible: false) end end diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb index 65fe918e2e..c3cb337944 100644 --- a/spec/features/issues_spec.rb +++ b/spec/features/issues_spec.rb @@ -556,10 +556,10 @@ describe 'Issues', feature: true do first('.ui-state-default').click end - expect(page).to have_no_content 'None' + expect(page).to have_no_content 'No due date' click_link 'remove due date' - expect(page).to have_content 'None' + expect(page).to have_content 'No due date' end end end diff --git a/spec/features/profiles/personal_access_tokens_spec.rb b/spec/features/profiles/personal_access_tokens_spec.rb new file mode 100644 index 0000000000..a85930c754 --- /dev/null +++ b/spec/features/profiles/personal_access_tokens_spec.rb @@ -0,0 +1,94 @@ +require 'spec_helper' + +describe 'Profile > Personal Access Tokens', feature: true, js: true do + let(:user) { create(:user) } + + def active_personal_access_tokens + find(".table.active-personal-access-tokens") + end + + def inactive_personal_access_tokens + find(".table.inactive-personal-access-tokens") + end + + def created_personal_access_token + find("#created-personal-access-token").value + end + + def disallow_personal_access_token_saves! + allow_any_instance_of(PersonalAccessToken).to receive(:save).and_return(false) + errors = ActiveModel::Errors.new(PersonalAccessToken.new).tap { |e| e.add(:name, "cannot be nil") } + allow_any_instance_of(PersonalAccessToken).to receive(:errors).and_return(errors) + end + + before do + login_as(user) + end + + describe "token creation" do + it "allows creation of a token" do + visit profile_personal_access_tokens_path + fill_in "Name", with: FFaker::Product.brand + + expect {click_on "Create Personal Access Token"}.to change { PersonalAccessToken.count }.by(1) + expect(created_personal_access_token).to eq(PersonalAccessToken.last.token) + expect(active_personal_access_tokens).to have_text(PersonalAccessToken.last.name) + expect(active_personal_access_tokens).to have_text("Never") + end + + it "allows creation of a token with an expiry date" do + visit profile_personal_access_tokens_path + fill_in "Name", with: FFaker::Product.brand + + # Set date to 1st of next month + find_field("Expires at").trigger('focus') + find("a[title='Next']").click + click_on "1" + + expect {click_on "Create Personal Access Token"}.to change { PersonalAccessToken.count }.by(1) + expect(created_personal_access_token).to eq(PersonalAccessToken.last.token) + expect(active_personal_access_tokens).to have_text(PersonalAccessToken.last.name) + expect(active_personal_access_tokens).to have_text(Date.today.next_month.at_beginning_of_month.to_s(:medium)) + end + + context "when creation fails" do + it "displays an error message" do + disallow_personal_access_token_saves! + visit profile_personal_access_tokens_path + fill_in "Name", with: FFaker::Product.brand + + expect { click_on "Create Personal Access Token" }.not_to change { PersonalAccessToken.count } + expect(page).to have_content("Name cannot be nil") + end + end + end + + describe "inactive tokens" do + let!(:personal_access_token) { create(:personal_access_token, user: user) } + + it "allows revocation of an active token" do + visit profile_personal_access_tokens_path + click_on "Revoke" + + expect(inactive_personal_access_tokens).to have_text(personal_access_token.name) + end + + it "moves expired tokens to the 'inactive' section" do + personal_access_token.update(expires_at: 5.days.ago) + visit profile_personal_access_tokens_path + + expect(inactive_personal_access_tokens).to have_text(personal_access_token.name) + end + + context "when revocation fails" do + it "displays an error message" do + disallow_personal_access_token_saves! + visit profile_personal_access_tokens_path + + expect { click_on "Revoke" }.not_to change { PersonalAccessToken.inactive.count } + expect(active_personal_access_tokens).to have_text(personal_access_token.name) + expect(page).to have_content("Could not revoke") + end + end + end +end diff --git a/spec/features/projects/badges/list_spec.rb b/spec/features/projects/badges/list_spec.rb index 51be81d634..01e90618a9 100644 --- a/spec/features/projects/badges/list_spec.rb +++ b/spec/features/projects/badges/list_spec.rb @@ -1,8 +1,6 @@ require 'spec_helper' feature 'list of badges' do - include Select2Helper - background do user = create(:user) project = create(:project) @@ -24,7 +22,11 @@ feature 'list of badges' do end scenario 'user changes current ref on badges list page', js: true do - select2('improve/awesome', from: '#ref') + first('.js-project-refs-dropdown').click + + page.within '.project-refs-form' do + click_link 'improve/awesome' + end expect(page).to have_content 'badges/improve/awesome/build.svg' end diff --git a/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb new file mode 100644 index 0000000000..d516e8ce55 --- /dev/null +++ b/spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +feature 'User wants to add a .gitlab-ci.yml file', feature: true do + include WaitForAjax + + before do + user = create(:user) + project = create(:project) + project.team << [user, :master] + login_as user + visit namespace_project_new_blob_path(project.namespace, project, 'master', file_name: '.gitlab-ci.yml') + end + + scenario 'user can see .gitlab-ci.yml dropdown' do + expect(page).to have_css('.gitlab-ci-yml-selector') + end + + scenario 'user can pick a template from the dropdown', js: true do + find('.js-gitlab-ci-yml-selector').click + wait_for_ajax + within '.gitlab-ci-yml-selector' do + find('.dropdown-input-field').set('jekyll') + find('.dropdown-content li', text: 'jekyll').click + end + wait_for_ajax + + expect(page).to have_content('This file is a template, and might need editing before it works on your project') + expect(page).to have_content('jekyll build -d test') + end +end diff --git a/spec/features/projects/files/project_owner_creates_license_file_spec.rb b/spec/features/projects/files/project_owner_creates_license_file_spec.rb index ecc818eb1e..e1e105e6bb 100644 --- a/spec/features/projects/files/project_owner_creates_license_file_spec.rb +++ b/spec/features/projects/files/project_owner_creates_license_file_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' feature 'project owner creates a license file', feature: true, js: true do - include Select2Helper + include WaitForAjax let(:project_master) { create(:user) } let(:project) { create(:project) } @@ -21,7 +21,7 @@ feature 'project owner creates a license file', feature: true, js: true do expect(page).to have_selector('.license-selector') - select2('mit', from: '#license_type') + select_template('MIT License') file_content = find('.file-content') expect(file_content).to have_content('The MIT License (MIT)') @@ -44,7 +44,7 @@ feature 'project owner creates a license file', feature: true, js: true do expect(find('#file_name').value).to eq('LICENSE') expect(page).to have_selector('.license-selector') - select2('mit', from: '#license_type') + select_template('MIT License') file_content = find('.file-content') expect(file_content).to have_content('The MIT License (MIT)') @@ -58,4 +58,12 @@ feature 'project owner creates a license file', feature: true, js: true do expect(page).to have_content('The MIT License (MIT)') expect(page).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") end + + def select_template(template) + page.within('.js-license-selector-wrap') do + click_button 'Choose a License template' + click_link template + wait_for_ajax + end + end end diff --git a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb index 34eda29c28..67aac25e42 100644 --- a/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb +++ b/spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' feature 'project owner sees a link to create a license file in empty project', feature: true, js: true do - include Select2Helper + include WaitForAjax let(:project_master) { create(:user) } let(:project) { create(:empty_project) } @@ -20,7 +20,7 @@ feature 'project owner sees a link to create a license file in empty project', f expect(find('#file_name').value).to eq('LICENSE') expect(page).to have_selector('.license-selector') - select2('mit', from: '#license_type') + select_template('MIT License') file_content = find('.file-content') expect(file_content).to have_content('The MIT License (MIT)') @@ -36,4 +36,12 @@ feature 'project owner sees a link to create a license file in empty project', f expect(page).to have_content('The MIT License (MIT)') expect(page).to have_content("Copyright (c) #{Time.now.year} #{project.namespace.human_name}") end + + def select_template(template) + page.within('.js-license-selector-wrap') do + click_button 'Choose a License template' + click_link template + wait_for_ajax + end + end end diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb new file mode 100644 index 0000000000..c5fb0fc783 --- /dev/null +++ b/spec/features/projects/import_export/import_file_spec.rb @@ -0,0 +1,49 @@ +require 'spec_helper' + +feature 'project import', feature: true, js: true do + include Select2Helper + + let(:user) { create(:admin) } + let!(:namespace) { create(:namespace, name: "asd", owner: user) } + let(:file) { File.join(Rails.root, 'spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') } + let(:export_path) { "#{Dir::tmpdir}/import_file_spec" } + let(:project) { Project.last } + + background do + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + login_as(user) + end + + after(:each) do + FileUtils.rm_rf(export_path, secure: true) + end + + scenario 'user imports an exported project successfully' do + expect(Project.all.count).to be_zero + + visit new_project_path + + select2('2', from: '#project_namespace_id') + fill_in :project_path, with:'test-project-path', visible: true + click_link 'GitLab export' + + expect(page).to have_content('GitLab project export') + expect(URI.parse(current_url).query).to eq('namespace_id=2&path=test-project-path') + + attach_file('file', file) + + click_on 'Import project' # import starts + + expect(project).not_to be_nil + expect(project.issues).not_to be_empty + expect(project.merge_requests).not_to be_empty + expect(project.repo_exists?).to be true + expect(wiki_exists?).to be true + expect(project.import_status).to eq('finished') + end + + def wiki_exists? + wiki = ProjectWiki.new(project) + File.exist?(wiki.repository.path_to_repo) && !wiki.repository.empty? + end +end diff --git a/spec/features/projects/import_export/test_project_export.tar.gz b/spec/features/projects/import_export/test_project_export.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1fd04416d959363f9d348438c978330e58d2c704 GIT binary patch literal 345686 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�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

      fEZH* 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 U{U3|=Uthm{Ira;LkO4saKbbZDL;wH) literal 0 HcmV?d00001 diff --git a/spec/features/projects/labels/update_prioritization_spec.rb b/spec/features/projects/labels/update_prioritization_spec.rb index 8550d279d0..6a39c302f5 100644 --- a/spec/features/projects/labels/update_prioritization_spec.rb +++ b/spec/features/projects/labels/update_prioritization_spec.rb @@ -77,6 +77,7 @@ feature 'Prioritize labels', feature: true do end visit current_url + wait_for_ajax page.within('.prioritized-labels') do expect(first('li')).to have_content('wontfix') diff --git a/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb b/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb new file mode 100644 index 0000000000..728c0e1636 --- /dev/null +++ b/spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb @@ -0,0 +1,17 @@ +require 'spec_helper' + +feature 'Projects > Members > Group member cannot leave group project', feature: true do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } + + background do + group.add_developer(user) + login_as(user) + visit namespace_project_path(project.namespace, project) + end + + scenario 'user does not see a "Leave project" link' do + expect(page).not_to have_content 'Leave Project' + end +end diff --git a/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb new file mode 100644 index 0000000000..4d5d656f00 --- /dev/null +++ b/spec/features/projects/members/group_member_cannot_request_access_to_his_group_project_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +feature 'Projects > Members > Group member cannot request access to his group project', feature: true do + let(:user) { create(:user) } + let(:group) { create(:group) } + let(:project) { create(:project, namespace: group) } + + background do + end + + scenario 'owner does not see the request access button' do + group.add_owner(user) + login_and_visit_project_page(user) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'master does not see the request access button' do + group.add_master(user) + login_and_visit_project_page(user) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'developer does not see the request access button' do + group.add_developer(user) + login_and_visit_project_page(user) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'reporter does not see the request access button' do + group.add_reporter(user) + login_and_visit_project_page(user) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'guest does not see the request access button' do + group.add_guest(user) + login_and_visit_project_page(user) + + expect(page).not_to have_content 'Request Access' + end + + def login_and_visit_project_page(user) + login_as(user) + visit namespace_project_path(project.namespace, project) + end +end diff --git a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb new file mode 100644 index 0000000000..c4ed92d278 --- /dev/null +++ b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +feature 'Projects > Members > Group requester cannot request access to project', feature: true do + let(:user) { create(:user) } + let(:owner) { create(:user) } + let(:group) { create(:group, :public) } + let(:project) { create(:project, :public, namespace: group) } + + background do + group.add_owner(owner) + login_as(user) + visit group_path(group) + perform_enqueued_jobs { click_link 'Request Access' } + visit namespace_project_path(project.namespace, project) + end + + scenario 'group requester does not see the request access / withdraw access request button' do + expect(page).not_to have_content 'Request Access' + expect(page).not_to have_content 'Withdraw Access Request' + end +end diff --git a/spec/features/search_spec.rb b/spec/features/search_spec.rb index 029a11ea43..b9e63a7152 100644 --- a/spec/features/search_spec.rb +++ b/spec/features/search_spec.rb @@ -47,4 +47,83 @@ describe "Search", feature: true do expect(page).to have_link(snippet.title) end end + + + describe 'Right header search field', feature: true do + + describe 'Search in project page' do + before do + visit namespace_project_path(project.namespace, project) + end + + it 'top right search form is present' do + expect(page).to have_selector('#search') + end + + it 'top right search form contains location badge' do + expect(page).to have_selector('.has-location-badge') + end + + context 'clicking the search field', js: true do + it 'should show category search dropdown' do + page.find('#search').click + + expect(page).to have_selector('.dropdown-header', text: /#{project.name}/i) + end + end + + context 'click the links in the category search dropdown', js: true do + + before do + page.find('#search').click + end + + it 'should take user to her issues page when issues assigned is clicked' do + find('.dropdown-menu').click_link 'Issues assigned to me' + sleep 2 + + expect(page).to have_selector('.issues-holder') + expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name) + end + + it 'should take user to her issues page when issues authored is clicked' do + find('.dropdown-menu').click_link "Issues I've created" + sleep 2 + + expect(page).to have_selector('.issues-holder') + expect(find('.js-author-search .dropdown-toggle-text')).to have_content(user.name) + end + + it 'should take user to her MR page when MR assigned is clicked' do + find('.dropdown-menu').click_link 'Merge requests assigned to me' + sleep 2 + + expect(page).to have_selector('.merge-requests-holder') + expect(find('.js-assignee-search .dropdown-toggle-text')).to have_content(user.name) + end + + it 'should take user to her MR page when MR authored is clicked' do + find('.dropdown-menu').click_link "Merge requests I've created" + sleep 2 + + expect(page).to have_selector('.merge-requests-holder') + expect(find('.js-author-search .dropdown-toggle-text')).to have_content(user.name) + end + end + + context 'entering text into the search field', js: true do + before do + page.within '.search-input-wrap' do + fill_in "search", with: project.name[0..3] + end + end + + it 'should not display the category search dropdown' do + expect(page).not_to have_selector('.dropdown-header', text: /#{project.name}/i) + end + end + end + end + + end diff --git a/spec/features/todos/todos_spec.rb b/spec/features/todos/todos_spec.rb index 8e1833a069..0bdb1628c7 100644 --- a/spec/features/todos/todos_spec.rb +++ b/spec/features/todos/todos_spec.rb @@ -103,11 +103,15 @@ describe 'Dashboard Todos', feature: true do before do deleted_project = create(:project, visibility_level: Gitlab::VisibilityLevel::PUBLIC, pending_delete: true) create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author) + create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author, state: :done) login_as(user) visit dashboard_todos_path end it 'shows "All done" message' do + within('.todos-pending-count') { expect(page).to have_content '0' } + expect(page).to have_content 'To do 0' + expect(page).to have_content 'Done 0' expect(page).to have_content "You're all done!" end end diff --git a/spec/fixtures/container_registry/tag_manifest.json b/spec/fixtures/container_registry/tag_manifest.json index 1b6008e287..8d1b874c29 100644 --- a/spec/fixtures/container_registry/tag_manifest.json +++ b/spec/fixtures/container_registry/tag_manifest.json @@ -1 +1,16 @@ -{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.v2+json","config":{"mediaType":"application/octet-stream","size":1145,"digest":"sha256:d7a513a663c1a6dcdba9ed832ca53c02ac2af0c333322cd6ca92936d1d9917ac"},"layers":[{"mediaType":"application/vnd.docker.image.rootfs.diff.tar.gzip","size":2319870,"digest":"sha256:420890c9e918b6668faaedd9000e220190f2493b0693ee563ebd7b4cc754a57d"}]} +{ + "schemaVersion": 2, + "mediaType": "application/vnd.docker.distribution.manifest.v2+json", + "config": { + "mediaType": "application/octet-stream", + "size": 1145, + "digest": "sha256:d7a513a663c1a6dcdba9ed832ca53c02ac2af0c333322cd6ca92936d1d9917ac" + }, + "layers": [ + { + "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", + "size": 2319870, + "digest": "sha256:420890c9e918b6668faaedd9000e220190f2493b0693ee563ebd7b4cc754a57d" + } + ] +} diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index f6c1005d26..bb28866f01 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -174,51 +174,6 @@ describe ApplicationHelper do end end - describe 'grouped_options_refs' do - let(:options) { helper.grouped_options_refs } - let(:project) { create(:project) } - - before do - assign(:project, project) - - # Override Rails' grouped_options_for_select helper to just return the - # first argument (`options`), since it's easier to work with than the - # generated HTML. - allow(helper).to receive(:grouped_options_for_select). - and_wrap_original { |_, *args| args.first } - 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' - assign(:ref, ref) - - 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 'simple_sanitize' do let(:a_tag) { 'Foo' } diff --git a/spec/helpers/members_helper_spec.rb b/spec/helpers/members_helper_spec.rb index 0b1a76156e..f75fdb739f 100644 --- a/spec/helpers/members_helper_spec.rb +++ b/spec/helpers/members_helper_spec.rb @@ -9,20 +9,52 @@ describe MembersHelper do it { expect(action_member_permission(:admin, group_member)).to eq :admin_group_member } end - describe '#can_see_member_roles?' do - let(:project) { create(:empty_project) } - let(:group) { create(:group) } - let(:user) { build(:user) } - let(:admin) { build(:user, :admin) } - let(:project_member) { create(:project_member, project: project) } - let(:group_member) { create(:group_member, group: group) } + describe '#default_show_roles' do + let(:user) { double } + let(:member) { build(:project_member) } - it { expect(can_see_member_roles?(source: project, user: nil)).to be_falsy } - it { expect(can_see_member_roles?(source: group, user: nil)).to be_falsy } - it { expect(can_see_member_roles?(source: project, user: admin)).to be_truthy } - it { expect(can_see_member_roles?(source: group, user: admin)).to be_truthy } - it { expect(can_see_member_roles?(source: project, user: project_member.user)).to be_truthy } - it { expect(can_see_member_roles?(source: group, user: group_member.user)).to be_truthy } + before do + allow(helper).to receive(:current_user).and_return(user) + allow(helper).to receive(:can?).with(user, :update_project_member, member).and_return(false) + allow(helper).to receive(:can?).with(user, :destroy_project_member, member).and_return(false) + allow(helper).to receive(:can?).with(user, :admin_project_member, member.source).and_return(false) + end + + context 'when the current cannot update, destroy or admin the passed member' do + it 'returns false' do + expect(helper.default_show_roles(member)).to be_falsy + end + end + + context 'when the current can update the passed member' do + before do + allow(helper).to receive(:can?).with(user, :update_project_member, member).and_return(true) + end + + it 'returns true' do + expect(helper.default_show_roles(member)).to be_truthy + end + end + + context 'when the current can destroy the passed member' do + before do + allow(helper).to receive(:can?).with(user, :destroy_project_member, member).and_return(true) + end + + it 'returns true' do + expect(helper.default_show_roles(member)).to be_truthy + end + end + + context 'when the current can admin the passed member source' do + before do + allow(helper).to receive(:can?).with(user, :admin_project_member, member.source).and_return(true) + end + + it 'returns true' do + expect(helper.default_show_roles(member)).to be_truthy + end + end end describe '#remove_member_message' do diff --git a/spec/helpers/merge_requests_helper_spec.rb b/spec/helpers/merge_requests_helper_spec.rb index a3336c8717..903224589d 100644 --- a/spec/helpers/merge_requests_helper_spec.rb +++ b/spec/helpers/merge_requests_helper_spec.rb @@ -33,9 +33,9 @@ describe MergeRequestsHelper do let(:project) { create(:project) } let(:issues) do [ - JiraIssue.new('JIRA-123', project), - JiraIssue.new('JIRA-456', project), - JiraIssue.new('FOOBAR-7890', project) + ExternalIssue.new('JIRA-123', project), + ExternalIssue.new('JIRA-456', project), + ExternalIssue.new('FOOBAR-7890', project) ] end diff --git a/spec/javascripts/fixtures/search_autocomplete.html.haml b/spec/javascripts/fixtures/search_autocomplete.html.haml new file mode 100644 index 0000000000..7785120da5 --- /dev/null +++ b/spec/javascripts/fixtures/search_autocomplete.html.haml @@ -0,0 +1,10 @@ +.search.search-form.has-location-badge + %form.navbar-form + .search-input-container + %div.location-badge + This project + .search-input-wrap + .dropdown + %input#search.search-input.dropdown-menu-toggle + .dropdown-menu.dropdown-select + .dropdown-content diff --git a/spec/javascripts/notes_spec.js.coffee b/spec/javascripts/notes_spec.js.coffee index dd160e821b..3a3c8d63e8 100644 --- a/spec/javascripts/notes_spec.js.coffee +++ b/spec/javascripts/notes_spec.js.coffee @@ -1,7 +1,7 @@ #= require notes #= require gl_form -window.gon = {} +window.gon or= {} window.disableButtonIfEmptyField = -> null describe 'Notes', -> diff --git a/spec/javascripts/project_title_spec.js.coffee b/spec/javascripts/project_title_spec.js.coffee index 1cf34d4d2d..9be29097f4 100644 --- a/spec/javascripts/project_title_spec.js.coffee +++ b/spec/javascripts/project_title_spec.js.coffee @@ -6,7 +6,7 @@ #= require project_select #= require project -window.gon = {} +window.gon or= {} window.gon.api_version = 'v3' describe 'Project Title', -> diff --git a/spec/javascripts/search_autocomplete_spec.js.coffee b/spec/javascripts/search_autocomplete_spec.js.coffee new file mode 100644 index 0000000000..e77177783a --- /dev/null +++ b/spec/javascripts/search_autocomplete_spec.js.coffee @@ -0,0 +1,149 @@ +#= require gl_dropdown +#= require search_autocomplete +#= require jquery +#= require lib/common_utils +#= require lib/type_utility +#= require fuzzaldrin-plus + + +widget = null +userId = 1 +window.gon or= {} +window.gon.current_user_id = userId + +dashboardIssuesPath = '/dashboard/issues' +dashboardMRsPath = '/dashboard/merge_requests' +projectIssuesPath = '/gitlab-org/gitlab-ce/issues' +projectMRsPath = '/gitlab-org/gitlab-ce/merge_requests' +groupIssuesPath = '/groups/gitlab-org/issues' +groupMRsPath = '/groups/gitlab-org/merge_requests' +projectName = 'GitLab Community Edition' +groupName = 'Gitlab Org' + + +# Add required attributes to body before starting the test. +# section would be dashboard|group|project +addBodyAttributes = (section = 'dashboard') -> + + $body = $ 'body' + + $body.removeAttr 'data-page' + $body.removeAttr 'data-project' + $body.removeAttr 'data-group' + + switch section + when 'dashboard' + $body.data 'page', 'root:index' + when 'group' + $body.data 'page', 'groups:show' + $body.data 'group', 'gitlab-org' + when 'project' + $body.data 'page', 'projects:show' + $body.data 'project', 'gitlab-ce' + + +# Mock `gl` object in window for dashboard specific page. App code will need it. +mockDashboardOptions = -> + + window.gl or= {} + window.gl.dashboardOptions = + issuesPath: dashboardIssuesPath + mrPath : dashboardMRsPath + + +# Mock `gl` object in window for project specific page. App code will need it. +mockProjectOptions = -> + + window.gl or= {} + window.gl.projectOptions = + 'gitlab-ce' : + issuesPath : projectIssuesPath + mrPath : projectMRsPath + projectName : projectName + + +mockGroupOptions = -> + + window.gl or= {} + window.gl.groupOptions = + 'gitlab-org' : + issuesPath : groupIssuesPath + mrPath : groupMRsPath + projectName : groupName + + +assertLinks = (list, issuesPath, mrsPath) -> + + issuesAssignedToMeLink = "#{issuesPath}/?assignee_id=#{userId}" + issuesIHaveCreatedLink = "#{issuesPath}/?author_id=#{userId}" + mrsAssignedToMeLink = "#{mrsPath}/?assignee_id=#{userId}" + mrsIHaveCreatedLink = "#{mrsPath}/?author_id=#{userId}" + + a1 = "a[href='#{issuesAssignedToMeLink}']" + a2 = "a[href='#{issuesIHaveCreatedLink}']" + a3 = "a[href='#{mrsAssignedToMeLink}']" + a4 = "a[href='#{mrsIHaveCreatedLink}']" + + expect(list.find(a1).length).toBe 1 + expect(list.find(a1).text()).toBe ' Issues assigned to me ' + + expect(list.find(a2).length).toBe 1 + expect(list.find(a2).text()).toBe " Issues I've created " + + expect(list.find(a3).length).toBe 1 + expect(list.find(a3).text()).toBe ' Merge requests assigned to me ' + + expect(list.find(a4).length).toBe 1 + expect(list.find(a4).text()).toBe " Merge requests I've created " + + +describe 'Search autocomplete dropdown', -> + + fixture.preload 'search_autocomplete.html' + + beforeEach -> + + fixture.load 'search_autocomplete.html' + widget = new SearchAutocomplete + + + it 'should show Dashboard specific dropdown menu', -> + + addBodyAttributes() + mockDashboardOptions() + widget.searchInput.focus() + + list = widget.wrap.find('.dropdown-menu').find 'ul' + assertLinks list, dashboardIssuesPath, dashboardMRsPath + + + it 'should show Group specific dropdown menu', -> + + addBodyAttributes 'group' + mockGroupOptions() + widget.searchInput.focus() + + list = widget.wrap.find('.dropdown-menu').find 'ul' + assertLinks list, groupIssuesPath, groupMRsPath + + + it 'should show Project specific dropdown menu', -> + + addBodyAttributes 'project' + mockProjectOptions() + widget.searchInput.focus() + + list = widget.wrap.find('.dropdown-menu').find 'ul' + assertLinks list, projectIssuesPath, projectMRsPath + + + it 'should not show category related menu if there is text in the input', -> + + addBodyAttributes 'project' + mockProjectOptions() + widget.searchInput.val 'help' + widget.searchInput.focus() + + list = widget.wrap.find('.dropdown-menu').find 'ul' + link = "a[href='#{projectIssuesPath}/?assignee_id=#{userId}']" + expect(list.find(link).length).toBe 0 diff --git a/spec/lib/banzai/filter/abstract_link_filter_spec.rb b/spec/lib/banzai/filter/abstract_link_filter_spec.rb new file mode 100644 index 0000000000..1ee31a603e --- /dev/null +++ b/spec/lib/banzai/filter/abstract_link_filter_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe Banzai::Filter::AbstractReferenceFilter do + let(:project) { create(:empty_project) } + + describe '#references_per_project' do + it 'returns a Hash containing references grouped per project paths' do + doc = Nokogiri::HTML.fragment("#1 #{project.to_reference}#2") + filter = described_class.new(doc, project: project) + + expect(filter).to receive(:object_class).exactly(4).times.and_return(Issue) + expect(filter).to receive(:object_sym).twice.and_return(:issue) + + refs = filter.references_per_project + + expect(refs).to be_an_instance_of(Hash) + expect(refs[project.to_reference]).to eq(Set.new(%w[1 2])) + end + end + + describe '#projects_per_reference' do + it 'returns a Hash containing projects grouped per project paths' do + doc = Nokogiri::HTML.fragment('') + filter = described_class.new(doc, project: project) + + expect(filter).to receive(:references_per_project). + and_return({ project.path_with_namespace => Set.new(%w[1]) }) + + expect(filter.projects_per_reference). + to eq({ project.path_with_namespace => project }) + end + end + + describe '#find_projects_for_paths' do + it 'returns a list of Projects for a list of paths' do + doc = Nokogiri::HTML.fragment('') + filter = described_class.new(doc, project: project) + + expect(filter.find_projects_for_paths([project.path_with_namespace])). + to eq([project]) + end + end + + describe '#current_project_path' do + it 'returns the path of the current project' do + doc = Nokogiri::HTML.fragment('') + filter = described_class.new(doc, project: project) + + expect(filter.current_project_path).to eq(project.path_with_namespace) + end + end +end diff --git a/spec/lib/banzai/filter/external_link_filter_spec.rb b/spec/lib/banzai/filter/external_link_filter_spec.rb index f4c5c621bd..695a5bc6fd 100644 --- a/spec/lib/banzai/filter/external_link_filter_spec.rb +++ b/spec/lib/banzai/filter/external_link_filter_spec.rb @@ -19,19 +19,31 @@ describe Banzai::Filter::ExternalLinkFilter, lib: true do expect(filter(act).to_html).to eq exp end - it 'adds rel="nofollow" to external links' do - act = %q(Google) - doc = filter(act) + context 'for root links on document' do + let(:doc) { filter %q(Google) } - expect(doc.at_css('a')).to have_attribute('rel') - expect(doc.at_css('a')['rel']).to include 'nofollow' + it 'adds rel="nofollow" to external links' do + expect(doc.at_css('a')).to have_attribute('rel') + expect(doc.at_css('a')['rel']).to include 'nofollow' + end + + it 'adds rel="noreferrer" to external links' do + expect(doc.at_css('a')).to have_attribute('rel') + expect(doc.at_css('a')['rel']).to include 'noreferrer' + end end - it 'adds rel="noreferrer" to external links' do - act = %q(Google) - doc = filter(act) + context 'for nested links on document' do + let(:doc) { filter %q(

      Google

      ) } - expect(doc.at_css('a')).to have_attribute('rel') - expect(doc.at_css('a')['rel']).to include 'noreferrer' + it 'adds rel="nofollow" to external links' do + expect(doc.at_css('a')).to have_attribute('rel') + expect(doc.at_css('a')['rel']).to include 'nofollow' + end + + it 'adds rel="noreferrer" to external links' do + expect(doc.at_css('a')).to have_attribute('rel') + expect(doc.at_css('a')['rel']).to include 'noreferrer' + end end end diff --git a/spec/lib/banzai/filter/issue_reference_filter_spec.rb b/spec/lib/banzai/filter/issue_reference_filter_spec.rb index 8e6a264970..5b63c94611 100644 --- a/spec/lib/banzai/filter/issue_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/issue_reference_filter_spec.rb @@ -25,7 +25,9 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do let(:reference) { issue.to_reference } it 'ignores valid references when using non-default tracker' do - expect(project).to receive(:get_issue).with(issue.iid).and_return(nil) + expect_any_instance_of(described_class).to receive(:find_object). + with(project, issue.iid). + and_return(nil) exp = act = "Issue #{reference}" expect(reference_filter(act).to_html).to eq exp @@ -107,8 +109,9 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do let(:reference) { issue.to_reference(project) } it 'ignores valid references when cross-reference project uses external tracker' do - expect_any_instance_of(Project).to receive(:get_issue). - with(issue.iid).and_return(nil) + expect_any_instance_of(described_class).to receive(:find_object). + with(project2, issue.iid). + and_return(nil) exp = act = "Issue #{reference}" expect(reference_filter(act).to_html).to eq exp @@ -131,6 +134,12 @@ describe Banzai::Filter::IssueReferenceFilter, lib: true do expect(reference_filter(act).to_html).to eq exp end + + it 'ignores out-of-bounds issue IDs on the referenced project' do + exp = act = "Fixed ##{Gitlab::Database::MAX_INT_VALUE + 1}" + + expect(reference_filter(act).to_html).to eq exp + end end context 'cross-project URL reference' do diff --git a/spec/lib/banzai/filter/merge_request_reference_filter_spec.rb b/spec/lib/banzai/filter/merge_request_reference_filter_spec.rb index 3185e41fe5..805acf1c8b 100644 --- a/spec/lib/banzai/filter/merge_request_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/merge_request_reference_filter_spec.rb @@ -38,6 +38,12 @@ describe Banzai::Filter::MergeRequestReferenceFilter, lib: true do expect(reference_filter(act).to_html).to eq exp end + it 'ignores out-of-bounds merge request IDs on the referenced project' do + exp = act = "Merge !#{Gitlab::Database::MAX_INT_VALUE + 1}" + + expect(reference_filter(act).to_html).to eq exp + end + it 'includes a title attribute' do doc = reference_filter("Merge #{reference}") expect(doc.css('a').first.attr('title')).to eq "Merge Request: #{merge.title}" diff --git a/spec/lib/banzai/filter/relative_link_filter_spec.rb b/spec/lib/banzai/filter/relative_link_filter_spec.rb index 0e6685f0ff..b9e4a4eaf0 100644 --- a/spec/lib/banzai/filter/relative_link_filter_spec.rb +++ b/spec/lib/banzai/filter/relative_link_filter_spec.rb @@ -132,11 +132,8 @@ describe Banzai::Filter::RelativeLinkFilter, lib: true do path = 'files/images/한글.png' escaped = Addressable::URI.escape(path) - # Stub these methods so the file doesn't actually need to be in the repo - allow_any_instance_of(described_class). - to receive(:file_exists?).and_return(true) - allow_any_instance_of(described_class). - to receive(:image?).with(path).and_return(true) + # Stub this method so the file doesn't actually need to be in the repo + allow_any_instance_of(described_class).to receive(:uri_type).and_return(:raw) doc = filter(image(escaped)) expect(doc.at_css('img')['src']).to match '/raw/' diff --git a/spec/lib/banzai/filter/upload_link_filter_spec.rb b/spec/lib/banzai/filter/upload_link_filter_spec.rb index b83be54746..273d2ed709 100644 --- a/spec/lib/banzai/filter/upload_link_filter_spec.rb +++ b/spec/lib/banzai/filter/upload_link_filter_spec.rb @@ -23,6 +23,14 @@ describe Banzai::Filter::UploadLinkFilter, lib: true do %(#{path}) end + def nested_image(path) + %(
      ) + end + + def nested_link(path) + %() + end + let(:project) { create(:project) } shared_examples :preserve_unchanged do @@ -47,11 +55,19 @@ describe Banzai::Filter::UploadLinkFilter, lib: true do doc = filter(link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) expect(doc.at_css('a')['href']). to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" + + doc = filter(nested_link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) + expect(doc.at_css('a')['href']). + to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" end it 'rebuilds relative URL for an image' do - doc = filter(link('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) - expect(doc.at_css('a')['href']). + doc = filter(image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) + expect(doc.at_css('img')['src']). + to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" + + doc = filter(nested_image('/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg')) + expect(doc.at_css('img')['src']). to eq "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/uploads/e90decf88d8f96fe9e1389afc2e4a91f/test.jpg" end diff --git a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb index 143e2e6d23..d562d8b25e 100644 --- a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb +++ b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb @@ -157,6 +157,35 @@ module Ci expect(config_processor.builds_for_stage_and_ref("test", "deploy").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("deploy", "master").size).to eq(1) end + + context 'for invalid value' do + let(:config) { { rspec: { script: "rspec", type: "test", only: only } } } + let(:processor) { GitlabCiYamlProcessor.new(YAML.dump(config)) } + + shared_examples 'raises an error' do + it do + expect { processor }.to raise_error(GitlabCiYamlProcessor::ValidationError, 'rspec job: only parameter should be an array of strings or regexps') + end + end + + context 'when it is integer' do + let(:only) { 1 } + + it_behaves_like 'raises an error' + end + + context 'when it is an array of integers' do + let(:only) { [1, 1] } + + it_behaves_like 'raises an error' + end + + context 'when it is invalid regex' do + let(:only) { ["/*invalid/"] } + + it_behaves_like 'raises an error' + end + end end describe :except do @@ -284,16 +313,44 @@ module Ci expect(config_processor.builds_for_stage_and_ref("test", "test").size).to eq(0) expect(config_processor.builds_for_stage_and_ref("deploy", "master").size).to eq(0) end - end + context 'for invalid value' do + let(:config) { { rspec: { script: "rspec", except: except } } } + let(:processor) { GitlabCiYamlProcessor.new(YAML.dump(config)) } + + shared_examples 'raises an error' do + it do + expect { processor }.to raise_error(GitlabCiYamlProcessor::ValidationError, 'rspec job: except parameter should be an array of strings or regexps') + end + end + + context 'when it is integer' do + let(:except) { 1 } + + it_behaves_like 'raises an error' + end + + context 'when it is an array of integers' do + let(:except) { [1, 1] } + + it_behaves_like 'raises an error' + end + + context 'when it is invalid regex' do + let(:except) { ["/*invalid/"] } + + it_behaves_like 'raises an error' + end + end + end end - + describe "Scripts handling" do let(:config_data) { YAML.dump(config) } let(:config_processor) { GitlabCiYamlProcessor.new(config_data, path) } - + subject { config_processor.builds_for_stage_and_ref("test", "master").first } - + describe "before_script" do context "in global context" do let(:config) do @@ -302,12 +359,12 @@ module Ci test: { script: ["script"] } } end - + it "return commands with scripts concencaced" do expect(subject[:commands]).to eq("global script\nscript") end end - + context "overwritten in local context" do let(:config) do { @@ -465,19 +522,41 @@ module Ci end context 'when syntax is incorrect' do - it 'raises error' do - variables = [:KEY1, 'value1', :KEY2, 'value2'] + context 'when variables defined but invalid' do + it 'raises error' do + variables = [:KEY1, 'value1', :KEY2, 'value2'] - config = YAML.dump( - { before_script: ['pwd'], - rspec: { - variables: variables, - script: 'rspec' } - }) + config = YAML.dump( + { before_script: ['pwd'], + rspec: { + variables: variables, + script: 'rspec' } + }) - expect { GitlabCiYamlProcessor.new(config, path) } - .to raise_error(GitlabCiYamlProcessor::ValidationError, - /job: variables should be a map/) + expect { GitlabCiYamlProcessor.new(config, path) } + .to raise_error(GitlabCiYamlProcessor::ValidationError, + /job: variables should be a map/) + end + end + + context 'when variables key defined but value not specified' do + it 'returns empty array' do + config = YAML.dump( + { before_script: ['pwd'], + rspec: { + variables: nil, + script: 'rspec' } + }) + + config_processor = GitlabCiYamlProcessor.new(config, path) + + ## + # TODO, in next version of CI configuration processor this + # should be invalid configuration, see #18775 and #15060 + # + expect(config_processor.job_variables(:rspec)) + .to be_an_instance_of(Array).and be_empty + end end end end diff --git a/spec/lib/container_registry/repository_spec.rb b/spec/lib/container_registry/repository_spec.rb index 279709521c..c364e75910 100644 --- a/spec/lib/container_registry/repository_spec.rb +++ b/spec/lib/container_registry/repository_spec.rb @@ -21,7 +21,7 @@ describe ContainerRegistry::Repository do to_return( status: 200, body: JSON.dump(tags: ['test']), - headers: { 'Content-Type' => 'application/vnd.docker.distribution.manifest.v2+json' }) + headers: { 'Content-Type' => 'application/json' }) end context '#manifest' do diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb index 1ec539066a..9096ad101b 100644 --- a/spec/lib/gitlab/database/migration_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers_spec.rb @@ -71,6 +71,18 @@ describe Gitlab::Database::MigrationHelpers, lib: true do expect(Project.where(archived: true).count).to eq(5) end + + context 'when a block is supplied' do + it 'yields an Arel table and query object to the supplied block' do + first_id = Project.first.id + + model.update_column_in_batches(:projects, :archived, true) do |t, query| + query.where(t[:id].eq(first_id)) + end + + expect(Project.where(archived: true).count).to eq(1) + end + end end describe '#add_column_with_default' do @@ -78,7 +90,7 @@ describe Gitlab::Database::MigrationHelpers, lib: true do before do expect(model).to receive(:transaction_open?).and_return(false) - expect(model).to receive(:transaction).twice.and_yield + expect(model).to receive(:transaction).and_yield expect(model).to receive(:add_column). with(:projects, :foo, :integer, default: nil) diff --git a/spec/lib/gitlab/import_export/members_mapper_spec.rb b/spec/lib/gitlab/import_export/members_mapper_spec.rb new file mode 100644 index 0000000000..f135a285df --- /dev/null +++ b/spec/lib/gitlab/import_export/members_mapper_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::MembersMapper, services: true do + describe 'map members' do + + let(:user) { create(:user) } + let(:project) { create(:project, :public, name: 'searchable_project') } + let(:user2) { create(:user) } + let(:exported_user_id) { 99 } + let(:exported_members) do + [{ + "id" => 2, + "access_level" => 40, + "source_id" => 14, + "source_type" => "Project", + "user_id" => 19, + "notification_level" => 3, + "created_at" => "2016-03-11T10:21:44.822Z", + "updated_at" => "2016-03-11T10:21:44.822Z", + "created_by_id" => nil, + "invite_email" => nil, + "invite_token" => nil, + "invite_accepted_at" => nil, + "user" => + { + "id" => exported_user_id, + "email" => user2.email, + "username" => user2.username + } + }] + end + + let(:members_mapper) do + described_class.new( + exported_members: exported_members, user: user, project: project) + end + + it 'maps a project member' do + expect(members_mapper.map[exported_user_id]).to eq(user2.id) + end + + it 'defaults to importer project member if it does not exist' do + expect(members_mapper.map[-1]).to eq(user.id) + end + + it 'updates missing author IDs on missing project member' do + members_mapper.map[-1] + + expect(members_mapper.missing_author_ids.first).to eq(-1) + end + end +end diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json new file mode 100644 index 0000000000..400d44ac16 --- /dev/null +++ b/spec/lib/gitlab/import_export/project.json @@ -0,0 +1,5341 @@ +{ + "name": "Gitlab Test", + "path": "gitlab-test", + "description": "Aut saepe in eos dolorem aliquam hic.", + "issues_enabled": true, + "merge_requests_enabled": true, + "wiki_enabled": true, + "snippets_enabled": false, + "visibility_level": 20, + "archived": false, + "issues": [ + { + "id": 40, + "title": "Voluptatem modi rerum ipsum vero voluptas repudiandae veniam quibusdam.", + "assignee_id": 1, + "author_id": 4, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.411Z", + "updated_at": "2016-04-12T13:08:26.029Z", + "position": 0, + "branch_name": null, + "description": "Aut minima non sit qui nulla rerum laborum.", + "milestone_id": 10, + "state": "opened", + "iid": 10, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 1357, + "note": "test", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-04-12T13:08:26.006Z", + "updated_at": "2016-04-12T13:08:26.006Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": "", + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 338, + "note": "Fugit in aliquid voluptas dolor.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:19:59.213Z", + "updated_at": "2016-03-22T15:19:59.213Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 337, + "note": "Occaecati consequatur facilis doloribus omnis hic placeat nihil.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:19:59.186Z", + "updated_at": "2016-03-22T15:19:59.186Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 336, + "note": "Nostrum et et est repudiandae non dolores voluptatem.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:19:59.156Z", + "updated_at": "2016-03-22T15:19:59.156Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 335, + "note": "Nihil et aut dolorum aut sit maxime.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:19:59.130Z", + "updated_at": "2016-03-22T15:19:59.130Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 334, + "note": "Non blanditiis voluptatem sit earum accusantium distinctio voluptas officiis.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:19:59.101Z", + "updated_at": "2016-03-22T15:19:59.101Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 333, + "note": "Nesciunt non dolorem similique nam ipsa et.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:19:59.075Z", + "updated_at": "2016-03-22T15:19:59.075Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 332, + "note": "Sed aut fugit et officiis dolor.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:19:59.047Z", + "updated_at": "2016-03-22T15:19:59.047Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 331, + "note": "Officiis iste eum recusandae suscipit consequatur consequatur.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:19:59.015Z", + "updated_at": "2016-03-22T15:19:59.015Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 40, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 39, + "title": "Sit ut adipisci sint temporibus velit quis.", + "assignee_id": 1, + "author_id": 12, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.278Z", + "updated_at": "2016-03-22T15:19:59.473Z", + "position": 0, + "branch_name": null, + "description": "Ab sint nostrum aliquam laudantium magni recusandae qui.", + "milestone_id": 10, + "state": "closed", + "iid": 9, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 346, + "note": "Natus rerum qui dolorem dolorum voluptas.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:19:59.469Z", + "updated_at": "2016-03-22T15:19:59.469Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 345, + "note": "Voluptatibus et qui quis id sed necessitatibus quos.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:19:59.438Z", + "updated_at": "2016-03-22T15:19:59.438Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 344, + "note": "Aperiam possimus ipsam quibusdam in.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:19:59.410Z", + "updated_at": "2016-03-22T15:19:59.410Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 343, + "note": "Ad vel hic molestiae tempora.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:19:59.379Z", + "updated_at": "2016-03-22T15:19:59.379Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 342, + "note": "Vel magnam sed quidem aut molestiae facilis alias.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:19:59.348Z", + "updated_at": "2016-03-22T15:19:59.348Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 341, + "note": "Veritatis dolorum aut qui quod.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:19:59.319Z", + "updated_at": "2016-03-22T15:19:59.319Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 340, + "note": "Illum at cumque dolorum et quia.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:19:59.289Z", + "updated_at": "2016-03-22T15:19:59.289Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 339, + "note": "Fugiat et error molestiae cumque quos aperiam.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:19:59.255Z", + "updated_at": "2016-03-22T15:19:59.255Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 39, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 38, + "title": "Quod quo est quis vel natus nulla eos reiciendis.", + "assignee_id": 12, + "author_id": 3, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.137Z", + "updated_at": "2016-03-22T15:19:59.712Z", + "position": 0, + "branch_name": null, + "description": "Fugit dolor accusantium suscipit facere voluptate.", + "milestone_id": 10, + "state": "opened", + "iid": 8, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 354, + "note": "Id commodi natus vel corrupti ea placeat cum nihil.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:19:59.708Z", + "updated_at": "2016-03-22T15:19:59.708Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 353, + "note": "Quia hic sed ratione eos voluptate dolor occaecati dolorem.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:19:59.680Z", + "updated_at": "2016-03-22T15:19:59.680Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 352, + "note": "Commodi sint voluptatem est aut.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:19:59.650Z", + "updated_at": "2016-03-22T15:19:59.650Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 351, + "note": "Et quibusdam voluptatibus dolores aut quam architecto optio.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:19:59.622Z", + "updated_at": "2016-03-22T15:19:59.622Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 350, + "note": "Fugit natus explicabo sed pariatur et quasi autem.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:19:59.590Z", + "updated_at": "2016-03-22T15:19:59.590Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 349, + "note": "Corporis commodi eos quia optio sunt corrupti.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:19:59.562Z", + "updated_at": "2016-03-22T15:19:59.562Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 348, + "note": "Occaecati nostrum hic dolor tenetur aliquid maxime animi.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:19:59.536Z", + "updated_at": "2016-03-22T15:19:59.536Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 347, + "note": "Inventore ullam sed repellendus laudantium itaque et quia.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:19:59.506Z", + "updated_at": "2016-03-22T15:19:59.506Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 38, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 37, + "title": "Animi suscipit quia ut hic asperiores perferendis nisi ut.", + "assignee_id": 22, + "author_id": 10, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.994Z", + "updated_at": "2016-03-22T15:19:59.972Z", + "position": 0, + "branch_name": null, + "description": "Non quibusdam in maxime earum eveniet itaque culpa.", + "milestone_id": 11, + "state": "closed", + "iid": 7, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 362, + "note": "Quia qui quis molestiae in praesentium.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:19:59.966Z", + "updated_at": "2016-03-22T15:19:59.966Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 361, + "note": "Maxime sed eius qui consequatur beatae.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:19:59.924Z", + "updated_at": "2016-03-22T15:19:59.924Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 360, + "note": "Voluptatum quasi corrupti eveniet sed ut quis quibusdam.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:19:59.897Z", + "updated_at": "2016-03-22T15:19:59.897Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 359, + "note": "Molestias quia eius ipsum non.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:19:59.866Z", + "updated_at": "2016-03-22T15:19:59.866Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 358, + "note": "Aut non est accusantium aliquam.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:19:59.834Z", + "updated_at": "2016-03-22T15:19:59.834Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 357, + "note": "Aspernatur voluptas id voluptas vel cum ipsam.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:19:59.805Z", + "updated_at": "2016-03-22T15:19:59.805Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 356, + "note": "Harum dignissimos provident tempora sit numquam est qui.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:19:59.773Z", + "updated_at": "2016-03-22T15:19:59.773Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 355, + "note": "Sint dignissimos molestiae recusandae delectus.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:19:59.746Z", + "updated_at": "2016-03-22T15:19:59.746Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 37, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 36, + "title": "Quia dolores commodi eligendi ut nemo totam.", + "assignee_id": 3, + "author_id": 4, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.814Z", + "updated_at": "2016-03-22T15:20:00.371Z", + "position": 0, + "branch_name": null, + "description": "Molestiae veniam laudantium autem et natus.", + "milestone_id": 11, + "state": "opened", + "iid": 6, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 370, + "note": "Occaecati temporibus tempore harum vero incidunt veniam iste.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:00.365Z", + "updated_at": "2016-03-22T15:20:00.365Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 369, + "note": "Modi architecto officiis quia iste voluptas libero nihil quo.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:00.331Z", + "updated_at": "2016-03-22T15:20:00.331Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 368, + "note": "Eaque est tenetur ex est molestiae nobis.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:00.296Z", + "updated_at": "2016-03-22T15:20:00.296Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 367, + "note": "Odit enim ut a quo qui.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:00.261Z", + "updated_at": "2016-03-22T15:20:00.261Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 366, + "note": "Omnis unde cum officiis est.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:00.223Z", + "updated_at": "2016-03-22T15:20:00.223Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 365, + "note": "Ab consequuntur aliquam illo voluptatum.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:00.178Z", + "updated_at": "2016-03-22T15:20:00.178Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 364, + "note": "Molestiae dolorem est eos dolores aut.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:00.127Z", + "updated_at": "2016-03-22T15:20:00.127Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 363, + "note": "Nemo velit nam quod veniam.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:00.083Z", + "updated_at": "2016-03-22T15:20:00.083Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 36, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 35, + "title": "Rerum tenetur harum molestiae quam aut praesentium quaerat doloremque.", + "assignee_id": 4, + "author_id": 1, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.660Z", + "updated_at": "2016-03-22T15:20:00.665Z", + "position": 0, + "branch_name": null, + "description": "Omnis et voluptatibus expedita qui et explicabo rem ut.", + "milestone_id": 11, + "state": "opened", + "iid": 5, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 378, + "note": "Molestiae atque exercitationem culpa harum nemo.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:00.660Z", + "updated_at": "2016-03-22T15:20:00.660Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 377, + "note": "Porro sed nobis neque amet velit velit.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:00.625Z", + "updated_at": "2016-03-22T15:20:00.625Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 376, + "note": "Dicta officiis doloremque voluptatum qui omnis.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:00.589Z", + "updated_at": "2016-03-22T15:20:00.589Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 375, + "note": "Incidunt rerum omnis cum laudantium aut impedit.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:00.553Z", + "updated_at": "2016-03-22T15:20:00.553Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 374, + "note": "Et suscipit omnis dolorum officia vero.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:00.517Z", + "updated_at": "2016-03-22T15:20:00.517Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 373, + "note": "Doloremque adipisci et cumque inventore beatae consectetur.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:00.485Z", + "updated_at": "2016-03-22T15:20:00.485Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 372, + "note": "Dolores sapiente ea dolorum et quae adipisci id.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:00.455Z", + "updated_at": "2016-03-22T15:20:00.455Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 371, + "note": "Accusantium repellat tenetur natus dicta ullam saepe facere.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:00.420Z", + "updated_at": "2016-03-22T15:20:00.420Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 35, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 34, + "title": "Enim occaecati aut sed quia mollitia eligendi atque dolores voluptatem.", + "assignee_id": 24, + "author_id": 1, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.506Z", + "updated_at": "2016-03-22T15:20:00.961Z", + "position": 0, + "branch_name": null, + "description": "Voluptatem totam magnam fugit assumenda consequatur illo qui.", + "milestone_id": 10, + "state": "opened", + "iid": 4, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 379, + "note": "Praesentium odio quia fugit consequuntur repudiandae ducimus.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:00.717Z", + "updated_at": "2016-03-22T15:20:00.717Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + }, + { + "id": 380, + "note": "Dolores aut dolorem quia soluta incidunt commodi quia.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:00.754Z", + "updated_at": "2016-03-22T15:20:00.754Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 381, + "note": "Enim et velit iure ad.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:00.787Z", + "updated_at": "2016-03-22T15:20:00.787Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 382, + "note": "Impedit nobis quis laudantium ad assumenda.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:00.822Z", + "updated_at": "2016-03-22T15:20:00.822Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 383, + "note": "Facere sed numquam quos quas.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:00.855Z", + "updated_at": "2016-03-22T15:20:00.855Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 384, + "note": "Ex voluptatem sit provident error.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:00.889Z", + "updated_at": "2016-03-22T15:20:00.889Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 385, + "note": "Soluta laboriosam recusandae est cupiditate.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:00.925Z", + "updated_at": "2016-03-22T15:20:00.925Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 386, + "note": "Similique dolorem rerum iusto animi perferendis aut inventore.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:00.957Z", + "updated_at": "2016-03-22T15:20:00.957Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 34, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + } + ] + }, + { + "id": 33, + "title": "Rem fugiat fugit occaecati quibusdam enim consectetur numquam.", + "assignee_id": 22, + "author_id": 22, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.364Z", + "updated_at": "2016-03-22T15:20:01.227Z", + "position": 0, + "branch_name": null, + "description": "Provident nulla architecto neque beatae fuga alias repudiandae.", + "milestone_id": 10, + "state": "closed", + "iid": 3, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 394, + "note": "Suscipit numquam voluptatibus ipsam libero dolorum dolore totam.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:01.223Z", + "updated_at": "2016-03-22T15:20:01.223Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 393, + "note": "Et et sed sit sint.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:01.194Z", + "updated_at": "2016-03-22T15:20:01.194Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 392, + "note": "Corrupti perferendis voluptas et iure omnis officia.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:01.160Z", + "updated_at": "2016-03-22T15:20:01.160Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 391, + "note": "Autem quo fugit in iste nesciunt tempora.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:01.131Z", + "updated_at": "2016-03-22T15:20:01.131Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 390, + "note": "Magni porro ut soluta quis et eveniet maiores.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:01.101Z", + "updated_at": "2016-03-22T15:20:01.101Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 389, + "note": "Sed consequuntur debitis nisi veniam exercitationem recusandae a quisquam.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:01.070Z", + "updated_at": "2016-03-22T15:20:01.070Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 388, + "note": "Aut impedit qui consectetur dicta temporibus.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:01.042Z", + "updated_at": "2016-03-22T15:20:01.042Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 387, + "note": "Officia repudiandae ut culpa ipsa reiciendis.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:01.005Z", + "updated_at": "2016-03-22T15:20:01.005Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 33, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 32, + "title": "Velit nihil est alias blanditiis eius earum autem hic.", + "assignee_id": 22, + "author_id": 26, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.225Z", + "updated_at": "2016-03-22T15:20:01.495Z", + "position": 0, + "branch_name": null, + "description": "Id voluptas ut sint aut laborum nobis commodi.", + "milestone_id": 11, + "state": "opened", + "iid": 2, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 402, + "note": "Magni ut eligendi sit sint recusandae voluptas tempore necessitatibus.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:01.489Z", + "updated_at": "2016-03-22T15:20:01.489Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 401, + "note": "Est repellat commodi incidunt tempore earum optio unde sint.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:01.455Z", + "updated_at": "2016-03-22T15:20:01.455Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 400, + "note": "Vero unde debitis tempore est laboriosam ut esse.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:01.421Z", + "updated_at": "2016-03-22T15:20:01.421Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 399, + "note": "Omnis qui asperiores expedita harum voluptatem eius.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:01.391Z", + "updated_at": "2016-03-22T15:20:01.391Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 398, + "note": "Dolorem doloribus delectus quo ratione esse veritatis.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:01.358Z", + "updated_at": "2016-03-22T15:20:01.358Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 397, + "note": "Quia esse et odit id est omnis dolorum quia.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:01.329Z", + "updated_at": "2016-03-22T15:20:01.329Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 396, + "note": "Exercitationem suscipit non rerum tempore sit.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:01.297Z", + "updated_at": "2016-03-22T15:20:01.297Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 395, + "note": "Nihil veniam magni sit officiis.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:01.268Z", + "updated_at": "2016-03-22T15:20:01.268Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 32, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + }, + { + "id": 31, + "title": "Asperiores recusandae praesentium voluptas pariatur provident qui exercitationem quis.", + "assignee_id": 26, + "author_id": 24, + "project_id": 5, + "created_at": "2016-03-22T15:13:26.889Z", + "updated_at": "2016-03-22T15:20:01.834Z", + "position": 0, + "branch_name": null, + "description": "Ex voluptates qui excepturi cupiditate.", + "milestone_id": 11, + "state": "closed", + "iid": 1, + "updated_by_id": null, + "confidential": false, + "deleted_at": null, + "moved_to_id": null, + "due_date": null, + "notes": [ + { + "id": 410, + "note": "Sit itaque non nihil nisi qui voluptatem dolorem error.", + "noteable_type": "Issue", + "author_id": 1, + "created_at": "2016-03-22T15:20:01.828Z", + "updated_at": "2016-03-22T15:20:01.828Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 409, + "note": "Omnis rem nihil molestiae enim laudantium doloremque.", + "noteable_type": "Issue", + "author_id": 3, + "created_at": "2016-03-22T15:20:01.783Z", + "updated_at": "2016-03-22T15:20:01.783Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 408, + "note": "Ullam harum sit et optio incidunt.", + "noteable_type": "Issue", + "author_id": 4, + "created_at": "2016-03-22T15:20:01.746Z", + "updated_at": "2016-03-22T15:20:01.746Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 407, + "note": "Fugit distinctio ab quo ipsam.", + "noteable_type": "Issue", + "author_id": 10, + "created_at": "2016-03-22T15:20:01.716Z", + "updated_at": "2016-03-22T15:20:01.716Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 406, + "note": "Impedit iste possimus ad ea.", + "noteable_type": "Issue", + "author_id": 12, + "created_at": "2016-03-22T15:20:01.676Z", + "updated_at": "2016-03-22T15:20:01.676Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 405, + "note": "Nemo recusandae dolore distinctio quam consequuntur ut et aut.", + "noteable_type": "Issue", + "author_id": 22, + "created_at": "2016-03-22T15:20:01.641Z", + "updated_at": "2016-03-22T15:20:01.641Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 404, + "note": "Nisi repudiandae repellat nulla culpa quasi expedita quod velit.", + "noteable_type": "Issue", + "author_id": 24, + "created_at": "2016-03-22T15:20:01.601Z", + "updated_at": "2016-03-22T15:20:01.601Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 403, + "note": "Quibusdam odio temporibus nemo voluptatibus accusamus.", + "noteable_type": "Issue", + "author_id": 26, + "created_at": "2016-03-22T15:20:01.552Z", + "updated_at": "2016-03-22T15:20:01.552Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 31, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ] + } + ], + "labels": [ + { + "id": 12, + "title": "test", + "color": "#428bca", + "project_id": 5, + "created_at": "2016-05-10T10:53:14.214Z", + "updated_at": "2016-05-10T10:53:14.214Z", + "template": false, + "description": "test label" + } + ], + "milestones": [ + { + "id": 11, + "title": "v2.0", + "project_id": 5, + "description": "Sapiente facilis architecto reprehenderit aut sed enim.", + "due_date": null, + "created_at": "2016-03-22T15:13:21.631Z", + "updated_at": "2016-03-22T15:13:21.631Z", + "state": "closed", + "iid": 2 + }, + { + "id": 10, + "title": "v1.0", + "project_id": 5, + "description": "Est sed eos minima veniam culpa aut non.", + "due_date": null, + "created_at": "2016-03-22T15:13:21.622Z", + "updated_at": "2016-03-22T15:13:21.622Z", + "state": "closed", + "iid": 1 + } + ], + "snippets": [ + + ], + "releases": [ + + ], + "events": [ + { + "id": 301, + "target_type": "Note", + "target_id": 1357, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-04-12T13:08:30.886Z", + "updated_at": "2016-04-12T13:08:30.886Z", + "action": 6, + "author_id": 1 + }, + { + "id": 227, + "target_type": "MergeRequest", + "target_id": 85, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:19:44.957Z", + "updated_at": "2016-03-22T15:19:44.957Z", + "action": 1, + "author_id": 1 + }, + { + "id": 226, + "target_type": "MergeRequest", + "target_id": 84, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:19:44.600Z", + "updated_at": "2016-03-22T15:19:44.600Z", + "action": 1, + "author_id": 1 + }, + { + "id": 157, + "target_type": "MergeRequest", + "target_id": 15, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:45.936Z", + "updated_at": "2016-03-22T15:13:45.936Z", + "action": 1, + "author_id": 3 + }, + { + "id": 156, + "target_type": "MergeRequest", + "target_id": 14, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:45.500Z", + "updated_at": "2016-03-22T15:13:45.500Z", + "action": 1, + "author_id": 10 + }, + { + "id": 155, + "target_type": "MergeRequest", + "target_id": 13, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:45.242Z", + "updated_at": "2016-03-22T15:13:45.242Z", + "action": 1, + "author_id": 1 + }, + { + "id": 154, + "target_type": "MergeRequest", + "target_id": 12, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:44.940Z", + "updated_at": "2016-03-22T15:13:44.940Z", + "action": 1, + "author_id": 24 + }, + { + "id": 153, + "target_type": "MergeRequest", + "target_id": 11, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:44.568Z", + "updated_at": "2016-03-22T15:13:44.568Z", + "action": 1, + "author_id": 26 + }, + { + "id": 152, + "target_type": "MergeRequest", + "target_id": 10, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:44.225Z", + "updated_at": "2016-03-22T15:13:44.225Z", + "action": 1, + "author_id": 22 + }, + { + "id": 151, + "target_type": "MergeRequest", + "target_id": 9, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:43.868Z", + "updated_at": "2016-03-22T15:13:43.868Z", + "action": 1, + "author_id": 24 + }, + { + "id": 102, + "target_type": "Issue", + "target_id": 40, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.474Z", + "updated_at": "2016-03-22T15:13:28.474Z", + "action": 1, + "author_id": 4 + }, + { + "id": 101, + "target_type": "Issue", + "target_id": 39, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.328Z", + "updated_at": "2016-03-22T15:13:28.328Z", + "action": 1, + "author_id": 12 + }, + { + "id": 100, + "target_type": "Issue", + "target_id": 38, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.204Z", + "updated_at": "2016-03-22T15:13:28.204Z", + "action": 1, + "author_id": 3 + }, + { + "id": 99, + "target_type": "Issue", + "target_id": 37, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:28.055Z", + "updated_at": "2016-03-22T15:13:28.055Z", + "action": 1, + "author_id": 10 + }, + { + "id": 98, + "target_type": "Issue", + "target_id": 36, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.913Z", + "updated_at": "2016-03-22T15:13:27.913Z", + "action": 1, + "author_id": 4 + }, + { + "id": 97, + "target_type": "Issue", + "target_id": 35, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.731Z", + "updated_at": "2016-03-22T15:13:27.731Z", + "action": 1, + "author_id": 1 + }, + { + "id": 96, + "target_type": "Issue", + "target_id": 34, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.564Z", + "updated_at": "2016-03-22T15:13:27.564Z", + "action": 1, + "author_id": 1 + }, + { + "id": 95, + "target_type": "Issue", + "target_id": 33, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.429Z", + "updated_at": "2016-03-22T15:13:27.429Z", + "action": 1, + "author_id": 22 + }, + { + "id": 94, + "target_type": "Issue", + "target_id": 32, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:27.287Z", + "updated_at": "2016-03-22T15:13:27.287Z", + "action": 1, + "author_id": 26 + }, + { + "id": 93, + "target_type": "Issue", + "target_id": 31, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:26.997Z", + "updated_at": "2016-03-22T15:13:26.997Z", + "action": 1, + "author_id": 24 + }, + { + "id": 51, + "target_type": "Milestone", + "target_id": 11, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:21.634Z", + "updated_at": "2016-03-22T15:13:21.634Z", + "action": 1, + "author_id": 26 + }, + { + "id": 50, + "target_type": "Milestone", + "target_id": 10, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:21.625Z", + "updated_at": "2016-03-22T15:13:21.625Z", + "action": 1, + "author_id": 22 + }, + { + "id": 24, + "target_type": null, + "target_id": null, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:20.750Z", + "updated_at": "2016-03-22T15:13:20.750Z", + "action": 8, + "author_id": 12 + }, + { + "id": 23, + "target_type": null, + "target_id": null, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:20.711Z", + "updated_at": "2016-03-22T15:13:20.711Z", + "action": 8, + "author_id": 22 + }, + { + "id": 22, + "target_type": null, + "target_id": null, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:20.667Z", + "updated_at": "2016-03-22T15:13:20.667Z", + "action": 8, + "author_id": 26 + }, + { + "id": 21, + "target_type": null, + "target_id": null, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:20.646Z", + "updated_at": "2016-03-22T15:13:20.646Z", + "action": 8, + "author_id": 1 + }, + { + "id": 5, + "target_type": null, + "target_id": null, + "title": null, + "data": null, + "project_id": 5, + "created_at": "2016-03-22T15:13:10.369Z", + "updated_at": "2016-03-22T15:13:10.369Z", + "action": 1, + "author_id": 1 + } + ], + "project_members": [ + { + "id": 35, + "access_level": 40, + "source_id": 5, + "source_type": "Project", + "user_id": 12, + "notification_level": 3, + "created_at": "2016-03-22T15:13:20.743Z", + "updated_at": "2016-03-22T15:13:20.743Z", + "created_by_id": null, + "invite_email": null, + "invite_token": null, + "invite_accepted_at": null, + "user": { + "id": 12, + "email": "maureen.bogisich@russelkessler.com", + "username": "evans" + } + }, + { + "id": 34, + "access_level": 40, + "source_id": 5, + "source_type": "Project", + "user_id": 22, + "notification_level": 3, + "created_at": "2016-03-22T15:13:20.708Z", + "updated_at": "2016-03-22T15:13:20.708Z", + "created_by_id": null, + "invite_email": null, + "invite_token": null, + "invite_accepted_at": null, + "user": { + "id": 22, + "email": "user0@example.com", + "username": "user0" + } + }, + { + "id": 33, + "access_level": 40, + "source_id": 5, + "source_type": "Project", + "user_id": 26, + "notification_level": 3, + "created_at": "2016-03-22T15:13:20.664Z", + "updated_at": "2016-03-22T15:13:20.664Z", + "created_by_id": null, + "invite_email": null, + "invite_token": null, + "invite_accepted_at": null, + "user": { + "id": 26, + "email": "user4@example.com", + "username": "user4" + } + }, + { + "id": 32, + "access_level": 20, + "source_id": 5, + "source_type": "Project", + "user_id": 1, + "notification_level": 3, + "created_at": "2016-03-22T15:13:20.643Z", + "updated_at": "2016-03-22T15:13:20.643Z", + "created_by_id": null, + "invite_email": null, + "invite_token": null, + "invite_accepted_at": null, + "user": { + "id": 1, + "email": "nospam@bluegod.net", + "username": "root" + } + } + ], + "merge_requests": [ + { + "id": 85, + "target_branch": "feature", + "source_branch": "feature_conflict", + "source_project_id": 5, + "author_id": 1, + "assignee_id": null, + "title": "Cannot be automatically merged", + "created_at": "2016-03-22T15:19:44.807Z", + "updated_at": "2016-03-22T15:20:09.557Z", + "milestone_id": null, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 9, + "description": null, + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 638, + "note": "Ab velit ducimus totam sunt ut.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:09.553Z", + "updated_at": "2016-03-22T15:20:09.553Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 637, + "note": "Ipsum aliquam est in unde similique nihil illo ea.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:09.528Z", + "updated_at": "2016-03-22T15:20:09.528Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 636, + "note": "Soluta inventore adipisci et consequatur expedita aliquid earum modi.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:09.496Z", + "updated_at": "2016-03-22T15:20:09.496Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 635, + "note": "Corporis incidunt tempore est deleniti.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:09.469Z", + "updated_at": "2016-03-22T15:20:09.469Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 634, + "note": "Hic dolores voluptatibus qui necessitatibus.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:09.440Z", + "updated_at": "2016-03-22T15:20:09.440Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 633, + "note": "Rerum architecto placeat doloribus voluptates consequuntur quo.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:09.412Z", + "updated_at": "2016-03-22T15:20:09.412Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 632, + "note": "Vel earum aut ut occaecati aut ut rerum qui.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:09.389Z", + "updated_at": "2016-03-22T15:20:09.389Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 631, + "note": "Est voluptatibus dolores animi numquam.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:09.361Z", + "updated_at": "2016-03-22T15:20:09.361Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 85, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 85, + "state": "collected", + "st_commits": [ + { + "id": "bb5206fee213d983da88c47f9cf4cc6caf9c66dc", + "message": "Feature conflcit added\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "5937ac0a7beb003549fc5fd26fc247adbce4a52e" + ], + "authored_date": "2014-08-06T08:35:52.000+02:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-08-06T08:35:52.000+02:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + }, + { + "id": "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + "message": "Add submodule from gitlab.com\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "570e7b2abdd848b95f2f578043fc23bd6f6fd24d" + ], + "authored_date": "2014-02-27T10:01:38.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T10:01:38.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + }, + { + "id": "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", + "message": "Change some files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9" + ], + "authored_date": "2014-02-27T09:57:31.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T09:57:31.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + }, + { + "id": "6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9", + "message": "More submodules\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "d14d6c0abdd253381df51a723d58691b2ee1ab08" + ], + "authored_date": "2014-02-27T09:54:21.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T09:54:21.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + }, + { + "id": "d14d6c0abdd253381df51a723d58691b2ee1ab08", + "message": "Remove ds_store files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "c1acaa58bbcbc3eafe538cb8274ba387047b69f8" + ], + "authored_date": "2014-02-27T09:49:50.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T09:49:50.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + }, + { + "id": "c1acaa58bbcbc3eafe538cb8274ba387047b69f8", + "message": "Ignore DS files\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "ae73cb07c9eeaf35924a10f713b364d32b2dd34f" + ], + "authored_date": "2014-02-27T09:48:32.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T09:48:32.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + } + ], + "st_diffs": [ + { + "diff": "Binary files a/.DS_Store and /dev/null differ\n", + "new_path": ".DS_Store", + "old_path": ".DS_Store", + "a_mode": "100644", + "b_mode": "0", + "new_file": false, + "renamed_file": false, + "deleted_file": true, + "too_large": false + }, + { + "diff": "--- a/.gitignore\n+++ b/.gitignore\n@@ -17,3 +17,4 @@ rerun.txt\n pickle-email-*.html\n .project\n config/initializers/secret_token.rb\n+.DS_Store\n", + "new_path": ".gitignore", + "old_path": ".gitignore", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- a/.gitmodules\n+++ b/.gitmodules\n@@ -1,3 +1,9 @@\n [submodule \"six\"]\n \tpath = six\n \turl = git://github.com/randx/six.git\n+[submodule \"gitlab-shell\"]\n+\tpath = gitlab-shell\n+\turl = https://github.com/gitlabhq/gitlab-shell.git\n+[submodule \"gitlab-grack\"]\n+\tpath = gitlab-grack\n+\turl = https://gitlab.com/gitlab-org/gitlab-grack.git\n", + "new_path": ".gitmodules", + "old_path": ".gitmodules", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "Binary files a/files/.DS_Store and /dev/null differ\n", + "new_path": "files/.DS_Store", + "old_path": "files/.DS_Store", + "a_mode": "100644", + "b_mode": "0", + "new_file": false, + "renamed_file": false, + "deleted_file": true, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,4 @@\n+# This file was changed in feature branch\n+# We put different code here to make merge conflict\n+class Conflict\n+end\n", + "new_path": "files/ruby/feature.rb", + "old_path": "files/ruby/feature.rb", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- a/files/ruby/popen.rb\n+++ b/files/ruby/popen.rb\n@@ -6,12 +6,18 @@ module Popen\n \n def popen(cmd, path=nil)\n unless cmd.is_a?(Array)\n- raise \"System commands must be given as an array of strings\"\n+ raise RuntimeError, \"System commands must be given as an array of strings\"\n end\n \n path ||= Dir.pwd\n- vars = { \"PWD\" =\u003e path }\n- options = { chdir: path }\n+\n+ vars = {\n+ \"PWD\" =\u003e path\n+ }\n+\n+ options = {\n+ chdir: path\n+ }\n \n unless File.directory?(path)\n FileUtils.mkdir_p(path)\n@@ -19,6 +25,7 @@ module Popen\n \n @cmd_output = \"\"\n @cmd_status = 0\n+\n Open3.popen3(vars, *cmd, options) do |stdin, stdout, stderr, wait_thr|\n @cmd_output \u003c\u003c stdout.read\n @cmd_output \u003c\u003c stderr.read\n", + "new_path": "files/ruby/popen.rb", + "old_path": "files/ruby/popen.rb", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- a/files/ruby/regex.rb\n+++ b/files/ruby/regex.rb\n@@ -19,14 +19,12 @@ module Gitlab\n end\n \n def archive_formats_regex\n- #|zip|tar| tar.gz | tar.bz2 |\n- /(zip|tar|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n+ /(zip|tar|7z|tar\\.gz|tgz|gz|tar\\.bz2|tbz|tbz2|tb2|bz2)/\n end\n \n def git_reference_regex\n # Valid git ref regex, see:\n # https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html\n-\n %r{\n (?!\n (?# doesn't begins with)\n", + "new_path": "files/ruby/regex.rb", + "old_path": "files/ruby/regex.rb", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/gitlab-grack\n@@ -0,0 +1 @@\n+Subproject commit 645f6c4c82fd3f5e06f67134450a570b795e55a6\n", + "new_path": "gitlab-grack", + "old_path": "gitlab-grack", + "a_mode": "0", + "b_mode": "160000", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/gitlab-shell\n@@ -0,0 +1 @@\n+Subproject commit 79bceae69cb5750d6567b223597999bfa91cb3b9\n", + "new_path": "gitlab-shell", + "old_path": "gitlab-shell", + "a_mode": "0", + "b_mode": "160000", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 85, + "created_at": "2016-03-22T15:19:44.810Z", + "updated_at": "2016-03-22T15:19:44.901Z", + "base_commit_sha": "ae73cb07c9eeaf35924a10f713b364d32b2dd34f", + "real_size": "9" + } + }, + { + "id": 84, + "target_branch": "master", + "source_branch": "feature", + "source_project_id": 5, + "author_id": 1, + "assignee_id": null, + "title": "Can be automatically merged", + "created_at": "2016-03-22T15:19:44.482Z", + "updated_at": "2016-03-22T15:20:09.773Z", + "milestone_id": null, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 8, + "description": null, + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 646, + "note": "Temporibus debitis veniam est ut sit nihil.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:09.770Z", + "updated_at": "2016-03-22T15:20:09.770Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 645, + "note": "Ut assumenda dignissimos quibusdam veritatis sequi dolores.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:09.740Z", + "updated_at": "2016-03-22T15:20:09.740Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 644, + "note": "Velit quae quidem cupiditate laudantium nihil ut eveniet.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:09.717Z", + "updated_at": "2016-03-22T15:20:09.717Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 643, + "note": "Repellat quas porro sed mollitia laborum ut fugiat.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:09.690Z", + "updated_at": "2016-03-22T15:20:09.690Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 642, + "note": "Qui aut debitis perspiciatis et voluptatem.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:09.665Z", + "updated_at": "2016-03-22T15:20:09.665Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 641, + "note": "Quia id quia velit et.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:09.639Z", + "updated_at": "2016-03-22T15:20:09.639Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 640, + "note": "Corporis commodi doloremque itaque non animi.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:09.617Z", + "updated_at": "2016-03-22T15:20:09.617Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 639, + "note": "Possimus dignissimos voluptatum in tenetur.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:09.589Z", + "updated_at": "2016-03-22T15:20:09.589Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 84, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 84, + "state": "collected", + "st_commits": [ + { + "id": "0b4bc9a49b562e85de7cc9e834518ea6828729b9", + "message": "Feature added\n\nSigned-off-by: Dmitriy Zaporozhets \u003cdmitriy.zaporozhets@gmail.com\u003e\n", + "parent_ids": [ + "ae73cb07c9eeaf35924a10f713b364d32b2dd34f" + ], + "authored_date": "2014-02-27T09:26:01.000+01:00", + "author_name": "Dmitriy Zaporozhets", + "author_email": "dmitriy.zaporozhets@gmail.com", + "committed_date": "2014-02-27T09:26:01.000+01:00", + "committer_name": "Dmitriy Zaporozhets", + "committer_email": "dmitriy.zaporozhets@gmail.com" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,5 @@\n+class Feature\n+ def foo\n+ puts 'bar'\n+ end\n+end\n", + "new_path": "files/ruby/feature.rb", + "old_path": "files/ruby/feature.rb", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 84, + "created_at": "2016-03-22T15:19:44.485Z", + "updated_at": "2016-03-22T15:19:44.577Z", + "base_commit_sha": "ae73cb07c9eeaf35924a10f713b364d32b2dd34f", + "real_size": "1" + } + }, + { + "id": 15, + "target_branch": "markdown", + "source_branch": "master", + "source_project_id": 5, + "author_id": 3, + "assignee_id": 3, + "title": "Nulla explicabo iure voluptas perferendis autem autem unde nemo totam optio.", + "created_at": "2016-03-22T15:13:45.689Z", + "updated_at": "2016-03-22T15:20:30.476Z", + "milestone_id": 10, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 7, + "description": "Doloribus dignissimos impedit qui et provident exercitationem. Veniam quis magni qui fugiat. Et quia voluptate et vel consequatur pariatur ea est.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1231, + "note": "Rerum optio quibusdam provident possimus quis cum.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:30.472Z", + "updated_at": "2016-03-22T15:20:30.472Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1230, + "note": "Quasi odit repudiandae ut officiis ut nihil illo.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:30.444Z", + "updated_at": "2016-03-22T15:20:30.444Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1229, + "note": "Aut vero dolores facere sed.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:30.412Z", + "updated_at": "2016-03-22T15:20:30.412Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1228, + "note": "Autem voluptatem et blanditiis accusantium deserunt et et.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:30.383Z", + "updated_at": "2016-03-22T15:20:30.383Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1227, + "note": "Voluptatem aliquam voluptatem molestiae est.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:30.352Z", + "updated_at": "2016-03-22T15:20:30.352Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1226, + "note": "Ea aut cupiditate est consequatur animi error qui et.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:30.319Z", + "updated_at": "2016-03-22T15:20:30.319Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1225, + "note": "Voluptates est voluptas et nostrum modi beatae inventore et.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:30.289Z", + "updated_at": "2016-03-22T15:20:30.289Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1224, + "note": "Quia est rerum adipisci cupiditate.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:30.260Z", + "updated_at": "2016-03-22T15:20:30.260Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 15, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 15, + "state": "collected", + "st_commits": [ + { + "id": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "message": "Merge branch 'master' into 'master'\r\n\r\nLFS object pointer.\r\n\r\n\r\n\r\nSee merge request !6", + "parent_ids": [ + "5f923865dde3436854e9ceb9cdb7815618d4e849", + "048721d90c449b244b7b4c53a9186b04330174ec" + ], + "authored_date": "2015-12-07T12:52:12.000+01:00", + "author_name": "Marin Jankovski", + "author_email": "marin@gitlab.com", + "committed_date": "2015-12-07T12:52:12.000+01:00", + "committer_name": "Marin Jankovski", + "committer_email": "marin@gitlab.com" + }, + { + "id": "048721d90c449b244b7b4c53a9186b04330174ec", + "message": "LFS object pointer.\n", + "parent_ids": [ + "5f923865dde3436854e9ceb9cdb7815618d4e849" + ], + "authored_date": "2015-12-07T11:54:28.000+01:00", + "author_name": "Marin Jankovski", + "author_email": "maxlazio@gmail.com", + "committed_date": "2015-12-07T11:54:28.000+01:00", + "committer_name": "Marin Jankovski", + "committer_email": "maxlazio@gmail.com" + }, + { + "id": "5f923865dde3436854e9ceb9cdb7815618d4e849", + "message": "GitLab currently doesn't support patches that involve a merge commit: add a commit here\n", + "parent_ids": [ + "d2d430676773caa88cdaf7c55944073b2fd5561a" + ], + "authored_date": "2015-11-13T16:27:12.000+01:00", + "author_name": "Stan Hu", + "author_email": "stanhu@gmail.com", + "committed_date": "2015-11-13T16:27:12.000+01:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@gmail.com" + }, + { + "id": "d2d430676773caa88cdaf7c55944073b2fd5561a", + "message": "Merge branch 'add-svg' into 'master'\r\n\r\nAdd GitLab SVG\r\n\r\nAdded to test preview of sanitized SVG images\r\n\r\nSee merge request !5", + "parent_ids": [ + "59e29889be61e6e0e5e223bfa9ac2721d31605b8", + "2ea1f3dec713d940208fb5ce4a38765ecb5d3f73" + ], + "authored_date": "2015-11-13T08:50:17.000+01:00", + "author_name": "Stan Hu", + "author_email": "stanhu@gmail.com", + "committed_date": "2015-11-13T08:50:17.000+01:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@gmail.com" + }, + { + "id": "2ea1f3dec713d940208fb5ce4a38765ecb5d3f73", + "message": "Add GitLab SVG\n", + "parent_ids": [ + "59e29889be61e6e0e5e223bfa9ac2721d31605b8" + ], + "authored_date": "2015-11-13T08:39:43.000+01:00", + "author_name": "Stan Hu", + "author_email": "stanhu@gmail.com", + "committed_date": "2015-11-13T08:39:43.000+01:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@gmail.com" + }, + { + "id": "59e29889be61e6e0e5e223bfa9ac2721d31605b8", + "message": "Merge branch 'whitespace' into 'master'\r\n\r\nadd whitespace test file\r\n\r\nSorry, I did a mistake.\r\nGit ignore empty files.\r\nSo I add a new whitespace test file.\r\n\r\nSee merge request !4", + "parent_ids": [ + "19e2e9b4ef76b422ce1154af39a91323ccc57434", + "66eceea0db202bb39c4e445e8ca28689645366c5" + ], + "authored_date": "2015-11-13T07:21:40.000+01:00", + "author_name": "Stan Hu", + "author_email": "stanhu@gmail.com", + "committed_date": "2015-11-13T07:21:40.000+01:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@gmail.com" + }, + { + "id": "66eceea0db202bb39c4e445e8ca28689645366c5", + "message": "add spaces in whitespace file\n", + "parent_ids": [ + "08f22f255f082689c0d7d39d19205085311542bc" + ], + "authored_date": "2015-11-13T06:01:27.000+01:00", + "author_name": "윤민식", + "author_email": "minsik.yoon@samsung.com", + "committed_date": "2015-11-13T06:01:27.000+01:00", + "committer_name": "윤민식", + "committer_email": "minsik.yoon@samsung.com" + }, + { + "id": "08f22f255f082689c0d7d39d19205085311542bc", + "message": "remove emtpy file.(beacase git ignore empty file)\nadd whitespace test file.\n", + "parent_ids": [ + "c642fe9b8b9f28f9225d7ea953fe14e74748d53b" + ], + "authored_date": "2015-11-13T06:00:16.000+01:00", + "author_name": "윤민식", + "author_email": "minsik.yoon@samsung.com", + "committed_date": "2015-11-13T06:00:16.000+01:00", + "committer_name": "윤민식", + "committer_email": "minsik.yoon@samsung.com" + }, + { + "id": "19e2e9b4ef76b422ce1154af39a91323ccc57434", + "message": "Merge branch 'whitespace' into 'master'\r\n\r\nadd spaces\r\n\r\nTo test this pull request.(https://github.com/gitlabhq/gitlabhq/pull/9757)\r\nJust add whitespaces.\r\n\r\nSee merge request !3", + "parent_ids": [ + "c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd", + "c642fe9b8b9f28f9225d7ea953fe14e74748d53b" + ], + "authored_date": "2015-11-13T05:23:14.000+01:00", + "author_name": "Stan Hu", + "author_email": "stanhu@gmail.com", + "committed_date": "2015-11-13T05:23:14.000+01:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@gmail.com" + }, + { + "id": "c642fe9b8b9f28f9225d7ea953fe14e74748d53b", + "message": "add whitespace in empty\n", + "parent_ids": [ + "9a944d90955aaf45f6d0c88f30e27f8d2c41cec0" + ], + "authored_date": "2015-11-13T05:08:45.000+01:00", + "author_name": "윤민식", + "author_email": "minsik.yoon@samsung.com", + "committed_date": "2015-11-13T05:08:45.000+01:00", + "committer_name": "윤민식", + "committer_email": "minsik.yoon@samsung.com" + }, + { + "id": "9a944d90955aaf45f6d0c88f30e27f8d2c41cec0", + "message": "add empty file\n", + "parent_ids": [ + "c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd" + ], + "authored_date": "2015-11-13T05:08:04.000+01:00", + "author_name": "윤민식", + "author_email": "minsik.yoon@samsung.com", + "committed_date": "2015-11-13T05:08:04.000+01:00", + "committer_name": "윤민식", + "committer_email": "minsik.yoon@samsung.com" + }, + { + "id": "c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd", + "message": "Add ISO-8859 test file\n", + "parent_ids": [ + "e56497bb5f03a90a51293fc6d516788730953899" + ], + "authored_date": "2015-08-25T17:53:12.000+02:00", + "author_name": "Stan Hu", + "author_email": "stanhu@packetzoom.com", + "committed_date": "2015-08-25T17:53:12.000+02:00", + "committer_name": "Stan Hu", + "committer_email": "stanhu@packetzoom.com" + }, + { + "id": "e56497bb5f03a90a51293fc6d516788730953899", + "message": "Merge branch 'tree_helper_spec' into 'master'\n\nAdd directory structure for tree_helper spec\n\nThis directory structure is needed for a testing the method flatten_tree(tree) in the TreeHelper module\n\nSee [merge request #275](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/275#note_732774)\n\nSee merge request !2\n", + "parent_ids": [ + "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + "4cd80ccab63c82b4bad16faa5193fbd2aa06df40" + ], + "authored_date": "2015-01-10T22:23:29.000+01:00", + "author_name": "Sytse Sijbrandij", + "author_email": "sytse@gitlab.com", + "committed_date": "2015-01-10T22:23:29.000+01:00", + "committer_name": "Sytse Sijbrandij", + "committer_email": "sytse@gitlab.com" + }, + { + "id": "4cd80ccab63c82b4bad16faa5193fbd2aa06df40", + "message": "add directory structure for tree_helper spec\n", + "parent_ids": [ + "5937ac0a7beb003549fc5fd26fc247adbce4a52e" + ], + "authored_date": "2015-01-10T21:28:18.000+01:00", + "author_name": "marmis85", + "author_email": "marmis85@gmail.com", + "committed_date": "2015-01-10T21:28:18.000+01:00", + "committer_name": "marmis85", + "committer_email": "marmis85@gmail.com" + } + ], + "st_diffs": [ + { + "diff": "--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n", + "new_path": "CHANGELOG", + "old_path": "CHANGELOG", + "a_mode": "100644", + "b_mode": "100644", + "new_file": false, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/encoding/iso8859.txt\n@@ -0,0 +1 @@\n+Äü\n", + "new_path": "encoding/iso8859.txt", + "old_path": "encoding/iso8859.txt", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/files/images/wm.svg\n@@ -0,0 +1,78 @@\n+\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n+\u003csvg width=\"1300px\" height=\"680px\" viewBox=\"0 0 1300 680\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\"\u003e\n+ \u003c!-- Generator: Sketch 3.2.2 (9983) - http://www.bohemiancoding.com/sketch --\u003e\n+ \u003ctitle\u003ewm\u003c/title\u003e\n+ \u003cdesc\u003eCreated with Sketch.\u003c/desc\u003e\n+ \u003cdefs\u003e\n+ \u003cpath id=\"path-1\" d=\"M-69.8,1023.54607 L1675.19996,1023.54607 L1675.19996,0 L-69.8,0 L-69.8,1023.54607 L-69.8,1023.54607 Z\"\u003e\u003c/path\u003e\n+ \u003c/defs\u003e\n+ \u003cg id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" sketch:type=\"MSPage\"\u003e\n+ \u003cpath d=\"M1300,680 L0,680 L0,0 L1300,0 L1300,680 L1300,680 Z\" id=\"bg\" fill=\"#30353E\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"gitlab_logo\" sketch:type=\"MSLayerGroup\" transform=\"translate(-262.000000, -172.000000)\"\u003e\n+ \u003cg id=\"g10\" transform=\"translate(872.500000, 512.354581) scale(1, -1) translate(-872.500000, -512.354581) translate(0.000000, 0.290751)\"\u003e\n+ \u003cg id=\"g12\" transform=\"translate(1218.022652, 440.744871)\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\n+ \u003cpath d=\"M-50.0233338,141.900706 L-69.07059,141.900706 L-69.0100967,0.155858152 L8.04444805,0.155858152 L8.04444805,17.6840847 L-49.9628405,17.6840847 L-50.0233338,141.900706 L-50.0233338,141.900706 Z\" id=\"path14\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g16\"\u003e\n+ \u003cg id=\"g18-Clipped\"\u003e\n+ \u003cmask id=\"mask-2\" sketch:name=\"path22\" fill=\"white\"\u003e\n+ \u003cuse xlink:href=\"#path-1\"\u003e\u003c/use\u003e\n+ \u003c/mask\u003e\n+ \u003cg id=\"path22\"\u003e\u003c/g\u003e\n+ \u003cg id=\"g18\" mask=\"url(#mask-2)\"\u003e\n+ \u003cg transform=\"translate(382.736659, 312.879425)\"\u003e\n+ \u003cg id=\"g24\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(852.718192, 124.992771)\"\u003e\n+ \u003cpath d=\"M63.9833317,27.9148929 C59.2218085,22.9379001 51.2134221,17.9597442 40.3909323,17.9597442 C25.8888194,17.9597442 20.0453962,25.1013043 20.0453962,34.4074318 C20.0453962,48.4730484 29.7848226,55.1819277 50.5642821,55.1819277 C54.4602853,55.1819277 60.7364685,54.7492469 63.9833317,54.1002256 L63.9833317,27.9148929 L63.9833317,27.9148929 Z M44.2869356,113.827628 C28.9053426,113.827628 14.7975996,108.376082 3.78897657,99.301416 L10.5211864,87.6422957 C18.3131929,92.1866076 27.8374026,96.7320827 41.4728323,96.7320827 C57.0568452,96.7320827 63.9833317,88.7239978 63.9833317,75.3074024 L63.9833317,68.3821827 C60.9528485,69.0312039 54.6766653,69.4650479 50.7806621,69.4650479 C17.4476729,69.4650479 0.565379986,57.7791759 0.565379986,33.3245665 C0.565379986,11.4683685 13.9844297,0.43151772 34.3299658,0.43151772 C48.0351955,0.43151772 61.1692285,6.70771614 65.7143717,16.8780421 L69.1776149,3.02876588 L82.5978279,3.02876588 L82.5978279,75.5237428 C82.5978279,98.462806 72.6408582,113.827628 44.2869356,113.827628 L44.2869356,113.827628 Z\" id=\"path26\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g28\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(959.546624, 124.857151)\"\u003e\n+ \u003cpath d=\"M37.2266657,17.4468081 C30.0837992,17.4468081 23.8064527,18.3121698 19.0449295,20.4767371 L19.0449295,79.2306079 L19.0449295,86.0464943 C25.538656,91.457331 33.5470425,95.3526217 43.7203922,95.3526217 C62.1173451,95.3526217 69.2602116,82.3687072 69.2602116,61.3767077 C69.2602116,31.5135879 57.7885819,17.4468081 37.2266657,17.4468081 M45.2315622,113.963713 C28.208506,113.963713 19.0449295,102.384849 19.0449295,102.384849 L19.0449295,120.67143 L18.9844362,144.908535 L10.3967097,144.908535 L0.371103324,144.908535 L0.431596656,6.62629771 C9.73826309,2.73100702 22.5081728,0.567602823 36.3611458,0.567602823 C71.8579349,0.567602823 88.9566078,23.2891625 88.9566078,62.4584098 C88.9566078,93.4043948 73.1527248,113.963713 45.2315622,113.963713\" id=\"path30\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g32\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(509.576747, 125.294950)\"\u003e\n+ \u003cpath d=\"M68.636665,129.10638 C85.5189579,129.10638 96.3414476,123.480366 103.484314,117.853189 L111.669527,132.029302 C100.513161,141.811145 85.5073245,147.06845 69.5021849,147.06845 C29.0274926,147.06845 0.673569983,122.3975 0.673569983,72.6252464 C0.673569983,20.4709215 31.2622559,0.12910638 66.2553217,0.12910638 C83.7879179,0.12910638 98.7227909,4.24073748 108.462217,8.35236859 L108.063194,64.0763105 L108.063194,70.6502677 L108.063194,81.6057001 L56.1168719,81.6057001 L56.1168719,64.0763105 L89.2323178,64.0763105 L89.6313411,21.7701271 C85.3025779,19.6055598 77.7269514,17.8748364 67.554765,17.8748364 C39.4172223,17.8748364 20.5863462,35.5717154 20.5863462,72.8415868 C20.5863462,110.711628 40.0663623,129.10638 68.636665,129.10638\" id=\"path34\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g36\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(692.388992, 124.376085)\"\u003e\n+ \u003cpath d=\"M19.7766662,145.390067 L1.16216997,145.390067 L1.2226633,121.585642 L1.2226633,111.846834 L1.2226633,106.170806 L1.2226633,96.2656714 L1.2226633,39.5681976 L1.2226633,39.3518572 C1.2226633,16.4127939 11.1796331,1.04797161 39.5335557,1.04797161 C43.4504989,1.04797161 47.2836822,1.40388649 51.0051854,2.07965952 L51.0051854,18.7925385 C48.3109055,18.3796307 45.4351455,18.1446804 42.3476589,18.1446804 C26.763646,18.1446804 19.8371595,26.1516022 19.8371595,39.5681976 L19.8371595,96.2656714 L51.0051854,96.2656714 L51.0051854,111.846834 L19.8371595,111.846834 L19.7766662,145.390067 L19.7766662,145.390067 Z\" id=\"path38\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cpath d=\"M646.318899,128.021188 L664.933395,128.021188 L664.933395,236.223966 L646.318899,236.223966 L646.318899,128.021188 L646.318899,128.021188 Z\" id=\"path40\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cpath d=\"M646.318899,251.154944 L664.933395,251.154944 L664.933395,269.766036 L646.318899,269.766036 L646.318899,251.154944 L646.318899,251.154944 Z\" id=\"path42\" fill=\"#8C929D\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003cg id=\"g44\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.464170, 0.676006)\"\u003e\n+ \u003cpath d=\"M429.269989,169.815599 L405.225053,243.802859 L357.571431,390.440955 C355.120288,397.984955 344.444378,397.984955 341.992071,390.440955 L294.337286,243.802859 L136.094873,243.802859 L88.4389245,390.440955 C85.9877812,397.984955 75.3118715,397.984955 72.8595648,390.440955 L25.2059427,243.802859 L1.16216997,169.815599 C-1.03187664,163.067173 1.37156997,155.674379 7.11261982,151.503429 L215.215498,0.336141836 L423.319539,151.503429 C429.060589,155.674379 431.462873,163.067173 429.269989,169.815599\" id=\"path46\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g48\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(135.410135, 1.012147)\"\u003e\n+ \u003cpath d=\"M80.269998,0 L80.269998,0 L159.391786,243.466717 L1.14820997,243.466717 L80.269998,0 L80.269998,0 Z\" id=\"path50\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g52\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path54\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g56\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(24.893471, 1.012613)\"\u003e\n+ \u003cpath d=\"M190.786662,0 L111.664874,243.465554 L0.777106647,243.465554 L190.786662,0 L190.786662,0 Z\" id=\"path58\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g60\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cg id=\"path62\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g64\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(0.077245, 0.223203)\"\u003e\n+ \u003cpath d=\"M25.5933327,244.255313 L25.5933327,244.255313 L1.54839663,170.268052 C-0.644486651,163.519627 1.75779662,156.126833 7.50000981,151.957046 L215.602888,0.789758846 L25.5933327,244.255313 L25.5933327,244.255313 Z\" id=\"path66\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g68\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012147)\"\u003e\n+ \u003cg id=\"path70\"\u003e\u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g72\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(25.670578, 244.478283)\"\u003e\n+ \u003cpath d=\"M0,0 L110.887767,0 L63.2329818,146.638096 C60.7806751,154.183259 50.1047654,154.183259 47.6536221,146.638096 L0,0 L0,0 Z\" id=\"path74\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g76\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(215.680133, 1.012613)\"\u003e\n+ \u003cpath d=\"M0,0 L79.121788,243.465554 L190.009555,243.465554 L0,0 L0,0 Z\" id=\"path78\" fill=\"#FC6D26\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g80\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(214.902910, 0.223203)\"\u003e\n+ \u003cpath d=\"M190.786662,244.255313 L190.786662,244.255313 L214.831598,170.268052 C217.024481,163.519627 214.622198,156.126833 208.879985,151.957046 L0.777106647,0.789758846 L190.786662,244.255313 L190.786662,244.255313 Z\" id=\"path82\" fill=\"#FCA326\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003cg id=\"g84\" stroke-width=\"1\" fill=\"none\" sketch:type=\"MSLayerGroup\" transform=\"translate(294.009575, 244.478283)\"\u003e\n+ \u003cpath d=\"M111.679997,0 L0.79222998,0 L48.4470155,146.638096 C50.8993221,154.183259 61.5752318,154.183259 64.0263751,146.638096 L111.679997,0 L111.679997,0 Z\" id=\"path86\" fill=\"#E24329\" sketch:type=\"MSShapeGroup\"\u003e\u003c/path\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+ \u003c/g\u003e\n+\u003c/svg\u003e\n\\ No newline at end of file\n", + "new_path": "files/images/wm.svg", + "old_path": "files/images/wm.svg", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/files/lfs/lfs_object.iso\n@@ -0,0 +1,4 @@\n+version https://git-lfs.github.com/spec/v1\n+oid sha256:91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897\n+size 1575078\n+\n", + "new_path": "files/lfs/lfs_object.iso", + "old_path": "files/lfs/lfs_object.iso", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/files/whitespace\n@@ -0,0 +1 @@\n+test \n", + "new_path": "files/whitespace", + "old_path": "files/whitespace", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + }, + { + "diff": "--- /dev/null\n+++ b/foo/bar/.gitkeep\n", + "new_path": "foo/bar/.gitkeep", + "old_path": "foo/bar/.gitkeep", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 15, + "created_at": "2016-03-22T15:13:45.692Z", + "updated_at": "2016-03-22T15:13:45.808Z", + "base_commit_sha": "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + "real_size": "6" + } + }, + { + "id": 14, + "target_branch": "test-1", + "source_branch": "test-10", + "source_project_id": 5, + "author_id": 10, + "assignee_id": 1, + "title": "Tempore aliquid sit amet odit qui cum iusto voluptatibus asperiores.", + "created_at": "2016-03-22T15:13:45.442Z", + "updated_at": "2016-03-22T15:20:30.735Z", + "milestone_id": 10, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 6, + "description": "Quis et et autem saepe ut. Eum corporis tempore cum dolore. Molestiae pariatur voluptatem officia perferendis aut veniam.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1239, + "note": "Aspernatur suscipit veritatis aliquid rerum.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:30.731Z", + "updated_at": "2016-03-22T15:20:30.731Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1238, + "note": "Rerum deleniti omnis porro commodi.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:30.701Z", + "updated_at": "2016-03-22T15:20:30.701Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1237, + "note": "Eaque ut magnam rerum non dolores esse.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:30.667Z", + "updated_at": "2016-03-22T15:20:30.667Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1236, + "note": "Fugit et aut similique illum ut natus maiores et.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:30.637Z", + "updated_at": "2016-03-22T15:20:30.637Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1235, + "note": "Qui qui temporibus eos aliquam.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:30.608Z", + "updated_at": "2016-03-22T15:20:30.608Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1234, + "note": "Voluptates hic dolorum aut inventore.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:30.575Z", + "updated_at": "2016-03-22T15:20:30.575Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1233, + "note": "Dolorum iure at dolor dolores numquam iusto.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:30.548Z", + "updated_at": "2016-03-22T15:20:30.548Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1232, + "note": "Nihil est eum aspernatur amet minus et corporis consectetur.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:30.517Z", + "updated_at": "2016-03-22T15:20:30.517Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 14, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 14, + "state": "collected", + "st_commits": [ + { + "id": "bce96ecee98f51fa5d91021e6c42859a35a701ad", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T15:40:05.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T15:40:05.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 14, + "created_at": "2016-03-22T15:13:45.444Z", + "updated_at": "2016-03-22T15:13:45.486Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + }, + { + "id": 13, + "target_branch": "test-11", + "source_branch": "test-12", + "source_project_id": 5, + "author_id": 1, + "assignee_id": 26, + "title": "Voluptas minus sunt voluptatum quis quia ut velit distinctio itaque.", + "created_at": "2016-03-22T15:13:45.164Z", + "updated_at": "2016-03-22T15:20:30.994Z", + "milestone_id": 11, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 5, + "description": "Ea ut modi consectetur et minus beatae. Et sunt ducimus praesentium libero officia maiores voluptas cumque. Rerum in aut corporis et ullam omnis.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1247, + "note": "Non error magnam placeat cupiditate eum.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:30.989Z", + "updated_at": "2016-03-22T15:20:30.989Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1246, + "note": "Eos optio et architecto eligendi ea est nihil.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:30.957Z", + "updated_at": "2016-03-22T15:20:30.957Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1245, + "note": "Reprehenderit in atque dolor et repudiandae a est.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:30.928Z", + "updated_at": "2016-03-22T15:20:30.928Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1244, + "note": "Numquam fugit doloremque iure odio et.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:30.902Z", + "updated_at": "2016-03-22T15:20:30.902Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1243, + "note": "Doloribus laboriosam id harum voluptatum vitae ut quam.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:30.863Z", + "updated_at": "2016-03-22T15:20:30.863Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1242, + "note": "Harum et ut ipsum dolore ea.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:30.832Z", + "updated_at": "2016-03-22T15:20:30.832Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1241, + "note": "Corporis sed soluta ut est modi natus ab.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:30.802Z", + "updated_at": "2016-03-22T15:20:30.802Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1240, + "note": "Corrupti totam tenetur officiis ratione dolores est qui vel.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:30.771Z", + "updated_at": "2016-03-22T15:20:30.771Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 13, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 13, + "state": "collected", + "st_commits": [ + { + "id": "a4e5dfebf42e34596526acb8611bc7ed80e4eb3f", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T15:44:02.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T15:44:02.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 13, + "created_at": "2016-03-22T15:13:45.167Z", + "updated_at": "2016-03-22T15:13:45.216Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + }, + { + "id": 12, + "target_branch": "test-15", + "source_branch": "test-2", + "source_project_id": 5, + "author_id": 24, + "assignee_id": 12, + "title": "In assumenda nam quaerat qui eos sit facilis enim quia quis.", + "created_at": "2016-03-22T15:13:44.837Z", + "updated_at": "2016-03-22T15:20:31.258Z", + "milestone_id": 10, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 4, + "description": "Soluta excepturi quis iste vero delectus rerum. Consequatur possimus aliquam necessitatibus deleniti rerum est impedit. Eius rem et consequatur assumenda est commodi.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1255, + "note": "Quibusdam rem aut similique ipsum recusandae ut accusamus.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:31.253Z", + "updated_at": "2016-03-22T15:20:31.253Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1254, + "note": "Cumque sed omnis ipsa et magnam dolorem et.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:31.224Z", + "updated_at": "2016-03-22T15:20:31.224Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1253, + "note": "Molestiae beatae id consequatur nam minus quia.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:31.195Z", + "updated_at": "2016-03-22T15:20:31.195Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1252, + "note": "Voluptatem dolorem dignissimos itaque tempora quas ut.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:31.166Z", + "updated_at": "2016-03-22T15:20:31.166Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1251, + "note": "Debitis qui quibusdam voluptas repellat veritatis dicta rerum id.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:31.137Z", + "updated_at": "2016-03-22T15:20:31.137Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1250, + "note": "Suscipit optio ad voluptatem dignissimos temporibus amet molestias ut.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:31.107Z", + "updated_at": "2016-03-22T15:20:31.107Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1249, + "note": "Nemo aut vitae et ducimus autem ex dolores.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:31.073Z", + "updated_at": "2016-03-22T15:20:31.073Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1248, + "note": "Repellendus eaque ex molestiae laudantium placeat quidem vitae recusandae.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:31.038Z", + "updated_at": "2016-03-22T15:20:31.038Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 12, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 12, + "state": "collected", + "st_commits": [ + { + "id": "97a0df9696e2aebf10c31b3016f40214e0e8f243", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T14:08:21.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T14:08:21.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 12, + "created_at": "2016-03-22T15:13:44.840Z", + "updated_at": "2016-03-22T15:13:44.908Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + }, + { + "id": 11, + "target_branch": "test-3", + "source_branch": "test-5", + "source_project_id": 5, + "author_id": 26, + "assignee_id": 12, + "title": "Magni aut reprehenderit ut accusantium est eum.", + "created_at": "2016-03-22T15:13:44.494Z", + "updated_at": "2016-03-22T15:20:31.886Z", + "milestone_id": 10, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 3, + "description": "Et hic maxime harum ullam. Nulla velit pariatur libero recusandae. Dolor est earum laboriosam harum quo.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1263, + "note": "Beatae incidunt exercitationem voluptates recusandae fuga quia enim.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:31.883Z", + "updated_at": "2016-03-22T15:20:31.883Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1262, + "note": "Illum sunt id consequuntur fugit et quo ullam eum.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:31.860Z", + "updated_at": "2016-03-22T15:20:31.860Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1261, + "note": "Alias reiciendis autem ipsa sequi autem nemo odio.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:31.456Z", + "updated_at": "2016-03-22T15:20:31.456Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1260, + "note": "Maxime nisi odit eos nulla vel ex accusamus velit.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:31.426Z", + "updated_at": "2016-03-22T15:20:31.426Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1259, + "note": "Excepturi et qui sapiente ut ducimus sunt nesciunt.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:31.397Z", + "updated_at": "2016-03-22T15:20:31.397Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1258, + "note": "Quis rerum dolores et dolorem modi neque ullam doloribus.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:31.364Z", + "updated_at": "2016-03-22T15:20:31.364Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1257, + "note": "Voluptatum et mollitia neque aut.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:31.328Z", + "updated_at": "2016-03-22T15:20:31.328Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1256, + "note": "Rerum laudantium dolor natus doloribus voluptas aliquid a.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:31.298Z", + "updated_at": "2016-03-22T15:20:31.298Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 11, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 11, + "state": "collected", + "st_commits": [ + { + "id": "f998ac87ac9244f15e9c15109a6f4e62a54b779d", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T14:43:23.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T14:43:23.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 11, + "created_at": "2016-03-22T15:13:44.497Z", + "updated_at": "2016-03-22T15:13:44.547Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + }, + { + "id": 10, + "target_branch": "test-6", + "source_branch": "test-7", + "source_project_id": 5, + "author_id": 22, + "assignee_id": 4, + "title": "Rerum commodi corporis quis qui fugit sed ut.", + "created_at": "2016-03-22T15:13:44.103Z", + "updated_at": "2016-03-22T15:20:32.096Z", + "milestone_id": 11, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 2, + "description": "Laudantium vel dignissimos aspernatur quis aut. Dolores et doloremque ipsa quia voluptate modi labore. Ipsa provident repellat error et nihil.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1271, + "note": "Quod ut ut quisquam et ut dolorem dolor.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:32.093Z", + "updated_at": "2016-03-22T15:20:32.093Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1270, + "note": "Sed deserunt et explicabo rem repellat voluptatem.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:32.070Z", + "updated_at": "2016-03-22T15:20:32.070Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1269, + "note": "Veritatis architecto omnis consequatur et optio.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:32.046Z", + "updated_at": "2016-03-22T15:20:32.046Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1268, + "note": "Omnis suscipit odio molestiae debitis quia autem magni.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:32.019Z", + "updated_at": "2016-03-22T15:20:32.019Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1267, + "note": "Molestias est sunt est tempora consequatur cupiditate magnam.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:31.993Z", + "updated_at": "2016-03-22T15:20:31.993Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1266, + "note": "Ratione blanditiis eveniet voluptatem nostrum rerum excepturi in molestiae.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:31.969Z", + "updated_at": "2016-03-22T15:20:31.969Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1265, + "note": "Illo voluptatibus vel odio ea.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:31.944Z", + "updated_at": "2016-03-22T15:20:31.944Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1264, + "note": "Earum veritatis quis facere itaque iure.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:31.919Z", + "updated_at": "2016-03-22T15:20:31.919Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 10, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 10, + "state": "collected", + "st_commits": [ + { + "id": "b42bb86cea49bdcef943e521584b7f417d8ddd3d", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T15:03:09.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T15:03:09.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 10, + "created_at": "2016-03-22T15:13:44.107Z", + "updated_at": "2016-03-22T15:13:44.190Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + }, + { + "id": 9, + "target_branch": "test-8", + "source_branch": "test-9", + "source_project_id": 5, + "author_id": 24, + "assignee_id": 3, + "title": "Saepe et neque ut vero nobis et voluptatum facere qui minima.", + "created_at": "2016-03-22T15:13:43.792Z", + "updated_at": "2016-03-22T15:20:32.309Z", + "milestone_id": 10, + "state": "opened", + "merge_status": "unchecked", + "target_project_id": 5, + "iid": 1, + "description": "Autem enim aliquam labore qui voluptas ut voluptatem. Et corrupti sit fuga dolores alias iusto voluptatem. Excepturi ut saepe accusamus neque distinctio.", + "position": 0, + "locked_at": null, + "updated_by_id": null, + "merge_error": null, + "merge_params": { + + }, + "merge_when_build_succeeds": false, + "merge_user_id": null, + "merge_commit_sha": null, + "deleted_at": null, + "notes": [ + { + "id": 1279, + "note": "A corrupti nesciunt pariatur ea.", + "noteable_type": "MergeRequest", + "author_id": 1, + "created_at": "2016-03-22T15:20:32.307Z", + "updated_at": "2016-03-22T15:20:32.307Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Administrator" + } + }, + { + "id": 1278, + "note": "Adipisci aut ut et voluptate numquam.", + "noteable_type": "MergeRequest", + "author_id": 3, + "created_at": "2016-03-22T15:20:32.281Z", + "updated_at": "2016-03-22T15:20:32.281Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Alexie Trantow" + } + }, + { + "id": 1277, + "note": "Adipisci voluptatem quod ut placeat repellendus deleniti.", + "noteable_type": "MergeRequest", + "author_id": 4, + "created_at": "2016-03-22T15:20:32.255Z", + "updated_at": "2016-03-22T15:20:32.255Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Julius Moore" + } + }, + { + "id": 1276, + "note": "Vitae et doloremque aut et aspernatur velit placeat sed.", + "noteable_type": "MergeRequest", + "author_id": 10, + "created_at": "2016-03-22T15:20:32.230Z", + "updated_at": "2016-03-22T15:20:32.230Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Robyn McCullough Jr." + } + }, + { + "id": 1275, + "note": "Quos cupiditate nesciunt expedita aspernatur.", + "noteable_type": "MergeRequest", + "author_id": 12, + "created_at": "2016-03-22T15:20:32.207Z", + "updated_at": "2016-03-22T15:20:32.207Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "Vladimir McCullough" + } + }, + { + "id": 1274, + "note": "Optio rem inventore dicta praesentium sit.", + "noteable_type": "MergeRequest", + "author_id": 22, + "created_at": "2016-03-22T15:20:32.181Z", + "updated_at": "2016-03-22T15:20:32.181Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 0" + } + }, + { + "id": 1273, + "note": "Sit incidunt molestiae maxime officiis rerum necessitatibus.", + "noteable_type": "MergeRequest", + "author_id": 24, + "created_at": "2016-03-22T15:20:32.159Z", + "updated_at": "2016-03-22T15:20:32.159Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 2" + } + }, + { + "id": 1272, + "note": "Autem ut non itaque molestiae nisi quia officiis doloribus.", + "noteable_type": "MergeRequest", + "author_id": 26, + "created_at": "2016-03-22T15:20:32.129Z", + "updated_at": "2016-03-22T15:20:32.129Z", + "project_id": 5, + "attachment": { + "url": null + }, + "line_code": null, + "commit_id": null, + "noteable_id": 9, + "system": false, + "st_diff": null, + "updated_by_id": null, + "author": { + "name": "User 4" + } + } + ], + "merge_request_diff": { + "id": 9, + "state": "collected", + "st_commits": [ + { + "id": "e239ba8c97b80b2874579a4d625ea9628f4c8ff5", + "message": "fixes #10\n", + "parent_ids": [ + "be93687618e4b132087f430a4d8fc3a609c9b77c" + ], + "authored_date": "2016-01-19T15:38:06.000+01:00", + "author_name": "Test Lopez", + "author_email": "Test@Testlopez.es", + "committed_date": "2016-01-19T15:38:06.000+01:00", + "committer_name": "Test Lopez", + "committer_email": "Test@Testlopez.es" + } + ], + "st_diffs": [ + { + "diff": "--- /dev/null\n+++ b/test\n", + "new_path": "test", + "old_path": "test", + "a_mode": "0", + "b_mode": "100644", + "new_file": true, + "renamed_file": false, + "deleted_file": false, + "too_large": false + } + ], + "merge_request_id": 9, + "created_at": "2016-03-22T15:13:43.794Z", + "updated_at": "2016-03-22T15:13:43.848Z", + "base_commit_sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "real_size": "1" + } + } + ], + "pipelines": [ + { + "id": 36, + "project_id": 5, + "ref": "master", + "sha": "be93687618e4b132087f430a4d8fc3a609c9b77c", + "before_sha": null, + "push_data": null, + "created_at": "2016-03-22T15:20:35.755Z", + "updated_at": "2016-03-22T15:20:35.755Z", + "tag": null, + "yaml_errors": null, + "committed_at": null, + "gl_project_id": 5, + "status": "failed", + "started_at": null, + "finished_at": null, + "duration": null, + "statuses": [ + { + "id": 71, + "project_id": 5, + "status": "failed", + "finished_at": "2016-03-29T06:28:12.630Z", + "trace": null, + "created_at": "2016-03-22T15:20:35.772Z", + "updated_at": "2016-03-29T06:28:12.634Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 36, + "commands": "$ build command", + "job_id": null, + "name": "test build 1", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": null + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": null + }, + "erased_by_id": null, + "erased_at": null + }, + { + "id": 72, + "project_id": 5, + "status": "success", + "finished_at": null, + "trace": "Porro ea qui ut dolores. Labore ab nemo explicabo aspernatur quis voluptates corporis. Et quasi delectus est sit aperiam perspiciatis asperiores. Repudiandae cum aut consectetur accusantium officia sunt.\n\nQuidem dolore iusto quaerat ut aut inventore et molestiae. Libero voluptates atque nemo qui. Nulla temporibus ipsa similique facere.\n\nAliquam ipsam perferendis qui fugit accusantium omnis id voluptatum. Dignissimos aliquid dicta eos voluptatem assumenda quia. Sed autem natus unde dolor et non nisi et. Consequuntur nihil consequatur rerum est.\n\nSimilique neque est iste ducimus qui fuga cupiditate. Libero autem est aut fuga. Consectetur natus quis non ducimus ut dolore. Magni voluptatibus eius et maxime aut.\n\nAd officiis tempore voluptate vitae corrupti explicabo labore est. Consequatur expedita et sunt nihil aut. Deleniti porro iusto molestiae et beatae.\n\nDeleniti modi nulla qui et labore sequi corrupti. Qui voluptatem assumenda eum cupiditate et. Nesciunt ipsam ut ea possimus eum. Consectetur quidem suscipit atque dolore itaque voluptatibus et cupiditate.", + "created_at": "2016-03-22T15:20:35.777Z", + "updated_at": "2016-03-22T15:20:35.777Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 36, + "commands": "$ build command", + "job_id": null, + "name": "test build 2", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/72/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/72/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + } + ] + }, + { + "id": 37, + "project_id": 5, + "ref": "master", + "sha": "048721d90c449b244b7b4c53a9186b04330174ec", + "before_sha": null, + "push_data": null, + "created_at": "2016-03-22T15:20:35.757Z", + "updated_at": "2016-03-22T15:20:35.757Z", + "tag": null, + "yaml_errors": null, + "committed_at": null, + "gl_project_id": 5, + "status": "failed", + "started_at": null, + "finished_at": null, + "duration": null, + "statuses": [ + { + "id": 74, + "project_id": 5, + "status": "success", + "finished_at": null, + "trace": "Ad ut quod repudiandae iste dolor doloribus. Adipisci consequuntur deserunt omnis quasi eveniet et sed fugit. Aut nemo omnis molestiae impedit ex consequatur ducimus. Voluptatum exercitationem quia aut est et hic dolorem.\n\nQuasi repellendus et eaque magni eum facilis. Dolorem aperiam nam nihil pariatur praesentium ad aliquam. Commodi enim et eos tenetur. Odio voluptatibus laboriosam mollitia rerum exercitationem magnam consequuntur. Tenetur ea vel eum corporis.\n\nVoluptatibus optio in aliquid est voluptates. Ad a ut ab placeat vero blanditiis. Earum aspernatur quia beatae expedita voluptatem dignissimos provident. Quis minima id nemo ut aut est veritatis provident.\n\nRerum voluptatem quidem eius maiores magnam veniam. Voluptatem aperiam aut voluptate et nulla deserunt voluptas. Quaerat aut accusantium laborum est dolorem architecto reiciendis. Aliquam asperiores doloribus omnis maxime enim nesciunt. Eum aut rerum repellendus debitis et ut eius.\n\nQuaerat assumenda ea sit consequatur autem in. Cum eligendi voluptatem quo sed. Ut fuga iusto cupiditate autem sint.\n\nOfficia totam officiis architecto corporis molestiae amet ut. Tempora sed dolorum rerum omnis voluptatem accusantium sit eum. Quia debitis ipsum quidem aliquam inventore sunt consequatur qui.", + "created_at": "2016-03-22T15:20:35.846Z", + "updated_at": "2016-03-22T15:20:35.846Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 37, + "commands": "$ build command", + "job_id": null, + "name": "test build 2", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/74/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/74/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + }, + { + "id": 73, + "project_id": 5, + "status": "canceled", + "finished_at": null, + "trace": null, + "created_at": "2016-03-22T15:20:35.842Z", + "updated_at": "2016-03-22T15:20:35.842Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 37, + "commands": "$ build command", + "job_id": null, + "name": "test build 1", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": null + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": null + }, + "erased_by_id": null, + "erased_at": null + } + ] + }, + { + "id": 38, + "project_id": 5, + "ref": "master", + "sha": "5f923865dde3436854e9ceb9cdb7815618d4e849", + "before_sha": null, + "push_data": null, + "created_at": "2016-03-22T15:20:35.759Z", + "updated_at": "2016-03-22T15:20:35.759Z", + "tag": null, + "yaml_errors": null, + "committed_at": null, + "gl_project_id": 5, + "status": "failed", + "started_at": null, + "finished_at": null, + "duration": null, + "statuses": [ + { + "id": 76, + "project_id": 5, + "status": "success", + "finished_at": null, + "trace": "Et rerum quia ea cumque ut modi non. Libero eaque ipsam architecto maiores expedita deleniti. Ratione quia qui est id.\n\nQuod sit officiis sed unde inventore veniam quisquam velit. Ea harum cum quibusdam quisquam minima quo possimus non. Temporibus itaque aliquam aut rerum veritatis at.\n\nMagnam ipsum eius recusandae qui quis sit maiores eum. Et animi iusto aut itaque. Doloribus harum deleniti nobis accusantium et libero.\n\nRerum fuga perferendis magni commodi officiis id repudiandae. Consequatur ratione consequatur suscipit facilis sunt iure est dicta. Qui unde quasi facilis et quae nesciunt. Magnam iste et nobis officiis tenetur. Aspernatur quo et temporibus non in.\n\nNisi rerum velit est ad enim sint molestiae consequuntur. Quaerat nisi nesciunt quasi officiis. Possimus non blanditiis laborum quos.\n\nRerum laudantium facere animi qui. Ipsa est iusto magnam nihil. Enim omnis occaecati non dignissimos ut recusandae eum quasi. Qui maxime dolor et nemo voluptates incidunt quia.", + "created_at": "2016-03-22T15:20:35.882Z", + "updated_at": "2016-03-22T15:20:35.882Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 38, + "commands": "$ build command", + "job_id": null, + "name": "test build 2", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/76/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/76/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + }, + { + "id": 75, + "project_id": 5, + "status": "failed", + "finished_at": null, + "trace": "Sed et iste recusandae dicta corporis. Sunt alias porro fugit sunt. Fugiat omnis nihil dignissimos aperiam explicabo doloremque sit aut. Harum fugit expedita quia rerum ut consequatur laboriosam aliquam.\n\nNatus libero ut ut tenetur earum. Tempora omnis autem omnis et libero dolores illum autem. Deleniti eos sunt mollitia ipsam. Cum dolor repellendus dolorum sequi officia. Ullam sunt in aut pariatur excepturi.\n\nDolor nihil debitis et est eos. Cumque eos eum saepe ducimus autem. Alias architecto consequatur aut pariatur possimus. Aut quos aut incidunt quam velit et. Quas voluptatum ad dolorum dignissimos.\n\nUt voluptates consectetur illo et. Est commodi accusantium vel quo. Eos qui fugiat soluta porro.\n\nRatione possimus alias vel maxime sint totam est repellat. Ipsum corporis eos sint voluptatem eos odit. Temporibus libero nulla harum eligendi labore similique ratione magnam. Suscipit sequi in omnis neque.\n\nLaudantium dolor amet omnis placeat mollitia aut molestiae. Aut rerum similique ipsum quod illo quas unde. Sunt aut veritatis eos omnis porro. Rem veritatis mollitia praesentium dolorem. Consequatur sequi ad cumque earum omnis quia necessitatibus.", + "created_at": "2016-03-22T15:20:35.864Z", + "updated_at": "2016-03-22T15:20:35.864Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 38, + "commands": "$ build command", + "job_id": null, + "name": "test build 1", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/75/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/75/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + } + ] + }, + { + "id": 39, + "project_id": 5, + "ref": "master", + "sha": "d2d430676773caa88cdaf7c55944073b2fd5561a", + "before_sha": null, + "push_data": null, + "created_at": "2016-03-22T15:20:35.761Z", + "updated_at": "2016-03-22T15:20:35.761Z", + "tag": null, + "yaml_errors": null, + "committed_at": null, + "gl_project_id": 5, + "status": "failed", + "started_at": null, + "finished_at": null, + "duration": null, + "statuses": [ + { + "id": 78, + "project_id": 5, + "status": "success", + "finished_at": null, + "trace": "Dolorem deserunt quas quia error hic quo cum vel. Natus voluptatem cumque expedita numquam odit. Eos expedita nostrum corporis consequatur est recusandae.\n\nCulpa blanditiis rerum repudiandae alias voluptatem. Velit iusto est ullam consequatur doloribus porro. Corporis voluptas consectetur est veniam et quia quae.\n\nEt aut magni fuga nesciunt officiis molestias. Quaerat et nam necessitatibus qui rerum. Architecto quia officiis voluptatem laborum est recusandae. Quasi ducimus soluta odit necessitatibus labore numquam dignissimos. Quia facere sint temporibus inventore sunt nihil saepe dolorum.\n\nFacere dolores quis dolores a. Est minus nostrum nihil harum. Earum laborum et ipsum unde neque sit nemo. Corrupti est consequatur minima fugit. Illum voluptatem illo error ducimus officia qui debitis.\n\nDignissimos porro a autem harum aut. Aut id reprehenderit et exercitationem. Est et quisquam ipsa temporibus molestiae. Architecto natus dolore qui fugiat incidunt. Autem odit veniam excepturi et voluptatibus culpa ipsum eos.\n\nAmet quo quisquam dignissimos soluta modi dolores. Sint omnis eius optio corporis dolor. Eligendi animi porro quia placeat ut.", + "created_at": "2016-03-22T15:20:35.927Z", + "updated_at": "2016-03-22T15:20:35.927Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 39, + "commands": "$ build command", + "job_id": null, + "name": "test build 2", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/78/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/78/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + }, + { + "id": 77, + "project_id": 5, + "status": "failed", + "finished_at": null, + "trace": "Rerum ut et suscipit est perspiciatis. Inventore debitis cum eius vitae. Ex incidunt id velit aut quo nisi. Laboriosam repellat deserunt eius reiciendis architecto et. Est harum quos nesciunt nisi consectetur.\n\nAlias esse omnis sint officia est consequatur in nobis. Dignissimos dolorum vel eligendi nesciunt dolores sit. Veniam mollitia ducimus et exercitationem molestiae libero sed. Atque omnis debitis laudantium voluptatibus qui. Repellendus tempore est commodi pariatur.\n\nExpedita voluptate illum est alias non. Modi nesciunt ab assumenda laborum nulla consequatur molestias doloremque. Magnam quod officia vel explicabo accusamus ut voluptatem incidunt. Rerum ut aliquid ullam saepe. Est eligendi debitis beatae blanditiis reiciendis.\n\nQui fuga sit dolores libero maiores et suscipit. Consectetur asperiores omnis minima impedit eos fugiat. Similique omnis nisi sed vero inventore ipsum aliquam exercitationem.\n\nBlanditiis magni iure dolorum omnis ratione delectus molestiae. Atque officia dolor voluptatem culpa quod. Incidunt suscipit quidem possimus veritatis non vel. Iusto aliquid et id quia quasi.\n\nVel facere velit blanditiis incidunt cupiditate sed maiores consequuntur. Quasi quia dicta consequuntur et quia voluptatem iste id. Incidunt et rerum fuga esse sint.", + "created_at": "2016-03-22T15:20:35.905Z", + "updated_at": "2016-03-22T15:20:35.905Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 39, + "commands": "$ build command", + "job_id": null, + "name": "test build 1", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/77/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/77/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + } + ] + }, + { + "id": 40, + "project_id": 5, + "ref": "master", + "sha": "2ea1f3dec713d940208fb5ce4a38765ecb5d3f73", + "before_sha": null, + "push_data": null, + "created_at": "2016-03-22T15:20:35.763Z", + "updated_at": "2016-03-22T15:20:35.763Z", + "tag": null, + "yaml_errors": null, + "committed_at": null, + "gl_project_id": 5, + "status": "failed", + "started_at": null, + "finished_at": null, + "duration": null, + "statuses": [ + { + "id": 79, + "project_id": 5, + "status": "failed", + "finished_at": "2016-03-29T06:28:12.695Z", + "trace": "Sed culpa est et facere saepe vel id ab. Quas temporibus aut similique dolorem consequatur corporis aut praesentium. Cum officia molestiae sit earum excepturi.\n\nSint possimus aut ratione quia. Quis nesciunt ratione itaque illo. Tenetur est dolor assumenda possimus voluptatem quia minima. Accusamus reprehenderit ut et itaque non reiciendis incidunt.\n\nRerum suscipit quibusdam dolore nam omnis. Consequatur ipsa nihil ut enim blanditiis delectus. Nulla quis hic occaecati mollitia qui placeat. Quo rerum sed perferendis a accusantium consequatur commodi ut. Sit quae et cumque vel eius tempora nostrum.\n\nUllam dolorem et itaque sint est. Ea molestias quia provident dolorem vitae error et et. Ea expedita officiis iste non. Qui vitae odit saepe illum. Dolores enim ratione deserunt tempore expedita amet non neque.\n\nEligendi asperiores voluptatibus omnis repudiandae expedita distinctio qui aliquid. Autem aut doloremque distinctio ab. Nostrum sapiente repudiandae aspernatur ea et quae voluptas. Officiis perspiciatis nisi laudantium asperiores error eligendi ab. Eius quia amet magni omnis exercitationem voluptatum et.\n\nVoluptatem ullam labore quas dicta est ex voluptas. Pariatur ea modi voluptas consequatur dolores perspiciatis similique. Numquam in distinctio perspiciatis ut qui earum. Quidem omnis mollitia facere aut beatae. Ea est iure et voluptatem.", + "created_at": "2016-03-22T15:20:35.950Z", + "updated_at": "2016-03-29T06:28:12.696Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 40, + "commands": "$ build command", + "job_id": null, + "name": "test build 1", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": null + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": null + }, + "erased_by_id": null, + "erased_at": null + }, + { + "id": 80, + "project_id": 5, + "status": "success", + "finished_at": null, + "trace": "Impedit et optio nemo ipsa. Non ad non quis ut sequi laudantium omnis velit. Corporis a enim illo eos. Quia totam tempore inventore ad est.\n\nNihil recusandae cupiditate eaque voluptatem molestias sint. Consequatur id voluptatem cupiditate harum. Consequuntur iusto quaerat reiciendis aut autem libero est. Quisquam dolores veritatis rerum et sint maxime ullam libero. Id quas porro ut perspiciatis rem amet vitae.\n\nNemo inventore minus blanditiis magnam. Modi consequuntur nostrum aut voluptatem ex. Sunt rerum rem optio mollitia qui aliquam officiis officia. Aliquid eos et id aut minus beatae reiciendis.\n\nDolores non in temporibus dicta. Fugiat voluptatem est aspernatur expedita voluptatum nam qui. Quia et eligendi sit quae sint tempore exercitationem eos. Est sapiente corrupti quidem at. Qui magni odio repudiandae saepe tenetur optio dolore.\n\nEos placeat soluta at dolorem adipisci provident. Quo commodi id reprehenderit possimus quo tenetur. Ipsum et quae eligendi laborum. Et qui nesciunt at quasi quidem voluptatem cum rerum. Excepturi non facilis aut sunt vero sed.\n\nQui explicabo ratione ut eligendi recusandae. Quis quasi quas molestiae consequatur voluptatem et voluptatem. Ex repellat saepe occaecati aperiam ea eveniet dignissimos facilis.", + "created_at": "2016-03-22T15:20:35.966Z", + "updated_at": "2016-03-22T15:20:35.966Z", + "started_at": null, + "runner_id": null, + "coverage": null, + "commit_id": 40, + "commands": "$ build command", + "job_id": null, + "name": "test build 2", + "deploy": false, + "options": null, + "allow_failure": false, + "stage": "test", + "trigger_request_id": null, + "stage_idx": 1, + "tag": null, + "ref": "master", + "user_id": null, + "target_url": null, + "description": null, + "artifacts_file": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/80/p5_build_artifacts.zip" + }, + "gl_project_id": 5, + "artifacts_metadata": { + "url": "/Users/Test/Test/gitlab-development-kit/gitlab/shared/artifacts/2016_03/5/80/p5_build_artifacts_metadata.gz" + }, + "erased_by_id": null, + "erased_at": null + } + ] + } + ] +} \ No newline at end of file diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb new file mode 100644 index 0000000000..7a40a43f8a --- /dev/null +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do + describe 'restore project tree' do + + let(:user) { create(:user) } + let(:namespace) { create(:namespace, owner: user) } + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') } + let(:project) { create(:empty_project, name: 'project', path: 'project') } + let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) } + let(:restored_project_json) { project_tree_restorer.restore } + + before do + allow(shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') + end + + context 'JSON' do + it 'restores models based on JSON' do + expect(restored_project_json).to be true + end + end + end +end diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb new file mode 100644 index 0000000000..8d29b2f8fd --- /dev/null +++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb @@ -0,0 +1,149 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::ProjectTreeSaver, services: true do + describe 'saves the project tree into a json object' do + + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) } + let(:project_tree_saver) { described_class.new(project: project, shared: shared) } + let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" } + let(:user) { create(:user) } + let(:project) { setup_project } + + before do + project.team << [user, :master] + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + end + + after do + FileUtils.rm_rf(export_path) + end + + it 'saves project successfully' do + expect(project_tree_saver.save).to be true + end + + context 'JSON' do + + let(:saved_project_json) do + project_tree_saver.save + project_json(project_tree_saver.full_path) + end + + it 'saves the correct json' do + expect(saved_project_json).to include({ "visibility_level" => 20 }) + end + + it 'has events' do + expect(saved_project_json['events']).not_to be_empty + end + + it 'has milestones' do + expect(saved_project_json['milestones']).not_to be_empty + end + + it 'has merge requests' do + expect(saved_project_json['merge_requests']).not_to be_empty + end + + it 'has labels' do + expect(saved_project_json['labels']).not_to be_empty + end + + it 'has snippets' do + expect(saved_project_json['snippets']).not_to be_empty + end + + it 'has snippet notes' do + expect(saved_project_json['snippets'].first['notes']).not_to be_empty + end + + it 'has releases' do + expect(saved_project_json['releases']).not_to be_empty + end + + it 'has issues' do + expect(saved_project_json['issues']).not_to be_empty + end + + it 'has issue comments' do + expect(saved_project_json['issues'].first['notes']).not_to be_empty + end + + it 'has author on issue comments' do + expect(saved_project_json['issues'].first['notes'].first['author']).not_to be_empty + end + + it 'has project members' do + expect(saved_project_json['project_members']).not_to be_empty + end + + it 'has merge requests diffs' do + expect(saved_project_json['merge_requests'].first['merge_request_diff']).not_to be_empty + end + + it 'has merge requests comments' do + expect(saved_project_json['merge_requests'].first['notes']).not_to be_empty + end + + it 'has author on merge requests comments' do + expect(saved_project_json['merge_requests'].first['notes'].first['author']).not_to be_empty + end + + it 'has pipeline statuses' do + expect(saved_project_json['pipelines'].first['statuses']).not_to be_empty + end + + it 'has pipeline builds' do + expect(saved_project_json['pipelines'].first['statuses'].count { |hash| hash['type'] == 'Ci::Build'}).to eq(1) + end + + it 'has pipeline commits' do + expect(saved_project_json['pipelines']).not_to be_empty + end + + it 'has ci pipeline notes' do + expect(saved_project_json['pipelines'].first['notes']).not_to be_empty + end + end + end + + def setup_project + issue = create(:issue, assignee: user) + merge_request = create(:merge_request) + label = create(:label) + snippet = create(:project_snippet) + release = create(:release) + + project = create(:project, + :public, + issues: [issue], + merge_requests: [merge_request], + labels: [label], + snippets: [snippet], + releases: [release] + ) + + commit_status = create(:commit_status, project: project) + + ci_pipeline = create(:ci_pipeline, + project: project, + sha: merge_request.last_commit.id, + ref: merge_request.source_branch, + statuses: [commit_status]) + + create(:ci_build, pipeline: ci_pipeline, project: project) + create(:milestone, project: project) + create(:note, noteable: issue, project: project) + create(:note, noteable: merge_request, project: project) + create(:note, noteable: snippet, project: project) + create(:note_on_commit, + author: user, + project: project, + commit_id: ci_pipeline.sha) + project + end + + def project_json(filename) + JSON.parse(IO.read(filename)) + end +end diff --git a/spec/lib/gitlab/import_export/reader_spec.rb b/spec/lib/gitlab/import_export/reader_spec.rb new file mode 100644 index 0000000000..109522fa62 --- /dev/null +++ b/spec/lib/gitlab/import_export/reader_spec.rb @@ -0,0 +1,87 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::Reader, lib: true do + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path:'') } + let(:test_config) { 'spec/support/import_export/import_export.yml' } + let(:project_tree_hash) do + { + only: [:name, :path], + include: [:issues, :labels, + { merge_requests: { + only: [:id], + except: [:iid], + include: [:merge_request_diff, :merge_request_test] + } }, + { commit_statuses: { include: :commit } }] + } + end + + before do + allow_any_instance_of(Gitlab::ImportExport).to receive(:config_file).and_return(test_config) + end + + it 'generates hash from project tree config' do + expect(described_class.new(shared: shared).project_tree).to match(project_tree_hash) + end + + context 'individual scenarios' do + + it 'generates the correct hash for a single project relation' do + setup_yaml(project_tree: [:issues]) + + expect(described_class.new(shared: shared).project_tree).to match(include: [:issues]) + end + + it 'generates the correct hash for a multiple project relation' do + setup_yaml(project_tree: [:issues, :snippets]) + + expect(described_class.new(shared: shared).project_tree).to match(include: [:issues, :snippets]) + end + + it 'generates the correct hash for a single sub-relation' do + setup_yaml(project_tree: [issues: [:notes]]) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ issues: { include: :notes } }]) + end + + it 'generates the correct hash for a multiple sub-relation' do + setup_yaml(project_tree: [merge_requests: [:notes, :merge_request_diff]]) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ merge_requests: { include: [:notes, :merge_request_diff] } }]) + end + + it 'generates the correct hash for a sub-relation with another sub-relation' do + setup_yaml(project_tree: [merge_requests: [notes: :author]]) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ merge_requests: { include: { notes: { include: :author } } } }]) + end + + it 'generates the correct hash for a relation with included attributes' do + setup_yaml(project_tree: [:issues], included_attributes: { issues: [:name, :description] }) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ issues: { only: [:name, :description] } }]) + end + + it 'generates the correct hash for a relation with excluded attributes' do + setup_yaml(project_tree: [:issues], excluded_attributes: { issues: [:name] }) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ issues: { except: [:name] } }]) + end + + it 'generates the correct hash for a relation with both excluded and included attributes' do + setup_yaml(project_tree: [:issues], excluded_attributes: { issues: [:name] }, included_attributes: { issues: [:description] }) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ issues: { except: [:name], only: [:description] } }]) + end + + it 'generates the correct hash for a relation with custom methods' do + setup_yaml(project_tree: [:issues], methods: { issues: [:name] }) + + expect(described_class.new(shared: shared).project_tree).to match(include: [{ issues: { methods: [:name] } }]) + end + + def setup_yaml(hash) + allow(YAML).to receive(:load_file).with(test_config).and_return(hash) + end + end +end diff --git a/spec/lib/gitlab/import_export/repo_bundler_spec.rb b/spec/lib/gitlab/import_export/repo_bundler_spec.rb new file mode 100644 index 0000000000..590a9a7e1a --- /dev/null +++ b/spec/lib/gitlab/import_export/repo_bundler_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::RepoSaver, services: true do + describe 'bundle a project Git repo' do + + let(:user) { create(:user) } + let!(:project) { create(:project, :public, name: 'searchable_project') } + let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" } + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) } + let(:bundler) { described_class.new(project: project, shared: shared) } + + before do + project.team << [user, :master] + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + end + + after do + FileUtils.rm_rf(export_path) + end + + it 'bundles the repo successfully' do + expect(bundler.save).to be true + end + end +end diff --git a/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb b/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb new file mode 100644 index 0000000000..b9ffc8694a --- /dev/null +++ b/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::WikiRepoSaver, services: true do + describe 'bundle a wiki Git repo' do + + let(:user) { create(:user) } + let!(:project) { create(:project, :public, name: 'searchable_project') } + let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" } + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: project.path_with_namespace) } + let(:wiki_bundler) { described_class.new(project: project, shared: shared) } + let!(:project_wiki) { ProjectWiki.new(project, user) } + + before do + project.team << [user, :master] + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + project_wiki.wiki + project_wiki.create_page("index", "test content") + end + + after do + FileUtils.rm_rf(export_path) + end + + it 'bundles the repo successfully' do + expect(wiki_bundler.save).to be true + end + end +end diff --git a/spec/lib/gitlab/lfs/lfs_router_spec.rb b/spec/lib/gitlab/lfs/lfs_router_spec.rb index 88814bc474..659facd6c1 100644 --- a/spec/lib/gitlab/lfs/lfs_router_spec.rb +++ b/spec/lib/gitlab/lfs/lfs_router_spec.rb @@ -17,12 +17,15 @@ describe Gitlab::Lfs::Router, lib: true do } end - let(:lfs_router_auth) { new_lfs_router(project, user) } - let(:lfs_router_noauth) { new_lfs_router(project, nil) } - let(:lfs_router_public_auth) { new_lfs_router(public_project, user) } - let(:lfs_router_public_noauth) { new_lfs_router(public_project, nil) } - let(:lfs_router_forked_noauth) { new_lfs_router(forked_project, nil) } - let(:lfs_router_forked_auth) { new_lfs_router(forked_project, user_two) } + let(:lfs_router_auth) { new_lfs_router(project, user: user) } + let(:lfs_router_ci_auth) { new_lfs_router(project, ci: true) } + let(:lfs_router_noauth) { new_lfs_router(project) } + let(:lfs_router_public_auth) { new_lfs_router(public_project, user: user) } + let(:lfs_router_public_ci_auth) { new_lfs_router(public_project, ci: true) } + let(:lfs_router_public_noauth) { new_lfs_router(public_project) } + let(:lfs_router_forked_noauth) { new_lfs_router(forked_project) } + let(:lfs_router_forked_auth) { new_lfs_router(forked_project, user: user_two) } + let(:lfs_router_forked_ci_auth) { new_lfs_router(forked_project, ci: true) } let(:sample_oid) { "b68143e6463773b1b6c6fd009a76c32aeec041faff32ba2ed42fd7f708a17f80" } let(:sample_size) { 499013 } @@ -80,6 +83,7 @@ describe Gitlab::Lfs::Router, lib: true do context 'with required headers' do before do + project.lfs_objects << lfs_object env['HTTP_X_SENDFILE_TYPE'] = "X-Sendfile" end @@ -91,7 +95,6 @@ describe Gitlab::Lfs::Router, lib: true do context 'when user has project access' do before do - project.lfs_objects << lfs_object project.team << [user, :master] end @@ -104,6 +107,17 @@ describe Gitlab::Lfs::Router, lib: true do expect(lfs_router_auth.try_call[1]['X-Sendfile']).to eq(lfs_object.file.path) end end + + context 'when CI is authorized' do + it "responds with status 200" do + expect(lfs_router_ci_auth.try_call.first).to eq(200) + end + + it "responds with the file location" do + expect(lfs_router_ci_auth.try_call[1]['Content-Type']).to eq("application/octet-stream") + expect(lfs_router_ci_auth.try_call[1]['X-Sendfile']).to eq(lfs_object.file.path) + end + end end context 'without required headers' do @@ -134,143 +148,145 @@ describe Gitlab::Lfs::Router, lib: true do end describe 'download' do - describe 'when user is authenticated' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }] - }.to_json - env['rack.input'] = StringIO.new(body) + before do + body = { 'operation' => 'download', + 'objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size + }] + }.to_json + env['rack.input'] = StringIO.new(body) + end + + shared_examples 'an authorized requests' do + context 'when downloading an lfs object that is assigned to our project' do + before do + project.lfs_objects << lfs_object + end + + it 'responds with status 200 and href to download' do + response = router.try_call + expect(response.first).to eq(200) + response_body = ActiveSupport::JSON.decode(response.last.first) + + expect(response_body).to eq('objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size, + 'actions' => { + 'download' => { + 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + 'header' => { 'Authorization' => auth } + } + } + }]) + end end - describe 'when user has download access' do + context 'when downloading an lfs object that is assigned to other project' do before do - @auth = authorize(user) - env["HTTP_AUTHORIZATION"] = @auth - project.team << [user, :reporter] + public_project.lfs_objects << lfs_object end - context 'when downloading an lfs object that is assigned to our project' do - before do - project.lfs_objects << lfs_object - end + it 'responds with status 200 and error message' do + response = router.try_call + expect(response.first).to eq(200) + response_body = ActiveSupport::JSON.decode(response.last.first) - it 'responds with status 200 and href to download' do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) + expect(response_body).to eq('objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }]) + end + end - expect(response_body).to eq('objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => @auth } - } - } - }]) - end + context 'when downloading a lfs object that does not exist' do + before do + body = { 'operation' => 'download', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }] + }.to_json + env['rack.input'] = StringIO.new(body) end - context 'when downloading an lfs object that is assigned to other project' do - before do - public_project.lfs_objects << lfs_object - end + it "responds with status 200 and error message" do + response = router.try_call + expect(response.first).to eq(200) + response_body = ActiveSupport::JSON.decode(response.last.first) - it 'responds with status 200 and error message' do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) + expect(response_body).to eq('objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }]) + end + end - expect(response_body).to eq('objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", - } - }]) - end + context 'when downloading one new and one existing lfs object' do + before do + body = { 'operation' => 'download', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }, + { 'oid' => sample_oid, + 'size' => sample_size + } + ] + }.to_json + env['rack.input'] = StringIO.new(body) + project.lfs_objects << lfs_object end - context 'when downloading a lfs object that does not exist' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end + it "responds with status 200 with upload hypermedia link for the new object" do + response = router.try_call + expect(response.first).to eq(200) + response_body = ActiveSupport::JSON.decode(response.last.first) - it "responds with status 200 and error message" do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", + expect(response_body).to eq('objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }, + { 'oid' => sample_oid, + 'size' => sample_size, + 'actions' => { + 'download' => { + 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + 'header' => { 'Authorization' => auth } } - }]) - end + } + }]) end + end + end - context 'when downloading one new and one existing lfs object' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }, - { 'oid' => sample_oid, - 'size' => sample_size - } - ] - }.to_json - env['rack.input'] = StringIO.new(body) - project.lfs_objects << lfs_object - end + context 'when user is authenticated' do + let(:auth) { authorize(user) } - it "responds with status 200 with upload hypermedia link for the new object" do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) + before do + env["HTTP_AUTHORIZATION"] = auth + project.team << [user, role] + end - expect(response_body).to eq('objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", - } - }, - { 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => @auth } - } - } - }]) - end - end + it_behaves_like 'an authorized requests' do + let(:role) { :reporter } + let(:router) { lfs_router_auth } end context 'when user does is not member of the project' do - before do - @auth = authorize(user) - env["HTTP_AUTHORIZATION"] = @auth - project.team << [user, :guest] - end + let(:role) { :guest } it 'responds with 403' do expect(lfs_router_auth.try_call.first).to eq(403) @@ -278,11 +294,7 @@ describe Gitlab::Lfs::Router, lib: true do end context 'when user does not have download access' do - before do - @auth = authorize(user) - env["HTTP_AUTHORIZATION"] = @auth - project.team << [user, :guest] - end + let(:role) { :guest } it 'responds with 403' do expect(lfs_router_auth.try_call.first).to eq(403) @@ -290,18 +302,19 @@ describe Gitlab::Lfs::Router, lib: true do end end - context 'when user is not authenticated' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }], + context 'when CI is authorized' do + let(:auth) { 'gitlab-ci-token:password' } - }.to_json - env['rack.input'] = StringIO.new(body) + before do + env["HTTP_AUTHORIZATION"] = auth end + it_behaves_like 'an authorized requests' do + let(:router) { lfs_router_ci_auth } + end + end + + context 'when user is not authenticated' do describe 'is accessing public project' do before do public_project.lfs_objects << lfs_object @@ -338,17 +351,17 @@ describe Gitlab::Lfs::Router, lib: true do end describe 'upload' do - describe 'when user is authenticated' do - before do - body = { 'operation' => 'upload', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end + before do + body = { 'operation' => 'upload', + 'objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size + }] + }.to_json + env['rack.input'] = StringIO.new(body) + end + describe 'when request is authenticated' do describe 'when user has project push access' do before do @auth = authorize(user) @@ -440,15 +453,15 @@ describe Gitlab::Lfs::Router, lib: true do expect(lfs_router_auth.try_call.first).to eq(403) end end + + context 'when CI is authorized' do + it 'responds with 401' do + expect(lfs_router_ci_auth.try_call.first).to eq(401) + end + end end context 'when user is not authenticated' do - before do - env['rack.input'] = StringIO.new( - { 'objects' => [], 'operation' => 'upload' }.to_json - ) - end - context 'when user has push access' do before do project.team << [user, :master] @@ -465,6 +478,18 @@ describe Gitlab::Lfs::Router, lib: true do end end end + + context 'when CI is authorized' do + let(:auth) { 'gitlab-ci-token:password' } + + before do + env["HTTP_AUTHORIZATION"] = auth + end + + it "responds with status 403" do + expect(lfs_router_public_ci_auth.try_call.first).to eq(401) + end + end end describe 'unsupported' do @@ -490,13 +515,68 @@ describe Gitlab::Lfs::Router, lib: true do env['REQUEST_METHOD'] = 'PUT' end - describe 'to one project' do - describe 'when user has push access to the project' do + shared_examples 'unauthorized' do + context 'and request is sent by gitlab-workhorse to authorize the request' do before do - project.team << [user, :master] + header_for_upload_authorize(router.project) end - describe 'when user is authenticated' do + it 'responds with status 401' do + expect(router.try_call.first).to eq(401) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + headers_for_upload_finalize(router.project) + end + + it 'responds with status 401' do + expect(router.try_call.first).to eq(401) + end + end + + context 'and request is sent with a malformed headers' do + before do + env["PATH_INFO"] = "#{router.project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}" + env["HTTP_X_GITLAB_LFS_TMP"] = "cat /etc/passwd" + end + + it 'does not recognize it as a valid lfs command' do + expect(router.try_call).to eq(nil) + end + end + end + + shared_examples 'forbidden' do + context 'and request is sent by gitlab-workhorse to authorize the request' do + before do + header_for_upload_authorize(router.project) + end + + it 'responds with 403' do + expect(router.try_call.first).to eq(403) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + headers_for_upload_finalize(router.project) + end + + it 'responds with 403' do + expect(router.try_call.first).to eq(403) + end + end + end + + describe 'to one project' do + describe 'when user is authenticated' do + describe 'when user has push access to the project' do + before do + project.team << [user, :developer] + end + context 'and request is sent by gitlab-workhorse to authorize the request' do before do header_for_upload_authorize(project) @@ -524,100 +604,35 @@ describe Gitlab::Lfs::Router, lib: true do end end - describe 'when user is unauthenticated' do - let(:lfs_router_noauth) { new_lfs_router(project, nil) } + describe 'and user does not have push access' do + let(:router) { lfs_router_auth } - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(project) - end - - it 'responds with status 401' do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(project) - end - - it 'responds with status 401' do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - - context 'and request is sent with a malformed headers' do - before do - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}" - env["HTTP_X_GITLAB_LFS_TMP"] = "cat /etc/passwd" - end - - it 'does not recognize it as a valid lfs command' do - expect(lfs_router_noauth.try_call).to eq(nil) - end - end + it_behaves_like 'forbidden' end end - describe 'and user does not have push access' do - describe 'when user is authenticated' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(project) - end + context 'when CI is authenticated' do + let(:router) { lfs_router_ci_auth } - it 'responds with 403' do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end + it_behaves_like 'unauthorized' + end - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(project) - end + context 'for unauthenticated' do + let(:router) { new_lfs_router(project) } - it 'responds with 403' do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - end - - describe 'when user is unauthenticated' do - let(:lfs_router_noauth) { new_lfs_router(project, nil) } - - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(project) - end - - it 'responds with 401' do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(project) - end - - it 'responds with 401' do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - end + it_behaves_like 'unauthorized' end end - describe "to a forked project" do + describe 'to a forked project' do let(:forked_project) { fork_project(public_project, user) } - describe 'when user has push access to the project' do - before do - forked_project.team << [user_two, :master] - end + describe 'when user is authenticated' do + describe 'when user has push access to the project' do + before do + forked_project.team << [user_two, :developer] + end - describe 'when user is authenticated' do context 'and request is sent by gitlab-workhorse to authorize the request' do before do header_for_upload_authorize(forked_project) @@ -645,78 +660,28 @@ describe Gitlab::Lfs::Router, lib: true do end end - describe 'when user is unauthenticated' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(forked_project) - end + describe 'and user does not have push access' do + let(:router) { lfs_router_forked_auth } - it 'responds with status 401' do - expect(lfs_router_forked_noauth.try_call.first).to eq(401) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(forked_project) - end - - it 'responds with status 401' do - expect(lfs_router_forked_noauth.try_call.first).to eq(401) - end - end + it_behaves_like 'forbidden' end end - describe 'and user does not have push access' do - describe 'when user is authenticated' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(forked_project) - end + context 'when CI is authenticated' do + let(:router) { lfs_router_forked_ci_auth } - it 'responds with 403' do - expect(lfs_router_forked_auth.try_call.first).to eq(403) - end - end + it_behaves_like 'unauthorized' + end - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(forked_project) - end + context 'for unauthenticated' do + let(:router) { lfs_router_forked_noauth } - it 'responds with 403' do - expect(lfs_router_forked_auth.try_call.first).to eq(403) - end - end - end - - describe 'when user is unauthenticated' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(forked_project) - end - - it 'responds with 401' do - expect(lfs_router_forked_noauth.try_call.first).to eq(401) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(forked_project) - end - - it 'responds with 401' do - expect(lfs_router_forked_noauth.try_call.first).to eq(401) - end - end - end + it_behaves_like 'unauthorized' end describe 'and second project not related to fork or a source project' do let(:second_project) { create(:project) } - let(:lfs_router_second_project) { new_lfs_router(second_project, user) } + let(:lfs_router_second_project) { new_lfs_router(second_project, user: user) } before do public_project.lfs_objects << lfs_object @@ -745,8 +710,8 @@ describe Gitlab::Lfs::Router, lib: true do ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password) end - def new_lfs_router(project, user) - Gitlab::Lfs::Router.new(project, user, request) + def new_lfs_router(project, user: nil, ci: false) + Gitlab::Lfs::Router.new(project, user, ci, request) end def header_for_upload_authorize(project) diff --git a/spec/lib/gitlab/metrics/instrumentation_spec.rb b/spec/lib/gitlab/metrics/instrumentation_spec.rb index cdf641341c..8809b7e3f1 100644 --- a/spec/lib/gitlab/metrics/instrumentation_spec.rb +++ b/spec/lib/gitlab/metrics/instrumentation_spec.rb @@ -78,9 +78,8 @@ describe Gitlab::Metrics::Instrumentation do allow(described_class).to receive(:transaction). and_return(transaction) - expect(transaction).to receive(:add_metric). - with(described_class::SERIES, hash_including(:duration, :cpu_duration), - method: 'Dummy.foo') + expect(transaction).to receive(:measure_method). + with('Dummy.foo') @dummy.foo end @@ -158,9 +157,8 @@ describe Gitlab::Metrics::Instrumentation do allow(described_class).to receive(:transaction). and_return(transaction) - expect(transaction).to receive(:add_metric). - with(described_class::SERIES, hash_including(:duration, :cpu_duration), - method: 'Dummy#bar') + expect(transaction).to receive(:measure_method). + with('Dummy#bar') @dummy.new.bar end diff --git a/spec/lib/gitlab/metrics/method_call_spec.rb b/spec/lib/gitlab/metrics/method_call_spec.rb new file mode 100644 index 0000000000..8d05081eec --- /dev/null +++ b/spec/lib/gitlab/metrics/method_call_spec.rb @@ -0,0 +1,91 @@ +require 'spec_helper' + +describe Gitlab::Metrics::MethodCall do + let(:method_call) { described_class.new('Foo#bar', 'foo') } + + describe '#measure' do + it 'measures the performance of the supplied block' do + method_call.measure { 'foo' } + + expect(method_call.real_time).to be_a_kind_of(Numeric) + expect(method_call.cpu_time).to be_a_kind_of(Numeric) + expect(method_call.call_count).to eq(1) + end + end + + describe '#to_metric' do + it 'returns a Metric instance' do + method_call.measure { 'foo' } + metric = method_call.to_metric + + expect(metric).to be_an_instance_of(Gitlab::Metrics::Metric) + expect(metric.series).to eq('foo') + + expect(metric.values[:duration]).to be_a_kind_of(Numeric) + expect(metric.values[:cpu_duration]).to be_a_kind_of(Numeric) + expect(metric.values[:call_count]).to an_instance_of(Fixnum) + + expect(metric.tags).to eq({ method: 'Foo#bar' }) + end + end + + describe '#above_threshold?' do + it 'returns false when the total call time is not above the threshold' do + expect(method_call.above_threshold?).to eq(false) + end + + it 'returns true when the total call time is above the threshold' do + expect(method_call).to receive(:real_time).and_return(9000) + + expect(method_call.above_threshold?).to eq(true) + end + end + + describe '#call_count' do + context 'without any method calls' do + it 'returns 0' do + expect(method_call.call_count).to eq(0) + end + end + + context 'with method calls' do + it 'returns the number of method calls' do + method_call.measure { 'foo' } + + expect(method_call.call_count).to eq(1) + end + end + end + + describe '#cpu_time' do + context 'without timings' do + it 'returns 0.0' do + expect(method_call.cpu_time).to eq(0.0) + end + end + + context 'with timings' do + it 'returns the total CPU time' do + method_call.measure { 'foo' } + + expect(method_call.cpu_time >= 0.0).to be(true) + end + end + end + + describe '#real_time' do + context 'without timings' do + it 'returns 0.0' do + expect(method_call.real_time).to eq(0.0) + end + end + + context 'with timings' do + it 'returns the total real time' do + method_call.measure { 'foo' } + + expect(method_call.real_time >= 0.0).to be(true) + end + end + end +end diff --git a/spec/lib/gitlab/metrics/rack_middleware_spec.rb b/spec/lib/gitlab/metrics/rack_middleware_spec.rb index 40289f8b97..f264ed6402 100644 --- a/spec/lib/gitlab/metrics/rack_middleware_spec.rb +++ b/spec/lib/gitlab/metrics/rack_middleware_spec.rb @@ -58,6 +58,22 @@ describe Gitlab::Metrics::RackMiddleware do expect(transaction.values[:request_method]).to eq('GET') expect(transaction.values[:request_uri]).to eq('/foo') end + + context "when URI includes sensitive parameters" do + let(:env) do + { + 'REQUEST_METHOD' => 'GET', + 'REQUEST_URI' => '/foo?private_token=my-token', + 'PATH_INFO' => '/foo', + 'QUERY_STRING' => 'private_token=my_token', + 'action_dispatch.parameter_filter' => [:private_token] + } + end + + it 'stores the request URI with the sensitive parameters filtered' do + expect(transaction.values[:request_uri]).to eq('/foo?private_token=[FILTERED]') + end + end end describe '#tag_controller' do diff --git a/spec/lib/gitlab/metrics/transaction_spec.rb b/spec/lib/gitlab/metrics/transaction_spec.rb index 1d5a51a157..3b1c67a214 100644 --- a/spec/lib/gitlab/metrics/transaction_spec.rb +++ b/spec/lib/gitlab/metrics/transaction_spec.rb @@ -46,6 +46,22 @@ describe Gitlab::Metrics::Transaction do end end + describe '#measure_method' do + it 'adds a new method if it does not exist already' do + transaction.measure_method('Foo#bar') { 'foo' } + + expect(transaction.methods['Foo#bar']). + to be_an_instance_of(Gitlab::Metrics::MethodCall) + end + + it 'adds timings to an existing method call' do + transaction.measure_method('Foo#bar') { 'foo' } + transaction.measure_method('Foo#bar') { 'foo' } + + expect(transaction.methods['Foo#bar'].call_count).to eq(2) + end + end + describe '#increment' do it 'increments a counter' do transaction.increment(:time, 1) diff --git a/spec/lib/gitlab/reference_extractor_spec.rb b/spec/lib/gitlab/reference_extractor_spec.rb index 7c617723e6..7b4ccc8391 100644 --- a/spec/lib/gitlab/reference_extractor_spec.rb +++ b/spec/lib/gitlab/reference_extractor_spec.rb @@ -105,7 +105,8 @@ describe Gitlab::ReferenceExtractor, lib: true do it 'returns JIRA issues for a JIRA-integrated project' do subject.analyze('JIRA-123 and FOOBAR-4567') - expect(subject.issues).to eq [JiraIssue.new('JIRA-123', project), JiraIssue.new('FOOBAR-4567', project)] + expect(subject.issues).to eq [ExternalIssue.new('JIRA-123', project), + ExternalIssue.new('FOOBAR-4567', project)] end end diff --git a/spec/lib/gitlab/gitignore_spec.rb b/spec/lib/gitlab/template/gitignore_spec.rb similarity index 87% rename from spec/lib/gitlab/gitignore_spec.rb rename to spec/lib/gitlab/template/gitignore_spec.rb index 72baa516cc..bc0ec9325c 100644 --- a/spec/lib/gitlab/gitignore_spec.rb +++ b/spec/lib/gitlab/template/gitignore_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe Gitlab::Gitignore do - subject { Gitlab::Gitignore } +describe Gitlab::Template::Gitignore do + subject { described_class } describe '.all' do it 'strips the gitignore suffix' do @@ -24,7 +24,7 @@ describe Gitlab::Gitignore do it 'returns the Gitignore object of a valid file' do ruby = subject.find('Ruby') - expect(ruby).to be_a Gitlab::Gitignore + expect(ruby).to be_a Gitlab::Template::Gitignore expect(ruby.name).to eq('Ruby') end end diff --git a/spec/mailers/notify_spec.rb b/spec/mailers/notify_spec.rb index 1e6eb20ab3..ae55a01ebe 100644 --- a/spec/mailers/notify_spec.rb +++ b/spec/mailers/notify_spec.rb @@ -401,23 +401,56 @@ describe Notify do end describe 'project access requested' do - let(:project) { create(:project) } - let(:user) { create(:user) } - let(:project_member) do - project.request_access(user) - project.members.request.find_by(user_id: user.id) + context 'for a project in a user namespace' do + let(:project) { create(:project).tap { |p| p.team << [p.owner, :master, p.owner] } } + let(:user) { create(:user) } + let(:project_member) do + project.request_access(user) + project.members.request.find_by(user_id: user.id) + end + subject { Notify.member_access_requested_email('project', project_member.id) } + + it_behaves_like 'an email sent from GitLab' + it_behaves_like 'it should not have Gmail Actions links' + it_behaves_like "a user cannot unsubscribe through footer link" + + it 'contains all the useful information' do + to_emails = subject.header[:to].addrs + expect(to_emails.size).to eq(1) + expect(to_emails[0].address).to eq(project.members.owners_and_masters.first.user.notification_email) + + is_expected.to have_subject "Request to join the #{project.name_with_namespace} project" + is_expected.to have_body_text /#{project.name_with_namespace}/ + is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/ + is_expected.to have_body_text /#{project_member.human_access}/ + end end - subject { Notify.member_access_requested_email('project', project_member.id) } - it_behaves_like 'an email sent from GitLab' - it_behaves_like 'it should not have Gmail Actions links' - it_behaves_like "a user cannot unsubscribe through footer link" + context 'for a project in a group' do + let(:group_owner) { create(:user) } + let(:group) { create(:group).tap { |g| g.add_owner(group_owner) } } + let(:project) { create(:project, namespace: group) } + let(:user) { create(:user) } + let(:project_member) do + project.request_access(user) + project.members.request.find_by(user_id: user.id) + end + subject { Notify.member_access_requested_email('project', project_member.id) } - it 'contains all the useful information' do - is_expected.to have_subject "Request to join the #{project.name_with_namespace} project" - is_expected.to have_body_text /#{project.name_with_namespace}/ - is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/ - is_expected.to have_body_text /#{project_member.human_access}/ + it_behaves_like 'an email sent from GitLab' + it_behaves_like 'it should not have Gmail Actions links' + it_behaves_like "a user cannot unsubscribe through footer link" + + it 'contains all the useful information' do + to_emails = subject.header[:to].addrs + expect(to_emails.size).to eq(1) + expect(to_emails[0].address).to eq(group.members.owners_and_masters.first.user.notification_email) + + is_expected.to have_subject "Request to join the #{project.name_with_namespace} project" + is_expected.to have_body_text /#{project.name_with_namespace}/ + is_expected.to have_body_text /#{namespace_project_project_members_url(project.namespace, project)}/ + is_expected.to have_body_text /#{project_member.human_access}/ + end end end diff --git a/spec/mailers/previews/devise_mailer_preview.rb b/spec/mailers/previews/devise_mailer_preview.rb index dc3062a433..d6588efc48 100644 --- a/spec/mailers/previews/devise_mailer_preview.rb +++ b/spec/mailers/previews/devise_mailer_preview.rb @@ -1,11 +1,30 @@ class DeviseMailerPreview < ActionMailer::Preview def confirmation_instructions_for_signup - user = User.new(name: 'Jane Doe', email: 'signup@example.com') - DeviseMailer.confirmation_instructions(user, 'faketoken', {}) + DeviseMailer.confirmation_instructions(unsaved_user, 'faketoken', {}) end def confirmation_instructions_for_new_email user = User.last + user.unconfirmed_email = 'unconfirmed@example.com' + DeviseMailer.confirmation_instructions(user, 'faketoken', {}) end + + def reset_password_instructions + DeviseMailer.reset_password_instructions(unsaved_user, 'faketoken', {}) + end + + def unlock_instructions + DeviseMailer.unlock_instructions(unsaved_user, 'faketoken', {}) + end + + def password_change + DeviseMailer.password_change(unsaved_user, {}) + end + + private + + def unsaved_user + User.new(name: 'Jane Doe', email: 'jdoe@example.com') + end end diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb index 5d1fa8226e..8154001cf4 100644 --- a/spec/models/build_spec.rb +++ b/spec/models/build_spec.rb @@ -2,7 +2,12 @@ require 'spec_helper' describe Ci::Build, models: true do let(:project) { create(:project) } - let(:pipeline) { create(:ci_pipeline, project: project) } + + let(:pipeline) do + create(:ci_pipeline, project: project, + sha: project.commit.id) + end + let(:build) { create(:ci_build, pipeline: pipeline) } it { is_expected.to validate_presence_of :ref } @@ -36,32 +41,44 @@ describe Ci::Build, models: true do subject { build.ignored? } context 'if build is not allowed to fail' do - before { build.allow_failure = false } + before do + build.allow_failure = false + end context 'and build.status is success' do - before { build.status = 'success' } + before do + build.status = 'success' + end it { is_expected.to be_falsey } end context 'and build.status is failed' do - before { build.status = 'failed' } + before do + build.status = 'failed' + end it { is_expected.to be_falsey } end end context 'if build is allowed to fail' do - before { build.allow_failure = true } + before do + build.allow_failure = true + end context 'and build.status is success' do - before { build.status = 'success' } + before do + build.status = 'success' + end it { is_expected.to be_falsey } end context 'and build.status is failed' do - before { build.status = 'failed' } + before do + build.status = 'failed' + end it { is_expected.to be_truthy } end @@ -75,7 +92,9 @@ describe Ci::Build, models: true do context 'if build.trace contains text' do let(:text) { 'example output' } - before { build.trace = text } + before do + build.trace = text + end it { is_expected.to include(text) } it { expect(subject.length).to be >= text.length } @@ -188,7 +207,9 @@ describe Ci::Build, models: true do ] end - before { build.update_attributes(stage: 'stage') } + before do + build.update_attributes(stage: 'stage') + end it { is_expected.to eq(predefined_variables + yaml_variables) } @@ -199,7 +220,9 @@ describe Ci::Build, models: true do ] end - before { build.update_attributes(tag: true) } + before do + build.update_attributes(tag: true) + end it { is_expected.to eq(tag_variable + predefined_variables + yaml_variables) } end @@ -257,57 +280,6 @@ describe Ci::Build, models: true do end end - describe '#can_be_served?' do - let(:runner) { create(:ci_runner) } - - before { build.project.runners << runner } - - context 'when runner does not have tags' do - it 'can handle builds without tags' do - expect(build.can_be_served?(runner)).to be_truthy - end - - it 'cannot handle build with tags' do - build.tag_list = ['aa'] - expect(build.can_be_served?(runner)).to be_falsey - end - end - - context 'when runner has tags' do - before { runner.tag_list = ['bb', 'cc'] } - - shared_examples 'tagged build picker' do - it 'can handle build with matching tags' do - build.tag_list = ['bb'] - expect(build.can_be_served?(runner)).to be_truthy - end - - it 'cannot handle build without matching tags' do - build.tag_list = ['aa'] - expect(build.can_be_served?(runner)).to be_falsey - end - end - - context 'when runner can pick untagged jobs' do - it 'can handle builds without tags' do - expect(build.can_be_served?(runner)).to be_truthy - end - - it_behaves_like 'tagged build picker' - end - - context 'when runner can not pick untagged jobs' do - before { runner.run_untagged = false } - - it 'can not handle builds without tags' do - expect(build.can_be_served?(runner)).to be_falsey - end - - it_behaves_like 'tagged build picker' - end - end - end - describe '#has_tags?' do context 'when build has tags' do subject { create(:ci_build, tag_list: ['tag']) } @@ -348,7 +320,7 @@ describe Ci::Build, models: true do end it 'that cannot handle build' do - expect_any_instance_of(Ci::Build).to receive(:can_be_served?).and_return(false) + expect_any_instance_of(Ci::Runner).to receive(:can_pick?).and_return(false) is_expected.to be_falsey end @@ -360,7 +332,9 @@ describe Ci::Build, models: true do %w(pending).each do |state| context "if commit_status.status is #{state}" do - before { build.status = state } + before do + build.status = state + end it { is_expected.to be_truthy } @@ -379,7 +353,9 @@ describe Ci::Build, models: true do %w(success failed canceled running).each do |state| context "if commit_status.status is #{state}" do - before { build.status = state } + before do + build.status = state + end it { is_expected.to be_falsey } end @@ -390,7 +366,10 @@ describe Ci::Build, models: true do subject { build.artifacts? } context 'artifacts archive does not exist' do - before { build.update_attributes(artifacts_file: nil) } + before do + build.update_attributes(artifacts_file: nil) + end + it { is_expected.to be_falsy } end @@ -623,7 +602,9 @@ describe Ci::Build, models: true do let!(:build) { create(:ci_build, :trace, :success, :artifacts) } describe '#erase' do - before { build.erase(erased_by: user) } + before do + build.erase(erased_by: user) + end context 'erased by user' do let!(:user) { create(:user, username: 'eraser') } @@ -660,7 +641,9 @@ describe Ci::Build, models: true do end context 'build has been erased' do - before { build.erase } + before do + build.erase + end it { is_expected.to be true } end @@ -668,7 +651,9 @@ describe Ci::Build, models: true do context 'metadata and build trace are not available' do let!(:build) { create(:ci_build, :success, :artifacts) } - before { build.remove_artifacts_metadata! } + before do + build.remove_artifacts_metadata! + end describe '#erase' do it 'should not raise error' do @@ -678,4 +663,10 @@ describe Ci::Build, models: true do end end end + + describe '#commit' do + it 'returns commit pipeline has been created for' do + expect(build.commit).to eq project.commit + end + end end diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 0d769ed732..34507cf508 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -258,6 +258,19 @@ describe Ci::Pipeline, models: true do end end end + + context 'when no builds created' do + let(:pipeline) { build(:ci_pipeline) } + + before do + stub_ci_pipeline_yaml_file(YAML.dump(before_script: ['ls'])) + end + + it 'returns false' do + expect(pipeline.create_builds(nil)).to be_falsey + expect(pipeline).not_to be_persisted + end + end end describe "#finished_at" do diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 5d04d8ffcf..ef65eb9932 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -20,34 +20,36 @@ describe Ci::Runner, models: true do end describe '#display_name' do - it 'should return the description if it has a value' do + it 'returns the description if it has a value' do runner = FactoryGirl.build(:ci_runner, description: 'Linux/Ruby-1.9.3-p448') expect(runner.display_name).to eq 'Linux/Ruby-1.9.3-p448' end - it 'should return the token if it does not have a description' do + it 'returns the token if it does not have a description' do runner = FactoryGirl.create(:ci_runner) expect(runner.display_name).to eq runner.description end - it 'should return the token if the description is an empty string' do + it 'returns the token if the description is an empty string' do runner = FactoryGirl.build(:ci_runner, description: '', token: 'token') expect(runner.display_name).to eq runner.token end end - describe :assign_to do + describe '#assign_to' do let!(:project) { FactoryGirl.create :empty_project } let!(:shared_runner) { FactoryGirl.create(:ci_runner, :shared) } - before { shared_runner.assign_to(project) } + before do + shared_runner.assign_to(project) + end it { expect(shared_runner).to be_specific } it { expect(shared_runner.projects).to eq([project]) } it { expect(shared_runner.only_for?(project)).to be_truthy } end - describe :online do + describe '.online' do subject { Ci::Runner.online } before do @@ -58,60 +60,269 @@ describe Ci::Runner, models: true do it { is_expected.to eq([@runner2])} end - describe :online? do + describe '#online?' do let(:runner) { FactoryGirl.create(:ci_runner, :shared) } subject { runner.online? } context 'never contacted' do - before { runner.contacted_at = nil } + before do + runner.contacted_at = nil + end it { is_expected.to be_falsey } end context 'contacted long time ago time' do - before { runner.contacted_at = 1.year.ago } + before do + runner.contacted_at = 1.year.ago + end it { is_expected.to be_falsey } end context 'contacted 1s ago' do - before { runner.contacted_at = 1.second.ago } + before do + runner.contacted_at = 1.second.ago + end it { is_expected.to be_truthy } end end - describe :status do + describe '#can_pick?' do + let(:project) { create(:project) } + let(:pipeline) { create(:ci_pipeline, project: project) } + let(:build) { create(:ci_build, pipeline: pipeline) } + let(:runner) { create(:ci_runner) } + + before do + build.project.runners << runner + end + + context 'when runner does not have tags' do + it 'can handle builds without tags' do + expect(runner.can_pick?(build)).to be_truthy + end + + it 'cannot handle build with tags' do + build.tag_list = ['aa'] + + expect(runner.can_pick?(build)).to be_falsey + end + end + + context 'when runner has tags' do + before do + runner.tag_list = ['bb', 'cc'] + end + + shared_examples 'tagged build picker' do + it 'can handle build with matching tags' do + build.tag_list = ['bb'] + + expect(runner.can_pick?(build)).to be_truthy + end + + it 'cannot handle build without matching tags' do + build.tag_list = ['aa'] + + expect(runner.can_pick?(build)).to be_falsey + end + end + + context 'when runner can pick untagged jobs' do + it 'can handle builds without tags' do + expect(runner.can_pick?(build)).to be_truthy + end + + it_behaves_like 'tagged build picker' + end + + context 'when runner cannot pick untagged jobs' do + before do + runner.run_untagged = false + end + + it 'cannot handle builds without tags' do + expect(runner.can_pick?(build)).to be_falsey + end + + it_behaves_like 'tagged build picker' + end + end + + context 'when runner is locked' do + before do + runner.locked = true + end + + shared_examples 'locked build picker' do + context 'when runner cannot pick untagged jobs' do + before do + runner.run_untagged = false + end + + it 'cannot handle builds without tags' do + expect(runner.can_pick?(build)).to be_falsey + end + end + + context 'when having runner tags' do + before do + runner.tag_list = ['bb', 'cc'] + end + + it 'cannot handle it for builds without matching tags' do + build.tag_list = ['aa'] + + expect(runner.can_pick?(build)).to be_falsey + end + end + end + + context 'when serving the same project' do + it 'can handle it' do + expect(runner.can_pick?(build)).to be_truthy + end + + it_behaves_like 'locked build picker' + + context 'when having runner tags' do + before do + runner.tag_list = ['bb', 'cc'] + build.tag_list = ['bb'] + end + + it 'can handle it for matching tags' do + expect(runner.can_pick?(build)).to be_truthy + end + end + end + + context 'serving a different project' do + before do + runner.runner_projects.destroy_all + end + + it 'cannot handle it' do + expect(runner.can_pick?(build)).to be_falsey + end + + it_behaves_like 'locked build picker' + + context 'when having runner tags' do + before do + runner.tag_list = ['bb', 'cc'] + build.tag_list = ['bb'] + end + + it 'cannot handle it for matching tags' do + expect(runner.can_pick?(build)).to be_falsey + end + end + end + end + end + + describe '#status' do let(:runner) { FactoryGirl.create(:ci_runner, :shared, contacted_at: 1.second.ago) } subject { runner.status } context 'never connected' do - before { runner.contacted_at = nil } + before do + runner.contacted_at = nil + end it { is_expected.to eq(:not_connected) } end context 'contacted 1s ago' do - before { runner.contacted_at = 1.second.ago } + before do + runner.contacted_at = 1.second.ago + end it { is_expected.to eq(:online) } end context 'contacted long time ago' do - before { runner.contacted_at = 1.year.ago } + before do + runner.contacted_at = 1.year.ago + end it { is_expected.to eq(:offline) } end context 'inactive' do - before { runner.active = false } + before do + runner.active = false + end it { is_expected.to eq(:paused) } end end + describe '.assignable_for' do + let(:runner) { create(:ci_runner) } + let(:project) { create(:project) } + let(:another_project) { create(:project) } + + before do + project.runners << runner + end + + context 'with shared runners' do + before do + runner.update(is_shared: true) + end + + context 'does not give owned runner' do + subject { Ci::Runner.assignable_for(project) } + + it { is_expected.to be_empty } + end + + context 'does not give shared runner' do + subject { Ci::Runner.assignable_for(another_project) } + + it { is_expected.to be_empty } + end + end + + context 'with unlocked runner' do + context 'does not give owned runner' do + subject { Ci::Runner.assignable_for(project) } + + it { is_expected.to be_empty } + end + + context 'does give a specific runner' do + subject { Ci::Runner.assignable_for(another_project) } + + it { is_expected.to contain_exactly(runner) } + end + end + + context 'with locked runner' do + before do + runner.update(locked: true) + end + + context 'does not give owned runner' do + subject { Ci::Runner.assignable_for(project) } + + it { is_expected.to be_empty } + end + + context 'does not give a locked runner' do + subject { Ci::Runner.assignable_for(another_project) } + + it { is_expected.to be_empty } + end + end + end + describe "belongs_to_one_project?" do it "returns false if there are two projects runner assigned to" do runner = FactoryGirl.create(:ci_runner) diff --git a/spec/models/commit_spec.rb b/spec/models/commit_spec.rb index beca8708c9..ba02d5fe97 100644 --- a/spec/models/commit_spec.rb +++ b/spec/models/commit_spec.rb @@ -207,4 +207,16 @@ eos expect(commit.participants).to include(note1.author, note2.author) end end + + describe '#uri_type' do + it 'returns the URI type at the given path' do + expect(commit.uri_type('files/html')).to be(:tree) + expect(commit.uri_type('files/images/logo-black.png')).to be(:raw) + expect(commit.uri_type('files/js/application.js')).to be(:blob) + end + + it "returns nil if the path doesn't exists" do + expect(commit.uri_type('this/path/doesnt/exist')).to be_nil + end + end end diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb index 8fb605fff8..96397d7c8a 100644 --- a/spec/models/commit_status_spec.rb +++ b/spec/models/commit_status_spec.rb @@ -1,8 +1,13 @@ require 'spec_helper' describe CommitStatus, models: true do - let(:pipeline) { FactoryGirl.create :ci_pipeline } - let(:commit_status) { FactoryGirl.create :commit_status, pipeline: pipeline } + let(:project) { create(:project) } + + let(:pipeline) do + create(:ci_pipeline, project: project, sha: project.commit.id) + end + + let(:commit_status) { create(:commit_status, pipeline: pipeline) } it { is_expected.to belong_to(:pipeline) } it { is_expected.to belong_to(:user) } @@ -13,7 +18,7 @@ describe CommitStatus, models: true do it { is_expected.to delegate_method(:sha).to(:pipeline) } it { is_expected.to delegate_method(:short_sha).to(:pipeline) } - + it { is_expected.to respond_to :success? } it { is_expected.to respond_to :failed? } it { is_expected.to respond_to :running? } @@ -116,7 +121,7 @@ describe CommitStatus, models: true do it { is_expected.to be > 0.0 } end end - + describe :latest do subject { CommitStatus.latest.order(:id) } @@ -198,4 +203,10 @@ describe CommitStatus, models: true do end end end + + describe '#commit' do + it 'returns commit pipeline has been created for' do + expect(commit_status.commit).to eq project.commit + end + end end diff --git a/spec/models/concerns/participable_spec.rb b/spec/models/concerns/participable_spec.rb index 7e4ea0f2d6..a9f4ef9ee5 100644 --- a/spec/models/concerns/participable_spec.rb +++ b/spec/models/concerns/participable_spec.rb @@ -37,6 +37,16 @@ describe Participable, models: true do expect(participants).to include(user3) end + it 'caches the raw list of participants' do + instance = model.new + user1 = build(:user) + + expect(instance).to receive(:raw_participants).once + + instance.participants(user1) + instance.participants(user1) + end + it 'supports attributes returning another Participable' do other_model = Class.new { include Participable } diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index ccdcb29f77..2c19aa3f67 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -158,6 +158,18 @@ describe Group, models: true do it { expect(group.has_master?(@members[:requester])).to be_falsey } end + describe '#owners' do + let(:owner) { create(:user) } + let(:developer) { create(:user) } + + it 'returns the owners of a Group' do + group.add_owner(owner) + group.add_developer(developer) + + expect(group.owners).to eq([owner]) + end + end + def setup_group_members(group) members = { owner: create(:user), diff --git a/spec/models/jira_issue_spec.rb b/spec/models/jira_issue_spec.rb deleted file mode 100644 index 1634265b43..0000000000 --- a/spec/models/jira_issue_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -require 'spec_helper' - -describe JiraIssue do - let(:project) { create(:project) } - subject { JiraIssue.new('JIRA-123', project) } - - describe 'id' do - subject { super().id } - it { is_expected.to eq('JIRA-123') } - end - - describe 'iid' do - subject { super().iid } - it { is_expected.to eq('JIRA-123') } - end - - describe 'to_s' do - subject { super().to_s } - it { is_expected.to eq('JIRA-123') } - end - - describe :== do - specify { expect(subject).to eq(JiraIssue.new('JIRA-123', project)) } - specify { expect(subject).not_to eq(JiraIssue.new('JIRA-124', project)) } - - it 'only compares with JiraIssues' do - expect(subject).not_to eq('JIRA-123') - end - end -end diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb index 26fbedbef2..49cf3d8633 100644 --- a/spec/models/key_spec.rb +++ b/spec/models/key_spec.rb @@ -26,7 +26,7 @@ describe Key, models: true do end end - context "validation of uniqueness" do + context "validation of uniqueness (based on fingerprint uniqueness)" do let(:user) { create(:user) } it "accepts the key once" do diff --git a/spec/models/notification_setting_spec.rb b/spec/models/notification_setting_spec.rb index 4e24e89b00..df336a6eff 100644 --- a/spec/models/notification_setting_spec.rb +++ b/spec/models/notification_setting_spec.rb @@ -12,5 +12,30 @@ RSpec.describe NotificationSetting, type: :model do it { is_expected.to validate_presence_of(:user) } it { is_expected.to validate_presence_of(:level) } it { is_expected.to validate_uniqueness_of(:user_id).scoped_to([:source_id, :source_type]).with_message(/already exists in source/) } + + context "events" do + let(:user) { create(:user) } + let(:notification_setting) { NotificationSetting.new(source_id: 1, source_type: 'Project', user_id: user.id) } + + before do + notification_setting.level = "custom" + notification_setting.new_note = "true" + notification_setting.new_issue = 1 + notification_setting.close_issue = "1" + notification_setting.merge_merge_request = "t" + notification_setting.close_merge_request = "nil" + notification_setting.reopen_merge_request = "false" + notification_setting.save + end + + it "parses boolean before saving" do + expect(notification_setting.new_note).to eq(true) + expect(notification_setting.new_issue).to eq(true) + expect(notification_setting.close_issue).to eq(true) + expect(notification_setting.merge_merge_request).to eq(true) + expect(notification_setting.close_merge_request).to eq(false) + expect(notification_setting.reopen_merge_request).to eq(false) + end + end end end diff --git a/spec/models/personal_access_token_spec.rb b/spec/models/personal_access_token_spec.rb new file mode 100644 index 0000000000..46eb71cef1 --- /dev/null +++ b/spec/models/personal_access_token_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe PersonalAccessToken, models: true do + describe ".generate" do + it "generates a random token" do + personal_access_token = PersonalAccessToken.generate({}) + expect(personal_access_token.token).to be_present + end + + it "doesn't save the record" do + personal_access_token = PersonalAccessToken.generate({}) + expect(personal_access_token).not_to be_persisted + end + end +end diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 5309cfb99f..c951732454 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -76,7 +76,8 @@ describe JiraService, models: true do end it "should call JIRA API" do - @jira_service.execute(merge_request, JiraIssue.new("JIRA-123", project)) + @jira_service.execute(merge_request, + ExternalIssue.new("JIRA-123", project)) expect(WebMock).to have_requested(:post, @comment_url).with( body: /Issue solved with/ ).once @@ -84,7 +85,8 @@ describe JiraService, models: true do it "calls the api with jira_issue_transition_id" do @jira_service.jira_issue_transition_id = 'this-is-a-custom-id' - @jira_service.execute(merge_request, JiraIssue.new("JIRA-123", project)) + @jira_service.execute(merge_request, + ExternalIssue.new("JIRA-123", project)) expect(WebMock).to have_requested(:post, @api_url).with( body: /this-is-a-custom-id/ ).once diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index fedab1f913..53c8408633 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -220,7 +220,7 @@ describe Project, models: true do end end - describe :find_with_namespace do + describe '.find_with_namespace' do context 'with namespace' do before do @group = create :group, name: 'gitlab' @@ -231,6 +231,22 @@ describe Project, models: true do it { expect(Project.find_with_namespace('GitLab/GitlabHQ')).to eq(@project) } it { expect(Project.find_with_namespace('gitlab-ci')).to be_nil } end + + context 'when multiple projects using a similar name exist' do + let(:group) { create(:group, name: 'gitlab') } + + let!(:project1) do + create(:empty_project, name: 'gitlab1', path: 'gitlab', namespace: group) + end + + let!(:project2) do + create(:empty_project, name: 'gitlab2', path: 'GITLAB', namespace: group) + end + + it 'returns the row where the path matches literally' do + expect(Project.find_with_namespace('gitlab/GITLAB')).to eq(project2) + end + end end describe :to_param do diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 8c2347992f..d8350000bf 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -31,6 +31,47 @@ describe Repository, models: true do it { is_expected.not_to include('v1.0.0') } end + describe 'tags_sorted_by' do + context 'name' do + subject { repository.tags_sorted_by('name').map(&:name) } + + it { is_expected.to eq(['v1.1.0', 'v1.0.0']) } + end + + context 'updated' do + let(:tag_a) { repository.find_tag('v1.0.0') } + let(:tag_b) { repository.find_tag('v1.1.0') } + + context 'desc' do + subject { repository.tags_sorted_by('updated_desc').map(&:name) } + + before do + double_first = double(committed_date: Time.now) + double_last = double(committed_date: Time.now - 1.second) + + allow(repository).to receive(:commit).with(tag_a.target).and_return(double_first) + allow(repository).to receive(:commit).with(tag_b.target).and_return(double_last) + end + + it { is_expected.to eq(['v1.0.0', 'v1.1.0']) } + end + + context 'asc' do + subject { repository.tags_sorted_by('updated_asc').map(&:name) } + + before do + double_first = double(committed_date: Time.now - 1.second) + double_last = double(committed_date: Time.now) + + allow(repository).to receive(:commit).with(tag_a.target).and_return(double_last) + allow(repository).to receive(:commit).with(tag_b.target).and_return(double_first) + end + + it { is_expected.to eq(['v1.1.0', 'v1.0.0']) } + end + end + end + describe :last_commit_for_path do subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id } diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb index 0c19094ec5..f22db61e74 100644 --- a/spec/requests/api/api_helpers_spec.rb +++ b/spec/requests/api/api_helpers_spec.rb @@ -1,8 +1,10 @@ require 'spec_helper' -describe API, api: true do +describe API::Helpers, api: true do + include API::Helpers include ApiHelpers + let(:user) { create(:user) } let(:admin) { create(:admin) } let(:key) { create(:key, user: user) } @@ -39,24 +41,64 @@ describe API, api: true do end describe ".current_user" do - it "should return nil for an invalid token" do - env[API::Helpers::PRIVATE_TOKEN_HEADER] = 'invalid token' - allow_any_instance_of(self.class).to receive(:doorkeeper_guard){ false } - expect(current_user).to be_nil + describe "when authenticating using a user's private token" do + it "should return nil for an invalid token" do + env[API::Helpers::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::Helpers::PRIVATE_TOKEN_HEADER] = user.private_token + allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false) + expect(current_user).to be_nil + end + + it "should leave user as is when sudo not specified" do + env[API::Helpers::PRIVATE_TOKEN_HEADER] = user.private_token + expect(current_user).to eq(user) + clear_env + params[API::Helpers::PRIVATE_TOKEN_PARAM] = user.private_token + expect(current_user).to eq(user) + end end - it "should return nil for a user without access" do - env[API::Helpers::PRIVATE_TOKEN_HEADER] = user.private_token - allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false) - expect(current_user).to be_nil - end + describe "when authenticating using a user's personal access tokens" do + let(:personal_access_token) { create(:personal_access_token, user: user) } - it "should leave user as is when sudo not specified" do - env[API::Helpers::PRIVATE_TOKEN_HEADER] = user.private_token - expect(current_user).to eq(user) - clear_env - params[API::Helpers::PRIVATE_TOKEN_PARAM] = user.private_token - expect(current_user).to eq(user) + it "should return nil for an invalid token" do + env[API::Helpers::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::Helpers::PRIVATE_TOKEN_HEADER] = personal_access_token.token + allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false) + expect(current_user).to be_nil + end + + it "should leave user as is when sudo not specified" do + env[API::Helpers::PRIVATE_TOKEN_HEADER] = personal_access_token.token + expect(current_user).to eq(user) + clear_env + params[API::Helpers::PRIVATE_TOKEN_PARAM] = personal_access_token.token + expect(current_user).to eq(user) + end + + it 'does not allow revoked tokens' do + personal_access_token.revoke! + env[API::Helpers::PRIVATE_TOKEN_HEADER] = personal_access_token.token + allow_any_instance_of(self.class).to receive(:doorkeeper_guard){ false } + expect(current_user).to be_nil + end + + it 'does not allow expired tokens' do + personal_access_token.update_attributes!(expires_at: 1.day.ago) + env[API::Helpers::PRIVATE_TOKEN_HEADER] = personal_access_token.token + allow_any_instance_of(self.class).to receive(:doorkeeper_guard){ false } + expect(current_user).to be_nil + end end it "should change current user to sudo when admin" do diff --git a/spec/requests/api/award_emoji_spec.rb b/spec/requests/api/award_emoji_spec.rb new file mode 100644 index 0000000000..2e65e7f192 --- /dev/null +++ b/spec/requests/api/award_emoji_spec.rb @@ -0,0 +1,198 @@ +require 'spec_helper' + +describe API::API, api: true do + include ApiHelpers + let(:user) { create(:user) } + let!(:project) { create(:project) } + let(:issue) { create(:issue, project: project, author: user) } + let!(:award_emoji) { create(:award_emoji, awardable: issue, user: user) } + let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } + let!(:downvote) { create(:award_emoji, :downvote, awardable: merge_request, user: user) } + let!(:note) { create(:note, project: project, noteable: issue) } + + before { project.team << [user, :master] } + + describe "GET /projects/:id/awardable/:awardable_id/award_emoji" do + context 'on an issue' do + it "returns an array of award_emoji" do + get api("/projects/#{project.id}/issues/#{issue.id}/award_emoji", user) + + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).to eq(award_emoji.name) + end + + it "should return a 404 error when issue id not found" do + get api("/projects/#{project.id}/issues/12345/award_emoji", user) + + expect(response.status).to eq(404) + end + end + + context 'on a merge request' do + it "returns an array of award_emoji" do + get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/award_emoji", user) + + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).to eq(downvote.name) + end + end + + context 'when the user has no access' do + it 'returns a status code 404' do + user1 = create(:user) + + get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/award_emoji", user1) + + expect(response.status).to eq(404) + end + end + end + + describe 'GET /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji' do + let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') } + + it 'returns an array of award emoji' do + get api("/projects/#{project.id}/issues/#{issue.id}/notes/#{note.id}/award_emoji", user) + + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).to eq(rocket.name) + end + end + + + describe "GET /projects/:id/awardable/:awardable_id/award_emoji/:award_id" do + context 'on an issue' do + it "returns the award emoji" do + get api("/projects/#{project.id}/issues/#{issue.id}/award_emoji/#{award_emoji.id}", user) + + expect(response.status).to eq(200) + expect(json_response['name']).to eq(award_emoji.name) + expect(json_response['awardable_id']).to eq(issue.id) + expect(json_response['awardable_type']).to eq("Issue") + end + + it "returns a 404 error if the award is not found" do + get api("/projects/#{project.id}/issues/#{issue.id}/award_emoji/12345", user) + + expect(response.status).to eq(404) + end + end + + context 'on a merge request' do + it 'returns the award emoji' do + get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/award_emoji/#{downvote.id}", user) + + expect(response.status).to eq(200) + expect(json_response['name']).to eq(downvote.name) + expect(json_response['awardable_id']).to eq(merge_request.id) + expect(json_response['awardable_type']).to eq("MergeRequest") + end + end + + context 'when the user has no access' do + it 'returns a status code 404' do + user1 = create(:user) + + get api("/projects/#{project.id}/merge_requests/#{merge_request.id}/award_emoji/#{downvote.id}", user1) + + expect(response.status).to eq(404) + end + end + end + + describe 'GET /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji/:award_id' do + let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket') } + + it 'returns an award emoji' do + get api("/projects/#{project.id}/issues/#{issue.id}/notes/#{note.id}/award_emoji/#{rocket.id}", user) + + expect(response.status).to eq(200) + expect(json_response).not_to be_an Array + expect(json_response['name']).to eq(rocket.name) + end + end + + describe "POST /projects/:id/awardable/:awardable_id/award_emoji" do + context "on an issue" do + it "creates a new award emoji" do + post api("/projects/#{project.id}/issues/#{issue.id}/award_emoji", user), name: 'blowfish' + + expect(response.status).to eq(201) + expect(json_response['name']).to eq('blowfish') + expect(json_response['user']['username']).to eq(user.username) + end + + it "should return a 400 bad request error if the name is not given" do + post api("/projects/#{project.id}/issues/#{issue.id}/award_emoji", user) + + expect(response.status).to eq(400) + end + + it "should return a 401 unauthorized error if the user is not authenticated" do + post api("/projects/#{project.id}/issues/#{issue.id}/award_emoji"), name: 'thumbsup' + + expect(response.status).to eq(401) + end + end + end + + describe "POST /projects/:id/awardable/:awardable_id/notes/:note_id/award_emoji" do + it 'creates a new award emoji' do + expect do + post api("/projects/#{project.id}/issues/#{issue.id}/notes/#{note.id}/award_emoji", user), name: 'rocket' + end.to change { note.award_emoji.count }.from(0).to(1) + + expect(response.status).to eq(201) + expect(json_response['user']['username']).to eq(user.username) + end + end + + describe 'DELETE /projects/:id/awardable/:awardable_id/award_emoji/:award_id' do + context 'when the awardable is an Issue' do + it 'deletes the award' do + expect do + delete api("/projects/#{project.id}/issues/#{issue.id}/award_emoji/#{award_emoji.id}", user) + end.to change { issue.award_emoji.count }.from(1).to(0) + + expect(response.status).to eq(200) + end + + it 'returns a 404 error when the award emoji can not be found' do + delete api("/projects/#{project.id}/issues/#{issue.id}/award_emoji/12345", user) + + expect(response.status).to eq(404) + end + end + + context 'when the awardable is a Merge Request' do + it 'deletes the award' do + expect do + delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/award_emoji/#{downvote.id}", user) + end.to change { merge_request.award_emoji.count }.from(1).to(0) + + expect(response.status).to eq(200) + end + + it 'returns a 404 error when note id not found' do + delete api("/projects/#{project.id}/merge_requests/#{merge_request.id}/notes/12345", user) + + expect(response.status).to eq(404) + end + end + end + + describe 'DELETE /projects/:id/awardable/:awardable_id/award_emoji/:award_emoji_id' do + let!(:rocket) { create(:award_emoji, awardable: note, name: 'rocket', user: user) } + + it 'deletes the award' do + expect do + delete api("/projects/#{project.id}/issues/#{issue.id}/notes/#{note.id}/award_emoji/#{rocket.id}", user) + end.to change { note.award_emoji.count }.from(1).to(0) + + expect(response.status).to eq(200) + end + end +end diff --git a/spec/requests/api/builds_spec.rb b/spec/requests/api/builds_spec.rb index ac85f34092..47e9253a10 100644 --- a/spec/requests/api/builds_spec.rb +++ b/spec/requests/api/builds_spec.rb @@ -9,8 +9,8 @@ describe API::API, api: true do let!(:project) { create(:project, creator_id: user.id) } let!(:developer) { create(:project_member, :developer, user: user, project: project) } let!(:reporter) { create(:project_member, :reporter, user: user2, project: project) } - let(:pipeline) { create(:ci_pipeline, project: project)} - let(:build) { create(:ci_build, pipeline: pipeline) } + let!(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit.id) } + let!(:build) { create(:ci_build, pipeline: pipeline) } describe 'GET /projects/:id/builds ' do let(:query) { '' } @@ -23,6 +23,11 @@ describe API::API, api: true do expect(json_response).to be_an Array end + it 'returns correct values' do + expect(json_response).not_to be_empty + expect(json_response.first['commit']['id']).to eq project.commit.id + end + context 'filter project with one scope element' do let(:query) { 'scope=pending' } @@ -132,7 +137,7 @@ describe API::API, api: true do describe 'GET /projects/:id/builds/:build_id/trace' do let(:build) { create(:ci_build, :trace, pipeline: pipeline) } - + before { get api("/projects/#{project.id}/builds/#{build.id}/trace", api_user) } context 'authorized user' do diff --git a/spec/requests/api/gitignores_spec.rb b/spec/requests/api/gitignores_spec.rb deleted file mode 100644 index aab2d8c81b..0000000000 --- a/spec/requests/api/gitignores_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'spec_helper' - -describe API::Gitignores, api: true do - include ApiHelpers - - describe 'Entity Gitignore' do - before { get api('/gitignores/Ruby') } - - it { expect(json_response['name']).to eq('Ruby') } - it { expect(json_response['content']).to include('*.gem') } - end - - describe 'Entity GitignoresList' do - before { get api('/gitignores') } - - it { expect(json_response.first['name']).not_to be_nil } - it { expect(json_response.first['content']).to be_nil } - end - - describe 'GET /gitignores' do - it 'returns a list of available license templates' do - get api('/gitignores') - - expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.size).to be > 15 - end - end -end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index f167813e07..01eb4b44b8 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -428,8 +428,9 @@ describe API::API, api: true do describe 'permissions' do context 'all projects' do - it 'Contains permission information' do - project.team << [user, :master] + before { project.team << [user, :master] } + + it 'contains permission information' do get api("/projects", user) expect(response.status).to eq(200) @@ -440,7 +441,7 @@ describe API::API, api: true do end context 'personal project' do - it 'Sets project access and returns 200' do + it 'sets project access and returns 200' do project.team << [user, :master] get api("/projects/#{project.id}", user) @@ -452,9 +453,11 @@ describe API::API, api: true do end context 'group project' do + let(:project2) { create(:project, group: create(:group)) } + + before { project2.group.add_owner(user) } + 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) diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index 73ae8ef631..b4c826522a 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -187,14 +187,16 @@ describe API::Runners, api: true do update_runner(shared_runner.id, admin, description: "#{description}_updated", active: !active, tag_list: ['ruby2.1', 'pgsql', 'mysql'], - run_untagged: 'false') + run_untagged: 'false', + locked: 'true') shared_runner.reload expect(response.status).to eq(200) expect(shared_runner.description).to eq("#{description}_updated") expect(shared_runner.active).to eq(!active) expect(shared_runner.tag_list).to include('ruby2.1', 'pgsql', 'mysql') - expect(shared_runner.run_untagged?).to be false + expect(shared_runner.run_untagged?).to be(false) + expect(shared_runner.locked?).to be(true) end end @@ -360,11 +362,13 @@ describe API::Runners, api: true do describe 'POST /projects/:id/runners' do context 'authorized user' do - it 'should enable specific runner' do - specific_runner2 = create(:ci_runner).tap do |runner| + let(:specific_runner2) do + create(:ci_runner).tap do |runner| create(:ci_runner_project, runner: runner, project: project2) end + end + it 'should enable specific runner' do expect do post api("/projects/#{project.id}/runners", user), runner_id: specific_runner2.id end.to change{ project.runners.count }.by(+1) @@ -375,7 +379,17 @@ describe API::Runners, api: true do expect do post api("/projects/#{project.id}/runners", user), runner_id: specific_runner.id end.to change{ project.runners.count }.by(0) - expect(response.status).to eq(201) + expect(response.status).to eq(409) + end + + it 'should not enable locked runner' do + specific_runner2.update(locked: true) + + expect do + post api("/projects/#{project.id}/runners", user), runner_id: specific_runner2.id + end.to change{ project.runners.count }.by(0) + + expect(response.status).to eq(403) end it 'should not enable shared runner' do diff --git a/spec/requests/api/sidekiq_metrics_spec.rb b/spec/requests/api/sidekiq_metrics_spec.rb new file mode 100644 index 0000000000..41cbf0c666 --- /dev/null +++ b/spec/requests/api/sidekiq_metrics_spec.rb @@ -0,0 +1,40 @@ +require 'spec_helper' + +describe API::SidekiqMetrics, api: true do + include ApiHelpers + + let(:admin) { create(:user, :admin) } + + describe 'GET sidekiq/*' do + it 'defines the `queue_metrics` endpoint' do + get api('/sidekiq/queue_metrics', admin) + + expect(response.status).to eq(200) + expect(json_response).to be_a Hash + end + + it 'defines the `process_metrics` endpoint' do + get api('/sidekiq/process_metrics', admin) + + expect(response.status).to eq(200) + expect(json_response['processes']).to be_an Array + end + + it 'defines the `job_stats` endpoint' do + get api('/sidekiq/job_stats', admin) + + expect(response.status).to eq(200) + expect(json_response).to be_a Hash + end + + it 'defines the `compound_metrics` endpoint' do + get api('/sidekiq/compound_metrics', admin) + + expect(response.status).to eq(200) + expect(json_response).to be_a Hash + expect(json_response['queues']).to be_a Hash + expect(json_response['processes']).to be_an Array + expect(json_response['jobs']).to be_a Hash + end + end +end diff --git a/spec/requests/api/templates_spec.rb b/spec/requests/api/templates_spec.rb new file mode 100644 index 0000000000..a6d5ade301 --- /dev/null +++ b/spec/requests/api/templates_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' + +describe API::Templates, api: true do + include ApiHelpers + + describe 'the Template Entity' do + before { get api('/gitignores/Ruby') } + + it { expect(json_response['name']).to eq('Ruby') } + it { expect(json_response['content']).to include('*.gem') } + end + + describe 'the TemplateList Entity' do + before { get api('/gitignores') } + + it { expect(json_response.first['name']).not_to be_nil } + it { expect(json_response.first['content']).to be_nil } + end + + context 'requesting gitignores' do + describe 'GET /gitignores' do + it 'returns a list of available gitignore templates' do + get api('/gitignores') + + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.size).to be > 15 + end + end + end + + context 'requesting gitlab-ci-ymls' do + describe 'GET /gitlab_ci_ymls' do + it 'returns a list of available gitlab_ci_ymls' do + get api('/gitlab_ci_ymls') + + expect(response.status).to eq(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).not_to be_nil + end + end + end + + describe 'GET /gitlab_ci_ymls/Ruby' do + it 'adds a disclaimer on the top' do + get api('/gitlab_ci_ymls/Ruby') + + expect(response.status).to eq(200) + expect(json_response['content']).to start_with("# This file is a template,") + end + end +end diff --git a/spec/services/ci/create_builds_service_spec.rb b/spec/services/ci/create_builds_service_spec.rb index 984b78487d..8b0becd83d 100644 --- a/spec/services/ci/create_builds_service_spec.rb +++ b/spec/services/ci/create_builds_service_spec.rb @@ -9,7 +9,7 @@ describe Ci::CreateBuildsService, services: true do # subject do - described_class.new(pipeline).execute('test', nil, user, status) + described_class.new(pipeline).execute('test', user, status, nil) end context 'next builds available' do @@ -17,6 +17,10 @@ describe Ci::CreateBuildsService, services: true do it { is_expected.to be_an_instance_of Array } it { is_expected.to all(be_an_instance_of Ci::Build) } + + it 'does not persist created builds' do + expect(subject.first).not_to be_persisted + end end context 'builds skipped' do diff --git a/spec/services/ci/register_build_service_spec.rb b/spec/services/ci/register_build_service_spec.rb index d91fc57429..f28f2f1438 100644 --- a/spec/services/ci/register_build_service_spec.rb +++ b/spec/services/ci/register_build_service_spec.rb @@ -45,11 +45,73 @@ module Ci end end + context 'deleted projects' do + before do + project.update(pending_delete: true) + end + + context 'for shared runners' do + before do + project.update(shared_runners_enabled: true) + end + + it 'does not pick a build' do + expect(service.execute(shared_runner)).to be_nil + end + end + + context 'for specific runner' do + it 'does not pick a build' do + expect(service.execute(specific_runner)).to be_nil + end + end + end + context 'allow shared runners' do before do project.update(shared_runners_enabled: true) end + context 'for multiple builds' do + let!(:project2) { create :empty_project, shared_runners_enabled: true } + let!(:pipeline2) { create :ci_pipeline, project: project2 } + let!(:project3) { create :empty_project, shared_runners_enabled: true } + let!(:pipeline3) { create :ci_pipeline, project: project3 } + let!(:build1_project1) { pending_build } + let!(:build2_project1) { FactoryGirl.create :ci_build, pipeline: pipeline } + let!(:build3_project1) { FactoryGirl.create :ci_build, pipeline: pipeline } + let!(:build1_project2) { FactoryGirl.create :ci_build, pipeline: pipeline2 } + let!(:build2_project2) { FactoryGirl.create :ci_build, pipeline: pipeline2 } + let!(:build1_project3) { FactoryGirl.create :ci_build, pipeline: pipeline3 } + + it 'prefers projects without builds first' do + # it gets for one build from each of the projects + expect(service.execute(shared_runner)).to eq(build1_project1) + expect(service.execute(shared_runner)).to eq(build1_project2) + expect(service.execute(shared_runner)).to eq(build1_project3) + + # then it gets a second build from each of the projects + expect(service.execute(shared_runner)).to eq(build2_project1) + expect(service.execute(shared_runner)).to eq(build2_project2) + + # in the end the third build + expect(service.execute(shared_runner)).to eq(build3_project1) + end + + it 'equalises number of running builds' do + # after finishing the first build for project 1, get a second build from the same project + expect(service.execute(shared_runner)).to eq(build1_project1) + build1_project1.success + expect(service.execute(shared_runner)).to eq(build2_project1) + + expect(service.execute(shared_runner)).to eq(build1_project2) + build1_project2.success + expect(service.execute(shared_runner)).to eq(build2_project2) + expect(service.execute(shared_runner)).to eq(build1_project3) + expect(service.execute(shared_runner)).to eq(build3_project1) + end + end + context 'shared runner' do let(:build) { service.execute(shared_runner) } diff --git a/spec/services/create_commit_builds_service_spec.rb b/spec/services/create_commit_builds_service_spec.rb index a5b4d9f05d..deab242f45 100644 --- a/spec/services/create_commit_builds_service_spec.rb +++ b/spec/services/create_commit_builds_service_spec.rb @@ -39,7 +39,7 @@ describe CreateCommitBuildsService, services: true do end it "creates commit if there is no appropriate job but deploy job has right ref setting" do - config = YAML.dump({ deploy: { deploy: "ls", only: ["0_1"] } }) + config = YAML.dump({ deploy: { script: "ls", only: ["0_1"] } }) stub_ci_pipeline_yaml_file(config) result = service.execute(project, user, @@ -81,7 +81,7 @@ describe CreateCommitBuildsService, services: true do expect(pipeline.yaml_errors).not_to be_nil end - describe :ci_skip? do + context 'when commit contains a [ci skip] directive' do let(:message) { "some message[ci skip]" } before do @@ -171,5 +171,24 @@ describe CreateCommitBuildsService, services: true do expect(pipeline.status).to eq("failed") expect(pipeline.builds.any?).to be false end + + context 'when there are no jobs for this pipeline' do + before do + config = YAML.dump({ test: { script: 'ls', only: ['feature'] } }) + stub_ci_pipeline_yaml_file(config) + end + + it 'does not create a new pipeline' do + result = service.execute(project, user, + ref: 'refs/heads/master', + before: '00000000', + after: '31das312', + commits: [{ message: 'some msg' }]) + + expect(result).to be_falsey + expect(Ci::Build.all).to be_empty + expect(Ci::Pipeline.count).to eq(0) + end + end end end diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index 18692f1279..f99ad046f0 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -312,7 +312,8 @@ describe GitPushService, services: true do end it "doesn't close issues when external issue tracker is in use" do - allow(project).to receive(:default_issues_tracker?).and_return(false) + allow_any_instance_of(Project).to receive(:default_issues_tracker?). + and_return(false) # The push still shouldn't create cross-reference notes. expect do diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index e871a103d4..776a6ab5ed 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -46,6 +46,8 @@ describe NotificationService, services: true do project.team << [issue.assignee, :master] project.team << [note.author, :master] create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@subscribed_participant cc this guy') + update_custom_notification(:new_note, @u_guest_custom, project) + update_custom_notification(:new_note, @u_custom_global) end describe :new_note do @@ -53,7 +55,7 @@ describe NotificationService, services: true do add_users_with_subscription(note.project, issue) # Ensure create SentNotification by noteable = issue 6 times, not noteable = note - expect(SentNotification).to receive(:record).with(issue, any_args).exactly(7).times + expect(SentNotification).to receive(:record).with(issue, any_args).exactly(8).times ActionMailer::Base.deliveries.clear @@ -62,10 +64,12 @@ describe NotificationService, services: true do should_email(@u_watcher) should_email(note.noteable.author) should_email(note.noteable.assignee) + should_email(@u_custom_global) should_email(@u_mentioned) should_email(@subscriber) should_email(@watcher_and_subscriber) should_email(@subscribed_participant) + should_not_email(@u_guest_custom) should_not_email(@u_guest_watcher) should_not_email(note.author) should_not_email(@u_participating) @@ -103,10 +107,12 @@ describe NotificationService, services: true do before do note.project.namespace_id = group.id note.project.group.add_user(@u_watcher, GroupMember::MASTER) + note.project.group.add_user(@u_custom_global, GroupMember::MASTER) note.project.save @u_watcher.notification_settings_for(note.project).participating! @u_watcher.notification_settings_for(note.project.group).global! + update_custom_notification(:new_note, @u_custom_global) ActionMailer::Base.deliveries.clear end @@ -116,6 +122,8 @@ describe NotificationService, services: true do should_email(note.noteable.author) should_email(note.noteable.assignee) should_email(@u_mentioned) + should_email(@u_custom_global) + should_not_email(@u_guest_custom) should_not_email(@u_guest_watcher) should_not_email(@u_watcher) should_not_email(note.author) @@ -136,6 +144,7 @@ describe NotificationService, services: true do let(:admin) { create(:admin) } let(:confidential_issue) { create(:issue, :confidential, project: project, author: author, assignee: assignee) } let(:note) { create(:note_on_issue, noteable: confidential_issue, project: project, note: "#{author.to_reference} #{assignee.to_reference} #{non_member.to_reference} #{member.to_reference} #{admin.to_reference}") } + let(:guest_watcher) { create_user_with_notification(:watch, "guest-watcher-confidential") } it 'filters out users that can not read the issue' do project.team << [member, :developer] @@ -149,6 +158,7 @@ describe NotificationService, services: true do should_not_email(non_member) should_not_email(guest) + should_not_email(guest_watcher) should_email(author) should_email(assignee) should_email(member) @@ -223,6 +233,9 @@ describe NotificationService, services: true do should_email(member) end + # it emails custom global users on mention + should_email(@u_custom_global) + should_email(@u_guest_watcher) should_email(note.noteable.author) should_not_email(note.author) @@ -241,13 +254,16 @@ describe NotificationService, services: true do build_team(note.project) ActionMailer::Base.deliveries.clear allow_any_instance_of(Commit).to receive(:author).and_return(@u_committer) + update_custom_notification(:new_note, @u_guest_custom, project) + update_custom_notification(:new_note, @u_custom_global) end describe '#new_note, #perform_enqueued_jobs' do it do notification.new_note(note) - should_email(@u_guest_watcher) + should_email(@u_custom_global) + should_email(@u_guest_custom) should_email(@u_committer) should_email(@u_watcher) should_not_email(@u_mentioned) @@ -288,6 +304,8 @@ describe NotificationService, services: true do build_team(issue.project) add_users_with_subscription(issue.project, issue) ActionMailer::Base.deliveries.clear + update_custom_notification(:new_issue, @u_guest_custom, project) + update_custom_notification(:new_issue, @u_custom_global) end describe '#new_issue' do @@ -297,6 +315,8 @@ describe NotificationService, services: true do should_email(issue.assignee) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_email(@u_participant_mentioned) should_not_email(@u_mentioned) should_not_email(@u_participating) @@ -345,6 +365,7 @@ describe NotificationService, services: true do notification.new_issue(confidential_issue, @u_disabled) + should_not_email(@u_guest_watcher) should_not_email(non_member) should_not_email(author) should_not_email(guest) @@ -356,12 +377,20 @@ describe NotificationService, services: true do end describe '#reassigned_issue' do + + before do + update_custom_notification(:reassign_issue, @u_guest_custom, project) + update_custom_notification(:reassign_issue, @u_custom_global) + end + it 'emails new assignee' do notification.reassigned_issue(issue, @u_disabled) should_email(issue.assignee) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_email(@u_participant_mentioned) should_email(@subscriber) should_not_email(@unsubscriber) @@ -378,8 +407,10 @@ describe NotificationService, services: true do should_email(@u_mentioned) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) should_email(@u_participant_mentioned) should_email(@subscriber) + should_email(@u_custom_global) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -394,8 +425,10 @@ describe NotificationService, services: true do should_email(issue.assignee) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) should_email(@u_participant_mentioned) should_email(@subscriber) + should_email(@u_custom_global) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -410,8 +443,10 @@ describe NotificationService, services: true do should_email(issue.assignee) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) should_email(@u_participant_mentioned) should_email(@subscriber) + should_email(@u_custom_global) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -425,8 +460,10 @@ describe NotificationService, services: true do expect(issue.assignee).to be @u_mentioned should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) should_email(@u_participant_mentioned) should_email(@subscriber) + should_email(@u_custom_global) should_not_email(issue.assignee) should_not_email(@unsubscriber) should_not_email(@u_participating) @@ -529,6 +566,12 @@ describe NotificationService, services: true do end describe '#close_issue' do + + before do + update_custom_notification(:close_issue, @u_guest_custom, project) + update_custom_notification(:close_issue, @u_custom_global) + end + it 'should sent email to issue assignee and issue author' do notification.close_issue(issue, @u_disabled) @@ -536,6 +579,8 @@ describe NotificationService, services: true do should_email(issue.author) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_email(@u_participant_mentioned) should_email(@subscriber) should_email(@watcher_and_subscriber) @@ -575,6 +620,11 @@ describe NotificationService, services: true do end describe '#reopen_issue' do + before do + update_custom_notification(:reopen_issue, @u_guest_custom, project) + update_custom_notification(:reopen_issue, @u_custom_global) + end + it 'should send email to issue assignee and issue author' do notification.reopen_issue(issue, @u_disabled) @@ -582,6 +632,8 @@ describe NotificationService, services: true do should_email(issue.author) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_email(@u_participant_mentioned) should_email(@subscriber) should_email(@watcher_and_subscriber) @@ -631,6 +683,11 @@ describe NotificationService, services: true do end describe '#new_merge_request' do + before do + update_custom_notification(:new_merge_request, @u_guest_custom, project) + update_custom_notification(:new_merge_request, @u_custom_global) + end + it do notification.new_merge_request(merge_request, @u_disabled) @@ -639,6 +696,8 @@ describe NotificationService, services: true do should_email(@watcher_and_subscriber) should_email(@u_participant_mentioned) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_not_email(@u_participating) should_not_email(@u_disabled) should_not_email(@u_lazy_participant) @@ -685,6 +744,11 @@ describe NotificationService, services: true do end describe '#reassigned_merge_request' do + before do + update_custom_notification(:reassign_merge_request, @u_guest_custom, project) + update_custom_notification(:reassign_merge_request, @u_custom_global) + end + it do notification.reassigned_merge_request(merge_request, merge_request.author) @@ -694,6 +758,8 @@ describe NotificationService, services: true do should_email(@subscriber) should_email(@watcher_and_subscriber) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -761,12 +827,19 @@ describe NotificationService, services: true do end describe '#closed_merge_request' do + before do + update_custom_notification(:close_merge_request, @u_guest_custom, project) + update_custom_notification(:close_merge_request, @u_custom_global) + end + it do notification.close_mr(merge_request, @u_disabled) should_email(merge_request.assignee) should_email(@u_watcher) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_email(@u_participant_mentioned) should_email(@subscriber) should_email(@watcher_and_subscriber) @@ -807,6 +880,12 @@ describe NotificationService, services: true do end describe '#merged_merge_request' do + + before do + update_custom_notification(:merge_merge_request, @u_guest_custom, project) + update_custom_notification(:merge_merge_request, @u_custom_global) + end + it do notification.merge_mr(merge_request, @u_disabled) @@ -816,6 +895,8 @@ describe NotificationService, services: true do should_email(@subscriber) should_email(@watcher_and_subscriber) should_email(@u_guest_watcher) + should_email(@u_custom_global) + should_email(@u_guest_custom) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -853,6 +934,11 @@ describe NotificationService, services: true do end describe '#reopen_merge_request' do + before do + update_custom_notification(:reopen_merge_request, @u_guest_custom, project) + update_custom_notification(:reopen_merge_request, @u_custom_global) + end + it do notification.reopen_mr(merge_request, @u_disabled) @@ -862,6 +948,8 @@ describe NotificationService, services: true do should_email(@subscriber) should_email(@watcher_and_subscriber) should_email(@u_guest_watcher) + should_email(@u_guest_custom) + should_email(@u_custom_global) should_not_email(@unsubscriber) should_not_email(@u_participating) should_not_email(@u_disabled) @@ -914,7 +1002,9 @@ describe NotificationService, services: true do should_email(@u_watcher) should_email(@u_participating) should_email(@u_lazy_participant) + should_email(@u_custom_global) should_not_email(@u_guest_watcher) + should_not_email(@u_guest_custom) should_not_email(@u_disabled) end end @@ -929,13 +1019,15 @@ describe NotificationService, services: true do @u_committer = create(:user, username: 'committer') @u_not_mentioned = create_global_setting_for(create(:user, username: 'regular'), :participating) @u_outsider_mentioned = create(:user, username: 'outsider') + @u_custom_global = create_global_setting_for(create(:user, username: 'custom_global'), :custom) # User to be participant by default # This user does not contain any record in notification settings table # It should be treated with a :participating notification_level @u_lazy_participant = create(:user, username: 'lazy-participant') - create_guest_watcher + @u_guest_watcher = create_user_with_notification(:watch, 'guest_watching') + @u_guest_custom = create_user_with_notification(:custom, 'guest_custom') project.team << [@u_watcher, :master] project.team << [@u_participating, :master] @@ -945,6 +1037,7 @@ describe NotificationService, services: true do project.team << [@u_committer, :master] project.team << [@u_not_mentioned, :master] project.team << [@u_lazy_participant, :master] + project.team << [@u_custom_global, :master] end def create_global_setting_for(user, level) @@ -955,10 +1048,20 @@ describe NotificationService, services: true do user end - def create_guest_watcher - @u_guest_watcher = create(:user, username: 'guest_watching') - setting = @u_guest_watcher.notification_settings_for(project) - setting.level = :watch + def create_user_with_notification(level, username) + user = create(:user, username: username) + setting = user.notification_settings_for(project) + setting.level = level + setting.save + + user + end + + # Create custom notifications + # When resource is nil it means global notification + def update_custom_notification(event, user, resource = nil) + setting = user.notification_settings_for(resource) + setting.events[event] = true setting.save end diff --git a/spec/services/system_note_service_spec.rb b/spec/services/system_note_service_spec.rb index 09f0ee3871..85dd30bf48 100644 --- a/spec/services/system_note_service_spec.rb +++ b/spec/services/system_note_service_spec.rb @@ -529,7 +529,7 @@ describe SystemNoteService, services: true do let(:author) { create(:user) } let(:issue) { create(:issue, project: project) } let(:mergereq) { create(:merge_request, :simple, target_project: project, source_project: project) } - let(:jira_issue) { JiraIssue.new("JIRA-1", project)} + let(:jira_issue) { ExternalIssue.new("JIRA-1", project)} let(:jira_tracker) { project.create_jira_service if project.jira_service.nil? } let(:commit) { project.commit } diff --git a/spec/services/todo_service_spec.rb b/spec/services/todo_service_spec.rb index 26f09cdbaf..b452253672 100644 --- a/spec/services/todo_service_spec.rb +++ b/spec/services/todo_service_spec.rb @@ -108,17 +108,25 @@ describe TodoService, services: true do should_not_create_todo(user: john_doe, target: confidential_issue, author: john_doe, action: Todo::MENTIONED) end - it 'does not create todo when when tasks are marked as completed' do - issue.update(description: "- [x] Task 1\n- [X] Task 2 #{mentions}") + context 'issues with a task list' do + it 'does not create todo when tasks are marked as completed' do + issue.update(description: "- [x] Task 1\n- [X] Task 2 #{mentions}") - service.update_issue(issue, author) + service.update_issue(issue, author) - should_not_create_todo(user: admin, target: issue, action: Todo::MENTIONED) - should_not_create_todo(user: assignee, target: issue, action: Todo::MENTIONED) - should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED) - should_not_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED) - should_not_create_todo(user: member, target: issue, action: Todo::MENTIONED) - should_not_create_todo(user: non_member, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: admin, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: assignee, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: author, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: john_doe, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: member, target: issue, action: Todo::MENTIONED) + should_not_create_todo(user: non_member, target: issue, action: Todo::MENTIONED) + end + + it 'does not raise an error when description not change' do + issue.update(title: 'Sample') + + expect { service.update_issue(issue, author) }.not_to raise_error + end end end @@ -165,6 +173,48 @@ describe TodoService, services: true do expect(first_todo.reload).to be_done expect(second_todo.reload).to be_done end + + describe 'cached counts' do + it 'updates when todos change' do + create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) + + expect(john_doe.todos_done_count).to eq(0) + expect(john_doe.todos_pending_count).to eq(1) + expect(john_doe).to receive(:update_todos_count_cache).and_call_original + + service.mark_pending_todos_as_done(issue, john_doe) + + expect(john_doe.todos_done_count).to eq(1) + expect(john_doe.todos_pending_count).to eq(0) + end + end + end + + describe '#mark_todos_as_done' do + it 'marks related todos for the user as done' do + first_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) + second_todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) + + service.mark_todos_as_done([first_todo, second_todo], john_doe) + + expect(first_todo.reload).to be_done + expect(second_todo.reload).to be_done + end + + describe 'cached counts' do + it 'updates when todos change' do + todo = create(:todo, :assigned, user: john_doe, project: project, target: issue, author: author) + + expect(john_doe.todos_done_count).to eq(0) + expect(john_doe.todos_pending_count).to eq(1) + expect(john_doe).to receive(:update_todos_count_cache).and_call_original + + service.mark_todos_as_done([todo], john_doe) + + expect(john_doe.todos_done_count).to eq(1) + expect(john_doe.todos_pending_count).to eq(0) + end + end end describe '#new_note' do @@ -285,17 +335,25 @@ describe TodoService, services: true do expect { service.update_merge_request(mr_assigned, author) }.not_to change(member.todos, :count) end - it 'does not create todo when when tasks are marked as completed' do - mr_assigned.update(description: "- [x] Task 1\n- [X] Task 2 #{mentions}") + context 'with a task list' do + it 'does not create todo when tasks are marked as completed' do + mr_assigned.update(description: "- [x] Task 1\n- [X] Task 2 #{mentions}") - service.update_merge_request(mr_assigned, author) + service.update_merge_request(mr_assigned, author) - should_not_create_todo(user: admin, target: mr_assigned, action: Todo::MENTIONED) - should_not_create_todo(user: assignee, target: mr_assigned, action: Todo::MENTIONED) - should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED) - should_not_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED) - should_not_create_todo(user: member, target: mr_assigned, action: Todo::MENTIONED) - should_not_create_todo(user: non_member, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: admin, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: assignee, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: author, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: john_doe, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: member, target: mr_assigned, action: Todo::MENTIONED) + should_not_create_todo(user: non_member, target: mr_assigned, action: Todo::MENTIONED) + end + + it 'does not raise an error when description not change' do + mr_assigned.update(title: 'Sample') + + expect { service.update_merge_request(mr_assigned, author) }.not_to raise_error + end end end @@ -379,6 +437,18 @@ describe TodoService, services: true do end end + it 'updates cached counts when a todo is created' do + issue = create(:issue, project: project, assignee: john_doe, author: author, description: mentions) + + expect(john_doe.todos_pending_count).to eq(0) + expect(john_doe).to receive(:update_todos_count_cache) + + service.new_issue(issue, author) + + expect(Todo.where(user_id: john_doe.id, state: :pending).count).to eq 1 + expect(john_doe.todos_pending_count).to eq(1) + end + def should_create_todo(attributes = {}) attributes.reverse_merge!( project: project, diff --git a/spec/support/import_export/import_export.yml b/spec/support/import_export/import_export.yml new file mode 100644 index 0000000000..3ceec50640 --- /dev/null +++ b/spec/support/import_export/import_export.yml @@ -0,0 +1,20 @@ +# Class relationships to be included in the project import/export +project_tree: + - :issues + - :labels + - merge_requests: + - :merge_request_diff + - :merge_request_test + - commit_statuses: + - :commit + +included_attributes: + project: + - :name + - :path + merge_requests: + - :id + +excluded_attributes: + merge_requests: + - :iid \ No newline at end of file diff --git a/spec/workers/expire_build_artifacts_worker_spec.rb b/spec/workers/expire_build_artifacts_worker_spec.rb index e3827cae9a..7d6668920c 100644 --- a/spec/workers/expire_build_artifacts_worker_spec.rb +++ b/spec/workers/expire_build_artifacts_worker_spec.rb @@ -20,6 +20,10 @@ describe ExpireBuildArtifactsWorker do it 'does remove files' do expect(build.reload.artifacts_file.exists?).to be_falsey end + + it 'does nullify artifacts_file column' do + expect(build.reload.artifacts_file_identifier).to be_nil + end end context 'with not yet expired artifacts' do @@ -32,6 +36,10 @@ describe ExpireBuildArtifactsWorker do it 'does not remove files' do expect(build.reload.artifacts_file.exists?).to be_truthy end + + it 'does not nullify artifacts_file column' do + expect(build.reload.artifacts_file_identifier).not_to be_nil + end end context 'without expire date' do @@ -44,6 +52,10 @@ describe ExpireBuildArtifactsWorker do it 'does not remove files' do expect(build.reload.artifacts_file.exists?).to be_truthy end + + it 'does not nullify artifacts_file column' do + expect(build.reload.artifacts_file_identifier).not_to be_nil + end end context 'for expired artifacts' do diff --git a/spec/workers/merge_worker_spec.rb b/spec/workers/merge_worker_spec.rb index 1abd87d7d3..b5e1fdb8de 100644 --- a/spec/workers/merge_worker_spec.rb +++ b/spec/workers/merge_worker_spec.rb @@ -9,7 +9,7 @@ describe MergeWorker do before do source_project.team << [author, :master] - source_project.repository.expire_branch_names + source_project.repository.expire_branches_cache end it 'clears cache of source repo after removing source branch' do diff --git a/spec/workers/repository_check/single_repository_worker_spec.rb b/spec/workers/repository_check/single_repository_worker_spec.rb index 5a03bb77eb..05e07789da 100644 --- a/spec/workers/repository_check/single_repository_worker_spec.rb +++ b/spec/workers/repository_check/single_repository_worker_spec.rb @@ -4,6 +4,26 @@ require 'fileutils' describe RepositoryCheck::SingleRepositoryWorker do subject { described_class.new } + it 'passes when the project has no push events' do + project = create(:project_empty_repo, wiki_enabled: false) + project.events.destroy_all + break_repo(project) + + subject.perform(project.id) + + expect(project.reload.last_repository_check_failed).to eq(false) + end + + it 'fails when the project has push events and a broken repository' do + project = create(:project_empty_repo) + create_push_event(project) + break_repo(project) + + subject.perform(project.id) + + expect(project.reload.last_repository_check_failed).to eq(true) + end + it 'fails if the wiki repository is broken' do project = create(:project_empty_repo, wiki_enabled: true) project.create_wiki @@ -39,6 +59,7 @@ describe RepositoryCheck::SingleRepositoryWorker do it 'does not create a wiki if the main repo does not exist at all' do project = create(:project_empty_repo) + create_push_event(project) FileUtils.rm_rf(project.repository.path_to_repo) FileUtils.rm_rf(wiki_path(project)) @@ -54,4 +75,12 @@ describe RepositoryCheck::SingleRepositoryWorker do def wiki_path(project) project.wiki.repository.path_to_repo end + + def create_push_event(project) + project.events.create(action: Event::PUSHED, author_id: create(:user).id) + end + + def break_repo(project) + FileUtils.rm_rf(File.join(project.repository.path_to_repo, 'objects')) + end end diff --git a/vendor/assets/javascripts/raphael.js b/vendor/assets/javascripts/raphael.js new file mode 100644 index 0000000000..3f3f8a0b7f --- /dev/null +++ b/vendor/assets/javascripts/raphael.js @@ -0,0 +1,8239 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +// Copyright (c) 2013 Adobe Systems Incorporated. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ┌────────────────────────────────────────────────────────────┐ \\ +// │ Eve 0.4.2 - JavaScript Events Library │ \\ +// ├────────────────────────────────────────────────────────────┤ \\ +// │ Author Dmitry Baranovskiy (http://dmitry.baranovskiy.com/) │ \\ +// └────────────────────────────────────────────────────────────┘ \\ + +(function (glob) { + var version = "0.4.2", + has = "hasOwnProperty", + separator = /[\.\/]/, + wildcard = "*", + fun = function () {}, + numsort = function (a, b) { + return a - b; + }, + current_event, + stop, + events = {n: {}}, + /*\ + * eve + [ method ] + + * Fires event with given `name`, given scope and other parameters. + + > Arguments + + - name (string) name of the *event*, dot (`.`) or slash (`/`) separated + - scope (object) context for the event handlers + - varargs (...) the rest of arguments will be sent to event handlers + + = (object) array of returned values from the listeners + \*/ + eve = function (name, scope) { + name = String(name); + var e = events, + oldstop = stop, + args = Array.prototype.slice.call(arguments, 2), + listeners = eve.listeners(name), + z = 0, + f = false, + l, + indexed = [], + queue = {}, + out = [], + ce = current_event, + errors = []; + current_event = name; + stop = 0; + for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) { + indexed.push(listeners[i].zIndex); + if (listeners[i].zIndex < 0) { + queue[listeners[i].zIndex] = listeners[i]; + } + } + indexed.sort(numsort); + while (indexed[z] < 0) { + l = queue[indexed[z++]]; + out.push(l.apply(scope, args)); + if (stop) { + stop = oldstop; + return out; + } + } + for (i = 0; i < ii; i++) { + l = listeners[i]; + if ("zIndex" in l) { + if (l.zIndex == indexed[z]) { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + do { + z++; + l = queue[indexed[z]]; + l && out.push(l.apply(scope, args)); + if (stop) { + break; + } + } while (l) + } else { + queue[l.zIndex] = l; + } + } else { + out.push(l.apply(scope, args)); + if (stop) { + break; + } + } + } + stop = oldstop; + current_event = ce; + return out.length ? out : null; + }; + // Undocumented. Debug only. + eve._events = events; + /*\ + * eve.listeners + [ method ] + + * Internal method which gives you array of all event handlers that will be triggered by the given `name`. + + > Arguments + + - name (string) name of the event, dot (`.`) or slash (`/`) separated + + = (array) array of event handlers + \*/ + eve.listeners = function (name) { + var names = name.split(separator), + e = events, + item, + items, + k, + i, + ii, + j, + jj, + nes, + es = [e], + out = []; + for (i = 0, ii = names.length; i < ii; i++) { + nes = []; + for (j = 0, jj = es.length; j < jj; j++) { + e = es[j].n; + items = [e[names[i]], e[wildcard]]; + k = 2; + while (k--) { + item = items[k]; + if (item) { + nes.push(item); + out = out.concat(item.f || []); + } + } + } + es = nes; + } + return out; + }; + + /*\ + * eve.on + [ method ] + ** + * Binds given event handler with a given name. You can use wildcards “`*`” for the names: + | eve.on("*.under.*", f); + | eve("mouse.under.floor"); // triggers f + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) returned function accepts a single numeric parameter that represents z-index of the handler. It is an optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. + > Example: + | eve.on("mouse", eatIt)(2); + | eve.on("mouse", scream); + | eve.on("mouse", catchIt)(1); + * This will ensure that `catchIt()` function will be called before `eatIt()`. + * + * If you want to put your handler before non-indexed handlers, specify a negative value. + * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”. + \*/ + eve.on = function (name, f) { + name = String(name); + if (typeof f != "function") { + return function () {}; + } + var names = name.split(separator), + e = events; + for (var i = 0, ii = names.length; i < ii; i++) { + e = e.n; + e = e.hasOwnProperty(names[i]) && e[names[i]] || (e[names[i]] = {n: {}}); + } + e.f = e.f || []; + for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) { + return fun; + } + e.f.push(f); + return function (zIndex) { + if (+zIndex == +zIndex) { + f.zIndex = +zIndex; + } + }; + }; + /*\ + * eve.f + [ method ] + ** + * Returns function that will fire given event with optional arguments. + * Arguments that will be passed to the result function will be also + * concated to the list of final arguments. + | el.onclick = eve.f("click", 1, 2); + | eve.on("click", function (a, b, c) { + | console.log(a, b, c); // 1, 2, [event object] + | }); + > Arguments + - event (string) event name + - varargs (…) and any other arguments + = (function) possible event handler function + \*/ + eve.f = function (event) { + var attrs = [].slice.call(arguments, 1); + return function () { + eve.apply(null, [event, null].concat(attrs).concat([].slice.call(arguments, 0))); + }; + }; + /*\ + * eve.stop + [ method ] + ** + * Is used inside an event handler to stop the event, preventing any subsequent listeners from firing. + \*/ + eve.stop = function () { + stop = 1; + }; + /*\ + * eve.nt + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + > Arguments + ** + - subname (string) #optional subname of the event + ** + = (string) name of the event, if `subname` is not specified + * or + = (boolean) `true`, if current event’s name contains `subname` + \*/ + eve.nt = function (subname) { + if (subname) { + return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); + } + return current_event; + }; + /*\ + * eve.nts + [ method ] + ** + * Could be used inside event handler to figure out actual name of the event. + ** + ** + = (array) names of the event + \*/ + eve.nts = function () { + return current_event.split(separator); + }; + /*\ + * eve.off + [ method ] + ** + * Removes given function from the list of event listeners assigned to given name. + * If no arguments specified all the events will be cleared. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + \*/ + /*\ + * eve.unbind + [ method ] + ** + * See @eve.off + \*/ + eve.off = eve.unbind = function (name, f) { + if (!name) { + eve._events = events = {n: {}}; + return; + } + var names = name.split(separator), + e, + key, + splice, + i, ii, j, jj, + cur = [events]; + for (i = 0, ii = names.length; i < ii; i++) { + for (j = 0; j < cur.length; j += splice.length - 2) { + splice = [j, 1]; + e = cur[j].n; + if (names[i] != wildcard) { + if (e[names[i]]) { + splice.push(e[names[i]]); + } + } else { + for (key in e) if (e[has](key)) { + splice.push(e[key]); + } + } + cur.splice.apply(cur, splice); + } + } + for (i = 0, ii = cur.length; i < ii; i++) { + e = cur[i]; + while (e.n) { + if (f) { + if (e.f) { + for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) { + e.f.splice(j, 1); + break; + } + !e.f.length && delete e.f; + } + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + var funcs = e.n[key].f; + for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) { + funcs.splice(j, 1); + break; + } + !funcs.length && delete e.n[key].f; + } + } else { + delete e.f; + for (key in e.n) if (e.n[has](key) && e.n[key].f) { + delete e.n[key].f; + } + } + e = e.n; + } + } + }; + /*\ + * eve.once + [ method ] + ** + * Binds given event handler with a given name to only run once then unbind itself. + | eve.once("login", f); + | eve("login"); // triggers f + | eve("login"); // no listeners + * Use @eve to trigger the listener. + ** + > Arguments + ** + - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards + - f (function) event handler function + ** + = (function) same return function as @eve.on + \*/ + eve.once = function (name, f) { + var f2 = function () { + eve.unbind(name, f2); + return f.apply(this, arguments); + }; + return eve.on(name, f2); + }; + /*\ + * eve.version + [ property (string) ] + ** + * Current version of the library. + \*/ + eve.version = version; + eve.toString = function () { + return "You are running Eve " + version; + }; + (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (typeof define != "undefined" ? (define("eve", [], function() { return eve; })) : (glob.eve = eve)); +})(window || this); +// ┌─────────────────────────────────────────────────────────────────────┐ \\ +// │ "Raphaël 2.1.2" - JavaScript Vector Library │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ +// └─────────────────────────────────────────────────────────────────────┘ \\ + +(function (glob, factory) { + // AMD support + if (typeof define === "function" && define.amd) { + // Define as an anonymous module + define(["eve"], function( eve ) { + return factory(glob, eve); + }); + } else { + // Browser globals (glob is window) + // Raphael adds itself to window + factory(glob, glob.eve || (typeof require == "function" && require('eve')) ); + } +}(this, function (window, eve) { + /*\ + * Raphael + [ method ] + ** + * Creates a canvas object on which to draw. + * You must do this first, as all future calls to drawing methods + * from this instance will be bound to this canvas. + > Parameters + ** + - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - x (number) + - y (number) + - width (number) + - height (number) + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, }). See @Paper.add. + - callback (function) #optional callback function which is going to be executed in the context of newly created paper + * or + - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`. + = (object) @Paper + > Usage + | // Each of the following examples create a canvas + | // that is 320px wide by 200px high. + | // Canvas is created at the viewport’s 10,50 coordinate. + | var paper = Raphael(10, 50, 320, 200); + | // Canvas is created at the top left corner of the #notepad element + | // (or its top right corner in dir="rtl" elements) + | var paper = Raphael(document.getElementById("notepad"), 320, 200); + | // Same as above + | var paper = Raphael("notepad", 320, 200); + | // Image dump + | var set = Raphael(["notepad", 320, 200, { + | type: "rect", + | x: 10, + | y: 10, + | width: 25, + | height: 25, + | stroke: "#f00" + | }, { + | type: "text", + | x: 30, + | y: 40, + | text: "Dump" + | }]); + \*/ + function R(first) { + if (R.is(first, "function")) { + return loaded ? first() : eve.on("raphael.DOMload", first); + } else if (R.is(first, array)) { + return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first); + } else { + var args = Array.prototype.slice.call(arguments, 0); + if (R.is(args[args.length - 1], "function")) { + var f = args.pop(); + return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("raphael.DOMload", function () { + f.call(R._engine.create[apply](R, args)); + }); + } else { + return R._engine.create[apply](R, arguments); + } + } + } + R.version = "2.1.2"; + R.eve = eve; + var loaded, + separator = /[, ]+/, + elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1}, + formatrg = /\{(\d+)\}/g, + proto = "prototype", + has = "hasOwnProperty", + g = { + doc: document, + win: window + }, + oldRaphael = { + was: Object.prototype[has].call(g.win, "Raphael"), + is: g.win.Raphael + }, + Paper = function () { + /*\ + * Paper.ca + [ property (object) ] + ** + * Shortcut for @Paper.customAttributes + \*/ + /*\ + * Paper.customAttributes + [ property (object) ] + ** + * If you have a set of attributes that you would like to represent + * as a function of some number you can do it easily with custom attributes: + > Usage + | paper.customAttributes.hue = function (num) { + | num = num % 1; + | return {fill: "hsb(" + num + ", 0.75, 1)"}; + | }; + | // Custom attribute “hue” will change fill + | // to be given hue with fixed saturation and brightness. + | // Now you can use it like this: + | var c = paper.circle(10, 10, 10).attr({hue: .45}); + | // or even like this: + | c.animate({hue: 1}, 1e3); + | + | // You could also create custom attribute + | // with multiple parameters: + | paper.customAttributes.hsb = function (h, s, b) { + | return {fill: "hsb(" + [h, s, b].join(",") + ")"}; + | }; + | c.attr({hsb: "0.5 .8 1"}); + | c.animate({hsb: [1, 0, 0.5]}, 1e3); + \*/ + this.ca = this.customAttributes = {}; + }, + paperproto, + appendChild = "appendChild", + apply = "apply", + concat = "concat", + supportsTouch = ('ontouchstart' in g.win) || g.win.DocumentTouch && g.doc instanceof DocumentTouch, //taken from Modernizr touch test + E = "", + S = " ", + Str = String, + split = "split", + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S), + touchMap = { + mousedown: "touchstart", + mousemove: "touchmove", + mouseup: "touchend" + }, + lowerCase = Str.prototype.toLowerCase, + math = Math, + mmax = math.max, + mmin = math.min, + abs = math.abs, + pow = math.pow, + PI = math.PI, + nu = "number", + string = "string", + array = "array", + toString = "toString", + fillString = "fill", + objectToString = Object.prototype.toString, + paper = {}, + push = "push", + ISURL = R._ISURL = /^url\(['"]?(.+?)['"]?\)$/i, + colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i, + isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1}, + bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/, + round = math.round, + setAttribute = "setAttribute", + toFloat = parseFloat, + toInt = parseInt, + upperCase = Str.prototype.toUpperCase, + availableAttrs = R._availableAttrs = { + "arrow-end": "none", + "arrow-start": "none", + blur: 0, + "clip-rect": "0 0 1e9 1e9", + cursor: "default", + cx: 0, + cy: 0, + fill: "#fff", + "fill-opacity": 1, + font: '10px "Arial"', + "font-family": '"Arial"', + "font-size": "10", + "font-style": "normal", + "font-weight": 400, + gradient: 0, + height: 0, + href: "http://raphaeljs.com/", + "letter-spacing": 0, + opacity: 1, + path: "M0,0", + r: 0, + rx: 0, + ry: 0, + src: "", + stroke: "#000", + "stroke-dasharray": "", + "stroke-linecap": "butt", + "stroke-linejoin": "butt", + "stroke-miterlimit": 0, + "stroke-opacity": 1, + "stroke-width": 1, + target: "_blank", + "text-anchor": "middle", + title: "Raphael", + transform: "", + width: 0, + x: 0, + y: 0 + }, + availableAnimAttrs = R._availableAnimAttrs = { + blur: nu, + "clip-rect": "csv", + cx: nu, + cy: nu, + fill: "colour", + "fill-opacity": nu, + "font-size": nu, + height: nu, + opacity: nu, + path: "path", + r: nu, + rx: nu, + ry: nu, + stroke: "colour", + "stroke-opacity": nu, + "stroke-width": nu, + transform: "transform", + width: nu, + x: nu, + y: nu + }, + whitespace = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g, + commaSpaces = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/, + hsrg = {hs: 1, rg: 1}, + p2s = /,?([achlmqrstvxz]),?/gi, + pathCommand = /([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + tCommand = /([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig, + pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig, + radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/, + eldata = {}, + sortByKey = function (a, b) { + return a.key - b.key; + }, + sortByNumber = function (a, b) { + return toFloat(a) - toFloat(b); + }, + fun = function () {}, + pipe = function (x) { + return x; + }, + rectPath = R._rectPath = function (x, y, w, h, r) { + if (r) { + return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]]; + } + return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]]; + }, + ellipsePath = function (x, y, rx, ry) { + if (ry == null) { + ry = rx; + } + return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]]; + }, + getPath = R._getPath = { + path: function (el) { + return el.attr("path"); + }, + circle: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.r); + }, + ellipse: function (el) { + var a = el.attrs; + return ellipsePath(a.cx, a.cy, a.rx, a.ry); + }, + rect: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height, a.r); + }, + image: function (el) { + var a = el.attrs; + return rectPath(a.x, a.y, a.width, a.height); + }, + text: function (el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + }, + set : function(el) { + var bbox = el._getBBox(); + return rectPath(bbox.x, bbox.y, bbox.width, bbox.height); + } + }, + /*\ + * Raphael.mapPath + [ method ] + ** + * Transform the path string with given matrix. + > Parameters + - path (string) path string + - matrix (object) see @Matrix + = (string) transformed path string + \*/ + mapPath = R.mapPath = function (path, matrix) { + if (!matrix) { + return path; + } + var x, y, i, j, ii, jj, pathi; + path = path2curve(path); + for (i = 0, ii = path.length; i < ii; i++) { + pathi = path[i]; + for (j = 1, jj = pathi.length; j < jj; j += 2) { + x = matrix.x(pathi[j], pathi[j + 1]); + y = matrix.y(pathi[j], pathi[j + 1]); + pathi[j] = x; + pathi[j + 1] = y; + } + } + return path; + }; + + R._g = g; + /*\ + * Raphael.type + [ property (string) ] + ** + * Can be “SVG”, “VML” or empty, depending on browser support. + \*/ + R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); + if (R.type == "VML") { + var d = g.doc.createElement("div"), + b; + d.innerHTML = ''; + b = d.firstChild; + b.style.behavior = "url(#default#VML)"; + if (!(b && typeof b.adj == "object")) { + return (R.type = E); + } + d = null; + } + /*\ + * Raphael.svg + [ property (boolean) ] + ** + * `true` if browser supports SVG. + \*/ + /*\ + * Raphael.vml + [ property (boolean) ] + ** + * `true` if browser supports VML. + \*/ + R.svg = !(R.vml = R.type == "VML"); + R._Paper = Paper; + /*\ + * Raphael.fn + [ property (object) ] + ** + * You can add your own method to the canvas. For example if you want to draw a pie chart, + * you can create your own pie chart function and ship it as a Raphaël plugin. To do this + * you need to extend the `Raphael.fn` object. You should modify the `fn` object before a + * Raphaël instance is created, otherwise it will take no effect. Please note that the + * ability for namespaced plugins was removed in Raphael 2.0. It is up to the plugin to + * ensure any namespacing ensures proper context. + > Usage + | Raphael.fn.arrow = function (x1, y1, x2, y2, size) { + | return this.path( ... ); + | }; + | // or create namespace + | Raphael.fn.mystuff = { + | arrow: function () {…}, + | star: function () {…}, + | // etc… + | }; + | var paper = Raphael(10, 10, 630, 480); + | // then use it + | paper.arrow(10, 10, 30, 30, 5).attr({fill: "#f00"}); + | paper.mystuff.arrow(); + | paper.mystuff.star(); + \*/ + R.fn = paperproto = Paper.prototype = R.prototype; + R._id = 0; + R._oid = 0; + /*\ + * Raphael.is + [ method ] + ** + * Handful of replacements for `typeof` operator. + > Parameters + - o (…) any object or primitive + - type (string) name of the type, i.e. “string”, “function”, “number”, etc. + = (boolean) is given value is of given type + \*/ + R.is = function (o, type) { + type = lowerCase.call(type); + if (type == "finite") { + return !isnan[has](+o); + } + if (type == "array") { + return o instanceof Array; + } + return (type == "null" && o === null) || + (type == typeof o && o !== null) || + (type == "object" && o === Object(o)) || + (type == "array" && Array.isArray && Array.isArray(o)) || + objectToString.call(o).slice(8, -1).toLowerCase() == type; + }; + + function clone(obj) { + if (typeof obj == "function" || Object(obj) !== obj) { + return obj; + } + var res = new obj.constructor; + for (var key in obj) if (obj[has](key)) { + res[key] = clone(obj[key]); + } + return res; + } + + /*\ + * Raphael.angle + [ method ] + ** + * Returns angle between two or three points + > Parameters + - x1 (number) x coord of first point + - y1 (number) y coord of first point + - x2 (number) x coord of second point + - y2 (number) y coord of second point + - x3 (number) #optional x coord of third point + - y3 (number) #optional y coord of third point + = (number) angle in degrees. + \*/ + R.angle = function (x1, y1, x2, y2, x3, y3) { + if (x3 == null) { + var x = x1 - x2, + y = y1 - y2; + if (!x && !y) { + return 0; + } + return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360; + } else { + return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); + } + }; + /*\ + * Raphael.rad + [ method ] + ** + * Transform angle to radians + > Parameters + - deg (number) angle in degrees + = (number) angle in radians. + \*/ + R.rad = function (deg) { + return deg % 360 * PI / 180; + }; + /*\ + * Raphael.deg + [ method ] + ** + * Transform angle to degrees + > Parameters + - rad (number) angle in radians + = (number) angle in degrees. + \*/ + R.deg = function (rad) { + return Math.round ((rad * 180 / PI% 360)* 1000) / 1000; + }; + /*\ + * Raphael.snapTo + [ method ] + ** + * Snaps given value to given grid. + > Parameters + - values (array|number) given array of values or step of the grid + - value (number) value to adjust + - tolerance (number) #optional tolerance for snapping. Default is `10`. + = (number) adjusted value. + \*/ + R.snapTo = function (values, value, tolerance) { + tolerance = R.is(tolerance, "finite") ? tolerance : 10; + if (R.is(values, array)) { + var i = values.length; + while (i--) if (abs(values[i] - value) <= tolerance) { + return values[i]; + } + } else { + values = +values; + var rem = value % values; + if (rem < tolerance) { + return value - rem; + } + if (rem > values - tolerance) { + return value - rem + values; + } + } + return value; + }; + + /*\ + * Raphael.createUUID + [ method ] + ** + * Returns RFC4122, version 4 ID + \*/ + var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) { + return function () { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase(); + }; + })(/[xy]/g, function (c) { + var r = math.random() * 16 | 0, + v = c == "x" ? r : (r & 3 | 8); + return v.toString(16); + }); + + /*\ + * Raphael.setWindow + [ method ] + ** + * Used when you need to draw in `<iframe>`. Switched window to the iframe one. + > Parameters + - newwin (window) new window object + \*/ + R.setWindow = function (newwin) { + eve("raphael.setWindow", R, g.win, newwin); + g.win = newwin; + g.doc = g.win.document; + if (R._engine.initWin) { + R._engine.initWin(g.win); + } + }; + var toHex = function (color) { + if (R.vml) { + // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/ + var trim = /^\s+|\s+$/g; + var bod; + try { + var docum = new ActiveXObject("htmlfile"); + docum.write(""); + docum.close(); + bod = docum.body; + } catch(e) { + bod = createPopup().document.body; + } + var range = bod.createTextRange(); + toHex = cacher(function (color) { + try { + bod.style.color = Str(color).replace(trim, E); + var value = range.queryCommandValue("ForeColor"); + value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16); + return "#" + ("000000" + value.toString(16)).slice(-6); + } catch(e) { + return "none"; + } + }); + } else { + var i = g.doc.createElement("i"); + i.title = "Rapha\xebl Colour Picker"; + i.style.display = "none"; + g.doc.body.appendChild(i); + toHex = cacher(function (color) { + i.style.color = color; + return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color"); + }); + } + return toHex(color); + }, + hsbtoString = function () { + return "hsb(" + [this.h, this.s, this.b] + ")"; + }, + hsltoString = function () { + return "hsl(" + [this.h, this.s, this.l] + ")"; + }, + rgbtoString = function () { + return this.hex; + }, + prepareRGB = function (r, g, b) { + if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) { + b = r.b; + g = r.g; + r = r.r; + } + if (g == null && R.is(r, string)) { + var clr = R.getRGB(r); + r = clr.r; + g = clr.g; + b = clr.b; + } + if (r > 1 || g > 1 || b > 1) { + r /= 255; + g /= 255; + b /= 255; + } + + return [r, g, b]; + }, + packageRGB = function (r, g, b, o) { + r *= 255; + g *= 255; + b *= 255; + var rgb = { + r: r, + g: g, + b: b, + hex: R.rgb(r, g, b), + toString: rgbtoString + }; + R.is(o, "finite") && (rgb.opacity = o); + return rgb; + }; + + /*\ + * Raphael.color + [ method ] + ** + * Parses the color string and returns object with all values for the given color. + > Parameters + - clr (string) color string in one of the supported formats (see @Raphael.getRGB) + = (object) Combined RGB & HSB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) `true` if string can’t be parsed, + o h (number) hue, + o s (number) saturation, + o v (number) value (brightness), + o l (number) lightness + o } + \*/ + R.color = function (clr) { + var rgb; + if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { + rgb = R.hsb2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) { + rgb = R.hsl2rgb(clr); + clr.r = rgb.r; + clr.g = rgb.g; + clr.b = rgb.b; + clr.hex = rgb.hex; + } else { + if (R.is(clr, "string")) { + clr = R.getRGB(clr); + } + if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) { + rgb = R.rgb2hsl(clr); + clr.h = rgb.h; + clr.s = rgb.s; + clr.l = rgb.l; + rgb = R.rgb2hsb(clr); + clr.v = rgb.b; + } else { + clr = {hex: "none"}; + clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1; + } + } + clr.toString = rgbtoString; + return clr; + }; + /*\ + * Raphael.hsb2rgb + [ method ] + ** + * Converts HSB values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - v (number) value or brightness + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsb2rgb = function (h, s, v, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) { + v = h.b; + s = h.s; + o = h.o; + h = h.h; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = v * s; + X = C * (1 - abs(h % 2 - 1)); + R = G = B = v - C; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.hsl2rgb + [ method ] + ** + * Converts HSL values to RGB object. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue, + o hex (string) color in HTML/CSS format: #•••••• + o } + \*/ + R.hsl2rgb = function (h, s, l, o) { + if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) { + l = h.l; + s = h.s; + h = h.h; + } + if (h > 1 || s > 1 || l > 1) { + h /= 360; + s /= 100; + l /= 100; + } + h *= 360; + var R, G, B, X, C; + h = (h % 360) / 60; + C = 2 * s * (l < .5 ? l : 1 - l); + X = C * (1 - abs(h % 2 - 1)); + R = G = B = l - C / 2; + + h = ~~h; + R += [C, X, 0, 0, X, C][h]; + G += [X, C, C, X, 0, 0][h]; + B += [0, 0, X, C, C, X][h]; + return packageRGB(R, G, B, o); + }; + /*\ + * Raphael.rgb2hsb + [ method ] + ** + * Converts RGB values to HSB object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSB object in format: + o { + o h (number) hue + o s (number) saturation + o b (number) brightness + o } + \*/ + R.rgb2hsb = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, V, C; + V = mmax(r, g, b); + C = V - mmin(r, g, b); + H = (C == 0 ? null : + V == r ? (g - b) / C : + V == g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C == 0 ? 0 : C / V; + return {h: H, s: S, b: V, toString: hsbtoString}; + }; + /*\ + * Raphael.rgb2hsl + [ method ] + ** + * Converts RGB values to HSL object. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (object) HSL object in format: + o { + o h (number) hue + o s (number) saturation + o l (number) luminosity + o } + \*/ + R.rgb2hsl = function (r, g, b) { + b = prepareRGB(r, g, b); + r = b[0]; + g = b[1]; + b = b[2]; + + var H, S, L, M, m, C; + M = mmax(r, g, b); + m = mmin(r, g, b); + C = M - m; + H = (C == 0 ? null : + M == r ? (g - b) / C : + M == g ? (b - r) / C + 2 : + (r - g) / C + 4); + H = ((H + 360) % 6) * 60 / 360; + L = (M + m) / 2; + S = (C == 0 ? 0 : + L < .5 ? C / (2 * L) : + C / (2 - 2 * L)); + return {h: H, s: S, l: L, toString: hsltoString}; + }; + R._path2string = function () { + return this.join(",").replace(p2s, "$1"); + }; + function repush(array, item) { + for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) { + return array.push(array.splice(i, 1)[0]); + } + } + function cacher(f, scope, postprocessor) { + function newf() { + var arg = Array.prototype.slice.call(arguments, 0), + args = arg.join("\u2400"), + cache = newf.cache = newf.cache || {}, + count = newf.count = newf.count || []; + if (cache[has](args)) { + repush(count, args); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + count.length >= 1e3 && delete cache[count.shift()]; + count.push(args); + cache[args] = f[apply](scope, arg); + return postprocessor ? postprocessor(cache[args]) : cache[args]; + } + return newf; + } + + var preload = R._preload = function (src, f) { + var img = g.doc.createElement("img"); + img.style.cssText = "position:absolute;left:-9999em;top:-9999em"; + img.onload = function () { + f.call(this); + this.onload = null; + g.doc.body.removeChild(this); + }; + img.onerror = function () { + g.doc.body.removeChild(this); + }; + g.doc.body.appendChild(img); + img.src = src; + }; + + function clrToString() { + return this.hex; + } + + /*\ + * Raphael.getRGB + [ method ] + ** + * Parses colour string as RGB object + > Parameters + - colour (string) colour string in one of formats: + #
        + #
      • Colour name (“red”, “green”, “cornflowerblue”, etc)
      • + #
      • #••• — shortened HTML colour: (“#000”, “#fc0”, etc)
      • + #
      • #•••••• — full length HTML colour: (“#000000”, “#bd2300”)
      • + #
      • rgb(•••, •••, •••) — red, green and blue channels’ values: (“rgb(200, 100, 0)”)
      • + #
      • rgb(•••%, •••%, •••%) — same as above, but in %: (“rgb(100%, 175%, 0%)”)
      • + #
      • hsb(•••, •••, •••) — hue, saturation and brightness values: (“hsb(0.5, 0.25, 1)”)
      • + #
      • hsb(•••%, •••%, •••%) — same as above, but in %
      • + #
      • hsl(•••, •••, •••) — same as hsb
      • + #
      • hsl(•••%, •••%, •••%) — same as hsb
      • + #
      + = (object) RGB object in format: + o { + o r (number) red, + o g (number) green, + o b (number) blue + o hex (string) color in HTML/CSS format: #••••••, + o error (boolean) true if string can’t be parsed + o } + \*/ + R.getRGB = cacher(function (colour) { + if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + } + if (colour == "none") { + return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString}; + } + !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour)); + var res, + red, + green, + blue, + opacity, + t, + values, + rgb = colour.match(colourRegExp); + if (rgb) { + if (rgb[2]) { + blue = toInt(rgb[2].substring(5), 16); + green = toInt(rgb[2].substring(3, 5), 16); + red = toInt(rgb[2].substring(1, 3), 16); + } + if (rgb[3]) { + blue = toInt((t = rgb[3].charAt(3)) + t, 16); + green = toInt((t = rgb[3].charAt(2)) + t, 16); + red = toInt((t = rgb[3].charAt(1)) + t, 16); + } + if (rgb[4]) { + values = rgb[4][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + } + if (rgb[5]) { + values = rgb[5][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsb2rgb(red, green, blue, opacity); + } + if (rgb[6]) { + values = rgb[6][split](commaSpaces); + red = toFloat(values[0]); + values[0].slice(-1) == "%" && (red *= 2.55); + green = toFloat(values[1]); + values[1].slice(-1) == "%" && (green *= 2.55); + blue = toFloat(values[2]); + values[2].slice(-1) == "%" && (blue *= 2.55); + (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360); + rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3])); + values[3] && values[3].slice(-1) == "%" && (opacity /= 100); + return R.hsl2rgb(red, green, blue, opacity); + } + rgb = {r: red, g: green, b: blue, toString: clrToString}; + rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1); + R.is(opacity, "finite") && (rgb.opacity = opacity); + return rgb; + } + return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; + }, R); + /*\ + * Raphael.hsb + [ method ] + ** + * Converts HSB values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - b (number) value or brightness + = (string) hex representation of the colour. + \*/ + R.hsb = cacher(function (h, s, b) { + return R.hsb2rgb(h, s, b).hex; + }); + /*\ + * Raphael.hsl + [ method ] + ** + * Converts HSL values to hex representation of the colour. + > Parameters + - h (number) hue + - s (number) saturation + - l (number) luminosity + = (string) hex representation of the colour. + \*/ + R.hsl = cacher(function (h, s, l) { + return R.hsl2rgb(h, s, l).hex; + }); + /*\ + * Raphael.rgb + [ method ] + ** + * Converts RGB values to hex representation of the colour. + > Parameters + - r (number) red + - g (number) green + - b (number) blue + = (string) hex representation of the colour. + \*/ + R.rgb = cacher(function (r, g, b) { + return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1); + }); + /*\ + * Raphael.getColor + [ method ] + ** + * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset + > Parameters + - value (number) #optional brightness, default is `0.75` + = (string) hex representation of the colour. + \*/ + R.getColor = function (value) { + var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, + rgb = this.hsb2rgb(start.h, start.s, start.b); + start.h += .075; + if (start.h > 1) { + start.h = 0; + start.s -= .2; + start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b}); + } + return rgb.hex; + }; + /*\ + * Raphael.getColor.reset + [ method ] + ** + * Resets spectrum position for @Raphael.getColor back to red. + \*/ + R.getColor.reset = function () { + delete this.start; + }; + + // http://schepers.cc/getting-to-the-point + function catmullRom2bezier(crp, z) { + var d = []; + for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) { + var p = [ + {x: +crp[i - 2], y: +crp[i - 1]}, + {x: +crp[i], y: +crp[i + 1]}, + {x: +crp[i + 2], y: +crp[i + 3]}, + {x: +crp[i + 4], y: +crp[i + 5]} + ]; + if (z) { + if (!i) { + p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]}; + } else if (iLen - 4 == i) { + p[3] = {x: +crp[0], y: +crp[1]}; + } else if (iLen - 2 == i) { + p[2] = {x: +crp[0], y: +crp[1]}; + p[3] = {x: +crp[2], y: +crp[3]}; + } + } else { + if (iLen - 4 == i) { + p[3] = p[2]; + } else if (!i) { + p[0] = {x: +crp[i], y: +crp[i + 1]}; + } + } + d.push(["C", + (-p[0].x + 6 * p[1].x + p[2].x) / 6, + (-p[0].y + 6 * p[1].y + p[2].y) / 6, + (p[1].x + 6 * p[2].x - p[3].x) / 6, + (p[1].y + 6*p[2].y - p[3].y) / 6, + p[2].x, + p[2].y + ]); + } + + return d; + } + /*\ + * Raphael.parsePathString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of arrays of path segments. + > Parameters + - pathString (string|array) path string or array of segments (in the last case it will be returned straight away) + = (array) array of segments. + \*/ + R.parsePathString = function (pathString) { + if (!pathString) { + return null; + } + var pth = paths(pathString); + if (pth.arr) { + return pathClone(pth.arr); + } + + var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0}, + data = []; + if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption + data = pathClone(pathString); + } + if (!data.length) { + Str(pathString).replace(pathCommand, function (a, b, c) { + var params = [], + name = b.toLowerCase(); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + if (name == "m" && params.length > 2) { + data.push([b][concat](params.splice(0, 2))); + name = "l"; + b = b == "m" ? "l" : "L"; + } + if (name == "r") { + data.push([b][concat](params)); + } else while (params.length >= paramCounts[name]) { + data.push([b][concat](params.splice(0, paramCounts[name]))); + if (!paramCounts[name]) { + break; + } + } + }); + } + data.toString = R._path2string; + pth.arr = pathClone(data); + return data; + }; + /*\ + * Raphael.parseTransformString + [ method ] + ** + * Utility method + ** + * Parses given path string into an array of transformations. + > Parameters + - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away) + = (array) array of transformations. + \*/ + R.parseTransformString = cacher(function (TString) { + if (!TString) { + return null; + } + var paramCounts = {r: 3, s: 4, t: 2, m: 6}, + data = []; + if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption + data = pathClone(TString); + } + if (!data.length) { + Str(TString).replace(tCommand, function (a, b, c) { + var params = [], + name = lowerCase.call(b); + c.replace(pathValues, function (a, b) { + b && params.push(+b); + }); + data.push([b][concat](params)); + }); + } + data.toString = R._path2string; + return data; + }); + // PATHS + var paths = function (ps) { + var p = paths.ps = paths.ps || {}; + if (p[ps]) { + p[ps].sleep = 100; + } else { + p[ps] = { + sleep: 100 + }; + } + setTimeout(function () { + for (var key in p) if (p[has](key) && key != ps) { + p[key].sleep--; + !p[key].sleep && delete p[key]; + } + }); + return p[ps]; + }; + /*\ + * Raphael.findDotsAtSegment + [ method ] + ** + * Utility method + ** + * Find dot coordinates on the given cubic bezier curve at the given t. + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + - t (number) position on the curve (0..1) + = (object) point information in format: + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o m: { + o x: (number) x coordinate of the left anchor + o y: (number) y coordinate of the left anchor + o } + o n: { + o x: (number) x coordinate of the right anchor + o y: (number) y coordinate of the right anchor + o } + o start: { + o x: (number) x coordinate of the start of the curve + o y: (number) y coordinate of the start of the curve + o } + o end: { + o x: (number) x coordinate of the end of the curve + o y: (number) y coordinate of the end of the curve + o } + o alpha: (number) angle of the curve derivative at the point + o } + \*/ + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, + alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); + (mx > nx || my < ny) && (alpha += 180); + return { + x: x, + y: y, + m: {x: mx, y: my}, + n: {x: nx, y: ny}, + start: {x: ax, y: ay}, + end: {x: cx, y: cy}, + alpha: alpha + }; + }; + /*\ + * Raphael.bezierBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given cubic bezier curve + > Parameters + - p1x (number) x of the first point of the curve + - p1y (number) y of the first point of the curve + - c1x (number) x of the first anchor of the curve + - c1y (number) y of the first anchor of the curve + - c2x (number) x of the second anchor of the curve + - c2y (number) y of the second anchor of the curve + - p2x (number) x of the second point of the curve + - p2y (number) y of the second point of the curve + * or + - bez (array) array of six points for bezier curve + = (object) point information in format: + o { + o min: { + o x: (number) x coordinate of the left point + o y: (number) y coordinate of the top point + o } + o max: { + o x: (number) x coordinate of the right point + o y: (number) y coordinate of the bottom point + o } + o } + \*/ + R.bezierBBox = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + if (!R.is(p1x, "array")) { + p1x = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y]; + } + var bbox = curveDim.apply(null, p1x); + return { + x: bbox.min.x, + y: bbox.min.y, + x2: bbox.max.x, + y2: bbox.max.y, + width: bbox.max.x - bbox.min.x, + height: bbox.max.y - bbox.min.y + }; + }; + /*\ + * Raphael.isPointInsideBBox + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside bounding boxes. + > Parameters + - bbox (string) bounding box + - x (string) x coordinate of the point + - y (string) y coordinate of the point + = (boolean) `true` if point inside + \*/ + R.isPointInsideBBox = function (bbox, x, y) { + return x >= bbox.x && x <= bbox.x2 && y >= bbox.y && y <= bbox.y2; + }; + /*\ + * Raphael.isBBoxIntersect + [ method ] + ** + * Utility method + ** + * Returns `true` if two bounding boxes intersect + > Parameters + - bbox1 (string) first bounding box + - bbox2 (string) second bounding box + = (boolean) `true` if they intersect + \*/ + R.isBBoxIntersect = function (bbox1, bbox2) { + var i = R.isPointInsideBBox; + return i(bbox2, bbox1.x, bbox1.y) + || i(bbox2, bbox1.x2, bbox1.y) + || i(bbox2, bbox1.x, bbox1.y2) + || i(bbox2, bbox1.x2, bbox1.y2) + || i(bbox1, bbox2.x, bbox2.y) + || i(bbox1, bbox2.x2, bbox2.y) + || i(bbox1, bbox2.x, bbox2.y2) + || i(bbox1, bbox2.x2, bbox2.y2) + || (bbox1.x < bbox2.x2 && bbox1.x > bbox2.x || bbox2.x < bbox1.x2 && bbox2.x > bbox1.x) + && (bbox1.y < bbox2.y2 && bbox1.y > bbox2.y || bbox2.y < bbox1.y2 && bbox2.y > bbox1.y); + }; + function base3(t, p1, p2, p3, p4) { + var t1 = -3 * p1 + 9 * p2 - 9 * p3 + 3 * p4, + t2 = t * t1 + 6 * p1 - 12 * p2 + 6 * p3; + return t * t2 - 3 * p1 + 3 * p2; + } + function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) { + if (z == null) { + z = 1; + } + z = z > 1 ? 1 : z < 0 ? 0 : z; + var z2 = z / 2, + n = 12, + Tvalues = [-0.1252,0.1252,-0.3678,0.3678,-0.5873,0.5873,-0.7699,0.7699,-0.9041,0.9041,-0.9816,0.9816], + Cvalues = [0.2491,0.2491,0.2335,0.2335,0.2032,0.2032,0.1601,0.1601,0.1069,0.1069,0.0472,0.0472], + sum = 0; + for (var i = 0; i < n; i++) { + var ct = z2 * Tvalues[i] + z2, + xbase = base3(ct, x1, x2, x3, x4), + ybase = base3(ct, y1, y2, y3, y4), + comb = xbase * xbase + ybase * ybase; + sum += Cvalues[i] * math.sqrt(comb); + } + return z2 * sum; + } + function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) { + if (ll < 0 || bezlen(x1, y1, x2, y2, x3, y3, x4, y4) < ll) { + return; + } + var t = 1, + step = t / 2, + t2 = t - step, + l, + e = .01; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + while (abs(l - ll) > e) { + step /= 2; + t2 += (l < ll ? 1 : -1) * step; + l = bezlen(x1, y1, x2, y2, x3, y3, x4, y4, t2); + } + return t2; + } + function intersect(x1, y1, x2, y2, x3, y3, x4, y4) { + if ( + mmax(x1, x2) < mmin(x3, x4) || + mmin(x1, x2) > mmax(x3, x4) || + mmax(y1, y2) < mmin(y3, y4) || + mmin(y1, y2) > mmax(y3, y4) + ) { + return; + } + var nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4), + ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4), + denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4); + + if (!denominator) { + return; + } + var px = nx / denominator, + py = ny / denominator, + px2 = +px.toFixed(2), + py2 = +py.toFixed(2); + if ( + px2 < +mmin(x1, x2).toFixed(2) || + px2 > +mmax(x1, x2).toFixed(2) || + px2 < +mmin(x3, x4).toFixed(2) || + px2 > +mmax(x3, x4).toFixed(2) || + py2 < +mmin(y1, y2).toFixed(2) || + py2 > +mmax(y1, y2).toFixed(2) || + py2 < +mmin(y3, y4).toFixed(2) || + py2 > +mmax(y3, y4).toFixed(2) + ) { + return; + } + return {x: px, y: py}; + } + function inter(bez1, bez2) { + return interHelper(bez1, bez2); + } + function interCount(bez1, bez2) { + return interHelper(bez1, bez2, 1); + } + function interHelper(bez1, bez2, justCount) { + var bbox1 = R.bezierBBox(bez1), + bbox2 = R.bezierBBox(bez2); + if (!R.isBBoxIntersect(bbox1, bbox2)) { + return justCount ? 0 : []; + } + var l1 = bezlen.apply(0, bez1), + l2 = bezlen.apply(0, bez2), + n1 = mmax(~~(l1 / 5), 1), + n2 = mmax(~~(l2 / 5), 1), + dots1 = [], + dots2 = [], + xy = {}, + res = justCount ? 0 : []; + for (var i = 0; i < n1 + 1; i++) { + var p = R.findDotsAtSegment.apply(R, bez1.concat(i / n1)); + dots1.push({x: p.x, y: p.y, t: i / n1}); + } + for (i = 0; i < n2 + 1; i++) { + p = R.findDotsAtSegment.apply(R, bez2.concat(i / n2)); + dots2.push({x: p.x, y: p.y, t: i / n2}); + } + for (i = 0; i < n1; i++) { + for (var j = 0; j < n2; j++) { + var di = dots1[i], + di1 = dots1[i + 1], + dj = dots2[j], + dj1 = dots2[j + 1], + ci = abs(di1.x - di.x) < .001 ? "y" : "x", + cj = abs(dj1.x - dj.x) < .001 ? "y" : "x", + is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y); + if (is) { + if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) { + continue; + } + xy[is.x.toFixed(4)] = is.y.toFixed(4); + var t1 = di.t + abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t), + t2 = dj.t + abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t); + if (t1 >= 0 && t1 <= 1.001 && t2 >= 0 && t2 <= 1.001) { + if (justCount) { + res++; + } else { + res.push({ + x: is.x, + y: is.y, + t1: mmin(t1, 1), + t2: mmin(t2, 1) + }); + } + } + } + } + } + return res; + } + /*\ + * Raphael.pathIntersection + [ method ] + ** + * Utility method + ** + * Finds intersections of two paths + > Parameters + - path1 (string) path string + - path2 (string) path string + = (array) dots of intersection + o [ + o { + o x: (number) x coordinate of the point + o y: (number) y coordinate of the point + o t1: (number) t value for segment of path1 + o t2: (number) t value for segment of path2 + o segment1: (number) order number for segment of path1 + o segment2: (number) order number for segment of path2 + o bez1: (array) eight coordinates representing beziér curve for the segment of path1 + o bez2: (array) eight coordinates representing beziér curve for the segment of path2 + o } + o ] + \*/ + R.pathIntersection = function (path1, path2) { + return interPathHelper(path1, path2); + }; + R.pathIntersectionNumber = function (path1, path2) { + return interPathHelper(path1, path2, 1); + }; + function interPathHelper(path1, path2, justCount) { + path1 = R._path2curve(path1); + path2 = R._path2curve(path2); + var x1, y1, x2, y2, x1m, y1m, x2m, y2m, bez1, bez2, + res = justCount ? 0 : []; + for (var i = 0, ii = path1.length; i < ii; i++) { + var pi = path1[i]; + if (pi[0] == "M") { + x1 = x1m = pi[1]; + y1 = y1m = pi[2]; + } else { + if (pi[0] == "C") { + bez1 = [x1, y1].concat(pi.slice(1)); + x1 = bez1[6]; + y1 = bez1[7]; + } else { + bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m]; + x1 = x1m; + y1 = y1m; + } + for (var j = 0, jj = path2.length; j < jj; j++) { + var pj = path2[j]; + if (pj[0] == "M") { + x2 = x2m = pj[1]; + y2 = y2m = pj[2]; + } else { + if (pj[0] == "C") { + bez2 = [x2, y2].concat(pj.slice(1)); + x2 = bez2[6]; + y2 = bez2[7]; + } else { + bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m]; + x2 = x2m; + y2 = y2m; + } + var intr = interHelper(bez1, bez2, justCount); + if (justCount) { + res += intr; + } else { + for (var k = 0, kk = intr.length; k < kk; k++) { + intr[k].segment1 = i; + intr[k].segment2 = j; + intr[k].bez1 = bez1; + intr[k].bez2 = bez2; + } + res = res.concat(intr); + } + } + } + } + } + return res; + } + /*\ + * Raphael.isPointInsidePath + [ method ] + ** + * Utility method + ** + * Returns `true` if given point is inside a given closed path. + > Parameters + - path (string) path string + - x (number) x of the point + - y (number) y of the point + = (boolean) true, if point is inside the path + \*/ + R.isPointInsidePath = function (path, x, y) { + var bbox = R.pathBBox(path); + return R.isPointInsideBBox(bbox, x, y) && + interPathHelper(path, [["M", x, y], ["H", bbox.x2 + 10]], 1) % 2 == 1; + }; + R._removedFactory = function (methodname) { + return function () { + eve("raphael.log", null, "Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object", methodname); + }; + }; + /*\ + * Raphael.pathBBox + [ method ] + ** + * Utility method + ** + * Return bounding box of a given path + > Parameters + - path (string) path string + = (object) bounding box + o { + o x: (number) x coordinate of the left top point of the box + o y: (number) y coordinate of the left top point of the box + o x2: (number) x coordinate of the right bottom point of the box + o y2: (number) y coordinate of the right bottom point of the box + o width: (number) width of the box + o height: (number) height of the box + o cx: (number) x coordinate of the center of the box + o cy: (number) y coordinate of the center of the box + o } + \*/ + var pathDimensions = R.pathBBox = function (path) { + var pth = paths(path); + if (pth.bbox) { + return clone(pth.bbox); + } + if (!path) { + return {x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0}; + } + path = path2curve(path); + var x = 0, + y = 0, + X = [], + Y = [], + p; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = p[1]; + y = p[2]; + X.push(x); + Y.push(y); + } else { + var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + X = X[concat](dim.min.x, dim.max.x); + Y = Y[concat](dim.min.y, dim.max.y); + x = p[5]; + y = p[6]; + } + } + var xmin = mmin[apply](0, X), + ymin = mmin[apply](0, Y), + xmax = mmax[apply](0, X), + ymax = mmax[apply](0, Y), + width = xmax - xmin, + height = ymax - ymin, + bb = { + x: xmin, + y: ymin, + x2: xmax, + y2: ymax, + width: width, + height: height, + cx: xmin + width / 2, + cy: ymin + height / 2 + }; + pth.bbox = clone(bb); + return bb; + }, + pathClone = function (pathArray) { + var res = clone(pathArray); + res.toString = R._path2string; + return res; + }, + pathToRelative = R._pathToRelative = function (pathArray) { + var pth = paths(pathArray); + if (pth.rel) { + return pathClone(pth.rel); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = pathArray[0][1]; + y = pathArray[0][2]; + mx = x; + my = y; + start++; + res.push(["M", x, y]); + } + for (var i = start, ii = pathArray.length; i < ii; i++) { + var r = res[i] = [], + pa = pathArray[i]; + if (pa[0] != lowerCase.call(pa[0])) { + r[0] = lowerCase.call(pa[0]); + switch (r[0]) { + case "a": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] - x).toFixed(3); + r[7] = +(pa[7] - y).toFixed(3); + break; + case "v": + r[1] = +(pa[1] - y).toFixed(3); + break; + case "m": + mx = pa[1]; + my = pa[2]; + default: + for (var j = 1, jj = pa.length; j < jj; j++) { + r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3); + } + } + } else { + r = res[i] = []; + if (pa[0] == "m") { + mx = pa[1] + x; + my = pa[2] + y; + } + for (var k = 0, kk = pa.length; k < kk; k++) { + res[i][k] = pa[k]; + } + } + var len = res[i].length; + switch (res[i][0]) { + case "z": + x = mx; + y = my; + break; + case "h": + x += +res[i][len - 1]; + break; + case "v": + y += +res[i][len - 1]; + break; + default: + x += +res[i][len - 2]; + y += +res[i][len - 1]; + } + } + res.toString = R._path2string; + pth.rel = pathClone(res); + return res; + }, + pathToAbsolute = R._pathToAbsolute = function (pathArray) { + var pth = paths(pathArray); + if (pth.abs) { + return pathClone(pth.abs); + } + if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption + pathArray = R.parsePathString(pathArray); + } + if (!pathArray || !pathArray.length) { + return [["M", 0, 0]]; + } + var res = [], + x = 0, + y = 0, + mx = 0, + my = 0, + start = 0; + if (pathArray[0][0] == "M") { + x = +pathArray[0][1]; + y = +pathArray[0][2]; + mx = x; + my = y; + start++; + res[0] = ["M", x, y]; + } + var crz = pathArray.length == 3 && pathArray[0][0] == "M" && pathArray[1][0].toUpperCase() == "R" && pathArray[2][0].toUpperCase() == "Z"; + for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) { + res.push(r = []); + pa = pathArray[i]; + if (pa[0] != upperCase.call(pa[0])) { + r[0] = upperCase.call(pa[0]); + switch (r[0]) { + case "A": + r[1] = pa[1]; + r[2] = pa[2]; + r[3] = pa[3]; + r[4] = pa[4]; + r[5] = pa[5]; + r[6] = +(pa[6] + x); + r[7] = +(pa[7] + y); + break; + case "V": + r[1] = +pa[1] + y; + break; + case "H": + r[1] = +pa[1] + x; + break; + case "R": + var dots = [x, y][concat](pa.slice(1)); + for (var j = 2, jj = dots.length; j < jj; j++) { + dots[j] = +dots[j] + x; + dots[++j] = +dots[j] + y; + } + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + break; + case "M": + mx = +pa[1] + x; + my = +pa[2] + y; + default: + for (j = 1, jj = pa.length; j < jj; j++) { + r[j] = +pa[j] + ((j % 2) ? x : y); + } + } + } else if (pa[0] == "R") { + dots = [x, y][concat](pa.slice(1)); + res.pop(); + res = res[concat](catmullRom2bezier(dots, crz)); + r = ["R"][concat](pa.slice(-2)); + } else { + for (var k = 0, kk = pa.length; k < kk; k++) { + r[k] = pa[k]; + } + } + switch (r[0]) { + case "Z": + x = mx; + y = my; + break; + case "H": + x = r[1]; + break; + case "V": + y = r[1]; + break; + case "M": + mx = r[r.length - 2]; + my = r[r.length - 1]; + default: + x = r[r.length - 2]; + y = r[r.length - 1]; + } + } + res.toString = R._path2string; + pth.abs = pathClone(res); + return res; + }, + l2c = function (x1, y1, x2, y2) { + return [x1, y1, x2, y2, x2, y2]; + }, + q2c = function (x1, y1, ax, ay, x2, y2) { + var _13 = 1 / 3, + _23 = 2 / 3; + return [ + _13 * x1 + _23 * ax, + _13 * y1 + _23 * ay, + _13 * x2 + _23 * ax, + _13 * y2 + _23 * ay, + x2, + y2 + ]; + }, + a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) { + // for more information of where this math came from visit: + // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes + var _120 = PI * 120 / 180, + rad = PI / 180 * (+angle || 0), + res = [], + xy, + rotate = cacher(function (x, y, rad) { + var X = x * math.cos(rad) - y * math.sin(rad), + Y = x * math.sin(rad) + y * math.cos(rad); + return {x: X, y: Y}; + }); + if (!recursive) { + xy = rotate(x1, y1, -rad); + x1 = xy.x; + y1 = xy.y; + xy = rotate(x2, y2, -rad); + x2 = xy.x; + y2 = xy.y; + var cos = math.cos(PI / 180 * angle), + sin = math.sin(PI / 180 * angle), + x = (x1 - x2) / 2, + y = (y1 - y2) / 2; + var h = (x * x) / (rx * rx) + (y * y) / (ry * ry); + if (h > 1) { + h = math.sqrt(h); + rx = h * rx; + ry = h * ry; + } + var rx2 = rx * rx, + ry2 = ry * ry, + k = (large_arc_flag == sweep_flag ? -1 : 1) * + math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))), + cx = k * rx * y / ry + (x1 + x2) / 2, + cy = k * -ry * x / rx + (y1 + y2) / 2, + f1 = math.asin(((y1 - cy) / ry).toFixed(9)), + f2 = math.asin(((y2 - cy) / ry).toFixed(9)); + + f1 = x1 < cx ? PI - f1 : f1; + f2 = x2 < cx ? PI - f2 : f2; + f1 < 0 && (f1 = PI * 2 + f1); + f2 < 0 && (f2 = PI * 2 + f2); + if (sweep_flag && f1 > f2) { + f1 = f1 - PI * 2; + } + if (!sweep_flag && f2 > f1) { + f2 = f2 - PI * 2; + } + } else { + f1 = recursive[0]; + f2 = recursive[1]; + cx = recursive[2]; + cy = recursive[3]; + } + var df = f2 - f1; + if (abs(df) > _120) { + var f2old = f2, + x2old = x2, + y2old = y2; + f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1); + x2 = cx + rx * math.cos(f2); + y2 = cy + ry * math.sin(f2); + res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]); + } + df = f2 - f1; + var c1 = math.cos(f1), + s1 = math.sin(f1), + c2 = math.cos(f2), + s2 = math.sin(f2), + t = math.tan(df / 4), + hx = 4 / 3 * rx * t, + hy = 4 / 3 * ry * t, + m1 = [x1, y1], + m2 = [x1 + hx * s1, y1 - hy * c1], + m3 = [x2 + hx * s2, y2 - hy * c2], + m4 = [x2, y2]; + m2[0] = 2 * m1[0] - m2[0]; + m2[1] = 2 * m1[1] - m2[1]; + if (recursive) { + return [m2, m3, m4][concat](res); + } else { + res = [m2, m3, m4][concat](res).join()[split](","); + var newres = []; + for (var i = 0, ii = res.length; i < ii; i++) { + newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x; + } + return newres; + } + }, + findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { + var t1 = 1 - t; + return { + x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, + y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y + }; + }, + curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) { + var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x), + b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + c = p1x - c1x, + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a, + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a, + y = [p1y, p2y], + x = [p1x, p2x], + dot; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y); + b = 2 * (c1y - p1y) - 2 * (c2y - c1y); + c = p1y - c1y; + t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a; + t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a; + abs(t1) > "1e12" && (t1 = .5); + abs(t2) > "1e12" && (t2 = .5); + if (t1 > 0 && t1 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1); + x.push(dot.x); + y.push(dot.y); + } + if (t2 > 0 && t2 < 1) { + dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2); + x.push(dot.x); + y.push(dot.y); + } + return { + min: {x: mmin[apply](0, x), y: mmin[apply](0, y)}, + max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} + }; + }), + path2curve = R._path2curve = cacher(function (path, path2) { + var pth = !path2 && paths(path); + if (!path2 && pth.curve) { + return pathClone(pth.curve); + } + var p = pathToAbsolute(path), + p2 = path2 && pathToAbsolute(path2), + attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, + processPath = function (path, d, pcom) { + var nx, ny, tq = {T:1, Q:1}; + if (!path) { + return ["C", d.x, d.y, d.x, d.y, d.x, d.y]; + } + !(path[0] in tq) && (d.qx = d.qy = null); + switch (path[0]) { + case "M": + d.X = path[1]; + d.Y = path[2]; + break; + case "A": + path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1)))); + break; + case "S": + if (pcom == "C" || pcom == "S") { // In "S" case we have to take into account, if the previous command is C/S. + nx = d.x * 2 - d.bx; // And reflect the previous + ny = d.y * 2 - d.by; // command's control point relative to the current point. + } + else { // or some else or nothing + nx = d.x; + ny = d.y; + } + path = ["C", nx, ny][concat](path.slice(1)); + break; + case "T": + if (pcom == "Q" || pcom == "T") { // In "T" case we have to take into account, if the previous command is Q/T. + d.qx = d.x * 2 - d.qx; // And make a reflection similar + d.qy = d.y * 2 - d.qy; // to case "S". + } + else { // or something else or nothing + d.qx = d.x; + d.qy = d.y; + } + path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2])); + break; + case "Q": + d.qx = path[1]; + d.qy = path[2]; + path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4])); + break; + case "L": + path = ["C"][concat](l2c(d.x, d.y, path[1], path[2])); + break; + case "H": + path = ["C"][concat](l2c(d.x, d.y, path[1], d.y)); + break; + case "V": + path = ["C"][concat](l2c(d.x, d.y, d.x, path[1])); + break; + case "Z": + path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y)); + break; + } + return path; + }, + fixArc = function (pp, i) { + if (pp[i].length > 7) { + pp[i].shift(); + var pi = pp[i]; + while (pi.length) { + pcoms1[i]="A"; // if created multiple C:s, their original seg is saved + p2 && (pcoms2[i]="A"); // the same as above + pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6))); + } + pp.splice(i, 1); + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + fixM = function (path1, path2, a1, a2, i) { + if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") { + path2.splice(i, 0, ["M", a2.x, a2.y]); + a1.bx = 0; + a1.by = 0; + a1.x = path1[i][1]; + a1.y = path1[i][2]; + ii = mmax(p.length, p2 && p2.length || 0); + } + }, + pcoms1 = [], // path commands of original path p + pcoms2 = [], // path commands of original path p2 + pfirst = "", // temporary holder for original path command + pcom = ""; // holder for previous path command of original path + for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) { + p[i] && (pfirst = p[i][0]); // save current path command + + if (pfirst != "C") // C is not saved yet, because it may be result of conversion + { + pcoms1[i] = pfirst; // Save current path command + i && ( pcom = pcoms1[i-1]); // Get previous path command pcom + } + p[i] = processPath(p[i], attrs, pcom); // Previous path command is inputted to processPath + + if (pcoms1[i] != "A" && pfirst == "C") pcoms1[i] = "C"; // A is the only command + // which may produce multiple C:s + // so we have to make sure that C is also C in original path + + fixArc(p, i); // fixArc adds also the right amount of A:s to pcoms1 + + if (p2) { // the same procedures is done to p2 + p2[i] && (pfirst = p2[i][0]); + if (pfirst != "C") + { + pcoms2[i] = pfirst; + i && (pcom = pcoms2[i-1]); + } + p2[i] = processPath(p2[i], attrs2, pcom); + + if (pcoms2[i]!="A" && pfirst=="C") pcoms2[i]="C"; + + fixArc(p2, i); + } + fixM(p, p2, attrs, attrs2, i); + fixM(p2, p, attrs2, attrs, i); + var seg = p[i], + seg2 = p2 && p2[i], + seglen = seg.length, + seg2len = p2 && seg2.length; + attrs.x = seg[seglen - 2]; + attrs.y = seg[seglen - 1]; + attrs.bx = toFloat(seg[seglen - 4]) || attrs.x; + attrs.by = toFloat(seg[seglen - 3]) || attrs.y; + attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x); + attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y); + attrs2.x = p2 && seg2[seg2len - 2]; + attrs2.y = p2 && seg2[seg2len - 1]; + } + if (!p2) { + pth.curve = pathClone(p); + } + return p2 ? [p, p2] : p; + }, null, pathClone), + parseDots = R._parseDots = cacher(function (gradient) { + var dots = []; + for (var i = 0, ii = gradient.length; i < ii; i++) { + var dot = {}, + par = gradient[i].match(/^([^:]*):?([\d\.]*)/); + dot.color = R.getRGB(par[1]); + if (dot.color.error) { + return null; + } + dot.color = dot.color.hex; + par[2] && (dot.offset = par[2] + "%"); + dots.push(dot); + } + for (i = 1, ii = dots.length - 1; i < ii; i++) { + if (!dots[i].offset) { + var start = toFloat(dots[i - 1].offset || 0), + end = 0; + for (var j = i + 1; j < ii; j++) { + if (dots[j].offset) { + end = dots[j].offset; + break; + } + } + if (!end) { + end = 100; + j = ii; + } + end = toFloat(end); + var d = (end - start) / (j - i + 1); + for (; i < j; i++) { + start += d; + dots[i].offset = start + "%"; + } + } + } + return dots; + }), + tear = R._tear = function (el, paper) { + el == paper.top && (paper.top = el.prev); + el == paper.bottom && (paper.bottom = el.next); + el.next && (el.next.prev = el.prev); + el.prev && (el.prev.next = el.next); + }, + tofront = R._tofront = function (el, paper) { + if (paper.top === el) { + return; + } + tear(el, paper); + el.next = null; + el.prev = paper.top; + paper.top.next = el; + paper.top = el; + }, + toback = R._toback = function (el, paper) { + if (paper.bottom === el) { + return; + } + tear(el, paper); + el.next = paper.bottom; + el.prev = null; + paper.bottom.prev = el; + paper.bottom = el; + }, + insertafter = R._insertafter = function (el, el2, paper) { + tear(el, paper); + el2 == paper.top && (paper.top = el); + el2.next && (el2.next.prev = el); + el.next = el2.next; + el.prev = el2; + el2.next = el; + }, + insertbefore = R._insertbefore = function (el, el2, paper) { + tear(el, paper); + el2 == paper.bottom && (paper.bottom = el); + el2.prev && (el2.prev.next = el); + el.prev = el2.prev; + el2.prev = el; + el.next = el2; + }, + /*\ + * Raphael.toMatrix + [ method ] + ** + * Utility method + ** + * Returns matrix of transformations applied to a given path + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (object) @Matrix + \*/ + toMatrix = R.toMatrix = function (path, transform) { + var bb = pathDimensions(path), + el = { + _: { + transform: E + }, + getBBox: function () { + return bb; + } + }; + extractTransform(el, transform); + return el.matrix; + }, + /*\ + * Raphael.transformPath + [ method ] + ** + * Utility method + ** + * Returns path transformed by a given transformation + > Parameters + - path (string) path string + - transform (string|array) transformation string + = (string) path + \*/ + transformPath = R.transformPath = function (path, transform) { + return mapPath(path, toMatrix(path, transform)); + }, + extractTransform = R._extractTransform = function (el, tstr) { + if (tstr == null) { + return el._.transform; + } + tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E); + var tdata = R.parseTransformString(tstr), + deg = 0, + dx = 0, + dy = 0, + sx = 1, + sy = 1, + _ = el._, + m = new Matrix; + _.transform = tdata || []; + if (tdata) { + for (var i = 0, ii = tdata.length; i < ii; i++) { + var t = tdata[i], + tlen = t.length, + command = Str(t[0]).toLowerCase(), + absolute = t[0] != command, + inver = absolute ? m.invert() : 0, + x1, + y1, + x2, + y2, + bb; + if (command == "t" && tlen == 3) { + if (absolute) { + x1 = inver.x(0, 0); + y1 = inver.y(0, 0); + x2 = inver.x(t[1], t[2]); + y2 = inver.y(t[1], t[2]); + m.translate(x2 - x1, y2 - y1); + } else { + m.translate(t[1], t[2]); + } + } else if (command == "r") { + if (tlen == 2) { + bb = bb || el.getBBox(1); + m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2); + deg += t[1]; + } else if (tlen == 4) { + if (absolute) { + x2 = inver.x(t[2], t[3]); + y2 = inver.y(t[2], t[3]); + m.rotate(t[1], x2, y2); + } else { + m.rotate(t[1], t[2], t[3]); + } + deg += t[1]; + } + } else if (command == "s") { + if (tlen == 2 || tlen == 3) { + bb = bb || el.getBBox(1); + m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2); + sx *= t[1]; + sy *= t[tlen - 1]; + } else if (tlen == 5) { + if (absolute) { + x2 = inver.x(t[3], t[4]); + y2 = inver.y(t[3], t[4]); + m.scale(t[1], t[2], x2, y2); + } else { + m.scale(t[1], t[2], t[3], t[4]); + } + sx *= t[1]; + sy *= t[2]; + } + } else if (command == "m" && tlen == 7) { + m.add(t[1], t[2], t[3], t[4], t[5], t[6]); + } + _.dirtyT = 1; + el.matrix = m; + } + } + + /*\ + * Element.matrix + [ property (object) ] + ** + * Keeps @Matrix object, which represents element transformation + \*/ + el.matrix = m; + + _.sx = sx; + _.sy = sy; + _.deg = deg; + _.dx = dx = m.e; + _.dy = dy = m.f; + + if (sx == 1 && sy == 1 && !deg && _.bbox) { + _.bbox.x += +dx; + _.bbox.y += +dy; + } else { + _.dirtyT = 1; + } + }, + getEmpty = function (item) { + var l = item[0]; + switch (l.toLowerCase()) { + case "t": return [l, 0, 0]; + case "m": return [l, 1, 0, 0, 1, 0, 0]; + case "r": if (item.length == 4) { + return [l, 0, item[2], item[3]]; + } else { + return [l, 0]; + } + case "s": if (item.length == 5) { + return [l, 1, 1, item[3], item[4]]; + } else if (item.length == 3) { + return [l, 1, 1]; + } else { + return [l, 1]; + } + } + }, + equaliseTransform = R._equaliseTransform = function (t1, t2) { + t2 = Str(t2).replace(/\.{3}|\u2026/g, t1); + t1 = R.parseTransformString(t1) || []; + t2 = R.parseTransformString(t2) || []; + var maxlength = mmax(t1.length, t2.length), + from = [], + to = [], + i = 0, j, jj, + tt1, tt2; + for (; i < maxlength; i++) { + tt1 = t1[i] || getEmpty(t2[i]); + tt2 = t2[i] || getEmpty(tt1); + if ((tt1[0] != tt2[0]) || + (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) || + (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4])) + ) { + return; + } + from[i] = []; + to[i] = []; + for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) { + j in tt1 && (from[i][j] = tt1[j]); + j in tt2 && (to[i][j] = tt2[j]); + } + } + return { + from: from, + to: to + }; + }; + R._getContainer = function (x, y, w, h) { + var container; + container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x; + if (container == null) { + return; + } + if (container.tagName) { + if (y == null) { + return { + container: container, + width: container.style.pixelWidth || container.offsetWidth, + height: container.style.pixelHeight || container.offsetHeight + }; + } else { + return { + container: container, + width: y, + height: w + }; + } + } + return { + container: 1, + x: x, + y: y, + width: w, + height: h + }; + }; + /*\ + * Raphael.pathToRelative + [ method ] + ** + * Utility method + ** + * Converts path to relative form + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.pathToRelative = pathToRelative; + R._engine = {}; + /*\ + * Raphael.path2curve + [ method ] + ** + * Utility method + ** + * Converts path to a new path where all segments are cubic bezier curves. + > Parameters + - pathString (string|array) path string or array of segments + = (array) array of segments. + \*/ + R.path2curve = path2curve; + /*\ + * Raphael.matrix + [ method ] + ** + * Utility method + ** + * Returns matrix based on given parameters. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + = (object) @Matrix + \*/ + R.matrix = function (a, b, c, d, e, f) { + return new Matrix(a, b, c, d, e, f); + }; + function Matrix(a, b, c, d, e, f) { + if (a != null) { + this.a = +a; + this.b = +b; + this.c = +c; + this.d = +d; + this.e = +e; + this.f = +f; + } else { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.e = 0; + this.f = 0; + } + } + (function (matrixproto) { + /*\ + * Matrix.add + [ method ] + ** + * Adds given matrix to existing one. + > Parameters + - a (number) + - b (number) + - c (number) + - d (number) + - e (number) + - f (number) + or + - matrix (object) @Matrix + \*/ + matrixproto.add = function (a, b, c, d, e, f) { + var out = [[], [], []], + m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], + matrix = [[a, c, e], [b, d, f], [0, 0, 1]], + x, y, z, res; + + if (a && a instanceof Matrix) { + matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]; + } + + for (x = 0; x < 3; x++) { + for (y = 0; y < 3; y++) { + res = 0; + for (z = 0; z < 3; z++) { + res += m[x][z] * matrix[z][y]; + } + out[x][y] = res; + } + } + this.a = out[0][0]; + this.b = out[1][0]; + this.c = out[0][1]; + this.d = out[1][1]; + this.e = out[0][2]; + this.f = out[1][2]; + }; + /*\ + * Matrix.invert + [ method ] + ** + * Returns inverted version of the matrix + = (object) @Matrix + \*/ + matrixproto.invert = function () { + var me = this, + x = me.a * me.d - me.b * me.c; + return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); + }; + /*\ + * Matrix.clone + [ method ] + ** + * Returns copy of the matrix + = (object) @Matrix + \*/ + matrixproto.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); + }; + /*\ + * Matrix.translate + [ method ] + ** + * Translate the matrix + > Parameters + - x (number) + - y (number) + \*/ + matrixproto.translate = function (x, y) { + this.add(1, 0, 0, 1, x, y); + }; + /*\ + * Matrix.scale + [ method ] + ** + * Scales the matrix + > Parameters + - x (number) + - y (number) #optional + - cx (number) #optional + - cy (number) #optional + \*/ + matrixproto.scale = function (x, y, cx, cy) { + y == null && (y = x); + (cx || cy) && this.add(1, 0, 0, 1, cx, cy); + this.add(x, 0, 0, y, 0, 0); + (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy); + }; + /*\ + * Matrix.rotate + [ method ] + ** + * Rotates the matrix + > Parameters + - a (number) + - x (number) + - y (number) + \*/ + matrixproto.rotate = function (a, x, y) { + a = R.rad(a); + x = x || 0; + y = y || 0; + var cos = +math.cos(a).toFixed(9), + sin = +math.sin(a).toFixed(9); + this.add(cos, sin, -sin, cos, x, y); + this.add(1, 0, 0, 1, -x, -y); + }; + /*\ + * Matrix.x + [ method ] + ** + * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y + > Parameters + - x (number) + - y (number) + = (number) x + \*/ + matrixproto.x = function (x, y) { + return x * this.a + y * this.c + this.e; + }; + /*\ + * Matrix.y + [ method ] + ** + * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x + > Parameters + - x (number) + - y (number) + = (number) y + \*/ + matrixproto.y = function (x, y) { + return x * this.b + y * this.d + this.f; + }; + matrixproto.get = function (i) { + return +this[Str.fromCharCode(97 + i)].toFixed(4); + }; + matrixproto.toString = function () { + return R.svg ? + "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" : + [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join(); + }; + matrixproto.toFilter = function () { + return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) + + ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) + + ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')"; + }; + matrixproto.offset = function () { + return [this.e.toFixed(4), this.f.toFixed(4)]; + }; + function norm(a) { + return a[0] * a[0] + a[1] * a[1]; + } + function normalize(a) { + var mag = math.sqrt(norm(a)); + a[0] && (a[0] /= mag); + a[1] && (a[1] /= mag); + } + /*\ + * Matrix.split + [ method ] + ** + * Splits matrix into primitive transformations + = (object) in format: + o dx (number) translation by x + o dy (number) translation by y + o scalex (number) scale by x + o scaley (number) scale by y + o shear (number) shear + o rotate (number) rotation in deg + o isSimple (boolean) could it be represented via simple transformations + \*/ + matrixproto.split = function () { + var out = {}; + // translation + out.dx = this.e; + out.dy = this.f; + + // scale and shear + var row = [[this.a, this.c], [this.b, this.d]]; + out.scalex = math.sqrt(norm(row[0])); + normalize(row[0]); + + out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1]; + row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear]; + + out.scaley = math.sqrt(norm(row[1])); + normalize(row[1]); + out.shear /= out.scaley; + + // rotation + var sin = -row[0][1], + cos = row[1][1]; + if (cos < 0) { + out.rotate = R.deg(math.acos(cos)); + if (sin < 0) { + out.rotate = 360 - out.rotate; + } + } else { + out.rotate = R.deg(math.asin(sin)); + } + + out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate); + out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate; + out.noRotation = !+out.shear.toFixed(9) && !out.rotate; + return out; + }; + /*\ + * Matrix.toTransformString + [ method ] + ** + * Return transform string that represents given matrix + = (string) transform string + \*/ + matrixproto.toTransformString = function (shorter) { + var s = shorter || this[split](); + if (s.isSimple) { + s.scalex = +s.scalex.toFixed(4); + s.scaley = +s.scaley.toFixed(4); + s.rotate = +s.rotate.toFixed(4); + return (s.dx || s.dy ? "t" + [s.dx, s.dy] : E) + + (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) + + (s.rotate ? "r" + [s.rotate, 0, 0] : E); + } else { + return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)]; + } + }; + })(Matrix.prototype); + + // WebKit rendering bug workaround method + var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/); + if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") || + (navigator.vendor == "Google Inc." && version && version[1] < 8)) { + /*\ + * Paper.safari + [ method ] + ** + * There is an inconvenient rendering bug in Safari (WebKit): + * sometimes the rendering should be forced. + * This method should help with dealing with this bug. + \*/ + paperproto.safari = function () { + var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"}); + setTimeout(function () {rect.remove();}); + }; + } else { + paperproto.safari = fun; + } + + var preventDefault = function () { + this.returnValue = false; + }, + preventTouch = function () { + return this.originalEvent.preventDefault(); + }, + stopPropagation = function () { + this.cancelBubble = true; + }, + stopTouch = function () { + return this.originalEvent.stopPropagation(); + }, + getEventPosition = function (e) { + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + + return { + x: e.clientX + scrollX, + y: e.clientY + scrollY + }; + }, + addEvent = (function () { + if (g.doc.addEventListener) { + return function (obj, type, fn, element) { + var f = function (e) { + var pos = getEventPosition(e); + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) { + var _f = function (e) { + var pos = getEventPosition(e), + olde = e; + + for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) { + if (e.targetTouches[i].target == obj) { + e = e.targetTouches[i]; + e.originalEvent = olde; + e.preventDefault = preventTouch; + e.stopPropagation = stopTouch; + break; + } + } + + return fn.call(element, e, pos.x, pos.y); + }; + obj.addEventListener(touchMap[type], _f, false); + } + + return function () { + obj.removeEventListener(type, f, false); + + if (supportsTouch && touchMap[type]) + obj.removeEventListener(touchMap[type], _f, false); + + return true; + }; + }; + } else if (g.doc.attachEvent) { + return function (obj, type, fn, element) { + var f = function (e) { + e = e || g.win.event; + var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + x = e.clientX + scrollX, + y = e.clientY + scrollY; + e.preventDefault = e.preventDefault || preventDefault; + e.stopPropagation = e.stopPropagation || stopPropagation; + return fn.call(element, e, x, y); + }; + obj.attachEvent("on" + type, f); + var detacher = function () { + obj.detachEvent("on" + type, f); + return true; + }; + return detacher; + }; + } + })(), + drag = [], + dragMove = function (e) { + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft, + dragi, + j = drag.length; + while (j--) { + dragi = drag[j]; + if (supportsTouch && e.touches) { + var i = e.touches.length, + touch; + while (i--) { + touch = e.touches[i]; + if (touch.identifier == dragi.el._drag.id) { + x = touch.clientX; + y = touch.clientY; + (e.originalEvent ? e.originalEvent : e).preventDefault(); + break; + } + } + } else { + e.preventDefault(); + } + var node = dragi.el.node, + o, + next = node.nextSibling, + parent = node.parentNode, + display = node.style.display; + g.win.opera && parent.removeChild(node); + node.style.display = "none"; + o = dragi.el.paper.getElementByPoint(x, y); + node.style.display = display; + g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node)); + o && eve("raphael.drag.over." + dragi.el.id, dragi.el, o); + x += scrollX; + y += scrollY; + eve("raphael.drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e); + } + }, + dragUp = function (e) { + R.unmousemove(dragMove).unmouseup(dragUp); + var i = drag.length, + dragi; + while (i--) { + dragi = drag[i]; + dragi.el._drag = {}; + eve("raphael.drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e); + } + drag = []; + }, + /*\ + * Raphael.el + [ property (object) ] + ** + * You can add your own method to elements. This is usefull when you want to hack default functionality or + * want to wrap some common transformation or attributes in one method. In difference to canvas methods, + * you can redefine element method at any time. Expending element methods wouldn’t affect set. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | // then use it + | paper.circle(100, 100, 20).red(); + \*/ + elproto = R.el = {}; + /*\ + * Element.click + [ method ] + ** + * Adds event handler for click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes event handler for click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds event handler for double click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes event handler for double click for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds event handler for mousedown for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes event handler for mousedown for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds event handler for mousemove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes event handler for mousemove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds event handler for mouseout for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes event handler for mouseout for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds event handler for mouseover for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes event handler for mouseover for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds event handler for mouseup for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes event handler for mouseup for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds event handler for touchstart for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes event handler for touchstart for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds event handler for touchmove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes event handler for touchmove for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds event handler for touchend for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes event handler for touchend for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds event handler for touchcancel for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes event handler for touchcancel for the element. + > Parameters + - handler (function) #optional handler for the event + = (object) @Element + \*/ + for (var i = events.length; i--;) { + (function (eventName) { + R[eventName] = elproto[eventName] = function (fn, scope) { + if (R.is(fn, "function")) { + this.events = this.events || []; + this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)}); + } + return this; + }; + R["un" + eventName] = elproto["un" + eventName] = function (fn) { + var events = this.events || [], + l = events.length; + while (l--){ + if (events[l].name == eventName && (R.is(fn, "undefined") || events[l].f == fn)) { + events[l].unbind(); + events.splice(l, 1); + !events.length && delete this.events; + } + } + return this; + }; + })(events[i]); + } + + /*\ + * Element.data + [ method ] + ** + * Adds or retrieves given value asociated with given key. + ** + * See also @Element.removeData + > Parameters + - key (string) key to store data + - value (any) #optional value to store + = (object) @Element + * or, if value is not specified: + = (any) value + * or, if key and value are not specified: + = (object) Key/value pairs for all the data associated with the element. + > Usage + | for (var i = 0, i < 5, i++) { + | paper.circle(10 + 15 * i, 10, 10) + | .attr({fill: "#000"}) + | .data("i", i) + | .click(function () { + | alert(this.data("i")); + | }); + | } + \*/ + elproto.data = function (key, value) { + var data = eldata[this.id] = eldata[this.id] || {}; + if (arguments.length == 0) { + return data; + } + if (arguments.length == 1) { + if (R.is(key, "object")) { + for (var i in key) if (key[has](i)) { + this.data(i, key[i]); + } + return this; + } + eve("raphael.data.get." + this.id, this, data[key], key); + return data[key]; + } + data[key] = value; + eve("raphael.data.set." + this.id, this, value, key); + return this; + }; + /*\ + * Element.removeData + [ method ] + ** + * Removes value associated with an element by given key. + * If key is not provided, removes all the data of the element. + > Parameters + - key (string) #optional key + = (object) @Element + \*/ + elproto.removeData = function (key) { + if (key == null) { + eldata[this.id] = {}; + } else { + eldata[this.id] && delete eldata[this.id][key]; + } + return this; + }; + /*\ + * Element.getData + [ method ] + ** + * Retrieves the element data + = (object) data + \*/ + elproto.getData = function () { + return clone(eldata[this.id] || {}); + }; + /*\ + * Element.hover + [ method ] + ** + * Adds event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + - icontext (object) #optional context for hover in handler + - ocontext (object) #optional context for hover out handler + = (object) @Element + \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { + return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); + }; + /*\ + * Element.unhover + [ method ] + ** + * Removes event handlers for hover for the element. + > Parameters + - f_in (function) handler for hover in + - f_out (function) handler for hover out + = (object) @Element + \*/ + elproto.unhover = function (f_in, f_out) { + return this.unmouseover(f_in).unmouseout(f_out); + }; + var draggable = []; + /*\ + * Element.drag + [ method ] + ** + * Adds event handlers for drag of the element. + > Parameters + - onmove (function) handler for moving + - onstart (function) handler for drag start + - onend (function) handler for drag end + - mcontext (object) #optional context for moving handler + - scontext (object) #optional context for drag start handler + - econtext (object) #optional context for drag end handler + * Additionaly following `drag` events will be triggered: `drag.start.` on start, + * `drag.end.` on end and `drag.move.` on every move. When element will be dragged over another element + * `drag.over.` will be fired as well. + * + * Start event and start handler will be called in specified context or in context of the element with following parameters: + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * Move event and move handler will be called in specified context or in context of the element with following parameters: + o dx (number) shift by x from the start point + o dy (number) shift by y from the start point + o x (number) x position of the mouse + o y (number) y position of the mouse + o event (object) DOM event object + * End event and end handler will be called in specified context or in context of the element with following parameters: + o event (object) DOM event object + = (object) @Element + \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { + function start(e) { + (e.originalEvent || e).preventDefault(); + var x = e.clientX, + y = e.clientY, + scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop, + scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft; + this._drag.id = e.identifier; + if (supportsTouch && e.touches) { + var i = e.touches.length, touch; + while (i--) { + touch = e.touches[i]; + this._drag.id = touch.identifier; + if (touch.identifier == this._drag.id) { + x = touch.clientX; + y = touch.clientY; + break; + } + } + } + this._drag.x = x + scrollX; + this._drag.y = y + scrollY; + !drag.length && R.mousemove(dragMove).mouseup(dragUp); + drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope}); + onstart && eve.on("raphael.drag.start." + this.id, onstart); + onmove && eve.on("raphael.drag.move." + this.id, onmove); + onend && eve.on("raphael.drag.end." + this.id, onend); + eve("raphael.drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e); + } + this._drag = {}; + draggable.push({el: this, start: start}); + this.mousedown(start); + return this; + }; + /*\ + * Element.onDragOver + [ method ] + ** + * Shortcut for assigning event handler for `drag.over.` event, where id is id of the element (see @Element.id). + > Parameters + - f (function) handler for event, first argument would be the element you are dragging over + \*/ + elproto.onDragOver = function (f) { + f ? eve.on("raphael.drag.over." + this.id, f) : eve.unbind("raphael.drag.over." + this.id); + }; + /*\ + * Element.undrag + [ method ] + ** + * Removes all drag event handlers from given element. + \*/ + elproto.undrag = function () { + var i = draggable.length; + while (i--) if (draggable[i].el == this) { + this.unmousedown(draggable[i].start); + draggable.splice(i, 1); + eve.unbind("raphael.drag.*." + this.id); + } + !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp); + drag = []; + }; + /*\ + * Paper.circle + [ method ] + ** + * Draws a circle. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - r (number) radius + = (object) Raphaël element object with type “circle” + ** + > Usage + | var c = paper.circle(50, 50, 40); + \*/ + paperproto.circle = function (x, y, r) { + var out = R._engine.circle(this, x || 0, y || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.rect + [ method ] + * + * Draws a rectangle. + ** + > Parameters + ** + - x (number) x coordinate of the top left corner + - y (number) y coordinate of the top left corner + - width (number) width + - height (number) height + - r (number) #optional radius for rounded corners, default is 0 + = (object) Raphaël element object with type “rect” + ** + > Usage + | // regular rectangle + | var c = paper.rect(10, 10, 50, 50); + | // rectangle with rounded corners + | var c = paper.rect(40, 40, 50, 50, 10); + \*/ + paperproto.rect = function (x, y, w, h, r) { + var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.ellipse + [ method ] + ** + * Draws an ellipse. + ** + > Parameters + ** + - x (number) x coordinate of the centre + - y (number) y coordinate of the centre + - rx (number) horizontal radius + - ry (number) vertical radius + = (object) Raphaël element object with type “ellipse” + ** + > Usage + | var c = paper.ellipse(50, 50, 40, 20); + \*/ + paperproto.ellipse = function (x, y, rx, ry) { + var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.path + [ method ] + ** + * Creates a path element by given path data string. + > Parameters + - pathString (string) #optional path string in SVG format. + * Path string consists of one-letter commands, followed by comma seprarated arguments in numercal form. Example: + | "M10,20L30,40" + * Here we can see two commands: “M”, with arguments `(10, 20)` and “L” with arguments `(30, 40)`. Upper case letter mean command is absolute, lower case—relative. + * + #

      Here is short list of commands available, for more details see SVG path string format.

      + # + # + # + # + # + # + # + # + # + # + # + #
      CommandNameParameters
      Mmoveto(x y)+
      Zclosepath(none)
      Llineto(x y)+
      Hhorizontal linetox+
      Vvertical linetoy+
      Ccurveto(x1 y1 x2 y2 x y)+
      Ssmooth curveto(x2 y2 x y)+
      Qquadratic Bézier curveto(x1 y1 x y)+
      Tsmooth quadratic Bézier curveto(x y)+
      Aelliptical arc(rx ry x-axis-rotation large-arc-flag sweep-flag x y)+
      RCatmull-Rom curveto*x1 y1 (x y)+
      + * * “Catmull-Rom curveto” is a not standard SVG command and added in 2.0 to make life easier. + * Note: there is a special case when path consist of just three commands: “M10,10R…z”. In this case path will smoothly connects to its beginning. + > Usage + | var c = paper.path("M10 10L90 90"); + | // draw a diagonal line: + | // move to 10,10, line to 90,90 + * For example of path strings, check out these icons: http://raphaeljs.com/icons/ + \*/ + paperproto.path = function (pathString) { + pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); + var out = R._engine.path(R.format[apply](R, arguments), this); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.image + [ method ] + ** + * Embeds an image into the surface. + ** + > Parameters + ** + - src (string) URI of the source image + - x (number) x coordinate position + - y (number) y coordinate position + - width (number) width of the image + - height (number) height of the image + = (object) Raphaël element object with type “image” + ** + > Usage + | var c = paper.image("apple.png", 10, 10, 80, 80); + \*/ + paperproto.image = function (src, x, y, w, h) { + var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.text + [ method ] + ** + * Draws a text string. If you need line breaks, put “\n” in the string. + ** + > Parameters + ** + - x (number) x coordinate position + - y (number) y coordinate position + - text (string) The text string to draw + = (object) Raphaël element object with type “text” + ** + > Usage + | var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!"); + \*/ + paperproto.text = function (x, y, text) { + var out = R._engine.text(this, x || 0, y || 0, Str(text)); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Paper.set + [ method ] + ** + * Creates array-like object to keep and operate several elements at once. + * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. + * Sets act as pseudo elements — all methods available to an element can be used on a set. + = (object) array-like object that represents set of elements + ** + > Usage + | var st = paper.set(); + | st.push( + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | ); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.set = function (itemsArray) { + !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); + var out = new Set(itemsArray); + this.__set__ && this.__set__.push(out); + out["paper"] = this; + out["type"] = "set"; + return out; + }; + /*\ + * Paper.setStart + [ method ] + ** + * Creates @Paper.set. All elements that will be created after calling this method and before calling + * @Paper.setFinish will be added to the set. + ** + > Usage + | paper.setStart(); + | paper.circle(10, 10, 5), + | paper.circle(30, 10, 5) + | var st = paper.setFinish(); + | st.attr({fill: "red"}); // changes the fill of both circles + \*/ + paperproto.setStart = function (set) { + this.__set__ = set || this.set(); + }; + /*\ + * Paper.setFinish + [ method ] + ** + * See @Paper.setStart. This method finishes catching and returns resulting set. + ** + = (object) set + \*/ + paperproto.setFinish = function (set) { + var out = this.__set__; + delete this.__set__; + return out; + }; + /*\ + * Paper.getSize + [ method ] + ** + * Obtains current paper actual size. + ** + = (object) + \*/ + paperproto.getSize = function () { + var container = this.canvas.parentNode; + return { + width: container.offsetWidth, + height: container.offsetHeight + }; + }; + /*\ + * Paper.setSize + [ method ] + ** + * If you need to change dimensions of the canvas call this method + ** + > Parameters + ** + - width (number) new width of the canvas + - height (number) new height of the canvas + \*/ + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + /*\ + * Paper.setViewBox + [ method ] + ** + * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by + * specifying new boundaries. + ** + > Parameters + ** + - x (number) new x position, default is `0` + - y (number) new y position, default is `0` + - w (number) new width of the canvas + - h (number) new height of the canvas + - fit (boolean) `true` if you want graphics to fit into new boundary box + \*/ + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + /*\ + * Paper.top + [ property ] + ** + * Points to the topmost element on the paper + \*/ + /*\ + * Paper.bottom + [ property ] + ** + * Points to the bottom element on the paper + \*/ + paperproto.top = paperproto.bottom = null; + /*\ + * Paper.raphael + [ property ] + ** + * Points to the @Raphael object/function + \*/ + paperproto.raphael = R; + var getOffset = function (elem) { + var box = elem.getBoundingClientRect(), + doc = elem.ownerDocument, + body = doc.body, + docElem = doc.documentElement, + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, + top = box.top + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop, + left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft; + return { + y: top, + x: left + }; + }; + /*\ + * Paper.getElementByPoint + [ method ] + ** + * Returns you topmost element under given point. + ** + = (object) Raphaël element object + > Parameters + ** + - x (number) x coordinate from the top left corner of the window + - y (number) y coordinate from the top left corner of the window + > Usage + | paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); + \*/ + paperproto.getElementByPoint = function (x, y) { + var paper = this, + svg = paper.canvas, + target = g.doc.elementFromPoint(x, y); + if (g.win.opera && target.tagName == "svg") { + var so = getOffset(svg), + sr = svg.createSVGRect(); + sr.x = x - so.x; + sr.y = y - so.y; + sr.width = sr.height = 1; + var hits = svg.getIntersectionList(sr, null); + if (hits.length) { + target = hits[hits.length - 1]; + } + } + if (!target) { + return null; + } + while (target.parentNode && target != svg.parentNode && !target.raphael) { + target = target.parentNode; + } + target == paper.canvas.parentNode && (target = svg); + target = target && target.raphael ? paper.getById(target.raphaelid) : null; + return target; + }; + + /*\ + * Paper.getElementsByBBox + [ method ] + ** + * Returns set of elements that have an intersecting bounding box + ** + > Parameters + ** + - bbox (object) bbox to check with + = (object) @Set + \*/ + paperproto.getElementsByBBox = function (bbox) { + var set = this.set(); + this.forEach(function (el) { + if (R.isBBoxIntersect(el.getBBox(), bbox)) { + set.push(el); + } + }); + return set; + }; + + /*\ + * Paper.getById + [ method ] + ** + * Returns you element by its internal ID. + ** + > Parameters + ** + - id (number) id + = (object) Raphaël element object + \*/ + paperproto.getById = function (id) { + var bot = this.bottom; + while (bot) { + if (bot.id == id) { + return bot; + } + bot = bot.next; + } + return null; + }; + /*\ + * Paper.forEach + [ method ] + ** + * Executes given function for each element on the paper + * + * If callback function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Paper object + > Usage + | paper.forEach(function (el) { + | el.attr({ stroke: "blue" }); + | }); + \*/ + paperproto.forEach = function (callback, thisArg) { + var bot = this.bottom; + while (bot) { + if (callback.call(thisArg, bot) === false) { + return this; + } + bot = bot.next; + } + return this; + }; + /*\ + * Paper.getElementsByPoint + [ method ] + ** + * Returns set of elements that have common point inside + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (object) @Set + \*/ + paperproto.getElementsByPoint = function (x, y) { + var set = this.set(); + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + set.push(el); + } + }); + return set; + }; + function x_y() { + return this.x + S + this.y; + } + function x_y_w_h() { + return this.x + S + this.y + S + this.width + " \xd7 " + this.height; + } + /*\ + * Element.isPointInside + [ method ] + ** + * Determine if given point is inside this element’s shape + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point inside the shape + \*/ + elproto.isPointInside = function (x, y) { + var rp = this.realPath = getPath[this.type](this); + if (this.attr('transform') && this.attr('transform').length) { + rp = R.transformPath(rp, this.attr('transform')); + } + return R.isPointInsidePath(rp, x, y); + }; + /*\ + * Element.getBBox + [ method ] + ** + * Return bounding box for a given element + ** + > Parameters + ** + - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`. + = (object) Bounding box object: + o { + o x: (number) top left corner x + o y: (number) top left corner y + o x2: (number) bottom right corner x + o y2: (number) bottom right corner y + o width: (number) width + o height: (number) height + o } + \*/ + elproto.getBBox = function (isWithoutTransform) { + if (this.removed) { + return {}; + } + var _ = this._; + if (isWithoutTransform) { + if (_.dirty || !_.bboxwt) { + this.realPath = getPath[this.type](this); + _.bboxwt = pathDimensions(this.realPath); + _.bboxwt.toString = x_y_w_h; + _.dirty = 0; + } + return _.bboxwt; + } + if (_.dirty || _.dirtyT || !_.bbox) { + if (_.dirty || !this.realPath) { + _.bboxwt = 0; + this.realPath = getPath[this.type](this); + } + _.bbox = pathDimensions(mapPath(this.realPath, this.matrix)); + _.bbox.toString = x_y_w_h; + _.dirty = _.dirtyT = 0; + } + return _.bbox; + }; + /*\ + * Element.clone + [ method ] + ** + = (object) clone of a given element + ** + \*/ + elproto.clone = function () { + if (this.removed) { + return null; + } + var out = this.paper[this.type]().attr(this.attr()); + this.__set__ && this.__set__.push(out); + return out; + }; + /*\ + * Element.glow + [ method ] + ** + * Return set of elements that create glow-like effect around given element. See @Paper.set. + * + * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. + ** + > Parameters + ** + - glow (object) #optional parameters object with all properties optional: + o { + o width (number) size of the glow, default is `10` + o fill (boolean) will it be filled, default is `false` + o opacity (number) opacity, default is `0.5` + o offsetx (number) horizontal offset, default is `0` + o offsety (number) vertical offset, default is `0` + o color (string) glow colour, default is `black` + o } + = (object) @Paper.set of elements that represents glow + \*/ + elproto.glow = function (glow) { + if (this.type == "text") { + return null; + } + glow = glow || {}; + var s = { + width: (glow.width || 10) + (+this.attr("stroke-width") || 1), + fill: glow.fill || false, + opacity: glow.opacity || .5, + offsetx: glow.offsetx || 0, + offsety: glow.offsety || 0, + color: glow.color || "#000" + }, + c = s.width / 2, + r = this.paper, + out = r.set(), + path = this.realPath || getPath[this.type](this); + path = this.matrix ? mapPath(path, this.matrix) : path; + for (var i = 1; i < c + 1; i++) { + out.push(r.path(path).attr({ + stroke: s.color, + fill: s.fill ? s.color : "none", + "stroke-linejoin": "round", + "stroke-linecap": "round", + "stroke-width": +(s.width / c * i).toFixed(3), + opacity: +(s.opacity / c).toFixed(3) + })); + } + return out.insertBefore(this).translate(s.offsetx, s.offsety); + }; + var curveslengths = {}, + getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) { + if (length == null) { + return bezlen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y); + } else { + return R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, getTatLen(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length)); + } + }, + getLengthFactory = function (istotal, subpath) { + return function (path, length, onlystart) { + path = path2curve(path); + var x, y, p, l, sp = "", subpaths = {}, point, + len = 0; + for (var i = 0, ii = path.length; i < ii; i++) { + p = path[i]; + if (p[0] == "M") { + x = +p[1]; + y = +p[2]; + } else { + l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]); + if (len + l > length) { + if (subpath && !subpaths.start) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y]; + if (onlystart) {return sp;} + subpaths.start = sp; + sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join(); + len += l; + x = +p[5]; + y = +p[6]; + continue; + } + if (!istotal && !subpath) { + point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len); + return {x: point.x, y: point.y, alpha: point.alpha}; + } + } + len += l; + x = +p[5]; + y = +p[6]; + } + sp += p.shift() + p; + } + subpaths.end = sp; + point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1); + point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha}); + return point; + }; + }; + var getTotalLength = getLengthFactory(1), + getPointAtLength = getLengthFactory(), + getSubpathsAtLength = getLengthFactory(0, 1); + /*\ + * Raphael.getTotalLength + [ method ] + ** + * Returns length of the given path in pixels. + ** + > Parameters + ** + - path (string) SVG path string. + ** + = (number) length. + \*/ + R.getTotalLength = getTotalLength; + /*\ + * Raphael.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. + ** + > Parameters + ** + - path (string) SVG path string + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + R.getPointAtLength = getPointAtLength; + /*\ + * Raphael.getSubpath + [ method ] + ** + * Return subpath of a given path from given length to given length. + ** + > Parameters + ** + - path (string) SVG path string + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + R.getSubpath = function (path, from, to) { + if (this.getTotalLength(path) - to < 1e-6) { + return getSubpathsAtLength(path, from).end; + } + var a = getSubpathsAtLength(path, to, 1); + return from ? getSubpathsAtLength(a, from).end : a; + }; + /*\ + * Element.getTotalLength + [ method ] + ** + * Returns length of the path in pixels. Only works for element of “path” type. + = (number) length. + \*/ + elproto.getTotalLength = function () { + var path = this.getPath(); + if (!path) { + return; + } + + if (this.node.getTotalLength) { + return this.node.getTotalLength(); + } + + return getTotalLength(path); + }; + /*\ + * Element.getPointAtLength + [ method ] + ** + * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type. + ** + > Parameters + ** + - length (number) + ** + = (object) representation of the point: + o { + o x: (number) x coordinate + o y: (number) y coordinate + o alpha: (number) angle of derivative + o } + \*/ + elproto.getPointAtLength = function (length) { + var path = this.getPath(); + if (!path) { + return; + } + + return getPointAtLength(path, length); + }; + /*\ + * Element.getPath + [ method ] + ** + * Returns path of the element. Only works for elements of “path” type and simple elements like circle. + = (object) path + ** + \*/ + elproto.getPath = function () { + var path, + getPath = R._getPath[this.type]; + + if (this.type == "text" || this.type == "set") { + return; + } + + if (getPath) { + path = getPath(this); + } + + return path; + }; + /*\ + * Element.getSubpath + [ method ] + ** + * Return subpath of a given element from given length to given length. Only works for element of “path” type. + ** + > Parameters + ** + - from (number) position of the start of the segment + - to (number) position of the end of the segment + ** + = (string) pathstring for the segment + \*/ + elproto.getSubpath = function (from, to) { + var path = this.getPath(); + if (!path) { + return; + } + + return R.getSubpath(path, from, to); + }; + /*\ + * Raphael.easing_formulas + [ property ] + ** + * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing: + #
        + #
      • “linear”
      • + #
      • “<” or “easeIn” or “ease-in”
      • + #
      • “>” or “easeOut” or “ease-out”
      • + #
      • “<>” or “easeInOut” or “ease-in-out”
      • + #
      • “backIn” or “back-in”
      • + #
      • “backOut” or “back-out”
      • + #
      • “elastic”
      • + #
      • “bounce”
      • + #
      + #

      See also Easing demo.

      + \*/ + var ef = R.easing_formulas = { + linear: function (n) { + return n; + }, + "<": function (n) { + return pow(n, 1.7); + }, + ">": function (n) { + return pow(n, .48); + }, + "<>": function (n) { + var q = .48 - n / 1.04, + Q = math.sqrt(.1734 + q * q), + x = Q - q, + X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1), + y = -Q - q, + Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1), + t = X + Y + .5; + return (1 - t) * 3 * t * t + t * t * t; + }, + backIn: function (n) { + var s = 1.70158; + return n * n * ((s + 1) * n - s); + }, + backOut: function (n) { + n = n - 1; + var s = 1.70158; + return n * n * ((s + 1) * n + s) + 1; + }, + elastic: function (n) { + if (n == !!n) { + return n; + } + return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1; + }, + bounce: function (n) { + var s = 7.5625, + p = 2.75, + l; + if (n < (1 / p)) { + l = s * n * n; + } else { + if (n < (2 / p)) { + n -= (1.5 / p); + l = s * n * n + .75; + } else { + if (n < (2.5 / p)) { + n -= (2.25 / p); + l = s * n * n + .9375; + } else { + n -= (2.625 / p); + l = s * n * n + .984375; + } + } + } + return l; + } + }; + ef.easeIn = ef["ease-in"] = ef["<"]; + ef.easeOut = ef["ease-out"] = ef[">"]; + ef.easeInOut = ef["ease-in-out"] = ef["<>"]; + ef["back-in"] = ef.backIn; + ef["back-out"] = ef.backOut; + + var animationElements = [], + requestAnimFrame = window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + setTimeout(callback, 16); + }, + animation = function () { + var Now = +new Date, + l = 0; + for (; l < animationElements.length; l++) { + var e = animationElements[l]; + if (e.el.removed || e.paused) { + continue; + } + var time = Now - e.start, + ms = e.ms, + easing = e.easing, + from = e.from, + diff = e.diff, + to = e.to, + t = e.t, + that = e.el, + set = {}, + now, + init = {}, + key; + if (e.initstatus) { + time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms; + e.status = e.initstatus; + delete e.initstatus; + e.stop && animationElements.splice(l--, 1); + } else { + e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top; + } + if (time < 0) { + continue; + } + if (time < ms) { + var pos = easing(time / ms); + for (var attr in from) if (from[has](attr)) { + switch (availableAnimAttrs[attr]) { + case nu: + now = +from[attr] + pos * ms * diff[attr]; + break; + case "colour": + now = "rgb(" + [ + upto255(round(from[attr].r + pos * ms * diff[attr].r)), + upto255(round(from[attr].g + pos * ms * diff[attr].g)), + upto255(round(from[attr].b + pos * ms * diff[attr].b)) + ].join(",") + ")"; + break; + case "path": + now = []; + for (var i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + now[i] = now[i].join(S); + } + now = now.join(S); + break; + case "transform": + if (diff[attr].real) { + now = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + now[i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j]; + } + } + } else { + var get = function (i) { + return +from[attr][i] + pos * ms * diff[attr][i]; + }; + // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]]; + now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]]; + } + break; + case "csv": + if (attr == "clip-rect") { + now = []; + i = 4; + while (i--) { + now[i] = +from[attr][i] + pos * ms * diff[attr][i]; + } + } + break; + default: + var from2 = [][concat](from[attr]); + now = []; + i = that.paper.customAttributes[attr].length; + while (i--) { + now[i] = +from2[i] + pos * ms * diff[attr][i]; + } + break; + } + set[attr] = now; + } + that.attr(set); + (function (id, that, anim) { + setTimeout(function () { + eve("raphael.anim.frame." + id, that, anim); + }); + })(that.id, that, e.anim); + } else { + (function(f, el, a) { + setTimeout(function() { + eve("raphael.anim.frame." + el.id, el, a); + eve("raphael.anim.finish." + el.id, el, a); + R.is(f, "function") && f.call(el); + }); + })(e.callback, that, e.anim); + that.attr(to); + animationElements.splice(l--, 1); + if (e.repeat > 1 && !e.next) { + for (key in to) if (to[has](key)) { + init[key] = e.totalOrigin[key]; + } + e.el.attr(init); + runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1); + } + if (e.next && !e.stop) { + runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat); + } + } + } + R.svg && that && that.paper && that.paper.safari(); + animationElements.length && requestAnimFrame(animation); + }, + upto255 = function (color) { + return color > 255 ? 255 : color < 0 ? 0 : color; + }; + /*\ + * Element.animateWith + [ method ] + ** + * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element. + ** + > Parameters + ** + - el (object) element to sync with + - anim (object) animation to sync with + - params (object) #optional final attributes for the element, see also @Element.attr + - ms (number) #optional number of milliseconds for animation to run + - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - element (object) element to sync with + - anim (object) animation to sync with + - animation (object) #optional animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animateWith = function (el, anim, params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback), + x, y; + runAnimation(a, element, a.percents[0], null, element.attr()); + for (var i = 0, ii = animationElements.length; i < ii; i++) { + if (animationElements[i].anim == anim && animationElements[i].el == el) { + animationElements[ii - 1].start = animationElements[i].start; + break; + } + } + return element; + // + // + // var a = params ? R.animation(params, ms, easing, callback) : anim, + // status = element.status(anim); + // return this.animate(a).status(a, status * anim.ms / a.ms); + }; + function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) { + var cx = 3 * p1x, + bx = 3 * (p2x - p1x) - cx, + ax = 1 - cx - bx, + cy = 3 * p1y, + by = 3 * (p2y - p1y) - cy, + ay = 1 - cy - by; + function sampleCurveX(t) { + return ((ax * t + bx) * t + cx) * t; + } + function solve(x, epsilon) { + var t = solveCurveX(x, epsilon); + return ((ay * t + by) * t + cy) * t; + } + function solveCurveX(x, epsilon) { + var t0, t1, t2, x2, d2, i; + for(t2 = x, i = 0; i < 8; i++) { + x2 = sampleCurveX(t2) - x; + if (abs(x2) < epsilon) { + return t2; + } + d2 = (3 * ax * t2 + 2 * bx) * t2 + cx; + if (abs(d2) < 1e-6) { + break; + } + t2 = t2 - x2 / d2; + } + t0 = 0; + t1 = 1; + t2 = x; + if (t2 < t0) { + return t0; + } + if (t2 > t1) { + return t1; + } + while (t0 < t1) { + x2 = sampleCurveX(t2); + if (abs(x2 - x) < epsilon) { + return t2; + } + if (x > x2) { + t0 = t2; + } else { + t1 = t2; + } + t2 = (t1 - t0) / 2 + t0; + } + return t2; + } + return solve(t, 1 / (200 * duration)); + } + elproto.onAnimation = function (f) { + f ? eve.on("raphael.anim.frame." + this.id, f) : eve.unbind("raphael.anim.frame." + this.id); + return this; + }; + function Animation(anim, ms) { + var percents = [], + newAnim = {}; + this.ms = ms; + this.times = 1; + if (anim) { + for (var attr in anim) if (anim[has](attr)) { + newAnim[toFloat(attr)] = anim[attr]; + percents.push(toFloat(attr)); + } + percents.sort(sortByNumber); + } + this.anim = newAnim; + this.top = percents[percents.length - 1]; + this.percents = percents; + } + /*\ + * Animation.delay + [ method ] + ** + * Creates a copy of existing animation object with given delay. + ** + > Parameters + ** + - delay (number) number of ms to pass between animation start and actual animation + ** + = (object) new altered Animation object + | var anim = Raphael.animation({cx: 10, cy: 20}, 2e3); + | circle1.animate(anim); // run the given animation immediately + | circle2.animate(anim.delay(500)); // run the given animation after 500 ms + \*/ + Animation.prototype.delay = function (delay) { + var a = new Animation(this.anim, this.ms); + a.times = this.times; + a.del = +delay || 0; + return a; + }; + /*\ + * Animation.repeat + [ method ] + ** + * Creates a copy of existing animation object with given repetition. + ** + > Parameters + ** + - repeat (number) number iterations of animation. For infinite animation pass `Infinity` + ** + = (object) new altered Animation object + \*/ + Animation.prototype.repeat = function (times) { + var a = new Animation(this.anim, this.ms); + a.del = this.del; + a.times = math.floor(mmax(times, 0)) || 1; + return a; + }; + function runAnimation(anim, element, percent, status, totalOrigin, times) { + percent = toFloat(percent); + var params, + isInAnim, + isInAnimSet, + percents = [], + next, + prev, + timestamp, + ms = anim.ms, + from = {}, + to = {}, + diff = {}; + if (status) { + for (i = 0, ii = animationElements.length; i < ii; i++) { + var e = animationElements[i]; + if (e.el.id == element.id && e.anim == anim) { + if (e.percent != percent) { + animationElements.splice(i, 1); + isInAnimSet = 1; + } else { + isInAnim = e; + } + element.attr(e.totalOrigin); + break; + } + } + } else { + status = +to; // NaN + } + for (var i = 0, ii = anim.percents.length; i < ii; i++) { + if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) { + percent = anim.percents[i]; + prev = anim.percents[i - 1] || 0; + ms = ms / anim.top * (percent - prev); + next = anim.percents[i + 1]; + params = anim.anim[percent]; + break; + } else if (status) { + element.attr(anim.anim[anim.percents[i]]); + } + } + if (!params) { + return; + } + if (!isInAnim) { + for (var attr in params) if (params[has](attr)) { + if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) { + from[attr] = element.attr(attr); + (from[attr] == null) && (from[attr] = availableAttrs[attr]); + to[attr] = params[attr]; + switch (availableAnimAttrs[attr]) { + case nu: + diff[attr] = (to[attr] - from[attr]) / ms; + break; + case "colour": + from[attr] = R.getRGB(from[attr]); + var toColour = R.getRGB(to[attr]); + diff[attr] = { + r: (toColour.r - from[attr].r) / ms, + g: (toColour.g - from[attr].g) / ms, + b: (toColour.b - from[attr].b) / ms + }; + break; + case "path": + var pathes = path2curve(from[attr], to[attr]), + toPath = pathes[1]; + from[attr] = pathes[0]; + diff[attr] = []; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [0]; + for (var j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms; + } + } + break; + case "transform": + var _ = element._, + eq = equaliseTransform(_[attr], to[attr]); + if (eq) { + from[attr] = eq.from; + to[attr] = eq.to; + diff[attr] = []; + diff[attr].real = true; + for (i = 0, ii = from[attr].length; i < ii; i++) { + diff[attr][i] = [from[attr][i][0]]; + for (j = 1, jj = from[attr][i].length; j < jj; j++) { + diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms; + } + } + } else { + var m = (element.matrix || new Matrix), + to2 = { + _: {transform: _.transform}, + getBBox: function () { + return element.getBBox(1); + } + }; + from[attr] = [ + m.a, + m.b, + m.c, + m.d, + m.e, + m.f + ]; + extractTransform(to2, to[attr]); + to[attr] = to2._.transform; + diff[attr] = [ + (to2.matrix.a - m.a) / ms, + (to2.matrix.b - m.b) / ms, + (to2.matrix.c - m.c) / ms, + (to2.matrix.d - m.d) / ms, + (to2.matrix.e - m.e) / ms, + (to2.matrix.f - m.f) / ms + ]; + // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy]; + // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }}; + // extractTransform(to2, to[attr]); + // diff[attr] = [ + // (to2._.sx - _.sx) / ms, + // (to2._.sy - _.sy) / ms, + // (to2._.deg - _.deg) / ms, + // (to2._.dx - _.dx) / ms, + // (to2._.dy - _.dy) / ms + // ]; + } + break; + case "csv": + var values = Str(params[attr])[split](separator), + from2 = Str(from[attr])[split](separator); + if (attr == "clip-rect") { + from[attr] = from2; + diff[attr] = []; + i = from2.length; + while (i--) { + diff[attr][i] = (values[i] - from[attr][i]) / ms; + } + } + to[attr] = values; + break; + default: + values = [][concat](params[attr]); + from2 = [][concat](from[attr]); + diff[attr] = []; + i = element.paper.customAttributes[attr].length; + while (i--) { + diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms; + } + break; + } + } + } + var easing = params.easing, + easyeasy = R.easing_formulas[easing]; + if (!easyeasy) { + easyeasy = Str(easing).match(bezierrg); + if (easyeasy && easyeasy.length == 5) { + var curve = easyeasy; + easyeasy = function (t) { + return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms); + }; + } else { + easyeasy = pipe; + } + } + timestamp = params.start || anim.start || +new Date; + e = { + anim: anim, + percent: percent, + timestamp: timestamp, + start: timestamp + (anim.del || 0), + status: 0, + initstatus: status || 0, + stop: false, + ms: ms, + easing: easyeasy, + from: from, + diff: diff, + to: to, + el: element, + callback: params.callback, + prev: prev, + next: next, + repeat: times || anim.times, + origin: element.attr(), + totalOrigin: totalOrigin + }; + animationElements.push(e); + if (status && !isInAnim && !isInAnimSet) { + e.stop = true; + e.start = new Date - ms * status; + if (animationElements.length == 1) { + return animation(); + } + } + if (isInAnimSet) { + e.start = new Date - e.ms * status; + } + animationElements.length == 1 && requestAnimFrame(animation); + } else { + isInAnim.initstatus = status; + isInAnim.start = new Date - isInAnim.ms * status; + } + eve("raphael.anim.start." + element.id, element, anim); + } + /*\ + * Raphael.animation + [ method ] + ** + * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods. + * See also @Animation.delay and @Animation.repeat methods. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + ** + = (object) @Animation + \*/ + R.animation = function (params, ms, easing, callback) { + if (params instanceof Animation) { + return params; + } + if (R.is(easing, "function") || !easing) { + callback = callback || easing || null; + easing = null; + } + params = Object(params); + ms = +ms || 0; + var p = {}, + json, + attr; + for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) { + json = true; + p[attr] = params[attr]; + } + if (!json) { + // if percent-like syntax is used and end-of-all animation callback used + if(callback){ + // find the last one + var lastKey = 0; + for(var i in params){ + var percent = toInt(i); + if(params[has](i) && percent > lastKey){ + lastKey = percent; + } + } + lastKey += '%'; + // if already defined callback in the last keyframe, skip + !params[lastKey].callback && (params[lastKey].callback = callback); + } + return new Animation(params, ms); + } else { + easing && (p.easing = easing); + callback && (p.callback = callback); + return new Animation({100: p}, ms); + } + }; + /*\ + * Element.animate + [ method ] + ** + * Creates and starts animation for given element. + ** + > Parameters + ** + - params (object) final attributes for the element, see also @Element.attr + - ms (number) number of milliseconds for animation to run + - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` + - callback (function) #optional callback function. Will be called at the end of animation. + * or + - animation (object) animation object, see @Raphael.animation + ** + = (object) original element + \*/ + elproto.animate = function (params, ms, easing, callback) { + var element = this; + if (element.removed) { + callback && callback.call(element); + return element; + } + var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback); + runAnimation(anim, element, anim.percents[0], null, element.attr()); + return element; + }; + /*\ + * Element.setTime + [ method ] + ** + * Sets the status of animation of the element in milliseconds. Similar to @Element.status method. + ** + > Parameters + ** + - anim (object) animation object + - value (number) number of milliseconds from the beginning of the animation + ** + = (object) original element if `value` is specified + * Note, that during animation following events are triggered: + * + * On each animation frame event `anim.frame.`, on start `anim.start.` and on end `anim.finish.`. + \*/ + elproto.setTime = function (anim, value) { + if (anim && value != null) { + this.status(anim, mmin(value, anim.ms) / anim.ms); + } + return this; + }; + /*\ + * Element.status + [ method ] + ** + * Gets or sets the status of animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position. + ** + = (number) status + * or + = (array) status if `anim` is not specified. Array of objects in format: + o { + o anim: (object) animation object + o status: (number) status + o } + * or + = (object) original element if `value` is specified + \*/ + elproto.status = function (anim, value) { + var out = [], + i = 0, + len, + e; + if (value != null) { + runAnimation(anim, this, -1, mmin(value, 1)); + return this; + } else { + len = animationElements.length; + for (; i < len; i++) { + e = animationElements[i]; + if (e.el.id == this.id && (!anim || e.anim == anim)) { + if (anim) { + return e.status; + } + out.push({ + anim: e.anim, + status: e.status + }); + } + } + if (anim) { + return 0; + } + return out; + } + }; + /*\ + * Element.pause + [ method ] + ** + * Stops animation of the element with ability to resume it later on. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.pause = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.pause." + this.id, this, animationElements[i].anim) !== false) { + animationElements[i].paused = true; + } + } + return this; + }; + /*\ + * Element.resume + [ method ] + ** + * Resumes animation if it was paused with @Element.pause method. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.resume = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + var e = animationElements[i]; + if (eve("raphael.anim.resume." + this.id, this, e.anim) !== false) { + delete e.paused; + this.status(e.anim, e.status); + } + } + return this; + }; + /*\ + * Element.stop + [ method ] + ** + * Stops animation of the element. + ** + > Parameters + ** + - anim (object) #optional animation object + ** + = (object) original element + \*/ + elproto.stop = function (anim) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { + if (eve("raphael.anim.stop." + this.id, this, animationElements[i].anim) !== false) { + animationElements.splice(i--, 1); + } + } + return this; + }; + function stopAnimation(paper) { + for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.paper == paper) { + animationElements.splice(i--, 1); + } + } + eve.on("raphael.remove", stopAnimation); + eve.on("raphael.clear", stopAnimation); + elproto.toString = function () { + return "Rapha\xebl\u2019s object"; + }; + + // Set + var Set = function (items) { + this.items = []; + this.length = 0; + this.type = "set"; + if (items) { + for (var i = 0, ii = items.length; i < ii; i++) { + if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) { + this[this.items.length] = this.items[this.items.length] = items[i]; + this.length++; + } + } + } + }, + setproto = Set.prototype; + /*\ + * Set.push + [ method ] + ** + * Adds each argument to the current set. + = (object) original element + \*/ + setproto.push = function () { + var item, + len; + for (var i = 0, ii = arguments.length; i < ii; i++) { + item = arguments[i]; + if (item && (item.constructor == elproto.constructor || item.constructor == Set)) { + len = this.items.length; + this[len] = this.items[len] = item; + this.length++; + } + } + return this; + }; + /*\ + * Set.pop + [ method ] + ** + * Removes last element and returns it. + = (object) element + \*/ + setproto.pop = function () { + this.length && delete this[this.length--]; + return this.items.pop(); + }; + /*\ + * Set.forEach + [ method ] + ** + * Executes given function for each element in the set. + * + * If function returns `false` it will stop loop running. + ** + > Parameters + ** + - callback (function) function to run + - thisArg (object) context object for the callback + = (object) Set object + \*/ + setproto.forEach = function (callback, thisArg) { + for (var i = 0, ii = this.items.length; i < ii; i++) { + if (callback.call(thisArg, this.items[i], i) === false) { + return this; + } + } + return this; + }; + for (var method in elproto) if (elproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname][apply](el, arg); + }); + }; + })(method); + } + setproto.attr = function (name, value) { + if (name && R.is(name, array) && R.is(name[0], "object")) { + for (var j = 0, jj = name.length; j < jj; j++) { + this.items[j].attr(name[j]); + } + } else { + for (var i = 0, ii = this.items.length; i < ii; i++) { + this.items[i].attr(name, value); + } + } + return this; + }; + /*\ + * Set.clear + [ method ] + ** + * Removes all elements from the set + \*/ + setproto.clear = function () { + while (this.length) { + this.pop(); + } + }; + /*\ + * Set.splice + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - index (number) position of the deletion + - count (number) number of element to remove + - insertion… (object) #optional elements to insert + = (object) set elements that were deleted + \*/ + setproto.splice = function (index, count, insertion) { + index = index < 0 ? mmax(this.length + index, 0) : index; + count = mmax(0, mmin(this.length - index, count)); + var tail = [], + todel = [], + args = [], + i; + for (i = 2; i < arguments.length; i++) { + args.push(arguments[i]); + } + for (i = 0; i < count; i++) { + todel.push(this[index + i]); + } + for (; i < this.length - index; i++) { + tail.push(this[index + i]); + } + var arglen = args.length; + for (i = 0; i < arglen + tail.length; i++) { + this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen]; + } + i = this.items.length = this.length -= count - arglen; + while (this[i]) { + delete this[i++]; + } + return new Set(todel); + }; + /*\ + * Set.exclude + [ method ] + ** + * Removes given element from the set + ** + > Parameters + ** + - element (object) element to remove + = (boolean) `true` if object was found & removed from the set + \*/ + setproto.exclude = function (el) { + for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) { + this.splice(i, 1); + return true; + } + }; + setproto.animate = function (params, ms, easing, callback) { + (R.is(easing, "function") || !easing) && (callback = easing || null); + var len = this.items.length, + i = len, + item, + set = this, + collector; + if (!len) { + return this; + } + callback && (collector = function () { + !--len && callback.call(set); + }); + easing = R.is(easing, string) ? easing : collector; + var anim = R.animation(params, ms, easing, collector); + item = this.items[--i].animate(anim); + while (i--) { + this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim); + (this.items[i] && !this.items[i].removed) || len--; + } + return this; + }; + setproto.insertAfter = function (el) { + var i = this.items.length; + while (i--) { + this.items[i].insertAfter(el); + } + return this; + }; + setproto.getBBox = function () { + var x = [], + y = [], + x2 = [], + y2 = []; + for (var i = this.items.length; i--;) if (!this.items[i].removed) { + var box = this.items[i].getBBox(); + x.push(box.x); + y.push(box.y); + x2.push(box.x + box.width); + y2.push(box.y + box.height); + } + x = mmin[apply](0, x); + y = mmin[apply](0, y); + x2 = mmax[apply](0, x2); + y2 = mmax[apply](0, y2); + return { + x: x, + y: y, + x2: x2, + y2: y2, + width: x2 - x, + height: y2 - y + }; + }; + setproto.clone = function (s) { + s = this.paper.set(); + for (var i = 0, ii = this.items.length; i < ii; i++) { + s.push(this.items[i].clone()); + } + return s; + }; + setproto.toString = function () { + return "Rapha\xebl\u2018s set"; + }; + + setproto.glow = function(glowConfig) { + var ret = this.paper.set(); + this.forEach(function(shape, index){ + var g = shape.glow(glowConfig); + if(g != null){ + g.forEach(function(shape2, index2){ + ret.push(shape2); + }); + } + }); + return ret; + }; + + + /*\ + * Set.isPointInside + [ method ] + ** + * Determine if given point is inside this set’s elements + ** + > Parameters + ** + - x (number) x coordinate of the point + - y (number) y coordinate of the point + = (boolean) `true` if point is inside any of the set's elements + \*/ + setproto.isPointInside = function (x, y) { + var isPointInside = false; + this.forEach(function (el) { + if (el.isPointInside(x, y)) { + isPointInside = true; + return false; // stop loop + } + }); + return isPointInside; + }; + + /*\ + * Raphael.registerFont + [ method ] + ** + * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. + * Returns original parameter, so it could be used with chaining. + # More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file. + ** + > Parameters + ** + - font (object) the font to register + = (object) the font you passed in + > Usage + | Cufon.registerFont(Raphael.registerFont({…})); + \*/ + R.registerFont = function (font) { + if (!font.face) { + return font; + } + this.fonts = this.fonts || {}; + var fontcopy = { + w: font.w, + face: {}, + glyphs: {} + }, + family = font.face["font-family"]; + for (var prop in font.face) if (font.face[has](prop)) { + fontcopy.face[prop] = font.face[prop]; + } + if (this.fonts[family]) { + this.fonts[family].push(fontcopy); + } else { + this.fonts[family] = [fontcopy]; + } + if (!font.svg) { + fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10); + for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) { + var path = font.glyphs[glyph]; + fontcopy.glyphs[glyph] = { + w: path.w, + k: {}, + d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) { + return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M"; + }) + "z" + }; + if (path.k) { + for (var k in path.k) if (path[has](k)) { + fontcopy.glyphs[glyph].k[k] = path.k[k]; + } + } + } + } + return font; + }; + /*\ + * Paper.getFont + [ method ] + ** + * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”. + ** + > Parameters + ** + - family (string) font family name or any word from it + - weight (string) #optional font weight + - style (string) #optional font style + - stretch (string) #optional font stretch + = (object) the font object + > Usage + | paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30); + \*/ + paperproto.getFont = function (family, weight, style, stretch) { + stretch = stretch || "normal"; + style = style || "normal"; + weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400; + if (!R.fonts) { + return; + } + var font = R.fonts[family]; + if (!font) { + var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i"); + for (var fontName in R.fonts) if (R.fonts[has](fontName)) { + if (name.test(fontName)) { + font = R.fonts[fontName]; + break; + } + } + } + var thefont; + if (font) { + for (var i = 0, ii = font.length; i < ii; i++) { + thefont = font[i]; + if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) { + break; + } + } + } + return thefont; + }; + /*\ + * Paper.print + [ method ] + ** + * Creates path that represent given text written using given font at given position with given size. + * Result of the method is path element that contains whole text as a separate path. + ** + > Parameters + ** + - x (number) x position of the text + - y (number) y position of the text + - string (string) text to print + - font (object) font object, see @Paper.getFont + - size (number) #optional size of the font, default is `16` + - origin (string) #optional could be `"baseline"` or `"middle"`, default is `"middle"` + - letter_spacing (number) #optional number in range `-1..1`, default is `0` + - line_spacing (number) #optional number in range `1..3`, default is `1` + = (object) resulting path element, which consist of all letters + > Usage + | var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"}); + \*/ + paperproto.print = function (x, y, string, font, size, origin, letter_spacing, line_spacing) { + origin = origin || "middle"; // baseline|middle + letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); + line_spacing = mmax(mmin(line_spacing || 1, 3), 1); + var letters = Str(string)[split](E), + shift = 0, + notfirst = 0, + path = E, + scale; + R.is(font, "string") && (font = this.getFont(font)); + if (font) { + scale = (size || 16) / font.face["units-per-em"]; + var bb = font.face.bbox[split](separator), + top = +bb[0], + lineHeight = bb[3] - bb[1], + shifty = 0, + height = +bb[1] + (origin == "baseline" ? lineHeight + (+font.face.descent) : lineHeight / 2); + for (var i = 0, ii = letters.length; i < ii; i++) { + if (letters[i] == "\n") { + shift = 0; + curr = 0; + notfirst = 0; + shifty += lineHeight * line_spacing; + } else { + var prev = notfirst && font.glyphs[letters[i - 1]] || {}, + curr = font.glyphs[letters[i]]; + shift += notfirst ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0; + notfirst = 1; + } + if (curr && curr.d) { + path += R.transformPath(curr.d, ["t", shift * scale, shifty * scale, "s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]); + } + } + } + return this.path(path).attr({ + fill: "#000", + stroke: "none" + }); + }; + + /*\ + * Paper.add + [ method ] + ** + * Imports elements in JSON array in format `{type: type, }` + ** + > Parameters + ** + - json (array) + = (object) resulting set of imported elements + > Usage + | paper.add([ + | { + | type: "circle", + | cx: 10, + | cy: 10, + | r: 5 + | }, + | { + | type: "rect", + | x: 10, + | y: 10, + | width: 10, + | height: 10, + | fill: "#fc0" + | } + | ]); + \*/ + paperproto.add = function (json) { + if (R.is(json, "array")) { + var res = this.set(), + i = 0, + ii = json.length, + j; + for (; i < ii; i++) { + j = json[i] || {}; + elements[has](j.type) && res.push(this[j.type]().attr(j)); + } + } + return res; + }; + + /*\ + * Raphael.format + [ method ] + ** + * Simple format function. Replaces construction of type “`{}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - … (string) rest of arguments will be treated as parameters for replacement + = (string) formated string + > Usage + | var x = 10, + | y = 20, + | width = 40, + | height = 50; + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.format("M{0},{1}h{2}v{3}h{4}z", x, y, width, height, -width)); + \*/ + R.format = function (token, params) { + var args = R.is(params, array) ? [0][concat](params) : arguments; + token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { + return args[++i] == null ? E : args[i]; + })); + return token || E; + }; + /*\ + * Raphael.fullfill + [ method ] + ** + * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{}`” to the corresponding argument. + ** + > Parameters + ** + - token (string) string to format + - json (object) object which properties will be used as a replacement + = (string) formated string + > Usage + | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" + | paper.path(Raphael.fullfill("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { + | x: 10, + | y: 20, + | dim: { + | width: 40, + | height: 50, + | "negative width": -40 + | } + | })); + \*/ + R.fullfill = (function () { + var tokenRegex = /\{([^\}]+)\}/g, + objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties + replacer = function (all, key, obj) { + var res = obj; + key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) { + name = name || quotedName; + if (res) { + if (name in res) { + res = res[name]; + } + typeof res == "function" && isFunc && (res = res()); + } + }); + res = (res == null || res == obj ? all : res) + ""; + return res; + }; + return function (str, obj) { + return String(str).replace(tokenRegex, function (all, key) { + return replacer(all, key, obj); + }); + }; + })(); + /*\ + * Raphael.ninja + [ method ] + ** + * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method. + * Beware, that in this case plugins could stop working, because they are depending on global variable existance. + ** + = (object) Raphael object + > Usage + | (function (local_raphael) { + | var paper = local_raphael(10, 10, 320, 200); + | … + | })(Raphael.ninja()); + \*/ + R.ninja = function () { + oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael; + return R; + }; + /*\ + * Raphael.st + [ property (object) ] + ** + * You can add your own method to elements and sets. It is wise to add a set method for each element method + * you added, so you will be able to call the same method on sets too. + ** + * See also @Raphael.el. + > Usage + | Raphael.el.red = function () { + | this.attr({fill: "#f00"}); + | }; + | Raphael.st.red = function () { + | this.forEach(function (el) { + | el.red(); + | }); + | }; + | // then use it + | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); + \*/ + R.st = setproto; + + eve.on("raphael.DOMload", function () { + loaded = true; + }); + + // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html + (function (doc, loaded, f) { + if (doc.readyState == null && doc.addEventListener){ + doc.addEventListener(loaded, f = function () { + doc.removeEventListener(loaded, f, false); + doc.readyState = "complete"; + }, false); + doc.readyState = "loading"; + } + function isLoaded() { + (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("raphael.DOMload"); + } + isLoaded(); + })(document, "DOMContentLoaded"); + +// ┌─────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël - JavaScript Vector Library │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ SVG Module │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ +// └─────────────────────────────────────────────────────────────────────┘ \\ + +(function(){ + if (!R.svg) { + return; + } + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + toInt = parseInt, + math = Math, + mmax = math.max, + abs = math.abs, + pow = math.pow, + separator = /[, ]+/, + eve = R.eve, + E = "", + S = " "; + var xlink = "http://www.w3.org/1999/xlink", + markers = { + block: "M5,0 0,2.5 5,5z", + classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z", + diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z", + open: "M6,1 1,3.5 6,6", + oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z" + }, + markerCounter = {}; + R.toString = function () { + return "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version; + }; + var $ = function (el, attr) { + if (attr) { + if (typeof el == "string") { + el = $(el); + } + for (var key in attr) if (attr[has](key)) { + if (key.substring(0, 6) == "xlink:") { + el.setAttributeNS(xlink, key.substring(6), Str(attr[key])); + } else { + el.setAttribute(key, Str(attr[key])); + } + } + } else { + el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el); + el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)"); + } + return el; + }, + addGradientFill = function (element, gradient) { + var type = "linear", + id = element.id + gradient, + fx = .5, fy = .5, + o = element.node, + SVG = element.paper, + s = o.style, + el = R._g.doc.getElementById(id); + if (!el) { + gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) { + type = "radial"; + if (_fx && _fy) { + fx = toFloat(_fx); + fy = toFloat(_fy); + var dir = ((fy > .5) * 2 - 1); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && + (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) && + fy != .5 && + (fy = fy.toFixed(5) - 1e-5 * dir); + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))], + max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1); + vector[2] *= max; + vector[3] *= max; + if (vector[2] < 0) { + vector[0] = -vector[2]; + vector[2] = 0; + } + if (vector[3] < 0) { + vector[1] = -vector[3]; + vector[3] = 0; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + id = id.replace(/[\(\)\s,\xb0#]/g, "_"); + + if (element.gradient && id != element.gradient.id) { + SVG.defs.removeChild(element.gradient); + delete element.gradient; + } + + if (!element.gradient) { + el = $(type + "Gradient", {id: id}); + element.gradient = el; + $(el, type == "radial" ? { + fx: fx, + fy: fy + } : { + x1: vector[0], + y1: vector[1], + x2: vector[2], + y2: vector[3], + gradientTransform: element.matrix.invert() + }); + SVG.defs.appendChild(el); + for (var i = 0, ii = dots.length; i < ii; i++) { + el.appendChild($("stop", { + offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%", + "stop-color": dots[i].color || "#fff" + })); + } + } + } + $(o, { + fill: "url('" + document.location + "#" + id + "')", + opacity: 1, + "fill-opacity": 1 + }); + s.fill = E; + s.opacity = 1; + s.fillOpacity = 1; + return 1; + }, + updatePosition = function (o) { + var bbox = o.getBBox(1); + $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"}); + }, + addArrow = function (o, value, isEnd) { + if (o.type == "path") { + var values = Str(value).toLowerCase().split("-"), + p = o.paper, + se = isEnd ? "end" : "start", + node = o.node, + attrs = o.attrs, + stroke = attrs["stroke-width"], + i = values.length, + type = "classic", + from, + to, + dx, + refX, + attr, + w = 3, + h = 3, + t = 5; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": h = 5; break; + case "narrow": h = 2; break; + case "long": w = 5; break; + case "short": w = 2; break; + } + } + if (type == "open") { + w += 2; + h += 2; + t += 2; + dx = 1; + refX = isEnd ? 4 : 1; + attr = { + fill: "none", + stroke: attrs.stroke + }; + } else { + refX = dx = w / 2; + attr = { + fill: attrs.stroke, + stroke: "none" + }; + } + if (o._.arrows) { + if (isEnd) { + o._.arrows.endPath && markerCounter[o._.arrows.endPath]--; + o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--; + } else { + o._.arrows.startPath && markerCounter[o._.arrows.startPath]--; + o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--; + } + } else { + o._.arrows = {}; + } + if (type != "none") { + var pathId = "raphael-marker-" + type, + markerId = "raphael-marker-" + se + type + w + h + "-obj" + o.id; + if (!R._g.doc.getElementById(pathId)) { + p.defs.appendChild($($("path"), { + "stroke-linecap": "round", + d: markers[type], + id: pathId + })); + markerCounter[pathId] = 1; + } else { + markerCounter[pathId]++; + } + var marker = R._g.doc.getElementById(markerId), + use; + if (!marker) { + marker = $($("marker"), { + id: markerId, + markerHeight: h, + markerWidth: w, + orient: "auto", + refX: refX, + refY: h / 2 + }); + use = $($("use"), { + "xlink:href": "#" + pathId, + transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")", + "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4) + }); + marker.appendChild(use); + p.defs.appendChild(marker); + markerCounter[markerId] = 1; + } else { + markerCounter[markerId]++; + use = marker.getElementsByTagName("use")[0]; + } + $(use, attr); + var delta = dx * (type != "diamond" && type != "oval"); + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - delta * stroke; + } else { + from = delta * stroke; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + attr = {}; + attr["marker-" + se] = "url(#" + markerId + ")"; + if (to || from) { + attr.d = R.getSubpath(attrs.path, from, to); + } + $(node, attr); + o._.arrows[se + "Path"] = pathId; + o._.arrows[se + "Marker"] = markerId; + o._.arrows[se + "dx"] = delta; + o._.arrows[se + "Type"] = type; + o._.arrows[se + "String"] = value; + } else { + if (isEnd) { + from = o._.arrows.startdx * stroke || 0; + to = R.getTotalLength(attrs.path) - from; + } else { + from = 0; + to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0); + } + o._.arrows[se + "Path"] && $(node, {d: R.getSubpath(attrs.path, from, to)}); + delete o._.arrows[se + "Path"]; + delete o._.arrows[se + "Marker"]; + delete o._.arrows[se + "dx"]; + delete o._.arrows[se + "Type"]; + delete o._.arrows[se + "String"]; + } + for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) { + var item = R._g.doc.getElementById(attr); + item && item.parentNode.removeChild(item); + } + } + }, + dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + }, + setFillAndStroke = function (o, params) { + var node = o.node, + attrs = o.attrs, + vis = node.style.visibility; + node.style.visibility = "hidden"; + for (var att in params) { + if (params[has](att)) { + if (!R._availableAttrs[has](att)) { + continue; + } + var value = params[att]; + attrs[att] = value; + switch (att) { + case "blur": + o.blur(value); + break; + case "title": + var title = node.getElementsByTagName("title"); + + // Use the existing . + if (title.length && (title = title[0])) { + title.firstChild.nodeValue = value; + } else { + title = $("title"); + var val = R._g.doc.createTextNode(value); + title.appendChild(val); + node.appendChild(title); + } + break; + case "href": + case "target": + var pn = node.parentNode; + if (pn.tagName.toLowerCase() != "a") { + var hl = $("a"); + pn.insertBefore(hl, node); + hl.appendChild(node); + pn = hl; + } + if (att == "target") { + pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value); + } else { + pn.setAttributeNS(xlink, att, value); + } + break; + case "cursor": + node.style.cursor = value; + break; + case "transform": + o.transform(value); + break; + case "arrow-start": + addArrow(o, value); + break; + case "arrow-end": + addArrow(o, value, 1); + break; + case "clip-rect": + var rect = Str(value).split(separator); + if (rect.length == 4) { + o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode); + var el = $("clipPath"), + rc = $("rect"); + el.id = R.createUUID(); + $(rc, { + x: rect[0], + y: rect[1], + width: rect[2], + height: rect[3] + }); + el.appendChild(rc); + o.paper.defs.appendChild(el); + $(node, {"clip-path": "url(#" + el.id + ")"}); + o.clip = rc; + } + if (!value) { + var path = node.getAttribute("clip-path"); + if (path) { + var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E)); + clip && clip.parentNode.removeChild(clip); + $(node, {"clip-path": E}); + delete o.clip; + } + } + break; + case "path": + if (o.type == "path") { + $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"}); + o._.dirty = 1; + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + } + break; + case "width": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fx) { + att = "x"; + value = attrs.x; + } else { + break; + } + case "x": + if (attrs.fx) { + value = -attrs.x - (attrs.width || 0); + } + case "rx": + if (att == "rx" && o.type == "rect") { + break; + } + case "cx": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "height": + node.setAttribute(att, value); + o._.dirty = 1; + if (attrs.fy) { + att = "y"; + value = attrs.y; + } else { + break; + } + case "y": + if (attrs.fy) { + value = -attrs.y - (attrs.height || 0); + } + case "ry": + if (att == "ry" && o.type == "rect") { + break; + } + case "cy": + node.setAttribute(att, value); + o.pattern && updatePosition(o); + o._.dirty = 1; + break; + case "r": + if (o.type == "rect") { + $(node, {rx: value, ry: value}); + } else { + node.setAttribute(att, value); + } + o._.dirty = 1; + break; + case "src": + if (o.type == "image") { + node.setAttributeNS(xlink, "href", value); + } + break; + case "stroke-width": + if (o._.sx != 1 || o._.sy != 1) { + value /= mmax(abs(o._.sx), abs(o._.sy)) || 1; + } + node.setAttribute(att, value); + if (attrs["stroke-dasharray"]) { + addDashes(o, attrs["stroke-dasharray"], params); + } + if (o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "stroke-dasharray": + addDashes(o, value, params); + break; + case "fill": + var isURL = Str(value).match(R._ISURL); + if (isURL) { + el = $("pattern"); + var ig = $("image"); + el.id = R.createUUID(); + $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1}); + $(ig, {x: 0, y: 0, "xlink:href": isURL[1]}); + el.appendChild(ig); + + (function (el) { + R._preload(isURL[1], function () { + var w = this.offsetWidth, + h = this.offsetHeight; + $(el, {width: w, height: h}); + $(ig, {width: w, height: h}); + o.paper.safari(); + }); + })(el); + o.paper.defs.appendChild(el); + $(node, {fill: "url(#" + el.id + ")"}); + o.pattern = el; + o.pattern && updatePosition(o); + break; + } + var clr = R.getRGB(value); + if (!clr.error) { + delete params.gradient; + delete attrs.gradient; + !R.is(attrs.opacity, "undefined") && + R.is(params.opacity, "undefined") && + $(node, {opacity: attrs.opacity}); + !R.is(attrs["fill-opacity"], "undefined") && + R.is(params["fill-opacity"], "undefined") && + $(node, {"fill-opacity": attrs["fill-opacity"]}); + } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) { + if ("opacity" in attrs || "fill-opacity" in attrs) { + var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + var stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)}); + } + } + attrs.gradient = value; + attrs.fill = "none"; + break; + } + clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + case "stroke": + clr = R.getRGB(value); + node.setAttribute(att, clr.hex); + att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity}); + if (att == "stroke" && o._.arrows) { + "startString" in o._.arrows && addArrow(o, o._.arrows.startString); + "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1); + } + break; + case "gradient": + (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value); + break; + case "opacity": + if (attrs.gradient && !attrs[has]("stroke-opacity")) { + $(node, {"stroke-opacity": value > 1 ? value / 100 : value}); + } + // fall + case "fill-opacity": + if (attrs.gradient) { + gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E)); + if (gradient) { + stops = gradient.getElementsByTagName("stop"); + $(stops[stops.length - 1], {"stop-opacity": value}); + } + break; + } + default: + att == "font-size" && (value = toInt(value, 10) + "px"); + var cssrule = att.replace(/(\-.)/g, function (w) { + return w.substring(1).toUpperCase(); + }); + node.style[cssrule] = value; + o._.dirty = 1; + node.setAttribute(att, value); + break; + } + } + } + + tuneText(o, params); + node.style.visibility = vis; + }, + leading = 1.2, + tuneText = function (el, params) { + if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) { + return; + } + var a = el.attrs, + node = el.node, + fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10; + + if (params[has]("text")) { + a.text = params.text; + while (node.firstChild) { + node.removeChild(node.firstChild); + } + var texts = Str(params.text).split("\n"), + tspans = [], + tspan; + for (var i = 0, ii = texts.length; i < ii; i++) { + tspan = $("tspan"); + i && $(tspan, {dy: fontSize * leading, x: a.x}); + tspan.appendChild(R._g.doc.createTextNode(texts[i])); + node.appendChild(tspan); + tspans[i] = tspan; + } + } else { + tspans = node.getElementsByTagName("tspan"); + for (i = 0, ii = tspans.length; i < ii; i++) if (i) { + $(tspans[i], {dy: fontSize * leading, x: a.x}); + } else { + $(tspans[0], {dy: 0}); + } + } + $(node, {x: a.x, y: a.y}); + el._.dirty = 1; + var bb = el._getBBox(), + dif = a.y - (bb.y + bb.height / 2); + dif && R.is(dif, "finite") && $(tspans[0], {dy: dif}); + }, + getRealNode = function (node) { + if (node.parentNode && node.parentNode.tagName.toLowerCase() === "a") { + return node.parentNode; + } else { + return node; + } + }, + Element = function (node, svg) { + var X = 0, + Y = 0; + /*\ + * Element.node + [ property (object) ] + ** + * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. + ** + * Note: Don’t mess with it. + > Usage + | // draw a circle at coordinate 10,10 with radius of 10 + | var c = paper.circle(10, 10, 10); + | c.node.onclick = function () { + | c.attr("fill", "red"); + | }; + \*/ + this[0] = this.node = node; + /*\ + * Element.raphael + [ property (object) ] + ** + * Internal reference to @Raphael object. In case it is not available. + > Usage + | Raphael.el.red = function () { + | var hsb = this.paper.raphael.rgb2hsb(this.attr("fill")); + | hsb.h = 1; + | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); + | } + \*/ + node.raphael = true; + /*\ + * Element.id + [ property (number) ] + ** + * Unique id of the element. Especially useful when you want to listen to events of the element, + * because all events are fired in format `<module>.<action>.<id>`. Also useful for @Paper.getById method. + \*/ + this.id = R._oid++; + node.raphaelid = this.id; + this.matrix = R.matrix(); + this.realPath = null; + /*\ + * Element.paper + [ property (object) ] + ** + * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions. + > Usage + | Raphael.el.cross = function () { + | this.attr({fill: "red"}); + | this.paper.path("M10,10L50,50M50,10L10,50") + | .attr({stroke: "red"}); + | } + \*/ + this.paper = svg; + this.attrs = this.attrs || {}; + this._ = { + transform: [], + sx: 1, + sy: 1, + deg: 0, + dx: 0, + dy: 0, + dirty: 1 + }; + !svg.bottom && (svg.bottom = this); + /*\ + * Element.prev + [ property (object) ] + ** + * Reference to the previous element in the hierarchy. + \*/ + this.prev = svg.top; + svg.top && (svg.top.next = this); + svg.top = this; + /*\ + * Element.next + [ property (object) ] + ** + * Reference to the next element in the hierarchy. + \*/ + this.next = null; + }, + elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + + R._engine.path = function (pathString, SVG) { + var el = $("path"); + SVG.canvas && SVG.canvas.appendChild(el); + var p = new Element(el, SVG); + p.type = "path"; + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); + return p; + }; + /*\ + * Element.rotate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds rotation by given angle around given point to the list of + * transformations of the element. + > Parameters + - deg (number) angle in degrees + - cx (number) #optional x coordinate of the centre of rotation + - cy (number) #optional y coordinate of the centre of rotation + * If cx & cy aren’t specified centre of the shape is used as a point of rotation. + = (object) @Element + \*/ + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + /*\ + * Element.scale + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds scale by given amount relative to given point to the list of + * transformations of the element. + > Parameters + - sx (number) horisontal scale amount + - sy (number) vertical scale amount + - cx (number) #optional x coordinate of the centre of scale + - cy (number) #optional y coordinate of the centre of scale + * If cx & cy aren’t specified centre of the shape is used instead. + = (object) @Element + \*/ + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + return this; + }; + /*\ + * Element.translate + [ method ] + ** + * Deprecated! Use @Element.transform instead. + * Adds translation by given amount to the list of transformations of the element. + > Parameters + - dx (number) horisontal shift + - dy (number) vertical shift + = (object) @Element + \*/ + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + /*\ + * Element.transform + [ method ] + ** + * Adds transformation to the element which is separate to other attributes, + * i.e. translation doesn’t change `x` or `y` of the rectange. The format + * of transformation string is similar to the path string syntax: + | "t100,100r30,100,100s2,2,100,100r45s1.5" + * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for + * scale and `m` is for matrix. + * + * There are also alternative “absolute” translation, rotation and scale: `T`, `R` and `S`. They will not take previous transformation into account. For example, `...T100,0` will always move element 100 px horisontally, while `...t100,0` could move it vertically if there is `r90` before. Just compare results of `r90t100,0` and `r90T100,0`. + * + * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100; + * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin + * coordinates as optional parameters, the default is the centre point of the element. + * Matrix accepts six parameters. + > Usage + | var el = paper.rect(10, 20, 300, 200); + | // translate 100, 100, rotate 45°, translate -100, 0 + | el.transform("t100,100r45t-100,0"); + | // if you want you can append or prepend transformations + | el.transform("...t50,50"); + | el.transform("s2..."); + | // or even wrap + | el.transform("t50,50...t-50-50"); + | // to reset transformation call method with empty string + | el.transform(""); + | // to get current value call it without parameters + | console.log(el.transform()); + > Parameters + - tstr (string) #optional transformation string + * If tstr isn’t specified + = (string) current transformation string + * else + = (object) @Element + \*/ + elproto.transform = function (tstr) { + var _ = this._; + if (tstr == null) { + return _.transform; + } + R._extractTransform(this, tstr); + + this.clip && $(this.clip, {transform: this.matrix.invert()}); + this.pattern && updatePosition(this); + this.node && $(this.node, {transform: this.matrix}); + + if (_.sx != 1 || _.sy != 1) { + var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1; + this.attr({"stroke-width": sw}); + } + + return this; + }; + /*\ + * Element.hide + [ method ] + ** + * Makes element invisible. See @Element.show. + = (object) @Element + \*/ + elproto.hide = function () { + !this.removed && this.paper.safari(this.node.style.display = "none"); + return this; + }; + /*\ + * Element.show + [ method ] + ** + * Makes element visible. See @Element.hide. + = (object) @Element + \*/ + elproto.show = function () { + !this.removed && this.paper.safari(this.node.style.display = ""); + return this; + }; + /*\ + * Element.remove + [ method ] + ** + * Removes element from the paper. + \*/ + elproto.remove = function () { + var node = getRealNode(this.node); + if (this.removed || !node.parentNode) { + return; + } + var paper = this.paper; + paper.__set__ && paper.__set__.exclude(this); + eve.unbind("raphael.*.*." + this.id); + if (this.gradient) { + paper.defs.removeChild(this.gradient); + } + R._tear(this, paper); + + node.parentNode.removeChild(node); + + // Remove custom data for element + this.removeData(); + + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto._getBBox = function () { + if (this.node.style.display == "none") { + this.show(); + var hide = true; + } + var canvasHidden = false, + containerStyle; + if (this.paper.canvas.parentElement) { + containerStyle = this.paper.canvas.parentElement.style; + } //IE10+ can't find parentElement + else if (this.paper.canvas.parentNode) { + containerStyle = this.paper.canvas.parentNode.style; + } + + if(containerStyle && containerStyle.display == "none") { + canvasHidden = true; + containerStyle.display = ""; + } + var bbox = {}; + try { + bbox = this.node.getBBox(); + } catch(e) { + // Firefox 3.0.x, 25.0.1 (probably more versions affected) play badly here - possible fix + bbox = { + x: this.node.clientLeft, + y: this.node.clientTop, + width: this.node.clientWidth, + height: this.node.clientHeight + } + } finally { + bbox = bbox || {}; + if(canvasHidden){ + containerStyle.display = "none"; + } + } + hide && this.hide(); + return bbox; + }; + /*\ + * Element.attr + [ method ] + ** + * Sets the attributes of the element. + > Parameters + - attrName (string) attribute’s name + - value (string) value + * or + - params (object) object of name/value pairs + * or + - attrName (string) attribute’s name + * or + - attrNames (array) in this case method returns array of current values for given attribute names + = (object) @Element if attrsName & value or params are passed in. + = (...) value of the attribute if only attrsName is passed in. + = (array) array of values of the attribute if attrsNames is passed in. + = (object) object of attributes if nothing is passed in. + > Possible parameters + # <p>Please refer to the <a href="http://www.w3.org/TR/SVG/" title="The W3C Recommendation for the SVG language describes these properties in detail.">SVG specification</a> for an explanation of these parameters.</p> + o arrow-end (string) arrowhead on the end of the path. The format for string is `<type>[-<width>[-<length>]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `medium`, length: `long`, `short`, `midium`. + o clip-rect (string) comma or space separated values: x, y, width and height + o cursor (string) CSS type of the cursor + o cx (number) the x-axis coordinate of the center of the circle, or ellipse + o cy (number) the y-axis coordinate of the center of the circle, or ellipse + o fill (string) colour, gradient or image + o fill-opacity (number) + o font (string) + o font-family (string) + o font-size (number) font size in pixels + o font-weight (string) + o height (number) + o href (string) URL, if specified element behaves as hyperlink + o opacity (number) + o path (string) SVG path string format + o r (number) radius of the circle, ellipse or rounded corner on the rect + o rx (number) horisontal radius of the ellipse + o ry (number) vertical radius of the ellipse + o src (string) image URL, only works for @Element.image element + o stroke (string) stroke colour + o stroke-dasharray (string) [“”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”] + o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”] + o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”] + o stroke-miterlimit (number) + o stroke-opacity (number) + o stroke-width (number) stroke width in pixels, default is '1' + o target (string) used with href + o text (string) contents of the text element. Use `\n` for multiline text + o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`” + o title (string) will create tooltip with a given text + o transform (string) see @Element.transform + o width (number) + o x (number) + o y (number) + > Gradients + * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90° + * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black. + * + * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” – + * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point + * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses. + > Path String + # <p>Please refer to <a href="http://www.w3.org/TR/SVG/paths.html#PathData" title="Details of a path’s data attribute’s format are described in the SVG specification.">SVG documentation regarding path string</a>. Raphaël fully supports it.</p> + > Colour Parsing + # <ul> + # <li>Colour name (“<code>red</code>”, “<code>green</code>”, “<code>cornflowerblue</code>”, etc)</li> + # <li>#••• — shortened HTML colour: (“<code>#000</code>”, “<code>#fc0</code>”, etc)</li> + # <li>#•••••• — full length HTML colour: (“<code>#000000</code>”, “<code>#bd2300</code>”)</li> + # <li>rgb(•••, •••, •••) — red, green and blue channels’ values: (“<code>rgb(200, 100, 0)</code>”)</li> + # <li>rgb(•••%, •••%, •••%) — same as above, but in %: (“<code>rgb(100%, 175%, 0%)</code>”)</li> + # <li>rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“<code>rgba(200, 100, 0, .5)</code>”)</li> + # <li>rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“<code>rgba(100%, 175%, 0%, 50%)</code>”)</li> + # <li>hsb(•••, •••, •••) — hue, saturation and brightness values: (“<code>hsb(0.5, 0.25, 1)</code>”)</li> + # <li>hsb(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsba(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>hsl(•••, •••, •••) — almost the same as hsb, see <a href="http://en.wikipedia.org/wiki/HSL_and_HSV" title="HSL and HSV - Wikipedia, the free encyclopedia">Wikipedia page</a></li> + # <li>hsl(•••%, •••%, •••%) — same as above, but in %</li> + # <li>hsla(•••, •••, •••, •••) — same as above, but with opacity</li> + # <li>Optionally for hsb and hsl you could specify hue as a degree: “<code>hsl(240deg, 1, .5)</code>” or, if you want to go fancy, “<code>hsl(240°, 1, .5)</code>”</li> + # </ul> + \*/ + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + if (name == "transform") { + return this._.transform; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + if (value != null) { + var params = {}; + params[name] = value; + } else if (name != null && R.is(name, "object")) { + params = name; + } + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + setFillAndStroke(this, params); + return this; + }; + /*\ + * Element.toFront + [ method ] + ** + * Moves the element so it is the closest to the viewer’s eyes, on top of other elements. + = (object) @Element + \*/ + elproto.toFront = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + node.parentNode.appendChild(node); + var svg = this.paper; + svg.top != this && R._tofront(this, svg); + return this; + }; + /*\ + * Element.toBack + [ method ] + ** + * Moves the element so it is the furthest from the viewer’s eyes, behind other elements. + = (object) @Element + \*/ + elproto.toBack = function () { + if (this.removed) { + return this; + } + var node = getRealNode(this.node); + var parentNode = node.parentNode; + parentNode.insertBefore(node, parentNode.firstChild); + R._toback(this, this.paper); + var svg = this.paper; + return this; + }; + /*\ + * Element.insertAfter + [ method ] + ** + * Inserts current object after the given one. + = (object) @Element + \*/ + elproto.insertAfter = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var afterNode = getRealNode(element.node || element[element.length - 1].node); + if (afterNode.nextSibling) { + afterNode.parentNode.insertBefore(node, afterNode.nextSibling); + } else { + afterNode.parentNode.appendChild(node); + } + R._insertafter(this, element, this.paper); + return this; + }; + /*\ + * Element.insertBefore + [ method ] + ** + * Inserts current object before the given one. + = (object) @Element + \*/ + elproto.insertBefore = function (element) { + if (this.removed || !element) { + return this; + } + + var node = getRealNode(this.node); + var beforeNode = getRealNode(element.node || element[0].node); + beforeNode.parentNode.insertBefore(node, beforeNode); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + // Experimental. No Safari support. Use it on your own risk. + var t = this; + if (+size !== 0) { + var fltr = $("filter"), + blur = $("feGaussianBlur"); + t.attrs.blur = size; + fltr.id = R.createUUID(); + $(blur, {stdDeviation: +size || 1.5}); + fltr.appendChild(blur); + t.paper.defs.appendChild(fltr); + t._blur = fltr; + $(t.node, {filter: "url(#" + fltr.id + ")"}); + } else { + if (t._blur) { + t._blur.parentNode.removeChild(t._blur); + delete t._blur; + delete t.attrs.blur; + } + t.node.removeAttribute("filter"); + } + return t; + }; + R._engine.circle = function (svg, x, y, r) { + var el = $("circle"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"}; + res.type = "circle"; + $(el, res.attrs); + return res; + }; + R._engine.rect = function (svg, x, y, w, h, r) { + var el = $("rect"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"}; + res.type = "rect"; + $(el, res.attrs); + return res; + }; + R._engine.ellipse = function (svg, x, y, rx, ry) { + var el = $("ellipse"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"}; + res.type = "ellipse"; + $(el, res.attrs); + return res; + }; + R._engine.image = function (svg, src, x, y, w, h) { + var el = $("image"); + $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"}); + el.setAttributeNS(xlink, "href", src); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = {x: x, y: y, width: w, height: h, src: src}; + res.type = "image"; + return res; + }; + R._engine.text = function (svg, x, y, text) { + var el = $("text"); + svg.canvas && svg.canvas.appendChild(el); + var res = new Element(el, svg); + res.attrs = { + x: x, + y: y, + "text-anchor": "middle", + text: text, + "font-family": R._availableAttrs["font-family"], + "font-size": R._availableAttrs["font-size"], + stroke: "none", + fill: "#000" + }; + res.type = "text"; + setFillAndStroke(res, res.attrs); + return res; + }; + R._engine.setSize = function (width, height) { + this.width = width || this.width; + this.height = height || this.height; + this.canvas.setAttribute("width", this.width); + this.canvas.setAttribute("height", this.height); + if (this._viewBox) { + this.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con && con.container, + x = con.x, + y = con.y, + width = con.width, + height = con.height; + if (!container) { + throw new Error("SVG container not found."); + } + var cnvs = $("svg"), + css = "overflow:hidden;", + isFloating; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + $(cnvs, { + height: height, + version: 1.1, + width: width, + xmlns: "http://www.w3.org/2000/svg", + "xmlns:xlink": "http://www.w3.org/1999/xlink" + }); + if (container == 1) { + cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px"; + R._g.doc.body.appendChild(cnvs); + isFloating = 1; + } else { + cnvs.style.cssText = css + "position:relative"; + if (container.firstChild) { + container.insertBefore(cnvs, container.firstChild); + } else { + container.appendChild(cnvs); + } + } + container = new R._Paper; + container.width = width; + container.height = height; + container.canvas = cnvs; + container.clear(); + container._left = container._top = 0; + isFloating && (container.renderfix = function () {}); + container.renderfix(); + return container; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + size = mmax(w / paperSize.width, h / paperSize.height), + top = this.top, + aspectRatio = fit ? "xMidYMid meet" : "xMinYMin", + vb, + sw; + if (x == null) { + if (this._vbSize) { + size = 1; + } + delete this._vbSize; + vb = "0 0 " + this.width + S + this.height; + } else { + this._vbSize = size; + vb = x + S + y + S + w + S + h; + } + $(this.canvas, { + viewBox: vb, + preserveAspectRatio: aspectRatio + }); + while (size && top) { + sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1; + top.attr({"stroke-width": sw}); + top._.dirty = 1; + top._.dirtyT = 1; + top = top.prev; + } + this._viewBox = [x, y, w, h, !!fit]; + return this; + }; + /*\ + * Paper.renderfix + [ method ] + ** + * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant + * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. + * This method fixes the issue. + ** + Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method. + \*/ + R.prototype.renderfix = function () { + var cnvs = this.canvas, + s = cnvs.style, + pos; + try { + pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix(); + } catch (e) { + pos = cnvs.createSVGMatrix(); + } + var left = -pos.e % 1, + top = -pos.f % 1; + if (left || top) { + if (left) { + this._left = (this._left + left) % 1; + s.left = this._left + "px"; + } + if (top) { + this._top = (this._top + top) % 1; + s.top = this._top + "px"; + } + } + }; + /*\ + * Paper.clear + [ method ] + ** + * Clears the paper, i.e. removes all the elements. + \*/ + R.prototype.clear = function () { + R.eve("raphael.clear", this); + var c = this.canvas; + while (c.firstChild) { + c.removeChild(c.firstChild); + } + this.bottom = this.top = null; + (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version)); + c.appendChild(this.desc); + c.appendChild(this.defs = $("defs")); + }; + /*\ + * Paper.remove + [ method ] + ** + * Removes the paper from the DOM. + \*/ + R.prototype.remove = function () { + eve("raphael.remove", this); + this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + }; + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +})(); + +// ┌─────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël - JavaScript Vector Library │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ VML Module │ \\ +// ├─────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ +// └─────────────────────────────────────────────────────────────────────┘ \\ + +(function(){ + if (!R.vml) { + return; + } + var has = "hasOwnProperty", + Str = String, + toFloat = parseFloat, + math = Math, + round = math.round, + mmax = math.max, + mmin = math.min, + abs = math.abs, + fillString = "fill", + separator = /[, ]+/, + eve = R.eve, + ms = " progid:DXImageTransform.Microsoft", + S = " ", + E = "", + map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"}, + bites = /([clmz]),?([^clmz]*)/gi, + blurregexp = / progid:\S+Blur\([^\)]+\)/g, + val = /-?[^,\s-]+/g, + cssDot = "position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)", + zoom = 21600, + pathTypes = {path: 1, rect: 1, image: 1}, + ovalTypes = {circle: 1, ellipse: 1}, + path2vml = function (path) { + var total = /[ahqstv]/ig, + command = R._pathToAbsolute; + Str(path).match(total) && (command = R._path2curve); + total = /[clmz]/g; + if (command == R._pathToAbsolute && !Str(path).match(total)) { + var res = Str(path).replace(bites, function (all, command, args) { + var vals = [], + isMove = command.toLowerCase() == "m", + res = map[command]; + args.replace(val, function (value) { + if (isMove && vals.length == 2) { + res += vals + map[command == "m" ? "l" : "L"]; + vals = []; + } + vals.push(round(value * zoom)); + }); + return res + vals; + }); + return res; + } + var pa = command(path), p, r; + res = []; + for (var i = 0, ii = pa.length; i < ii; i++) { + p = pa[i]; + r = pa[i][0].toLowerCase(); + r == "z" && (r = "x"); + for (var j = 1, jj = p.length; j < jj; j++) { + r += round(p[j] * zoom) + (j != jj - 1 ? "," : E); + } + res.push(r); + } + return res.join(S); + }, + compensation = function (deg, dx, dy) { + var m = R.matrix(); + m.rotate(-deg, .5, .5); + return { + dx: m.x(dx, dy), + dy: m.y(dx, dy) + }; + }, + setCoords = function (p, sx, sy, dx, dy, deg) { + var _ = p._, + m = p.matrix, + fillpos = _.fillpos, + o = p.node, + s = o.style, + y = 1, + flip = "", + dxdy, + kx = zoom / sx, + ky = zoom / sy; + s.visibility = "hidden"; + if (!sx || !sy) { + return; + } + o.coordsize = abs(kx) + S + abs(ky); + s.rotation = deg * (sx * sy < 0 ? -1 : 1); + if (deg) { + var c = compensation(deg, dx, dy); + dx = c.dx; + dy = c.dy; + } + sx < 0 && (flip += "x"); + sy < 0 && (flip += " y") && (y = -1); + s.flip = flip; + o.coordorigin = (dx * -kx) + S + (dy * -ky); + if (fillpos || _.fillsize) { + var fill = o.getElementsByTagName(fillString); + fill = fill && fill[0]; + o.removeChild(fill); + if (fillpos) { + c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1])); + fill.position = c.dx * y + S + c.dy * y; + } + if (_.fillsize) { + fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy); + } + o.appendChild(fill); + } + s.visibility = "visible"; + }; + R.toString = function () { + return "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version; + }; + var addArrow = function (o, value, isEnd) { + var values = Str(value).toLowerCase().split("-"), + se = isEnd ? "end" : "start", + i = values.length, + type = "classic", + w = "medium", + h = "medium"; + while (i--) { + switch (values[i]) { + case "block": + case "classic": + case "oval": + case "diamond": + case "open": + case "none": + type = values[i]; + break; + case "wide": + case "narrow": h = values[i]; break; + case "long": + case "short": w = values[i]; break; + } + } + var stroke = o.node.getElementsByTagName("stroke")[0]; + stroke[se + "arrow"] = type; + stroke[se + "arrowlength"] = w; + stroke[se + "arrowwidth"] = h; + }, + setFillAndStroke = function (o, params) { + // o.paper.canvas.style.display = "none"; + o.attrs = o.attrs || {}; + var node = o.node, + a = o.attrs, + s = node.style, + xy, + newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r), + isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry), + res = o; + + + for (var par in params) if (params[has](par)) { + a[par] = params[par]; + } + if (newpath) { + a.path = R._getPath[o.type](o); + o._.dirty = 1; + } + params.href && (node.href = params.href); + params.title && (node.title = params.title); + params.target && (node.target = params.target); + params.cursor && (s.cursor = params.cursor); + "blur" in params && o.blur(params.blur); + if (params.path && o.type == "path" || newpath) { + node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path); + o._.dirty = 1; + if (o.type == "image") { + o._.fillpos = [a.x, a.y]; + o._.fillsize = [a.width, a.height]; + setCoords(o, 1, 1, 0, 0, 0); + } + } + "transform" in params && o.transform(params.transform); + if (isOval) { + var cx = +a.cx, + cy = +a.cy, + rx = +a.rx || +a.r || 0, + ry = +a.ry || +a.r || 0; + node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom)); + o._.dirty = 1; + } + if ("clip-rect" in params) { + var rect = Str(params["clip-rect"]).split(separator); + if (rect.length == 4) { + rect[2] = +rect[2] + (+rect[0]); + rect[3] = +rect[3] + (+rect[1]); + var div = node.clipRect || R._g.doc.createElement("div"), + dstyle = div.style; + dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect); + if (!node.clipRect) { + dstyle.position = "absolute"; + dstyle.top = 0; + dstyle.left = 0; + dstyle.width = o.paper.width + "px"; + dstyle.height = o.paper.height + "px"; + node.parentNode.insertBefore(div, node); + div.appendChild(node); + node.clipRect = div; + } + } + if (!params["clip-rect"]) { + node.clipRect && (node.clipRect.style.clip = "auto"); + } + } + if (o.textpath) { + var textpathStyle = o.textpath.style; + params.font && (textpathStyle.font = params.font); + params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"'); + params["font-size"] && (textpathStyle.fontSize = params["font-size"]); + params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]); + params["font-style"] && (textpathStyle.fontStyle = params["font-style"]); + } + if ("arrow-start" in params) { + addArrow(res, params["arrow-start"]); + } + if ("arrow-end" in params) { + addArrow(res, params["arrow-end"], 1); + } + if (params.opacity != null || + params["stroke-width"] != null || + params.fill != null || + params.src != null || + params.stroke != null || + params["stroke-width"] != null || + params["stroke-opacity"] != null || + params["fill-opacity"] != null || + params["stroke-dasharray"] != null || + params["stroke-miterlimit"] != null || + params["stroke-linejoin"] != null || + params["stroke-linecap"] != null) { + var fill = node.getElementsByTagName(fillString), + newfill = false; + fill = fill && fill[0]; + !fill && (newfill = fill = createNode(fillString)); + if (o.type == "image" && params.src) { + fill.src = params.src; + } + params.fill && (fill.on = true); + if (fill.on == null || params.fill == "none" || params.fill === null) { + fill.on = false; + } + if (fill.on && params.fill) { + var isURL = Str(params.fill).match(R._ISURL); + if (isURL) { + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = isURL[1]; + fill.type = "tile"; + var bbox = o.getBBox(1); + fill.position = bbox.x + S + bbox.y; + o._.fillpos = [bbox.x, bbox.y]; + + R._preload(isURL[1], function () { + o._.fillsize = [this.offsetWidth, this.offsetHeight]; + }); + } else { + fill.color = R.getRGB(params.fill).hex; + fill.src = E; + fill.type = "solid"; + if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) { + a.fill = "none"; + a.gradient = params.fill; + fill.rotate = false; + } + } + } + if ("fill-opacity" in params || "opacity" in params) { + var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1); + opacity = mmin(mmax(opacity, 0), 1); + fill.opacity = opacity; + if (fill.src) { + fill.color = "none"; + } + } + node.appendChild(fill); + var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]), + newstroke = false; + !stroke && (newstroke = stroke = createNode("stroke")); + if ((params.stroke && params.stroke != "none") || + params["stroke-width"] || + params["stroke-opacity"] != null || + params["stroke-dasharray"] || + params["stroke-miterlimit"] || + params["stroke-linejoin"] || + params["stroke-linecap"]) { + stroke.on = true; + } + (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false); + var strokeColor = R.getRGB(params.stroke); + stroke.on && params.stroke && (stroke.color = strokeColor.hex); + opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1); + var width = (toFloat(params["stroke-width"]) || 1) * .75; + opacity = mmin(mmax(opacity, 0), 1); + params["stroke-width"] == null && (width = a["stroke-width"]); + params["stroke-width"] && (stroke.weight = width); + width && width < 1 && (opacity *= width) && (stroke.weight = 1); + stroke.opacity = opacity; + + params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter"); + stroke.miterlimit = params["stroke-miterlimit"] || 8; + params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round"); + if ("stroke-dasharray" in params) { + var dasharray = { + "-": "shortdash", + ".": "shortdot", + "-.": "shortdashdot", + "-..": "shortdashdotdot", + ". ": "dot", + "- ": "dash", + "--": "longdash", + "- .": "dashdot", + "--.": "longdashdot", + "--..": "longdashdotdot" + }; + stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E; + } + newstroke && node.appendChild(stroke); + } + if (res.type == "text") { + res.paper.canvas.style.display = E; + var span = res.paper.span, + m = 100, + fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/); + s = span.style; + a.font && (s.font = a.font); + a["font-family"] && (s.fontFamily = a["font-family"]); + a["font-weight"] && (s.fontWeight = a["font-weight"]); + a["font-style"] && (s.fontStyle = a["font-style"]); + fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10; + s.fontSize = fontSize * m + "px"; + res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "<").replace(/&/g, "&").replace(/\n/g, "<br>")); + var brect = span.getBoundingClientRect(); + res.W = a.w = (brect.right - brect.left) / m; + res.H = a.h = (brect.bottom - brect.top) / m; + // res.paper.canvas.style.display = "none"; + res.X = a.x; + res.Y = a.y + res.H / 2; + + ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1)); + var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"]; + for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) { + res._.dirty = 1; + break; + } + + // text-anchor emulation + switch (a["text-anchor"]) { + case "start": + res.textpath.style["v-text-align"] = "left"; + res.bbx = res.W / 2; + break; + case "end": + res.textpath.style["v-text-align"] = "right"; + res.bbx = -res.W / 2; + break; + default: + res.textpath.style["v-text-align"] = "center"; + res.bbx = 0; + break; + } + res.textpath.style["v-text-kern"] = true; + } + // res.paper.canvas.style.display = E; + }, + addGradientFill = function (o, gradient, fill) { + o.attrs = o.attrs || {}; + var attrs = o.attrs, + pow = Math.pow, + opacity, + oindex, + type = "linear", + fxfy = ".5 .5"; + o.attrs.gradient = gradient; + gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) { + type = "radial"; + if (fx && fy) { + fx = toFloat(fx); + fy = toFloat(fy); + pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5); + fxfy = fx + S + fy; + } + return E; + }); + gradient = gradient.split(/\s*\-\s*/); + if (type == "linear") { + var angle = gradient.shift(); + angle = -toFloat(angle); + if (isNaN(angle)) { + return null; + } + } + var dots = R._parseDots(gradient); + if (!dots) { + return null; + } + o = o.shape || o.node; + if (dots.length) { + o.removeChild(fill); + fill.on = true; + fill.method = "none"; + fill.color = dots[0].color; + fill.color2 = dots[dots.length - 1].color; + var clrs = []; + for (var i = 0, ii = dots.length; i < ii; i++) { + dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color); + } + fill.colors = clrs.length ? clrs.join() : "0% " + fill.color; + if (type == "radial") { + fill.type = "gradientTitle"; + fill.focus = "100%"; + fill.focussize = "0 0"; + fill.focusposition = fxfy; + fill.angle = 0; + } else { + // fill.rotate= true; + fill.type = "gradient"; + fill.angle = (270 - angle) % 360; + } + o.appendChild(fill); + } + return 1; + }, + Element = function (node, vml) { + this[0] = this.node = node; + node.raphael = true; + this.id = R._oid++; + node.raphaelid = this.id; + this.X = 0; + this.Y = 0; + this.attrs = {}; + this.paper = vml; + this.matrix = R.matrix(); + this._ = { + transform: [], + sx: 1, + sy: 1, + dx: 0, + dy: 0, + deg: 0, + dirty: 1, + dirtyT: 1 + }; + !vml.bottom && (vml.bottom = this); + this.prev = vml.top; + vml.top && (vml.top.next = this); + vml.top = this; + this.next = null; + }; + var elproto = R.el; + + Element.prototype = elproto; + elproto.constructor = Element; + elproto.transform = function (tstr) { + if (tstr == null) { + return this._.transform; + } + var vbs = this.paper._viewBoxShift, + vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E, + oldt; + if (vbs) { + oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E); + } + R._extractTransform(this, vbt + tstr); + var matrix = this.matrix.clone(), + skew = this.skew, + o = this.node, + split, + isGrad = ~Str(this.attrs.fill).indexOf("-"), + isPatt = !Str(this.attrs.fill).indexOf("url("); + matrix.translate(1, 1); + if (isPatt || isGrad || this.type == "image") { + skew.matrix = "1 0 0 1"; + skew.offset = "0 0"; + split = matrix.split(); + if ((isGrad && split.noRotation) || !split.isSimple) { + o.style.filter = matrix.toFilter(); + var bb = this.getBBox(), + bbt = this.getBBox(1), + dx = bb.x - bbt.x, + dy = bb.y - bbt.y; + o.coordorigin = (dx * -zoom) + S + (dy * -zoom); + setCoords(this, 1, 1, dx, dy, 0); + } else { + o.style.filter = E; + setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate); + } + } else { + o.style.filter = E; + skew.matrix = Str(matrix); + skew.offset = matrix.offset(); + } + if (oldt !== null) { // empty string value is true as well + this._.transform = oldt; + R._extractTransform(this, oldt); + } + return this; + }; + elproto.rotate = function (deg, cx, cy) { + if (this.removed) { + return this; + } + if (deg == null) { + return; + } + deg = Str(deg).split(separator); + if (deg.length - 1) { + cx = toFloat(deg[1]); + cy = toFloat(deg[2]); + } + deg = toFloat(deg[0]); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + cx = bbox.x + bbox.width / 2; + cy = bbox.y + bbox.height / 2; + } + this._.dirtyT = 1; + this.transform(this._.transform.concat([["r", deg, cx, cy]])); + return this; + }; + elproto.translate = function (dx, dy) { + if (this.removed) { + return this; + } + dx = Str(dx).split(separator); + if (dx.length - 1) { + dy = toFloat(dx[1]); + } + dx = toFloat(dx[0]) || 0; + dy = +dy || 0; + if (this._.bbox) { + this._.bbox.x += dx; + this._.bbox.y += dy; + } + this.transform(this._.transform.concat([["t", dx, dy]])); + return this; + }; + elproto.scale = function (sx, sy, cx, cy) { + if (this.removed) { + return this; + } + sx = Str(sx).split(separator); + if (sx.length - 1) { + sy = toFloat(sx[1]); + cx = toFloat(sx[2]); + cy = toFloat(sx[3]); + isNaN(cx) && (cx = null); + isNaN(cy) && (cy = null); + } + sx = toFloat(sx[0]); + (sy == null) && (sy = sx); + (cy == null) && (cx = cy); + if (cx == null || cy == null) { + var bbox = this.getBBox(1); + } + cx = cx == null ? bbox.x + bbox.width / 2 : cx; + cy = cy == null ? bbox.y + bbox.height / 2 : cy; + + this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); + this._.dirtyT = 1; + return this; + }; + elproto.hide = function () { + !this.removed && (this.node.style.display = "none"); + return this; + }; + elproto.show = function () { + !this.removed && (this.node.style.display = E); + return this; + }; + // Needed to fix the vml setViewBox issues + elproto.auxGetBBox = R.el.getBBox; + elproto.getBBox = function(){ + var b = this.auxGetBBox(); + if (this.paper && this.paper._viewBoxShift) + { + var c = {}; + var z = 1/this.paper._viewBoxShift.scale; + c.x = b.x - this.paper._viewBoxShift.dx; + c.x *= z; + c.y = b.y - this.paper._viewBoxShift.dy; + c.y *= z; + c.width = b.width * z; + c.height = b.height * z; + c.x2 = c.x + c.width; + c.y2 = c.y + c.height; + return c; + } + return b; + }; + elproto._getBBox = function () { + if (this.removed) { + return {}; + } + return { + x: this.X + (this.bbx || 0) - this.W / 2, + y: this.Y - this.H, + width: this.W, + height: this.H + }; + }; + elproto.remove = function () { + if (this.removed || !this.node.parentNode) { + return; + } + this.paper.__set__ && this.paper.__set__.exclude(this); + R.eve.unbind("raphael.*.*." + this.id); + R._tear(this, this.paper); + this.node.parentNode.removeChild(this.node); + this.shape && this.shape.parentNode.removeChild(this.shape); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + this.removed = true; + }; + elproto.attr = function (name, value) { + if (this.removed) { + return this; + } + if (name == null) { + var res = {}; + for (var a in this.attrs) if (this.attrs[has](a)) { + res[a] = this.attrs[a]; + } + res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient; + res.transform = this._.transform; + return res; + } + if (value == null && R.is(name, "string")) { + if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) { + return this.attrs.gradient; + } + var names = name.split(separator), + out = {}; + for (var i = 0, ii = names.length; i < ii; i++) { + name = names[i]; + if (name in this.attrs) { + out[name] = this.attrs[name]; + } else if (R.is(this.paper.customAttributes[name], "function")) { + out[name] = this.paper.customAttributes[name].def; + } else { + out[name] = R._availableAttrs[name]; + } + } + return ii - 1 ? out : out[names[0]]; + } + if (this.attrs && value == null && R.is(name, "array")) { + out = {}; + for (i = 0, ii = name.length; i < ii; i++) { + out[name[i]] = this.attr(name[i]); + } + return out; + } + var params; + if (value != null) { + params = {}; + params[name] = value; + } + value == null && R.is(name, "object") && (params = name); + for (var key in params) { + eve("raphael.attr." + key + "." + this.id, this, params[key]); + } + if (params) { + for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) { + var par = this.paper.customAttributes[key].apply(this, [].concat(params[key])); + this.attrs[key] = params[key]; + for (var subkey in par) if (par[has](subkey)) { + params[subkey] = par[subkey]; + } + } + // this.paper.canvas.style.display = "none"; + if (params.text && this.type == "text") { + this.textpath.string = params.text; + } + setFillAndStroke(this, params); + // this.paper.canvas.style.display = E; + } + return this; + }; + elproto.toFront = function () { + !this.removed && this.node.parentNode.appendChild(this.node); + this.paper && this.paper.top != this && R._tofront(this, this.paper); + return this; + }; + elproto.toBack = function () { + if (this.removed) { + return this; + } + if (this.node.parentNode.firstChild != this.node) { + this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild); + R._toback(this, this.paper); + } + return this; + }; + elproto.insertAfter = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[element.length - 1]; + } + if (element.node.nextSibling) { + element.node.parentNode.insertBefore(this.node, element.node.nextSibling); + } else { + element.node.parentNode.appendChild(this.node); + } + R._insertafter(this, element, this.paper); + return this; + }; + elproto.insertBefore = function (element) { + if (this.removed) { + return this; + } + if (element.constructor == R.st.constructor) { + element = element[0]; + } + element.node.parentNode.insertBefore(this.node, element.node); + R._insertbefore(this, element, this.paper); + return this; + }; + elproto.blur = function (size) { + var s = this.node.runtimeStyle, + f = s.filter; + f = f.replace(blurregexp, E); + if (+size !== 0) { + this.attrs.blur = size; + s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")"; + s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5)); + } else { + s.filter = f; + s.margin = 0; + delete this.attrs.blur; + } + return this; + }; + + R._engine.path = function (pathString, vml) { + var el = createNode("shape"); + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = vml.coordorigin; + var p = new Element(el, vml), + attr = {fill: "none", stroke: "#000"}; + pathString && (attr.path = pathString); + p.type = "path"; + p.path = []; + p.Path = E; + setFillAndStroke(p, attr); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.rect = function (vml, x, y, w, h, r) { + var path = R._rectPath(x, y, w, h, r), + res = vml.path(path), + a = res.attrs; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.r = r; + a.path = path; + res.type = "rect"; + return res; + }; + R._engine.ellipse = function (vml, x, y, rx, ry) { + var res = vml.path(), + a = res.attrs; + res.X = x - rx; + res.Y = y - ry; + res.W = rx * 2; + res.H = ry * 2; + res.type = "ellipse"; + setFillAndStroke(res, { + cx: x, + cy: y, + rx: rx, + ry: ry + }); + return res; + }; + R._engine.circle = function (vml, x, y, r) { + var res = vml.path(), + a = res.attrs; + res.X = x - r; + res.Y = y - r; + res.W = res.H = r * 2; + res.type = "circle"; + setFillAndStroke(res, { + cx: x, + cy: y, + r: r + }); + return res; + }; + R._engine.image = function (vml, src, x, y, w, h) { + var path = R._rectPath(x, y, w, h), + res = vml.path(path).attr({stroke: "none"}), + a = res.attrs, + node = res.node, + fill = node.getElementsByTagName(fillString)[0]; + a.src = src; + res.X = a.x = x; + res.Y = a.y = y; + res.W = a.width = w; + res.H = a.height = h; + a.path = path; + res.type = "image"; + fill.parentNode == node && node.removeChild(fill); + fill.rotate = true; + fill.src = src; + fill.type = "tile"; + res._.fillpos = [x, y]; + res._.fillsize = [w, h]; + node.appendChild(fill); + setCoords(res, 1, 1, 0, 0, 0); + return res; + }; + R._engine.text = function (vml, x, y, text) { + var el = createNode("shape"), + path = createNode("path"), + o = createNode("textpath"); + x = x || 0; + y = y || 0; + text = text || ""; + path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1); + path.textpathok = true; + o.string = Str(text); + o.on = true; + el.style.cssText = cssDot; + el.coordsize = zoom + S + zoom; + el.coordorigin = "0 0"; + var p = new Element(el, vml), + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; + p.shape = el; + p.path = path; + p.textpath = o; + p.type = "text"; + p.attrs.text = Str(text); + p.attrs.x = x; + p.attrs.y = y; + p.attrs.w = 1; + p.attrs.h = 1; + setFillAndStroke(p, attr); + el.appendChild(o); + el.appendChild(path); + vml.canvas.appendChild(el); + var skew = createNode("skew"); + skew.on = true; + el.appendChild(skew); + p.skew = skew; + p.transform(E); + return p; + }; + R._engine.setSize = function (width, height) { + var cs = this.canvas.style; + this.width = width; + this.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + cs.width = width; + cs.height = height; + cs.clip = "rect(0 " + width + " " + height + " 0)"; + if (this._viewBox) { + R._engine.setViewBox.apply(this, this._viewBox); + } + return this; + }; + R._engine.setViewBox = function (x, y, w, h, fit) { + R.eve("raphael.setViewBox", this, this._viewBox, [x, y, w, h, fit]); + var paperSize = this.getSize(), + width = paperSize.width, + height = paperSize.height, + H, W; + if (fit) { + H = height / h; + W = width / w; + if (w * H < width) { + x -= (width - w * H) / 2 / H; + } + if (h * W < height) { + y -= (height - h * W) / 2 / W; + } + } + this._viewBox = [x, y, w, h, !!fit]; + this._viewBoxShift = { + dx: -x, + dy: -y, + scale: paperSize + }; + this.forEach(function (el) { + el.transform("..."); + }); + return this; + }; + var createNode; + R._engine.initWin = function (win) { + var doc = win.document; + if (doc.styleSheets.length < 31) { + doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); + } else { + // no more room, add to the existing one + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + doc.styleSheets[0].addRule(".rvml", "behavior:url(#default#VML)"); + } + try { + !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml"); + createNode = function (tagName) { + return doc.createElement('<rvml:' + tagName + ' class="rvml">'); + }; + } catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); + }; + } + }; + R._engine.initWin(R._g.win); + R._engine.create = function () { + var con = R._getContainer.apply(0, arguments), + container = con.container, + height = con.height, + s, + width = con.width, + x = con.x, + y = con.y; + if (!container) { + throw new Error("VML container not found."); + } + var res = new R._Paper, + c = res.canvas = R._g.doc.createElement("div"), + cs = c.style; + x = x || 0; + y = y || 0; + width = width || 512; + height = height || 342; + res.width = width; + res.height = height; + width == +width && (width += "px"); + height == +height && (height += "px"); + res.coordsize = zoom * 1e3 + S + zoom * 1e3; + res.coordorigin = "0 0"; + res.span = R._g.doc.createElement("span"); + res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;"; + c.appendChild(res.span); + cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height); + if (container == 1) { + R._g.doc.body.appendChild(c); + cs.left = x + "px"; + cs.top = y + "px"; + cs.position = "absolute"; + } else { + if (container.firstChild) { + container.insertBefore(c, container.firstChild); + } else { + container.appendChild(c); + } + } + res.renderfix = function () {}; + return res; + }; + R.prototype.clear = function () { + R.eve("raphael.clear", this); + this.canvas.innerHTML = E; + this.span = R._g.doc.createElement("span"); + this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;"; + this.canvas.appendChild(this.span); + this.bottom = this.top = null; + }; + R.prototype.remove = function () { + R.eve("raphael.remove", this); + this.canvas.parentNode.removeChild(this.canvas); + for (var i in this) { + this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null; + } + return true; + }; + + var setproto = R.st; + for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) { + setproto[method] = (function (methodname) { + return function () { + var arg = arguments; + return this.forEach(function (el) { + el[methodname].apply(el, arg); + }); + }; + })(method); + } +})(); + + // EXPOSE + // SVG and VML are appended just before the EXPOSE line + // Even with AMD, Raphael should be defined globally + oldRaphael.was ? (g.win.Raphael = R) : (Raphael = R); + + if(typeof exports == "object"){ + module.exports = R; + } + return R; +})); diff --git a/vendor/gitignore/Android.gitignore b/vendor/gitignore/Android.gitignore index a836875126..f6b286cea9 100644 --- a/vendor/gitignore/Android.gitignore +++ b/vendor/gitignore/Android.gitignore @@ -2,7 +2,7 @@ *.apk *.ap_ -# Files for the Dalvik VM +# Files for the ART/Dalvik VM *.dex # Java class files @@ -34,6 +34,7 @@ captures/ # Intellij *.iml +.idea/workspace.xml # Keystore files *.jks diff --git a/vendor/gitignore/C++.gitignore b/vendor/gitignore/C++.gitignore index b8bd0267bd..4581ef2eee 100644 --- a/vendor/gitignore/C++.gitignore +++ b/vendor/gitignore/C++.gitignore @@ -15,6 +15,7 @@ # Fortran module files *.mod +*.smod # Compiled Static libraries *.lai diff --git a/vendor/gitignore/CMake.gitignore b/vendor/gitignore/CMake.gitignore index b558e9afa6..0cc7e4b527 100644 --- a/vendor/gitignore/CMake.gitignore +++ b/vendor/gitignore/CMake.gitignore @@ -4,3 +4,4 @@ CMakeScripts Makefile cmake_install.cmake install_manifest.txt +CTestTestfile.cmake diff --git a/vendor/gitignore/D.gitignore b/vendor/gitignore/D.gitignore index b4433f8a51..74b926fc90 100644 --- a/vendor/gitignore/D.gitignore +++ b/vendor/gitignore/D.gitignore @@ -18,3 +18,7 @@ .dub docs.json __dummy.html +docs/ + +# Code coverage +*.lst diff --git a/vendor/gitignore/Global/Bazaar.gitignore b/vendor/gitignore/Global/Bazaar.gitignore new file mode 100644 index 0000000000..3cbbcbd11e --- /dev/null +++ b/vendor/gitignore/Global/Bazaar.gitignore @@ -0,0 +1,2 @@ +.bzr/ +.bzrignore diff --git a/vendor/gitignore/Global/OSX.gitignore b/vendor/gitignore/Global/OSX.gitignore index 660b31353e..5972fe50f6 100644 --- a/vendor/gitignore/Global/OSX.gitignore +++ b/vendor/gitignore/Global/OSX.gitignore @@ -1,4 +1,4 @@ -.DS_Store +*.DS_Store .AppleDouble .LSOverride @@ -15,6 +15,7 @@ Icon .TemporaryItems .Trashes .VolumeIcon.icns +.com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB diff --git a/vendor/gitignore/Global/README.md b/vendor/gitignore/Global/README.md new file mode 100644 index 0000000000..06b6649bd9 --- /dev/null +++ b/vendor/gitignore/Global/README.md @@ -0,0 +1,10 @@ +## Globally Useful gitignores + +This directory contains globally useful gitignores, +e.g. OS-specific and editor specific. + +For more on global gitignores: +<https://help.github.com/articles/ignoring-files/#create-a-global-gitignore> + +And a good blog post about 'em: +<http://augustl.com/blog/2009/global_gitignores> diff --git a/vendor/gitignore/Global/SublimeText.gitignore b/vendor/gitignore/Global/SublimeText.gitignore index 1d4e613759..69c8c2b29c 100644 --- a/vendor/gitignore/Global/SublimeText.gitignore +++ b/vendor/gitignore/Global/SublimeText.gitignore @@ -12,3 +12,16 @@ # sftp configuration file sftp-config.json + +# Package control specific files +Package Control.last-run +Package Control.ca-list +Package Control.ca-bundle +Package Control.system-ca-bundle +Package Control.cache/ +Package Control.ca-certs/ +bh_unicode_properties.cache + +# Sublime-github package stores a github token in this file +# https://packagecontrol.io/packages/sublime-github +GitHub.sublime-settings diff --git a/vendor/gitignore/Haskell.gitignore b/vendor/gitignore/Haskell.gitignore index 096abdd90b..a4ee41ab62 100644 --- a/vendor/gitignore/Haskell.gitignore +++ b/vendor/gitignore/Haskell.gitignore @@ -16,3 +16,4 @@ cabal.sandbox.config *.hp *.eventlog .stack-work/ +cabal.project.local diff --git a/vendor/gitignore/Julia.gitignore b/vendor/gitignore/Julia.gitignore new file mode 100644 index 0000000000..381e0b6d25 --- /dev/null +++ b/vendor/gitignore/Julia.gitignore @@ -0,0 +1,4 @@ +*.jl.cov +*.jl.*.cov +*.jl.mem +deps/deps.jl diff --git a/vendor/gitignore/LICENSE b/vendor/gitignore/LICENSE new file mode 100644 index 0000000000..b8a103ac9b --- /dev/null +++ b/vendor/gitignore/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016 GitHub, Inc. + +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/vendor/gitignore/Laravel.gitignore b/vendor/gitignore/Laravel.gitignore index c491fa2bc6..1cd717b692 100644 --- a/vendor/gitignore/Laravel.gitignore +++ b/vendor/gitignore/Laravel.gitignore @@ -7,7 +7,6 @@ app/storage/ # Laravel 5 & Lumen specific bootstrap/cache/ -storage/ .env.*.php .env.php .env diff --git a/vendor/gitignore/Objective-C.gitignore b/vendor/gitignore/Objective-C.gitignore index 3020bc327a..86f21d8e0f 100644 --- a/vendor/gitignore/Objective-C.gitignore +++ b/vendor/gitignore/Objective-C.gitignore @@ -24,6 +24,8 @@ xcuserdata/ ## Obj-C/Swift specific *.hmap *.ipa +*.dSYM.zip +*.dSYM # CocoaPods # @@ -49,3 +51,10 @@ Carthage/Build fastlane/report.xml fastlane/screenshots + +#Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ diff --git a/vendor/gitignore/Qt.gitignore b/vendor/gitignore/Qt.gitignore index fa24b2efee..c7659c24f3 100644 --- a/vendor/gitignore/Qt.gitignore +++ b/vendor/gitignore/Qt.gitignore @@ -34,5 +34,5 @@ Makefile* *.qmlproject.user.* # QtCtreator CMake -CMakeLists.txt.user +CMakeLists.txt.user* diff --git a/vendor/gitignore/README.md b/vendor/gitignore/README.md deleted file mode 100644 index 43131e815c..0000000000 --- a/vendor/gitignore/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# .gitignore templates - -This directory contains language-specific .gitignore templates that are used by GitLab. - -These files were automatically pulled from [this repository](https://github.com/github/gitignore). -Please submit pull requests to that repository. There is no need to edit the files in this directory. - -## Bulk Update - -To update this directory with the latest changes in the repository, run: - -```sh -bundle exec rake gitlab:update_gitignore -``` diff --git a/vendor/gitignore/Rails.gitignore b/vendor/gitignore/Rails.gitignore index 2121e0a803..d8c256c192 100644 --- a/vendor/gitignore/Rails.gitignore +++ b/vendor/gitignore/Rails.gitignore @@ -16,6 +16,10 @@ pickle-email-*.html config/initializers/secret_token.rb config/secrets.yml +# dotenv +# TODO Comment out this rule if environment variables can be committed +.env + ## Environment normalization: /.bundle /vendor/bundle diff --git a/vendor/gitignore/Swift.gitignore b/vendor/gitignore/Swift.gitignore index 8a29fa52af..2c22487b5e 100644 --- a/vendor/gitignore/Swift.gitignore +++ b/vendor/gitignore/Swift.gitignore @@ -24,6 +24,8 @@ xcuserdata/ ## Obj-C/Swift specific *.hmap *.ipa +*.dSYM.zip +*.dSYM ## Playgrounds timeline.xctimeline diff --git a/vendor/gitignore/UnrealEngine.gitignore b/vendor/gitignore/UnrealEngine.gitignore index 75b1186b0a..be0e4913c3 100644 --- a/vendor/gitignore/UnrealEngine.gitignore +++ b/vendor/gitignore/UnrealEngine.gitignore @@ -37,6 +37,7 @@ *.suo *.opensdf *.sdf +*.VC.db *.VC.opendb # Precompiled Assets diff --git a/vendor/gitignore/VisualStudio.gitignore b/vendor/gitignore/VisualStudio.gitignore index f1e3d20e05..67acbf42f5 100644 --- a/vendor/gitignore/VisualStudio.gitignore +++ b/vendor/gitignore/VisualStudio.gitignore @@ -42,6 +42,7 @@ dlldata.c # DNX project.lock.json +project.fragment.lock.json artifacts/ *_i.c diff --git a/vendor/gitlab-ci-yml/Docker.gitlab-ci.yml b/vendor/gitlab-ci-yml/Docker.gitlab-ci.yml new file mode 100644 index 0000000000..396d3f1b04 --- /dev/null +++ b/vendor/gitlab-ci-yml/Docker.gitlab-ci.yml @@ -0,0 +1,7 @@ +# Official docker image. +image: docker:latest + +build: + stage: build + script: + - docker build -t test . diff --git a/vendor/gitlab-ci-yml/Elixir.gitlab-ci.yml b/vendor/gitlab-ci-yml/Elixir.gitlab-ci.yml new file mode 100644 index 0000000000..0b329aaf1c --- /dev/null +++ b/vendor/gitlab-ci-yml/Elixir.gitlab-ci.yml @@ -0,0 +1,18 @@ +# This template uses the non default language docker image +# The image already has Hex installed. You might want to consider to use `elixir:latest` +image: trenpixster/elixir:latest + +# Pic zero or more services to be used on all builds. +# Only needed when using a docker container to run your tests in. +# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service +services: + - mysql:latest + - redis:latest + - postgres:latest + +before_script: + - mix deps.get + +mix: + script: + - mix test diff --git a/vendor/gitlab-ci-yml/LICENSE b/vendor/gitlab-ci-yml/LICENSE new file mode 100644 index 0000000000..80f7b87b6c --- /dev/null +++ b/vendor/gitlab-ci-yml/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 GitLab.org + +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/vendor/gitlab-ci-yml/Nodejs.gitlab-ci.yml b/vendor/gitlab-ci-yml/Nodejs.gitlab-ci.yml new file mode 100644 index 0000000000..e5bce3503f --- /dev/null +++ b/vendor/gitlab-ci-yml/Nodejs.gitlab-ci.yml @@ -0,0 +1,27 @@ +# Official framework image. Look for the different tagged releases at: +# https://hub.docker.com/r/library/node/tags/ +image: node:latest + +# Pick zero or more services to be used on all builds. +# Only needed when using a docker container to run your tests in. +# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service +services: + - mysql:latest + - redis:latest + - postgres:latest + +# This folder is cached between builds +# http://docs.gitlab.com/ce/ci/yaml/README.html#cache +cache: + paths: + - node_modules/ + +test_async: + script: + - npm install + - node ./specs/start.js ./specs/async.spec.js + +test_db: + script: + - npm install + - node ./specs/start.js ./specs/db-postgres.spec.js diff --git a/vendor/gitlab-ci-yml/Pages/brunch.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/brunch.gitlab-ci.yml new file mode 100644 index 0000000000..7fcc0b436b --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/brunch.gitlab-ci.yml @@ -0,0 +1,16 @@ +# Full project: https://gitlab.com/pages/brunch +image: node:4.2.2 + +pages: + cache: + paths: + - node_modules/ + + script: + - npm install -g brunch + - brunch build --production + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/doxygen.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/doxygen.gitlab-ci.yml new file mode 100644 index 0000000000..791afdd23f --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/doxygen.gitlab-ci.yml @@ -0,0 +1,13 @@ +# Full project: https://gitlab.com/pages/doxygen +image: alpine + +pages: + script: + - apk update && apk add doxygen + - doxygen doxygen/Doxyfile + - mv doxygen/documentation/html/ public/ + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/harp.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/harp.gitlab-ci.yml new file mode 100644 index 0000000000..dd3ef14966 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/harp.gitlab-ci.yml @@ -0,0 +1,16 @@ +# Full project: https://gitlab.com/pages/harp +image: node:4.2.2 + +pages: + cache: + paths: + - node_modules + + script: + - npm install -g harp + - harp compile ./ public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/hexo.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/hexo.gitlab-ci.yml new file mode 100644 index 0000000000..b468d79bca --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/hexo.gitlab-ci.yml @@ -0,0 +1,25 @@ +# Full project: https://gitlab.com/pages/hexo +image: python:2.7 + +cache: + paths: + - vendor/ + +test: + stage: test + script: + - pip install hyde + - hyde gen + except: + - master + +pages: + stage: deploy + script: + - pip install hyde + - hyde gen -d public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/html.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/html.gitlab-ci.yml new file mode 100644 index 0000000000..249a168aa3 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/html.gitlab-ci.yml @@ -0,0 +1,12 @@ +# Full project: https://gitlab.com/pages/plain-html +pages: + stage: deploy + script: + - mkdir .public + - cp -r * .public + - mv .public public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/hugo.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/hugo.gitlab-ci.yml new file mode 100644 index 0000000000..45df697525 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/hugo.gitlab-ci.yml @@ -0,0 +1,11 @@ +# Full project: https://gitlab.com/pages/hugo +image: publysher/hugo + +pages: + script: + - hugo + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/hyde.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/hyde.gitlab-ci.yml new file mode 100644 index 0000000000..f5b40f2b9f --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/hyde.gitlab-ci.yml @@ -0,0 +1,25 @@ +# Full project: https://gitlab.com/pages/hyde +image: python:2.7 + +cache: + paths: + - vendor/ + +test: + stage: test + script: + - pip install hyde + - hyde gen + except: + - master + +pages: + stage: deploy + script: + - pip install hyde + - hyde gen -d public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/jekyll.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/jekyll.gitlab-ci.yml new file mode 100644 index 0000000000..36918fc005 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/jekyll.gitlab-ci.yml @@ -0,0 +1,24 @@ +# Full project: https://gitlab.com/pages/jekyll +image: ruby:2.3 + +test: + stage: test + script: + - gem install jekyll + - jekyll build -d test + artifacts: + paths: + - test + except: + - master + +pages: + stage: deploy + script: + - gem install jekyll + - jekyll build -d public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/lektor.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/lektor.gitlab-ci.yml new file mode 100644 index 0000000000..c5c44a5d86 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/lektor.gitlab-ci.yml @@ -0,0 +1,12 @@ +# Full project: https://gitlab.com/pages/hyde +image: python:2.7 + +pages: + script: + - pip install lektor + - lektor build --output-path public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/metalsmith.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/metalsmith.gitlab-ci.yml new file mode 100644 index 0000000000..50e8b7ccd4 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/metalsmith.gitlab-ci.yml @@ -0,0 +1,17 @@ +# Full project: https://gitlab.com/pages/metalsmith +image: node:4.2.2 + +pages: + cache: + paths: + - node_modules/ + + script: + - npm install -g metalsmith + - npm install + - make build + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/middleman.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/middleman.gitlab-ci.yml new file mode 100644 index 0000000000..9f4cc0574d --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/middleman.gitlab-ci.yml @@ -0,0 +1,27 @@ +# Full project: https://gitlab.com/pages/middleman +image: ruby:2.3 + +cache: + paths: + - vendor + +test: + script: + - apt-get update -yqqq + - apt-get install -y nodejs + - bundle install --path vendor + - bundle exec middleman build + except: + - master + +pages: + script: + - apt-get update -yqqq + - apt-get install -y nodejs + - bundle install --path vendor + - bundle exec middleman build + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/nanoc.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/nanoc.gitlab-ci.yml new file mode 100644 index 0000000000..b469b316ba --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/nanoc.gitlab-ci.yml @@ -0,0 +1,12 @@ +# Full project: https://gitlab.com/pages/nanoc +image: ruby:2.3 + +pages: + script: + - bundle install -j4 + - nanoc + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/octopress.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/octopress.gitlab-ci.yml new file mode 100644 index 0000000000..4762ec9acf --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/octopress.gitlab-ci.yml @@ -0,0 +1,15 @@ +# Full project: https://gitlab.com/pages/octopress +image: ruby:2.3 + +pages: + script: + - apt-get update -qq && apt-get install -qq nodejs + - bundle install -j4 + - bundle exec rake generate + - mv public .public + - mv .public/octopress public + artifacts: + paths: + - public + only: + - master diff --git a/vendor/gitlab-ci-yml/Pages/pelican.gitlab-ci.yml b/vendor/gitlab-ci-yml/Pages/pelican.gitlab-ci.yml new file mode 100644 index 0000000000..c5f3154f58 --- /dev/null +++ b/vendor/gitlab-ci-yml/Pages/pelican.gitlab-ci.yml @@ -0,0 +1,10 @@ +# Full project: https://gitlab.com/pages/pelican +image: python:2.7-alpine + +pages: + script: + - pip install -r requirements.txt + - pelican -s publishconf.py + artifacts: + paths: + - public/ diff --git a/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml b/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml new file mode 100644 index 0000000000..78f3e39949 --- /dev/null +++ b/vendor/gitlab-ci-yml/Ruby.gitlab-ci.yml @@ -0,0 +1,30 @@ +# Official language image. Look for the different tagged releases at: +# https://hub.docker.com/r/library/ruby/tags/ +image: "ruby:2.3" + +# Pick zero or more services to be used on all builds. +# Only needed when using a docker container to run your tests in. +# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service +services: + - mysql:latest + - redis:latest + - postgres:latest + +# This is a basic example for a gem or script which doesn't use +# services such as redis or postgres +before_script: + - gem install bundler # Bundler is not installed with the image + - bundle install -j $(nproc) # Install dependencies + +rubocop: + script: + - rubocop + +rspec: + script: + - rspec spec + +rails: + script: + - rake db:migrate + - rspec spec

    tY(lI&@D=2l={+IgI0>l4TKkNSs7*7ZO7qk3J71uAv{}(v?+X(u9np1Nz z`A^zTzg|yzBrBe0U^twL1cBbAWM%ck+E33{+NX-L=t_uykoUV67Hm%+)}!|2TBo~U xz#b3-L&MWS_8d&RDlpie>wd&wEA)RFURf+lI2n}`MR-p~>p<^8N;Dn?{}1}WvmXEe literal 15732 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 literal 8295 zcmYi~1ymf$uC#cOqQxDGdvRIZ7k8K9?!F5wx>&KLMT%>2Zz<4X#jUt)ad(%6-}~Nw z@BcYDBWIFHPLfG76Q`-Ji1Uj46%rB>jB;_^0+2w)~8W}mI zY0=)o0F~$G=VVx+WkfzKCq-G)L|#=-RZ=M-r(Di1IrUR?obButnvnv9r9=u! zT7jL6{bCe^r)H*oT+$%B2 z$tJ{JKg>Z_#sUNh54AM2P}engG}g1#13I_|F)gy@V#w2|*2>PVzo-Sqt z@iI~~w+9KT1PE#S&E~wflvnz|^tS&kL27QXx^I@0jKap|X26F6Tc2bD8(&*1=QN0u zthSS&qOFU?ds`K~xWr_CHxFJBSu0HuePPaxlvkrS&(BZ$Zqc8C4#}|i-~ekaMGH*KK0i>@L}ljFn?_4w7x*3 z9l_9cAD)*M=AIuXpxGq>5t%B?oCThA!?FaEN_dM{8s>bjBbbL0|ZjA)Cg^-1mOy~4W*3{N74%d|y z6maqgiU@NSQBn7V66-;mV6lxqTZ-DaNvj9ft(n0=mO&awNK{P9a?-j1i-#E!&h*lx zVHSR9$MZ6Va`R$_g!q?IRtB1;hKzjzCK!U5aF4DHTKSr>@H=GdGDG>=x+LJ^?mOdb zUDh=Ez7GCl0<&N2?i-e97AbC_`AsRq7mXum_G6;O9=54VoHG75GmGq zI>Us$3Tn6?+9h}R+fV?yVmH*w4Kr@60bHP)7C4Z3;2ELL+FMNl{NasW&&y; z6uFvA{+G~7p_WW@)9XJ1tMxS7gJg#&L8AE-pXs1>x~XAAQ>;&jF@!l7)$|B&H8hHa zm;p~@Fv~K?ZlRHbyX(k6)kOcE{pRAJVmAkwe7VV?h^DCL`}mci=1Kz#cgL)iU#w(8gZ{3FHDqtTTwtW zh#aPB8k^Wsqwz9xHQR!_O*35#5roU*XbKw?y{K$F3hm*m=#BEbnRU=*Mg!u9 zP$nipxvw@KRu zkcPAjsWED(rtDR?h%*saZ+&?b)rcDC)J>gbk7u3B+!zjzbImD$N3#jPp_8vxcM5pA zZN~I$*rq>PGs(y5od0@F9?1yA!PS`{sDh6InqT&gZ1IUlAb|OZ(^F1vX|&XfQ;h3w zapn;IchUsMcG&`580R?+)dA?|6CrEPo#Pjq@u8Pw#ny?xTnAnro%KngFZ|FG?v~;m z$2SQ&5C7sZ^-G-jKJ6WZX=>MH@c?M={2^mFvu|BKsf77$pm!Qd)L)NfA%f0N;J(z( ze@vp-@?U1@+EBQo5_-;sXF{hzG_|UH4+Wn`LP1?z%Arr^T?g6^ywVj2O&<2&7hi zR;I`0a@m@$H)<5|JitBT>Np!R0?Xc*U;1B)d+5I3XHpZ(!x|et84e%6l^mxkgkLFK zwy(y5=CZSond$$xorCi~wjZ1YP}{P*`}^g6Ui|{$I|qw@e&Bw?J@_la*8}ypBeE_D zW=~7gvb0~1Sd5%}s_ATK-n%m9yQ%yMt|6nq3O_Uw5l6onMCgA6)Gq zwBIksToB(8eXPh^vFyAgdDl~AjHV}lYOOZqL)qt>(w{ao(5gW-`r7KX zbgMuApui&O^#gQl^{obz@QLELRnfc4YvvGy2f@zxBcs9tuIOi?TLgZp|Cgl%Qd7(& z9JWh0KkK620S&6%Alb%}1nM(~5@E-hZ+ZBvvk6DE&Pi<@F{AM=5laE zFdMccmArjLUQ+a|jc%)I^->CT;b0N~++(l)$RnB3Yi5${C{7@_6`AmvD%$oiFLuTW zF&XNCTyH~={l;hWW648V;kX=y=s>=)#H|UOtxE=mh5F4a8utbzE~K zi{jow5FZ~u1$;RE0tX2R1DUoN>|oO-=J2-=L!!)rze1t~K5u7^a%aOE{4ENA@>Y~T zx(;HPrbut{0@5}JX{vz4CH;f=VuO~)OTvl9E=-wq(tQONikQsr2ch57l@ zXWDaV?c7|;`GvPDOO>3(U$r80rcV?HBuwwmPeg8(BeO4ZPy6q>DR!{jGqz10w2XOy zQ#>a}uIEqsecrVt(1e3xJdBUEYv>|iL+Q?9tI@TH?r!V5yXNy9u5D#v;uR6PD5coduiYwz;tMS=9N!-J-lF^J!n4MSxAdNGm*imuX zk)Ia1o%uz(JZuwvt38)r3-|h-!ATO{Y=Ka0jXkn}v&5(-s}o_)f>kYe%FQe*z@B!b>zkdF1;}w0CfuB_e3_DwSIeZw+dU%>^*~n zz~%J976BU}Yl#<8LSrPWVZ8mMHVILvI!&k%4I>N4AZM2dTlD_Nn#FBWH2NV&yqO<1 z>il6XsPmEyrgV*V9};_{XIc!H*#sHak8dG(MQUzx$v90-)4?8ukMDK&c}4OQdQcdg z`XfA+$zZFbJH7gXjdrhV+=CkJT}Az}rF`qs_hljNzN<9wlnA)lcN=A@-pF8tC{h9y zt-3m7fjBp!O|&GAVuO~aL~u4Dl2`XgrJ_r4Kd19~x9HoN@9xOoSYtfOJgzjLU1;yD6+kpOTZ#w-$)w@9PL-{zkQ)AphA{+$(>)9C`I~((1fn= zSH!N0ue|dp7nH7E#a2)zYBxQE$PEg@+|q%9eqNW_py48U&Zpt%XBm6p5z_Ucy_jgD z_~RQ~pp5ZrF>>Ey%uNtEt5z`*27LY<$hY>=?B;aDO|o~M;_ zPMgX~rE~F*T(UW|u=SE4$l#p&hn3HI$t|Y^AqSp!+gzB=4EIN?aida(PMt&s#ww|P zodJwMikUgB=jM2aF2QdUTs1R+J{xAgr3_Uh(-!O+$s(xpoI2Tg%MJPL(X4lzti>f5+W;ZU73`teeB^j4oKBkU@6#F{q6?LSSp4uC%aS-#CYF?_wp;C zFOyr*r=V%ym=CHN>gp||IY^KRtQW46+)>(%CO2d&#LRlhKaRyrY-U43kIqM@GTPGW zi-Kw0UgGOI%ibAV@u8#xdm43fBV8{`muONj`(u@n1X$p;b_*)YiNel(%lc)~C~>TQ zVedvJjS;Ju1Ns`TeeVZK1%9h$#Mn8NdyO_^w8dNF+53h~s0x*blG^%7Ny!E`=NnGD z_c%|ybTZVq%gV&kjd1C^6x8!HrphRODMBUoXv-vg7jFZu}vRH-24V z9@rT5O^4W6tWC9k{MAp@UorctN07_)_#>O8o3TrcUGKTE1s0_&@1VHP z#Ro!AH81Mhul}i+7M;yx(Q#z2XiJS!bkHnWCnmda-jEs4_>8Y=T0$mBEA!ePKg6s9 z!ITbCWb?E?a$K$xe32u2mF_sDko%=|)cvJ?bJGBCtkiG(4nwFTdkqoGVHj>ECep!( zS-V;0xV+qRlOelCHawvnA(_WMb^r6#{>___-4(^6bcxzxTuv1z+%OOYJN&e9I(_f7 zJp}7l6x_&L<49q-btvexvItSaZ+9|VKXSIwR^ftv%w3QZBwF9e1$RoHHAVXJ))~qv z`ly}HK9BJJh+Agn_*KI1i87~G$0*i6nswv|b=UcrgZE~Ug(1YD<24#xn8Qg+7*|*7 z$Qa$ZZ1_q01%;*2u;seLoTUlkWE6r_Cv+v2at_71|4EBdH-VNv{#yNm0fDPZn1qQ+ z??wE^)(EoB>WC-rU6xC*>IkC($!2gOUzy(&HPQ-b&}`G6K&Yc09ew|j^k(M^qdUWnGn7we}Zi) zJnZ9TBKuFg>HEetcLLF_P-etS9_*g~2ZRE}B+_a{N$#k*ms-y)mwNuYv(;Mbg{UCM zYqp6#LoCoSI5xKcWrKubvvmgRvHatH)zlR)vLX*5dAArH0ypf%jp*GSew1a(ucGFV z(GI~$_s2jmPf_(!EPZWmAcD@iNKA5VNiAf-<04%`FN(zj);{6(dlJsUR) z+q)0O_H}_n7msg!t1SHfe1Q?2nbk2IUoxS-?inR8Tedv>_cpXS$zGkbY&ong(y2d z7@kPpZ?>>}Dx*wwxGgtAneQB?rAf0SjkfwPm{X$Giz|<7hhkUP$V|`&W*qR~xwqqf zgS+@}@6Nv=E%z2P7>}w^*1p``g(p?oM2C{aRjiNmW0rYZ*MDuR!m(tJaT}RDhC?}A zs>oRR8aQ|7-!hXx(eE>gVZRBr{W9c6fJIie)mmH|7*cs& z@?uZu8QW9~{1>n9u3yvZNs%EZ#aSAF0fjo#ic7z6e;b+tx)}daU38TO$tZyf$mXOh zC9-oMp;FD~_na`Uv+ms-lC}9_O1KaF91=8EJYTX*;P?81A3s-6O3k=aHsLH6N+2Af z+$2wu6Mpbx8r!#yPdI3$dz{vO)6SoSn_CSTr)m60M&I(TI78vU|ZFa3-AErw7YcF6B`22<|JJlHjo2Iz~)Aod)mRtyDR#GACKA zKacK2^`V1BplT_CRKFf!$)`L zpn%0S{&@dv7@uA7i_)~y{a{eF_>w;GPH@0+2=|~S*g&#L8byn-_-&`!?wPYxVI6s# zFc4r=n_<5+c3<$rfVsPFbiB`9>XvEW1b{_voE>S4 zYeS<0)B{yY>K{9`s5#6Fm72~?nxKdZhOVoBv7BA&_!gSYs-do<{?65r9D1nhE`L71 zoP9?9l&{ouVbZRn0b0^K(Jz{Rf90~2>Ka>8DlP*28rj075Cm3nqqDZDp}*6(SSs2( zcUcm#s(zeHb%VspD5S2O#_*|f^}b?IVX@xjj5L%|#^!=sbO4}C)(;5I|3<6}FkK5A z{)B*Q7*1_ljzsKr-6K-bnMy!lM=Ag3H{EC9Uy6!)1YD6Ni00`(z@tx1%*|JgYudqB zYXjX`Q&Vc+43QTW6CFSl<)3B4kDpuv0KY}fmO`LrO$GYzd^bPLS7egVkO@1@N!t{65^Lewz8CzRH53LP> z?K9!45ZU>FZ>SF&7wlz#ini+GaREc_o?4_aw;KVA5Y3>(SqLB0$o|zlNWx+X`zxJ;Gi_IvoxD!_zhB zni6_>?QWml`tG|ghqvbArK%pQySWFLS~9D1QCzgtT!6DiX)F^&XWY(*o1_FX*$z@s z%vyb_c3GuXRtx`gf7JVw8-V`j$c#*b8XT-+|L}DkYRl;bj&?W#mG=L{A9R->?afdR z7`nQ4x4pO~x{LF6=XULRvgPEqKvXj6-B&=IxAc7aZYcK7GEd2Y#@C!KM|KsS9&+bP zl-SnIgkvr%2$O{>V$h%v{#@3>+M(d0d(2uK+*6#X*4Pg}j>$t+&Ga9l*}p`+=S$$< z-%FUE4f>wMX^U1q7)%1z0qD^6$<4Kk zzwS79T6v$IVEcO!QK%i4Ty@=-F;R*_xR>v~Yns^Zsi1b)@g9Q2od6McPm z7p{Z~sRLp*i}m*a-%)wqKxi7@Ja_uWJLUzk+~iV_EonTv#}SV0_2>TVS#Ke&5DMug zgcDxwijo?=bv*&vImPl)cJ`8Qu-#-YQItY$6TqowEZV?BC$RITpC{}3h_`Gt)GOIP zv!}^D*n2;cK%@yFI$_jiF8(yDVLVwI8UD!iI=eH_^h|cCFeP%8oBMk_ps8e4uXGWt zw|i}sVt}(zu@Jnwf#W)B&=sQI6c}re%AYVMZ!M2WleDOaYI| zAs!n^-|hc26q?@21lq^CCDAT|zUrsXXPkbZ!JHUZ)pu>HO#=D6y3f1Uqy9QI^`x}Q z@JIl3=HO2WU6{D0_{r>WSiEAExhD{DO?A|PP7g7wXu2A@A{^%~iCukwepkGec$2t% zM)Dot?X2mgb|+>U6Bi}4CFwnmAvdkQl&o|^f__$IP?-C?^-x3_fheT7j(3~q{$|y+ z`*s`g?~GhXGuhQ_I0dCuV3n71_74OiJET6Ye#c#Zyl_u5sD8l^QN5tvyYFHTNvd>t zHDdL2*IGzvC&%+k8*-1bLAd=e(;n~Q{RoS|ucxO&^}WAxmAgDfj=B0<0GV974Qi!A;LPzE1Gbn$Z3bG$wkzXioy=scOvuZZx*eT$z)?tJ+ZEpwv76i{L7tqO z@_t=fUdSd2j;mOjS#@1mFKHAoE}Goby_z+W>Zy&fLsFX+ywNmikr)qm*UG(aIb2E2 zGcFSNL$}Vza`~!hT#+P!nnb{u(${dbP=GzS_42Xsukg!Hj8o!3;OCbUs`xYZ$>w;d zi&tL7=V@Yvn>pD3udMm2O}jW%!d~eF?IgBlyw4KZe7nOtib!MMW~+=D2$x<?m0LvA?bXvyC>Bv@l&SX*k9bLMejCS?r%Nn3`iSNz#TjD(Leoa^ag_+xt@!lA> z6o=opo=ty(A~TY7-TqL&aHg^Ul+Xca)SA+*YW}VMv1ZG{e3noBqCLu@yLJ1XQAIeh z1GG}EO}K-OGp2ty^c^`kIC_7jo13QoJZBQY;io&u>WqW~W1_WfF^YxYnRfl;-!{+w ziNGy@^1FWZLuw-td!aHCfIj_;Ms2O_Ct?a#W`fdkxs^Z2Y07H7d|h1$*A5c7{4Cf) zlb*2%ArgA=-{kgpa$zraGqos3)c4|X0uUKqEa0e=RYun|+QXR3xH)N8-bbpfnIdQN zW|jz|NrRI3hP;@?m9_kXOzR@S&uYICF@wI>lO0%qn48jRm-h{Ldw65XBK~%~*~6bc z&Ex=Vid0xa9Ry|xt(e(F8z36LxKbyPs)v$&elnvp zc%V2BXlyzyknd#?f*A-i3?%rZRgFGhywub3<)y3B5`VEs%@(XB?v_2L8rC+7;l;Kr zCt%{i@&0uR?t-Ws=$(Yz1MEHoIUCM7BUYG|mqAQJKbqNgE^a2`LaW82hYR>YDyi-5v))M)dEnV{R6{Izg`fZw)-LO;){o4816Fa zP4}7GeY5yZfYX-X2Jm`1OGv15sA(2oKi0?4GU?IEwE(URI29kb`1`yhi&bs>j6V7e ziP{yc>gh>;^XZ#I8M)HqxqeIMXj1kd#$i2@7m;eEawa&-=O`12C0lNM3Q=1^s6(w~ zYiqaB1lDcIZ-eo~6VmqwNIqjMJ(A;G*ewB5XF@Zd)~^zWn=FHT$nWfU!UGLHK53Dp r9FiwFyuVVP))4Fc&x0Rf(DlMBIA$MMu@wK$zqPWwx?GKnWyJpge)>zK diff --git a/doc/workflow/add-user/img/add_user_search_people.png b/doc/workflow/add-user/img/add_user_search_people.png index 5ac10ce80d4892a3cfdd125f824b5d9f0d3ace6e..eaa062376f45d7ae71cd04d942a0526a0fe60cc4 100644 GIT binary patch literal 39941 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 Yv=-zmAJAu!BRGRFwlpd`=kmwD0fT~)O8@`> literal 13518 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 diff --git a/doc/workflow/add-user/img/request_access_button.png b/doc/workflow/add-user/img/request_access_button.png new file mode 100644 index 0000000000000000000000000000000000000000..984d640b0f0ef6325d8b67268bc7c87ce4d4ef1b GIT binary patch literal 36588 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 TFrES200000NkvXXu0mjfaQ9R_ literal 0 HcmV?d00001 diff --git a/doc/workflow/groups.md b/doc/workflow/groups.md index 34ada1774d..1a316e8097 100644 --- a/doc/workflow/groups.md +++ b/doc/workflow/groups.md @@ -51,6 +51,28 @@ If necessary, you can increase the access level of an individual user for a spec ![Barry effectively has 'Master' access to GitLab CI now](groups/override_access_level.png) +## Request access to a group + +As a user, you can request to be a member of a group. Go to the group you'd +like to be a member of, and click the **Request Access** button on the right +side of your screen. + +![Request access button](groups/request_access_button.png) + +--- + +Group owners & masters will be notified of your request and will be able to approve or +decline it on the members page. + +![Manage access requests](groups/access_requests_management.png) + +--- + +If you change your mind before your request is approved, just click the +**Withdraw Access Request** button. + +![Withdraw access request button](groups/withdraw_access_request_button.png) + ## Managing group memberships via LDAP In GitLab Enterprise Edition it is possible to manage GitLab group memberships using LDAP groups. diff --git a/doc/workflow/groups/access_requests_management.png b/doc/workflow/groups/access_requests_management.png new file mode 100644 index 0000000000000000000000000000000000000000..ffede8e9bd68495ad70e5ac2b12fc47d7da03260 GIT binary patch literal 15193 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