diff options
76 files changed, 1137 insertions, 337 deletions
diff --git a/app/assets/javascripts/branches/branches_delete_modal.js b/app/assets/javascripts/branches/branches_delete_modal.js new file mode 100644 index 00000000000..af8bcdc1794 --- /dev/null +++ b/app/assets/javascripts/branches/branches_delete_modal.js @@ -0,0 +1,36 @@ +const MODAL_SELECTOR = '#modal-delete-branch'; + +class DeleteModal { + constructor() { + this.$modal = $(MODAL_SELECTOR); + this.$toggleBtns = $(`[data-target="${MODAL_SELECTOR}"]`); + this.$branchName = $('.js-branch-name', this.$modal); + this.$confirmInput = $('.js-delete-branch-input', this.$modal); + this.$deleteBtn = $('.js-delete-branch', this.$modal); + this.bindEvents(); + } + + bindEvents() { + this.$toggleBtns.on('click', this.setModalData.bind(this)); + this.$confirmInput.on('input', this.setDeleteDisabled.bind(this)); + } + + setModalData(e) { + this.branchName = e.currentTarget.dataset.branchName || ''; + this.deletePath = e.currentTarget.dataset.deletePath || ''; + this.updateModal(); + } + + setDeleteDisabled(e) { + this.$deleteBtn.attr('disabled', e.currentTarget.value !== this.branchName); + } + + updateModal() { + this.$branchName.text(this.branchName); + this.$confirmInput.val(''); + this.$deleteBtn.attr('href', this.deletePath); + this.$deleteBtn.attr('disabled', true); + } +} + +export default DeleteModal; diff --git a/app/assets/javascripts/dispatcher.js b/app/assets/javascripts/dispatcher.js index d27d89cf91d..bf802056d36 100644 --- a/app/assets/javascripts/dispatcher.js +++ b/app/assets/javascripts/dispatcher.js @@ -38,6 +38,7 @@ import Issue from './issue'; import BindInOut from './behaviors/bind_in_out'; +import DeleteModal from './branches/branches_delete_modal'; import Group from './group'; import GroupName from './group_name'; import GroupsList from './groups_list'; @@ -180,6 +181,7 @@ const ShortcutsBlob = require('./shortcuts_blob'); break; case 'projects:branches:index': gl.AjaxLoadingSpinner.init(); + new DeleteModal(); break; case 'projects:issues:new': case 'projects:issues:edit': diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss index c9a25946ffd..d76053fe72a 100644 --- a/app/assets/stylesheets/framework/lists.scss +++ b/app/assets/stylesheets/framework/lists.scss @@ -152,6 +152,7 @@ ul.content-list { margin-top: 3px; margin-bottom: 4px; + &.has-tooltip, &:last-child { margin-right: 0; diff --git a/app/controllers/projects/branches_controller.rb b/app/controllers/projects/branches_controller.rb index f0f031303d8..59247280559 100644 --- a/app/controllers/projects/branches_controller.rb +++ b/app/controllers/projects/branches_controller.rb @@ -73,13 +73,17 @@ class Projects::BranchesController < Projects::ApplicationController def destroy @branch_name = Addressable::URI.unescape(params[:id]) - status = DeleteBranchService.new(project, current_user).execute(@branch_name) + result = DeleteBranchService.new(project, current_user).execute(@branch_name) + respond_to do |format| format.html do - redirect_to namespace_project_branches_path(@project.namespace, - @project), status: 303 + flash_type = result[:status] == :error ? :alert : :notice + flash[flash_type] = result[:message] + + redirect_to namespace_project_branches_path(@project.namespace, @project), status: 303 end - format.js { render nothing: true, status: status[:return_code] } + + format.js { render nothing: true, status: result[:return_code] } end end diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index e13f0bde315..750c3ec486a 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -48,7 +48,7 @@ class Projects::TagsController < Projects::ApplicationController respond_to do |format| if result[:status] == :success format.html do - redirect_to namespace_project_tags_path(@project.namespace, @project) + redirect_to namespace_project_tags_path(@project.namespace, @project), status: 303 end format.js @@ -57,7 +57,7 @@ class Projects::TagsController < Projects::ApplicationController format.html do redirect_to namespace_project_tags_path(@project.namespace, @project), - alert: @error + alert: @error, status: 303 end format.js do diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index b7a28b1b4a7..59519c1335b 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -1,14 +1,4 @@ module BranchesHelper - def can_remove_branch?(project, branch_name) - if ProtectedBranch.protected?(project, branch_name) - false - elsif branch_name == project.repository.root_ref - false - else - can?(current_user, :push_code, project) - end - end - def filter_branches_path(options = {}) exist_opts = { search: params[:search], diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 2c4033146bf..75d04fd2b08 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -142,12 +142,6 @@ class CommitStatus < ActiveRecord::Base canceled? && auto_canceled_by_id? end - # Added in 9.0 to keep backward compatibility for projects exported in 8.17 - # and prior. - def gl_project_id - 'dummy' - end - def detailed_status(current_user) Gitlab::Ci::Status::Factory .new(self, current_user) diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index 8f25ac30a22..3959b895f44 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -98,7 +98,7 @@ class ProjectPolicy < BasePolicy end def master_access! - can! :push_code_to_protected_branches + can! :delete_protected_branch can! :update_project_snippet can! :update_environment can! :update_deployment @@ -173,7 +173,7 @@ class ProjectPolicy < BasePolicy def archived_access! cannot! :create_merge_request cannot! :push_code - cannot! :push_code_to_protected_branches + cannot! :delete_protected_branch cannot! :update_merge_request cannot! :admin_merge_request end @@ -211,7 +211,7 @@ class ProjectPolicy < BasePolicy unless repository_enabled cannot! :push_code - cannot! :push_code_to_protected_branches + cannot! :delete_protected_branch cannot! :download_code cannot! :fork_project cannot! :read_commit_status diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb index 38a113caec7..64b3c0118fb 100644 --- a/app/services/delete_branch_service.rb +++ b/app/services/delete_branch_service.rb @@ -3,22 +3,14 @@ class DeleteBranchService < BaseService repository = project.repository branch = repository.find_branch(branch_name) - unless branch - return error('No such branch', 404) - end - - if branch_name == repository.root_ref - return error('Cannot remove HEAD branch', 405) - end - - if ProtectedBranch.protected?(project, branch_name) - return error('Protected branch cant be removed', 405) - end - unless current_user.can?(:push_code, project) return error('You dont have push access to repo', 405) end + unless branch + return error('No such branch', 404) + end + if repository.rm_branch(current_user, branch_name) success('Branch was removed') else diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index 0f9ef3eded3..8b35a037c55 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -30,13 +30,34 @@ = render 'projects/buttons/download', project: @project, ref: branch.name, pipeline: @refs_pipelines[branch.name] - if can?(current_user, :push_code, @project) - = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), - class: "btn btn-remove remove-row js-ajax-loading-spinner #{can_remove_branch?(@project, branch.name) ? '' : 'disabled'}", - method: :delete, - data: { confirm: "Deleting the '#{branch.name}' branch cannot be undone. Are you sure?" }, - remote: true, - "aria-label" => "Delete branch" do - = icon("trash-o") + - if branch.name == @project.repository.root_ref + %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip disabled", + disabled: true, + title: "The default branch cannot be deleted" } + = icon("trash-o") + - elsif protected_branch?(@project, branch) + - if can?(current_user, :delete_protected_branch, @project) + %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip", + title: "Delete protected branch", + data: { toggle: "modal", + target: "#modal-delete-branch", + delete_path: namespace_project_branch_path(@project.namespace, @project, branch.name), + branch_name: branch.name } } + = icon("trash-o") + - else + %button{ class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip disabled", + disabled: true, + title: "Only a project master or owner can delete a protected branch" } + = icon("trash-o") + - else + = link_to namespace_project_branch_path(@project.namespace, @project, branch.name), + class: "btn btn-remove remove-row js-ajax-loading-spinner has-tooltip", + title: "Delete branch", + method: :delete, + data: { confirm: "Deleting the '#{branch.name}' branch cannot be undone. Are you sure?" }, + remote: true, + "aria-label" => "Delete branch" do + = icon("trash-o") - if branch.name != @repository.root_ref .divergence-graph{ title: "#{number_commits_ahead} commits ahead, #{number_commits_behind} commits behind #{@repository.root_ref}" } diff --git a/app/views/projects/branches/_delete_protected_modal.html.haml b/app/views/projects/branches/_delete_protected_modal.html.haml new file mode 100644 index 00000000000..c5888afa54d --- /dev/null +++ b/app/views/projects/branches/_delete_protected_modal.html.haml @@ -0,0 +1,34 @@ +#modal-delete-branch.modal{ tabindex: -1 } + .modal-dialog + .modal-content + .modal-header + %button.close{ data: { dismiss: 'modal' } } × + %h3.page-title + Delete protected branch + = surround "'", "'?" do + %span.js-branch-name>[branch name] + + .modal-body + %p + You’re about to permanently delete the protected branch + = succeed '.' do + %strong.js-branch-name [branch name] + %p + Once you confirm and press + = succeed ',' do + %strong Delete protected branch + it cannot be undone or recovered. + %p + %strong To confirm, type + %kbd.js-branch-name [branch name] + + .form-group + = text_field_tag 'delete_branch_input', '', class: 'form-control js-delete-branch-input' + + .modal-footer + %button.btn{ data: { dismiss: 'modal' } } Cancel + = link_to 'Delete protected branch', '', + class: "btn btn-danger js-delete-branch", + title: 'Delete branch', + method: :delete, + "aria-label" => "Delete" diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index 91b86280e4c..4bade77a077 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -37,3 +37,5 @@ = paginate @branches, theme: 'gitlab' - else .nothing-here-block No branches to show + += render 'projects/branches/delete_protected_modal' diff --git a/changelogs/unreleased/document-foreign-keys.yml b/changelogs/unreleased/document-foreign-keys.yml new file mode 100644 index 00000000000..faa467e8185 --- /dev/null +++ b/changelogs/unreleased/document-foreign-keys.yml @@ -0,0 +1,4 @@ +--- +title: Add documentation about adding foreign keys +merge_request: +author: diff --git a/doc/README.md b/doc/README.md index 4397465bd3d..7bab42bc135 100644 --- a/doc/README.md +++ b/doc/README.md @@ -60,11 +60,8 @@ Manage files and branches from the UI (user interface): ### Issues and Merge Requests (MRs) - [Discussions](user/discussions/index.md) Threads, comments, and resolvable discussions in issues, commits, and merge requests. -- Issues - - [Create an issue](gitlab-basics/create-issue.md#how-to-create-an-issue-in-gitlab) - - [Confidential Issues](user/project/issues/confidential_issues.md) - - [Automatic issue closing](user/project/issues/automatic_issue_closing.md) - - [Issue Boards](user/project/issue_board.md) +- [Issues](user/project/issues/index.md) +- [Issue Board](user/project/issue_board.md) - [Issues and merge requests templates](user/project/description_templates.md): Create templates for submitting new issues and merge requests. - [Labels](user/project/labels.md): Categorize your issues or merge requests based on descriptive titles. - [Merge Requests](user/project/merge_requests/index.md) diff --git a/doc/administration/high_availability/database.md b/doc/administration/high_availability/database.md index c22b1af8bfb..da9687aa849 100644 --- a/doc/administration/high_availability/database.md +++ b/doc/administration/high_availability/database.md @@ -27,7 +27,7 @@ If you use a cloud-managed service, or provide your own PostgreSQL: steps on the download page. 1. Create/edit `/etc/gitlab/gitlab.rb` and use the following configuration. Be sure to change the `external_url` to match your eventual GitLab front-end - URL. + URL. If there is a directive listed below that you do not see in the configuration, be sure to add it. ```ruby external_url 'https://gitlab.example.com' @@ -39,6 +39,8 @@ If you use a cloud-managed service, or provide your own PostgreSQL: unicorn['enable'] = false sidekiq['enable'] = false redis['enable'] = false + prometheus['enable'] = false + gitaly['enable'] = false gitlab_workhorse['enable'] = false mailroom['enable'] = false diff --git a/doc/administration/high_availability/redis.md b/doc/administration/high_availability/redis.md index 4638a9c9782..0e92f7c5a34 100644 --- a/doc/administration/high_availability/redis.md +++ b/doc/administration/high_availability/redis.md @@ -42,10 +42,10 @@ instances run in different machines. If you fail to provision the machines in that specific way, any issue with the shared environment can bring your entire setup down. -It is OK to run a Sentinel along with a master or slave Redis instance. -No more than one Sentinel in the same machine though. +It is OK to run a Sentinel alongside of a master or slave Redis instance. +There should be no more than one Sentinel on the same machine though. -You also need to take in consideration the underlying network topology, +You also need to take into consideration the underlying network topology, making sure you have redundant connectivity between Redis / Sentinel and GitLab instances, otherwise the networks will become a single point of failure. @@ -113,7 +113,7 @@ the Omnibus GitLab package in `5` **independent** machines, both with ### Redis setup overview You must have at least `3` Redis servers: `1` Master, `2` Slaves, and they -need to be each in a independent machine (see explanation above). +need to each be on independent machines (see explanation above). You can have additional Redis nodes, that will help survive a situation where more nodes goes down. Whenever there is only `2` nodes online, a failover @@ -232,7 +232,7 @@ Pick the one that suits your needs. This is the section where we install and setup the new Redis instances. >**Notes:** -- We assume that you install GitLab and all HA components from scratch. If you +- We assume that you have installed GitLab and all HA components from scratch. If you already have it installed and running, read how to [switch from a single-machine installation to Redis HA](#switching-from-an-existing-single-machine-installation-to-redis-ha). - Redis nodes (both master and slaves) will need the same password defined in @@ -245,10 +245,9 @@ The prerequisites for a HA Redis setup are the following: 1. Provision the minimum required number of instances as specified in the [recommended setup](#recommended-setup) section. -1. **Do NOT** install Redis or Redis Sentinel in the same machines your - GitLab application is running on. You can however opt in to install Redis - and Sentinel in the same machine (each in independent ones is recommended - though). +1. We **Do not** recommend installing Redis or Redis Sentinel in the same machines your + GitLab application is running on as this weakens your HA configuration. You can however opt in to install Redis + and Sentinel in the same machine. 1. All Redis nodes must be able to talk to each other and accept incoming connections over Redis (`6379`) and Sentinel (`26379`) ports (unless you change the default ones). diff --git a/doc/development/README.md b/doc/development/README.md index d04380e5b33..63db332b557 100644 --- a/doc/development/README.md +++ b/doc/development/README.md @@ -48,6 +48,7 @@ - [What requires downtime?](what_requires_downtime.md) - [Adding database indexes](adding_database_indexes.md) - [Post Deployment Migrations](post_deployment_migrations.md) +- [Foreign Keys & Associations](foreign_keys.md) ## Compliance diff --git a/doc/development/foreign_keys.md b/doc/development/foreign_keys.md new file mode 100644 index 00000000000..0ab0deb156f --- /dev/null +++ b/doc/development/foreign_keys.md @@ -0,0 +1,63 @@ +# Foreign Keys & Associations + +When adding an association to a model you must also add a foreign key. For +example, say you have the following model: + +```ruby +class User < ActiveRecord::Base + has_many :posts +end +``` + +Here you will need to add a foreign key on column `posts.user_id`. This ensures +that data consistency is enforced on database level. Foreign keys also mean that +the database can very quickly remove associated data (e.g. when removing a +user), instead of Rails having to do this. + +## Adding Foreign Keys In Migrations + +Foreign keys can be added concurrently using `add_concurrent_foreign_key` as +defined in `Gitlab::Database::MigrationHelpers`. See the [Migration Style +Guide](migration_style_guide.md) for more information. + +Keep in mind that you can only safely add foreign keys to existing tables after +you have removed any orphaned rows. The method `add_concurrent_foreign_key` +does not take care of this so you'll need to do so manually. + +## Cascading Deletes + +Every foreign key must define an `ON DELETE` clause, and in 99% of the cases +this should be set to `CASCADE`. + +## Indexes + +When adding a foreign key in PostgreSQL the column is not indexed automatically, +thus you must also add a concurrent index. Not doing so will result in cascading +deletes being very slow. + +## Dependent Removals + +Don't define options such as `dependent: :destroy` or `dependent: :delete` when +defining an association. Defining these options means Rails will handle the +removal of data, instead of letting the database handle this in the most +efficient way possible. + +In other words, this is bad and should be avoided at all costs: + +```ruby +class User < ActiveRecord::Base + has_many :posts, dependent: :destroy +end +``` + +Should you truly have a need for this it should be approved by a database +specialist first. + +You should also not define any `before_destroy` or `after_destroy` callbacks on +your models _unless_ absolutely required and only when approved by database +specialists. For example, if each row in a table has a corresponding file on a +file system it may be tempting to add a `after_destroy` hook. This however +introduces non database logic to a model, and means we can no longer rely on +foreign keys to remove the data as this would result in the filesystem data +being left behind. In such a case you should use a service class instead that +takes care of removing non database data. diff --git a/doc/gitlab-basics/README.md b/doc/gitlab-basics/README.md index d7e3aa35bdd..12466437edc 100644 --- a/doc/gitlab-basics/README.md +++ b/doc/gitlab-basics/README.md @@ -11,5 +11,5 @@ Step-by-step guides on the basics of working with Git and GitLab. - [Fork a project](fork-project.md) - [Add a file](add-file.md) - [Add an image](add-image.md) -- [Create an issue](create-issue.md) +- [Create an issue](../user/project/issues/create_new_issue.md) - [Create a merge request](add-merge-request.md) diff --git a/doc/gitlab-basics/create-issue.md b/doc/gitlab-basics/create-issue.md index 13e5a738c89..abb163dbf18 100644 --- a/doc/gitlab-basics/create-issue.md +++ b/doc/gitlab-basics/create-issue.md @@ -1,30 +1,2 @@ -# How to create an Issue in GitLab -The issue tracker is a good place to add things that need to be improved or -solved in a project. - ---- - -1. Go to the project where you'd like to create the issue and navigate to the - **Issues** tab on top. - - ![Issues](img/project_navbar.png) - -1. Click on the **New issue** button on the right side of your screen. - - ![New issue](img/new_issue_button.png) - -1. At the very minimum, add a title and a description to your issue. - You may assign it to a user, add a milestone or add labels (all optional). - - ![Issue title and description](img/new_issue_page.png) - -1. When ready, click on **Submit issue**. - ---- - -Your Issue will now be added to the issue tracker of the project you opened it -at and will be ready to be reviewed. You can comment on it and mention the -people involved. You can also link issues to the merge requests where the issues -are solved. To do this, you can use an -[issue closing pattern](../user/project/issues/automatic_issue_closing.md). +This document was moved to [another location](../user/project/issues/index.md#new-issue). diff --git a/doc/intro/README.md b/doc/intro/README.md index d52b180a076..7485912d1a2 100644 --- a/doc/intro/README.md +++ b/doc/intro/README.md @@ -11,7 +11,7 @@ Create projects and groups. Create issues, labels, milestones, cast your vote, and review issues. -- [Create a new issue](../gitlab-basics/create-issue.md) +- [Create a new issue](../user/project/issues/index.md#new-issue) - [Assign labels to issues](../user/project/labels.md) - [Use milestones as an overview of your project's tracker](../user/project/milestones/index.md) - [Use voting to express your like/dislike to issues and merge requests](../workflow/award_emoji.md) diff --git a/doc/user/project/issues/closing_issues.md b/doc/user/project/issues/closing_issues.md new file mode 100644 index 00000000000..dcfa5ff59b2 --- /dev/null +++ b/doc/user/project/issues/closing_issues.md @@ -0,0 +1,59 @@ +# Closing Issues + +Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues. + +## Directly + +Whenever you decide that's no longer need for that issue, +close the issue using the close button: + +![close issue - button](img/button_close_issue.png) + +## Via Merge Request + +When a merge request resolves the discussion over an issue, you can +make it close that issue(s) when merged. + +All you need is to use a [keyword](automatic_issue_closing.md) +accompanying the issue number, add to the description of that MR. + +In this example, the keyword "closes" prefixing the issue number will create a relationship +in such a way that the merge request will close the issue when merged. + +Mentioning various issues in the same line also works for this purpose: + +```md +Closes #333, #444, #555 and #666 +``` + +If the issue is in a different repository rather then the MR's, +add the full URL for that issue(s): + +```md +Closes #333, #444, and https://gitlab.com/<username>/<projectname>/issues/<xxx> +``` + +All the following keywords will produce the same behaviour: + +- Close, Closes, Closed, Closing, close, closes, closed, closing +- Fix, Fixes, Fixed, Fixing, fix, fixes, fixed, fixing +- Resolve, Resolves, Resolved, Resolving, resolve, resolves, resolved, resolving + +![merge request closing issue when merged](img/merge_request_closes_issue.png) + +If you use any other word before the issue number, the issue and the MR will +link to each other, but the MR will NOT close the issue(s) when merged. + +![mention issues in MRs - closing and related](img/closing_and_related_issues.png) + +## From the Issue Board + +You can close an issue from [Issue Boards](../issue_board.md) by draging an issue card +from its list and dropping into **Closed**. + +![close issue from the Issue Board](img/close_issue_from_board.gif) + +## Customizing the issue closing patern + +Alternatively, a GitLab **administrator** can +[customize the issue closing patern](../../../administration/issue_closing_pattern.md). diff --git a/doc/user/project/issues/create_new_issue.md b/doc/user/project/issues/create_new_issue.md new file mode 100644 index 00000000000..9af088374a1 --- /dev/null +++ b/doc/user/project/issues/create_new_issue.md @@ -0,0 +1,38 @@ +# Create a new Issue + +Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues. + +When you create a new issue, you'll be prompted to fill in +the information illustrated on the image below. + +![New issue from the issues list](img/new_issue.png) + +Read through the [issues functionalities documentation](issues_functionalities.md#issues-functionalities) +to understand these fields one by one. + +## New issue from the Issue Tracker + +Navigate to your **Project's Dashboard** > **Issues** > **New Issue** to create a new issue: + +![New issue from the issue list view](img/new_issue_from_tracker_list.png) + +## New issue from an opened issue + +From an **opened issue** in your project, click **New Issue** to create a new +issue in the same project: + +![New issue from an open issue](img/new_issue_from_open_issue.png) + +## New issue from the project's dashboard + +From your **Project's Dashboard**, click the plus sign (**+**) to open a dropdown +menu with a few options. Select **New Issue** to create an issue in that project: + +![New issue from a project's dashboard](img/new_issue_from_projects_dashboard.png) + +## New issue from the Issue Board + +From an Issue Board, create a new issue by clicking on the plus sign (**+**) on the top of a list. +It opens a new issue for that project labeled after its respective list. + +![From the issue board](img/new_issue_from_issue_board.png) diff --git a/doc/user/project/issues/crosslinking_issues.md b/doc/user/project/issues/crosslinking_issues.md new file mode 100644 index 00000000000..5cc7ea383ae --- /dev/null +++ b/doc/user/project/issues/crosslinking_issues.md @@ -0,0 +1,63 @@ +# Crosslinking Issues + +Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues. + +## From Commit Messages + +Every time you mention an issue in your commit message, you're creating +a relationship between the two stages of the development workflow: the +issue itself and the first commit related to that issue. + +If the issue and the code you're committing are both in the same project, +you simply add `#xxx` to the commit message, where `xxx` is the issue number. +If they are not in the same project, you can add the full URL to the issue +(`https://gitlab.com/<username>/<projectname>/issues/<xxx>`). + +```shell +git commit -m "this is my commit message. Ref #xxx" +``` + +or + +```shell +git commit -m "this is my commit message. Related to https://gitlab.com/<username>/<projectname>/issues/<xxx>" +``` + +Of course, you can replace `gitlab.com` with the URL of your own GitLab instance. + +**Note:** Linking your first commit to your issue is going to be relevant +for tracking your process far ahead with +[GitLab Cycle Analytics](https://about.gitlab.com/features/cycle-analytics/)). +It will measure the time taken for planning the implementation of that issue, +which is the time between creating an issue and making the first commit. + +## From Related Issues + +Mentioning related issues in merge requests and other issues is useful +for your team members and collaborators to know that there are opened +issues around that same idea. + +You do that as explained above, when +[mentioning an issue from a commit message](#from-commit-messages). + +When mentioning the issue "A" in a issue "B", the issue "A" will also +display a notification in its tracker. The same is valid for mentioning +issues in merge requests. + +![issue mentioned in issue](img/mention_in_issue.png) + +## From Merge Requests + +Mentioning issues in merge request comments work exactly the same way +they do for [related issues](#from-related-issues). + +When you mention an issue in a merge request description, you can either +[close the issue as soon as the merge request is merged](closing_issues.md#via-merge-request), +or simply link both issue and merge request as described in the +[closing issues documentation](closing_issues.md#from-related-issues). + +![issue mentioned in MR](img/mention_in_merge_request.png) + +### Close an issue by merging a merge request + +To [close an issue when a merge request is merged](closing_issues.md#via-merge-request), use the [automatic issue closing patern](automatic_issue_closing.md). diff --git a/doc/user/project/issues/due_dates.md b/doc/user/project/issues/due_dates.md index b516d47ffa3..e0c405353ce 100644 --- a/doc/user/project/issues/due_dates.md +++ b/doc/user/project/issues/due_dates.md @@ -2,6 +2,8 @@ > [Introduced][ce-3614] in GitLab 8.7. +Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues. + Due dates can be used in issues to keep track of deadlines and make sure features are shipped on time. Due dates require at least [Reporter permissions][permissions] to be able to edit them. On the contrary, they can be seen by everybody. @@ -22,8 +24,8 @@ Changes are saved immediately. ## Making use of due dates -Issues that have a due date can be distinctively seen in the issues index page -with a calendar icon next to them. Issues where the date is past due will have +Issues that have a due date can be distinctively seen in the issue tracker +displaying a date next to them. Issues where the date is overdue will have the icon and the date colored red. You can sort issues by those that are _Due soon_ or _Due later_ from the dropdown menu in the right. diff --git a/doc/user/project/issues/img/button_close_issue.png b/doc/user/project/issues/img/button_close_issue.png Binary files differnew file mode 100755 index 00000000000..8fb2e23f58a --- /dev/null +++ b/doc/user/project/issues/img/button_close_issue.png diff --git a/doc/user/project/issues/img/close_issue_from_board.gif b/doc/user/project/issues/img/close_issue_from_board.gif Binary files differnew file mode 100644 index 00000000000..4814b42687b --- /dev/null +++ b/doc/user/project/issues/img/close_issue_from_board.gif diff --git a/doc/user/project/issues/img/closing_and_related_issues.png b/doc/user/project/issues/img/closing_and_related_issues.png Binary files differnew file mode 100755 index 00000000000..c6543e85fdb --- /dev/null +++ b/doc/user/project/issues/img/closing_and_related_issues.png diff --git a/doc/user/project/issues/img/confidential_issues_create.png b/doc/user/project/issues/img/confidential_issues_create.png Binary files differindex d259255599d..0a141eb39f8 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_create.png +++ b/doc/user/project/issues/img/confidential_issues_create.png diff --git a/doc/user/project/issues/img/confidential_issues_index_page.png b/doc/user/project/issues/img/confidential_issues_index_page.png Binary files differindex 042461e2451..e4b492a2769 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_index_page.png +++ b/doc/user/project/issues/img/confidential_issues_index_page.png diff --git a/doc/user/project/issues/img/confidential_issues_issue_page.png b/doc/user/project/issues/img/confidential_issues_issue_page.png Binary files differindex b3568e9303a..f04ec8ff32b 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_issue_page.png +++ b/doc/user/project/issues/img/confidential_issues_issue_page.png diff --git a/doc/user/project/issues/img/confidential_issues_search_guest.png b/doc/user/project/issues/img/confidential_issues_search_guest.png Binary files differindex b85de90b4d5..dc1b4ba8ad7 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_search_guest.png +++ b/doc/user/project/issues/img/confidential_issues_search_guest.png diff --git a/doc/user/project/issues/img/confidential_issues_search_master.png b/doc/user/project/issues/img/confidential_issues_search_master.png Binary files differindex bf2b9428875..fc01f4da9db 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_search_master.png +++ b/doc/user/project/issues/img/confidential_issues_search_master.png diff --git a/doc/user/project/issues/img/confidential_issues_system_notes.png b/doc/user/project/issues/img/confidential_issues_system_notes.png Binary files differindex 4005f9350f7..82e0dd8e85e 100644..100755 --- a/doc/user/project/issues/img/confidential_issues_system_notes.png +++ b/doc/user/project/issues/img/confidential_issues_system_notes.png diff --git a/doc/user/project/issues/img/due_dates_create.png b/doc/user/project/issues/img/due_dates_create.png Binary files differindex d2fe1172bab..ece35d44213 100644..100755 --- a/doc/user/project/issues/img/due_dates_create.png +++ b/doc/user/project/issues/img/due_dates_create.png diff --git a/doc/user/project/issues/img/due_dates_edit_sidebar.png b/doc/user/project/issues/img/due_dates_edit_sidebar.png Binary files differindex 6b37150e7db..d1c7d1eb7e9 100644..100755 --- a/doc/user/project/issues/img/due_dates_edit_sidebar.png +++ b/doc/user/project/issues/img/due_dates_edit_sidebar.png diff --git a/doc/user/project/issues/img/due_dates_issues_index_page.png b/doc/user/project/issues/img/due_dates_issues_index_page.png Binary files differindex defcd5eca39..94679436b32 100644..100755 --- a/doc/user/project/issues/img/due_dates_issues_index_page.png +++ b/doc/user/project/issues/img/due_dates_issues_index_page.png diff --git a/doc/user/project/issues/img/due_dates_todos.png b/doc/user/project/issues/img/due_dates_todos.png Binary files differindex 92c9fd4021b..4c124c97f67 100644..100755 --- a/doc/user/project/issues/img/due_dates_todos.png +++ b/doc/user/project/issues/img/due_dates_todos.png diff --git a/doc/user/project/issues/img/issue_board.png b/doc/user/project/issues/img/issue_board.png Binary files differnew file mode 100755 index 00000000000..1759b28a9ef --- /dev/null +++ b/doc/user/project/issues/img/issue_board.png diff --git a/doc/user/project/issues/img/issue_template.png b/doc/user/project/issues/img/issue_template.png Binary files differnew file mode 100755 index 00000000000..c63229a4af2 --- /dev/null +++ b/doc/user/project/issues/img/issue_template.png diff --git a/doc/user/project/issues/img/issue_tracker.png b/doc/user/project/issues/img/issue_tracker.png Binary files differnew file mode 100755 index 00000000000..ab25cb64d13 --- /dev/null +++ b/doc/user/project/issues/img/issue_tracker.png diff --git a/doc/user/project/issues/img/issues_main_view.png b/doc/user/project/issues/img/issues_main_view.png Binary files differnew file mode 100755 index 00000000000..e9a94a3aab0 --- /dev/null +++ b/doc/user/project/issues/img/issues_main_view.png diff --git a/doc/user/project/issues/img/issues_main_view_numbered.png b/doc/user/project/issues/img/issues_main_view_numbered.png Binary files differnew file mode 100755 index 00000000000..9cff61d7041 --- /dev/null +++ b/doc/user/project/issues/img/issues_main_view_numbered.png diff --git a/doc/user/project/issues/img/mention_in_issue.png b/doc/user/project/issues/img/mention_in_issue.png Binary files differnew file mode 100755 index 00000000000..c762a812138 --- /dev/null +++ b/doc/user/project/issues/img/mention_in_issue.png diff --git a/doc/user/project/issues/img/mention_in_merge_request.png b/doc/user/project/issues/img/mention_in_merge_request.png Binary files differnew file mode 100755 index 00000000000..681e086d6e0 --- /dev/null +++ b/doc/user/project/issues/img/mention_in_merge_request.png diff --git a/doc/user/project/issues/img/merge_request_closes_issue.png b/doc/user/project/issues/img/merge_request_closes_issue.png Binary files differnew file mode 100755 index 00000000000..6fd27738843 --- /dev/null +++ b/doc/user/project/issues/img/merge_request_closes_issue.png diff --git a/doc/user/project/issues/img/new_issue.png b/doc/user/project/issues/img/new_issue.png Binary files differnew file mode 100755 index 00000000000..e72ac49d6b9 --- /dev/null +++ b/doc/user/project/issues/img/new_issue.png diff --git a/doc/user/project/issues/img/new_issue_from_issue_board.png b/doc/user/project/issues/img/new_issue_from_issue_board.png Binary files differnew file mode 100755 index 00000000000..9c2b3ff50fa --- /dev/null +++ b/doc/user/project/issues/img/new_issue_from_issue_board.png diff --git a/doc/user/project/issues/img/new_issue_from_open_issue.png b/doc/user/project/issues/img/new_issue_from_open_issue.png Binary files differnew file mode 100755 index 00000000000..2aed5372830 --- /dev/null +++ b/doc/user/project/issues/img/new_issue_from_open_issue.png diff --git a/doc/user/project/issues/img/new_issue_from_projects_dashboard.png b/doc/user/project/issues/img/new_issue_from_projects_dashboard.png Binary files differnew file mode 100755 index 00000000000..cddf36b7457 --- /dev/null +++ b/doc/user/project/issues/img/new_issue_from_projects_dashboard.png diff --git a/doc/user/project/issues/img/new_issue_from_tracker_list.png b/doc/user/project/issues/img/new_issue_from_tracker_list.png Binary files differnew file mode 100755 index 00000000000..7e5413f0b7d --- /dev/null +++ b/doc/user/project/issues/img/new_issue_from_tracker_list.png diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md new file mode 100644 index 00000000000..c726da17259 --- /dev/null +++ b/doc/user/project/issues/index.md @@ -0,0 +1,100 @@ +# GitLab Issues Documentation + +The GitLab Issue Tracker is an advanced and complete tool +for tracking the evolution of a new idea or the process +of solving a problem. + +It allows you, your team, and your collaborators to share +and discuss proposals, before and while implementing them. + +Issues and the GitLab Issue Tracker are available in all +[GitLab Products](https://about.gitlab.com/products/) as +part of the [GitLab Workflow](https://about.gitlab.com/2016/10/25/gitlab-workflow-an-overview/). + +## Use-Cases + +Issues can have endless applications. Just to exemplify, these are +some cases for which creating issues are most used: + +- Discussing the implementation of a new idea +- Submitting feature proposals +- Asking questions +- Reporting bugs and malfunction +- Obtaining support +- Elaborating new code implementations + +See also the blog post [Always start a discussion with an issue](https://about.gitlab.com/2016/03/03/start-with-an-issue/). + +## Issue Tracker + +The issue tracker is the collection of opened and closed issues created in a project. + +![Issue tracker](img/issue_tracker.png) + +Find the issue tracker by navigating to your **Project's Dashboard** > **Issues**. + +## GitLab Issues Functionalities + +The image bellow illustrates how an issue looks like: + +![Issue view](img/issues_main_view.png) + +Learn more about it on the [GitLab Issues Functionalities documentation](issues_functionalities.md). + +## New Issue + +Read through the [documentation on creating issues](create_new_issue.md). + +## Closing issues + +Read through the distinct ways to [close issues](closing_issues.md) on GitLab. + +## Search for an issue + +Learn how to [find an issue](../../search/index.md) by searching for and filtering them. + +## Advanced features + +### Confidential Issues + +Whenever you want to keep the discussion presented in a +issue within your team only, you can make that +[issue confidential](confidential_issues.md). Even if your project +is public, that issue will be preserved. The browser will +respond with a 404 error whenever someone who is not a project +member with at least [Reporter level](../../permissions.md#project) tries to +access that issue's URL. + +Learn more about them on the [confidential issues documentation](confidential_issues.md). + +### Issue templates + +Create templates for every new issue. They will be available from +the dropdown menu **Choose a template** when you create a new issue: + +![issue template](img/issue_template.png) + +Learn more about them on the [issue templates documentation](../../project/description_templates.md#creating-issue-templates). + +### Crosslinking issues + +Learn more about [crosslinking](crosslinking_issues.md) issues and merge requests. + +### GitLab Issue Board + +The [GitLab Issue Board](https://about.gitlab.com/features/issueboard/) is a way to +enhance your workflow by organizing and prioritizing issues in GitLab. + +![Issue board](img/issue_board.png) + +Find GitLab Issue Boards by navigating to your **Project's Dashboard** > **Issues** > **Board**. + +Read through the documentation for [Issue Boards](../issue_board.md) +to find out more about this feature. + +[Multiple Issue Boards](https://docs.gitlab.com/ee/user/project/issue_board.html#multiple-issue-boards) +are available only in [GitLab Enterprise Edition](https://about.gitlab.com/gitlab-ee/). + +### Issue's API + +Read through the [API documentation](../../../api/issues.md). diff --git a/doc/user/project/issues/issues_functionalities.md b/doc/user/project/issues/issues_functionalities.md new file mode 100644 index 00000000000..1efd07a058b --- /dev/null +++ b/doc/user/project/issues/issues_functionalities.md @@ -0,0 +1,157 @@ +# GitLab Issues Functionalities + +Please read through the [GitLab Issue Documentation](index.md) for an overview on GitLab Issues. + +## Issues Functionalities + +The image bellow illustrates how an issue looks like: + +![Issue view](img/issues_main_view_numbered.png) + +You can find all the information on that issue on one screen. + +### Issue screen + +An issue starts with its status (open or closed), followed by its author, +and includes many other functionalities, numbered on the image above to +explain what they mean, one by one. + +#### 1. New Issue, close issue, edit + +- New issue: create a new issue in the same project +- Close issue: close this issue +- Edit: edit the same fields available when you create an issue. + +#### 2. Todos + +- Add todo: add that issue to your [GitLab Todo](../../../workflow/todos.html) list +- Mark done: mark that issue as done (reflects on the Todo list) + +#### 3. Assignee + +Whenever someone starts to work on an issue, it can be assigned +to that person. The assignee can be changed as much as needed. +The idea is that the assignee is responsible for that issue until +it's reassigned to someone else to take it from there. + +> **Tip:** +if a user is not member of that project, it can only be +assigned to them if they created the issue themselves. + +#### 4. Milestone + +- Select a [milestone](../milestones/index.md) to attribute that issue to. + +#### 5. Time Tracking (EES/EEP) + +This feature is available only in [GitLab Enterprise Edition](https://about.gitlab.com/gitlab-ee/). + +- Estimate time: add an estimate time in which the issue will be implemented +- Spend: add the time spent on the implementation of that issue + +> **Note:** +both estimate and spend times are set via [GitLab Slash Commands](../slash_commands.md). + +Learn more on the [Time Tracking documentation](https://docs.gitlab.com/ee/workflow/time_tracking.html). + +#### 6. Due date + +When you work on a tight schedule, and it's important to +have a way to setup a deadline for implementations and for solving +problems. This can be facilitated by the [due date](due_dates.md)). Due dates +can be changed as many times as needed. + +#### 7. Labels + +Categorize issues by giving them [labels](../labels.md). They help to +organize team's workflows, once they enable you to work with the +[GitLab Issue Board](index.md#gitlab-issue-board). + +Group Labels, which allow you to use the same labels per +group of projects, can be also given to issues. They work exactly the same, +but they are immediately available to all projects in the group. + +> **Tip:** +if the label doesn't exist yet, when you click **Edit**, it opens a dropdown menu from which you can select **Create new label**. + +#### 8. Weight (EES/EEP) + +Issue Weights are only available in [GitLab Enterprise Edition](https://about.gitlab.com/gitlab-ee/). + +- Attribute a weight (in a 0 to 9 range) to that issue. Easy to complete +should weight 1 and very hard to complete should weight 9. + +Learn more on the [Issue Weight documentation](https://docs.gitlab.com/ee/workflow/issue_weight.html). + +#### 9. Participants + +- People involved in that issue (mentioned in the description or in the [discussion](../../discussions/index.md)). + +#### 10. Notifications + +- Subscribe: if you are not a participant of the discussion on that issue, but +want to receive notifications on each new input, subscribe to it. +- Unsubscribe: if you are receiving notifications on that issue but no +longer want to receive them, unsubscribe to it. + +Read more on the [notifications documentation](../../../workflow/notifications.md#issue-merge-request-events). + +#### 11. Reference + +- A quick "copy to clipboard" button to that issue's reference, `foo/bar#xxx`, where `foo` is the `username` or `groupname`, `bar` +is the `project-name`, and `xxx` is the issue number. + +#### 12. Title and description + +- Title: a plain text title describing the issue's subject. +- Description: a text field which fully supports [GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm). + +#### 13. @mentions + +- Mentions: you can either `@mention` a user or a group present in your +GitLab instance and they will be notified via todos and email, unless that +person has disabled all notifications in their profile settings. + +To change your [notification settings](../../../workflow/notifications.md) navigate to +**Profile Settings** > **Notifications** > **Global notification level** +and choose your preferences from the dropdown menu. + +> **Tip:** +Avoid mentioning `@all` in issues and merge requests, +as it sends an email notification +to all the members of that project's group, which can be +interpreted as spam. + +#### 14. Related Merge Requests + +- Any merge requests mentioned in that issue's description +or in the issue thread. + +#### 15. Award emoji + +- Award an emoji to that issue. + +> **Tip:** +Posting "+1" as comments in threads spam all +participants of that issue. Awarding an emoji is a way to let them +know you like it without spamming them. + +#### 16. Thread + +- Comments: collaborate to that issue by posting comments in its thread. +These text fields also fully support +[GitLab Flavored Markdown](../../markdown.md#gitlab-flavored-markdown-gfm). + +#### 17. Comment, start a discusion, or comment and close + +Once you wrote your comment, you can either: + +- Click "Comment" and your comment will be published. +- Click "Start discussion": start a thread within that issue's thread to discuss specific points. +- Click "Comment and close issue": post your comment and close that issue in one click. + +#### 18. New branch + +- [New branch](../repository/web_editor.md#create-a-new-branch-from-an-issue): +create a new branch, followed by a new merge request which will automatically close that +issue as soon as that merge request is merged. diff --git a/lib/gitlab/checks/change_access.rb b/lib/gitlab/checks/change_access.rb index 8793b20aa35..c984eb20606 100644 --- a/lib/gitlab/checks/change_access.rb +++ b/lib/gitlab/checks/change_access.rb @@ -1,7 +1,6 @@ module Gitlab module Checks class ChangeAccess - # protocol is currently used only in EE attr_reader :user_access, :project, :skip_authorization, :protocol def initialize( @@ -18,7 +17,9 @@ module Gitlab end def exec - error = push_checks || tag_checks || protected_branch_checks + return GitAccessStatus.new(true) if skip_authorization + + error = push_checks || branch_checks || tag_checks if error GitAccessStatus.new(false, error) @@ -29,35 +30,59 @@ module Gitlab protected - def protected_branch_checks - return if skip_authorization + def push_checks + if user_access.cannot_do_action?(:push_code) + "You are not allowed to push code to this project." + end + end + + def branch_checks return unless @branch_name + + if deletion? && @branch_name == project.default_branch + return "The default branch of a project cannot be deleted." + end + + protected_branch_checks + end + + def protected_branch_checks return unless ProtectedBranch.protected?(project, @branch_name) if forced_push? return "You are not allowed to force push code to a protected branch on this project." - elsif deletion? - return "You are not allowed to delete protected branches from this project." end + if deletion? + protected_branch_deletion_checks + else + protected_branch_push_checks + end + end + + def protected_branch_deletion_checks + unless user_access.can_delete_branch?(@branch_name) + return 'You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.' + end + + unless protocol == 'web' + 'You can only delete protected branches using the web interface.' + end + end + + def protected_branch_push_checks if matching_merge_request? - if user_access.can_merge_to_branch?(@branch_name) || user_access.can_push_to_branch?(@branch_name) - return - else + unless user_access.can_merge_to_branch?(@branch_name) || user_access.can_push_to_branch?(@branch_name) "You are not allowed to merge code into protected branches on this project." end else - if user_access.can_push_to_branch?(@branch_name) - return - else + unless user_access.can_push_to_branch?(@branch_name) "You are not allowed to push code to protected branches on this project." end end end def tag_checks - return if skip_authorization - return unless @tag_name if tag_exists? && user_access.cannot_do_action?(:admin_project) @@ -68,7 +93,8 @@ module Gitlab end def protected_tag_checks - return unless tag_protected? + return unless ProtectedTag.protected?(project, @tag_name) + return "Protected tags cannot be updated." if update? return "Protected tags cannot be deleted." if deletion? @@ -77,18 +103,6 @@ module Gitlab end end - def tag_protected? - ProtectedTag.protected?(project, @tag_name) - end - - def push_checks - return if skip_authorization - - if user_access.cannot_do_action?(:push_code) - "You are not allowed to push code to this project." - end - end - private def tag_exists? diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 89088ee8762..d0f3cf2b514 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -108,7 +108,6 @@ methods: - :type statuses: - :type - - :gl_project_id services: - :type merge_request_diff: diff --git a/lib/gitlab/user_access.rb b/lib/gitlab/user_access.rb index e46ff313654..3b922da7ced 100644 --- a/lib/gitlab/user_access.rb +++ b/lib/gitlab/user_access.rb @@ -38,6 +38,16 @@ module Gitlab end end + def can_delete_branch?(ref) + return false unless can_access_git? + + if ProtectedBranch.protected?(project, ref) + user.can?(:delete_protected_branch, project) + else + user.can?(:push_code, project) + end + end + def can_push_to_branch?(ref) return false unless can_access_git? diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb index 8e0306ce83b..7668ce5f8be 100644 --- a/spec/features/projects/branches_spec.rb +++ b/spec/features/projects/branches_spec.rb @@ -4,7 +4,13 @@ describe 'Branches', feature: true do let(:project) { create(:project, :public) } let(:repository) { project.repository } - context 'logged in' do + def set_protected_branch_name(branch_name) + find(".js-protected-branch-select").click + find(".dropdown-input-field").set(branch_name) + click_on("Create wildcard #{branch_name}") + end + + context 'logged in as developer' do before do login_as :user project.team << [@user, :developer] @@ -38,6 +44,83 @@ describe 'Branches', feature: true do expect(find('.all-branches')).to have_selector('li', count: 1) end end + + describe 'Delete unprotected branch' do + it 'removes branch after confirmation', js: true do + visit namespace_project_branches_path(project.namespace, project) + + fill_in 'branch-search', with: 'fix' + + find('#branch-search').native.send_keys(:enter) + + expect(page).to have_content('fix') + expect(find('.all-branches')).to have_selector('li', count: 1) + find('.js-branch-fix .btn-remove').trigger(:click) + + expect(page).not_to have_content('fix') + expect(find('.all-branches')).to have_selector('li', count: 0) + end + end + + describe 'Delete protected branch' do + before do + project.add_user(@user, :master) + visit namespace_project_protected_branches_path(project.namespace, project) + set_protected_branch_name('fix') + click_on "Protect" + + within(".protected-branches-list") { expect(page).to have_content('fix') } + expect(ProtectedBranch.count).to eq(1) + project.add_user(@user, :developer) + end + + it 'does not allow devleoper to removes protected branch', js: true do + visit namespace_project_branches_path(project.namespace, project) + + fill_in 'branch-search', with: 'fix' + find('#branch-search').native.send_keys(:enter) + + expect(page).to have_css('.btn-remove.disabled') + end + end + end + + context 'logged in as master' do + before do + login_as :user + project.team << [@user, :master] + end + + describe 'Delete protected branch' do + before do + visit namespace_project_protected_branches_path(project.namespace, project) + set_protected_branch_name('fix') + click_on "Protect" + + within(".protected-branches-list") { expect(page).to have_content('fix') } + expect(ProtectedBranch.count).to eq(1) + end + + it 'removes branch after modal confirmation', js: true do + visit namespace_project_branches_path(project.namespace, project) + + fill_in 'branch-search', with: 'fix' + find('#branch-search').native.send_keys(:enter) + + expect(page).to have_content('fix') + expect(find('.all-branches')).to have_selector('li', count: 1) + page.find('[data-target="#modal-delete-branch"]').trigger(:click) + + expect(page).to have_css('.js-delete-branch[disabled]') + fill_in 'delete_branch_input', with: 'fix' + click_link 'Delete protected branch' + + fill_in 'branch-search', with: 'fix' + find('#branch-search').native.send_keys(:enter) + + expect(page).to have_content('No branches to show') + end + end end context 'logged out' do diff --git a/spec/lib/gitlab/checks/change_access_spec.rb b/spec/lib/gitlab/checks/change_access_spec.rb index 959ae02c222..8d81ed5856e 100644 --- a/spec/lib/gitlab/checks/change_access_spec.rb +++ b/spec/lib/gitlab/checks/change_access_spec.rb @@ -96,40 +96,77 @@ describe Gitlab::Checks::ChangeAccess, lib: true do end end - context 'protected branches check' do - before do - allow(ProtectedBranch).to receive(:protected?).with(project, 'master').and_return(true) - end - - it 'returns an error if the user is not allowed to do forced pushes to protected branches' do - expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true) + context 'branches check' do + context 'trying to delete the default branch' do + let(:newrev) { '0000000000000000000000000000000000000000' } + let(:ref) { 'refs/heads/master' } - expect(subject.status).to be(false) - expect(subject.message).to eq('You are not allowed to force push code to a protected branch on this project.') + it 'returns an error' do + expect(subject.status).to be(false) + expect(subject.message).to eq('The default branch of a project cannot be deleted.') + end end - it 'returns an error if the user is not allowed to merge to protected branches' do - expect_any_instance_of(Gitlab::Checks::MatchingMergeRequest).to receive(:match?).and_return(true) - expect(user_access).to receive(:can_merge_to_branch?).and_return(false) - expect(user_access).to receive(:can_push_to_branch?).and_return(false) + context 'protected branches check' do + before do + allow(ProtectedBranch).to receive(:protected?).with(project, 'master').and_return(true) + allow(ProtectedBranch).to receive(:protected?).with(project, 'feature').and_return(true) + end - expect(subject.status).to be(false) - expect(subject.message).to eq('You are not allowed to merge code into protected branches on this project.') - end + it 'returns an error if the user is not allowed to do forced pushes to protected branches' do + expect(Gitlab::Checks::ForcePush).to receive(:force_push?).and_return(true) - it 'returns an error if the user is not allowed to push to protected branches' do - expect(user_access).to receive(:can_push_to_branch?).and_return(false) + expect(subject.status).to be(false) + expect(subject.message).to eq('You are not allowed to force push code to a protected branch on this project.') + end - expect(subject.status).to be(false) - expect(subject.message).to eq('You are not allowed to push code to protected branches on this project.') - end + it 'returns an error if the user is not allowed to merge to protected branches' do + expect_any_instance_of(Gitlab::Checks::MatchingMergeRequest).to receive(:match?).and_return(true) + expect(user_access).to receive(:can_merge_to_branch?).and_return(false) + expect(user_access).to receive(:can_push_to_branch?).and_return(false) - context 'branch deletion' do - let(:newrev) { '0000000000000000000000000000000000000000' } + expect(subject.status).to be(false) + expect(subject.message).to eq('You are not allowed to merge code into protected branches on this project.') + end + + it 'returns an error if the user is not allowed to push to protected branches' do + expect(user_access).to receive(:can_push_to_branch?).and_return(false) - it 'returns an error if the user is not allowed to delete protected branches' do expect(subject.status).to be(false) - expect(subject.message).to eq('You are not allowed to delete protected branches from this project.') + expect(subject.message).to eq('You are not allowed to push code to protected branches on this project.') + end + + context 'branch deletion' do + let(:newrev) { '0000000000000000000000000000000000000000' } + let(:ref) { 'refs/heads/feature' } + + context 'if the user is not allowed to delete protected branches' do + it 'returns an error' do + expect(subject.status).to be(false) + expect(subject.message).to eq('You are not allowed to delete protected branches from this project. Only a project master or owner can delete a protected branch.') + end + end + + context 'if the user is allowed to delete protected branches' do + before do + project.add_master(user) + end + + context 'through the web interface' do + let(:protocol) { 'web' } + + it 'allows branch deletion' do + expect(subject.status).to be(true) + end + end + + context 'over SSH or HTTP' do + it 'returns an error' do + expect(subject.status).to be(false) + expect(subject.message).to eq('You can only delete protected branches using the web interface.') + end + end + end end end end diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb index d8b72615fab..25769977f24 100644 --- a/spec/lib/gitlab/git_access_spec.rb +++ b/spec/lib/gitlab/git_access_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe Gitlab::GitAccess, lib: true do - let(:access) { Gitlab::GitAccess.new(actor, project, 'web', authentication_abilities: authentication_abilities) } + let(:access) { Gitlab::GitAccess.new(actor, project, 'ssh', authentication_abilities: authentication_abilities) } let(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:actor) { user } diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb index 2b27ff66c09..0d87cf25dbb 100644 --- a/spec/lib/gitlab/user_access_spec.rb +++ b/spec/lib/gitlab/user_access_spec.rb @@ -5,7 +5,7 @@ describe Gitlab::UserAccess, lib: true do let(:project) { create(:project) } let(:user) { create(:user) } - describe 'can_push_to_branch?' do + describe '#can_push_to_branch?' do describe 'push to none protected branch' do it 'returns true if user is a master' do project.team << [user, :master] @@ -143,7 +143,7 @@ describe Gitlab::UserAccess, lib: true do end end - describe 'can_create_tag?' do + describe '#can_create_tag?' do describe 'push to none protected tag' do it 'returns true if user is a master' do project.add_user(user, :master) @@ -211,4 +211,48 @@ describe Gitlab::UserAccess, lib: true do end end end + + describe '#can_delete_branch?' do + describe 'delete unprotected branch' do + it 'returns true if user is a master' do + project.add_user(user, :master) + + expect(access.can_delete_branch?('random_branch')).to be_truthy + end + + it 'returns true if user is a developer' do + project.add_user(user, :developer) + + expect(access.can_delete_branch?('random_branch')).to be_truthy + end + + it 'returns false if user is a reporter' do + project.add_user(user, :reporter) + + expect(access.can_delete_branch?('random_branch')).to be_falsey + end + end + + describe 'delete protected branch' do + let(:branch) { create(:protected_branch, project: project, name: "test") } + + it 'returns true if user is a master' do + project.add_user(user, :master) + + expect(access.can_delete_branch?(branch.name)).to be_truthy + end + + it 'returns false if user is a developer' do + project.add_user(user, :developer) + + expect(access.can_delete_branch?(branch.name)).to be_falsey + end + + it 'returns false if user is a reporter' do + project.add_user(user, :reporter) + + expect(access.can_delete_branch?(branch.name)).to be_falsey + end + end + end end diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb index 064847ee3dc..0d3af1f4499 100644 --- a/spec/policies/project_policy_spec.rb +++ b/spec/policies/project_policy_spec.rb @@ -43,7 +43,7 @@ describe ProjectPolicy, models: true do let(:master_permissions) do %i[ - push_code_to_protected_branches update_project_snippet update_environment + delete_protected_branch update_project_snippet update_environment update_deployment admin_milestone admin_project_snippet admin_project_member admin_note admin_wiki admin_project admin_commit_status admin_build admin_container_image diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index 7eaa89837c8..c64499fc8c0 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -406,19 +406,6 @@ describe API::Branches do delete api("/projects/#{project.id}/repository/branches/foobar", user) expect(response).to have_http_status(404) end - - it "removes protected branch" do - create(:protected_branch, project: project, name: branch_name) - delete api("/projects/#{project.id}/repository/branches/#{branch_name}", user) - expect(response).to have_http_status(405) - expect(json_response['message']).to eq('Protected branch cant be removed') - end - - it "does not remove HEAD branch" do - delete api("/projects/#{project.id}/repository/branches/master", user) - expect(response).to have_http_status(405) - expect(json_response['message']).to eq('Cannot remove HEAD branch') - end end describe "DELETE /projects/:id/repository/merged_branches" do diff --git a/spec/requests/api/v3/branches_spec.rb b/spec/requests/api/v3/branches_spec.rb index 72f8fbe71fb..c88f7788697 100644 --- a/spec/requests/api/v3/branches_spec.rb +++ b/spec/requests/api/v3/branches_spec.rb @@ -47,19 +47,6 @@ describe API::V3::Branches do delete v3_api("/projects/#{project.id}/repository/branches/foobar", user) expect(response).to have_http_status(404) end - - it "removes protected branch" do - create(:protected_branch, project: project, name: branch_name) - delete v3_api("/projects/#{project.id}/repository/branches/#{branch_name}", user) - expect(response).to have_http_status(405) - expect(json_response['message']).to eq('Protected branch cant be removed') - end - - it "does not remove HEAD branch" do - delete v3_api("/projects/#{project.id}/repository/branches/master", user) - expect(response).to have_http_status(405) - expect(json_response['message']).to eq('Cannot remove HEAD branch') - end end describe "DELETE /projects/:id/repository/merged_branches" do diff --git a/spec/services/delete_merged_branches_service_spec.rb b/spec/services/delete_merged_branches_service_spec.rb index 7b921f606f8..cae74df9c90 100644 --- a/spec/services/delete_merged_branches_service_spec.rb +++ b/spec/services/delete_merged_branches_service_spec.rb @@ -6,33 +6,22 @@ describe DeleteMergedBranchesService, services: true do let(:project) { create(:project, :repository) } context '#execute' do - context 'unprotected branches' do - before do - service.execute - end + it 'deletes a branch that was merged' do + service.execute - it 'deletes a branch that was merged' do - expect(project.repository.branch_names).not_to include('improve/awesome') - end + expect(project.repository.branch_names).not_to include('improve/awesome') + end - it 'keeps branch that is unmerged' do - expect(project.repository.branch_names).to include('feature') - end + it 'keeps branch that is unmerged' do + service.execute - it 'keeps "master"' do - expect(project.repository.branch_names).to include('master') - end + expect(project.repository.branch_names).to include('feature') end - context 'protected branches' do - before do - create(:protected_branch, name: 'improve/awesome', project: project) - service.execute - end + it 'keeps "master"' do + service.execute - it 'keeps protected branch' do - expect(project.repository.branch_names).to include('improve/awesome') - end + expect(project.repository.branch_names).to include('master') end context 'user without rights' do diff --git a/vendor/Dockerfile/OpenJDK-alpine.Dockerfile b/vendor/Dockerfile/OpenJDK-alpine.Dockerfile new file mode 100644 index 00000000000..ee853d9cfd2 --- /dev/null +++ b/vendor/Dockerfile/OpenJDK-alpine.Dockerfile @@ -0,0 +1,8 @@ +FROM openjdk:8-alpine + +COPY . /usr/src/myapp +WORKDIR /usr/src/myapp + +RUN javac Main.java + +CMD ["java", "Main"] diff --git a/vendor/Dockerfile/OpenJDK.Dockerfile b/vendor/Dockerfile/OpenJDK.Dockerfile new file mode 100644 index 00000000000..8a2ae62d93b --- /dev/null +++ b/vendor/Dockerfile/OpenJDK.Dockerfile @@ -0,0 +1,8 @@ +FROM openjdk:9 + +COPY . /usr/src/myapp +WORKDIR /usr/src/myapp + +RUN javac Main.java + +CMD ["java", "Main"] diff --git a/vendor/Dockerfile/Python-alpine.Dockerfile b/vendor/Dockerfile/Python-alpine.Dockerfile new file mode 100644 index 00000000000..59ac9f504de --- /dev/null +++ b/vendor/Dockerfile/Python-alpine.Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.6-alpine + +# Edit with mysql-client, postgresql-client, sqlite3, etc. for your needs. +# Or delete entirely if not needed. +RUN apk --no-cache add postgresql-client + +WORKDIR /usr/src/app + +COPY requirements.txt /usr/src/app/ +RUN pip install --no-cache-dir -r requirements.txt + +COPY . /usr/src/app + +# For Django +EXPOSE 8000 +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] + +# For some other command +# CMD ["python", "app.py"] diff --git a/vendor/Dockerfile/Python.Dockerfile b/vendor/Dockerfile/Python.Dockerfile new file mode 100644 index 00000000000..7c43ad99060 --- /dev/null +++ b/vendor/Dockerfile/Python.Dockerfile @@ -0,0 +1,22 @@ +FROM python:3.6 + +# Edit with mysql-client, postgresql-client, sqlite3, etc. for your needs. +# Or delete entirely if not needed. +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + postgresql-client \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /usr/src/app + +COPY requirements.txt /usr/src/app/ +RUN pip install --no-cache-dir -r requirements.txt + +COPY . /usr/src/app + +# For Django +EXPOSE 8000 +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] + +# For some other command +# CMD ["python", "app.py"] diff --git a/vendor/gitignore/Global/Archives.gitignore b/vendor/gitignore/Global/Archives.gitignore index e9eda68baf2..f440b808d98 100644 --- a/vendor/gitignore/Global/Archives.gitignore +++ b/vendor/gitignore/Global/Archives.gitignore @@ -5,6 +5,7 @@ *.rar *.zip *.gz +*.tgz *.bzip *.bz2 *.xz diff --git a/vendor/gitignore/Global/JetBrains.gitignore b/vendor/gitignore/Global/JetBrains.gitignore index a5d4cc86d33..ff23445e2b0 100644 --- a/vendor/gitignore/Global/JetBrains.gitignore +++ b/vendor/gitignore/Global/JetBrains.gitignore @@ -19,6 +19,9 @@ .idea/**/gradle.xml .idea/**/libraries +# CMake +cmake-build-debug/ + # Mongo Explorer plugin: .idea/**/mongoSettings.xml diff --git a/vendor/gitignore/Global/MicrosoftOffice.gitignore b/vendor/gitignore/Global/MicrosoftOffice.gitignore index cb891745660..0c203662d39 100644 --- a/vendor/gitignore/Global/MicrosoftOffice.gitignore +++ b/vendor/gitignore/Global/MicrosoftOffice.gitignore @@ -13,4 +13,4 @@ ~$*.ppt* # Visio autosave temporary files -*.~vsdx +*.~vsd* diff --git a/vendor/gitignore/Magento.gitignore b/vendor/gitignore/Magento.gitignore index b282f5cf547..6f1fa223992 100644 --- a/vendor/gitignore/Magento.gitignore +++ b/vendor/gitignore/Magento.gitignore @@ -3,14 +3,41 @@ #--------------------------# /app/etc/local.xml + /media/* !/media/.htaccess + +!/media/customer +/media/customer/* !/media/customer/.htaccess + +!/media/dhl +/media/dhl/* !/media/dhl/logo.jpg + +!/media/downloadable +/media/downloadable/* !/media/downloadable/.htaccess + +!/media/xmlconnect +/media/xmlconnect/* + +!/media/xmlconnect/custom +/media/xmlconnect/custom/* !/media/xmlconnect/custom/ok.gif + +!/media/xmlconnect/original +/media/xmlconnect/original/* !/media/xmlconnect/original/ok.gif + +!/media/xmlconnect/system +/media/xmlconnect/system/* !/media/xmlconnect/system/ok.gif + /var/* !/var/.htaccess + +!/var/package +/var/package/* !/var/package/*.xml + diff --git a/vendor/gitignore/Python.gitignore b/vendor/gitignore/Python.gitignore index ff65a437185..768d5f400bb 100644 --- a/vendor/gitignore/Python.gitignore +++ b/vendor/gitignore/Python.gitignore @@ -89,9 +89,13 @@ ENV/ # Spyder project settings .spyderproject +.spyproject # Rope project settings .ropeproject # mkdocs documentation /site + +# mypy +.mypy_cache/ diff --git a/vendor/gitignore/Qt.gitignore b/vendor/gitignore/Qt.gitignore index c7659c24f38..6732e72091c 100644 --- a/vendor/gitignore/Qt.gitignore +++ b/vendor/gitignore/Qt.gitignore @@ -20,6 +20,7 @@ *.qbs.user.* *.moc moc_*.cpp +moc_*.h qrc_*.cpp ui_*.h Makefile* diff --git a/vendor/gitignore/UnrealEngine.gitignore b/vendor/gitignore/UnrealEngine.gitignore index 2f096001fec..6c6e1c327fd 100644 --- a/vendor/gitignore/UnrealEngine.gitignore +++ b/vendor/gitignore/UnrealEngine.gitignore @@ -54,6 +54,11 @@ Binaries/* # Builds Build/* +# Whitelist PakBlacklist-<BuildConfiguration>.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + # Don't ignore icon files in Build !Build/**/*.ico diff --git a/vendor/licenses.csv b/vendor/licenses.csv index 6441df25fe1..a8e7f5e3ea9 100644 --- a/vendor/licenses.csv +++ b/vendor/licenses.csv @@ -3,7 +3,7 @@ abbrev,1.0.9,ISC accepts,1.3.3,MIT ace-rails-ap,4.1.2,MIT acorn,4.0.11,MIT -acorn-dynamic-import,2.0.2,MIT +acorn-dynamic-import,2.0.1,MIT acorn-jsx,3.0.1,MIT actionmailer,4.2.8,MIT actionpack,4.2.8,MIT @@ -16,7 +16,7 @@ acts-as-taggable-on,4.0.0,MIT addressable,2.3.8,Apache 2.0 after,0.8.2,MIT after_commit_queue,1.3.0,MIT -ajv,4.11.5,MIT +ajv,4.11.2,MIT ajv-keywords,1.5.1,MIT akismet,2.0.0,MIT align-text,0.1.4,MIT @@ -29,7 +29,7 @@ ansi-regex,2.1.1,MIT ansi-styles,2.2.1,MIT anymatch,1.3.0,ISC append-transform,0.4.0,MIT -aproba,1.1.1,ISC +aproba,1.1.0,ISC are-we-there-yet,1.1.2,ISC arel,6.0.4,MIT argparse,1.0.9,MIT @@ -43,7 +43,7 @@ array-uniq,1.0.3,MIT array-unique,0.2.1,MIT arraybuffer.slice,0.0.6,MIT arrify,1.0.1,MIT -asana,0.4.0,MIT +asana,0.6.0,MIT asciidoctor,1.5.3,MIT asciidoctor-plantuml,0.0.7,MIT asn1,0.2.3,MIT @@ -62,8 +62,8 @@ aws-sign2,0.6.0,Apache 2.0 aws4,1.6.0,MIT axiom-types,0.1.1,MIT babel-code-frame,6.22.0,MIT -babel-core,6.24.0,MIT -babel-generator,6.24.0,MIT +babel-core,6.23.1,MIT +babel-generator,6.23.0,MIT babel-helper-bindify-decorators,6.22.0,MIT babel-helper-builder-binary-assignment-operator-visitor,6.22.0,MIT babel-helper-call-delegate,6.22.0,MIT @@ -78,10 +78,10 @@ babel-helper-regex,6.22.0,MIT babel-helper-remap-async-to-generator,6.22.0,MIT babel-helper-replace-supers,6.23.0,MIT babel-helpers,6.23.0,MIT -babel-loader,6.4.1,MIT +babel-loader,6.2.10,MIT babel-messages,6.23.0,MIT babel-plugin-check-es2015-constants,6.22.0,MIT -babel-plugin-istanbul,4.1.1,New BSD +babel-plugin-istanbul,4.0.0,New BSD babel-plugin-syntax-async-functions,6.13.0,MIT babel-plugin-syntax-async-generators,6.13.0,MIT babel-plugin-syntax-class-properties,6.13.0,MIT @@ -127,13 +127,13 @@ babel-preset-es2017,6.22.0,MIT babel-preset-latest,6.24.0,MIT babel-preset-stage-2,6.22.0,MIT babel-preset-stage-3,6.22.0,MIT -babel-register,6.24.0,MIT -babel-runtime,6.23.0,MIT +babel-register,6.23.0,MIT +babel-runtime,6.22.0,MIT babel-template,6.23.0,MIT babel-traverse,6.23.1,MIT babel-types,6.23.0,MIT babosa,1.0.2,MIT -babylon,6.16.1,MIT +babylon,6.15.0,MIT backo2,1.0.2,MIT balanced-match,0.4.2,MIT base32,0.3.2,MIT @@ -149,20 +149,20 @@ binary-extensions,1.8.0,MIT bindata,2.3.5,ruby blob,0.0.4,unknown block-stream,0.0.9,ISC -bluebird,3.5.0,MIT +bluebird,3.4.7,MIT bn.js,4.11.6,MIT -body-parser,1.17.1,MIT +body-parser,1.16.0,MIT boom,2.10.1,New BSD bootstrap-sass,3.3.6,MIT brace-expansion,1.1.6,MIT braces,1.8.5,MIT -brorand,1.1.0,MIT +brorand,1.0.7,MIT browser,2.2.0,MIT browserify-aes,1.0.6,MIT browserify-cipher,1.0.0,MIT browserify-des,1.0.0,MIT browserify-rsa,4.0.1,MIT -browserify-sign,4.0.4,ISC +browserify-sign,4.0.0,ISC browserify-zlib,0.1.4,MIT browserslist,1.7.7,MIT buffer,4.9.1,MIT @@ -178,8 +178,8 @@ callsites,0.2.0,MIT camelcase,1.2.1,MIT caniuse-api,1.6.1,MIT caniuse-db,1.0.30000649,CC-BY-4.0 -carrierwave,0.11.2,MIT -caseless,0.12.0,Apache 2.0 +carrierwave,1.0.0,MIT +caseless,0.11.0,Apache 2.0 cause,0.1,MIT center-align,0.1.3,MIT chalk,1.1.3,MIT @@ -194,6 +194,7 @@ citrus,3.0.2,MIT clap,1.1.3,MIT cli-cursor,1.0.2,MIT cli-width,2.1.0,ISC +clipboard,1.6.1,MIT cliui,2.1.0,ISC clone,1.0.2,MIT co,4.6.0,MIT @@ -216,14 +217,14 @@ commondir,1.0.1,MIT component-bind,1.0.0,unknown component-emitter,1.2.1,MIT component-inherit,0.0.3,unknown -compressible,2.0.10,MIT +compressible,2.0.9,MIT compression,1.6.2,MIT compression-webpack-plugin,0.3.2,MIT concat-map,0.0.1,MIT concat-stream,1.6.0,MIT config-chain,1.1.11,MIT configstore,1.4.0,Simplified BSD -connect,3.6.0,MIT +connect,3.5.0,MIT connect-history-api-fallback,1.3.0,MIT connection_pool,2.2.1,MIT console-browserify,1.1.0,MIT @@ -233,7 +234,7 @@ constants-browserify,1.0.0,MIT contains-path,0.1.0,MIT content-disposition,0.5.2,MIT content-type,1.0.2,MIT -convert-source-map,1.5.0,MIT +convert-source-map,1.3.0,MIT cookie,0.3.1,MIT cookie-signature,1.0.6,MIT core-js,2.4.1,MIT @@ -254,13 +255,13 @@ cssesc,0.1.0,MIT cssnano,3.10.0,MIT csso,2.3.2,MIT custom-event,1.0.1,MIT -d,1.0.0,MIT -d3,3.5.17,New BSD +d,0.1.1,MIT +d3,3.5.11,New BSD d3_rails,3.5.11,MIT dashdash,1.14.1,MIT date-now,0.1.4,MIT de-indent,1.0.2,MIT -debug,2.6.3,MIT +debug,2.6.0,MIT decamelize,1.2.0,MIT deckar01-task_list,1.0.6,MIT deep-extend,0.4.1,MIT @@ -271,6 +272,7 @@ defaults,1.0.3,MIT defined,1.0.0,MIT del,2.2.2,MIT delayed-stream,1.0.0,MIT +delegate,3.1.2,MIT delegates,1.0.0,MIT depd,1.1.0,MIT des.js,1.0.0,MIT @@ -283,8 +285,8 @@ di,0.0.1,MIT diff-lcs,1.2.5,"MIT,Perl Artistic v2,GNU GPL v2" diffie-hellman,5.0.2,MIT diffy,3.1.0,MIT -doctrine,2.0.0,Apache 2.0 -document-register-element,1.4.1,MIT +doctrine,1.5.0,BSD +document-register-element,1.3.0,MIT dom-serialize,2.2.1,MIT dom-serializer,0.1.0,MIT domain-browser,1.1.7,MIT @@ -294,7 +296,7 @@ domhandler,2.3.0,unknown domutils,1.5.1,unknown doorkeeper,4.2.0,MIT doorkeeper-openid_connect,1.1.2,MIT -dropzone,4.3.0,MIT +dropzone,4.2.0,MIT dropzonejs-rails,0.7.2,MIT duplexer,0.1.1,MIT duplexify,3.5.0,MIT @@ -303,36 +305,36 @@ editorconfig,0.13.2,MIT ee-first,1.1.1,MIT ejs,2.5.6,Apache 2.0 electron-to-chromium,1.3.3,ISC -elliptic,6.4.0,MIT +elliptic,6.3.3,MIT email_reply_trimmer,0.1.6,MIT emoji-unicode-version,0.2.1,MIT emojis-list,2.1.0,MIT encodeurl,1.0.1,MIT encryptor,3.0.0,MIT end-of-stream,1.0.0,MIT -engine.io,1.8.3,MIT -engine.io-client,1.8.3,MIT +engine.io,1.8.2,MIT +engine.io-client,1.8.2,MIT engine.io-parser,1.3.2,MIT enhanced-resolve,3.1.0,MIT ent,2.2.0,MIT entities,1.1.1,BSD-like equalizer,0.0.11,MIT errno,0.1.4,MIT -error-ex,1.3.1,MIT +error-ex,1.3.0,MIT erubis,2.7.0,MIT -es5-ext,0.10.15,MIT -es6-iterator,2.0.1,MIT -es6-map,0.1.5,MIT +es5-ext,0.10.12,MIT +es6-iterator,2.0.0,MIT +es6-map,0.1.4,MIT es6-promise,3.0.2,MIT -es6-set,0.1.5,MIT -es6-symbol,3.1.1,MIT -es6-weak-map,2.0.2,MIT +es6-set,0.1.4,MIT +es6-symbol,3.1.0,MIT +es6-weak-map,2.0.1,MIT escape-html,1.0.3,MIT escape-string-regexp,1.0.5,MIT escape_utils,1.1.1,MIT escodegen,1.8.1,Simplified BSD escope,3.6.0,Simplified BSD -eslint,3.19.0,MIT +eslint,3.15.0,MIT eslint-config-airbnb-base,10.0.1,MIT eslint-import-resolver-node,0.2.3,MIT eslint-import-resolver-webpack,0.8.1,MIT @@ -341,37 +343,39 @@ eslint-plugin-filenames,1.1.0,MIT eslint-plugin-html,2.0.1,ISC eslint-plugin-import,2.2.0,MIT eslint-plugin-jasmine,2.2.0,MIT -espree,3.4.1,Simplified BSD -esprima,2.7.3,Simplified BSD -esquery,1.0.0,BSD +eslint-plugin-promise,3.5.0,ISC +espree,3.4.0,Simplified BSD +esprima,3.1.3,Simplified BSD esrecurse,4.1.0,Simplified BSD estraverse,4.1.1,Simplified BSD esutils,2.0.2,BSD -etag,1.8.0,MIT +etag,1.7.0,MIT eve-raphael,0.5.0,Apache 2.0 -event-emitter,0.3.5,MIT +event-emitter,0.3.4,MIT event-stream,3.3.4,MIT eventemitter3,1.2.0,MIT events,1.1.1,MIT eventsource,0.1.6,MIT evp_bytestokey,1.0.0,MIT -excon,0.52.0,MIT +excon,0.55.0,MIT execjs,2.6.0,MIT exit-hook,1.1.1,MIT expand-braces,0.1.2,MIT expand-brackets,0.1.5,MIT expand-range,1.8.2,MIT -express,4.15.2,MIT +exports-loader,0.6.4,MIT +express,4.14.1,MIT expression_parser,0.9.0,MIT extend,3.0.0,MIT extglob,0.3.2,MIT extlib,0.9.16,MIT extract-zip,1.5.0,Simplified BSD extsprintf,1.0.2,MIT -faraday,0.9.2,MIT -faraday_middleware,0.10.0,MIT +faraday,0.11.0,MIT +faraday_middleware,0.11.0.1,MIT faraday_middleware-multi_json,0.0.6,MIT fast-levenshtein,2.0.6,MIT +fast_gettext,1.4.0,"MIT,ruby" fastparse,1.1.1,MIT faye-websocket,0.7.3,MIT fd-slicer,1.0.1,MIT @@ -383,37 +387,37 @@ filename-regex,2.0.0,MIT fileset,2.0.3,MIT filesize,3.3.0,New BSD fill-range,2.2.3,MIT -finalhandler,1.0.1,MIT +finalhandler,0.5.1,MIT find-cache-dir,0.1.1,MIT find-root,0.1.2,MIT find-up,2.1.0,MIT flat-cache,1.2.2,MIT flatten,1.0.2,MIT flowdock,0.7.1,MIT -fog-aws,0.11.0,MIT -fog-core,1.42.0,MIT +fog-aws,0.13.0,MIT +fog-core,1.44.1,MIT fog-google,0.5.0,MIT fog-json,1.0.2,MIT fog-local,0.3.0,MIT fog-openstack,0.1.6,MIT fog-rackspace,0.1.1,MIT -fog-xml,0.1.2,MIT +fog-xml,0.1.3,MIT font-awesome-rails,4.7.0.1,"MIT,SIL Open Font License" -for-in,1.0.2,MIT -for-own,0.1.5,MIT +for-in,0.1.6,MIT +for-own,0.1.4,MIT forever-agent,0.6.1,Apache 2.0 form-data,2.1.2,MIT formatador,0.2.5,MIT forwarded,0.1.0,MIT -fresh,0.5.0,MIT +fresh,0.3.0,MIT from,0.1.7,MIT fs-extra,1.0.0,MIT fs.realpath,1.0.0,ISC fsevents,,unknown -fstream,1.0.11,ISC +fstream,1.0.10,ISC fstream-ignore,1.0.5,ISC function-bind,1.1.0,MIT -gauge,2.7.3,ISC +gauge,2.7.2,ISC gemnasium-gitlab-service,0.2.6,MIT gemojione,3.0.1,MIT generate-function,2.0.0,MIT @@ -421,7 +425,9 @@ generate-object-property,1.2.0,MIT get-caller-file,1.0.2,ISC get_process_mem,0.2.0,MIT getpass,0.1.6,MIT -gitaly,0.5.0,MIT +gettext_i18n_rails,1.8.0,MIT +gettext_i18n_rails_js,1.2.0,MIT +gitaly,0.6.0,MIT github-linguist,4.7.6,MIT github-markup,1.4.0,MIT gitlab-flowdock-git-hook,1.0.1,MIT @@ -432,12 +438,13 @@ glob,7.1.1,ISC glob-base,0.3.0,MIT glob-parent,2.0.0,ISC globalid,0.3.7,MIT -globals,9.17.0,MIT +globals,9.14.0,MIT globby,5.0.0,MIT gollum-grit_adapter,1.0.1,MIT gollum-lib,4.2.1,MIT gollum-rugged_adapter,0.4.4,MIT gon,6.1.0,MIT +good-listener,1.2.2,MIT google-api-client,0.8.7,Apache 2.0 google-protobuf,3.2.0.2,New BSD googleauth,0.5.1,Apache 2.0 @@ -446,13 +453,12 @@ graceful-fs,4.1.11,ISC graceful-readlink,1.0.1,MIT grape,0.19.1,MIT grape-entity,0.6.0,MIT -grpc,1.1.2,New BSD +grpc,1.2.5,New BSD gzip-size,3.0.0,MIT hamlit,2.6.1,MIT handle-thing,1.2.5,MIT handlebars,4.0.6,MIT -har-schema,1.0.5,ISC -har-validator,4.2.1,ISC +har-validator,2.0.6,ISC has,1.0.1,MIT has-ansi,2.0.0,MIT has-binary,0.1.7,MIT @@ -463,14 +469,14 @@ hash-sum,1.0.2,MIT hash.js,1.0.3,MIT hasha,2.2.0,MIT hashie,3.5.5,MIT +hashie-forbidden_attributes,0.1.1,MIT hawk,3.1.3,New BSD he,1.1.1,MIT health_check,2.6.0,MIT hipchat,1.5.2,MIT -hmac-drbg,1.0.0,MIT hoek,2.16.3,New BSD home-or-tmp,2.0.0,MIT -hosted-git-info,2.4.1,ISC +hosted-git-info,2.2.0,ISC hpack.js,2.1.6,MIT html-comment-regex,1.1.1,MIT html-entities,1.2.0,MIT @@ -481,7 +487,7 @@ htmlparser2,3.9.2,MIT http,0.9.8,MIT http-cookie,1.0.3,MIT http-deceiver,1.2.7,MIT -http-errors,1.6.1,MIT +http-errors,1.5.1,MIT http-form_data,1.0.1,MIT http-proxy,1.16.2,MIT http-proxy-middleware,0.17.4,MIT @@ -495,7 +501,7 @@ ice_nine,0.11.2,MIT iconv-lite,0.4.15,MIT icss-replace-symbols,1.0.2,ISC ieee754,1.1.8,New BSD -ignore,3.2.6,MIT +ignore,3.2.2,MIT ignore-by-default,1.0.1,ISC immediate,3.0.6,MIT imurmurhash,0.1.4,MIT @@ -507,16 +513,16 @@ influxdb,0.2.3,MIT inherits,2.0.3,ISC ini,1.3.4,ISC inquirer,0.12.0,MIT -interpret,1.0.2,MIT +interpret,1.0.1,MIT invariant,2.2.2,New BSD invert-kv,1.0.0,MIT -ipaddr.js,1.3.0,MIT +ipaddr.js,1.2.0,MIT ipaddress,0.8.3,MIT is-absolute,0.2.6,MIT is-absolute-url,2.1.0,MIT is-arrayish,0.2.1,MIT is-binary-path,1.0.1,MIT -is-buffer,1.1.5,MIT +is-buffer,1.1.4,MIT is-builtin-module,1.0.0,MIT is-dotfile,1.0.2,MIT is-equal-shallow,0.1.3,MIT @@ -525,7 +531,7 @@ is-extglob,1.0.0,MIT is-finite,1.0.2,MIT is-fullwidth-code-point,1.0.0,MIT is-glob,2.0.1,MIT -is-my-json-valid,2.16.0,MIT +is-my-json-valid,2.15.0,MIT is-npm,1.0.0,MIT is-number,2.1.0,MIT is-path-cwd,1.0.0,MIT @@ -546,31 +552,32 @@ is-utf8,0.2.1,MIT is-windows,0.2.0,MIT isarray,1.0.0,MIT isbinaryfile,3.0.2,MIT -isexe,2.0.0,ISC +isexe,1.1.2,ISC isobject,2.1.0,MIT isstream,0.1.2,MIT istanbul,0.4.5,New BSD -istanbul-api,1.1.7,New BSD -istanbul-lib-coverage,1.0.2,New BSD -istanbul-lib-hook,1.0.5,New BSD -istanbul-lib-instrument,1.7.0,New BSD -istanbul-lib-report,1.0.0,New BSD -istanbul-lib-source-maps,1.1.1,New BSD -istanbul-reports,1.0.2,New BSD +istanbul-api,1.1.1,New BSD +istanbul-lib-coverage,1.0.1,New BSD +istanbul-lib-hook,1.0.0,New BSD +istanbul-lib-instrument,1.4.2,New BSD +istanbul-lib-report,1.0.0-alpha.3,New BSD +istanbul-lib-source-maps,1.1.0,New BSD +istanbul-reports,1.0.1,New BSD jasmine-core,2.5.2,MIT jasmine-jquery,2.1.1,MIT +jed,1.1.1,MIT jira-ruby,1.1.2,MIT jodid25519,1.0.2,MIT -jquery,2.2.4,MIT +jquery,2.2.1,MIT jquery-atwho-rails,1.3.2,MIT jquery-rails,4.1.1,MIT -jquery-ujs,1.2.2,MIT +jquery-ujs,1.2.1,MIT js-base64,2.1.9,BSD js-beautify,1.6.12,MIT -js-cookie,2.1.4,MIT +js-cookie,2.1.3,MIT js-tokens,3.0.1,MIT js-yaml,3.7.0,MIT -jsbn,0.1.1,MIT +jsbn,0.1.0,BSD jsesc,1.3.0,MIT json,1.8.6,ruby json-jwt,1.7.1,MIT @@ -583,18 +590,18 @@ json5,0.5.1,MIT jsonfile,2.4.0,MIT jsonify,0.0.0,Public Domain jsonpointer,4.0.1,MIT -jsprim,1.4.0,MIT +jsprim,1.3.1,MIT jszip,3.1.3,(MIT OR GPL-3.0) jszip-utils,0.0.2,MIT or GPLv3 jwt,1.5.6,MIT kaminari,0.17.0,MIT -karma,1.6.0,MIT -karma-coverage-istanbul-reporter,0.2.3,MIT +karma,1.4.1,MIT +karma-coverage-istanbul-reporter,0.2.0,MIT karma-jasmine,1.1.0,MIT -karma-mocha-reporter,2.2.3,MIT -karma-phantomjs-launcher,1.0.4,MIT +karma-mocha-reporter,2.2.2,MIT +karma-phantomjs-launcher,1.0.2,MIT karma-sourcemap-loader,0.3.7,MIT -karma-webpack,2.0.3,MIT +karma-webpack,2.0.2,MIT kew,0.7.0,Apache 2.0 kgio,2.10.0,LGPL-2.1+ kind-of,3.1.0,MIT @@ -610,7 +617,8 @@ lie,3.1.1,MIT little-plugger,1.1.4,MIT load-json-file,1.1.0,MIT loader-runner,2.3.0,MIT -loader-utils,0.2.17,MIT +loader-utils,0.2.16,MIT +locale,2.1.2,"ruby,LGPLv3+" locate-path,2.0.0,MIT lodash,4.17.4,MIT lodash._baseassign,3.2.0,MIT @@ -638,16 +646,17 @@ lodash.snakecase,4.0.1,MIT lodash.uniq,4.5.0,MIT lodash.words,4.2.0,MIT log4js,0.6.38,Apache 2.0 -logging,2.1.0,MIT +logging,2.2.2,MIT longest,1.0.1,MIT loofah,2.0.3,MIT loose-envify,1.3.1,MIT lowercase-keys,1.0.0,MIT lru-cache,3.2.0,ISC macaddress,0.2.8,MIT -mail,2.6.4,MIT +mail,2.6.5,MIT mail_room,0.9.1,MIT map-stream,0.1.0,unknown +marked,0.3.6,MIT math-expression-evaluator,1.2.16,MIT media-typer,0.3.0,MIT memoist,0.15.0,MIT @@ -658,17 +667,16 @@ methods,1.1.2,MIT micromatch,2.3.11,MIT miller-rabin,4.0.0,MIT mime,1.3.4,MIT -mime-db,1.27.0,MIT +mime-db,1.26.0,MIT mime-types,2.99.3,"MIT,Artistic-2.0,GPL-2.0" mimemagic,0.3.0,MIT mini_portile2,2.1.0,MIT minimalistic-assert,1.0.0,ISC -minimalistic-crypto-utils,1.0.1,MIT minimatch,3.0.3,ISC minimist,0.0.8,MIT mkdirp,0.5.1,MIT -moment,2.18.1,MIT -mousetrap,1.6.1,Apache 2.0 +moment,2.17.1,MIT +mousetrap,1.4.6,Apache 2.0 mousetrap-rails,1.4.6,"MIT,Apache" ms,0.7.2,MIT multi_json,1.12.1,MIT @@ -684,14 +692,15 @@ nested-error-stacks,1.0.2,MIT net-ldap,0.12.1,MIT net-ssh,3.0.1,MIT netrc,0.11.0,MIT +node-ensure,0.0.0,MIT node-libs-browser,2.0.0,MIT -node-pre-gyp,0.6.34,New BSD +node-pre-gyp,0.6.33,New BSD node-zopfli,2.0.2,MIT nodemon,1.11.0,MIT nokogiri,1.6.8.1,MIT -nopt,4.0.1,ISC -normalize-package-data,2.3.6,Simplified BSD -normalize-path,2.1.1,MIT +nopt,3.0.6,ISC +normalize-package-data,2.3.5,Simplified BSD +normalize-path,2.0.1,MIT normalize-range,0.1.2,MIT normalize-url,1.9.1,MIT npmlog,4.0.2,ISC @@ -700,13 +709,13 @@ number-is-nan,1.0.1,MIT numerizer,0.1.1,MIT oauth,0.5.1,MIT oauth-sign,0.8.2,Apache 2.0 -oauth2,1.2.0,MIT +oauth2,1.3.1,MIT object-assign,4.1.1,MIT object-component,0.0.3,unknown object.omit,2.0.1,MIT obuf,1.1.1,MIT octokit,4.6.2,MIT -oj,2.17.4,MIT +oj,2.17.5,MIT omniauth,1.4.2,MIT omniauth-auth0,1.4.1,MIT omniauth-authentiq,0.3.0,MIT @@ -727,7 +736,7 @@ omniauth-twitter,1.2.1,MIT omniauth_crowd,2.2.3,MIT on-finished,2.3.0,MIT on-headers,1.0.1,MIT -once,1.4.0,ISC +once,1.3.3,ISC onetime,1.1.0,MIT opener,1.4.3,(WTFPL OR MIT) opn,4.0.2,MIT @@ -748,7 +757,7 @@ p-locate,2.0.0,MIT package-json,1.2.0,MIT pako,1.0.5,(MIT AND Zlib) paranoia,2.2.0,MIT -parse-asn1,5.1.0,ISC +parse-asn1,5.0.0,ISC parse-glob,3.0.4,MIT parse-json,2.2.0,MIT parsejson,0.0.3,MIT @@ -762,10 +771,10 @@ path-is-inside,1.0.2,(WTFPL OR MIT) path-parse,1.0.5,MIT path-to-regexp,0.1.7,MIT path-type,1.1.0,MIT -pause-stream,0.0.11,"Apache2,MIT" +pause-stream,0.0.11,"MIT,Apache2" pbkdf2,3.0.9,MIT +pdfjs-dist,1.8.252,Apache 2.0 pend,1.2.0,MIT -performance-now,0.2.0,MIT pg,0.18.4,"BSD,ruby,GPL" phantomjs-prebuilt,2.1.14,Apache 2.0 pify,2.3.0,MIT @@ -775,6 +784,7 @@ pinkie-promise,2.0.1,MIT pkg-dir,1.0.0,MIT pkg-up,1.0.0,MIT pluralize,1.2.1,MIT +po_to_json,1.0.1,MIT portfinder,1.0.13,MIT posix-spawn,0.3.11,"MIT,LGPL" postcss,5.2.16,MIT @@ -818,12 +828,13 @@ premailer,1.8.6,New BSD premailer-rails,1.9.2,MIT prepend-http,1.0.4,MIT preserve,0.2.0,MIT +prismjs,1.6.0,MIT private,0.1.7,MIT process,0.11.9,MIT process-nextick-args,1.0.7,MIT progress,1.1.8,MIT proto-list,1.2.4,ISC -proxy-addr,1.1.4,MIT +proxy-addr,1.1.3,MIT prr,0.0.0,MIT ps-tree,1.1.0,MIT pseudomap,1.0.2,ISC @@ -832,7 +843,7 @@ punycode,1.4.1,MIT pyu-ruby-sasl,0.0.3.3,MIT q,1.5.0,MIT qjobs,1.1.5,MIT -qs,6.4.0,New BSD +qs,6.2.0,New BSD query-string,4.3.2,MIT querystring,0.2.0,MIT querystring-es3,0.2.1,MIT @@ -857,15 +868,16 @@ randomatic,1.1.6,MIT randombytes,2.0.3,MIT range-parser,1.2.0,MIT raphael,2.2.7,MIT +raven-js,3.15.0,Simplified BSD raw-body,2.2.0,MIT raw-loader,0.5.1,MIT -rc,1.2.1,(BSD-2-Clause OR MIT OR Apache-2.0) +rc,1.1.6,(BSD-2-Clause OR MIT OR Apache-2.0) rdoc,4.2.2,ruby react-dev-utils,0.5.2,New BSD read-all-stream,3.1.0,MIT read-pkg,1.1.0,MIT read-pkg-up,1.0.1,MIT -readable-stream,2.0.6,MIT +readable-stream,2.2.2,MIT readdirp,2.1.0,MIT readline2,1.0.1,MIT recaptcha,3.0.0,MIT @@ -873,7 +885,7 @@ rechoir,0.6.2,MIT recursive-open-struct,1.0.0,MIT recursive-readdir,2.1.1,MIT redcarpet,3.4.0,MIT -redis,3.2.2,MIT +redis,3.3.3,MIT redis-actionpack,5.0.1,MIT redis-activesupport,5.0.1,MIT redis-namespace,1.5.2,MIT @@ -883,18 +895,17 @@ redis-store,1.2.0,MIT reduce-css-calc,1.3.0,MIT reduce-function-call,1.0.2,MIT regenerate,1.3.2,MIT -regenerator-runtime,0.10.3,MIT +regenerator-runtime,0.10.1,MIT regenerator-transform,0.9.8,BSD regex-cache,0.4.3,MIT regexpu-core,2.0.0,MIT registry-url,3.1.0,MIT regjsgen,0.2.0,MIT regjsparser,0.1.5,BSD -remove-trailing-separator,1.0.1,ISC repeat-element,1.1.2,MIT repeat-string,1.6.1,MIT repeating,2.0.1,MIT -request,2.81.0,Apache 2.0 +request,2.79.0,Apache 2.0 request-progress,2.0.1,MIT request_store,1.3.1,MIT require-directory,2.1.1,MIT @@ -902,14 +913,14 @@ require-from-string,1.2.1,MIT require-main-filename,1.0.1,ISC require-uncached,1.0.3,MIT requires-port,1.0.0,MIT -resolve,1.3.2,MIT +resolve,1.2.0,MIT resolve-from,1.0.1,MIT responders,2.3.0,MIT rest-client,2.0.0,MIT restore-cursor,1.0.1,MIT retriable,1.4.1,MIT right-align,0.1.3,MIT -rimraf,2.6.1,ISC +rimraf,2.5.4,ISC rinku,2.0.0,ISC ripemd160,1.0.1,New BSD rotp,2.1.2,MIT @@ -919,6 +930,7 @@ rqrcode-rails3,0.1.7,MIT ruby-fogbugz,0.2.1,MIT ruby-prof,0.16.2,Simplified BSD ruby-saml,1.4.1,MIT +ruby_parser,3.8.4,MIT rubyntlm,0.5.2,MIT rubypants,0.2.0,BSD rufus-scheduler,3.1.10,MIT @@ -934,23 +946,25 @@ sawyer,0.8.1,MIT sax,1.2.2,ISC securecompare,1.0.0,MIT seed-fu,2.3.6,MIT +select,1.1.2,MIT select-hose,2.0.0,MIT select2,3.5.2-browserify,unknown select2-rails,3.5.9.3,MIT semver,5.3.0,ISC semver-diff,2.1.0,MIT -send,0.15.1,MIT +send,0.14.2,MIT sentry-raven,2.4.0,Apache 2.0 serve-index,1.8.0,MIT -serve-static,1.12.1,MIT +serve-static,1.11.2,MIT set-blocking,2.0.0,ISC set-immediate-shim,1.0.1,MIT setimmediate,1.0.5,MIT -setprototypeof,1.0.3,ISC +setprototypeof,1.0.2,ISC settingslogic,2.0.9,MIT +sexp_processor,4.8.0,MIT sha.js,2.4.8,MIT -shelljs,0.7.7,New BSD -sidekiq,4.2.7,LGPL +shelljs,0.7.6,New BSD +sidekiq,5.0.0,LGPL sidekiq-cron,0.4.4,MIT sidekiq-limit_fetch,3.4.0,MIT sigmund,1.0.1,ISC @@ -961,16 +975,16 @@ slash,1.0.0,MIT slice-ansi,0.0.4,MIT slide,1.1.6,ISC sntp,1.0.9,BSD -socket.io,1.7.3,MIT +socket.io,1.7.2,MIT socket.io-adapter,0.5.0,MIT -socket.io-client,1.7.3,MIT +socket.io-client,1.7.2,MIT socket.io-parser,2.3.1,MIT sockjs,0.3.18,MIT sockjs-client,1.0.1,MIT sort-keys,1.1.2,MIT source-list-map,0.1.8,MIT source-map,0.5.6,New BSD -source-map-support,0.4.14,MIT +source-map-support,0.4.11,MIT spdx-correct,1.0.2,Apache 2.0 spdx-expression-parse,1.0.4,(MIT AND CC-BY-3.0) spdx-license-ids,1.2.2,Unlicense @@ -980,7 +994,8 @@ split,0.3.3,MIT sprintf-js,1.0.3,New BSD sprockets,3.7.1,MIT sprockets-rails,3.2.0,MIT -sshpk,1.11.0,MIT +sql.js,0.4.0,MIT +sshpk,1.10.2,MIT state_machines,0.4.0,MIT state_machines-activemodel,0.4.0,MIT state_machines-activerecord,0.4.0,MIT @@ -988,7 +1003,7 @@ stats-webpack-plugin,0.4.3,MIT statuses,1.3.1,MIT stream-browserify,2.0.1,MIT stream-combiner,0.0.4,MIT -stream-http,2.7.0,MIT +stream-http,2.6.3,MIT stream-shift,1.0.0,MIT strict-uri-encode,1.1.0,MIT string-length,1.0.1,MIT @@ -998,16 +1013,17 @@ stringex,2.5.2,MIT stringstream,0.0.5,MIT strip-ansi,3.0.1,MIT strip-bom,2.0.0,MIT -strip-json-comments,2.0.1,MIT -supports-color,3.2.3,MIT +strip-json-comments,1.0.4,MIT +supports-color,0.2.0,MIT svgo,0.7.2,MIT sys-filesystem,1.1.6,Artistic 2.0 table,3.8.3,New BSD tapable,0.2.6,MIT tar,2.2.1,ISC -tar-pack,3.4.0,Simplified BSD +tar-pack,3.3.0,Simplified BSD temple,0.7.7,MIT -test-exclude,4.0.3,ISC +test-exclude,4.0.0,ISC +text,1.3.1,MIT text-table,0.2.0,MIT thor,0.19.4,MIT thread_safe,0.3.6,Apache 2.0 @@ -1021,7 +1037,8 @@ timeago.js,2.0.5,MIT timed-out,2.0.0,MIT timers-browserify,2.0.2,MIT timfel-krb5-auth,0.8.3,LGPL -tmp,0.0.31,MIT +tiny-emitter,1.1.0,MIT +tmp,0.0.28,MIT to-array,0.1.4,MIT to-arraybuffer,1.0.1,MIT to-fast-properties,1.0.2,MIT @@ -1034,10 +1051,10 @@ trim-right,1.0.1,MIT truncato,0.7.8,MIT tryit,1.0.3,MIT tty-browserify,0.0.0,MIT -tunnel-agent,0.6.0,Apache 2.0 +tunnel-agent,0.4.3,Apache 2.0 tweetnacl,0.14.5,Unlicense type-check,0.3.2,MIT -type-is,1.6.15,MIT +type-is,1.6.14,MIT typedarray,0.0.6,MIT tzinfo,1.2.2,MIT u2f,0.2.1,MIT @@ -1060,17 +1077,18 @@ uniqs,2.0.0,MIT unpipe,1.0.0,MIT update-notifier,0.5.0,Simplified BSD url,0.11.0,MIT +url-loader,0.5.8,MIT url-parse,1.0.5,MIT url_safe_base64,0.2.2,MIT user-home,2.0.0,MIT -useragent,2.1.13,MIT +useragent,2.1.12,MIT util,0.10.3,MIT util-deprecate,1.0.2,MIT utils-merge,1.0.0,MIT uuid,3.0.1,MIT validate-npm-package-license,3.0.1,Apache 2.0 validates_hostname,1.0.6,MIT -vary,1.1.1,MIT +vary,1.1.0,MIT vendors,1.0.1,MIT verror,1.3.6,MIT version_sorter,2.1.0,MIT @@ -1085,30 +1103,31 @@ vue-loader,11.3.4,MIT vue-resource,0.9.3,MIT vue-style-loader,2.0.5,MIT vue-template-compiler,2.2.6,MIT -vue-template-es2015-compiler,1.5.2,MIT +vue-template-es2015-compiler,1.5.1,MIT warden,1.2.6,MIT watchpack,1.3.1,MIT wbuf,1.7.2,MIT webpack,2.3.3,MIT -webpack-bundle-analyzer,2.3.1,MIT -webpack-dev-middleware,1.10.1,MIT +webpack-bundle-analyzer,2.3.0,MIT +webpack-dev-middleware,1.10.0,MIT webpack-dev-server,2.4.2,MIT webpack-rails,0.9.10,MIT -webpack-sources,0.1.5,MIT +webpack-sources,0.1.4,MIT websocket-driver,0.6.5,MIT websocket-extensions,0.1.1,MIT whet.extend,0.9.9,MIT -which,1.2.14,ISC +which,1.2.12,ISC which-module,1.0.0,ISC wide-align,1.1.0,ISC wikicloth,0.8.1,MIT window-size,0.1.0,MIT -wordwrap,1.0.0,MIT +wordwrap,0.0.2,MIT/X11 +worker-loader,0.8.0,MIT wrap-ansi,2.1.0,MIT wrappy,1.0.2,ISC write,0.2.1,MIT write-file-atomic,1.3.1,ISC -ws,1.1.2,MIT +ws,1.1.1,MIT wtf-8,1.0.0,MIT xdg-basedir,2.0.0,MIT xmlhttprequest-ssl,1.5.3,MIT |