Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-08-13 18:10:03 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-08-13 18:10:03 +0300
commit6df7943512ca90323c69b926404cc561b6305ce2 (patch)
tree5dbdb697f641358516ddae9b45ab8bae5d58de81
parent5605efec12c99adf88f641391cb879dedf8fa05e (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--app/assets/javascripts/design_management/components/upload/design_dropzone.vue7
-rw-r--r--app/assets/javascripts/design_management/graphql/mutations/move_design.mutation.graphql18
-rw-r--r--app/assets/javascripts/design_management/pages/index.vue98
-rw-r--r--app/assets/javascripts/design_management/utils/cache_update.js17
-rw-r--r--app/assets/javascripts/design_management/utils/design_management_utils.js24
-rw-r--r--app/assets/javascripts/design_management/utils/error_messages.js4
-rw-r--r--app/assets/javascripts/incidents/components/incidents_list.vue1
-rw-r--r--app/assets/javascripts/issuables_list/components/issuable.vue47
-rw-r--r--app/assets/javascripts/vue_shared/components/clone_dropdown.vue2
-rw-r--r--app/assets/stylesheets/components/related_items_list.scss21
-rw-r--r--app/assets/stylesheets/pages/issuable.scss4
-rw-r--r--app/controllers/projects/merge_requests_controller.rb2
-rw-r--r--app/graphql/mutations/boards/lists/base.rb28
-rw-r--r--app/graphql/mutations/boards/lists/create.rb73
-rw-r--r--app/graphql/types/mutation_type.rb1
-rw-r--r--app/models/ci/pipeline.rb21
-rw-r--r--app/models/ci/pipeline_artifact.rb14
-rw-r--r--app/models/commit_status.rb30
-rw-r--r--app/models/merge_request_diff.rb14
-rw-r--r--app/serializers/merge_requests/pipeline_entity.rb2
-rw-r--r--app/serializers/pipeline_entity.rb2
-rw-r--r--app/serializers/triggered_pipeline_entity.rb4
-rw-r--r--app/services/ci/create_web_ide_terminal_service.rb2
-rw-r--r--app/services/ci/pipeline_processing/legacy_processing_service.rb122
-rw-r--r--app/services/ci/process_pipeline_service.rb14
-rw-r--r--app/services/ci/retry_pipeline_service.rb8
-rw-r--r--app/services/labels/available_labels_service.rb2
-rw-r--r--app/uploaders/ci/pipeline_artifact_uploader.rb21
-rw-r--r--app/views/layouts/nav/sidebar/_project.html.haml2
-rw-r--r--app/workers/pipeline_process_worker.rb6
-rw-r--r--app/workers/pipeline_update_worker.rb6
-rw-r--r--changelogs/unreleased/199718-turn-on-hide-jump-feature-flag-by-default.yml5
-rw-r--r--changelogs/unreleased/215533-graphql-add-mutation-to-create-the-default-backlog-list-for-a-boar.yml5
-rw-r--r--changelogs/unreleased/218536-removing-ci_atomic_processing.yml5
-rw-r--r--changelogs/unreleased/227570-track-merge-request-diff-files-count.yml5
-rw-r--r--changelogs/unreleased/233957-clone-button-position.yml5
-rw-r--r--changelogs/unreleased/34382-allow-the-ability-to-re-order-designs.yml5
-rw-r--r--changelogs/unreleased/mk-enforce-not-null-package-files-file-store.yml6
-rw-r--r--db/fixtures/development/16_protected_branches.rb2
-rw-r--r--db/migrate/20200806004232_add_default_value_for_file_store_to_package_files.rb19
-rw-r--r--db/migrate/20200807150937_add_file_count_to_merge_request_diffs.rb22
-rw-r--r--db/post_migrate/20200806004742_add_not_null_constraint_on_file_store_to_package_files.rb17
-rw-r--r--db/post_migrate/20200806172909_add_partial_index_on_id_to_package_files.rb18
-rw-r--r--db/post_migrate/20200806173633_migrate_null_package_files_file_store_to_local_value.rb43
-rw-r--r--db/post_migrate/20200807152315_backfill_merge_request_diffs_files_counts.rb30
-rw-r--r--db/schema_migrations/202008060042321
-rw-r--r--db/schema_migrations/202008060047421
-rw-r--r--db/schema_migrations/202008061729091
-rw-r--r--db/schema_migrations/202008061736331
-rw-r--r--db/schema_migrations/202008071509371
-rw-r--r--db/schema_migrations/202008071523151
-rw-r--r--db/structure.sql10
-rw-r--r--doc/administration/reference_architectures/10k_users.md2
-rw-r--r--doc/administration/reference_architectures/1k_users.md2
-rw-r--r--doc/administration/reference_architectures/25k_users.md2
-rw-r--r--doc/administration/reference_architectures/2k_users.md2
-rw-r--r--doc/administration/reference_architectures/3k_users.md2
-rw-r--r--doc/administration/reference_architectures/50k_users.md2
-rw-r--r--doc/administration/reference_architectures/5k_users.md2
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql56
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json169
-rw-r--r--doc/api/graphql/reference/index.md10
-rw-r--r--doc/api/issues.md98
-rw-r--r--doc/ci/cloud_deployment/index.md3
-rw-r--r--doc/operations/metrics/dashboards/default.md2
-rw-r--r--doc/operations/metrics/dashboards/img/actions_menu_create_add_panel_v13_3.pngbin0 -> 9982 bytes
-rw-r--r--doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.pngbin18560 -> 14957 bytes
-rw-r--r--doc/operations/metrics/dashboards/img/k8s_pod_health_dashboard_v13_3.pngbin0 -> 60933 bytes
-rw-r--r--doc/operations/metrics/dashboards/index.md43
-rw-r--r--doc/user/project/issues/design_management.md11
-rw-r--r--doc/user/project/issues/img/designs_reordering_v13_3.gifbin0 -> 7068938 bytes
-rw-r--r--lib/gitlab/background_migration/set_merge_request_diff_files_count.rb28
-rw-r--r--lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value.rb24
-rw-r--r--lib/gitlab/ci/features.rb4
-rw-r--r--lib/gitlab/ci/pipeline/chain/pipeline/process.rb2
-rw-r--r--locale/gitlab.pot3
-rw-r--r--package.json1
-rw-r--r--qa/qa.rb4
-rw-r--r--qa/qa/page/project/issue/show.rb4
-rw-r--r--qa/qa/page/project/operations/incidents/index.rb21
-rw-r--r--qa/qa/page/project/sub_menus/operations.rb9
-rw-r--r--spec/frontend/design_management/mock_data/apollo_mock.js106
-rw-r--r--spec/frontend/design_management/mock_data/versions_list.js0
-rw-r--r--spec/frontend/design_management/pages/__snapshots__/index_spec.js.snap21
-rw-r--r--spec/frontend/design_management/pages/index_apollo_spec.js162
-rw-r--r--spec/frontend/design_management/pages/index_spec.js3
-rw-r--r--spec/frontend/issuables_list/components/issuable_spec.js16
-rw-r--r--spec/frontend/issuables_list/issuable_list_test_data.js1
-rw-r--r--spec/frontend/vue_shared/components/__snapshots__/clone_dropdown_spec.js.snap1
-rw-r--r--spec/graphql/mutations/boards/lists/create_spec.rb80
-rw-r--r--spec/lib/gitlab/background_migration/set_merge_request_diff_files_count_spec.rb40
-rw-r--r--spec/lib/gitlab/background_migration/set_null_package_files_file_store_to_local_value_spec.rb33
-rw-r--r--spec/lib/gitlab/import_export/safe_model_attributes.yml1
-rw-r--r--spec/models/ci/pipeline_artifact_spec.rb30
-rw-r--r--spec/models/ci/pipeline_spec.rb72
-rw-r--r--spec/models/commit_status_spec.rb50
-rw-r--r--spec/models/merge_request_diff_spec.rb16
-rw-r--r--spec/models/packages/package_file_spec.rb13
-rw-r--r--spec/services/ci/pipeline_processing/atomic_processing_service_spec.rb10
-rw-r--r--spec/services/ci/pipeline_processing/legacy_processing_service_spec.rb35
-rw-r--r--spec/services/ci/pipeline_processing/shared_processing_service.rb3
-rw-r--r--spec/services/ci/pipeline_processing/shared_processing_service_tests_with_yaml.rb2
-rw-r--r--spec/services/labels/available_labels_service_spec.rb6
-rw-r--r--spec/services/projects/update_pages_service_spec.rb16
-rw-r--r--spec/support/helpers/stub_object_storage.rb4
-rw-r--r--spec/uploaders/ci/pipeline_artifact_uploader_spec.rb39
-rw-r--r--spec/workers/pipeline_process_worker_spec.rb11
-rw-r--r--spec/workers/pipeline_update_worker_spec.rb32
-rw-r--r--vendor/spdx.json1
-rw-r--r--yarn.lock5
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">
&middot;
<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
new file mode 100644
index 00000000000..e03fbef3b35
--- /dev/null
+++ b/doc/operations/metrics/dashboards/img/actions_menu_create_add_panel_v13_3.png
Binary files differ
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
index 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
Binary files differ
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
new file mode 100644
index 00000000000..dc0bc951500
--- /dev/null
+++ b/doc/operations/metrics/dashboards/img/k8s_pod_health_dashboard_v13_3.png
Binary files differ
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
new file mode 100644
index 00000000000..496eea532e2
--- /dev/null
+++ b/doc/user/project/issues/img/designs_reordering_v13_3.gif
Binary files differ
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",
diff --git a/qa/qa.rb b/qa/qa.rb
index 63d2ec0c1b9..c6973533144 100644
--- a/qa/qa.rb
+++ b/qa/qa.rb
@@ -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"