diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-13 18:10:03 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-13 18:10:03 +0300 |
commit | 6df7943512ca90323c69b926404cc561b6305ce2 (patch) | |
tree | 5dbdb697f641358516ddae9b45ab8bae5d58de81 | |
parent | 5605efec12c99adf88f641391cb879dedf8fa05e (diff) |
Add latest changes from gitlab-org/gitlab@master
110 files changed, 1613 insertions, 522 deletions
diff --git a/app/assets/javascripts/design_management/components/upload/design_dropzone.vue b/app/assets/javascripts/design_management/components/upload/design_dropzone.vue index aa3a6e580d4..68183bb29cf 100644 --- a/app/assets/javascripts/design_management/components/upload/design_dropzone.vue +++ b/app/assets/javascripts/design_management/components/upload/design_dropzone.vue @@ -17,6 +17,11 @@ export default { type: Boolean, required: true, }, + isDraggingDesign: { + type: Boolean, + required: false, + default: false, + }, }, data() { return { @@ -121,7 +126,7 @@ export default { </slot> <transition name="design-dropzone-fade"> <div - v-show="dragging" + v-show="dragging && !isDraggingDesign" class="card design-dropzone-border design-dropzone-overlay w-100 h-100 position-absolute d-flex-center p-3 bg-white" > <div v-show="!isDragDataValid" class="mw-50 text-center"> diff --git a/app/assets/javascripts/design_management/graphql/mutations/move_design.mutation.graphql b/app/assets/javascripts/design_management/graphql/mutations/move_design.mutation.graphql new file mode 100644 index 00000000000..144b2729999 --- /dev/null +++ b/app/assets/javascripts/design_management/graphql/mutations/move_design.mutation.graphql @@ -0,0 +1,18 @@ +#import "../fragments/design_list.fragment.graphql" + +mutation DesignManagementMove( + $id: DesignManagementDesignID! + $previous: DesignManagementDesignID + $next: DesignManagementDesignID +) { + designManagementMove(input: { id: $id, previous: $previous, next: $next }) { + designCollection { + designs { + nodes { + ...DesignListItem + } + } + } + errors + } +} diff --git a/app/assets/javascripts/design_management/pages/index.vue b/app/assets/javascripts/design_management/pages/index.vue index e35d1a8c419..6e130b7c741 100644 --- a/app/assets/javascripts/design_management/pages/index.vue +++ b/app/assets/javascripts/design_management/pages/index.vue @@ -2,6 +2,7 @@ import { GlLoadingIcon, GlButton, GlAlert } from '@gitlab/ui'; import createFlash from '~/flash'; import { s__, sprintf } from '~/locale'; +import VueDraggable from 'vuedraggable'; import UploadButton from '../components/upload/button.vue'; import DeleteButton from '../components/delete_button.vue'; import Design from '../components/list/item.vue'; @@ -9,6 +10,7 @@ import DesignDestroyer from '../components/design_destroyer.vue'; import DesignVersionDropdown from '../components/upload/design_version_dropdown.vue'; import DesignDropzone from '../components/upload/design_dropzone.vue'; import uploadDesignMutation from '../graphql/mutations/upload_design.mutation.graphql'; +import moveDesignMutation from '../graphql/mutations/move_design.mutation.graphql'; import permissionsQuery from '../graphql/queries/design_permissions.query.graphql'; import getDesignListQuery from '../graphql/queries/get_design_list.query.graphql'; import allDesignsMixin from '../mixins/all_designs'; @@ -16,13 +18,18 @@ import { UPLOAD_DESIGN_ERROR, EXISTING_DESIGN_DROP_MANY_FILES_MESSAGE, EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE, + MOVE_DESIGN_ERROR, designUploadSkippedWarning, designDeletionError, } from '../utils/error_messages'; -import { updateStoreAfterUploadDesign } from '../utils/cache_update'; +import { + updateStoreAfterUploadDesign, + updateDesignsOnStoreAfterReorder, +} from '../utils/cache_update'; import { designUploadOptimisticResponse, isValidDesignFile, + moveDesignOptimisticResponse, } from '../utils/design_management_utils'; import { getFilename } from '~/lib/utils/file_upload'; import { DESIGNS_ROUTE_NAME } from '../router/constants'; @@ -40,6 +47,7 @@ export default { DesignVersionDropdown, DeleteButton, DesignDropzone, + VueDraggable, }, mixins: [allDesignsMixin], apollo: { @@ -61,6 +69,8 @@ export default { }, filesToBeSaved: [], selectedDesigns: [], + isDraggingDesign: false, + reorderedDesigns: null, }; }, computed: { @@ -254,11 +264,48 @@ export default { toggleOffPasteListener() { document.removeEventListener('paste', this.onDesignPaste); }, + designMoveVariables(newIndex, element) { + const variables = { + id: element.id, + }; + if (newIndex > 0) { + variables.previous = this.reorderedDesigns[newIndex - 1].id; + } + if (newIndex < this.reorderedDesigns.length - 1) { + variables.next = this.reorderedDesigns[newIndex + 1].id; + } + return variables; + }, + reorderDesigns({ moved: { newIndex, element } }) { + this.$apollo + .mutate({ + mutation: moveDesignMutation, + variables: this.designMoveVariables(newIndex, element), + update: (store, { data: { designManagementMove } }) => { + return updateDesignsOnStoreAfterReorder( + store, + designManagementMove, + this.projectQueryBody, + ); + }, + optimisticResponse: moveDesignOptimisticResponse(this.reorderedDesigns), + }) + .catch(() => { + createFlash(MOVE_DESIGN_ERROR); + }); + }, + onDesignMove(designs) { + this.reorderedDesigns = designs; + }, }, beforeRouteUpdate(to, from, next) { this.selectedDesigns = []; next(); }, + dragOptions: { + animation: 200, + ghostClass: 'gl-visibility-hidden', + }, }; </script> @@ -312,20 +359,35 @@ export default { <gl-alert v-else-if="error" variant="danger" :dismissible="false"> {{ __('An error occurred while loading designs. Please try again.') }} </gl-alert> - <ol v-else class="list-unstyled row"> - <li :class="designDropzoneWrapperClass" data-testid="design-dropzone-wrapper"> - <design-dropzone - :class="{ 'design-list-item design-list-item-new': !isDesignListEmpty }" - :has-designs="hasDesigns" - @change="onUploadDesign" - /> - </li> - <li v-for="design in designs" :key="design.id" class="col-md-6 col-lg-3 gl-mb-3"> + <vue-draggable + v-else + :value="designs" + :disabled="!isLatestVersion" + v-bind="$options.dragOptions" + tag="ol" + draggable=".js-design-tile" + class="list-unstyled row" + @start="isDraggingDesign = true" + @end="isDraggingDesign = false" + @change="reorderDesigns" + @input="onDesignMove" + > + <li + v-for="design in designs" + :key="design.id" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" + > <design-dropzone :has-designs="hasDesigns" + :is-dragging-design="isDraggingDesign" @change="onExistingDesignDropzoneChange($event, design.filename)" - ><design v-bind="design" :is-uploading="isDesignToBeSaved(design.filename)" - /></design-dropzone> + > + <design + v-bind="design" + :is-uploading="isDesignToBeSaved(design.filename)" + class="gl-bg-white" + /> + </design-dropzone> <input v-if="canSelectDesign(design.filename)" @@ -335,7 +397,17 @@ export default { @change="changeSelectedDesigns(design.filename)" /> </li> - </ol> + <template #header> + <li :class="designDropzoneWrapperClass" data-testid="design-dropzone-wrapper"> + <design-dropzone + :is-dragging-design="isDraggingDesign" + :class="{ 'design-list-item design-list-item-new': !isDesignListEmpty }" + :has-designs="hasDesigns" + @change="onUploadDesign" + /> + </li> + </template> + </vue-draggable> </div> <router-view :key="$route.fullPath" /> </div> diff --git a/app/assets/javascripts/design_management/utils/cache_update.js b/app/assets/javascripts/design_management/utils/cache_update.js index 74ca59ad5c7..3e6ed39fbe8 100644 --- a/app/assets/javascripts/design_management/utils/cache_update.js +++ b/app/assets/javascripts/design_management/utils/cache_update.js @@ -203,6 +203,15 @@ const addNewDesignToStore = (store, designManagementUpload, query) => { }); }; +const moveDesignInStore = (store, designManagementMove, query) => { + const data = store.readQuery(query); + data.project.issue.designCollection.designs = designManagementMove.designCollection.designs; + store.writeQuery({ + ...query, + data, + }); +}; + const onError = (data, message) => { createFlash(message); throw new Error(data.errors); @@ -264,3 +273,11 @@ export const updateStoreAfterUploadDesign = (store, data, query) => { addNewDesignToStore(store, data, query); } }; + +export const updateDesignsOnStoreAfterReorder = (store, data, query) => { + if (hasErrors(data)) { + createFlash(data.errors[0]); + } else { + moveDesignInStore(store, data, query); + } +}; diff --git a/app/assets/javascripts/design_management/utils/design_management_utils.js b/app/assets/javascripts/design_management/utils/design_management_utils.js index c7fb508b4d7..da8f89ff960 100644 --- a/app/assets/javascripts/design_management/utils/design_management_utils.js +++ b/app/assets/javascripts/design_management/utils/design_management_utils.js @@ -85,7 +85,8 @@ export const designUploadOptimisticResponse = files => { /** * Generates optimistic response for a design upload mutation - * @param {Array<File>} files + * @param {Object} note + * @param {Object} position */ export const updateImageDiffNoteOptimisticResponse = (note, { position }) => ({ // False positive i18n lint: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/26 @@ -104,6 +105,27 @@ export const updateImageDiffNoteOptimisticResponse = (note, { position }) => ({ }, }); +/** + * Generates optimistic response for a design upload mutation + * @param {Array} designs + */ +export const moveDesignOptimisticResponse = designs => ({ + // False positive i18n lint: https://gitlab.com/gitlab-org/frontend/eslint-plugin-i18n/issues/26 + // eslint-disable-next-line @gitlab/require-i18n-strings + __typename: 'Mutation', + designManagementMove: { + __typename: 'DesignManagementMovePayload', + designCollection: { + __typename: 'DesignCollection', + designs: { + __typename: 'DesignConnection', + nodes: designs, + }, + }, + errors: [], + }, +}); + const normalizeAuthor = author => ({ ...author, web_url: author.webUrl, diff --git a/app/assets/javascripts/design_management/utils/error_messages.js b/app/assets/javascripts/design_management/utils/error_messages.js index 7666c726c2f..92526509d77 100644 --- a/app/assets/javascripts/design_management/utils/error_messages.js +++ b/app/assets/javascripts/design_management/utils/error_messages.js @@ -40,6 +40,10 @@ export const EXISTING_DESIGN_DROP_INVALID_FILENAME_MESSAGE = __( 'You must upload a file with the same file name when dropping onto an existing design.', ); +export const MOVE_DESIGN_ERROR = __( + 'Something went wrong when reordering designs. Please try again', +); + const MAX_SKIPPED_FILES_LISTINGS = 5; const oneDesignSkippedMessage = filename => diff --git a/app/assets/javascripts/incidents/components/incidents_list.vue b/app/assets/javascripts/incidents/components/incidents_list.vue index a6503a18702..85f24c5b122 100644 --- a/app/assets/javascripts/incidents/components/incidents_list.vue +++ b/app/assets/javascripts/incidents/components/incidents_list.vue @@ -242,6 +242,7 @@ export default { <gl-button class="gl-my-3 gl-mr-5 create-incident-button" data-testid="createIncidentBtn" + data-qa-selector="create_incident_button" :loading="redirecting" :disabled="redirecting" category="primary" diff --git a/app/assets/javascripts/issuables_list/components/issuable.vue b/app/assets/javascripts/issuables_list/components/issuable.vue index de71235c547..4fc614f8da4 100644 --- a/app/assets/javascripts/issuables_list/components/issuable.vue +++ b/app/assets/javascripts/issuables_list/components/issuable.vue @@ -23,6 +23,8 @@ import IssueAssignees from '~/vue_shared/components/issue/issue_assignees.vue'; import { isScopedLabel } from '~/lib/utils/common_utils'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; +import { convertToCamelCase } from '~/lib/utils/text_utility'; + export default { i18n: { openedAgo: __('opened %{timeAgoString} by %{user}'), @@ -34,6 +36,8 @@ export default { GlLabel, GlIcon, GlSprintf, + IssueHealthStatus: () => + import('ee_component/related_items_tree/components/issue_health_status.vue'), }, directives: { GlTooltip, @@ -195,6 +199,9 @@ export default { }, ]; }, + healthStatus() { + return convertToCamelCase(this.issuable.health_status); + }, }, mounted() { // TODO: Refactor user popover to use its own component instead of @@ -288,7 +295,7 @@ export default { </div> <div class="issuable-info"> - <span class="js-ref-path"> + <span class="js-ref-path gl-mr-4 mr-sm-0"> <span v-if="isJiraIssue" class="svg-container jira-logo-container" @@ -298,7 +305,7 @@ export default { {{ referencePath }} </span> - <span data-testid="openedByMessage" class="gl-display-none d-sm-inline-block gl-mr-2"> + <span data-testid="openedByMessage" class="gl-display-none d-sm-inline-block gl-mr-4"> · <gl-sprintf :message="isJiraIssue ? $options.i18n.openedAgoJira : $options.i18n.openedAgo" @@ -321,7 +328,7 @@ export default { <gl-link v-if="issuable.milestone" v-gl-tooltip - class="gl-display-none d-sm-inline-block gl-mr-2 js-milestone" + class="gl-display-none d-sm-inline-block gl-mr-4 js-milestone milestone" :href="milestoneLink" :title="milestoneTooltipText" > @@ -332,7 +339,7 @@ export default { <span v-if="dueDate" v-gl-tooltip - class="gl-display-none d-sm-inline-block gl-mr-2 js-due-date" + class="gl-display-none d-sm-inline-block gl-mr-4 js-due-date" :class="{ cred: isOverdue }" :title="__('Due date')" > @@ -340,6 +347,24 @@ export default { {{ dueDateWords }} </span> + <span + v-if="hasWeight" + v-gl-tooltip + :title="__('Weight')" + class="gl-display-none d-sm-inline-block gl-mr-4" + data-testid="weight" + data-qa-selector="issuable_weight_content" + > + <gl-icon name="weight" class="align-text-bottom" /> + {{ issuable.weight }} + </span> + + <issue-health-status + v-if="issuable.health_status" + :health-status="healthStatus" + class="gl-mr-4 issuable-tag-valign" + /> + <gl-label v-for="label in issuable.labels" :key="label.id" @@ -351,21 +376,9 @@ export default { :title="label.name" :scoped="isScoped(label)" size="sm" - class="gl-mr-2" + class="gl-mr-2 issuable-tag-valign" >{{ label.name }}</gl-label > - - <span - v-if="hasWeight" - v-gl-tooltip - :title="__('Weight')" - class="gl-display-none d-sm-inline-block" - data-testid="weight" - data-qa-selector="issuable_weight_content" - > - <gl-icon name="weight" class="align-text-bottom" /> - {{ issuable.weight }} - </span> </div> </div> diff --git a/app/assets/javascripts/vue_shared/components/clone_dropdown.vue b/app/assets/javascripts/vue_shared/components/clone_dropdown.vue index ac95c88225e..6f5ea8dcbee 100644 --- a/app/assets/javascripts/vue_shared/components/clone_dropdown.vue +++ b/app/assets/javascripts/vue_shared/components/clone_dropdown.vue @@ -45,7 +45,7 @@ export default { }; </script> <template> - <gl-new-dropdown :text="$options.labels.defaultLabel" category="primary" variant="info"> + <gl-new-dropdown right :text="$options.labels.defaultLabel" category="primary" variant="info"> <div class="pb-2 mx-1"> <template v-if="sshLink"> <gl-new-dropdown-header>{{ $options.labels.ssh }}</gl-new-dropdown-header> diff --git a/app/assets/stylesheets/components/related_items_list.scss b/app/assets/stylesheets/components/related_items_list.scss index 39701b74fee..c0699844387 100644 --- a/app/assets/stylesheets/components/related_items_list.scss +++ b/app/assets/stylesheets/components/related_items_list.scss @@ -81,27 +81,6 @@ $item-remove-button-space: 42px; max-width: 0; } - .status { - &-at-risk { - color: $red-500; - background-color: $red-100; - } - - &-needs-attention { - color: $orange-700; - background-color: $orange-100; - } - - &-on-track { - color: $green-600; - background-color: $green-100; - } - } - - .gl-label-text { - font-weight: $gl-font-weight-bold; - } - .bullet-separator { font-size: 9px; color: $gray-200; diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index a7d0d4259ea..ef81892719c 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -804,6 +804,10 @@ } } } + + .milestone { + color: $gray-700; + } } @media(max-width: map-get($grid-breakpoints, lg)-1) { diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 7f21d9418da..f3a47b03e2e 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -37,8 +37,8 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo push_frontend_feature_flag(:file_identifier_hash) push_frontend_feature_flag(:batch_suggestions, @project, default_enabled: true) push_frontend_feature_flag(:auto_expand_collapsed_diffs, @project, default_enabled: true) - push_frontend_feature_flag(:hide_jump_to_next_unresolved_in_threads, @project) push_frontend_feature_flag(:approvals_commented_by, @project, default_enabled: true) + push_frontend_feature_flag(:hide_jump_to_next_unresolved_in_threads, default_enabled: true) end before_action do diff --git a/app/graphql/mutations/boards/lists/base.rb b/app/graphql/mutations/boards/lists/base.rb new file mode 100644 index 00000000000..34b271ba3b8 --- /dev/null +++ b/app/graphql/mutations/boards/lists/base.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Mutations + module Boards + module Lists + class Base < BaseMutation + include Mutations::ResolvesIssuable + + argument :board_id, ::Types::GlobalIDType[::Board], + required: true, + description: 'The Global ID of the issue board to mutate' + + field :list, + Types::BoardListType, + null: true, + description: 'List of the issue board' + + authorize :admin_list + + private + + def find_object(id:) + GitlabSchema.object_from_id(id, expected_type: ::Board) + end + end + end + end +end diff --git a/app/graphql/mutations/boards/lists/create.rb b/app/graphql/mutations/boards/lists/create.rb new file mode 100644 index 00000000000..4f545709ee9 --- /dev/null +++ b/app/graphql/mutations/boards/lists/create.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module Mutations + module Boards + module Lists + class Create < Base + graphql_name 'BoardListCreate' + + argument :backlog, GraphQL::BOOLEAN_TYPE, + required: false, + description: 'Create the backlog list' + + argument :label_id, ::Types::GlobalIDType[::Label], + required: false, + description: 'ID of an existing label' + + def ready?(**args) + if args.slice(*mutually_exclusive_args).size != 1 + arg_str = mutually_exclusive_args.map { |x| x.to_s.camelize(:lower) }.join(' or ') + raise Gitlab::Graphql::Errors::ArgumentError, "one and only one of #{arg_str} is required" + end + + super + end + + def resolve(**args) + board = authorized_find!(id: args[:board_id]) + params = create_list_params(args) + + authorize_list_type_resource!(board, params) + + list = create_list(board, params) + + { + list: list.valid? ? list : nil, + errors: errors_on_object(list) + } + end + + private + + def authorize_list_type_resource!(board, params) + return unless params[:label_id] + + labels = ::Labels::AvailableLabelsService.new(current_user, board.resource_parent, params) + .filter_labels_ids_in_param(:label_id) + + unless labels.present? + raise Gitlab::Graphql::Errors::ArgumentError, 'Label not found!' + end + end + + def create_list(board, params) + create_list_service = + ::Boards::Lists::CreateService.new(board.resource_parent, current_user, params) + + create_list_service.execute(board) + end + + def create_list_params(args) + params = args.slice(*mutually_exclusive_args).with_indifferent_access + params[:label_id] = GitlabSchema.parse_gid(params[:label_id]).model_id if params[:label_id] + + params + end + + def mutually_exclusive_args + [:backlog, :label_id] + end + end + end + end +end diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb index e3025587ba6..ea0e3a8adb7 100644 --- a/app/graphql/types/mutation_type.rb +++ b/app/graphql/types/mutation_type.rb @@ -15,6 +15,7 @@ module Types mount_mutation Mutations::AwardEmojis::Remove mount_mutation Mutations::AwardEmojis::Toggle mount_mutation Mutations::Boards::Issues::IssueMoveList + mount_mutation Mutations::Boards::Lists::Create mount_mutation Mutations::Branches::Create, calls_gitaly: true mount_mutation Mutations::Commits::Create, calls_gitaly: true mount_mutation Mutations::Discussions::ToggleResolve diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index c153236dddd..2a67484ac8b 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -418,22 +418,6 @@ module Ci false end - def ordered_stages - if ::Gitlab::Ci::Features.atomic_processing?(project) - # The `Ci::Stage` contains all up-to date data - # as atomic processing updates all data in-bulk - stages - elsif complete? - # The `Ci::Stage` contains up-to date data only for `completed` pipelines - # this is due to asynchronous processing of pipeline, and stages possibly - # not updated inline with processing of pipeline - stages - else - # In other cases, we need to calculate stages dynamically - legacy_stages - end - end - def legacy_stages_using_sql # TODO, this needs refactoring, see gitlab-foss#26481. stages_query = statuses @@ -470,6 +454,7 @@ module Ci triggered_pipelines.preload(:source_job) end + # TODO: Remove usage of this method in templates def legacy_stages if ::Gitlab::Ci::Features.composite_status?(project) legacy_stages_using_composite_status @@ -1048,10 +1033,6 @@ module Ci @persistent_ref ||= PersistentRef.new(pipeline: self) end - def find_successful_build_ids_by_names(names) - statuses.latest.success.where(name: names).pluck(:id) - end - def cacheable? Ci::PipelineEnums.ci_config_sources.key?(config_source.to_sym) end diff --git a/app/models/ci/pipeline_artifact.rb b/app/models/ci/pipeline_artifact.rb index 92e567ef4be..79407c66242 100644 --- a/app/models/ci/pipeline_artifact.rb +++ b/app/models/ci/pipeline_artifact.rb @@ -22,8 +22,22 @@ module Ci validates :size, presence: true, numericality: { less_than_or_equal_to: FILE_SIZE_LIMIT } validates :file_type, presence: true + mount_uploader :file, Ci::PipelineArtifactUploader + before_save :set_size, if: :file_changed? + after_save :update_file_store, if: :saved_change_to_file? + enum file_type: { code_coverage: 1 } + + def set_size + self.size = file.size + end + + def update_file_store + # The file.object_store is set during `uploader.store!` + # which happens after object is inserted/updated + self.update_column(:file_store, file.object_store) + end end end diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index c85292feb25..8aba74bedbc 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -100,9 +100,7 @@ class CommitStatus < ApplicationRecord # will not be refreshed to pick the change self.processed_will_change! - if !::Gitlab::Ci::Features.atomic_processing?(project) - self.processed = nil - elsif latest? + if latest? self.processed = false # force refresh of all dependent ones elsif retried? self.processed = true # retried are considered to be already processed @@ -164,8 +162,7 @@ class CommitStatus < ApplicationRecord next unless commit_status.project commit_status.run_after_commit do - schedule_stage_and_pipeline_update - + PipelineProcessWorker.perform_async(pipeline_id) ExpireJobCacheWorker.perform_async(id) end end @@ -186,14 +183,6 @@ class CommitStatus < ApplicationRecord select(:name) end - def self.status_for_prior_stages(index, project:) - before_stage(index).latest.slow_composite_status(project: project) || 'success' - end - - def self.status_for_names(names, project:) - where(name: names).latest.slow_composite_status(project: project) || 'success' - end - def self.update_as_processed! # Marks items as processed # we do not increase `lock_version`, as we are the one @@ -286,21 +275,6 @@ class CommitStatus < ApplicationRecord def unrecoverable_failure? script_failure? || missing_dependency_failure? || archived_failure? || scheduler_failure? || data_integrity_failure? end - - def schedule_stage_and_pipeline_update - if ::Gitlab::Ci::Features.atomic_processing?(project) - # Atomic Processing requires only single Worker - PipelineProcessWorker.perform_async(pipeline_id, [id]) - else - if complete? || manual? - PipelineProcessWorker.perform_async(pipeline_id, [id]) - else - PipelineUpdateWorker.perform_async(pipeline_id) - end - - StageUpdateWorker.perform_async(stage_id) - end - end end CommitStatus.prepend_if_ee('::EE::CommitStatus') diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 90893882fe5..fdc55063433 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -149,6 +149,7 @@ class MergeRequestDiff < ApplicationRecord # All diff information is collected from repository after object is created. # It allows you to override variables like head_commit_sha before getting diff. after_create :save_git_content, unless: :importing? + after_create :set_count_columns after_create_commit :set_as_latest_diff, unless: :importing? after_save :update_external_diff_store @@ -642,6 +643,7 @@ class MergeRequestDiff < ApplicationRecord rows = build_merge_request_diff_files(diff_collection) create_merge_request_diff_files(rows) + self.class.uncached { merge_request_diff_files.reset } end # Set our state to 'overflow' to make the #empty? and #collected? @@ -657,12 +659,14 @@ class MergeRequestDiff < ApplicationRecord def save_commits MergeRequestDiffCommit.create_bulk(self.id, compare.commits.reverse) + self.class.uncached { merge_request_diff_commits.reset } + end - # merge_request_diff_commits.reset is preferred way to reload associated - # objects but it returns cached result for some reason in this case - # we can circumvent that by specifying that we need an uncached reload - commits = self.class.uncached { merge_request_diff_commits.reset } - self.commits_count = commits.size + def set_count_columns + update_columns( + commits_count: merge_request_diff_commits.size, + files_count: merge_request_diff_files.size + ) end def repository diff --git a/app/serializers/merge_requests/pipeline_entity.rb b/app/serializers/merge_requests/pipeline_entity.rb index 94e81dd8b7d..97d7620154e 100644 --- a/app/serializers/merge_requests/pipeline_entity.rb +++ b/app/serializers/merge_requests/pipeline_entity.rb @@ -25,7 +25,7 @@ class MergeRequests::PipelineEntity < Grape::Entity pipeline.detailed_status(request.current_user) end - expose :ordered_stages, as: :stages, using: StageEntity + expose :stages, using: StageEntity end # Coverage isn't always necessary (e.g. when displaying project pipelines in diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb index 9f26dda9eef..de1e07139ad 100644 --- a/app/serializers/pipeline_entity.rb +++ b/app/serializers/pipeline_entity.rb @@ -36,7 +36,7 @@ class PipelineEntity < Grape::Entity expose :details do expose :detailed_status, as: :status, with: DetailedStatusEntity - expose :ordered_stages, as: :stages, using: StageEntity + expose :stages, using: StageEntity expose :duration expose :finished_at expose :name diff --git a/app/serializers/triggered_pipeline_entity.rb b/app/serializers/triggered_pipeline_entity.rb index 47f51a6d76a..9fdadb322bf 100644 --- a/app/serializers/triggered_pipeline_entity.rb +++ b/app/serializers/triggered_pipeline_entity.rb @@ -24,8 +24,8 @@ class TriggeredPipelineEntity < Grape::Entity expose :details do expose :detailed_status, as: :status, with: DetailedStatusEntity - expose :ordered_stages, - as: :stages, using: StageEntity, + expose :stages, + using: StageEntity, if: -> (_, opts) { can_read_details? && expand?(opts) } end diff --git a/app/services/ci/create_web_ide_terminal_service.rb b/app/services/ci/create_web_ide_terminal_service.rb index 29d40756ab4..4f1bf0447d2 100644 --- a/app/services/ci/create_web_ide_terminal_service.rb +++ b/app/services/ci/create_web_ide_terminal_service.rb @@ -32,7 +32,7 @@ module Ci Ci::ProcessPipelineService .new(pipeline) - .execute(nil, initial_process: true) + .execute pipeline_created_counter.increment(source: :webide) end diff --git a/app/services/ci/pipeline_processing/legacy_processing_service.rb b/app/services/ci/pipeline_processing/legacy_processing_service.rb deleted file mode 100644 index 56fbc7271da..00000000000 --- a/app/services/ci/pipeline_processing/legacy_processing_service.rb +++ /dev/null @@ -1,122 +0,0 @@ -# frozen_string_literal: true - -module Ci - module PipelineProcessing - class LegacyProcessingService - include Gitlab::Utils::StrongMemoize - - attr_reader :pipeline - - def initialize(pipeline) - @pipeline = pipeline - end - - def execute(trigger_build_ids = nil, initial_process: false) - success = process_stages_for_stage_scheduling - - # we evaluate dependent needs, - # only when the another job has finished - success = process_dag_builds_without_needs || success if initial_process - success = process_dag_builds_with_needs(trigger_build_ids) || success - - @pipeline.update_legacy_status - - success - end - - private - - def process_stages_for_stage_scheduling - stage_indexes_of_created_stage_scheduled_processables.flat_map do |index| - process_stage_for_stage_scheduling(index) - end.any? - end - - def process_stage_for_stage_scheduling(index) - current_status = status_for_prior_stages(index) - - return unless Ci::HasStatus::COMPLETED_STATUSES.include?(current_status) - - created_stage_scheduled_processables_in_stage(index).find_each.select do |build| - process_build(build, current_status) - end.any? - end - - def process_dag_builds_without_needs - created_processables.scheduling_type_dag.without_needs.each do |build| - process_build(build, 'success') - end - end - - def process_dag_builds_with_needs(trigger_build_ids) - return false unless trigger_build_ids.present? - - # we find processables that are dependent: - # 1. because of current dependency, - trigger_build_names = pipeline.processables.latest - .for_ids(trigger_build_ids).names - - # 2. does not have builds that not yet complete - incomplete_build_names = pipeline.processables.latest - .incomplete.names - - # Each found processable is guaranteed here to have completed status - created_processables - .scheduling_type_dag - .with_needs(trigger_build_names) - .without_needs(incomplete_build_names) - .find_each - .map(&method(:process_dag_build_with_needs)) - .any? - end - - def process_dag_build_with_needs(build) - current_status = status_for_build_needs(build.needs.map(&:name)) - - return unless Ci::HasStatus::COMPLETED_STATUSES.include?(current_status) - - process_build(build, current_status) - end - - def process_build(build, current_status) - Gitlab::OptimisticLocking.retry_lock(build) do |subject| - Ci::ProcessBuildService.new(project, subject.user) - .execute(subject, current_status) - end - end - - def status_for_prior_stages(index) - pipeline.processables.status_for_prior_stages(index, project: pipeline.project) - end - - def status_for_build_needs(needs) - pipeline.processables.status_for_names(needs, project: pipeline.project) - end - - # rubocop: disable CodeReuse/ActiveRecord - def stage_indexes_of_created_stage_scheduled_processables - created_stage_scheduled_processables.order(:stage_idx) - .pluck(Arel.sql('DISTINCT stage_idx')) - end - # rubocop: enable CodeReuse/ActiveRecord - - def created_stage_scheduled_processables_in_stage(index) - created_stage_scheduled_processables - .with_preloads - .for_stage(index) - end - - def created_stage_scheduled_processables - created_processables.scheduling_type_stage - end - - def created_processables - pipeline.processables.created - end - - def project - pipeline.project - end - end - end -end diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb index 1f24dce0458..d84ef5fbb93 100644 --- a/app/services/ci/process_pipeline_service.rb +++ b/app/services/ci/process_pipeline_service.rb @@ -8,20 +8,14 @@ module Ci @pipeline = pipeline end - def execute(trigger_build_ids = nil, initial_process: false) + def execute increment_processing_counter update_retried - if ::Gitlab::Ci::Features.atomic_processing?(pipeline.project) - Ci::PipelineProcessing::AtomicProcessingService - .new(pipeline) - .execute - else - Ci::PipelineProcessing::LegacyProcessingService - .new(pipeline) - .execute(trigger_build_ids, initial_process: initial_process) - end + Ci::PipelineProcessing::AtomicProcessingService + .new(pipeline) + .execute end def metrics diff --git a/app/services/ci/retry_pipeline_service.rb b/app/services/ci/retry_pipeline_service.rb index 4229be6c7d7..2f52f0a39c1 100644 --- a/app/services/ci/retry_pipeline_service.rb +++ b/app/services/ci/retry_pipeline_service.rb @@ -22,12 +22,6 @@ module Ci needs += build.needs.map(&:name) end - # In a DAG, the dependencies may have already completed. Figure out - # which builds have succeeded and use them to update the pipeline. If we don't - # do this, then builds will be stuck in the created state since their dependencies - # will never run. - completed_build_ids = pipeline.find_successful_build_ids_by_names(needs) if needs.any? - pipeline.builds.latest.skipped.find_each do |skipped| retry_optimistic_lock(skipped) { |build| build.process } end @@ -38,7 +32,7 @@ module Ci Ci::ProcessPipelineService .new(pipeline) - .execute(completed_build_ids, initial_process: true) + .execute end end end diff --git a/app/services/labels/available_labels_service.rb b/app/services/labels/available_labels_service.rb index fb50dc583fc..1d022740c44 100644 --- a/app/services/labels/available_labels_service.rb +++ b/app/services/labels/available_labels_service.rb @@ -30,7 +30,7 @@ module Labels end def filter_labels_ids_in_param(key) - ids = params[key].to_a + ids = Array.wrap(params[key]) return [] if ids.empty? # rubocop:disable CodeReuse/ActiveRecord diff --git a/app/uploaders/ci/pipeline_artifact_uploader.rb b/app/uploaders/ci/pipeline_artifact_uploader.rb new file mode 100644 index 00000000000..d3a83c5d633 --- /dev/null +++ b/app/uploaders/ci/pipeline_artifact_uploader.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module Ci + class PipelineArtifactUploader < GitlabUploader + include ObjectStorage::Concern + + storage_options Gitlab.config.artifacts + + alias_method :upload, :model + + def store_dir + dynamic_segment + end + + private + + def dynamic_segment + Gitlab::HashedPath.new('pipelines', model.pipeline_id, 'artifacts', model.id, root_hash: model.project_id) + end + end +end diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml index 5f01e403275..bc9983b710e 100644 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ b/app/views/layouts/nav/sidebar/_project.html.haml @@ -236,7 +236,7 @@ - if project_nav_tab?(:incidents) = nav_link(controller: :incidents) do - = link_to project_incidents_path(@project), title: _('Incidents') do + = link_to project_incidents_path(@project), title: _('Incidents'), data: { qa_selector: 'operations_incidents_link' } do %span = _('Incidents') diff --git a/app/workers/pipeline_process_worker.rb b/app/workers/pipeline_process_worker.rb index cd7c82d3117..f0929b92bd0 100644 --- a/app/workers/pipeline_process_worker.rb +++ b/app/workers/pipeline_process_worker.rb @@ -10,11 +10,13 @@ class PipelineProcessWorker # rubocop:disable Scalability/IdempotentWorker loggable_arguments 1 # rubocop: disable CodeReuse/ActiveRecord - def perform(pipeline_id, build_ids = nil) + # `_build_ids` is deprecated and will be removed in 14.0 + # See: https://gitlab.com/gitlab-org/gitlab/-/issues/232806 + def perform(pipeline_id, _build_ids = nil) Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline| Ci::ProcessPipelineService .new(pipeline) - .execute(build_ids) + .execute end end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/workers/pipeline_update_worker.rb b/app/workers/pipeline_update_worker.rb index 267caa5bedd..7db4ab8fe0b 100644 --- a/app/workers/pipeline_update_worker.rb +++ b/app/workers/pipeline_update_worker.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +# This worker is deprecated and will be removed in 14.0 +# See: https://gitlab.com/gitlab-org/gitlab/-/issues/232806 class PipelineUpdateWorker include ApplicationWorker include PipelineQueue @@ -9,7 +11,7 @@ class PipelineUpdateWorker idempotent! - def perform(pipeline_id) - Ci::Pipeline.find_by_id(pipeline_id)&.update_legacy_status + def perform(_pipeline_id) + # no-op end end diff --git a/changelogs/unreleased/199718-turn-on-hide-jump-feature-flag-by-default.yml b/changelogs/unreleased/199718-turn-on-hide-jump-feature-flag-by-default.yml new file mode 100644 index 00000000000..f9124110abb --- /dev/null +++ b/changelogs/unreleased/199718-turn-on-hide-jump-feature-flag-by-default.yml @@ -0,0 +1,5 @@ +--- +title: Remove Jump to next unresolved thread button in merge request threads +merge_request: 38375 +author: +type: deprecated diff --git a/changelogs/unreleased/215533-graphql-add-mutation-to-create-the-default-backlog-list-for-a-boar.yml b/changelogs/unreleased/215533-graphql-add-mutation-to-create-the-default-backlog-list-for-a-boar.yml new file mode 100644 index 00000000000..b664148c46f --- /dev/null +++ b/changelogs/unreleased/215533-graphql-add-mutation-to-create-the-default-backlog-list-for-a-boar.yml @@ -0,0 +1,5 @@ +--- +title: 'Add mutation to create a label or default backlog list for an issue board' +merge_request: 31233 +author: +type: added diff --git a/changelogs/unreleased/218536-removing-ci_atomic_processing.yml b/changelogs/unreleased/218536-removing-ci_atomic_processing.yml new file mode 100644 index 00000000000..bb865457947 --- /dev/null +++ b/changelogs/unreleased/218536-removing-ci_atomic_processing.yml @@ -0,0 +1,5 @@ +--- +title: Remove legacy pipeline processing service and FF ci_atomic_processing +merge_request: 37339 +author: +type: other diff --git a/changelogs/unreleased/227570-track-merge-request-diff-files-count.yml b/changelogs/unreleased/227570-track-merge-request-diff-files-count.yml new file mode 100644 index 00000000000..f47764f60e8 --- /dev/null +++ b/changelogs/unreleased/227570-track-merge-request-diff-files-count.yml @@ -0,0 +1,5 @@ +--- +title: Add a cache column for the number of changed files in a merge request diff +merge_request: 38936 +author: +type: changed diff --git a/changelogs/unreleased/233957-clone-button-position.yml b/changelogs/unreleased/233957-clone-button-position.yml new file mode 100644 index 00000000000..85cd425929a --- /dev/null +++ b/changelogs/unreleased/233957-clone-button-position.yml @@ -0,0 +1,5 @@ +--- +title: Right-aligned Clone dropdown for snippets +merge_request: 39446 +author: +type: fixed diff --git a/changelogs/unreleased/34382-allow-the-ability-to-re-order-designs.yml b/changelogs/unreleased/34382-allow-the-ability-to-re-order-designs.yml new file mode 100644 index 00000000000..3f7d0c55868 --- /dev/null +++ b/changelogs/unreleased/34382-allow-the-ability-to-re-order-designs.yml @@ -0,0 +1,5 @@ +--- +title: Resolve Allow the ability to re-order designs +merge_request: 37686 +author: +type: added diff --git a/changelogs/unreleased/mk-enforce-not-null-package-files-file-store.yml b/changelogs/unreleased/mk-enforce-not-null-package-files-file-store.yml new file mode 100644 index 00000000000..84a7eeca845 --- /dev/null +++ b/changelogs/unreleased/mk-enforce-not-null-package-files-file-store.yml @@ -0,0 +1,6 @@ +--- +title: Add database migrations to ensure Geo replicates all package files when sync + object storage is disabled +merge_request: 38822 +author: +type: added diff --git a/db/fixtures/development/16_protected_branches.rb b/db/fixtures/development/16_protected_branches.rb index e6615b20f9c..e859c2c5130 100644 --- a/db/fixtures/development/16_protected_branches.rb +++ b/db/fixtures/development/16_protected_branches.rb @@ -1,7 +1,7 @@ require './spec/support/sidekiq_middleware' Gitlab::Seeder.quiet do - admin_user = User.find(1) + admin_user = User.admins.first Project.not_mass_generated.each do |project| params = { diff --git a/db/migrate/20200806004232_add_default_value_for_file_store_to_package_files.rb b/db/migrate/20200806004232_add_default_value_for_file_store_to_package_files.rb new file mode 100644 index 00000000000..06f033891fc --- /dev/null +++ b/db/migrate/20200806004232_add_default_value_for_file_store_to_package_files.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class AddDefaultValueForFileStoreToPackageFiles < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + with_lock_retries do + change_column_default :packages_package_files, :file_store, 1 + end + end + + def down + with_lock_retries do + change_column_default :packages_package_files, :file_store, nil + end + end +end diff --git a/db/migrate/20200807150937_add_file_count_to_merge_request_diffs.rb b/db/migrate/20200807150937_add_file_count_to_merge_request_diffs.rb new file mode 100644 index 00000000000..3afc246d698 --- /dev/null +++ b/db/migrate/20200807150937_add_file_count_to_merge_request_diffs.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class AddFileCountToMergeRequestDiffs < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + disable_ddl_transaction! + + def up + with_lock_retries do + add_column :merge_request_diffs, :files_count, :smallint + end + end + + def down + with_lock_retries do + remove_column :merge_request_diffs, :files_count, :smallint + end + end +end diff --git a/db/post_migrate/20200806004742_add_not_null_constraint_on_file_store_to_package_files.rb b/db/post_migrate/20200806004742_add_not_null_constraint_on_file_store_to_package_files.rb new file mode 100644 index 00000000000..7b7250fef9a --- /dev/null +++ b/db/post_migrate/20200806004742_add_not_null_constraint_on_file_store_to_package_files.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class AddNotNullConstraintOnFileStoreToPackageFiles < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_not_null_constraint(:packages_package_files, :file_store, validate: false) + end + + def down + remove_not_null_constraint(:packages_package_files, :file_store) + end +end diff --git a/db/post_migrate/20200806172909_add_partial_index_on_id_to_package_files.rb b/db/post_migrate/20200806172909_add_partial_index_on_id_to_package_files.rb new file mode 100644 index 00000000000..7904574f890 --- /dev/null +++ b/db/post_migrate/20200806172909_add_partial_index_on_id_to_package_files.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class AddPartialIndexOnIdToPackageFiles < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + INDEX_NAME = 'index_packages_package_files_file_store_is_null' + + disable_ddl_transaction! + + def up + add_concurrent_index :packages_package_files, :id, where: 'file_store IS NULL', name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name :packages_package_files, INDEX_NAME + end +end diff --git a/db/post_migrate/20200806173633_migrate_null_package_files_file_store_to_local_value.rb b/db/post_migrate/20200806173633_migrate_null_package_files_file_store_to_local_value.rb new file mode 100644 index 00000000000..088b85dd5da --- /dev/null +++ b/db/post_migrate/20200806173633_migrate_null_package_files_file_store_to_local_value.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +class MigrateNullPackageFilesFileStoreToLocalValue < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + JOB_INTERVAL = 2.minutes + 5.seconds + BATCH_SIZE = 5_000 + MIGRATION = 'SetNullPackageFilesFileStoreToLocalValue' + + disable_ddl_transaction! + + class PackageFile < ActiveRecord::Base + self.table_name = 'packages_package_files' + + include ::EachBatch + end + + def up + # On GitLab.com, there are 2M package files. None have NULL file_store + # because they are all object stored. This is a no-op for GitLab.com. + # + # If a customer had 2M package files with NULL file_store, with batches of + # 5000 and a background migration job interval of 2m 5s, then 400 jobs would + # be scheduled over 14 hours. + # + # The index `index_packages_package_files_file_store_is_null` is + # expected to be used here and in the jobs. + # + # queue_background_migration_jobs_by_range_at_intervals is not used because + # it would enqueue 18.6K jobs and we have an index for getting these ranges. + PackageFile.where(file_store: nil).each_batch(of: BATCH_SIZE) do |batch, index| + range = batch.pluck(Arel.sql("MIN(id)"), Arel.sql("MAX(id)")).first + delay = index * JOB_INTERVAL + + migrate_in(delay.seconds, MIGRATION, [*range]) + end + end + + def down + # noop + end +end diff --git a/db/post_migrate/20200807152315_backfill_merge_request_diffs_files_counts.rb b/db/post_migrate/20200807152315_backfill_merge_request_diffs_files_counts.rb new file mode 100644 index 00000000000..bc7e4712d19 --- /dev/null +++ b/db/post_migrate/20200807152315_backfill_merge_request_diffs_files_counts.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +class BackfillMergeRequestDiffsFilesCounts < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + # There are ~72 million records on GitLab.com at time of writing, so go fast + BATCH_SIZE = 10_000 + DELAY_INTERVAL = 2.minutes.to_i + MIGRATION = 'SetMergeRequestDiffFilesCount' + + disable_ddl_transaction! + + class MergeRequestDiff < ActiveRecord::Base + include EachBatch + + self.table_name = 'merge_request_diffs' + end + + def up + queue_background_migration_jobs_by_range_at_intervals( + MergeRequestDiff, MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE + ) + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20200806004232 b/db/schema_migrations/20200806004232 new file mode 100644 index 00000000000..840238684f9 --- /dev/null +++ b/db/schema_migrations/20200806004232 @@ -0,0 +1 @@ +4b1f048dfaea1887b20fdc421a08ab6206ab9944201e6517e808b27214be926c
\ No newline at end of file diff --git a/db/schema_migrations/20200806004742 b/db/schema_migrations/20200806004742 new file mode 100644 index 00000000000..fb6d9d49acf --- /dev/null +++ b/db/schema_migrations/20200806004742 @@ -0,0 +1 @@ +acc9d1ab79e277e55910b17c5653088721371fa12b2cf1a5677035fe3b422fc8
\ No newline at end of file diff --git a/db/schema_migrations/20200806172909 b/db/schema_migrations/20200806172909 new file mode 100644 index 00000000000..44cc78808d5 --- /dev/null +++ b/db/schema_migrations/20200806172909 @@ -0,0 +1 @@ +b05401408faabafa4c2ef5fd241fea88f78fd423a3c462be89ccdbd8d988cfc8
\ No newline at end of file diff --git a/db/schema_migrations/20200806173633 b/db/schema_migrations/20200806173633 new file mode 100644 index 00000000000..a0be6d39ece --- /dev/null +++ b/db/schema_migrations/20200806173633 @@ -0,0 +1 @@ +5467b9c38186a30d333d9ccff0aeb4a06f97f17fec12488aca5e0a619b11831b
\ No newline at end of file diff --git a/db/schema_migrations/20200807150937 b/db/schema_migrations/20200807150937 new file mode 100644 index 00000000000..8123db278a8 --- /dev/null +++ b/db/schema_migrations/20200807150937 @@ -0,0 +1 @@ +fdb18abe24003a75c76019fccf5ca0aa65a900bc2a86eb578012bc5a032730cf
\ No newline at end of file diff --git a/db/schema_migrations/20200807152315 b/db/schema_migrations/20200807152315 new file mode 100644 index 00000000000..2256313368c --- /dev/null +++ b/db/schema_migrations/20200807152315 @@ -0,0 +1 @@ +5152e094538b498fbe28f3fd11f6c1b9a9c77dc89ac0079cb39a6090a567db68
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 80c958864d9..50e6e4d9dd4 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -13068,7 +13068,8 @@ CREATE TABLE public.merge_request_diffs ( commits_count integer, external_diff character varying, external_diff_store integer DEFAULT 1, - stored_externally boolean + stored_externally boolean, + files_count smallint ); CREATE SEQUENCE public.merge_request_diffs_id_seq @@ -13873,7 +13874,7 @@ CREATE TABLE public.packages_package_files ( created_at timestamp with time zone NOT NULL, updated_at timestamp with time zone NOT NULL, size bigint, - file_store integer, + file_store integer DEFAULT 1, file_md5 bytea, file_sha1 bytea, file_name character varying NOT NULL, @@ -17698,6 +17699,9 @@ ALTER TABLE public.design_management_designs ALTER TABLE public.vulnerability_scanners ADD CONSTRAINT check_37608c9db5 CHECK ((char_length(vendor) <= 255)) NOT VALID; +ALTER TABLE public.packages_package_files + ADD CONSTRAINT check_4c5e6bb0b3 CHECK ((file_store IS NOT NULL)) NOT VALID; + ALTER TABLE public.merge_request_diffs ADD CONSTRAINT check_93ee616ac9 CHECK ((external_diff_store IS NOT NULL)) NOT VALID; @@ -20204,6 +20208,8 @@ CREATE INDEX index_packages_maven_metadata_on_package_id_and_path ON public.pack CREATE INDEX index_packages_nuget_dl_metadata_on_dependency_link_id ON public.packages_nuget_dependency_link_metadata USING btree (dependency_link_id); +CREATE INDEX index_packages_package_files_file_store_is_null ON public.packages_package_files USING btree (id) WHERE (file_store IS NULL); + CREATE INDEX index_packages_package_files_on_file_store ON public.packages_package_files USING btree (file_store); CREATE INDEX index_packages_package_files_on_package_id_and_file_name ON public.packages_package_files USING btree (package_id, file_name); diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md index 6349a94eb0e..fe2dad41066 100644 --- a/doc/administration/reference_architectures/10k_users.md +++ b/doc/administration/reference_architectures/10k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 10,000 users +# Reference architecture: up to 10,000 users **(PREMIUM ONLY)** This page describes GitLab reference architecture for up to 10,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/1k_users.md b/doc/administration/reference_architectures/1k_users.md index 373517beed7..d3cf5f49413 100644 --- a/doc/administration/reference_architectures/1k_users.md +++ b/doc/administration/reference_architectures/1k_users.md @@ -4,7 +4,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 1,000 users +# Reference architecture: up to 1,000 users **(CORE ONLY)** This page describes GitLab reference architecture for up to 1,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md index 0027cfcaf82..1cfa2565893 100644 --- a/doc/administration/reference_architectures/25k_users.md +++ b/doc/administration/reference_architectures/25k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 25,000 users +# Reference architecture: up to 25,000 users **(PREMIUM ONLY)** This page describes GitLab reference architecture for up to 25,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md index f48f191acbd..a7feb78a365 100644 --- a/doc/administration/reference_architectures/2k_users.md +++ b/doc/administration/reference_architectures/2k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 2,000 users +# Reference architecture: up to 2,000 users **(CORE ONLY)** This page describes GitLab reference architecture for up to 2,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md index 84b3897a91c..2f88413de6f 100644 --- a/doc/administration/reference_architectures/3k_users.md +++ b/doc/administration/reference_architectures/3k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 3,000 users +# Reference architecture: up to 3,000 users **(PREMIUM ONLY)** This page describes GitLab reference architecture for up to 3,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md index e795acfaead..565845b4bf5 100644 --- a/doc/administration/reference_architectures/50k_users.md +++ b/doc/administration/reference_architectures/50k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 50,000 users +# Reference architecture: up to 50,000 users **(PREMIUM ONLY)** This page describes GitLab reference architecture for up to 50,000 users. For a full list of reference architectures, see diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md index 83baba1a419..14685ffa53d 100644 --- a/doc/administration/reference_architectures/5k_users.md +++ b/doc/administration/reference_architectures/5k_users.md @@ -5,7 +5,7 @@ group: Distribution info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#designated-technical-writers --- -# Reference architecture: up to 5,000 users +# Reference architecture: up to 5,000 users **(PREMIUM ONLY)** This page describes GitLab reference architecture for up to 5,000 users. For a full list of reference architectures, see diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 42e450e0ac1..82344869fa1 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -1166,6 +1166,11 @@ input BoardEpicIssueInput { } """ +Identifier of Board +""" +scalar BoardID + +""" Represents a list for an issue board """ type BoardList { @@ -1271,6 +1276,51 @@ type BoardListConnection { } """ +Autogenerated input type of BoardListCreate +""" +input BoardListCreateInput { + """ + Create the backlog list + """ + backlog: Boolean + + """ + The Global ID of the issue board to mutate + """ + boardId: BoardID! + + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + + """ + ID of an existing label + """ + labelId: LabelID +} + +""" +Autogenerated return type of BoardListCreate +""" +type BoardListCreatePayload { + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + + """ + Errors encountered during execution of the mutation. + """ + errors: [String!]! + + """ + List of the issue board + """ + list: BoardList +} + +""" An edge in a connection. """ type BoardListEdge { @@ -8109,6 +8159,11 @@ type LabelEdge { } """ +Identifier of Label +""" +scalar LabelID + +""" List limit metric setting """ enum ListLimitMetric { @@ -9392,6 +9447,7 @@ type Mutation { awardEmojiAdd(input: AwardEmojiAddInput!): AwardEmojiAddPayload awardEmojiRemove(input: AwardEmojiRemoveInput!): AwardEmojiRemovePayload awardEmojiToggle(input: AwardEmojiToggleInput!): AwardEmojiTogglePayload + boardListCreate(input: BoardListCreateInput!): BoardListCreatePayload boardListUpdateLimitMetrics(input: BoardListUpdateLimitMetricsInput!): BoardListUpdateLimitMetricsPayload commitCreate(input: CommitCreateInput!): CommitCreatePayload configureSast(input: ConfigureSastInput!): ConfigureSastPayload diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 7bd8b956aeb..0f13079f202 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -3109,6 +3109,16 @@ "possibleTypes": null }, { + "kind": "SCALAR", + "name": "BoardID", + "description": "Identifier of Board", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { "kind": "OBJECT", "name": "BoardList", "description": "Represents a list for an issue board", @@ -3408,6 +3418,128 @@ "possibleTypes": null }, { + "kind": "INPUT_OBJECT", + "name": "BoardListCreateInput", + "description": "Autogenerated input type of BoardListCreate", + "fields": null, + "inputFields": [ + { + "name": "boardId", + "description": "The Global ID of the issue board to mutate", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "BoardID", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "backlog", + "description": "Create the backlog list", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "labelId", + "description": "ID of an existing label", + "type": { + "kind": "SCALAR", + "name": "LabelID", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "clientMutationId", + "description": "A unique identifier for the client performing the mutation.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "BoardListCreatePayload", + "description": "Autogenerated return type of BoardListCreate", + "fields": [ + { + "name": "clientMutationId", + "description": "A unique identifier for the client performing the mutation.", + "args": [ + + ], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "errors", + "description": "Errors encountered during execution of the mutation.", + "args": [ + + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "list", + "description": "List of the issue board", + "args": [ + + ], + "type": { + "kind": "OBJECT", + "name": "BoardList", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + + ], + "enumValues": null, + "possibleTypes": null + }, + { "kind": "OBJECT", "name": "BoardListEdge", "description": "An edge in a connection.", @@ -22519,6 +22651,16 @@ "possibleTypes": null }, { + "kind": "SCALAR", + "name": "LabelID", + "description": "Identifier of Label", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { "kind": "ENUM", "name": "ListLimitMetric", "description": "List limit metric setting", @@ -26502,6 +26644,33 @@ "deprecationReason": null }, { + "name": "boardListCreate", + "description": null, + "args": [ + { + "name": "input", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "BoardListCreateInput", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "BoardListCreatePayload", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { "name": "boardListUpdateLimitMetrics", "description": null, "args": [ diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 386a87b60a2..932135d443d 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -214,6 +214,16 @@ Represents a list for an issue board | `position` | Int | Position of list within the board | | `title` | String! | Title of the list | +## BoardListCreatePayload + +Autogenerated return type of BoardListCreate + +| Name | Type | Description | +| --- | ---- | ---------- | +| `clientMutationId` | String | A unique identifier for the client performing the mutation. | +| `errors` | String! => Array | Errors encountered during execution of the mutation. | +| `list` | BoardList | List of the issue board | + ## BoardListUpdateLimitMetricsPayload Autogenerated return type of BoardListUpdateLimitMetrics diff --git a/doc/api/issues.md b/doc/api/issues.md index d2d51a0ae55..eb1684df05f 100644 --- a/doc/api/issues.md +++ b/doc/api/issues.md @@ -179,6 +179,20 @@ the `weight` parameter: ] ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "state" : "opened", + "description" : "Ratione dolores corrupti mollitia soluta quia.", + "health_status": "on_track", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. @@ -338,6 +352,20 @@ the `weight` parameter: ] ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "at_risk", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. @@ -503,6 +531,20 @@ the `weight` parameter: ] ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "at_risk", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. @@ -642,6 +684,20 @@ the `epic` property: } ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also additionally see +the `health_status` property: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "on_track", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. @@ -752,6 +808,20 @@ the `weight` parameter: } ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "on_track", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. @@ -874,6 +944,20 @@ the `weight` parameter: } ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "on_track", + ... + } +] +``` + NOTE: **Note:** At least one of following parameters is required to be passed for the request to be successful: `:assignee_id`, `:assignee_ids`, `:confidential`, `:created_at`, `:description`, `:discussion_locked`, `:due_date`, `:labels`, `:milestone_id`, `:state_event`, or `:title`. @@ -1027,6 +1111,20 @@ the `weight` parameter: } ``` +Users on GitLab [Ultimate](https://about.gitlab.com/pricing/) will also see +the `health_status` parameter: + +```json +[ + { + "project_id" : 4, + "description" : "Omnis vero earum sunt corporis dolor et placeat.", + "health_status": "on_track", + ... + } +] +``` + **Note**: `assignee` column is deprecated, now we show it as a single-sized array `assignees` to conform to the GitLab EE API. **Note**: The `closed_by` attribute was [introduced in GitLab 10.6](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/17042). This value will only be present for issues which were closed after GitLab 10.6 and when the user account that closed the issue still exists. diff --git a/doc/ci/cloud_deployment/index.md b/doc/ci/cloud_deployment/index.md index 4970a8e0675..355bc7813d9 100644 --- a/doc/ci/cloud_deployment/index.md +++ b/doc/ci/cloud_deployment/index.md @@ -168,6 +168,9 @@ After you have these prerequisites ready, follow these steps: 1. Commit and push your updated `.gitlab-ci.yml` to your project's repository, and you're done! Your application Docker image will be rebuilt and pushed to the GitLab registry. + If your image is located in a private registry, make sure your task definition is + [configured with a `repositoryCredentials` attribute](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html). + Then the targeted task definition will be updated with the location of the new Docker image, and a new revision will be created in ECS as result. diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md index 78771861222..f086d7737bd 100644 --- a/doc/operations/metrics/dashboards/default.md +++ b/doc/operations/metrics/dashboards/default.md @@ -34,3 +34,5 @@ This dashboard displays CPU, memory, network and disk metrics for the pods in yo [connected K8s cluster](../../../user/project/clusters/index.md). It provides a [variable selector](templating_variables.md#metric_label_values-variable-type) at the top of the dashboard to select which pod's metrics to display. + +![K8s pod health dashboard](img/k8s_pod_health_dashboard_v13_3.png) diff --git a/doc/operations/metrics/dashboards/img/actions_menu_create_add_panel_v13_3.png b/doc/operations/metrics/dashboards/img/actions_menu_create_add_panel_v13_3.png Binary files differnew file mode 100644 index 00000000000..e03fbef3b35 --- /dev/null +++ b/doc/operations/metrics/dashboards/img/actions_menu_create_add_panel_v13_3.png diff --git a/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png b/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png Binary files differindex 4b7a8418eef..ba4780b730b 100644 --- a/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png +++ b/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png diff --git a/doc/operations/metrics/dashboards/img/k8s_pod_health_dashboard_v13_3.png b/doc/operations/metrics/dashboards/img/k8s_pod_health_dashboard_v13_3.png Binary files differnew file mode 100644 index 00000000000..dc0bc951500 --- /dev/null +++ b/doc/operations/metrics/dashboards/img/k8s_pod_health_dashboard_v13_3.png diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md index 73909e977c6..11d2dc45008 100644 --- a/doc/operations/metrics/dashboards/index.md +++ b/doc/operations/metrics/dashboards/index.md @@ -32,7 +32,7 @@ To create a new dashboard from the GitLab user interface: 1. Sign in to GitLab as a user with Maintainer or Owner [permissions](../../../user/permissions.md#project-members-permissions). 1. Navigate to your dashboard at **Operations > Metrics**. -1. In the top-right corner of your dashboard, click the **{{ellipsis_v}}** **More actions** menu, +1. In the top-right corner of your dashboard, click the **{ellipsis_v}** **More actions** menu, and select **Create new**: ![Monitoring Dashboard actions menu with create new item](img/actions_menu_create_new_dashboard_v13_3.png) 1. In the modal window, click **Open Repository**, then follow the instructions @@ -75,49 +75,26 @@ supported and won't be available in the UI. ## Add a new metrics panel to a dashboard -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228761) in GitLab 13.3 behind a disabled [feature flag](../../../administration/feature_flags.md): `metrics_dashboard_new_panel_page`. +> UI option [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228761) in GitLab 13.3. The metrics dashboard supports various [multiple panel types](../../../operations/metrics/dashboards/panel_types.md). You can quickly test how a panel configuration would display in your metrics dashboard with the **Add Panel** page: 1. Sign in to GitLab as a user with Maintainer or Owner - [permissions](../../../user/permissions.md#project-members-permissions) on a - project that has the [feature flag enabled](#enable-or-disable-testing-metrics-panels). -1. Open the URL `https://example.com/PROJECT/-/metrics/panel/new`, replacing - `example.com` with your domain name, and `PROJECT` with the name of your project, - to display the panel configuration page. + [permissions](../../../user/permissions.md#project-members-permissions). +1. Click **Add panel** in the **{ellipsis_v}** **More actions** menu. + + NOTE: **Note:** + You can add panel only to custom dashboards. + + ![Monitoring Dashboard actions menu with add panel item](img/actions_menu_create_add_panel_v13_3.png) 1. In the **Define and preview panel** section, paste in the YAML you want to preview in the **Panel YAML** field. 1. Click **Preview panel**, and GitLab displays a preview of the chart below the `Define and preview panel` section: ![Monitoring Dashboard Add Panel page](img/metrics_dashboard_panel_preview_v13_3.png) -### Enable or disable testing metrics panels - -Testing metrics panels in the UI is under development and not ready for production use. It's -deployed behind a feature flag that's **disabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) -can enable it for your instance. Testing metrics panels in the UI can be enabled or disabled per-project. - -To enable it: - -```ruby -# Instance-wide -Feature.enable(:metrics_dashboard_new_panel_page) -# or by project -Feature.enable(:metrics_dashboard_new_panel_page, Project.find(metrics_dashboard_new_panel_page)) -``` - -To disable it: - -```ruby -# Instance-wide -Feature.disable(:metrics_dashboard_new_panel_page) -# or by project -Feature.disable(:metrics_dashboard_new_panel_page, Project.find(metrics_dashboard_new_panel_page)) -``` - ## Duplicate a GitLab-defined dashboard > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/37238) in GitLab 12.7. @@ -128,7 +105,7 @@ The resulting `.yml` file can be customized and adapted to your project. You can decide to save the dashboard `.yml` file in the project's **default** branch or in a new branch. -1. Click **Duplicate current dashboard** in the **{{ellipsis_v}}** **More actions** menu. +1. Click **Duplicate current dashboard** in the **{ellipsis_v}** **More actions** menu. NOTE: **Note:** You can duplicate only GitLab-defined dashboards. diff --git a/doc/user/project/issues/design_management.md b/doc/user/project/issues/design_management.md index 5b92f146e4b..4e7d460e7c7 100644 --- a/doc/user/project/issues/design_management.md +++ b/doc/user/project/issues/design_management.md @@ -202,6 +202,17 @@ Only the latest version of the designs can be deleted. Deleted designs are not permanently lost; they can be viewed by browsing previous versions. +## Reordering designs + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34382) in GitLab 13.3. + +You can change designs order with dragging design to the new position: + +![Reorder designs](img/designs_reordering_v13_3.gif) + +NOTE: **Note:** +You can reorder designs only on the latest version. + ## Starting discussions on designs When a design is uploaded, you can start a discussion by clicking on diff --git a/doc/user/project/issues/img/designs_reordering_v13_3.gif b/doc/user/project/issues/img/designs_reordering_v13_3.gif Binary files differnew file mode 100644 index 00000000000..496eea532e2 --- /dev/null +++ b/doc/user/project/issues/img/designs_reordering_v13_3.gif diff --git a/lib/gitlab/background_migration/set_merge_request_diff_files_count.rb b/lib/gitlab/background_migration/set_merge_request_diff_files_count.rb new file mode 100644 index 00000000000..9f765d03d62 --- /dev/null +++ b/lib/gitlab/background_migration/set_merge_request_diff_files_count.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + # Sets the MergeRequestDiff#files_count value for old rows + class SetMergeRequestDiffFilesCount + COUNT_SUBQUERY = <<~SQL + files_count = ( + SELECT count(*) + FROM merge_request_diff_files + WHERE merge_request_diff_files.merge_request_diff_id = merge_request_diffs.id + ) + SQL + + class MergeRequestDiff < ActiveRecord::Base # rubocop:disable Style/Documentation + include EachBatch + + self.table_name = 'merge_request_diffs' + end + + def perform(start_id, end_id) + MergeRequestDiff.where(id: start_id..end_id).each_batch do |relation| + relation.update_all(COUNT_SUBQUERY) + end + end + end + end +end diff --git a/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value.rb b/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value.rb new file mode 100644 index 00000000000..9ac92aab637 --- /dev/null +++ b/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + # This class is responsible for migrating a range of package files + # with file_store == NULL to 1. + # + # The index `index_packages_package_files_file_store_is_null` is + # expected to be used to find the rows here and in the migration scheduling + # the jobs that run this class. + class SetNullPackageFilesFileStoreToLocalValue + LOCAL_STORE = 1 # equal to ObjectStorage::Store::LOCAL + + # Temporary AR class for package files + class PackageFile < ActiveRecord::Base + self.table_name = 'packages_package_files' + end + + def perform(start_id, stop_id) + Packages::PackageFile.where(file_store: nil, id: start_id..stop_id).update_all(file_store: LOCAL_STORE) + end + end + end +end diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb index 472f0f36231..5d0e1e4fd01 100644 --- a/lib/gitlab/ci/features.rb +++ b/lib/gitlab/ci/features.rb @@ -22,10 +22,6 @@ module Gitlab ::Feature.enabled?(:ci_composite_status, project, default_enabled: true) end - def self.atomic_processing?(project) - ::Feature.enabled?(:ci_atomic_processing, project, default_enabled: true) - end - def self.pipeline_latest? ::Feature.enabled?(:ci_pipeline_latest, default_enabled: true) end diff --git a/lib/gitlab/ci/pipeline/chain/pipeline/process.rb b/lib/gitlab/ci/pipeline/chain/pipeline/process.rb index 98e9e1479bc..1eb7474e915 100644 --- a/lib/gitlab/ci/pipeline/chain/pipeline/process.rb +++ b/lib/gitlab/ci/pipeline/chain/pipeline/process.rb @@ -10,7 +10,7 @@ module Gitlab def perform! ::Ci::ProcessPipelineService .new(@pipeline) - .execute(nil, initial_process: true) + .execute end def break? diff --git a/locale/gitlab.pot b/locale/gitlab.pot index b259ca8ebe1..e6dfda7dec6 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -22639,6 +22639,9 @@ msgstr "" msgid "Something went wrong trying to change the locked state of this %{issuableDisplayName}" msgstr "" +msgid "Something went wrong when reordering designs. Please try again" +msgstr "" + msgid "Something went wrong when toggling the button" msgstr "" diff --git a/package.json b/package.json index 1bf5e229ccd..cb19b90d0fa 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "mersenne-twister": "1.1.0", "minimatch": "^3.0.4", "miragejs": "^0.1.40", + "mock-apollo-client": "^0.4.0", "monaco-editor": "^0.20.0", "monaco-editor-webpack-plugin": "^1.9.0", "monaco-yaml": "^2.4.1", @@ -354,6 +354,10 @@ module QA module Metrics autoload :Show, 'qa/page/project/operations/metrics/show' end + + module Incidents + autoload :Index, 'qa/page/project/operations/incidents/index' + end end module Wiki diff --git a/qa/qa/page/project/issue/show.rb b/qa/qa/page/project/issue/show.rb index 1e6c7c2ee32..5778d0218a7 100644 --- a/qa/qa/page/project/issue/show.rb +++ b/qa/qa/page/project/issue/show.rb @@ -80,6 +80,10 @@ module QA select_filter_with_text('Show history only') end + def has_metrics_unfurled? + has_element?(:prometheus_graph_widgets, wait: 30) + end + private def select_filter_with_text(text) diff --git a/qa/qa/page/project/operations/incidents/index.rb b/qa/qa/page/project/operations/incidents/index.rb new file mode 100644 index 00000000000..fd0c5253a7f --- /dev/null +++ b/qa/qa/page/project/operations/incidents/index.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module QA + module Page + module Project + module Operations + module Incidents + class Index < Page::Base + view 'app/assets/javascripts/incidents/components/incidents_list.vue' do + element :create_incident_button + end + + def create_incident + click_element :create_incident_button + end + end + end + end + end + end +end diff --git a/qa/qa/page/project/sub_menus/operations.rb b/qa/qa/page/project/sub_menus/operations.rb index ff9c8a21174..042994062c7 100644 --- a/qa/qa/page/project/sub_menus/operations.rb +++ b/qa/qa/page/project/sub_menus/operations.rb @@ -17,6 +17,7 @@ module QA element :operations_link element :operations_environments_link element :operations_metrics_link + element :operations_incidents_link end end end @@ -45,6 +46,14 @@ module QA end end + def go_to_operations_incidents + hover_operations do + within_submenu do + click_element(:operations_incidents_link) + end + end + end + private def hover_operations diff --git a/spec/frontend/design_management/mock_data/apollo_mock.js b/spec/frontend/design_management/mock_data/apollo_mock.js new file mode 100644 index 00000000000..5e2df3877a5 --- /dev/null +++ b/spec/frontend/design_management/mock_data/apollo_mock.js @@ -0,0 +1,106 @@ +export const designListQueryResponse = { + data: { + project: { + id: '1', + issue: { + designCollection: { + designs: { + nodes: [ + { + id: '1', + event: 'NONE', + filename: 'fox_1.jpg', + notesCount: 3, + image: 'image-1', + imageV432x230: 'image-1', + }, + { + id: '2', + event: 'NONE', + filename: 'fox_2.jpg', + notesCount: 2, + image: 'image-2', + imageV432x230: 'image-2', + }, + { + id: '3', + event: 'NONE', + filename: 'fox_3.jpg', + notesCount: 1, + image: 'image-3', + imageV432x230: 'image-3', + }, + ], + }, + versions: { + nodes: [], + }, + }, + }, + }, + }, +}; + +export const permissionsQueryResponse = { + data: { + project: { + id: '1', + issue: { + userPermissions: { createDesign: true }, + }, + }, + }, +}; + +export const reorderedDesigns = [ + { + id: '2', + event: 'NONE', + filename: 'fox_2.jpg', + notesCount: 2, + image: 'image-2', + imageV432x230: 'image-2', + }, + { + id: '1', + event: 'NONE', + filename: 'fox_1.jpg', + notesCount: 3, + image: 'image-1', + imageV432x230: 'image-1', + }, + { + id: '3', + event: 'NONE', + filename: 'fox_3.jpg', + notesCount: 1, + image: 'image-3', + imageV432x230: 'image-3', + }, +]; + +export const moveDesignMutationResponse = { + data: { + designManagementMove: { + designCollection: { + designs: { + nodes: [...reorderedDesigns], + }, + }, + errors: [], + }, + }, +}; + +export const moveDesignMutationResponseWithErrors = { + data: { + designManagementMove: { + designCollection: { + designs: { + nodes: [...reorderedDesigns], + }, + }, + errors: ['Houston, we have a problem'], + }, + }, +}; diff --git a/spec/frontend/design_management/mock_data/versions_list.js b/spec/frontend/design_management/mock_data/versions_list.js new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/spec/frontend/design_management/mock_data/versions_list.js diff --git a/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap b/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap index fcbf130926d..90423b40662 100644 --- a/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap +++ b/spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap @@ -22,14 +22,14 @@ exports[`Design management index page designs does not render toolbar when there hasdesigns="true" /> </li> - <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-1-name" id="design-1" @@ -41,12 +41,13 @@ exports[`Design management index page designs does not render toolbar when there <!----> </li> <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-2-name" id="design-2" @@ -58,12 +59,13 @@ exports[`Design management index page designs does not render toolbar when there <!----> </li> <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-3-name" id="design-3" @@ -151,14 +153,14 @@ exports[`Design management index page designs renders designs list and header wi hasdesigns="true" /> </li> - <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-1-name" id="design-1" @@ -173,12 +175,13 @@ exports[`Design management index page designs renders designs list and header wi /> </li> <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-2-name" id="design-2" @@ -193,12 +196,13 @@ exports[`Design management index page designs renders designs list and header wi /> </li> <li - class="col-md-6 col-lg-3 gl-mb-3" + class="col-md-6 col-lg-3 gl-mb-3 gl-bg-transparent gl-shadow-none js-design-tile" > <design-dropzone-stub hasdesigns="true" > <design-stub + class="gl-bg-white" event="NONE" filename="design-3-name" id="design-3" @@ -296,7 +300,6 @@ exports[`Design management index page when has no designs renders design dropzon class="" /> </li> - </ol> </div> diff --git a/spec/frontend/design_management/pages/index_apollo_spec.js b/spec/frontend/design_management/pages/index_apollo_spec.js new file mode 100644 index 00000000000..26ddb448b54 --- /dev/null +++ b/spec/frontend/design_management/pages/index_apollo_spec.js @@ -0,0 +1,162 @@ +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import { createMockClient } from 'mock-apollo-client'; +import VueApollo from 'vue-apollo'; +import VueRouter from 'vue-router'; +import VueDraggable from 'vuedraggable'; +import Design from '~/design_management/components/list/item.vue'; +import createRouter from '~/design_management/router'; +import getDesignListQuery from '~/design_management/graphql/queries/get_design_list.query.graphql'; +import permissionsQuery from '~/design_management/graphql/queries/design_permissions.query.graphql'; +import moveDesignMutation from '~/design_management/graphql/mutations/move_design.mutation.graphql'; +import createFlash from '~/flash'; +import Index from '~/design_management/pages/index.vue'; +import { + designListQueryResponse, + permissionsQueryResponse, + moveDesignMutationResponse, + reorderedDesigns, + moveDesignMutationResponseWithErrors, +} from '../mock_data/apollo_mock'; +import { InMemoryCache } from 'apollo-cache-inmemory'; + +jest.mock('~/flash.js'); + +const localVue = createLocalVue(); +localVue.use(VueApollo); + +const router = createRouter(); +localVue.use(VueRouter); + +const designToMove = { + __typename: 'Design', + id: '2', + event: 'NONE', + filename: 'fox_2.jpg', + notesCount: 2, + image: 'image-2', + imageV432x230: 'image-2', +}; + +describe('Design management index page with Apollo mock', () => { + let wrapper; + let mockClient; + let apolloProvider; + let moveDesignHandler; + + async function moveDesigns(localWrapper) { + await jest.runOnlyPendingTimers(); + await localWrapper.vm.$nextTick(); + + localWrapper.find(VueDraggable).vm.$emit('input', reorderedDesigns); + localWrapper.find(VueDraggable).vm.$emit('change', { + moved: { + newIndex: 0, + element: designToMove, + }, + }); + } + + const fragmentMatcher = { match: () => true }; + + const cache = new InMemoryCache({ + fragmentMatcher, + addTypename: false, + }); + + const findDesigns = () => wrapper.findAll(Design); + + function createComponent({ + moveHandler = jest.fn().mockResolvedValue(moveDesignMutationResponse), + }) { + mockClient = createMockClient({ cache }); + + mockClient.setRequestHandler( + getDesignListQuery, + jest.fn().mockResolvedValue(designListQueryResponse), + ); + + mockClient.setRequestHandler( + permissionsQuery, + jest.fn().mockResolvedValue(permissionsQueryResponse), + ); + + moveDesignHandler = moveHandler; + + mockClient.setRequestHandler(moveDesignMutation, moveDesignHandler); + + apolloProvider = new VueApollo({ + defaultClient: mockClient, + }); + + wrapper = shallowMount(Index, { + localVue, + apolloProvider, + router, + stubs: { VueDraggable }, + }); + } + + afterEach(() => { + wrapper.destroy(); + wrapper = null; + mockClient = null; + apolloProvider = null; + }); + + it('has a design with id 1 as a first one', async () => { + createComponent({}); + + await jest.runOnlyPendingTimers(); + await wrapper.vm.$nextTick(); + + expect(findDesigns()).toHaveLength(3); + expect( + findDesigns() + .at(0) + .props('id'), + ).toBe('1'); + }); + + it('calls a mutation with correct parameters and reorders designs', async () => { + createComponent({}); + + await moveDesigns(wrapper); + + expect(moveDesignHandler).toHaveBeenCalled(); + + await wrapper.vm.$nextTick(); + + expect( + findDesigns() + .at(0) + .props('id'), + ).toBe('2'); + }); + + it('displays flash if mutation had a recoverable error', async () => { + createComponent({ + moveHandler: jest.fn().mockResolvedValue(moveDesignMutationResponseWithErrors), + }); + + await moveDesigns(wrapper); + + await wrapper.vm.$nextTick(); + + expect(createFlash).toHaveBeenCalledWith('Houston, we have a problem'); + }); + + it('displays flash if mutation had a non-recoverable error', async () => { + createComponent({ + moveHandler: jest.fn().mockRejectedValue('Error'), + }); + + await moveDesigns(wrapper); + + await jest.runOnlyPendingTimers(); + await wrapper.vm.$nextTick(); + + expect(createFlash).toHaveBeenCalledWith( + 'Something went wrong when reordering designs. Please try again', + ); + }); +}); diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js index 8982766bdbb..f8822971204 100644 --- a/spec/frontend/design_management/pages/index_spec.js +++ b/spec/frontend/design_management/pages/index_spec.js @@ -1,5 +1,6 @@ import { createLocalVue, shallowMount } from '@vue/test-utils'; import { ApolloMutation } from 'vue-apollo'; +import VueDraggable from 'vuedraggable'; import VueRouter from 'vue-router'; import { GlEmptyState } from '@gitlab/ui'; import Index from '~/design_management/pages/index.vue'; @@ -108,7 +109,7 @@ describe('Design management index page', () => { mocks: { $apollo }, localVue, router, - stubs: { DesignDestroyer, ApolloMutation, ...stubs }, + stubs: { DesignDestroyer, ApolloMutation, VueDraggable, ...stubs }, attachToDocument: true, provide: { projectPath: 'project-path', diff --git a/spec/frontend/issuables_list/components/issuable_spec.js b/spec/frontend/issuables_list/components/issuable_spec.js index 852f1eedde2..6ede46a602a 100644 --- a/spec/frontend/issuables_list/components/issuable_spec.js +++ b/spec/frontend/issuables_list/components/issuable_spec.js @@ -99,6 +99,7 @@ describe('Issuable component', () => { const findIssuableTitle = () => wrapper.find('[data-testid="issuable-title"]'); const findIssuableStatus = () => wrapper.find('[data-testid="issuable-status"]'); const containsJiraLogo = () => wrapper.contains('[data-testid="jira-logo"]'); + const findHealthStatus = () => wrapper.find('.health-status'); describe('when mounted', () => { it('initializes user popovers', () => { @@ -474,4 +475,19 @@ describe('Issuable component', () => { }); }); }); + + if (IS_EE) { + describe('with health status', () => { + it('renders health status tag', () => { + factory({ issuable }); + expect(findHealthStatus().exists()).toBe(true); + }); + + it('does not render when health status is absent', () => { + issuable.health_status = null; + factory({ issuable }); + expect(findHealthStatus().exists()).toBe(false); + }); + }); + } }); diff --git a/spec/frontend/issuables_list/issuable_list_test_data.js b/spec/frontend/issuables_list/issuable_list_test_data.js index 85c40117198..313aa15bd31 100644 --- a/spec/frontend/issuables_list/issuable_list_test_data.js +++ b/spec/frontend/issuables_list/issuable_list_test_data.js @@ -30,6 +30,7 @@ export const simpleIssue = { references: { relative: 'html-boilerplate#45', }, + health_status: 'on_track', }; export const testLabels = [ diff --git a/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap b/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap index 408f9d57147..71cfa394957 100644 --- a/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap +++ b/spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap @@ -4,6 +4,7 @@ exports[`Clone Dropdown Button rendering matches the snapshot 1`] = ` <gl-new-dropdown-stub category="primary" headertext="" + right="" size="medium" text="Clone" variant="info" diff --git a/spec/graphql/mutations/boards/lists/create_spec.rb b/spec/graphql/mutations/boards/lists/create_spec.rb new file mode 100644 index 00000000000..1a881ac81e8 --- /dev/null +++ b/spec/graphql/mutations/boards/lists/create_spec.rb @@ -0,0 +1,80 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Mutations::Boards::Lists::Create do + include GraphqlHelpers + + let_it_be(:group) { create(:group, :private) } + let_it_be(:board) { create(:board, group: group) } + let_it_be(:user) { create(:user) } + let_it_be(:guest) { create(:user) } + + let(:current_user) { user } + let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } + let(:list_create_params) { {} } + + before_all do + group.add_reporter(user) + group.add_guest(guest) + end + + subject { mutation.resolve(board_id: board.to_global_id.to_s, **list_create_params) } + + describe '#ready?' do + it 'raises an error if required arguments are missing' do + expect { mutation.ready?({ board_id: 'some id' }) } + .to raise_error(Gitlab::Graphql::Errors::ArgumentError, + 'one and only one of backlog or labelId is required') + end + + it 'raises an error if too many required arguments are specified' do + expect { mutation.ready?({ board_id: 'some id', backlog: true, label_id: 'some label' }) } + .to raise_error(Gitlab::Graphql::Errors::ArgumentError, + 'one and only one of backlog or labelId is required') + end + end + + describe '#resolve' do + context 'with proper permissions' do + describe 'backlog list' do + let(:list_create_params) { { backlog: true } } + + it 'creates one and only one backlog' do + expect { subject }.to change { board.lists.backlog.count }.from(0).to(1) + expect(board.lists.backlog.first.list_type).to eq 'backlog' + + backlog_id = board.lists.backlog.first.id + + expect { subject }.not_to change { board.lists.backlog.count } + expect(board.lists.backlog.last.id).to eq backlog_id + end + end + + describe 'label list' do + let_it_be(:dev_label) do + create(:group_label, title: 'Development', color: '#FFAABB', group: group) + end + + let(:list_create_params) { { label_id: dev_label.to_global_id.to_s } } + + it 'creates a new issue board list for labels' do + expect { subject }.to change { board.lists.count }.from(1).to(2) + + new_list = subject[:list] + + expect(new_list.title).to eq dev_label.title + expect(new_list.position).to eq 0 + end + end + end + + context 'without proper permissions' do + let(:current_user) { guest } + + it 'raises an error' do + expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable) + end + end + end +end diff --git a/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb b/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb new file mode 100644 index 00000000000..6e9f51f510a --- /dev/null +++ b/spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::BackgroundMigration::SetMergeRequestDiffFilesCount, schema: 20200807152315 do + let(:merge_request_diff_files) { table(:merge_request_diff_files) } + let(:merge_request_diffs) { table(:merge_request_diffs) } + let(:merge_requests) { table(:merge_requests) } + let(:namespaces) { table(:namespaces) } + let(:projects) { table(:projects) } + + let(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } + let(:project) { projects.create!(namespace_id: namespace.id) } + let(:merge_request) { merge_requests.create!(source_branch: 'x', target_branch: 'master', target_project_id: project.id) } + + it 'fills the files_count column' do + empty_diff = merge_request_diffs.create!(merge_request_id: merge_request.id) + filled_diff = merge_request_diffs.create!(merge_request_id: merge_request.id) + + 3.times do |n| + merge_request_diff_files.create!( + merge_request_diff_id: filled_diff.id, + relative_order: n, + new_file: false, + renamed_file: false, + deleted_file: false, + too_large: false, + a_mode: '', + b_mode: '', + old_path: '', + new_path: '' + ) + end + + described_class.new.perform(empty_diff.id, filled_diff.id) + + expect(empty_diff.reload.files_count).to eq(0) + expect(filled_diff.reload.files_count).to eq(3) + end +end diff --git a/spec/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value_spec.rb b/spec/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value_spec.rb new file mode 100644 index 00000000000..40d41262fc7 --- /dev/null +++ b/spec/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'spec_helper' + +# The test setup must begin before +# 20200806004742_add_not_null_constraint_on_file_store_to_package_files.rb +# has run, or else we cannot insert a row with `NULL` `file_store` to +# test against. +RSpec.describe Gitlab::BackgroundMigration::SetNullPackageFilesFileStoreToLocalValue, schema: 20200806004232 do + let!(:packages_package_files) { table(:packages_package_files) } + let!(:packages_packages) { table(:packages_packages) } + let!(:projects) { table(:projects) } + let!(:namespaces) { table(:namespaces) } + let!(:namespace) { namespaces.create!(name: 'foo', path: 'foo') } + let!(:project) { projects.create!(namespace_id: namespace.id) } + let!(:package) { packages_packages.create!(project_id: project.id, name: 'bar', package_type: 1) } + + it 'correctly migrates nil file_store to 1' do + file_store_1 = packages_package_files.create!(file_store: 1, file_name: 'foo_1', file: 'foo_1', package_id: package.id) + file_store_2 = packages_package_files.create!(file_store: 2, file_name: 'foo_2', file: 'foo_2', package_id: package.id) + file_store_nil = packages_package_files.create!(file_store: nil, file_name: 'foo_nil', file: 'foo_nil', package_id: package.id) + + described_class.new.perform(file_store_1.id, file_store_nil.id) + + file_store_1.reload + file_store_2.reload + file_store_nil.reload + + expect(file_store_1.file_store).to eq(1) # unchanged + expect(file_store_2.file_store).to eq(2) # unchanged + expect(file_store_nil.file_store).to eq(1) # nil => 1 + end +end diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 86f3978ae4f..a108bc94da5 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -217,6 +217,7 @@ MergeRequestDiff: - head_commit_sha - start_commit_sha - commits_count +- files_count MergeRequestDiffCommit: - merge_request_diff_id - relative_order diff --git a/spec/models/ci/pipeline_artifact_spec.rb b/spec/models/ci/pipeline_artifact_spec.rb index 7913b074de2..f25f43a1a53 100644 --- a/spec/models/ci/pipeline_artifact_spec.rb +++ b/spec/models/ci/pipeline_artifact_spec.rb @@ -43,4 +43,34 @@ RSpec.describe Ci::PipelineArtifact, type: :model do end end end + + describe '#set_size' do + subject { create(:ci_pipeline_artifact) } + + context 'when file is being created' do + it 'sets the size' do + expect(subject.size).to eq(85) + end + end + + context 'when file is being updated' do + it 'updates the size' do + subject.update!(file: fixture_file_upload('spec/fixtures/dk.png')) + + expect(subject.size).to eq(1062) + end + end + end + + describe 'file is being stored' do + subject { create(:ci_pipeline_artifact) } + + context 'when existing object has local store' do + it 'is stored locally' do + expect(subject.file_store).to be(ObjectStorage::Store::LOCAL) + expect(subject.file).to be_file_storage + expect(subject.file.object_store).to eq(ObjectStorage::Store::LOCAL) + end + end + end end diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index eb03162753c..cab32e17630 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -1047,19 +1047,6 @@ RSpec.describe Ci::Pipeline, :mailer do before do create(:ci_stage_entity, project: project, pipeline: pipeline, - name: 'build') - end - - it 'returns persisted stages' do - expect(pipeline.stages).not_to be_empty - expect(pipeline.stages).to all(be_persisted) - end - end - - describe '#ordered_stages' do - before do - create(:ci_stage_entity, project: project, - pipeline: pipeline, position: 4, name: 'deploy') @@ -1086,60 +1073,25 @@ RSpec.describe Ci::Pipeline, :mailer do name: 'cleanup') end - subject { pipeline.ordered_stages } - - context 'when using atomic processing' do - before do - stub_feature_flags( - ci_atomic_processing: true - ) - end - - context 'when pipelines is not complete' do - it 'returns stages in valid order' do - expect(subject).to all(be_a Ci::Stage) - expect(subject.map(&:name)) - .to eq %w[sanity build test deploy cleanup] - end - end - - context 'when pipeline is complete' do - before do - pipeline.succeed! - end + subject { pipeline.stages } - it 'returns stages in valid order' do - expect(subject).to all(be_a Ci::Stage) - expect(subject.map(&:name)) - .to eq %w[sanity build test deploy cleanup] - end + context 'when pipelines is not complete' do + it 'returns stages in valid order' do + expect(subject).to all(be_a Ci::Stage) + expect(subject.map(&:name)) + .to eq %w[sanity build test deploy cleanup] end end - context 'when using persisted stages' do + context 'when pipeline is complete' do before do - stub_feature_flags( - ci_atomic_processing: false - ) - end - - context 'when pipelines is not complete' do - it 'still returns legacy stages' do - expect(subject).to all(be_a Ci::LegacyStage) - expect(subject.map(&:name)).to eq %w[build test] - end + pipeline.succeed! end - context 'when pipeline is complete' do - before do - pipeline.succeed! - end - - it 'returns stages in valid order' do - expect(subject).to all(be_a Ci::Stage) - expect(subject.map(&:name)) - .to eq %w[sanity build test deploy cleanup] - end + it 'returns stages in valid order' do + expect(subject).to all(be_a Ci::Stage) + expect(subject.map(&:name)) + .to eq %w[sanity build test deploy cleanup] end end end diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb index cd0110a787b..c5bc7fb04ab 100644 --- a/spec/models/commit_status_spec.rb +++ b/spec/models/commit_status_spec.rb @@ -66,51 +66,35 @@ RSpec.describe CommitStatus do describe '#processed' do subject { commit_status.processed } - context 'when ci_atomic_processing is disabled' do + context 'status is latest' do before do - stub_feature_flags(ci_atomic_processing: false) - - commit_status.save! + commit_status.update!(retried: false, status: :pending) end - it { is_expected.to be_nil } + it { is_expected.to be_falsey } end - context 'when ci_atomic_processing is enabled' do + context 'status is retried' do before do - stub_feature_flags(ci_atomic_processing: true) - end - - context 'status is latest' do - before do - commit_status.update!(retried: false, status: :pending) - end - - it { is_expected.to be_falsey } + commit_status.update!(retried: true, status: :pending) end - context 'status is retried' do - before do - commit_status.update!(retried: true, status: :pending) - end - - it { is_expected.to be_truthy } - end + it { is_expected.to be_truthy } + end - it "processed state is always persisted" do - commit_status.update!(retried: false, status: :pending) + it "processed state is always persisted" do + commit_status.update!(retried: false, status: :pending) - # another process does mark object as processed - CommitStatus.find(commit_status.id).update_column(:processed, true) + # another process does mark object as processed + CommitStatus.find(commit_status.id).update_column(:processed, true) - # subsequent status transitions on the same instance - # always saves processed=false to DB even though - # the current value did not change - commit_status.update!(retried: false, status: :running) + # subsequent status transitions on the same instance + # always saves processed=false to DB even though + # the current value did not change + commit_status.update!(retried: false, status: :running) - # we look at a persisted state in DB - expect(CommitStatus.find(commit_status.id).processed).to eq(false) - end + # we look at a persisted state in DB + expect(CommitStatus.find(commit_status.id).processed).to eq(false) end end diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb index dfff9e0f3cd..84b9464b610 100644 --- a/spec/models/merge_request_diff_spec.rb +++ b/spec/models/merge_request_diff_spec.rb @@ -672,6 +672,12 @@ RSpec.describe MergeRequestDiff do end end + describe '#files_count' do + it 'returns number of diff files' do + expect(diff_with_commits.files_count).to eq(diff_with_commits.merge_request_diff_files.count) + end + end + describe '#first_commit' do it 'returns first commit' do expect(diff_with_commits.first_commit.sha).to eq(diff_with_commits.merge_request_diff_commits.last.sha) @@ -721,10 +727,12 @@ RSpec.describe MergeRequestDiff do describe '#modified_paths' do subject do - diff = create(:merge_request_diff) - create(:merge_request_diff_file, :new_file, merge_request_diff: diff) - create(:merge_request_diff_file, :renamed_file, merge_request_diff: diff) - diff + create(:merge_request_diff).tap do |diff| + create(:merge_request_diff_file, :new_file, merge_request_diff: diff) + create(:merge_request_diff_file, :renamed_file, merge_request_diff: diff) + + diff.merge_request_diff_files.reset + end end it 'returns affected file paths' do diff --git a/spec/models/packages/package_file_spec.rb b/spec/models/packages/package_file_spec.rb index 89c3a36fde8..7cc8e13d449 100644 --- a/spec/models/packages/package_file_spec.rb +++ b/spec/models/packages/package_file_spec.rb @@ -58,7 +58,7 @@ RSpec.describe Packages::PackageFile, type: :model do end describe '#update_file_metadata callback' do - let_it_be(:package_file) { build(:package_file, :nuget, file_store: nil, size: nil) } + let_it_be(:package_file) { build(:package_file, :nuget, size: nil) } subject { package_file.save! } @@ -67,9 +67,14 @@ RSpec.describe Packages::PackageFile, type: :model do .to receive(:update_file_metadata) .and_call_original - expect { subject } - .to change { package_file.file_store }.from(nil).to(::Packages::PackageFileUploader::Store::LOCAL) - .and change { package_file.size }.from(nil).to(3513) + # This expectation uses a stub because we can no longer test a change from + # `nil` to `1`, because the field is no longer nullable, and it defaults + # to `1`. + expect(package_file) + .to receive(:update_column) + .with(:file_store, ::Packages::PackageFileUploader::Store::LOCAL) + + expect { subject }.to change { package_file.size }.from(nil).to(3513) end end end diff --git a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb index a10a333b462..bc8b6b2d113 100644 --- a/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb +++ b/spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb @@ -5,20 +5,12 @@ require_relative 'shared_processing_service.rb' require_relative 'shared_processing_service_tests_with_yaml.rb' RSpec.describe Ci::PipelineProcessing::AtomicProcessingService do - before do - stub_feature_flags(ci_atomic_processing: true) - - # This feature flag is implicit - # Atomic Processing does not process statuses differently - stub_feature_flags(ci_composite_status: true) - end - it_behaves_like 'Pipeline Processing Service' it_behaves_like 'Pipeline Processing Service Tests With Yaml' private - def process_pipeline(initial_process: false) + def process_pipeline described_class.new(pipeline).execute end end diff --git a/spec/services/ci/pipeline_processing/legacy_processing_service_spec.rb b/spec/services/ci/pipeline_processing/legacy_processing_service_spec.rb deleted file mode 100644 index 569a6d62dc1..00000000000 --- a/spec/services/ci/pipeline_processing/legacy_processing_service_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require_relative 'shared_processing_service.rb' -require_relative 'shared_processing_service_tests_with_yaml.rb' - -RSpec.describe Ci::PipelineProcessing::LegacyProcessingService do - before do - stub_feature_flags(ci_atomic_processing: false) - end - - context 'when ci_composite_status is enabled' do - before do - stub_feature_flags(ci_composite_status: true) - end - - it_behaves_like 'Pipeline Processing Service' - it_behaves_like 'Pipeline Processing Service Tests With Yaml' - end - - context 'when ci_composite_status is disabled' do - before do - stub_feature_flags(ci_composite_status: false) - end - - it_behaves_like 'Pipeline Processing Service' - it_behaves_like 'Pipeline Processing Service Tests With Yaml' - end - - private - - def process_pipeline(initial_process: false) - described_class.new(pipeline).execute(initial_process: initial_process) - end -end diff --git a/spec/services/ci/pipeline_processing/shared_processing_service.rb b/spec/services/ci/pipeline_processing/shared_processing_service.rb index 224066885b6..7de22b6a4cc 100644 --- a/spec/services/ci/pipeline_processing/shared_processing_service.rb +++ b/spec/services/ci/pipeline_processing/shared_processing_service.rb @@ -788,8 +788,7 @@ RSpec.shared_examples 'Pipeline Processing Service' do let!(:deploy_pages) { create_build('deploy_pages', stage: 'deploy', stage_idx: 2, scheduling_type: :dag) } it 'runs deploy_pages without waiting prior stages' do - # Ci::PipelineProcessing::LegacyProcessingService requires :initial_process parameter - expect(process_pipeline(initial_process: true)).to be_truthy + expect(process_pipeline).to be_truthy expect(stages).to eq(%w(pending created pending)) expect(builds.pending).to contain_exactly(linux_build, mac_build, deploy_pages) diff --git a/spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb b/spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb index 17d254ba48e..77645298bc7 100644 --- a/spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb +++ b/spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb @@ -42,7 +42,7 @@ RSpec.shared_context 'Pipeline Processing Service Tests With Yaml' do { pipeline: pipeline.status, - stages: pipeline.ordered_stages.pluck(:name, :status).to_h, + stages: pipeline.stages.pluck(:name, :status).to_h, jobs: pipeline.statuses.latest.pluck(:name, :status).to_h } end diff --git a/spec/services/labels/available_labels_service_spec.rb b/spec/services/labels/available_labels_service_spec.rb index 1da98af0e4e..9ee0b80edcd 100644 --- a/spec/services/labels/available_labels_service_spec.rb +++ b/spec/services/labels/available_labels_service_spec.rb @@ -88,6 +88,12 @@ RSpec.describe Labels::AvailableLabelsService do expect(result).to match_array([group_label.id]) end end + + it 'accepts a single id parameter' do + result = described_class.new(user, project, label_id: project_label.id).filter_labels_ids_in_param(:label_id) + + expect(result).to match_array([project_label.id]) + end end describe '#available_labels' do diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index fee9202eef4..374ce4f4ce2 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -162,19 +162,9 @@ RSpec.describe Projects::UpdatePagesService do end context 'with background jobs running', :sidekiq_inline do - where(:ci_atomic_processing) do - [true, false] - end - - with_them do - before do - stub_feature_flags(ci_atomic_processing: ci_atomic_processing) - end - - it 'succeeds' do - expect(project.pages_deployed?).to be_falsey - expect(execute).to eq(:success) - end + it 'succeeds' do + expect(project.pages_deployed?).to be_falsey + expect(execute).to eq(:success) end end end diff --git a/spec/support/helpers/stub_object_storage.rb b/spec/support/helpers/stub_object_storage.rb index 8b66cf21aca..bc31ee955c8 100644 --- a/spec/support/helpers/stub_object_storage.rb +++ b/spec/support/helpers/stub_object_storage.rb @@ -47,9 +47,9 @@ module StubObjectStorage end end - def stub_artifacts_object_storage(**params) + def stub_artifacts_object_storage(uploader = JobArtifactUploader, **params) stub_object_storage_uploader(config: Gitlab.config.artifacts.object_store, - uploader: JobArtifactUploader, + uploader: uploader, remote_directory: 'artifacts', **params) end diff --git a/spec/uploaders/ci/pipeline_artifact_uploader_spec.rb b/spec/uploaders/ci/pipeline_artifact_uploader_spec.rb new file mode 100644 index 00000000000..0630e9f6546 --- /dev/null +++ b/spec/uploaders/ci/pipeline_artifact_uploader_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::PipelineArtifactUploader do + let(:pipeline_artifact) { create(:ci_pipeline_artifact) } + let(:uploader) { described_class.new(pipeline_artifact, :file) } + + subject { uploader } + + it_behaves_like "builds correct paths", + store_dir: %r[\h{2}/\h{2}/\h{64}/pipelines/\d+/artifacts/\d+], + cache_dir: %r[artifacts/tmp/cache], + work_dir: %r[artifacts/tmp/work] + + context 'when object store is REMOTE' do + before do + stub_artifacts_object_storage(described_class) + end + + include_context 'with storage', described_class::Store::REMOTE + + it_behaves_like 'builds correct paths', store_dir: %r[\h{2}/\h{2}/\h{64}/pipelines/\d+/artifacts/\d+] + end + + context 'when file is stored in valid local_path' do + let(:file) do + fixture_file_upload('spec/fixtures/pipeline_artifacts/code_coverage.json', 'application/json') + end + + before do + uploader.store!(file) + end + + subject { uploader.file.path } + + it { is_expected.to match(%r[#{uploader.root}/#{uploader.class.base_dir}\h{2}/\h{2}/\h{64}/pipelines/#{pipeline_artifact.pipeline_id}/artifacts/#{pipeline_artifact.id}/code_coverage.json]) } + end +end diff --git a/spec/workers/pipeline_process_worker_spec.rb b/spec/workers/pipeline_process_worker_spec.rb index a6e6b505a38..5d45a131095 100644 --- a/spec/workers/pipeline_process_worker_spec.rb +++ b/spec/workers/pipeline_process_worker_spec.rb @@ -12,17 +12,6 @@ RSpec.describe PipelineProcessWorker do described_class.new.perform(pipeline.id) end - - context 'when build_ids are passed' do - let(:build) { create(:ci_build, pipeline: pipeline, name: 'my-build') } - - it 'processes pipeline with a list of builds' do - expect_any_instance_of(Ci::ProcessPipelineService).to receive(:execute) - .with([build.id]) - - described_class.new.perform(pipeline.id, [build.id]) - end - end end context 'when pipeline does not exist' do diff --git a/spec/workers/pipeline_update_worker_spec.rb b/spec/workers/pipeline_update_worker_spec.rb deleted file mode 100644 index c5c1cc0eefd..00000000000 --- a/spec/workers/pipeline_update_worker_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe PipelineUpdateWorker do - describe '#perform' do - context 'when pipeline exists' do - let(:pipeline) { create(:ci_pipeline) } - - it 'updates pipeline status' do - expect_any_instance_of(Ci::Pipeline).to receive(:set_status).with('skipped') - - described_class.new.perform(pipeline.id) - end - - include_examples 'an idempotent worker' do - let(:job_args) { [pipeline.id] } - - it 'sets pipeline status to skipped' do - expect { subject }.to change { pipeline.reload.status }.from('pending').to('skipped') - end - end - end - - context 'when pipeline does not exist' do - it 'does not raise exception' do - expect { described_class.new.perform(123) } - .not_to raise_error - end - end - end -end diff --git a/vendor/spdx.json b/vendor/spdx.json new file mode 100644 index 00000000000..92018b37412 --- /dev/null +++ b/vendor/spdx.json @@ -0,0 +1 @@ +{"licenseListVersion":"3.10","licenses":[{"reference":"./0BSD.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/0BSD.json","referenceNumber":"250","name":"BSD Zero Clause License","licenseId":"0BSD","seeAlso":["http://landley.net/toybox/license.html"],"isOsiApproved":true},{"reference":"./AAL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AAL.json","referenceNumber":"63","name":"Attribution Assurance License","licenseId":"AAL","seeAlso":["https://opensource.org/licenses/attribution"],"isOsiApproved":true},{"reference":"./ADSL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ADSL.json","referenceNumber":"227","name":"Amazon Digital Services License","licenseId":"ADSL","seeAlso":["https://fedoraproject.org/wiki/Licensing/AmazonDigitalServicesLicense"],"isOsiApproved":false},{"reference":"./AFL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AFL-1.1.json","referenceNumber":"29","name":"Academic Free License v1.1","licenseId":"AFL-1.1","seeAlso":["http://opensource.linux-mirror.org/licenses/afl-1.1.txt","http://wayback.archive.org/web/20021004124254/http://www.opensource.org/licenses/academic.php"],"isOsiApproved":true},{"reference":"./AFL-1.2.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AFL-1.2.json","referenceNumber":"232","name":"Academic Free License v1.2","licenseId":"AFL-1.2","seeAlso":["http://opensource.linux-mirror.org/licenses/afl-1.2.txt","http://wayback.archive.org/web/20021204204652/http://www.opensource.org/licenses/academic.php"],"isOsiApproved":true},{"reference":"./AFL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AFL-2.0.json","referenceNumber":"358","name":"Academic Free License v2.0","licenseId":"AFL-2.0","seeAlso":["http://wayback.archive.org/web/20060924134533/http://www.opensource.org/licenses/afl-2.0.txt"],"isOsiApproved":true},{"reference":"./AFL-2.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AFL-2.1.json","referenceNumber":"261","name":"Academic Free License v2.1","licenseId":"AFL-2.1","seeAlso":["http://opensource.linux-mirror.org/licenses/afl-2.1.txt"],"isOsiApproved":true},{"reference":"./AFL-3.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AFL-3.0.json","referenceNumber":"380","name":"Academic Free License v3.0","licenseId":"AFL-3.0","seeAlso":["http://www.rosenlaw.com/AFL3.0.htm","https://opensource.org/licenses/afl-3.0"],"isOsiApproved":true},{"reference":"./AGPL-1.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AGPL-1.0.json","referenceNumber":"180","name":"Affero General Public License v1.0","licenseId":"AGPL-1.0","seeAlso":["http://www.affero.org/oagpl.html"],"isOsiApproved":false},{"reference":"./AGPL-1.0-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AGPL-1.0-only.json","referenceNumber":"74","name":"Affero General Public License v1.0 only","licenseId":"AGPL-1.0-only","seeAlso":["http://www.affero.org/oagpl.html"],"isOsiApproved":false},{"reference":"./AGPL-1.0-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AGPL-1.0-or-later.json","referenceNumber":"173","name":"Affero General Public License v1.0 or later","licenseId":"AGPL-1.0-or-later","seeAlso":["http://www.affero.org/oagpl.html"],"isOsiApproved":false},{"reference":"./AGPL-3.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AGPL-3.0.json","referenceNumber":"152","name":"GNU Affero General Public License v3.0","licenseId":"AGPL-3.0","seeAlso":["https://www.gnu.org/licenses/agpl.txt","https://opensource.org/licenses/AGPL-3.0"],"isOsiApproved":true},{"reference":"./AGPL-3.0-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AGPL-3.0-only.json","referenceNumber":"312","name":"GNU Affero General Public License v3.0 only","licenseId":"AGPL-3.0-only","seeAlso":["https://www.gnu.org/licenses/agpl.txt","https://opensource.org/licenses/AGPL-3.0"],"isOsiApproved":true},{"reference":"./AGPL-3.0-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/AGPL-3.0-or-later.json","referenceNumber":"164","name":"GNU Affero General Public License v3.0 or later","licenseId":"AGPL-3.0-or-later","seeAlso":["https://www.gnu.org/licenses/agpl.txt","https://opensource.org/licenses/AGPL-3.0"],"isOsiApproved":true},{"reference":"./AMDPLPA.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AMDPLPA.json","referenceNumber":"137","name":"AMD's plpa_map.c License","licenseId":"AMDPLPA","seeAlso":["https://fedoraproject.org/wiki/Licensing/AMD_plpa_map_License"],"isOsiApproved":false},{"reference":"./AML.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AML.json","referenceNumber":"161","name":"Apple MIT License","licenseId":"AML","seeAlso":["https://fedoraproject.org/wiki/Licensing/Apple_MIT_License"],"isOsiApproved":false},{"reference":"./AMPAS.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/AMPAS.json","referenceNumber":"140","name":"Academy of Motion Picture Arts and Sciences BSD","licenseId":"AMPAS","seeAlso":["https://fedoraproject.org/wiki/Licensing/BSD#AMPASBSD"],"isOsiApproved":false},{"reference":"./ANTLR-PD.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ANTLR-PD.json","referenceNumber":"46","name":"ANTLR Software Rights Notice","licenseId":"ANTLR-PD","seeAlso":["http://www.antlr2.org/license.html"],"isOsiApproved":false},{"reference":"./APAFML.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/APAFML.json","referenceNumber":"260","name":"Adobe Postscript AFM License","licenseId":"APAFML","seeAlso":["https://fedoraproject.org/wiki/Licensing/AdobePostscriptAFM"],"isOsiApproved":false},{"reference":"./APL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/APL-1.0.json","referenceNumber":"290","name":"Adaptive Public License 1.0","licenseId":"APL-1.0","seeAlso":["https://opensource.org/licenses/APL-1.0"],"isOsiApproved":true},{"reference":"./APSL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/APSL-1.0.json","referenceNumber":"406","name":"Apple Public Source License 1.0","licenseId":"APSL-1.0","seeAlso":["https://fedoraproject.org/wiki/Licensing/Apple_Public_Source_License_1.0"],"isOsiApproved":true},{"reference":"./APSL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/APSL-1.1.json","referenceNumber":"355","name":"Apple Public Source License 1.1","licenseId":"APSL-1.1","seeAlso":["http://www.opensource.apple.com/source/IOSerialFamily/IOSerialFamily-7/APPLE_LICENSE"],"isOsiApproved":true},{"reference":"./APSL-1.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/APSL-1.2.json","referenceNumber":"211","name":"Apple Public Source License 1.2","licenseId":"APSL-1.2","seeAlso":["http://www.samurajdata.se/opensource/mirror/licenses/apsl.php"],"isOsiApproved":true},{"reference":"./APSL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/APSL-2.0.json","referenceNumber":"145","name":"Apple Public Source License 2.0","licenseId":"APSL-2.0","seeAlso":["http://www.opensource.apple.com/license/apsl/"],"isOsiApproved":true},{"reference":"./Abstyles.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Abstyles.json","referenceNumber":"78","name":"Abstyles License","licenseId":"Abstyles","seeAlso":["https://fedoraproject.org/wiki/Licensing/Abstyles"],"isOsiApproved":false},{"reference":"./Adobe-2006.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Adobe-2006.json","referenceNumber":"327","name":"Adobe Systems Incorporated Source Code License Agreement","licenseId":"Adobe-2006","seeAlso":["https://fedoraproject.org/wiki/Licensing/AdobeLicense"],"isOsiApproved":false},{"reference":"./Adobe-Glyph.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Adobe-Glyph.json","referenceNumber":"360","name":"Adobe Glyph List License","licenseId":"Adobe-Glyph","seeAlso":["https://fedoraproject.org/wiki/Licensing/MIT#AdobeGlyph"],"isOsiApproved":false},{"reference":"./Afmparse.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Afmparse.json","referenceNumber":"349","name":"Afmparse License","licenseId":"Afmparse","seeAlso":["https://fedoraproject.org/wiki/Licensing/Afmparse"],"isOsiApproved":false},{"reference":"./Aladdin.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Aladdin.json","referenceNumber":"332","name":"Aladdin Free Public License","licenseId":"Aladdin","seeAlso":["http://pages.cs.wisc.edu/~ghost/doc/AFPL/6.01/Public.htm"],"isOsiApproved":false},{"reference":"./Apache-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Apache-1.0.json","referenceNumber":"33","name":"Apache License 1.0","licenseId":"Apache-1.0","seeAlso":["http://www.apache.org/licenses/LICENSE-1.0"],"isOsiApproved":false},{"reference":"./Apache-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Apache-1.1.json","referenceNumber":"286","name":"Apache License 1.1","licenseId":"Apache-1.1","seeAlso":["http://apache.org/licenses/LICENSE-1.1","https://opensource.org/licenses/Apache-1.1"],"isOsiApproved":true},{"reference":"./Apache-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Apache-2.0.json","referenceNumber":"385","name":"Apache License 2.0","licenseId":"Apache-2.0","seeAlso":["http://www.apache.org/licenses/LICENSE-2.0","https://opensource.org/licenses/Apache-2.0"],"isOsiApproved":true},{"reference":"./Artistic-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Artistic-1.0.json","referenceNumber":"285","name":"Artistic License 1.0","licenseId":"Artistic-1.0","seeAlso":["https://opensource.org/licenses/Artistic-1.0"],"isOsiApproved":true},{"reference":"./Artistic-1.0-Perl.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Artistic-1.0-Perl.json","referenceNumber":"322","name":"Artistic License 1.0 (Perl)","licenseId":"Artistic-1.0-Perl","seeAlso":["http://dev.perl.org/licenses/artistic.html"],"isOsiApproved":true},{"reference":"./Artistic-1.0-cl8.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Artistic-1.0-cl8.json","referenceNumber":"240","name":"Artistic License 1.0 w/clause 8","licenseId":"Artistic-1.0-cl8","seeAlso":["https://opensource.org/licenses/Artistic-1.0"],"isOsiApproved":true},{"reference":"./Artistic-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Artistic-2.0.json","referenceNumber":"81","name":"Artistic License 2.0","licenseId":"Artistic-2.0","seeAlso":["http://www.perlfoundation.org/artistic_license_2_0","https://opensource.org/licenses/artistic-license-2.0"],"isOsiApproved":true},{"reference":"./BSD-1-Clause.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-1-Clause.json","referenceNumber":"408","name":"BSD 1-Clause License","licenseId":"BSD-1-Clause","seeAlso":["https://svnweb.freebsd.org/base/head/include/ifaddrs.h?revision=326823"],"isOsiApproved":true},{"reference":"./BSD-2-Clause.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-2-Clause.json","referenceNumber":"323","name":"BSD 2-Clause \"Simplified\" License","licenseId":"BSD-2-Clause","seeAlso":["https://opensource.org/licenses/BSD-2-Clause"],"isOsiApproved":true},{"reference":"./BSD-2-Clause-FreeBSD.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BSD-2-Clause-FreeBSD.json","referenceNumber":"294","name":"BSD 2-Clause FreeBSD License","licenseId":"BSD-2-Clause-FreeBSD","seeAlso":["http://www.freebsd.org/copyright/freebsd-license.html"],"isOsiApproved":false},{"reference":"./BSD-2-Clause-NetBSD.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/BSD-2-Clause-NetBSD.json","referenceNumber":"193","name":"BSD 2-Clause NetBSD License","licenseId":"BSD-2-Clause-NetBSD","seeAlso":["http://www.netbsd.org/about/redistribution.html#default"],"isOsiApproved":false},{"reference":"./BSD-2-Clause-Patent.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-2-Clause-Patent.json","referenceNumber":"381","name":"BSD-2-Clause Plus Patent License","licenseId":"BSD-2-Clause-Patent","seeAlso":["https://opensource.org/licenses/BSDplusPatent"],"isOsiApproved":true},{"reference":"./BSD-2-Clause-Views.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-2-Clause-Views.json","referenceNumber":"291","name":"BSD 2-Clause with views sentence","licenseId":"BSD-2-Clause-Views","seeAlso":["http://www.freebsd.org/copyright/freebsd-license.html","https://people.freebsd.org/~ivoras/wine/patch-wine-nvidia.sh","https://github.com/protegeproject/protege/blob/master/license.txt"],"isOsiApproved":false},{"reference":"./BSD-3-Clause.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause.json","referenceNumber":"212","name":"BSD 3-Clause \"New\" or \"Revised\" License","licenseId":"BSD-3-Clause","seeAlso":["https://opensource.org/licenses/BSD-3-Clause"],"isOsiApproved":true},{"reference":"./BSD-3-Clause-Attribution.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-Attribution.json","referenceNumber":"41","name":"BSD with attribution","licenseId":"BSD-3-Clause-Attribution","seeAlso":["https://fedoraproject.org/wiki/Licensing/BSD_with_Attribution"],"isOsiApproved":false},{"reference":"./BSD-3-Clause-Clear.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-Clear.json","referenceNumber":"92","name":"BSD 3-Clause Clear License","licenseId":"BSD-3-Clause-Clear","seeAlso":["http://labs.metacarta.com/license-explanation.html#license"],"isOsiApproved":false},{"reference":"./BSD-3-Clause-LBNL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-LBNL.json","referenceNumber":"151","name":"Lawrence Berkeley National Labs BSD variant license","licenseId":"BSD-3-Clause-LBNL","seeAlso":["https://fedoraproject.org/wiki/Licensing/LBNLBSD"],"isOsiApproved":true},{"reference":"./BSD-3-Clause-No-Nuclear-License.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License.json","referenceNumber":"65","name":"BSD 3-Clause No Nuclear License","licenseId":"BSD-3-Clause-No-Nuclear-License","seeAlso":["http://download.oracle.com/otn-pub/java/licenses/bsd.txt?AuthParam=1467140197_43d516ce1776bd08a58235a7785be1cc"],"isOsiApproved":false},{"reference":"./BSD-3-Clause-No-Nuclear-License-2014.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-License-2014.json","referenceNumber":"359","name":"BSD 3-Clause No Nuclear License 2014","licenseId":"BSD-3-Clause-No-Nuclear-License-2014","seeAlso":["https://java.net/projects/javaeetutorial/pages/BerkeleyLicense"],"isOsiApproved":false},{"reference":"./BSD-3-Clause-No-Nuclear-Warranty.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-No-Nuclear-Warranty.json","referenceNumber":"121","name":"BSD 3-Clause No Nuclear Warranty","licenseId":"BSD-3-Clause-No-Nuclear-Warranty","seeAlso":["https://jogamp.org/git/?p=gluegen.git;a=blob_plain;f=LICENSE.txt"],"isOsiApproved":false},{"reference":"./BSD-3-Clause-Open-MPI.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-3-Clause-Open-MPI.json","referenceNumber":"224","name":"BSD 3-Clause Open MPI variant","licenseId":"BSD-3-Clause-Open-MPI","seeAlso":["https://www.open-mpi.org/community/license.php","http://www.netlib.org/lapack/LICENSE.txt"],"isOsiApproved":false},{"reference":"./BSD-4-Clause.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BSD-4-Clause.json","referenceNumber":"72","name":"BSD 4-Clause \"Original\" or \"Old\" License","licenseId":"BSD-4-Clause","seeAlso":["http://directory.fsf.org/wiki/License:BSD_4Clause"],"isOsiApproved":false},{"reference":"./BSD-4-Clause-UC.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-4-Clause-UC.json","referenceNumber":"391","name":"BSD-4-Clause (University of California-Specific)","licenseId":"BSD-4-Clause-UC","seeAlso":["http://www.freebsd.org/copyright/license.html"],"isOsiApproved":false},{"reference":"./BSD-Protection.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-Protection.json","referenceNumber":"419","name":"BSD Protection License","licenseId":"BSD-Protection","seeAlso":["https://fedoraproject.org/wiki/Licensing/BSD_Protection_License"],"isOsiApproved":false},{"reference":"./BSD-Source-Code.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BSD-Source-Code.json","referenceNumber":"174","name":"BSD Source Code Attribution","licenseId":"BSD-Source-Code","seeAlso":["https://github.com/robbiehanson/CocoaHTTPServer/blob/master/LICENSE.txt"],"isOsiApproved":false},{"reference":"./BSL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BSL-1.0.json","referenceNumber":"309","name":"Boost Software License 1.0","licenseId":"BSL-1.0","seeAlso":["http://www.boost.org/LICENSE_1_0.txt","https://opensource.org/licenses/BSL-1.0"],"isOsiApproved":true},{"reference":"./Bahyph.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Bahyph.json","referenceNumber":"155","name":"Bahyph License","licenseId":"Bahyph","seeAlso":["https://fedoraproject.org/wiki/Licensing/Bahyph"],"isOsiApproved":false},{"reference":"./Barr.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Barr.json","referenceNumber":"132","name":"Barr License","licenseId":"Barr","seeAlso":["https://fedoraproject.org/wiki/Licensing/Barr"],"isOsiApproved":false},{"reference":"./Beerware.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Beerware.json","referenceNumber":"263","name":"Beerware License","licenseId":"Beerware","seeAlso":["https://fedoraproject.org/wiki/Licensing/Beerware","https://people.freebsd.org/~phk/"],"isOsiApproved":false},{"reference":"./BitTorrent-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BitTorrent-1.0.json","referenceNumber":"217","name":"BitTorrent Open Source License v1.0","licenseId":"BitTorrent-1.0","seeAlso":["http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo-x86/licenses/BitTorrent?r1=1.1\u0026r2=1.1.1.1\u0026diff_format=s"],"isOsiApproved":false},{"reference":"./BitTorrent-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/BitTorrent-1.1.json","referenceNumber":"196","name":"BitTorrent Open Source License v1.1","licenseId":"BitTorrent-1.1","seeAlso":["http://directory.fsf.org/wiki/License:BitTorrentOSL1.1"],"isOsiApproved":false},{"reference":"./BlueOak-1.0.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/BlueOak-1.0.0.json","referenceNumber":"221","name":"Blue Oak Model License 1.0.0","licenseId":"BlueOak-1.0.0","seeAlso":["https://blueoakcouncil.org/license/1.0.0"],"isOsiApproved":false},{"reference":"./Borceux.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Borceux.json","referenceNumber":"321","name":"Borceux license","licenseId":"Borceux","seeAlso":["https://fedoraproject.org/wiki/Licensing/Borceux"],"isOsiApproved":false},{"reference":"./CAL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CAL-1.0.json","referenceNumber":"62","name":"Cryptographic Autonomy License 1.0","licenseId":"CAL-1.0","seeAlso":["http://cryptographicautonomylicense.com/license-text.html","https://opensource.org/licenses/CAL-1.0"],"isOsiApproved":true},{"reference":"./CAL-1.0-Combined-Work-Exception.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CAL-1.0-Combined-Work-Exception.json","referenceNumber":"83","name":"Cryptographic Autonomy License 1.0 (Combined Work Exception)","licenseId":"CAL-1.0-Combined-Work-Exception","seeAlso":["http://cryptographicautonomylicense.com/license-text.html","https://opensource.org/licenses/CAL-1.0"],"isOsiApproved":true},{"reference":"./CATOSL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CATOSL-1.1.json","referenceNumber":"245","name":"Computer Associates Trusted Open Source License 1.1","licenseId":"CATOSL-1.1","seeAlso":["https://opensource.org/licenses/CATOSL-1.1"],"isOsiApproved":true},{"reference":"./CC-BY-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-1.0.json","referenceNumber":"24","name":"Creative Commons Attribution 1.0 Generic","licenseId":"CC-BY-1.0","seeAlso":["https://creativecommons.org/licenses/by/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-2.0.json","referenceNumber":"64","name":"Creative Commons Attribution 2.0 Generic","licenseId":"CC-BY-2.0","seeAlso":["https://creativecommons.org/licenses/by/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-2.5.json","referenceNumber":"194","name":"Creative Commons Attribution 2.5 Generic","licenseId":"CC-BY-2.5","seeAlso":["https://creativecommons.org/licenses/by/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-3.0.json","referenceNumber":"361","name":"Creative Commons Attribution 3.0 Unported","licenseId":"CC-BY-3.0","seeAlso":["https://creativecommons.org/licenses/by/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-3.0-AT.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-3.0-AT.json","referenceNumber":"237","name":"Creative Commons Attribution 3.0 Austria","licenseId":"CC-BY-3.0-AT","seeAlso":["https://creativecommons.org/licenses/by/3.0/at/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-4.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CC-BY-4.0.json","referenceNumber":"228","name":"Creative Commons Attribution 4.0 International","licenseId":"CC-BY-4.0","seeAlso":["https://creativecommons.org/licenses/by/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-1.0.json","referenceNumber":"242","name":"Creative Commons Attribution Non Commercial 1.0 Generic","licenseId":"CC-BY-NC-1.0","seeAlso":["https://creativecommons.org/licenses/by-nc/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-2.0.json","referenceNumber":"343","name":"Creative Commons Attribution Non Commercial 2.0 Generic","licenseId":"CC-BY-NC-2.0","seeAlso":["https://creativecommons.org/licenses/by-nc/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-2.5.json","referenceNumber":"417","name":"Creative Commons Attribution Non Commercial 2.5 Generic","licenseId":"CC-BY-NC-2.5","seeAlso":["https://creativecommons.org/licenses/by-nc/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-3.0.json","referenceNumber":"353","name":"Creative Commons Attribution Non Commercial 3.0 Unported","licenseId":"CC-BY-NC-3.0","seeAlso":["https://creativecommons.org/licenses/by-nc/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-4.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-4.0.json","referenceNumber":"284","name":"Creative Commons Attribution Non Commercial 4.0 International","licenseId":"CC-BY-NC-4.0","seeAlso":["https://creativecommons.org/licenses/by-nc/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-1.0.json","referenceNumber":"106","name":"Creative Commons Attribution Non Commercial No Derivatives 1.0 Generic","licenseId":"CC-BY-NC-ND-1.0","seeAlso":["https://creativecommons.org/licenses/by-nd-nc/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-2.0.json","referenceNumber":"142","name":"Creative Commons Attribution Non Commercial No Derivatives 2.0 Generic","licenseId":"CC-BY-NC-ND-2.0","seeAlso":["https://creativecommons.org/licenses/by-nc-nd/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-2.5.json","referenceNumber":"31","name":"Creative Commons Attribution Non Commercial No Derivatives 2.5 Generic","licenseId":"CC-BY-NC-ND-2.5","seeAlso":["https://creativecommons.org/licenses/by-nc-nd/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-3.0.json","referenceNumber":"43","name":"Creative Commons Attribution Non Commercial No Derivatives 3.0 Unported","licenseId":"CC-BY-NC-ND-3.0","seeAlso":["https://creativecommons.org/licenses/by-nc-nd/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-3.0-IGO.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-3.0-IGO.json","referenceNumber":"366","name":"Creative Commons Attribution Non Commercial No Derivatives 3.0 IGO","licenseId":"CC-BY-NC-ND-3.0-IGO","seeAlso":["https://creativecommons.org/licenses/by-nc-nd/3.0/igo/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-ND-4.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-ND-4.0.json","referenceNumber":"177","name":"Creative Commons Attribution Non Commercial No Derivatives 4.0 International","licenseId":"CC-BY-NC-ND-4.0","seeAlso":["https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-SA-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-SA-1.0.json","referenceNumber":"124","name":"Creative Commons Attribution Non Commercial Share Alike 1.0 Generic","licenseId":"CC-BY-NC-SA-1.0","seeAlso":["https://creativecommons.org/licenses/by-nc-sa/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-SA-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-SA-2.0.json","referenceNumber":"431","name":"Creative Commons Attribution Non Commercial Share Alike 2.0 Generic","licenseId":"CC-BY-NC-SA-2.0","seeAlso":["https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-SA-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-SA-2.5.json","referenceNumber":"225","name":"Creative Commons Attribution Non Commercial Share Alike 2.5 Generic","licenseId":"CC-BY-NC-SA-2.5","seeAlso":["https://creativecommons.org/licenses/by-nc-sa/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-SA-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-SA-3.0.json","referenceNumber":"379","name":"Creative Commons Attribution Non Commercial Share Alike 3.0 Unported","licenseId":"CC-BY-NC-SA-3.0","seeAlso":["https://creativecommons.org/licenses/by-nc-sa/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-NC-SA-4.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-NC-SA-4.0.json","referenceNumber":"348","name":"Creative Commons Attribution Non Commercial Share Alike 4.0 International","licenseId":"CC-BY-NC-SA-4.0","seeAlso":["https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-ND-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-ND-1.0.json","referenceNumber":"98","name":"Creative Commons Attribution No Derivatives 1.0 Generic","licenseId":"CC-BY-ND-1.0","seeAlso":["https://creativecommons.org/licenses/by-nd/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-ND-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-ND-2.0.json","referenceNumber":"48","name":"Creative Commons Attribution No Derivatives 2.0 Generic","licenseId":"CC-BY-ND-2.0","seeAlso":["https://creativecommons.org/licenses/by-nd/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-ND-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-ND-2.5.json","referenceNumber":"28","name":"Creative Commons Attribution No Derivatives 2.5 Generic","licenseId":"CC-BY-ND-2.5","seeAlso":["https://creativecommons.org/licenses/by-nd/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-ND-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-ND-3.0.json","referenceNumber":"297","name":"Creative Commons Attribution No Derivatives 3.0 Unported","licenseId":"CC-BY-ND-3.0","seeAlso":["https://creativecommons.org/licenses/by-nd/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-ND-4.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-ND-4.0.json","referenceNumber":"335","name":"Creative Commons Attribution No Derivatives 4.0 International","licenseId":"CC-BY-ND-4.0","seeAlso":["https://creativecommons.org/licenses/by-nd/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-1.0.json","referenceNumber":"422","name":"Creative Commons Attribution Share Alike 1.0 Generic","licenseId":"CC-BY-SA-1.0","seeAlso":["https://creativecommons.org/licenses/by-sa/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-2.0.json","referenceNumber":"386","name":"Creative Commons Attribution Share Alike 2.0 Generic","licenseId":"CC-BY-SA-2.0","seeAlso":["https://creativecommons.org/licenses/by-sa/2.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-2.5.json","referenceNumber":"213","name":"Creative Commons Attribution Share Alike 2.5 Generic","licenseId":"CC-BY-SA-2.5","seeAlso":["https://creativecommons.org/licenses/by-sa/2.5/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-3.0.json","referenceNumber":"244","name":"Creative Commons Attribution Share Alike 3.0 Unported","licenseId":"CC-BY-SA-3.0","seeAlso":["https://creativecommons.org/licenses/by-sa/3.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-3.0-AT.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-3.0-AT.json","referenceNumber":"305","name":"Creative Commons Attribution-Share Alike 3.0 Austria","licenseId":"CC-BY-SA-3.0-AT","seeAlso":["https://creativecommons.org/licenses/by-sa/3.0/at/legalcode"],"isOsiApproved":false},{"reference":"./CC-BY-SA-4.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CC-BY-SA-4.0.json","referenceNumber":"311","name":"Creative Commons Attribution Share Alike 4.0 International","licenseId":"CC-BY-SA-4.0","seeAlso":["https://creativecommons.org/licenses/by-sa/4.0/legalcode"],"isOsiApproved":false},{"reference":"./CC-PDDC.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CC-PDDC.json","referenceNumber":"96","name":"Creative Commons Public Domain Dedication and Certification","licenseId":"CC-PDDC","seeAlso":["https://creativecommons.org/licenses/publicdomain/"],"isOsiApproved":false},{"reference":"./CC0-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CC0-1.0.json","referenceNumber":"69","name":"Creative Commons Zero v1.0 Universal","licenseId":"CC0-1.0","seeAlso":["https://creativecommons.org/publicdomain/zero/1.0/legalcode"],"isOsiApproved":false},{"reference":"./CDDL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CDDL-1.0.json","referenceNumber":"352","name":"Common Development and Distribution License 1.0","licenseId":"CDDL-1.0","seeAlso":["https://opensource.org/licenses/cddl1"],"isOsiApproved":true},{"reference":"./CDDL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CDDL-1.1.json","referenceNumber":"296","name":"Common Development and Distribution License 1.1","licenseId":"CDDL-1.1","seeAlso":["http://glassfish.java.net/public/CDDL+GPL_1_1.html","https://javaee.github.io/glassfish/LICENSE"],"isOsiApproved":false},{"reference":"./CDLA-Permissive-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CDLA-Permissive-1.0.json","referenceNumber":"112","name":"Community Data License Agreement Permissive 1.0","licenseId":"CDLA-Permissive-1.0","seeAlso":["https://cdla.io/permissive-1-0"],"isOsiApproved":false},{"reference":"./CDLA-Sharing-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CDLA-Sharing-1.0.json","referenceNumber":"184","name":"Community Data License Agreement Sharing 1.0","licenseId":"CDLA-Sharing-1.0","seeAlso":["https://cdla.io/sharing-1-0"],"isOsiApproved":false},{"reference":"./CECILL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CECILL-1.0.json","referenceNumber":"11","name":"CeCILL Free Software License Agreement v1.0","licenseId":"CECILL-1.0","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL_V1-fr.html"],"isOsiApproved":false},{"reference":"./CECILL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CECILL-1.1.json","referenceNumber":"139","name":"CeCILL Free Software License Agreement v1.1","licenseId":"CECILL-1.1","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL_V1.1-US.html"],"isOsiApproved":false},{"reference":"./CECILL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CECILL-2.0.json","referenceNumber":"5","name":"CeCILL Free Software License Agreement v2.0","licenseId":"CECILL-2.0","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL_V2-en.html"],"isOsiApproved":false},{"reference":"./CECILL-2.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CECILL-2.1.json","referenceNumber":"149","name":"CeCILL Free Software License Agreement v2.1","licenseId":"CECILL-2.1","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html"],"isOsiApproved":true},{"reference":"./CECILL-B.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CECILL-B.json","referenceNumber":"97","name":"CeCILL-B Free Software License Agreement","licenseId":"CECILL-B","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html"],"isOsiApproved":false},{"reference":"./CECILL-C.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CECILL-C.json","referenceNumber":"251","name":"CeCILL-C Free Software License Agreement","licenseId":"CECILL-C","seeAlso":["http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html"],"isOsiApproved":false},{"reference":"./CERN-OHL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CERN-OHL-1.1.json","referenceNumber":"127","name":"CERN Open Hardware Licence v1.1","licenseId":"CERN-OHL-1.1","seeAlso":["https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.1"],"isOsiApproved":false},{"reference":"./CERN-OHL-1.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CERN-OHL-1.2.json","referenceNumber":"172","name":"CERN Open Hardware Licence v1.2","licenseId":"CERN-OHL-1.2","seeAlso":["https://www.ohwr.org/project/licenses/wikis/cern-ohl-v1.2"],"isOsiApproved":false},{"reference":"./CERN-OHL-P-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CERN-OHL-P-2.0.json","referenceNumber":"267","name":"CERN Open Hardware Licence Version 2 - Permissive","licenseId":"CERN-OHL-P-2.0","seeAlso":["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"],"isOsiApproved":false},{"reference":"./CERN-OHL-S-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CERN-OHL-S-2.0.json","referenceNumber":"49","name":"CERN Open Hardware Licence Version 2 - Strongly Reciprocal","licenseId":"CERN-OHL-S-2.0","seeAlso":["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"],"isOsiApproved":false},{"reference":"./CERN-OHL-W-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CERN-OHL-W-2.0.json","referenceNumber":"279","name":"CERN Open Hardware Licence Version 2 - Weakly Reciprocal","licenseId":"CERN-OHL-W-2.0","seeAlso":["https://www.ohwr.org/project/cernohl/wikis/Documents/CERN-OHL-version-2"],"isOsiApproved":false},{"reference":"./CNRI-Jython.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CNRI-Jython.json","referenceNumber":"80","name":"CNRI Jython License","licenseId":"CNRI-Jython","seeAlso":["http://www.jython.org/license.html"],"isOsiApproved":false},{"reference":"./CNRI-Python.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CNRI-Python.json","referenceNumber":"100","name":"CNRI Python License","licenseId":"CNRI-Python","seeAlso":["https://opensource.org/licenses/CNRI-Python"],"isOsiApproved":true},{"reference":"./CNRI-Python-GPL-Compatible.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CNRI-Python-GPL-Compatible.json","referenceNumber":"365","name":"CNRI Python Open Source GPL Compatible License Agreement","licenseId":"CNRI-Python-GPL-Compatible","seeAlso":["http://www.python.org/download/releases/1.6.1/download_win/"],"isOsiApproved":false},{"reference":"./CPAL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CPAL-1.0.json","referenceNumber":"298","name":"Common Public Attribution License 1.0","licenseId":"CPAL-1.0","seeAlso":["https://opensource.org/licenses/CPAL-1.0"],"isOsiApproved":true},{"reference":"./CPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/CPL-1.0.json","referenceNumber":"247","name":"Common Public License 1.0","licenseId":"CPL-1.0","seeAlso":["https://opensource.org/licenses/CPL-1.0"],"isOsiApproved":true},{"reference":"./CPOL-1.02.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CPOL-1.02.json","referenceNumber":"241","name":"Code Project Open License 1.02","licenseId":"CPOL-1.02","seeAlso":["http://www.codeproject.com/info/cpol10.aspx"],"isOsiApproved":false},{"reference":"./CUA-OPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CUA-OPL-1.0.json","referenceNumber":"170","name":"CUA Office Public License v1.0","licenseId":"CUA-OPL-1.0","seeAlso":["https://opensource.org/licenses/CUA-OPL-1.0"],"isOsiApproved":true},{"reference":"./Caldera.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Caldera.json","referenceNumber":"262","name":"Caldera License","licenseId":"Caldera","seeAlso":["http://www.lemis.com/grog/UNIX/ancient-source-all.pdf"],"isOsiApproved":false},{"reference":"./ClArtistic.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ClArtistic.json","referenceNumber":"257","name":"Clarified Artistic License","licenseId":"ClArtistic","seeAlso":["http://gianluca.dellavedova.org/2011/01/03/clarified-artistic-license/","http://www.ncftp.com/ncftp/doc/LICENSE.txt"],"isOsiApproved":false},{"reference":"./Condor-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Condor-1.1.json","referenceNumber":"154","name":"Condor Public License v1.1","licenseId":"Condor-1.1","seeAlso":["http://research.cs.wisc.edu/condor/license.html#condor","http://web.archive.org/web/20111123062036/http://research.cs.wisc.edu/condor/license.html#condor"],"isOsiApproved":false},{"reference":"./Crossword.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Crossword.json","referenceNumber":"105","name":"Crossword License","licenseId":"Crossword","seeAlso":["https://fedoraproject.org/wiki/Licensing/Crossword"],"isOsiApproved":false},{"reference":"./CrystalStacker.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/CrystalStacker.json","referenceNumber":"40","name":"CrystalStacker License","licenseId":"CrystalStacker","seeAlso":["https://fedoraproject.org/wiki/Licensing:CrystalStacker?rd=Licensing/CrystalStacker"],"isOsiApproved":false},{"reference":"./Cube.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Cube.json","referenceNumber":"410","name":"Cube License","licenseId":"Cube","seeAlso":["https://fedoraproject.org/wiki/Licensing/Cube"],"isOsiApproved":false},{"reference":"./D-FSL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/D-FSL-1.0.json","referenceNumber":"376","name":"Deutsche Freie Software Lizenz","licenseId":"D-FSL-1.0","seeAlso":["http://www.dipp.nrw.de/d-fsl/lizenzen/","http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/de/D-FSL-1_0_de.txt","http://www.dipp.nrw.de/d-fsl/index_html/lizenzen/en/D-FSL-1_0_en.txt","https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl","https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/deutsche-freie-software-lizenz","https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/german-free-software-license","https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_de.txt/at_download/file","https://www.hbz-nrw.de/produkte/open-access/lizenzen/dfsl/D-FSL-1_0_en.txt/at_download/file"],"isOsiApproved":false},{"reference":"./DOC.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/DOC.json","referenceNumber":"287","name":"DOC License","licenseId":"DOC","seeAlso":["http://www.cs.wustl.edu/~schmidt/ACE-copying.html"],"isOsiApproved":false},{"reference":"./DSDP.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/DSDP.json","referenceNumber":"278","name":"DSDP License","licenseId":"DSDP","seeAlso":["https://fedoraproject.org/wiki/Licensing/DSDP"],"isOsiApproved":false},{"reference":"./Dotseqn.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Dotseqn.json","referenceNumber":"34","name":"Dotseqn License","licenseId":"Dotseqn","seeAlso":["https://fedoraproject.org/wiki/Licensing/Dotseqn"],"isOsiApproved":false},{"reference":"./ECL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ECL-1.0.json","referenceNumber":"438","name":"Educational Community License v1.0","licenseId":"ECL-1.0","seeAlso":["https://opensource.org/licenses/ECL-1.0"],"isOsiApproved":true},{"reference":"./ECL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ECL-2.0.json","referenceNumber":"1","name":"Educational Community License v2.0","licenseId":"ECL-2.0","seeAlso":["https://opensource.org/licenses/ECL-2.0"],"isOsiApproved":true},{"reference":"./EFL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/EFL-1.0.json","referenceNumber":"79","name":"Eiffel Forum License v1.0","licenseId":"EFL-1.0","seeAlso":["http://www.eiffel-nice.org/license/forum.txt","https://opensource.org/licenses/EFL-1.0"],"isOsiApproved":true},{"reference":"./EFL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EFL-2.0.json","referenceNumber":"8","name":"Eiffel Forum License v2.0","licenseId":"EFL-2.0","seeAlso":["http://www.eiffel-nice.org/license/eiffel-forum-license-2.html","https://opensource.org/licenses/EFL-2.0"],"isOsiApproved":true},{"reference":"./EPICS.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/EPICS.json","referenceNumber":"377","name":"EPICS Open License","licenseId":"EPICS","seeAlso":["https://epics.anl.gov/license/open.php"],"isOsiApproved":false},{"reference":"./EPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EPL-1.0.json","referenceNumber":"289","name":"Eclipse Public License 1.0","licenseId":"EPL-1.0","seeAlso":["http://www.eclipse.org/legal/epl-v10.html","https://opensource.org/licenses/EPL-1.0"],"isOsiApproved":true},{"reference":"./EPL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EPL-2.0.json","referenceNumber":"436","name":"Eclipse Public License 2.0","licenseId":"EPL-2.0","seeAlso":["https://www.eclipse.org/legal/epl-2.0","https://www.opensource.org/licenses/EPL-2.0"],"isOsiApproved":true},{"reference":"./EUDatagrid.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EUDatagrid.json","referenceNumber":"275","name":"EU DataGrid Software License","licenseId":"EUDatagrid","seeAlso":["http://eu-datagrid.web.cern.ch/eu-datagrid/license.html","https://opensource.org/licenses/EUDatagrid"],"isOsiApproved":true},{"reference":"./EUPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/EUPL-1.0.json","referenceNumber":"102","name":"European Union Public License 1.0","licenseId":"EUPL-1.0","seeAlso":["http://ec.europa.eu/idabc/en/document/7330.html","http://ec.europa.eu/idabc/servlets/Doc027f.pdf?id=31096"],"isOsiApproved":false},{"reference":"./EUPL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EUPL-1.1.json","referenceNumber":"429","name":"European Union Public License 1.1","licenseId":"EUPL-1.1","seeAlso":["https://joinup.ec.europa.eu/software/page/eupl/licence-eupl","https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl1.1.-licence-en_0.pdf","https://opensource.org/licenses/EUPL-1.1"],"isOsiApproved":true},{"reference":"./EUPL-1.2.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/EUPL-1.2.json","referenceNumber":"283","name":"European Union Public License 1.2","licenseId":"EUPL-1.2","seeAlso":["https://joinup.ec.europa.eu/page/eupl-text-11-12","https://joinup.ec.europa.eu/sites/default/files/custom-page/attachment/eupl_v1.2_en.pdf","https://joinup.ec.europa.eu/sites/default/files/inline-files/EUPL%20v1_2%20EN(1).txt","http://eur-lex.europa.eu/legal-content/EN/TXT/HTML/?uri=CELEX:32017D0863","https://opensource.org/licenses/EUPL-1.2"],"isOsiApproved":true},{"reference":"./Entessa.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Entessa.json","referenceNumber":"405","name":"Entessa Public License v1.0","licenseId":"Entessa","seeAlso":["https://opensource.org/licenses/Entessa"],"isOsiApproved":true},{"reference":"./ErlPL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ErlPL-1.1.json","referenceNumber":"427","name":"Erlang Public License v1.1","licenseId":"ErlPL-1.1","seeAlso":["http://www.erlang.org/EPLICENSE"],"isOsiApproved":false},{"reference":"./Eurosym.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Eurosym.json","referenceNumber":"176","name":"Eurosym License","licenseId":"Eurosym","seeAlso":["https://fedoraproject.org/wiki/Licensing/Eurosym"],"isOsiApproved":false},{"reference":"./FSFAP.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/FSFAP.json","referenceNumber":"413","name":"FSF All Permissive License","licenseId":"FSFAP","seeAlso":["https://www.gnu.org/prep/maintain/html_node/License-Notices-for-Other-Files.html"],"isOsiApproved":false},{"reference":"./FSFUL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/FSFUL.json","referenceNumber":"2","name":"FSF Unlimited License","licenseId":"FSFUL","seeAlso":["https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License"],"isOsiApproved":false},{"reference":"./FSFULLR.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/FSFULLR.json","referenceNumber":"325","name":"FSF Unlimited License (with License Retention)","licenseId":"FSFULLR","seeAlso":["https://fedoraproject.org/wiki/Licensing/FSF_Unlimited_License#License_Retention_Variant"],"isOsiApproved":false},{"reference":"./FTL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/FTL.json","referenceNumber":"393","name":"Freetype Project License","licenseId":"FTL","seeAlso":["http://freetype.fis.uniroma2.it/FTL.TXT","http://git.savannah.gnu.org/cgit/freetype/freetype2.git/tree/docs/FTL.TXT"],"isOsiApproved":false},{"reference":"./Fair.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Fair.json","referenceNumber":"274","name":"Fair License","licenseId":"Fair","seeAlso":["http://fairlicense.org/","https://opensource.org/licenses/Fair"],"isOsiApproved":true},{"reference":"./Frameworx-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Frameworx-1.0.json","referenceNumber":"392","name":"Frameworx Open License 1.0","licenseId":"Frameworx-1.0","seeAlso":["https://opensource.org/licenses/Frameworx-1.0"],"isOsiApproved":true},{"reference":"./FreeImage.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/FreeImage.json","referenceNumber":"389","name":"FreeImage Public License v1.0","licenseId":"FreeImage","seeAlso":["http://freeimage.sourceforge.net/freeimage-license.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1.json","referenceNumber":"269","name":"GNU Free Documentation License v1.1","licenseId":"GFDL-1.1","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-invariants-only.json","referenceNumber":"205","name":"GNU Free Documentation License v1.1 only - invariants","licenseId":"GFDL-1.1-invariants-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-invariants-or-later.json","referenceNumber":"85","name":"GNU Free Documentation License v1.1 or later - invariants","licenseId":"GFDL-1.1-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-no-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-no-invariants-only.json","referenceNumber":"7","name":"GNU Free Documentation License v1.1 only - no invariants","licenseId":"GFDL-1.1-no-invariants-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-no-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-no-invariants-or-later.json","referenceNumber":"254","name":"GNU Free Documentation License v1.1 or later - no invariants","licenseId":"GFDL-1.1-no-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-only.json","referenceNumber":"108","name":"GNU Free Documentation License v1.1 only","licenseId":"GFDL-1.1-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.1-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.1-or-later.json","referenceNumber":"128","name":"GNU Free Documentation License v1.1 or later","licenseId":"GFDL-1.1-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.1.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2.json","referenceNumber":"206","name":"GNU Free Documentation License v1.2","licenseId":"GFDL-1.2","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-invariants-only.json","referenceNumber":"208","name":"GNU Free Documentation License v1.2 only - invariants","licenseId":"GFDL-1.2-invariants-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-invariants-or-later.json","referenceNumber":"428","name":"GNU Free Documentation License v1.2 or later - invariants","licenseId":"GFDL-1.2-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-no-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-no-invariants-only.json","referenceNumber":"324","name":"GNU Free Documentation License v1.2 only - no invariants","licenseId":"GFDL-1.2-no-invariants-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-no-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-no-invariants-or-later.json","referenceNumber":"195","name":"GNU Free Documentation License v1.2 or later - no invariants","licenseId":"GFDL-1.2-no-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-only.json","referenceNumber":"94","name":"GNU Free Documentation License v1.2 only","licenseId":"GFDL-1.2-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.2-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.2-or-later.json","referenceNumber":"136","name":"GNU Free Documentation License v1.2 or later","licenseId":"GFDL-1.2-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/fdl-1.2.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3.json","referenceNumber":"384","name":"GNU Free Documentation License v1.3","licenseId":"GFDL-1.3","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-invariants-only.json","referenceNumber":"187","name":"GNU Free Documentation License v1.3 only - invariants","licenseId":"GFDL-1.3-invariants-only","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-invariants-or-later.json","referenceNumber":"319","name":"GNU Free Documentation License v1.3 or later - invariants","licenseId":"GFDL-1.3-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-no-invariants-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-no-invariants-only.json","referenceNumber":"183","name":"GNU Free Documentation License v1.3 only - no invariants","licenseId":"GFDL-1.3-no-invariants-only","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-no-invariants-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-no-invariants-or-later.json","referenceNumber":"167","name":"GNU Free Documentation License v1.3 or later - no invariants","licenseId":"GFDL-1.3-no-invariants-or-later","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-only.json","referenceNumber":"210","name":"GNU Free Documentation License v1.3 only","licenseId":"GFDL-1.3-only","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GFDL-1.3-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GFDL-1.3-or-later.json","referenceNumber":"56","name":"GNU Free Documentation License v1.3 or later","licenseId":"GFDL-1.3-or-later","seeAlso":["https://www.gnu.org/licenses/fdl-1.3.txt"],"isOsiApproved":false},{"reference":"./GL2PS.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GL2PS.json","referenceNumber":"331","name":"GL2PS License","licenseId":"GL2PS","seeAlso":["http://www.geuz.org/gl2ps/COPYING.GL2PS"],"isOsiApproved":false},{"reference":"./GLWTPL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GLWTPL.json","referenceNumber":"55","name":"Good Luck With That Public License","licenseId":"GLWTPL","seeAlso":["https://github.com/me-shaon/GLWTPL/commit/da5f6bc734095efbacb442c0b31e33a65b9d6e85"],"isOsiApproved":false},{"reference":"./GPL-1.0.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-1.0.json","referenceNumber":"347","name":"GNU General Public License v1.0 only","licenseId":"GPL-1.0","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"],"isOsiApproved":false},{"reference":"./GPL-1.0+.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-1.0+.json","referenceNumber":"215","name":"GNU General Public License v1.0 or later","licenseId":"GPL-1.0+","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"],"isOsiApproved":false},{"reference":"./GPL-1.0-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GPL-1.0-only.json","referenceNumber":"16","name":"GNU General Public License v1.0 only","licenseId":"GPL-1.0-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"],"isOsiApproved":false},{"reference":"./GPL-1.0-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/GPL-1.0-or-later.json","referenceNumber":"138","name":"GNU General Public License v1.0 or later","licenseId":"GPL-1.0-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-1.0-standalone.html"],"isOsiApproved":false},{"reference":"./GPL-2.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0.json","referenceNumber":"374","name":"GNU General Public License v2.0 only","licenseId":"GPL-2.0","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html","https://opensource.org/licenses/GPL-2.0"],"isOsiApproved":true},{"reference":"./GPL-2.0+.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0+.json","referenceNumber":"420","name":"GNU General Public License v2.0 or later","licenseId":"GPL-2.0+","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html","https://opensource.org/licenses/GPL-2.0"],"isOsiApproved":true},{"reference":"./GPL-2.0-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-only.json","referenceNumber":"246","name":"GNU General Public License v2.0 only","licenseId":"GPL-2.0-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html","https://opensource.org/licenses/GPL-2.0"],"isOsiApproved":true},{"reference":"./GPL-2.0-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-or-later.json","referenceNumber":"270","name":"GNU General Public License v2.0 or later","licenseId":"GPL-2.0-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html","https://opensource.org/licenses/GPL-2.0"],"isOsiApproved":true},{"reference":"./GPL-2.0-with-GCC-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-with-GCC-exception.json","referenceNumber":"357","name":"GNU General Public License v2.0 w/GCC Runtime Library exception","licenseId":"GPL-2.0-with-GCC-exception","seeAlso":["https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/libgcc1.c;h=762f5143fc6eed57b6797c82710f3538aa52b40b;hb=cb143a3ce4fb417c68f5fa2691a1b1b1053dfba9#l10"],"isOsiApproved":false},{"reference":"./GPL-2.0-with-autoconf-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-with-autoconf-exception.json","referenceNumber":"37","name":"GNU General Public License v2.0 w/Autoconf exception","licenseId":"GPL-2.0-with-autoconf-exception","seeAlso":["http://ac-archive.sourceforge.net/doc/copyright.html"],"isOsiApproved":false},{"reference":"./GPL-2.0-with-bison-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-with-bison-exception.json","referenceNumber":"390","name":"GNU General Public License v2.0 w/Bison exception","licenseId":"GPL-2.0-with-bison-exception","seeAlso":["http://git.savannah.gnu.org/cgit/bison.git/tree/data/yacc.c?id=193d7c7054ba7197b0789e14965b739162319b5e#n141"],"isOsiApproved":false},{"reference":"./GPL-2.0-with-classpath-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-with-classpath-exception.json","referenceNumber":"238","name":"GNU General Public License v2.0 w/Classpath exception","licenseId":"GPL-2.0-with-classpath-exception","seeAlso":["https://www.gnu.org/software/classpath/license.html"],"isOsiApproved":false},{"reference":"./GPL-2.0-with-font-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-2.0-with-font-exception.json","referenceNumber":"25","name":"GNU General Public License v2.0 w/Font exception","licenseId":"GPL-2.0-with-font-exception","seeAlso":["https://www.gnu.org/licenses/gpl-faq.html#FontException"],"isOsiApproved":false},{"reference":"./GPL-3.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0.json","referenceNumber":"434","name":"GNU General Public License v3.0 only","licenseId":"GPL-3.0","seeAlso":["https://www.gnu.org/licenses/gpl-3.0-standalone.html","https://opensource.org/licenses/GPL-3.0"],"isOsiApproved":true},{"reference":"./GPL-3.0+.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0+.json","referenceNumber":"156","name":"GNU General Public License v3.0 or later","licenseId":"GPL-3.0+","seeAlso":["https://www.gnu.org/licenses/gpl-3.0-standalone.html","https://opensource.org/licenses/GPL-3.0"],"isOsiApproved":true},{"reference":"./GPL-3.0-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0-only.json","referenceNumber":"131","name":"GNU General Public License v3.0 only","licenseId":"GPL-3.0-only","seeAlso":["https://www.gnu.org/licenses/gpl-3.0-standalone.html","https://opensource.org/licenses/GPL-3.0"],"isOsiApproved":true},{"reference":"./GPL-3.0-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0-or-later.json","referenceNumber":"418","name":"GNU General Public License v3.0 or later","licenseId":"GPL-3.0-or-later","seeAlso":["https://www.gnu.org/licenses/gpl-3.0-standalone.html","https://opensource.org/licenses/GPL-3.0"],"isOsiApproved":true},{"reference":"./GPL-3.0-with-GCC-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0-with-GCC-exception.json","referenceNumber":"6","name":"GNU General Public License v3.0 w/GCC Runtime Library exception","licenseId":"GPL-3.0-with-GCC-exception","seeAlso":["https://www.gnu.org/licenses/gcc-exception-3.1.html"],"isOsiApproved":true},{"reference":"./GPL-3.0-with-autoconf-exception.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/GPL-3.0-with-autoconf-exception.json","referenceNumber":"9","name":"GNU General Public License v3.0 w/Autoconf exception","licenseId":"GPL-3.0-with-autoconf-exception","seeAlso":["https://www.gnu.org/licenses/autoconf-exception-3.0.html"],"isOsiApproved":false},{"reference":"./Giftware.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Giftware.json","referenceNumber":"398","name":"Giftware License","licenseId":"Giftware","seeAlso":["http://liballeg.org/license.html#allegro-4-the-giftware-license"],"isOsiApproved":false},{"reference":"./Glide.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Glide.json","referenceNumber":"125","name":"3dfx Glide License","licenseId":"Glide","seeAlso":["http://www.users.on.net/~triforce/glidexp/COPYING.txt"],"isOsiApproved":false},{"reference":"./Glulxe.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Glulxe.json","referenceNumber":"216","name":"Glulxe License","licenseId":"Glulxe","seeAlso":["https://fedoraproject.org/wiki/Licensing/Glulxe"],"isOsiApproved":false},{"reference":"./HPND.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/HPND.json","referenceNumber":"158","name":"Historical Permission Notice and Disclaimer","licenseId":"HPND","seeAlso":["https://opensource.org/licenses/HPND"],"isOsiApproved":true},{"reference":"./HPND-sell-variant.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/HPND-sell-variant.json","referenceNumber":"169","name":"Historical Permission Notice and Disclaimer - sell variant","licenseId":"HPND-sell-variant","seeAlso":["https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/net/sunrpc/auth_gss/gss_generic_token.c?h=v4.19"],"isOsiApproved":false},{"reference":"./HaskellReport.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/HaskellReport.json","referenceNumber":"222","name":"Haskell Language Report License","licenseId":"HaskellReport","seeAlso":["https://fedoraproject.org/wiki/Licensing/Haskell_Language_Report_License"],"isOsiApproved":false},{"reference":"./Hippocratic-2.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Hippocratic-2.1.json","referenceNumber":"192","name":"Hippocratic License 2.1","licenseId":"Hippocratic-2.1","seeAlso":["https://firstdonoharm.dev/version/2/1/license.html","https://github.com/EthicalSource/hippocratic-license/blob/58c0e646d64ff6fbee275bfe2b9492f914e3ab2a/LICENSE.txt"],"isOsiApproved":false},{"reference":"./IBM-pibs.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/IBM-pibs.json","referenceNumber":"252","name":"IBM PowerPC Initialization and Boot Software","licenseId":"IBM-pibs","seeAlso":["http://git.denx.de/?p=u-boot.git;a=blob;f=arch/powerpc/cpu/ppc4xx/miiphy.c;h=297155fdafa064b955e53e9832de93bfb0cfb85b;hb=9fab4bf4cc077c21e43941866f3f2c196f28670d"],"isOsiApproved":false},{"reference":"./ICU.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ICU.json","referenceNumber":"186","name":"ICU License","licenseId":"ICU","seeAlso":["http://source.icu-project.org/repos/icu/icu/trunk/license.html"],"isOsiApproved":false},{"reference":"./IJG.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/IJG.json","referenceNumber":"256","name":"Independent JPEG Group License","licenseId":"IJG","seeAlso":["http://dev.w3.org/cvsweb/Amaya/libjpeg/Attic/README?rev=1.2"],"isOsiApproved":false},{"reference":"./IPA.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/IPA.json","referenceNumber":"338","name":"IPA Font License","licenseId":"IPA","seeAlso":["https://opensource.org/licenses/IPA"],"isOsiApproved":true},{"reference":"./IPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/IPL-1.0.json","referenceNumber":"337","name":"IBM Public License v1.0","licenseId":"IPL-1.0","seeAlso":["https://opensource.org/licenses/IPL-1.0"],"isOsiApproved":true},{"reference":"./ISC.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ISC.json","referenceNumber":"383","name":"ISC License","licenseId":"ISC","seeAlso":["https://www.isc.org/downloads/software-support-policy/isc-license/","https://opensource.org/licenses/ISC"],"isOsiApproved":true},{"reference":"./ImageMagick.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ImageMagick.json","referenceNumber":"354","name":"ImageMagick License","licenseId":"ImageMagick","seeAlso":["http://www.imagemagick.org/script/license.php"],"isOsiApproved":false},{"reference":"./Imlib2.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Imlib2.json","referenceNumber":"144","name":"Imlib2 License","licenseId":"Imlib2","seeAlso":["http://trac.enlightenment.org/e/browser/trunk/imlib2/COPYING","https://git.enlightenment.org/legacy/imlib2.git/tree/COPYING"],"isOsiApproved":false},{"reference":"./Info-ZIP.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Info-ZIP.json","referenceNumber":"308","name":"Info-ZIP License","licenseId":"Info-ZIP","seeAlso":["http://www.info-zip.org/license.html"],"isOsiApproved":false},{"reference":"./Intel.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Intel.json","referenceNumber":"30","name":"Intel Open Source License","licenseId":"Intel","seeAlso":["https://opensource.org/licenses/Intel"],"isOsiApproved":true},{"reference":"./Intel-ACPI.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Intel-ACPI.json","referenceNumber":"255","name":"Intel ACPI Software License Agreement","licenseId":"Intel-ACPI","seeAlso":["https://fedoraproject.org/wiki/Licensing/Intel_ACPI_Software_License_Agreement"],"isOsiApproved":false},{"reference":"./Interbase-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Interbase-1.0.json","referenceNumber":"351","name":"Interbase Public License v1.0","licenseId":"Interbase-1.0","seeAlso":["https://web.archive.org/web/20060319014854/http://info.borland.com/devsupport/interbase/opensource/IPL.html"],"isOsiApproved":false},{"reference":"./JPNIC.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/JPNIC.json","referenceNumber":"344","name":"Japan Network Information Center License","licenseId":"JPNIC","seeAlso":["https://gitlab.isc.org/isc-projects/bind9/blob/master/COPYRIGHT#L366"],"isOsiApproved":false},{"reference":"./JSON.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/JSON.json","referenceNumber":"214","name":"JSON License","licenseId":"JSON","seeAlso":["http://www.json.org/license.html"],"isOsiApproved":false},{"reference":"./JasPer-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/JasPer-2.0.json","referenceNumber":"84","name":"JasPer License","licenseId":"JasPer-2.0","seeAlso":["http://www.ece.uvic.ca/~mdadams/jasper/LICENSE"],"isOsiApproved":false},{"reference":"./LAL-1.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LAL-1.2.json","referenceNumber":"163","name":"Licence Art Libre 1.2","licenseId":"LAL-1.2","seeAlso":["http://artlibre.org/licence/lal/licence-art-libre-12/"],"isOsiApproved":false},{"reference":"./LAL-1.3.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LAL-1.3.json","referenceNumber":"387","name":"Licence Art Libre 1.3","licenseId":"LAL-1.3","seeAlso":["https://artlibre.org/"],"isOsiApproved":false},{"reference":"./LGPL-2.0.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.0.json","referenceNumber":"299","name":"GNU Library General Public License v2 only","licenseId":"LGPL-2.0","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"],"isOsiApproved":true},{"reference":"./LGPL-2.0+.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.0+.json","referenceNumber":"148","name":"GNU Library General Public License v2 or later","licenseId":"LGPL-2.0+","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"],"isOsiApproved":true},{"reference":"./LGPL-2.0-only.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LGPL-2.0-only.json","referenceNumber":"356","name":"GNU Library General Public License v2 only","licenseId":"LGPL-2.0-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"],"isOsiApproved":true},{"reference":"./LGPL-2.0-or-later.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LGPL-2.0-or-later.json","referenceNumber":"36","name":"GNU Library General Public License v2 or later","licenseId":"LGPL-2.0-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.0-standalone.html"],"isOsiApproved":true},{"reference":"./LGPL-2.1.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.1.json","referenceNumber":"197","name":"GNU Lesser General Public License v2.1 only","licenseId":"LGPL-2.1","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html","https://opensource.org/licenses/LGPL-2.1"],"isOsiApproved":true},{"reference":"./LGPL-2.1+.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.1+.json","referenceNumber":"219","name":"GNU Library General Public License v2.1 or later","licenseId":"LGPL-2.1+","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html","https://opensource.org/licenses/LGPL-2.1"],"isOsiApproved":true},{"reference":"./LGPL-2.1-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.1-only.json","referenceNumber":"147","name":"GNU Lesser General Public License v2.1 only","licenseId":"LGPL-2.1-only","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html","https://opensource.org/licenses/LGPL-2.1"],"isOsiApproved":true},{"reference":"./LGPL-2.1-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-2.1-or-later.json","referenceNumber":"292","name":"GNU Lesser General Public License v2.1 or later","licenseId":"LGPL-2.1-or-later","seeAlso":["https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html","https://opensource.org/licenses/LGPL-2.1"],"isOsiApproved":true},{"reference":"./LGPL-3.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-3.0.json","referenceNumber":"226","name":"GNU Lesser General Public License v3.0 only","licenseId":"LGPL-3.0","seeAlso":["https://www.gnu.org/licenses/lgpl-3.0-standalone.html","https://opensource.org/licenses/LGPL-3.0"],"isOsiApproved":true},{"reference":"./LGPL-3.0+.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-3.0+.json","referenceNumber":"239","name":"GNU Lesser General Public License v3.0 or later","licenseId":"LGPL-3.0+","seeAlso":["https://www.gnu.org/licenses/lgpl-3.0-standalone.html","https://opensource.org/licenses/LGPL-3.0"],"isOsiApproved":true},{"reference":"./LGPL-3.0-only.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-3.0-only.json","referenceNumber":"51","name":"GNU Lesser General Public License v3.0 only","licenseId":"LGPL-3.0-only","seeAlso":["https://www.gnu.org/licenses/lgpl-3.0-standalone.html","https://opensource.org/licenses/LGPL-3.0"],"isOsiApproved":true},{"reference":"./LGPL-3.0-or-later.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LGPL-3.0-or-later.json","referenceNumber":"345","name":"GNU Lesser General Public License v3.0 or later","licenseId":"LGPL-3.0-or-later","seeAlso":["https://www.gnu.org/licenses/lgpl-3.0-standalone.html","https://opensource.org/licenses/LGPL-3.0"],"isOsiApproved":true},{"reference":"./LGPLLR.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LGPLLR.json","referenceNumber":"437","name":"Lesser General Public License For Linguistic Resources","licenseId":"LGPLLR","seeAlso":["http://www-igm.univ-mlv.fr/~unitex/lgpllr.html"],"isOsiApproved":false},{"reference":"./LPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LPL-1.0.json","referenceNumber":"402","name":"Lucent Public License Version 1.0","licenseId":"LPL-1.0","seeAlso":["https://opensource.org/licenses/LPL-1.0"],"isOsiApproved":true},{"reference":"./LPL-1.02.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LPL-1.02.json","referenceNumber":"129","name":"Lucent Public License v1.02","licenseId":"LPL-1.02","seeAlso":["http://plan9.bell-labs.com/plan9/license.html","https://opensource.org/licenses/LPL-1.02"],"isOsiApproved":true},{"reference":"./LPPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LPPL-1.0.json","referenceNumber":"90","name":"LaTeX Project Public License v1.0","licenseId":"LPPL-1.0","seeAlso":["http://www.latex-project.org/lppl/lppl-1-0.txt"],"isOsiApproved":false},{"reference":"./LPPL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LPPL-1.1.json","referenceNumber":"179","name":"LaTeX Project Public License v1.1","licenseId":"LPPL-1.1","seeAlso":["http://www.latex-project.org/lppl/lppl-1-1.txt"],"isOsiApproved":false},{"reference":"./LPPL-1.2.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LPPL-1.2.json","referenceNumber":"171","name":"LaTeX Project Public License v1.2","licenseId":"LPPL-1.2","seeAlso":["http://www.latex-project.org/lppl/lppl-1-2.txt"],"isOsiApproved":false},{"reference":"./LPPL-1.3a.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/LPPL-1.3a.json","referenceNumber":"293","name":"LaTeX Project Public License v1.3a","licenseId":"LPPL-1.3a","seeAlso":["http://www.latex-project.org/lppl/lppl-1-3a.txt"],"isOsiApproved":false},{"reference":"./LPPL-1.3c.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LPPL-1.3c.json","referenceNumber":"135","name":"LaTeX Project Public License v1.3c","licenseId":"LPPL-1.3c","seeAlso":["http://www.latex-project.org/lppl/lppl-1-3c.txt","https://opensource.org/licenses/LPPL-1.3c"],"isOsiApproved":true},{"reference":"./Latex2e.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Latex2e.json","referenceNumber":"38","name":"Latex2e License","licenseId":"Latex2e","seeAlso":["https://fedoraproject.org/wiki/Licensing/Latex2e"],"isOsiApproved":false},{"reference":"./Leptonica.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Leptonica.json","referenceNumber":"328","name":"Leptonica License","licenseId":"Leptonica","seeAlso":["https://fedoraproject.org/wiki/Licensing/Leptonica"],"isOsiApproved":false},{"reference":"./LiLiQ-P-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LiLiQ-P-1.1.json","referenceNumber":"87","name":"Licence Libre du Québec – Permissive version 1.1","licenseId":"LiLiQ-P-1.1","seeAlso":["https://forge.gouv.qc.ca/licence/fr/liliq-v1-1/","http://opensource.org/licenses/LiLiQ-P-1.1"],"isOsiApproved":true},{"reference":"./LiLiQ-R-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LiLiQ-R-1.1.json","referenceNumber":"315","name":"Licence Libre du Québec – Réciprocité version 1.1","licenseId":"LiLiQ-R-1.1","seeAlso":["https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-liliq-r-v1-1/","http://opensource.org/licenses/LiLiQ-R-1.1"],"isOsiApproved":true},{"reference":"./LiLiQ-Rplus-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/LiLiQ-Rplus-1.1.json","referenceNumber":"363","name":"Licence Libre du Québec – Réciprocité forte version 1.1","licenseId":"LiLiQ-Rplus-1.1","seeAlso":["https://www.forge.gouv.qc.ca/participez/licence-logicielle/licence-libre-du-quebec-liliq-en-francais/licence-libre-du-quebec-reciprocite-forte-liliq-r-v1-1/","http://opensource.org/licenses/LiLiQ-Rplus-1.1"],"isOsiApproved":true},{"reference":"./Libpng.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Libpng.json","referenceNumber":"407","name":"libpng License","licenseId":"Libpng","seeAlso":["http://www.libpng.org/pub/png/src/libpng-LICENSE.txt"],"isOsiApproved":false},{"reference":"./Linux-OpenIB.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Linux-OpenIB.json","referenceNumber":"234","name":"Linux Kernel Variant of OpenIB.org license","licenseId":"Linux-OpenIB","seeAlso":["https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/infiniband/core/sa.h"],"isOsiApproved":false},{"reference":"./MIT.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/MIT.json","referenceNumber":"277","name":"MIT License","licenseId":"MIT","seeAlso":["https://opensource.org/licenses/MIT"],"isOsiApproved":true},{"reference":"./MIT-0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MIT-0.json","referenceNumber":"82","name":"MIT No Attribution","licenseId":"MIT-0","seeAlso":["https://github.com/aws/mit-0","https://romanrm.net/mit-zero","https://github.com/awsdocs/aws-cloud9-user-guide/blob/master/LICENSE-SAMPLECODE"],"isOsiApproved":false},{"reference":"./MIT-CMU.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MIT-CMU.json","referenceNumber":"373","name":"CMU License","licenseId":"MIT-CMU","seeAlso":["https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT#CMU_Style","https://github.com/python-pillow/Pillow/blob/fffb426092c8db24a5f4b6df243a8a3c01fb63cd/LICENSE"],"isOsiApproved":false},{"reference":"./MIT-advertising.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MIT-advertising.json","referenceNumber":"209","name":"Enlightenment License (e16)","licenseId":"MIT-advertising","seeAlso":["https://fedoraproject.org/wiki/Licensing/MIT_With_Advertising"],"isOsiApproved":false},{"reference":"./MIT-enna.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MIT-enna.json","referenceNumber":"57","name":"enna License","licenseId":"MIT-enna","seeAlso":["https://fedoraproject.org/wiki/Licensing/MIT#enna"],"isOsiApproved":false},{"reference":"./MIT-feh.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MIT-feh.json","referenceNumber":"395","name":"feh License","licenseId":"MIT-feh","seeAlso":["https://fedoraproject.org/wiki/Licensing/MIT#feh"],"isOsiApproved":false},{"reference":"./MITNFA.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MITNFA.json","referenceNumber":"364","name":"MIT +no-false-attribs license","licenseId":"MITNFA","seeAlso":["https://fedoraproject.org/wiki/Licensing/MITNFA"],"isOsiApproved":false},{"reference":"./MPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MPL-1.0.json","referenceNumber":"259","name":"Mozilla Public License 1.0","licenseId":"MPL-1.0","seeAlso":["http://www.mozilla.org/MPL/MPL-1.0.html","https://opensource.org/licenses/MPL-1.0"],"isOsiApproved":true},{"reference":"./MPL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/MPL-1.1.json","referenceNumber":"426","name":"Mozilla Public License 1.1","licenseId":"MPL-1.1","seeAlso":["http://www.mozilla.org/MPL/MPL-1.1.html","https://opensource.org/licenses/MPL-1.1"],"isOsiApproved":true},{"reference":"./MPL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/MPL-2.0.json","referenceNumber":"130","name":"Mozilla Public License 2.0","licenseId":"MPL-2.0","seeAlso":["http://www.mozilla.org/MPL/2.0/","https://opensource.org/licenses/MPL-2.0"],"isOsiApproved":true},{"reference":"./MPL-2.0-no-copyleft-exception.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MPL-2.0-no-copyleft-exception.json","referenceNumber":"198","name":"Mozilla Public License 2.0 (no copyleft exception)","licenseId":"MPL-2.0-no-copyleft-exception","seeAlso":["http://www.mozilla.org/MPL/2.0/","https://opensource.org/licenses/MPL-2.0"],"isOsiApproved":true},{"reference":"./MS-PL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/MS-PL.json","referenceNumber":"396","name":"Microsoft Public License","licenseId":"MS-PL","seeAlso":["http://www.microsoft.com/opensource/licenses.mspx","https://opensource.org/licenses/MS-PL"],"isOsiApproved":true},{"reference":"./MS-RL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/MS-RL.json","referenceNumber":"4","name":"Microsoft Reciprocal License","licenseId":"MS-RL","seeAlso":["http://www.microsoft.com/opensource/licenses.mspx","https://opensource.org/licenses/MS-RL"],"isOsiApproved":true},{"reference":"./MTLL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MTLL.json","referenceNumber":"110","name":"Matrix Template Library License","licenseId":"MTLL","seeAlso":["https://fedoraproject.org/wiki/Licensing/Matrix_Template_Library_License"],"isOsiApproved":false},{"reference":"./MakeIndex.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MakeIndex.json","referenceNumber":"372","name":"MakeIndex License","licenseId":"MakeIndex","seeAlso":["https://fedoraproject.org/wiki/Licensing/MakeIndex"],"isOsiApproved":false},{"reference":"./MirOS.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MirOS.json","referenceNumber":"400","name":"The MirOS Licence","licenseId":"MirOS","seeAlso":["https://opensource.org/licenses/MirOS"],"isOsiApproved":true},{"reference":"./Motosoto.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Motosoto.json","referenceNumber":"13","name":"Motosoto License","licenseId":"Motosoto","seeAlso":["https://opensource.org/licenses/Motosoto"],"isOsiApproved":true},{"reference":"./MulanPSL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MulanPSL-1.0.json","referenceNumber":"218","name":"Mulan Permissive Software License, Version 1","licenseId":"MulanPSL-1.0","seeAlso":["https://license.coscl.org.cn/MulanPSL/","https://github.com/yuwenlong/longphp/blob/25dfb70cc2a466dc4bb55ba30901cbce08d164b5/LICENSE"],"isOsiApproved":false},{"reference":"./MulanPSL-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/MulanPSL-2.0.json","referenceNumber":"157","name":"Mulan Permissive Software License, Version 2","licenseId":"MulanPSL-2.0","seeAlso":["https://license.coscl.org.cn/MulanPSL2/"],"isOsiApproved":true},{"reference":"./Multics.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Multics.json","referenceNumber":"175","name":"Multics License","licenseId":"Multics","seeAlso":["https://opensource.org/licenses/Multics"],"isOsiApproved":true},{"reference":"./Mup.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Mup.json","referenceNumber":"333","name":"Mup License","licenseId":"Mup","seeAlso":["https://fedoraproject.org/wiki/Licensing/Mup"],"isOsiApproved":false},{"reference":"./NASA-1.3.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NASA-1.3.json","referenceNumber":"118","name":"NASA Open Source Agreement 1.3","licenseId":"NASA-1.3","seeAlso":["http://ti.arc.nasa.gov/opensource/nosa/","https://opensource.org/licenses/NASA-1.3"],"isOsiApproved":true},{"reference":"./NBPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NBPL-1.0.json","referenceNumber":"18","name":"Net Boolean Public License v1","licenseId":"NBPL-1.0","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=37b4b3f6cc4bf34e1d3dec61e69914b9819d8894"],"isOsiApproved":false},{"reference":"./NCGL-UK-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NCGL-UK-2.0.json","referenceNumber":"235","name":"Non-Commercial Government Licence","licenseId":"NCGL-UK-2.0","seeAlso":["https://github.com/spdx/license-list-XML/blob/master/src/Apache-2.0.xml"],"isOsiApproved":false},{"reference":"./NCSA.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/NCSA.json","referenceNumber":"202","name":"University of Illinois/NCSA Open Source License","licenseId":"NCSA","seeAlso":["http://otm.illinois.edu/uiuc_openSource","https://opensource.org/licenses/NCSA"],"isOsiApproved":true},{"reference":"./NGPL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NGPL.json","referenceNumber":"336","name":"Nethack General Public License","licenseId":"NGPL","seeAlso":["https://opensource.org/licenses/NGPL"],"isOsiApproved":true},{"reference":"./NIST-PD.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NIST-PD.json","referenceNumber":"320","name":"NIST Public Domain Notice","licenseId":"NIST-PD","seeAlso":["https://github.com/tcheneau/simpleRPL/blob/e645e69e38dd4e3ccfeceb2db8cba05b7c2e0cd3/LICENSE.txt","https://github.com/tcheneau/Routing/blob/f09f46fcfe636107f22f2c98348188a65a135d98/README.md"],"isOsiApproved":false},{"reference":"./NIST-PD-fallback.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NIST-PD-fallback.json","referenceNumber":"39","name":"NIST Public Domain Notice with license fallback","licenseId":"NIST-PD-fallback","seeAlso":["https://github.com/usnistgov/jsip/blob/59700e6926cbe96c5cdae897d9a7d2656b42abe3/LICENSE","https://github.com/usnistgov/fipy/blob/86aaa5c2ba2c6f1be19593c5986071cf6568cc34/LICENSE.rst"],"isOsiApproved":false},{"reference":"./NLOD-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NLOD-1.0.json","referenceNumber":"143","name":"Norwegian Licence for Open Government Data","licenseId":"NLOD-1.0","seeAlso":["http://data.norge.no/nlod/en/1.0"],"isOsiApproved":false},{"reference":"./NLPL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NLPL.json","referenceNumber":"334","name":"No Limit Public License","licenseId":"NLPL","seeAlso":["https://fedoraproject.org/wiki/Licensing/NLPL"],"isOsiApproved":false},{"reference":"./NOSL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/NOSL.json","referenceNumber":"411","name":"Netizen Open Source License","licenseId":"NOSL","seeAlso":["http://bits.netizen.com.au/licenses/NOSL/nosl.txt"],"isOsiApproved":false},{"reference":"./NPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/NPL-1.0.json","referenceNumber":"265","name":"Netscape Public License v1.0","licenseId":"NPL-1.0","seeAlso":["http://www.mozilla.org/MPL/NPL/1.0/"],"isOsiApproved":false},{"reference":"./NPL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/NPL-1.1.json","referenceNumber":"442","name":"Netscape Public License v1.1","licenseId":"NPL-1.1","seeAlso":["http://www.mozilla.org/MPL/NPL/1.1/"],"isOsiApproved":false},{"reference":"./NPOSL-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NPOSL-3.0.json","referenceNumber":"160","name":"Non-Profit Open Software License 3.0","licenseId":"NPOSL-3.0","seeAlso":["https://opensource.org/licenses/NOSL3.0"],"isOsiApproved":true},{"reference":"./NRL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NRL.json","referenceNumber":"109","name":"NRL License","licenseId":"NRL","seeAlso":["http://web.mit.edu/network/isakmp/nrllicense.html"],"isOsiApproved":false},{"reference":"./NTP.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NTP.json","referenceNumber":"280","name":"NTP License","licenseId":"NTP","seeAlso":["https://opensource.org/licenses/NTP"],"isOsiApproved":true},{"reference":"./NTP-0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NTP-0.json","referenceNumber":"200","name":"NTP No Attribution","licenseId":"NTP-0","seeAlso":["https://github.com/tytso/e2fsprogs/blob/master/lib/et/et_name.c"],"isOsiApproved":false},{"reference":"./Naumen.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Naumen.json","referenceNumber":"307","name":"Naumen Public License","licenseId":"Naumen","seeAlso":["https://opensource.org/licenses/Naumen"],"isOsiApproved":true},{"reference":"./Net-SNMP.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Net-SNMP.json","referenceNumber":"301","name":"Net-SNMP License","licenseId":"Net-SNMP","seeAlso":["http://net-snmp.sourceforge.net/about/license.html"],"isOsiApproved":false},{"reference":"./NetCDF.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/NetCDF.json","referenceNumber":"229","name":"NetCDF license","licenseId":"NetCDF","seeAlso":["http://www.unidata.ucar.edu/software/netcdf/copyright.html"],"isOsiApproved":false},{"reference":"./Newsletr.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Newsletr.json","referenceNumber":"388","name":"Newsletr License","licenseId":"Newsletr","seeAlso":["https://fedoraproject.org/wiki/Licensing/Newsletr"],"isOsiApproved":false},{"reference":"./Nokia.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Nokia.json","referenceNumber":"134","name":"Nokia Open Source License","licenseId":"Nokia","seeAlso":["https://opensource.org/licenses/nokia"],"isOsiApproved":true},{"reference":"./Noweb.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Noweb.json","referenceNumber":"76","name":"Noweb License","licenseId":"Noweb","seeAlso":["https://fedoraproject.org/wiki/Licensing/Noweb"],"isOsiApproved":false},{"reference":"./Nunit.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Nunit.json","referenceNumber":"95","name":"Nunit License","licenseId":"Nunit","seeAlso":["https://fedoraproject.org/wiki/Licensing/Nunit"],"isOsiApproved":false},{"reference":"./O-UDA-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/O-UDA-1.0.json","referenceNumber":"50","name":"Open Use of Data Agreement v1.0","licenseId":"O-UDA-1.0","seeAlso":["https://github.com/microsoft/Open-Use-of-Data-Agreement/blob/v1.0/O-UDA-1.0.md"],"isOsiApproved":false},{"reference":"./OCCT-PL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OCCT-PL.json","referenceNumber":"71","name":"Open CASCADE Technology Public License","licenseId":"OCCT-PL","seeAlso":["http://www.opencascade.com/content/occt-public-license"],"isOsiApproved":false},{"reference":"./OCLC-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OCLC-2.0.json","referenceNumber":"370","name":"OCLC Research Public License 2.0","licenseId":"OCLC-2.0","seeAlso":["http://www.oclc.org/research/activities/software/license/v2final.htm","https://opensource.org/licenses/OCLC-2.0"],"isOsiApproved":true},{"reference":"./ODC-By-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ODC-By-1.0.json","referenceNumber":"412","name":"Open Data Commons Attribution License v1.0","licenseId":"ODC-By-1.0","seeAlso":["https://opendatacommons.org/licenses/by/1.0/"],"isOsiApproved":false},{"reference":"./ODbL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ODbL-1.0.json","referenceNumber":"369","name":"ODC Open Database License v1.0","licenseId":"ODbL-1.0","seeAlso":["http://www.opendatacommons.org/licenses/odbl/1.0/"],"isOsiApproved":false},{"reference":"./OFL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OFL-1.0.json","referenceNumber":"88","name":"SIL Open Font License 1.0","licenseId":"OFL-1.0","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"],"isOsiApproved":false},{"reference":"./OFL-1.0-RFN.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OFL-1.0-RFN.json","referenceNumber":"326","name":"SIL Open Font License 1.0 with Reserved Font Name","licenseId":"OFL-1.0-RFN","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"],"isOsiApproved":false},{"reference":"./OFL-1.0-no-RFN.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OFL-1.0-no-RFN.json","referenceNumber":"77","name":"SIL Open Font License 1.0 with no Reserved Font Name","licenseId":"OFL-1.0-no-RFN","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL10_web"],"isOsiApproved":false},{"reference":"./OFL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OFL-1.1.json","referenceNumber":"339","name":"SIL Open Font License 1.1","licenseId":"OFL-1.1","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web","https://opensource.org/licenses/OFL-1.1"],"isOsiApproved":true},{"reference":"./OFL-1.1-RFN.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OFL-1.1-RFN.json","referenceNumber":"45","name":"SIL Open Font License 1.1 with Reserved Font Name","licenseId":"OFL-1.1-RFN","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web","https://opensource.org/licenses/OFL-1.1"],"isOsiApproved":true},{"reference":"./OFL-1.1-no-RFN.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OFL-1.1-no-RFN.json","referenceNumber":"258","name":"SIL Open Font License 1.1 with no Reserved Font Name","licenseId":"OFL-1.1-no-RFN","seeAlso":["http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web","https://opensource.org/licenses/OFL-1.1"],"isOsiApproved":true},{"reference":"./OGC-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGC-1.0.json","referenceNumber":"397","name":"OGC Software License, Version 1.0","licenseId":"OGC-1.0","seeAlso":["https://www.ogc.org/ogc/software/1.0"],"isOsiApproved":false},{"reference":"./OGL-Canada-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGL-Canada-2.0.json","referenceNumber":"375","name":"Open Government Licence - Canada","licenseId":"OGL-Canada-2.0","seeAlso":["https://open.canada.ca/en/open-government-licence-canada"],"isOsiApproved":false},{"reference":"./OGL-UK-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGL-UK-1.0.json","referenceNumber":"378","name":"Open Government Licence v1.0","licenseId":"OGL-UK-1.0","seeAlso":["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/1/"],"isOsiApproved":false},{"reference":"./OGL-UK-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGL-UK-2.0.json","referenceNumber":"14","name":"Open Government Licence v2.0","licenseId":"OGL-UK-2.0","seeAlso":["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/2/"],"isOsiApproved":false},{"reference":"./OGL-UK-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGL-UK-3.0.json","referenceNumber":"22","name":"Open Government Licence v3.0","licenseId":"OGL-UK-3.0","seeAlso":["http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/"],"isOsiApproved":false},{"reference":"./OGTSL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OGTSL.json","referenceNumber":"27","name":"Open Group Test Suite License","licenseId":"OGTSL","seeAlso":["http://www.opengroup.org/testing/downloads/The_Open_Group_TSL.txt","https://opensource.org/licenses/OGTSL"],"isOsiApproved":true},{"reference":"./OLDAP-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-1.1.json","referenceNumber":"60","name":"Open LDAP Public License v1.1","licenseId":"OLDAP-1.1","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=806557a5ad59804ef3a44d5abfbe91d706b0791f"],"isOsiApproved":false},{"reference":"./OLDAP-1.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-1.2.json","referenceNumber":"52","name":"Open LDAP Public License v1.2","licenseId":"OLDAP-1.2","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=42b0383c50c299977b5893ee695cf4e486fb0dc7"],"isOsiApproved":false},{"reference":"./OLDAP-1.3.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-1.3.json","referenceNumber":"44","name":"Open LDAP Public License v1.3","licenseId":"OLDAP-1.3","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=e5f8117f0ce088d0bd7a8e18ddf37eaa40eb09b1"],"isOsiApproved":false},{"reference":"./OLDAP-1.4.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-1.4.json","referenceNumber":"54","name":"Open LDAP Public License v1.4","licenseId":"OLDAP-1.4","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=c9f95c2f3f2ffb5e0ae55fe7388af75547660941"],"isOsiApproved":false},{"reference":"./OLDAP-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.0.json","referenceNumber":"26","name":"Open LDAP Public License v2.0 (or possibly 2.0A and 2.0B)","licenseId":"OLDAP-2.0","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cbf50f4e1185a21abd4c0a54d3f4341fe28f36ea"],"isOsiApproved":false},{"reference":"./OLDAP-2.0.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.0.1.json","referenceNumber":"303","name":"Open LDAP Public License v2.0.1","licenseId":"OLDAP-2.0.1","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b6d68acd14e51ca3aab4428bf26522aa74873f0e"],"isOsiApproved":false},{"reference":"./OLDAP-2.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.1.json","referenceNumber":"433","name":"Open LDAP Public License v2.1","licenseId":"OLDAP-2.1","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=b0d176738e96a0d3b9f85cb51e140a86f21be715"],"isOsiApproved":false},{"reference":"./OLDAP-2.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.2.json","referenceNumber":"346","name":"Open LDAP Public License v2.2","licenseId":"OLDAP-2.2","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=470b0c18ec67621c85881b2733057fecf4a1acc3"],"isOsiApproved":false},{"reference":"./OLDAP-2.2.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.2.1.json","referenceNumber":"415","name":"Open LDAP Public License v2.2.1","licenseId":"OLDAP-2.2.1","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=4bc786f34b50aa301be6f5600f58a980070f481e"],"isOsiApproved":false},{"reference":"./OLDAP-2.2.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.2.2.json","referenceNumber":"181","name":"Open LDAP Public License 2.2.2","licenseId":"OLDAP-2.2.2","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=df2cc1e21eb7c160695f5b7cffd6296c151ba188"],"isOsiApproved":false},{"reference":"./OLDAP-2.3.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.3.json","referenceNumber":"249","name":"Open LDAP Public License v2.3","licenseId":"OLDAP-2.3","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=d32cf54a32d581ab475d23c810b0a7fbaf8d63c3"],"isOsiApproved":false},{"reference":"./OLDAP-2.4.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.4.json","referenceNumber":"123","name":"Open LDAP Public License v2.4","licenseId":"OLDAP-2.4","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=cd1284c4a91a8a380d904eee68d1583f989ed386"],"isOsiApproved":false},{"reference":"./OLDAP-2.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.5.json","referenceNumber":"116","name":"Open LDAP Public License v2.5","licenseId":"OLDAP-2.5","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=6852b9d90022e8593c98205413380536b1b5a7cf"],"isOsiApproved":false},{"reference":"./OLDAP-2.6.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.6.json","referenceNumber":"117","name":"Open LDAP Public License v2.6","licenseId":"OLDAP-2.6","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=1cae062821881f41b73012ba816434897abf4205"],"isOsiApproved":false},{"reference":"./OLDAP-2.7.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.7.json","referenceNumber":"248","name":"Open LDAP Public License v2.7","licenseId":"OLDAP-2.7","seeAlso":["http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=LICENSE;hb=47c2415c1df81556eeb39be6cad458ef87c534a2"],"isOsiApproved":false},{"reference":"./OLDAP-2.8.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OLDAP-2.8.json","referenceNumber":"273","name":"Open LDAP Public License v2.8","licenseId":"OLDAP-2.8","seeAlso":["http://www.openldap.org/software/release/license.html"],"isOsiApproved":false},{"reference":"./OML.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OML.json","referenceNumber":"182","name":"Open Market License","licenseId":"OML","seeAlso":["https://fedoraproject.org/wiki/Licensing/Open_Market_License"],"isOsiApproved":false},{"reference":"./OPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OPL-1.0.json","referenceNumber":"367","name":"Open Public License v1.0","licenseId":"OPL-1.0","seeAlso":["http://old.koalateam.com/jackaroo/OPL_1_0.TXT","https://fedoraproject.org/wiki/Licensing/Open_Public_License"],"isOsiApproved":false},{"reference":"./OSET-PL-2.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/OSET-PL-2.1.json","referenceNumber":"220","name":"OSET Public License version 2.1","licenseId":"OSET-PL-2.1","seeAlso":["http://www.osetfoundation.org/public-license","https://opensource.org/licenses/OPL-2.1"],"isOsiApproved":true},{"reference":"./OSL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OSL-1.0.json","referenceNumber":"103","name":"Open Software License 1.0","licenseId":"OSL-1.0","seeAlso":["https://opensource.org/licenses/OSL-1.0"],"isOsiApproved":true},{"reference":"./OSL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OSL-1.1.json","referenceNumber":"191","name":"Open Software License 1.1","licenseId":"OSL-1.1","seeAlso":["https://fedoraproject.org/wiki/Licensing/OSL1.1"],"isOsiApproved":false},{"reference":"./OSL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OSL-2.0.json","referenceNumber":"394","name":"Open Software License 2.0","licenseId":"OSL-2.0","seeAlso":["http://web.archive.org/web/20041020171434/http://www.rosenlaw.com/osl2.0.html"],"isOsiApproved":true},{"reference":"./OSL-2.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OSL-2.1.json","referenceNumber":"168","name":"Open Software License 2.1","licenseId":"OSL-2.1","seeAlso":["http://web.archive.org/web/20050212003940/http://www.rosenlaw.com/osl21.htm","https://opensource.org/licenses/OSL-2.1"],"isOsiApproved":true},{"reference":"./OSL-3.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OSL-3.0.json","referenceNumber":"159","name":"Open Software License 3.0","licenseId":"OSL-3.0","seeAlso":["https://web.archive.org/web/20120101081418/http://rosenlaw.com:80/OSL3.0.htm","https://opensource.org/licenses/OSL-3.0"],"isOsiApproved":true},{"reference":"./OpenSSL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/OpenSSL.json","referenceNumber":"91","name":"OpenSSL License","licenseId":"OpenSSL","seeAlso":["http://www.openssl.org/source/license.html"],"isOsiApproved":false},{"reference":"./PDDL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PDDL-1.0.json","referenceNumber":"141","name":"ODC Public Domain Dedication \u0026 License 1.0","licenseId":"PDDL-1.0","seeAlso":["http://opendatacommons.org/licenses/pddl/1.0/"],"isOsiApproved":false},{"reference":"./PHP-3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PHP-3.0.json","referenceNumber":"207","name":"PHP License v3.0","licenseId":"PHP-3.0","seeAlso":["http://www.php.net/license/3_0.txt","https://opensource.org/licenses/PHP-3.0"],"isOsiApproved":true},{"reference":"./PHP-3.01.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/PHP-3.01.json","referenceNumber":"3","name":"PHP License v3.01","licenseId":"PHP-3.01","seeAlso":["http://www.php.net/license/3_01.txt"],"isOsiApproved":true},{"reference":"./PSF-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PSF-2.0.json","referenceNumber":"99","name":"Python Software Foundation License 2.0","licenseId":"PSF-2.0","seeAlso":["https://opensource.org/licenses/Python-2.0"],"isOsiApproved":false},{"reference":"./Parity-6.0.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Parity-6.0.0.json","referenceNumber":"439","name":"The Parity Public License 6.0.0","licenseId":"Parity-6.0.0","seeAlso":["https://paritylicense.com/versions/6.0.0.html"],"isOsiApproved":false},{"reference":"./Parity-7.0.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Parity-7.0.0.json","referenceNumber":"423","name":"The Parity Public License 7.0.0","licenseId":"Parity-7.0.0","seeAlso":["https://paritylicense.com/versions/7.0.0.html"],"isOsiApproved":false},{"reference":"./Plexus.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Plexus.json","referenceNumber":"166","name":"Plexus Classworlds License","licenseId":"Plexus","seeAlso":["https://fedoraproject.org/wiki/Licensing/Plexus_Classworlds_License"],"isOsiApproved":false},{"reference":"./PolyForm-Noncommercial-1.0.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PolyForm-Noncommercial-1.0.0.json","referenceNumber":"306","name":"PolyForm Noncommercial License 1.0.0","licenseId":"PolyForm-Noncommercial-1.0.0","seeAlso":["https://polyformproject.org/licenses/noncommercial/1.0.0"],"isOsiApproved":false},{"reference":"./PolyForm-Small-Business-1.0.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PolyForm-Small-Business-1.0.0.json","referenceNumber":"126","name":"PolyForm Small Business License 1.0.0","licenseId":"PolyForm-Small-Business-1.0.0","seeAlso":["https://polyformproject.org/licenses/small-business/1.0.0"],"isOsiApproved":false},{"reference":"./PostgreSQL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/PostgreSQL.json","referenceNumber":"12","name":"PostgreSQL License","licenseId":"PostgreSQL","seeAlso":["http://www.postgresql.org/about/licence","https://opensource.org/licenses/PostgreSQL"],"isOsiApproved":true},{"reference":"./Python-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Python-2.0.json","referenceNumber":"425","name":"Python License 2.0","licenseId":"Python-2.0","seeAlso":["https://opensource.org/licenses/Python-2.0"],"isOsiApproved":true},{"reference":"./QPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/QPL-1.0.json","referenceNumber":"314","name":"Q Public License 1.0","licenseId":"QPL-1.0","seeAlso":["http://doc.qt.nokia.com/3.3/license.html","https://opensource.org/licenses/QPL-1.0"],"isOsiApproved":true},{"reference":"./Qhull.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Qhull.json","referenceNumber":"133","name":"Qhull License","licenseId":"Qhull","seeAlso":["https://fedoraproject.org/wiki/Licensing/Qhull"],"isOsiApproved":false},{"reference":"./RHeCos-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/RHeCos-1.1.json","referenceNumber":"67","name":"Red Hat eCos Public License v1.1","licenseId":"RHeCos-1.1","seeAlso":["http://ecos.sourceware.org/old-license.html"],"isOsiApproved":false},{"reference":"./RPL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/RPL-1.1.json","referenceNumber":"233","name":"Reciprocal Public License 1.1","licenseId":"RPL-1.1","seeAlso":["https://opensource.org/licenses/RPL-1.1"],"isOsiApproved":true},{"reference":"./RPL-1.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/RPL-1.5.json","referenceNumber":"113","name":"Reciprocal Public License 1.5","licenseId":"RPL-1.5","seeAlso":["https://opensource.org/licenses/RPL-1.5"],"isOsiApproved":true},{"reference":"./RPSL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/RPSL-1.0.json","referenceNumber":"58","name":"RealNetworks Public Source License v1.0","licenseId":"RPSL-1.0","seeAlso":["https://helixcommunity.org/content/rpsl","https://opensource.org/licenses/RPSL-1.0"],"isOsiApproved":true},{"reference":"./RSA-MD.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/RSA-MD.json","referenceNumber":"302","name":"RSA Message-Digest License","licenseId":"RSA-MD","seeAlso":["http://www.faqs.org/rfcs/rfc1321.html"],"isOsiApproved":false},{"reference":"./RSCPL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/RSCPL.json","referenceNumber":"368","name":"Ricoh Source Code Public License","licenseId":"RSCPL","seeAlso":["http://wayback.archive.org/web/20060715140826/http://www.risource.org/RPL/RPL-1.0A.shtml","https://opensource.org/licenses/RSCPL"],"isOsiApproved":true},{"reference":"./Rdisc.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Rdisc.json","referenceNumber":"350","name":"Rdisc License","licenseId":"Rdisc","seeAlso":["https://fedoraproject.org/wiki/Licensing/Rdisc_License"],"isOsiApproved":false},{"reference":"./Ruby.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Ruby.json","referenceNumber":"15","name":"Ruby License","licenseId":"Ruby","seeAlso":["http://www.ruby-lang.org/en/LICENSE.txt"],"isOsiApproved":false},{"reference":"./SAX-PD.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SAX-PD.json","referenceNumber":"162","name":"Sax Public Domain Notice","licenseId":"SAX-PD","seeAlso":["http://www.saxproject.org/copying.html"],"isOsiApproved":false},{"reference":"./SCEA.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SCEA.json","referenceNumber":"146","name":"SCEA Shared Source License","licenseId":"SCEA","seeAlso":["http://research.scea.com/scea_shared_source_license.html"],"isOsiApproved":false},{"reference":"./SGI-B-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SGI-B-1.0.json","referenceNumber":"204","name":"SGI Free Software License B v1.0","licenseId":"SGI-B-1.0","seeAlso":["http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.1.0.html"],"isOsiApproved":false},{"reference":"./SGI-B-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SGI-B-1.1.json","referenceNumber":"313","name":"SGI Free Software License B v1.1","licenseId":"SGI-B-1.1","seeAlso":["http://oss.sgi.com/projects/FreeB/"],"isOsiApproved":false},{"reference":"./SGI-B-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/SGI-B-2.0.json","referenceNumber":"32","name":"SGI Free Software License B v2.0","licenseId":"SGI-B-2.0","seeAlso":["http://oss.sgi.com/projects/FreeB/SGIFreeSWLicB.2.0.pdf"],"isOsiApproved":false},{"reference":"./SHL-0.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SHL-0.5.json","referenceNumber":"53","name":"Solderpad Hardware License v0.5","licenseId":"SHL-0.5","seeAlso":["https://solderpad.org/licenses/SHL-0.5/"],"isOsiApproved":false},{"reference":"./SHL-0.51.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SHL-0.51.json","referenceNumber":"304","name":"Solderpad Hardware License, Version 0.51","licenseId":"SHL-0.51","seeAlso":["https://solderpad.org/licenses/SHL-0.51/"],"isOsiApproved":false},{"reference":"./SISSL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/SISSL.json","referenceNumber":"86","name":"Sun Industry Standards Source License v1.1","licenseId":"SISSL","seeAlso":["http://www.openoffice.org/licenses/sissl_license.html","https://opensource.org/licenses/SISSL"],"isOsiApproved":true},{"reference":"./SISSL-1.2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SISSL-1.2.json","referenceNumber":"68","name":"Sun Industry Standards Source License v1.2","licenseId":"SISSL-1.2","seeAlso":["http://gridscheduler.sourceforge.net/Gridengine_SISSL_license.html"],"isOsiApproved":false},{"reference":"./SMLNJ.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/SMLNJ.json","referenceNumber":"236","name":"Standard ML of New Jersey License","licenseId":"SMLNJ","seeAlso":["https://www.smlnj.org/license.html"],"isOsiApproved":false},{"reference":"./SMPPL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SMPPL.json","referenceNumber":"114","name":"Secure Messaging Protocol Public License","licenseId":"SMPPL","seeAlso":["https://github.com/dcblake/SMP/blob/master/Documentation/License.txt"],"isOsiApproved":false},{"reference":"./SNIA.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SNIA.json","referenceNumber":"330","name":"SNIA Public License 1.1","licenseId":"SNIA","seeAlso":["https://fedoraproject.org/wiki/Licensing/SNIA_Public_License"],"isOsiApproved":false},{"reference":"./SPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/SPL-1.0.json","referenceNumber":"268","name":"Sun Public License v1.0","licenseId":"SPL-1.0","seeAlso":["https://opensource.org/licenses/SPL-1.0"],"isOsiApproved":true},{"reference":"./SSH-OpenSSH.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SSH-OpenSSH.json","referenceNumber":"23","name":"SSH OpenSSH license","licenseId":"SSH-OpenSSH","seeAlso":["https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/LICENCE#L10"],"isOsiApproved":false},{"reference":"./SSH-short.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SSH-short.json","referenceNumber":"73","name":"SSH short notice","licenseId":"SSH-short","seeAlso":["https://github.com/openssh/openssh-portable/blob/1b11ea7c58cd5c59838b5fa574cd456d6047b2d4/pathnames.h","http://web.mit.edu/kolya/.f/root/athena.mit.edu/sipb.mit.edu/project/openssh/OldFiles/src/openssh-2.9.9p2/ssh-add.1","https://joinup.ec.europa.eu/svn/lesoll/trunk/italc/lib/src/dsa_key.cpp"],"isOsiApproved":false},{"reference":"./SSPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SSPL-1.0.json","referenceNumber":"362","name":"Server Side Public License, v 1","licenseId":"SSPL-1.0","seeAlso":["https://www.mongodb.com/licensing/server-side-public-license"],"isOsiApproved":false},{"reference":"./SWL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SWL.json","referenceNumber":"101","name":"Scheme Widget Library (SWL) Software License Agreement","licenseId":"SWL","seeAlso":["https://fedoraproject.org/wiki/Licensing/SWL"],"isOsiApproved":false},{"reference":"./Saxpath.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Saxpath.json","referenceNumber":"35","name":"Saxpath License","licenseId":"Saxpath","seeAlso":["https://fedoraproject.org/wiki/Licensing/Saxpath_License"],"isOsiApproved":false},{"reference":"./Sendmail.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Sendmail.json","referenceNumber":"318","name":"Sendmail License","licenseId":"Sendmail","seeAlso":["http://www.sendmail.com/pdfs/open_source/sendmail_license.pdf","https://web.archive.org/web/20160322142305/https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf"],"isOsiApproved":false},{"reference":"./Sendmail-8.23.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Sendmail-8.23.json","referenceNumber":"189","name":"Sendmail License 8.23","licenseId":"Sendmail-8.23","seeAlso":["https://www.proofpoint.com/sites/default/files/sendmail-license.pdf","https://web.archive.org/web/20181003101040/https://www.proofpoint.com/sites/default/files/sendmail-license.pdf"],"isOsiApproved":false},{"reference":"./SimPL-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SimPL-2.0.json","referenceNumber":"271","name":"Simple Public License 2.0","licenseId":"SimPL-2.0","seeAlso":["https://opensource.org/licenses/SimPL-2.0"],"isOsiApproved":true},{"reference":"./Sleepycat.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Sleepycat.json","referenceNumber":"61","name":"Sleepycat License","licenseId":"Sleepycat","seeAlso":["https://opensource.org/licenses/Sleepycat"],"isOsiApproved":true},{"reference":"./Spencer-86.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Spencer-86.json","referenceNumber":"199","name":"Spencer License 86","licenseId":"Spencer-86","seeAlso":["https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License"],"isOsiApproved":false},{"reference":"./Spencer-94.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Spencer-94.json","referenceNumber":"230","name":"Spencer License 94","licenseId":"Spencer-94","seeAlso":["https://fedoraproject.org/wiki/Licensing/Henry_Spencer_Reg-Ex_Library_License"],"isOsiApproved":false},{"reference":"./Spencer-99.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Spencer-99.json","referenceNumber":"70","name":"Spencer License 99","licenseId":"Spencer-99","seeAlso":["http://www.opensource.apple.com/source/tcl/tcl-5/tcl/generic/regfronts.c"],"isOsiApproved":false},{"reference":"./StandardML-NJ.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/StandardML-NJ.json","referenceNumber":"310","name":"Standard ML of New Jersey License","licenseId":"StandardML-NJ","seeAlso":["http://www.smlnj.org//license.html"],"isOsiApproved":false},{"reference":"./SugarCRM-1.1.3.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/SugarCRM-1.1.3.json","referenceNumber":"371","name":"SugarCRM Public License v1.1.3","licenseId":"SugarCRM-1.1.3","seeAlso":["http://www.sugarcrm.com/crm/SPL"],"isOsiApproved":false},{"reference":"./TAPR-OHL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TAPR-OHL-1.0.json","referenceNumber":"10","name":"TAPR Open Hardware License v1.0","licenseId":"TAPR-OHL-1.0","seeAlso":["https://www.tapr.org/OHL"],"isOsiApproved":false},{"reference":"./TCL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TCL.json","referenceNumber":"59","name":"TCL/TK License","licenseId":"TCL","seeAlso":["http://www.tcl.tk/software/tcltk/license.html","https://fedoraproject.org/wiki/Licensing/TCL"],"isOsiApproved":false},{"reference":"./TCP-wrappers.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TCP-wrappers.json","referenceNumber":"253","name":"TCP Wrappers License","licenseId":"TCP-wrappers","seeAlso":["http://rc.quest.com/topics/openssh/license.php#tcpwrappers"],"isOsiApproved":false},{"reference":"./TMate.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TMate.json","referenceNumber":"435","name":"TMate Open Source License","licenseId":"TMate","seeAlso":["http://svnkit.com/license.html"],"isOsiApproved":false},{"reference":"./TORQUE-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TORQUE-1.1.json","referenceNumber":"203","name":"TORQUE v2.5+ Software License v1.1","licenseId":"TORQUE-1.1","seeAlso":["https://fedoraproject.org/wiki/Licensing/TORQUEv1.1"],"isOsiApproved":false},{"reference":"./TOSL.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TOSL.json","referenceNumber":"272","name":"Trusster Open Source License","licenseId":"TOSL","seeAlso":["https://fedoraproject.org/wiki/Licensing/TOSL"],"isOsiApproved":false},{"reference":"./TU-Berlin-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TU-Berlin-1.0.json","referenceNumber":"403","name":"Technische Universitaet Berlin License 1.0","licenseId":"TU-Berlin-1.0","seeAlso":["https://github.com/swh/ladspa/blob/7bf6f3799fdba70fda297c2d8fd9f526803d9680/gsm/COPYRIGHT"],"isOsiApproved":false},{"reference":"./TU-Berlin-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/TU-Berlin-2.0.json","referenceNumber":"424","name":"Technische Universitaet Berlin License 2.0","licenseId":"TU-Berlin-2.0","seeAlso":["https://github.com/CorsixTH/deps/blob/fd339a9f526d1d9c9f01ccf39e438a015da50035/licences/libgsm.txt"],"isOsiApproved":false},{"reference":"./UCL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/UCL-1.0.json","referenceNumber":"316","name":"Upstream Compatibility License v1.0","licenseId":"UCL-1.0","seeAlso":["https://opensource.org/licenses/UCL-1.0"],"isOsiApproved":true},{"reference":"./UPL-1.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/UPL-1.0.json","referenceNumber":"153","name":"Universal Permissive License v1.0","licenseId":"UPL-1.0","seeAlso":["https://opensource.org/licenses/UPL"],"isOsiApproved":true},{"reference":"./Unicode-DFS-2015.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Unicode-DFS-2015.json","referenceNumber":"282","name":"Unicode License Agreement - Data Files and Software (2015)","licenseId":"Unicode-DFS-2015","seeAlso":["https://web.archive.org/web/20151224134844/http://unicode.org/copyright.html"],"isOsiApproved":false},{"reference":"./Unicode-DFS-2016.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Unicode-DFS-2016.json","referenceNumber":"401","name":"Unicode License Agreement - Data Files and Software (2016)","licenseId":"Unicode-DFS-2016","seeAlso":["http://www.unicode.org/copyright.html"],"isOsiApproved":false},{"reference":"./Unicode-TOU.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Unicode-TOU.json","referenceNumber":"17","name":"Unicode Terms of Use","licenseId":"Unicode-TOU","seeAlso":["http://www.unicode.org/copyright.html"],"isOsiApproved":false},{"reference":"./Unlicense.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Unlicense.json","referenceNumber":"185","name":"The Unlicense","licenseId":"Unlicense","seeAlso":["https://unlicense.org/"],"isOsiApproved":true},{"reference":"./VOSTROM.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/VOSTROM.json","referenceNumber":"382","name":"VOSTROM Public License for Open Source","licenseId":"VOSTROM","seeAlso":["https://fedoraproject.org/wiki/Licensing/VOSTROM"],"isOsiApproved":false},{"reference":"./VSL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/VSL-1.0.json","referenceNumber":"421","name":"Vovida Software License v1.0","licenseId":"VSL-1.0","seeAlso":["https://opensource.org/licenses/VSL-1.0"],"isOsiApproved":true},{"reference":"./Vim.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Vim.json","referenceNumber":"223","name":"Vim License","licenseId":"Vim","seeAlso":["http://vimdoc.sourceforge.net/htmldoc/uganda.html"],"isOsiApproved":false},{"reference":"./W3C.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/W3C.json","referenceNumber":"115","name":"W3C Software Notice and License (2002-12-31)","licenseId":"W3C","seeAlso":["http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231.html","https://opensource.org/licenses/W3C"],"isOsiApproved":true},{"reference":"./W3C-19980720.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/W3C-19980720.json","referenceNumber":"288","name":"W3C Software Notice and License (1998-07-20)","licenseId":"W3C-19980720","seeAlso":["http://www.w3.org/Consortium/Legal/copyright-software-19980720.html"],"isOsiApproved":false},{"reference":"./W3C-20150513.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/W3C-20150513.json","referenceNumber":"119","name":"W3C Software Notice and Document License (2015-05-13)","licenseId":"W3C-20150513","seeAlso":["https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document"],"isOsiApproved":false},{"reference":"./WTFPL.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/WTFPL.json","referenceNumber":"21","name":"Do What The F*ck You Want To Public License","licenseId":"WTFPL","seeAlso":["http://www.wtfpl.net/about/","http://sam.zoy.org/wtfpl/COPYING"],"isOsiApproved":false},{"reference":"./Watcom-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Watcom-1.0.json","referenceNumber":"150","name":"Sybase Open Watcom Public License 1.0","licenseId":"Watcom-1.0","seeAlso":["https://opensource.org/licenses/Watcom-1.0"],"isOsiApproved":true},{"reference":"./Wsuipa.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Wsuipa.json","referenceNumber":"276","name":"Wsuipa License","licenseId":"Wsuipa","seeAlso":["https://fedoraproject.org/wiki/Licensing/Wsuipa"],"isOsiApproved":false},{"reference":"./X11.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/X11.json","referenceNumber":"107","name":"X11 License","licenseId":"X11","seeAlso":["http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3"],"isOsiApproved":false},{"reference":"./XFree86-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/XFree86-1.1.json","referenceNumber":"165","name":"XFree86 License 1.1","licenseId":"XFree86-1.1","seeAlso":["http://www.xfree86.org/current/LICENSE4.html"],"isOsiApproved":false},{"reference":"./XSkat.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/XSkat.json","referenceNumber":"89","name":"XSkat License","licenseId":"XSkat","seeAlso":["https://fedoraproject.org/wiki/Licensing/XSkat_License"],"isOsiApproved":false},{"reference":"./Xerox.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Xerox.json","referenceNumber":"243","name":"Xerox License","licenseId":"Xerox","seeAlso":["https://fedoraproject.org/wiki/Licensing/Xerox"],"isOsiApproved":false},{"reference":"./Xnet.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Xnet.json","referenceNumber":"341","name":"X.Net License","licenseId":"Xnet","seeAlso":["https://opensource.org/licenses/Xnet"],"isOsiApproved":true},{"reference":"./YPL-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/YPL-1.0.json","referenceNumber":"317","name":"Yahoo! Public License v1.0","licenseId":"YPL-1.0","seeAlso":["http://www.zimbra.com/license/yahoo_public_license_1.0.html"],"isOsiApproved":false},{"reference":"./YPL-1.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/YPL-1.1.json","referenceNumber":"42","name":"Yahoo! Public License v1.1","licenseId":"YPL-1.1","seeAlso":["http://www.zimbra.com/license/yahoo_public_license_1.1.html"],"isOsiApproved":false},{"reference":"./ZPL-1.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/ZPL-1.1.json","referenceNumber":"93","name":"Zope Public License 1.1","licenseId":"ZPL-1.1","seeAlso":["http://old.zope.org/Resources/License/ZPL-1.1"],"isOsiApproved":false},{"reference":"./ZPL-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ZPL-2.0.json","referenceNumber":"120","name":"Zope Public License 2.0","licenseId":"ZPL-2.0","seeAlso":["http://old.zope.org/Resources/License/ZPL-2.0","https://opensource.org/licenses/ZPL-2.0"],"isOsiApproved":true},{"reference":"./ZPL-2.1.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/ZPL-2.1.json","referenceNumber":"399","name":"Zope Public License 2.1","licenseId":"ZPL-2.1","seeAlso":["http://old.zope.org/Resources/ZPL/"],"isOsiApproved":false},{"reference":"./Zed.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Zed.json","referenceNumber":"122","name":"Zed License","licenseId":"Zed","seeAlso":["https://fedoraproject.org/wiki/Licensing/Zed"],"isOsiApproved":false},{"reference":"./Zend-2.0.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Zend-2.0.json","referenceNumber":"404","name":"Zend License v2.0","licenseId":"Zend-2.0","seeAlso":["https://web.archive.org/web/20130517195954/http://www.zend.com/license/2_00.txt"],"isOsiApproved":false},{"reference":"./Zimbra-1.3.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Zimbra-1.3.json","referenceNumber":"188","name":"Zimbra Public License v1.3","licenseId":"Zimbra-1.3","seeAlso":["http://web.archive.org/web/20100302225219/http://www.zimbra.com/license/zimbra-public-license-1-3.html"],"isOsiApproved":false},{"reference":"./Zimbra-1.4.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/Zimbra-1.4.json","referenceNumber":"416","name":"Zimbra Public License v1.4","licenseId":"Zimbra-1.4","seeAlso":["http://www.zimbra.com/legal/zimbra-public-license-1-4"],"isOsiApproved":false},{"reference":"./Zlib.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/Zlib.json","referenceNumber":"47","name":"zlib License","licenseId":"Zlib","seeAlso":["http://www.zlib.net/zlib_license.html","https://opensource.org/licenses/Zlib"],"isOsiApproved":true},{"reference":"./blessing.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/blessing.json","referenceNumber":"329","name":"SQLite Blessing","licenseId":"blessing","seeAlso":["https://www.sqlite.org/src/artifact/e33a4df7e32d742a?ln=4-9","https://sqlite.org/src/artifact/df5091916dbb40e6"],"isOsiApproved":false},{"reference":"./bzip2-1.0.5.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/bzip2-1.0.5.json","referenceNumber":"201","name":"bzip2 and libbzip2 License v1.0.5","licenseId":"bzip2-1.0.5","seeAlso":["https://sourceware.org/bzip2/1.0.5/bzip2-manual-1.0.5.html","http://bzip.org/1.0.5/bzip2-manual-1.0.5.html"],"isOsiApproved":false},{"reference":"./bzip2-1.0.6.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/bzip2-1.0.6.json","referenceNumber":"75","name":"bzip2 and libbzip2 License v1.0.6","licenseId":"bzip2-1.0.6","seeAlso":["https://sourceware.org/git/?p=bzip2.git;a=blob;f=LICENSE;hb=bzip2-1.0.6","http://bzip.org/1.0.5/bzip2-manual-1.0.5.html"],"isOsiApproved":false},{"reference":"./copyleft-next-0.3.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/copyleft-next-0.3.0.json","referenceNumber":"340","name":"copyleft-next 0.3.0","licenseId":"copyleft-next-0.3.0","seeAlso":["https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.0"],"isOsiApproved":false},{"reference":"./copyleft-next-0.3.1.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/copyleft-next-0.3.1.json","referenceNumber":"409","name":"copyleft-next 0.3.1","licenseId":"copyleft-next-0.3.1","seeAlso":["https://github.com/copyleft-next/copyleft-next/blob/master/Releases/copyleft-next-0.3.1"],"isOsiApproved":false},{"reference":"./curl.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/curl.json","referenceNumber":"342","name":"curl License","licenseId":"curl","seeAlso":["https://github.com/bagder/curl/blob/master/COPYING"],"isOsiApproved":false},{"reference":"./diffmark.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/diffmark.json","referenceNumber":"430","name":"diffmark license","licenseId":"diffmark","seeAlso":["https://fedoraproject.org/wiki/Licensing/diffmark"],"isOsiApproved":false},{"reference":"./dvipdfm.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/dvipdfm.json","referenceNumber":"20","name":"dvipdfm License","licenseId":"dvipdfm","seeAlso":["https://fedoraproject.org/wiki/Licensing/dvipdfm"],"isOsiApproved":false},{"reference":"./eCos-2.0.html","isDeprecatedLicenseId":true,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/eCos-2.0.json","referenceNumber":"295","name":"eCos license version 2.0","licenseId":"eCos-2.0","seeAlso":["https://www.gnu.org/licenses/ecos-license.html"],"isOsiApproved":false},{"reference":"./eGenix.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/eGenix.json","referenceNumber":"231","name":"eGenix.com Public License 1.1.0","licenseId":"eGenix","seeAlso":["http://www.egenix.com/products/eGenix.com-Public-License-1.1.0.pdf","https://fedoraproject.org/wiki/Licensing/eGenix.com_Public_License_1.1.0"],"isOsiApproved":false},{"reference":"./etalab-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/etalab-2.0.json","referenceNumber":"281","name":"Etalab Open License 2.0","licenseId":"etalab-2.0","seeAlso":["https://github.com/DISIC/politique-de-contribution-open-source/blob/master/LICENSE.pdf","https://raw.githubusercontent.com/DISIC/politique-de-contribution-open-source/master/LICENSE"],"isOsiApproved":false},{"reference":"./gSOAP-1.3b.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/gSOAP-1.3b.json","referenceNumber":"178","name":"gSOAP Public License v1.3b","licenseId":"gSOAP-1.3b","seeAlso":["http://www.cs.fsu.edu/~engelen/license.html"],"isOsiApproved":false},{"reference":"./gnuplot.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/gnuplot.json","referenceNumber":"414","name":"gnuplot License","licenseId":"gnuplot","seeAlso":["https://fedoraproject.org/wiki/Licensing/Gnuplot"],"isOsiApproved":false},{"reference":"./iMatix.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/iMatix.json","referenceNumber":"190","name":"iMatix Standard Function Library Agreement","licenseId":"iMatix","seeAlso":["http://legacy.imatix.com/html/sfl/sfl4.htm#license"],"isOsiApproved":false},{"reference":"./libpng-2.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/libpng-2.0.json","referenceNumber":"111","name":"PNG Reference Library version 2","licenseId":"libpng-2.0","seeAlso":["http://www.libpng.org/pub/png/src/libpng-LICENSE.txt"],"isOsiApproved":false},{"reference":"./libselinux-1.0.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/libselinux-1.0.json","referenceNumber":"19","name":"libselinux public domain notice","licenseId":"libselinux-1.0","seeAlso":["https://github.com/SELinuxProject/selinux/blob/master/libselinux/LICENSE"],"isOsiApproved":false},{"reference":"./libtiff.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/libtiff.json","referenceNumber":"440","name":"libtiff License","licenseId":"libtiff","seeAlso":["https://fedoraproject.org/wiki/Licensing/libtiff"],"isOsiApproved":false},{"reference":"./mpich2.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/mpich2.json","referenceNumber":"66","name":"mpich2 License","licenseId":"mpich2","seeAlso":["https://fedoraproject.org/wiki/Licensing/MIT"],"isOsiApproved":false},{"reference":"./psfrag.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/psfrag.json","referenceNumber":"441","name":"psfrag License","licenseId":"psfrag","seeAlso":["https://fedoraproject.org/wiki/Licensing/psfrag"],"isOsiApproved":false},{"reference":"./psutils.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/psutils.json","referenceNumber":"300","name":"psutils License","licenseId":"psutils","seeAlso":["https://fedoraproject.org/wiki/Licensing/psutils"],"isOsiApproved":false},{"reference":"./wxWindows.html","isDeprecatedLicenseId":true,"detailsUrl":"http://spdx.org/licenses/wxWindows.json","referenceNumber":"264","name":"wxWindows Library License","licenseId":"wxWindows","seeAlso":["https://opensource.org/licenses/WXwindows"],"isOsiApproved":false},{"reference":"./xinetd.html","isDeprecatedLicenseId":false,"isFsfLibre":true,"detailsUrl":"http://spdx.org/licenses/xinetd.json","referenceNumber":"432","name":"xinetd License","licenseId":"xinetd","seeAlso":["https://fedoraproject.org/wiki/Licensing/Xinetd_License"],"isOsiApproved":false},{"reference":"./xpp.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/xpp.json","referenceNumber":"104","name":"XPP License","licenseId":"xpp","seeAlso":["https://fedoraproject.org/wiki/Licensing/xpp"],"isOsiApproved":false},{"reference":"./zlib-acknowledgement.html","isDeprecatedLicenseId":false,"detailsUrl":"http://spdx.org/licenses/zlib-acknowledgement.json","referenceNumber":"266","name":"zlib/libpng License with Acknowledgement","licenseId":"zlib-acknowledgement","seeAlso":["https://fedoraproject.org/wiki/Licensing/ZlibWithAcknowledgement"],"isOsiApproved":false}],"releaseDate":"2020-08-03"}
\ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 506fd57dc64..732a84299c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8362,6 +8362,11 @@ mkdirp@0.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" +mock-apollo-client@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-0.4.0.tgz#556a6090b1816dbf07e51093b652aca84aee979e" + integrity sha512-cHznpkX8uUClkWWJMpgdDWzEgjacM85xt69S9gPLrssM8Vahas0QmEJkFUycrRQyBkaqxvRe58Bg3a5pOvj2zA== + moment-mini@^2.22.1: version "2.22.1" resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.22.1.tgz#bc32d73e43a4505070be6b53494b17623183420d" |