├── .achecker.yml
├── .copier-answers.yml
├── .git-blame-ignore-revs
├── .gitignore
├── .pre-commit-config.yaml
├── AUTHORS
├── CODE_OF_CONDUCT.md
├── CONTRIBUTORS
├── LICENSE
├── MANIFEST.in
├── Makefile
├── Makefile.local
├── README.rst
├── assets
├── config
│ ├── webpack-plugins
│ │ ├── dump-highlightjs-languages-data-plugin.js
│ │ ├── fix-swh-source-maps-webpack-plugin.js
│ │ └── generate-weblabels-webpack-plugin
│ │ │ ├── README.md
│ │ │ ├── index.js
│ │ │ ├── jslicenses.ejs
│ │ │ ├── plugin-options-schema.json
│ │ │ └── spdx-licenses-mapping.js
│ ├── webpack.config.development.js
│ └── webpack.config.production.js
└── src
│ ├── thirdparty
│ └── jquery.tabSlideOut
│ │ ├── LICENSE
│ │ ├── jquery.tabSlideOut.css
│ │ └── jquery.tabSlideOut.js
│ └── utils
│ ├── constants.js
│ ├── d3.js
│ ├── functions.js
│ ├── highlightjs.css
│ ├── highlightjs.js
│ ├── hljs-swh-theme.css
│ ├── mathjax.js
│ ├── org.css
│ ├── org.js
│ ├── requests-filter-checkbox.ejs
│ ├── scrolling.js
│ ├── showdown.css
│ └── showdown.js
├── conftest.py
├── cypress.config.js
├── cypress
├── e2e
│ ├── accessibility.cy.js
│ ├── add-forge-now-request-create.cy.js
│ ├── add-forge-now-request-dashboard.cy.js
│ ├── add-forge-now-requests-moderation.cy.js
│ ├── admin.cy.js
│ ├── alter.cy.js
│ ├── api-tokens.cy.js
│ ├── back-to-top.cy.js
│ ├── code-highlighting.cy.js
│ ├── content-display.cy.js
│ ├── content-rendering.cy.js
│ ├── deposit-admin.cy.js
│ ├── directory.cy.js
│ ├── errors.cy.js
│ ├── guided-tour.cy.js
│ ├── home.cy.js
│ ├── language-select.cy.js
│ ├── layout.cy.js
│ ├── mailmap.cy.js
│ ├── origin-browse.cy.js
│ ├── origin-save.cy.js
│ ├── origin-search.cy.js
│ ├── origin-visits.cy.js
│ ├── revision-diff.cy.js
│ ├── sidebar.cy.js
│ ├── sidetabs.cy.js
│ └── vault.cy.js
├── fixtures
│ ├── add-forge-now-requests.json
│ ├── example.json
│ ├── origin-save.json
│ ├── save-task-info.json
│ ├── swh_1_dir_cd19126d815470b28919d64b2a8e6a3e37f900dd.tar.gz
│ └── swh_1_rev_1c480a4573d2a003fc2630c21c2b25829de49972.git.tar
├── plugins
│ └── index.js
├── support
│ └── e2e.js
└── utils
│ └── index.js
├── docs
├── .gitignore
├── Makefile
├── _static
│ └── .placeholder
├── _templates
│ └── .placeholder
├── conf.py
├── developers-info.rst
├── index.rst
├── uri-scheme-api-content.rst
├── uri-scheme-api-directory.rst
├── uri-scheme-api-extid.rst
├── uri-scheme-api-graph.rst
├── uri-scheme-api-origin.rst
├── uri-scheme-api-provenance.rst
├── uri-scheme-api-release.rst
├── uri-scheme-api-request-archival.rst
├── uri-scheme-api-revision.rst
├── uri-scheme-api-snapshot.rst
├── uri-scheme-api-stat.rst
├── uri-scheme-api-swhids.rst
├── uri-scheme-api-vault.rst
├── uri-scheme-api.rst
├── uri-scheme-browse-content.rst
├── uri-scheme-browse-directory.rst
├── uri-scheme-browse-origin.rst
├── uri-scheme-browse-release.rst
├── uri-scheme-browse-revision.rst
├── uri-scheme-browse-snapshot.rst
├── uri-scheme-browse.rst
├── uri-scheme-misc.rst
└── uri-scheme-swhids.rst
├── eslint.config.js
├── mirror_demo
├── config.yml
├── static
│ └── partner_logo.png
└── templates
│ ├── mirror-footer.html
│ └── mirror-homepage.html
├── nyc.config.js
├── package.json
├── pyproject.toml
├── requirements-swh.txt
├── requirements-test.txt
├── requirements.txt
├── swh
└── web
│ ├── __init__.py
│ ├── add_forge_now
│ ├── __init__.py
│ ├── admin_views.py
│ ├── api_views.py
│ ├── apps.py
│ ├── assets
│ │ ├── add-forge.css
│ │ ├── add-request-history-item.ejs
│ │ ├── create-request.js
│ │ ├── forge-admin-email.ejs
│ │ ├── forge-success-email.ejs
│ │ ├── index.js
│ │ ├── moderation-dashboard.js
│ │ └── request-dashboard.js
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_authorized_null_comment.py
│ │ ├── 0003_request_submitter_forward_username.py
│ │ ├── 0004_rename_tables.py
│ │ ├── 0005_prepare_inbound_email.py
│ │ ├── 0006_request_add_new_fields.py
│ │ ├── 0007_rename_denied_request_status.py
│ │ ├── 0008_turn_request_forge_url_into_url_field.py
│ │ ├── 0009_canonicalise_forge_urls.py
│ │ ├── __init__.py
│ │ └── swh-afn-urls-canonicalise.txt
│ ├── models.py
│ ├── signal_receivers.py
│ ├── templates
│ │ ├── add-forge-common.html
│ │ ├── add-forge-creation-form.html
│ │ ├── add-forge-help.html
│ │ ├── add-forge-list.html
│ │ ├── add-forge-request-dashboard.html
│ │ └── add-forge-requests-moderation.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_api_views.py
│ │ ├── test_app.py
│ │ ├── test_migration.py
│ │ ├── test_models.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
│ ├── admin
│ ├── __init__.py
│ ├── apps.py
│ ├── templates
│ │ └── admin
│ │ │ └── base_site.html
│ ├── tests
│ │ ├── __init__.py
│ │ └── test_app.py
│ └── urls.py
│ ├── alter
│ ├── __init__.py
│ ├── apps.py
│ ├── assets
│ │ ├── alter.css
│ │ └── index.js
│ ├── emails.py
│ ├── forms.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ ├── admin_alteration.html
│ │ ├── admin_dashboard.html
│ │ ├── alter_common.html
│ │ ├── alteration_access.html
│ │ ├── alteration_details.html
│ │ ├── assistant_category.html
│ │ ├── assistant_email.html
│ │ ├── assistant_origins.html
│ │ ├── assistant_reasons.html
│ │ ├── assistant_summary.html
│ │ ├── content_policies.html
│ │ ├── emails
│ │ │ ├── admin_alteration_notification.txt
│ │ │ ├── admin_message_notification.txt
│ │ │ ├── alteration_confirmation.txt
│ │ │ ├── alteration_magic_link.txt
│ │ │ ├── email_magic_link.txt
│ │ │ └── message_notification.txt
│ │ └── includes
│ │ │ ├── activity_log.html
│ │ │ ├── origins_table.html
│ │ │ ├── reasons_outcome.html
│ │ │ ├── steps.html
│ │ │ └── swh_legal.html
│ ├── templatetags
│ │ ├── __init__.py
│ │ └── alter_extras.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── test_app.py
│ │ ├── test_emails.py
│ │ ├── test_forms.py
│ │ ├── test_models.py
│ │ ├── test_templatetags.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
│ ├── api
│ ├── __init__.py
│ ├── apidoc.py
│ ├── apiresponse.py
│ ├── apiurls.py
│ ├── parsers.py
│ ├── renderers.py
│ ├── serializers.py
│ ├── templates
│ │ ├── api-endpoints.html
│ │ ├── api.html
│ │ └── apidoc.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_api_lookup.py
│ │ ├── test_apidoc.py
│ │ ├── test_apiresponse.py
│ │ ├── test_apiurls.py
│ │ ├── test_serializers.py
│ │ ├── test_throttling.py
│ │ ├── test_utils.py
│ │ └── views
│ │ │ ├── __init__.py
│ │ │ ├── test_citation.py
│ │ │ ├── test_content.py
│ │ │ ├── test_directory.py
│ │ │ ├── test_extid.py
│ │ │ ├── test_graph.py
│ │ │ ├── test_identifiers.py
│ │ │ ├── test_metadata.py
│ │ │ ├── test_origin.py
│ │ │ ├── test_ping.py
│ │ │ ├── test_raw.py
│ │ │ ├── test_release.py
│ │ │ ├── test_revision.py
│ │ │ ├── test_snapshot.py
│ │ │ ├── test_stat.py
│ │ │ └── utils.py
│ ├── throttling.py
│ ├── urls.py
│ ├── utils.py
│ └── views
│ │ ├── __init__.py
│ │ ├── citation.py
│ │ ├── content.py
│ │ ├── directory.py
│ │ ├── extid.py
│ │ ├── graph.py
│ │ ├── identifiers.py
│ │ ├── metadata.py
│ │ ├── origin.py
│ │ ├── ping.py
│ │ ├── raw.py
│ │ ├── release.py
│ │ ├── revision.py
│ │ ├── snapshot.py
│ │ ├── stat.py
│ │ └── utils.py
│ ├── archive_coverage
│ ├── __init__.py
│ ├── assets
│ │ ├── coverage.css
│ │ └── index.js
│ ├── templates
│ │ └── archive-coverage.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_coverage.py
│ ├── urls.py
│ └── views.py
│ ├── auth
│ ├── __init__.py
│ ├── apps.py
│ ├── assets
│ │ ├── auth.css
│ │ └── index.js
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_remove_stored_tokens.py
│ │ ├── 0003_delete_oidcuser.py
│ │ ├── 0004_usermailmap.py
│ │ ├── 0005_usermailmapevent.py
│ │ ├── 0006_fix_mailmap_admin_user_id.py
│ │ ├── 0007_mailmap_django_app.py
│ │ ├── 0008_create_webapp_permissions.py
│ │ ├── 0009_create_provenance_permission.py
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ ├── login.html
│ │ ├── logout.html
│ │ └── profile.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_migrations.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
│ ├── badges
│ ├── __init__.py
│ ├── assets
│ │ ├── badges.css
│ │ └── index.js
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_badges.py
│ └── urls.py
│ ├── banners
│ ├── __init__.py
│ ├── templates
│ │ ├── banner-iframe.html
│ │ ├── downtime-banner.html
│ │ ├── fundraising-banner.html
│ │ └── hiring-banner.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_banners.py
│ ├── urls.py
│ └── views.py
│ ├── browse
│ ├── __init__.py
│ ├── assets
│ │ ├── browse
│ │ │ ├── breadcrumbs.css
│ │ │ ├── browse-utils.js
│ │ │ ├── browse.css
│ │ │ ├── content.css
│ │ │ ├── iframe.js
│ │ │ ├── index.js
│ │ │ ├── origin-search.js
│ │ │ ├── sidetabs.js
│ │ │ ├── snapshot-navigation.css
│ │ │ └── snapshot-navigation.js
│ │ ├── guided_tour
│ │ │ ├── guided-tour-steps.yaml
│ │ │ ├── index.js
│ │ │ └── swh-introjs.css
│ │ ├── origin_visits
│ │ │ ├── index.js
│ │ │ ├── utils.js
│ │ │ ├── visits-calendar.js
│ │ │ ├── visits-histogram.js
│ │ │ ├── visits-reporting.css
│ │ │ └── visits-reporting.js
│ │ └── revision
│ │ │ ├── diff-panel.ejs
│ │ │ ├── diff-utils.js
│ │ │ ├── index.js
│ │ │ ├── log-utils.js
│ │ │ └── revision.css
│ ├── browseurls.py
│ ├── identifiers.py
│ ├── snapshot_context.py
│ ├── templates
│ │ ├── browse-branches.html
│ │ ├── browse-content.html
│ │ ├── browse-directory.html
│ │ ├── browse-help.html
│ │ ├── browse-iframe.html
│ │ ├── browse-origin-visits.html
│ │ ├── browse-release.html
│ │ ├── browse-releases.html
│ │ ├── browse-revision-log.html
│ │ ├── browse-revision.html
│ │ ├── browse-search.html
│ │ ├── browse.html
│ │ └── includes
│ │ │ ├── branch-search.html
│ │ │ ├── breadcrumbs.html
│ │ │ ├── content-display.html
│ │ │ ├── directory-display.html
│ │ │ ├── empty-snapshot.html
│ │ │ ├── origin-search-form.html
│ │ │ ├── readme-display.html
│ │ │ ├── revision-info.html
│ │ │ ├── show-metadata.html
│ │ │ ├── sidetabs.html
│ │ │ ├── snapshot-context.html
│ │ │ └── top-navigation.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── data
│ │ │ └── content_iso-8859-7_encoded
│ │ ├── test_snapshot_context.py
│ │ ├── test_utils.py
│ │ └── views
│ │ │ ├── __init__.py
│ │ │ ├── conftest.py
│ │ │ ├── test_content.py
│ │ │ ├── test_directory.py
│ │ │ ├── test_identifiers.py
│ │ │ ├── test_iframe.py
│ │ │ ├── test_origin.py
│ │ │ ├── test_release.py
│ │ │ ├── test_revision.py
│ │ │ └── test_snapshot.py
│ ├── urls.py
│ ├── utils.py
│ └── views
│ │ ├── __init__.py
│ │ ├── content.py
│ │ ├── directory.py
│ │ ├── iframe.py
│ │ ├── origin.py
│ │ ├── release.py
│ │ ├── revision.py
│ │ └── snapshot.py
│ ├── config.py
│ ├── conftest.py
│ ├── deposit
│ ├── __init__.py
│ ├── assets
│ │ └── index.js
│ ├── templates
│ │ └── deposit-admin.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_views.py
│ └── urls.py
│ ├── gunicorn_config.py
│ ├── inbound_email
│ ├── __init__.py
│ ├── apps.py
│ ├── handle_message.py
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ │ ├── __init__.py
│ │ │ └── process_inbound_email.py
│ ├── signals.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── common_tests.py
│ │ ├── resources
│ │ │ ├── __init__.py
│ │ │ ├── bounce-implicit-dest.eml
│ │ │ ├── multipart_alternative.eml
│ │ │ ├── multipart_alternative_html_only.eml
│ │ │ ├── multipart_alternative_recursive.eml
│ │ │ ├── multipart_alternative_text_only.eml
│ │ │ ├── multipart_iso8859-1.eml
│ │ │ ├── multipart_mixed.eml
│ │ │ ├── multipart_mixed2.eml
│ │ │ ├── multipart_mixed_text_only.eml
│ │ │ ├── multipart_related.eml
│ │ │ └── plaintext.eml
│ │ ├── test_management_command.py
│ │ ├── test_utils.py
│ │ └── test_views.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
│ ├── jslicenses
│ ├── __init__.py
│ ├── templates
│ │ └── jslicenses.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_jslicenses.py
│ └── urls.py
│ ├── mailmap
│ ├── __init__.py
│ ├── apps.py
│ ├── assets
│ │ ├── index.js
│ │ └── mailmap-form.ejs
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ │ ├── __init__.py
│ │ │ ├── sync_mailmaps.py
│ │ │ └── sync_masking_mailmaps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── admin
│ │ │ └── mailmap.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ ├── test_mailmap.py
│ │ ├── test_mailmap_legacy.py
│ │ ├── test_masking_mailmap.py
│ │ └── test_migrations.py
│ ├── urls.py
│ └── views.py
│ ├── manage.py
│ ├── metrics
│ ├── __init__.py
│ ├── prometheus.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ └── test_metrics.py
│ ├── urls.py
│ └── views.py
│ ├── provenance
│ ├── __init__.py
│ ├── api_views.py
│ ├── apps.py
│ ├── tests
│ │ ├── test_api_views.py
│ │ └── test_apps.py
│ └── urls.py
│ ├── py.typed
│ ├── save_bulk
│ ├── __init__.py
│ ├── api_views.py
│ ├── apps.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_alter_savebulkorigin_origin_url.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_api_views.py
│ │ ├── test_migrations.py
│ │ └── test_views.py
│ ├── urls.py
│ └── views.py
│ ├── save_code_now
│ ├── __init__.py
│ ├── admin_views.py
│ ├── api_views.py
│ ├── apps.py
│ ├── assets
│ │ ├── artifact-form-row.ejs
│ │ ├── index.js
│ │ ├── origin-save-admin.js
│ │ └── origin-save.js
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ │ ├── __init__.py
│ │ │ ├── dump_savecodenow_data.py
│ │ │ └── refresh_savecodenow_statuses.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_saveoriginrequest_visit_date.py
│ │ ├── 0003_saveoriginrequest_loading_task_status.py
│ │ ├── 0004_auto_20190204_1324.py
│ │ ├── 0005_remove_duplicated_authorized_origins.py
│ │ ├── 0006_rename_origin_type.py
│ │ ├── 0007_save_request_task_status_fix_typo.py
│ │ ├── 0008_save-code-now_indexes_20210106_1327.py
│ │ ├── 0009_saveoriginrequest_visit_status.py
│ │ ├── 0010_saveoriginrequest_user_id.py
│ │ ├── 0011_saveoriginrequest_user_ids.py
│ │ ├── 0012_saveoriginrequest_note.py
│ │ ├── 0013_saveoriginrequest_webhook_info.py
│ │ ├── 0014_saveoriginrequest_snapshot_swhid.py
│ │ ├── 0015_alter_saveoriginrequest_loading_task_status.py
│ │ ├── 0016_alter_saveoriginrequest_origin_url.py
│ │ └── __init__.py
│ ├── models.py
│ ├── origin_save.py
│ ├── origin_visit_webhook.py
│ ├── templates
│ │ ├── admin
│ │ │ ├── origin-save-common.html
│ │ │ ├── origin-save-filters.html
│ │ │ └── origin-save-requests.html
│ │ ├── includes
│ │ │ └── take-new-snapshot.html
│ │ ├── origin-save-help.html
│ │ ├── origin-save-list.html
│ │ └── origin-save.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_app.py
│ │ ├── test_django_command.py
│ │ ├── test_migrations.py
│ │ ├── test_origin_save.py
│ │ ├── test_origin_save_admin.py
│ │ ├── test_origin_save_api.py
│ │ ├── test_origin_save_views.py
│ │ └── test_origin_visit_webhook.py
│ ├── urls.py
│ └── views.py
│ ├── save_origin_webhooks
│ ├── __init__.py
│ ├── bitbucket.py
│ ├── generic_receiver.py
│ ├── gitea.py
│ ├── github.py
│ ├── gitlab.py
│ ├── sourceforge.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── data
│ │ │ ├── bitbucket_webhook_payload.json
│ │ │ ├── gitea_webhook_payload.json
│ │ │ ├── github_webhook_payload.json
│ │ │ ├── gitlab_webhook_payload.json
│ │ │ ├── https_sourceforge.net
│ │ │ │ ├── rest_p_webhook-test-git
│ │ │ │ ├── rest_p_webhook-test-hg
│ │ │ │ └── rest_p_webhook-test-svn
│ │ │ ├── sourceforge_webhook_payload_git.json
│ │ │ ├── sourceforge_webhook_payload_hg.json
│ │ │ └── sourceforge_webhook_payload_svn.json
│ │ ├── test_app.py
│ │ ├── test_bitbucket.py
│ │ ├── test_gitea.py
│ │ ├── test_github.py
│ │ ├── test_gitlab.py
│ │ ├── test_sourceforge.py
│ │ └── utils.py
│ └── urls.py
│ ├── settings
│ ├── __init__.py
│ ├── common.py
│ ├── cypress.py
│ ├── development.py
│ ├── production.py
│ └── tests.py
│ ├── static
│ ├── img
│ │ ├── arrow-up-small.png
│ │ ├── icons
│ │ │ ├── swh-logo-32x32.png
│ │ │ ├── swh-logo-archive-180x180.png
│ │ │ ├── swh-logo-archive-192x192.png
│ │ │ └── swh-logo-archive-270x270.png
│ │ ├── logos
│ │ │ ├── arch.png
│ │ │ ├── aur.png
│ │ │ ├── bioconductor.png
│ │ │ ├── bitbucket-hg.png
│ │ │ ├── bitbucket.png
│ │ │ ├── bower.png
│ │ │ ├── cgit.png
│ │ │ ├── conda.png
│ │ │ ├── cpan.png
│ │ │ ├── cran.png
│ │ │ ├── crates.png
│ │ │ ├── debian.png
│ │ │ ├── dlang.png
│ │ │ ├── elife.png
│ │ │ ├── gitea.png
│ │ │ ├── github.png
│ │ │ ├── gitlab.png
│ │ │ ├── gitorious.png
│ │ │ ├── gitweb.png
│ │ │ ├── gnu.png
│ │ │ ├── gogs.png
│ │ │ ├── golang.png
│ │ │ ├── googlecode.png
│ │ │ ├── guix.png
│ │ │ ├── hackage.png
│ │ │ ├── hal.png
│ │ │ ├── heptapod.png
│ │ │ ├── inria.jpg
│ │ │ ├── ipol.png
│ │ │ ├── launchpad.png
│ │ │ ├── maven.png
│ │ │ ├── nixos.png
│ │ │ ├── npm.png
│ │ │ ├── opam.png
│ │ │ ├── packagist.png
│ │ │ ├── pagure.png
│ │ │ ├── phabricator.png
│ │ │ ├── pubdev.png
│ │ │ ├── puppet.png
│ │ │ ├── pypi.png
│ │ │ ├── rpm.png
│ │ │ ├── rubygems.png
│ │ │ ├── sourceforge.png
│ │ │ └── zenodo.png
│ │ ├── swh-donor.png
│ │ ├── swh-logo-white.svg
│ │ ├── swh-logo.png
│ │ ├── swh-logo.svg
│ │ ├── swh-mirror.png
│ │ ├── swh-spinner-small.gif
│ │ ├── swh-spinner.gif
│ │ └── swh-vault.png
│ ├── json
│ │ └── highlightjs-languages.json
│ └── xml
│ │ └── swh-opensearch.xml
│ ├── tests
│ ├── __init__.py
│ ├── create_test_admin.py
│ ├── create_test_alter.py
│ ├── create_test_users.py
│ ├── data.py
│ ├── django_asserts.py
│ ├── helpers.py
│ ├── pytest_plugin.py
│ ├── random_fixtures_test.py
│ ├── resources
│ │ ├── contents
│ │ │ ├── code
│ │ │ │ ├── LICENSE
│ │ │ │ ├── extensions
│ │ │ │ │ ├── test.R
│ │ │ │ │ ├── test.abnf
│ │ │ │ │ ├── test.adb
│ │ │ │ │ ├── test.adoc
│ │ │ │ │ ├── test.ahk
│ │ │ │ │ ├── test.aj
│ │ │ │ │ ├── test.applescript
│ │ │ │ │ ├── test.as
│ │ │ │ │ ├── test.au3
│ │ │ │ │ ├── test.awk
│ │ │ │ │ ├── test.bas
│ │ │ │ │ ├── test.bat
│ │ │ │ │ ├── test.bf
│ │ │ │ │ ├── test.bnf
│ │ │ │ │ ├── test.bsl
│ │ │ │ │ ├── test.cal
│ │ │ │ │ ├── test.capnp
│ │ │ │ │ ├── test.ceylon
│ │ │ │ │ ├── test.clj
│ │ │ │ │ ├── test.cls
│ │ │ │ │ ├── test.cmake
│ │ │ │ │ ├── test.coffee
│ │ │ │ │ ├── test.cpp
│ │ │ │ │ ├── test.cr
│ │ │ │ │ ├── test.cs
│ │ │ │ │ ├── test.css
│ │ │ │ │ ├── test.d
│ │ │ │ │ ├── test.dart
│ │ │ │ │ ├── test.dcl
│ │ │ │ │ ├── test.dfm
│ │ │ │ │ ├── test.diff
│ │ │ │ │ ├── test.do
│ │ │ │ │ ├── test.dts
│ │ │ │ │ ├── test.dust
│ │ │ │ │ ├── test.ebnf
│ │ │ │ │ ├── test.elm
│ │ │ │ │ ├── test.ep
│ │ │ │ │ ├── test.erb
│ │ │ │ │ ├── test.erl
│ │ │ │ │ ├── test.ex
│ │ │ │ │ ├── test.f90
│ │ │ │ │ ├── test.feature
│ │ │ │ │ ├── test.flix
│ │ │ │ │ ├── test.fs
│ │ │ │ │ ├── test.gcode
│ │ │ │ │ ├── test.glsl
│ │ │ │ │ ├── test.gml
│ │ │ │ │ ├── test.gms
│ │ │ │ │ ├── test.go
│ │ │ │ │ ├── test.golo
│ │ │ │ │ ├── test.gradle
│ │ │ │ │ ├── test.groovy
│ │ │ │ │ ├── test.gss
│ │ │ │ │ ├── test.haml
│ │ │ │ │ ├── test.hbs
│ │ │ │ │ ├── test.hs
│ │ │ │ │ ├── test.hsp
│ │ │ │ │ ├── test.html
│ │ │ │ │ ├── test.hx
│ │ │ │ │ ├── test.hy
│ │ │ │ │ ├── test.ini
│ │ │ │ │ ├── test.ino
│ │ │ │ │ ├── test.java
│ │ │ │ │ ├── test.jl
│ │ │ │ │ ├── test.js
│ │ │ │ │ ├── test.json
│ │ │ │ │ ├── test.kt
│ │ │ │ │ ├── test.lasso
│ │ │ │ │ ├── test.lc
│ │ │ │ │ ├── test.ldif
│ │ │ │ │ ├── test.leaf
│ │ │ │ │ ├── test.less
│ │ │ │ │ ├── test.lisp
│ │ │ │ │ ├── test.ll
│ │ │ │ │ ├── test.ls
│ │ │ │ │ ├── test.lsl
│ │ │ │ │ ├── test.lua
│ │ │ │ │ ├── test.m
│ │ │ │ │ ├── test.md
│ │ │ │ │ ├── test.mel
│ │ │ │ │ ├── test.mk
│ │ │ │ │ ├── test.ml
│ │ │ │ │ ├── test.moon
│ │ │ │ │ ├── test.nim
│ │ │ │ │ ├── test.nix
│ │ │ │ │ ├── test.nsi
│ │ │ │ │ ├── test.p
│ │ │ │ │ ├── test.pbi
│ │ │ │ │ ├── test.pde
│ │ │ │ │ ├── test.php
│ │ │ │ │ ├── test.pl
│ │ │ │ │ ├── test.pony
│ │ │ │ │ ├── test.pp
│ │ │ │ │ ├── test.properties
│ │ │ │ │ ├── test.proto
│ │ │ │ │ ├── test.ps1
│ │ │ │ │ ├── test.py
│ │ │ │ │ ├── test.q
│ │ │ │ │ ├── test.qml
│ │ │ │ │ ├── test.rb
│ │ │ │ │ ├── test.re
│ │ │ │ │ ├── test.rib
│ │ │ │ │ ├── test.rs
│ │ │ │ │ ├── test.rsc
│ │ │ │ │ ├── test.s
│ │ │ │ │ ├── test.sas
│ │ │ │ │ ├── test.scad
│ │ │ │ │ ├── test.scala
│ │ │ │ │ ├── test.sci
│ │ │ │ │ ├── test.scm
│ │ │ │ │ ├── test.scss
│ │ │ │ │ ├── test.sh
│ │ │ │ │ ├── test.sl
│ │ │ │ │ ├── test.smali
│ │ │ │ │ ├── test.sml
│ │ │ │ │ ├── test.sqf
│ │ │ │ │ ├── test.st
│ │ │ │ │ ├── test.stan
│ │ │ │ │ ├── test.styl
│ │ │ │ │ ├── test.subunit
│ │ │ │ │ ├── test.swift
│ │ │ │ │ ├── test.tap
│ │ │ │ │ ├── test.tcl
│ │ │ │ │ ├── test.tex
│ │ │ │ │ ├── test.thrift
│ │ │ │ │ ├── test.ts
│ │ │ │ │ ├── test.v
│ │ │ │ │ ├── test.vala
│ │ │ │ │ ├── test.vb
│ │ │ │ │ ├── test.vbs
│ │ │ │ │ ├── test.vhd
│ │ │ │ │ ├── test.vim
│ │ │ │ │ ├── test.wl
│ │ │ │ │ ├── test.xml
│ │ │ │ │ ├── test.xqy
│ │ │ │ │ ├── test.yml
│ │ │ │ │ └── test.zep
│ │ │ │ └── filenames
│ │ │ │ │ ├── .htaccess
│ │ │ │ │ ├── CMakeLists.txt
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── access.log
│ │ │ │ │ ├── httpd.conf
│ │ │ │ │ ├── nginx.conf
│ │ │ │ │ ├── nginx.log
│ │ │ │ │ ├── pf.conf
│ │ │ │ │ └── resolv.conf
│ │ │ └── other
│ │ │ │ └── extensions
│ │ │ │ ├── bash-cheatsheet.pdf
│ │ │ │ ├── public.gpg
│ │ │ │ ├── swh-logo.jpeg
│ │ │ │ ├── swh-logo.png
│ │ │ │ ├── swh-logo.webp
│ │ │ │ ├── swh-spinner.gif
│ │ │ │ └── word2vec.ipynb
│ │ └── repos
│ │ │ ├── highlightjs-line-numbers.js.zip
│ │ │ ├── highlightjs-line-numbers.js_visit2.zip
│ │ │ ├── libtess2.zip
│ │ │ ├── repo_with_cff_file.zip
│ │ │ ├── repo_with_metadata_file.zip
│ │ │ └── repo_with_submodules.tgz
│ ├── strategies.py
│ ├── test_create_users.py
│ ├── test_gunicorn_config.py
│ ├── test_random_fixtures.py
│ ├── test_urls.py
│ ├── test_views.py
│ ├── urls.py
│ └── views.py
│ ├── urls.py
│ ├── utils
│ ├── __init__.py
│ ├── archive.py
│ ├── citation.py
│ ├── converters.py
│ ├── exc.py
│ ├── highlightjs.py
│ ├── identifiers.py
│ ├── management
│ │ ├── __init__.py
│ │ └── commands
│ │ │ ├── __init__.py
│ │ │ └── rename_app.py
│ ├── middlewares.py
│ ├── origin_visits.py
│ ├── query.py
│ ├── swh_templatetags.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_archive.py
│ │ ├── test_converters.py
│ │ ├── test_exc.py
│ │ ├── test_highlightjs.py
│ │ ├── test_identifiers.py
│ │ ├── test_metadata.py
│ │ ├── test_middlewares.py
│ │ ├── test_origin_visits.py
│ │ ├── test_query.py
│ │ ├── test_templatetags.py
│ │ ├── test_url_path_converters.py
│ │ └── test_utils.py
│ ├── typing.py
│ ├── url_path_converters.py
│ └── urlsindex.py
│ ├── vault
│ ├── __init__.py
│ ├── api_views.py
│ ├── assets
│ │ ├── index.js
│ │ ├── vault-create-tasks.js
│ │ ├── vault-table-row.ejs
│ │ ├── vault-ui.js
│ │ └── vault.css
│ ├── templates
│ │ ├── includes
│ │ │ ├── vault-common.html
│ │ │ └── vault-create-tasks.html
│ │ └── vault-ui.html
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_apiviews.py
│ │ ├── test_app.py
│ │ └── test_views.py
│ └── urls.py
│ └── webapp
│ ├── __init__.py
│ ├── assets
│ ├── vendors
│ │ ├── _swh-custom.scss
│ │ ├── bootstrap.scss
│ │ ├── datatables.css
│ │ ├── elementsfrompoint-polyfill.js
│ │ └── index.js
│ └── webapp
│ │ ├── breadcrumbs.css
│ │ ├── code-highlighting.js
│ │ ├── heading-anchors.css
│ │ ├── heading-anchors.js
│ │ ├── history-counters.css
│ │ ├── history-counters.js
│ │ ├── index.js
│ │ ├── math-typesetting.js
│ │ ├── notebook-rendering.js
│ │ ├── notebook.css
│ │ ├── pdf-rendering.js
│ │ ├── readme-rendering.js
│ │ ├── sentry.js
│ │ ├── status-widget.css
│ │ ├── status-widget.js
│ │ ├── webapp-utils.js
│ │ ├── webapp.css
│ │ └── xss-filtering.js
│ ├── templates
│ ├── error.html
│ ├── homepage.html
│ ├── includes
│ │ ├── error-base.html
│ │ ├── favicon.html
│ │ ├── footer.html
│ │ ├── global-modals.html
│ │ ├── http-error.html
│ │ ├── masking-error.html
│ │ ├── sidebar.html
│ │ └── top-bar.html
│ ├── layout.html
│ └── masked.html
│ ├── tests
│ ├── __init__.py
│ ├── test_mirror_config.py
│ ├── test_templates.py
│ └── test_views.py
│ └── urls.py
├── tox.ini
└── yarn.lock
/.copier-answers.yml:
--------------------------------------------------------------------------------
1 | # Changes here will be overwritten by Copier
2 | _commit: v0.3.3
3 | _src_path: https://gitlab.softwareheritage.org/swh/devel/swh-py-template.git
4 | description: Software Heritage web UI
5 | distribution_name: swh-web
6 | have_cli: false
7 | have_workers: false
8 | package_root: swh/web
9 | project_name: swh.web
10 | python_minimal_version: '3.7'
11 | readme_format: rst
12 |
--------------------------------------------------------------------------------
/.git-blame-ignore-revs:
--------------------------------------------------------------------------------
1 | # Apply black formatting to Python code and add pre-commit hook
2 | 0503cce23f70d1cca279fd9f4794c1f5df63a325
3 |
4 | # test_origin_save: Fix black formatting
5 | 00cc0c4daef20455144845214f52330063a211c3
6 |
7 | # python: Reformat code with black
8 | f9f5854c3af9fbaa164187c56ba544454041d26e
9 | d7809352485e8dcd96290c424b9c1155087744cc
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.egg-info/
2 | *.pyc
3 | .coverage
4 | .eggs/
5 | .hypothesis
6 | .mypy_cache
7 | .tox
8 | __pycache__
9 | docs/build/
10 | docs/uri-scheme.md
11 | docs/dev-info.md
12 | *.sqlite3*
13 | .directory
14 | node_modules/
15 | swh/web/static/*.*
16 | swh/web/static/js/
17 | swh/web/static/css/
18 | swh/web/static/fonts/
19 | swh/web/static/jssources/
20 | swh/web/static/img/thirdParty/
21 | build/
22 | dist/
23 | package-lock.json
24 | yarn-error.log
25 | cypress/mochawesome/
26 | .nyc_output*/
27 | cypress/accessibility/
28 | cypress/coverage*/
29 | cypress/fixtures/source*.json
30 | cypress/junit/
31 | cypress/downloads/
32 | .eslintcache
33 | # these are symlinks created by a hook in swh-docs' main sphinx conf.py
34 | docs/README.rst
35 | docs/README.md
36 | # this should be a symlink for people who want to build the sphinx doc
37 | # without using tox, generally created by the swh-env/bin/update script
38 | docs/Makefile.sphinx
39 |
--------------------------------------------------------------------------------
/AUTHORS:
--------------------------------------------------------------------------------
1 | Copyright (C) 2015-2019 The Software Heritage developers
2 |
3 | See http://www.softwareheritage.org/ for more information.
4 |
--------------------------------------------------------------------------------
/CONTRIBUTORS:
--------------------------------------------------------------------------------
1 | Anirudh Lakhotia
2 | Daniele Serafini
3 | Ishan Bhanuka
4 | Kalpit Kothari
5 | Katrin Leinweber
6 | Krithik Vaidya
7 | Kumar Shivendu
8 | Mihir Karbelkar
9 | Shankhadeep Dey
10 | Siddharth Ravikumar
11 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | recursive-include swh/web/static *
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | # Makefile driver for SWH Python modules. DO NOT CHANGE.
2 | # You can add custom Makefile rules to Makefile.local
3 |
4 | include ../Makefile.python
5 | -include Makefile.local
6 |
--------------------------------------------------------------------------------
/assets/src/utils/constants.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (C) 2019 The Software Heritage developers
3 | * See the AUTHORS file at the top-level directory of this distribution
4 | * License: GNU Affero General Public License version 3, or any later version
5 | * See top-level LICENSE file for more information
6 | */
7 |
8 | import {staticAsset} from 'utils/functions';
9 |
10 | // Constants defining Bootstrap Breakpoints
11 | export const BREAKPOINT_SM = 768;
12 | export const BREAKPOINT_MD = 992;
13 | export const BREAKPOINT_LG = 1200;
14 |
15 | export const swhSpinnerSrc = staticAsset('img/swh-spinner.gif');
16 |
17 | export const dataTableCommonConfig = {
18 | serverSide: true,
19 | processing: true,
20 | language: {
21 | processing: ``
22 | },
23 | fixedHeader: true,
24 | lengthMenu: [10, 25, 50, 100, 1000],
25 | scrollCollapse: true,
26 | searchDelay: 1000
27 | };
28 |
--------------------------------------------------------------------------------
/assets/src/utils/highlightjs.css:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (C) 2018-2019 The Software Heritage developers
3 | * See the AUTHORS file at the top-level directory of this distribution
4 | * License: GNU Affero General Public License version 3, or any later version
5 | * See top-level LICENSE file for more information
6 | */
7 |
8 | .highlightjs pre {
9 | background-color: transparent;
10 | border-radius: 0;
11 | border-color: transparent;
12 | }
13 |
14 | .hljs {
15 | background-color: transparent;
16 | white-space: pre;
17 | }
18 |
19 | /* for block of numbers */
20 | .hljs-ln-numbers {
21 | cursor: pointer;
22 | user-select: none;
23 | text-align: center;
24 | color: #aaa;
25 | border-right: 1px solid #ccc;
26 | vertical-align: top;
27 | padding-right: 1px !important;
28 | }
29 |
30 | /* for block of code */
31 | .hljs-ln-code {
32 | padding-left: 10px !important;
33 | width: 100%;
34 | }
35 |
--------------------------------------------------------------------------------
/assets/src/utils/mathjax.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (C) 2020 The Software Heritage developers
3 | * See the AUTHORS file at the top-level directory of this distribution
4 | * License: GNU Affero General Public License version 3, or any later version
5 | * See top-level LICENSE file for more information
6 | */
7 |
8 | export * from 'mathjax/es5/tex-mml-chtml';
9 |
--------------------------------------------------------------------------------
/assets/src/utils/org.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (C) 2018 The Software Heritage developers
3 | * See the AUTHORS file at the top-level directory of this distribution
4 | * License: GNU Affero General Public License version 3, or any later version
5 | * See top-level LICENSE file for more information
6 | */
7 |
8 | // org-js chunk that will be lazily loaded
9 |
10 | import './org.css';
11 | export * from 'org';
12 |
--------------------------------------------------------------------------------
/assets/src/utils/requests-filter-checkbox.ejs:
--------------------------------------------------------------------------------
1 | <%#
2 | Copyright (C) 2022 The Software Heritage developers
3 | See the AUTHORS file at the top-level directory of this distribution
4 | License: GNU Affero General Public License version 3, or any later version
5 | See top-level LICENSE file for more information
6 | %>
7 |
4 | [mirror partner] has provided this mirror as part of their commitment 5 | to preserving and promoting open-source software, allowing the Software 6 | Heritage international network of mirrors to ensure accessibility and 7 | preservation of such software for future generations. 8 |
9 |Submission date | 19 |Forge type | 20 |Forge URL | 21 |Status | 22 |23 | |
---|
11 |21 | -------------------------------------------------------------------------------- /swh/web/browse/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/browse/tests/__init__.py -------------------------------------------------------------------------------- /swh/web/browse/tests/data/content_iso-8859-7_encoded: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/browse/tests/data/content_iso-8859-7_encoded -------------------------------------------------------------------------------- /swh/web/browse/tests/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/browse/tests/views/__init__.py -------------------------------------------------------------------------------- /swh/web/browse/tests/views/conftest.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 The Software Heritage developers 2 | # See the AUTHORS file at the top-level directory of this distribution 3 | # License: GNU Affero General Public License version 3, or any later version 4 | # See top-level LICENSE file for more information 5 | 6 | import pytest 7 | 8 | 9 | @pytest.fixture 10 | def make_masked_object_exception(): 11 | def _masked_object_exception(swhid_str: str): 12 | from uuid import UUID 13 | 14 | from swh.model.swhids import ExtendedSWHID 15 | from swh.storage.exc import MaskedObjectException 16 | from swh.storage.proxies.masking.db import MaskedState, MaskedStatus 17 | 18 | swhid = ExtendedSWHID.from_string(swhid_str) 19 | status = MaskedStatus( 20 | state=MaskedState.DECISION_PENDING, 21 | request=UUID("da785a27-7e59-4a35-b82a-a5ae3714407c"), 22 | ) 23 | return MaskedObjectException({swhid: [status]}) 24 | 25 | return _masked_object_exception 26 | -------------------------------------------------------------------------------- /swh/web/browse/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/browse/views/__init__.py -------------------------------------------------------------------------------- /swh/web/deposit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/deposit/__init__.py -------------------------------------------------------------------------------- /swh/web/deposit/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/deposit/tests/__init__.py -------------------------------------------------------------------------------- /swh/web/gunicorn_config.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2019-2020 The Software Heritage developers 2 | # See the AUTHORS file at the top-level directory of this distribution 3 | # License: GNU General Public License version 3, or any later version 4 | # See top-level LICENSE file for more information 5 | 6 | from sentry_sdk.integrations.django import DjangoIntegration 7 | 8 | from swh.core.sentry import init_sentry 9 | 10 | 11 | def post_fork(server, worker): 12 | init_sentry(sentry_dsn=None, integrations=[DjangoIntegration()]) 13 | -------------------------------------------------------------------------------- /swh/web/inbound_email/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2022 The Software Heritage developers 2 | # See the AUTHORS file at the top-level directory of this distribution 3 | # License: GNU Affero General Public License version 3, or any later version 4 | # See top-level LICENSE file for more information 5 | 6 | default_app_config = "swh.web.inbound_email.apps.InboundEmailConfig" 7 | -------------------------------------------------------------------------------- /swh/web/inbound_email/apps.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2022 The Software Heritage developers 2 | # See the AUTHORS file at the top-level directory of this distribution 3 | # License: GNU Affero General Public License version 3, or any later version 4 | # See top-level LICENSE file for more information 5 | 6 | from django.apps import AppConfig 7 | 8 | 9 | class InboundEmailConfig(AppConfig): 10 | default_auto_field = "django.db.models.BigAutoField" 11 | name = "swh.web.inbound_email" 12 | -------------------------------------------------------------------------------- /swh/web/inbound_email/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/inbound_email/management/__init__.py -------------------------------------------------------------------------------- /swh/web/inbound_email/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/inbound_email/management/commands/__init__.py -------------------------------------------------------------------------------- /swh/web/inbound_email/management/commands/process_inbound_email.py: -------------------------------------------------------------------------------- 1 | # Copyright (C) 2024 The Software Heritage developers 2 | # See the AUTHORS file at the top-level directory of this distribution 3 | # License: GNU Affero General Public License version 3, or any later version 4 | # See top-level LICENSE file for more information 5 | 6 | import sys 7 | 8 | from django.core.management.base import BaseCommand 9 | 10 | from ...handle_message import MessageHandler 11 | 12 | 13 | class Command(BaseCommand): 14 | help = "Process a new inbound email" 15 | 16 | def handle(self, *args, **options): 17 | MessageHandler( 18 | raw_message=sys.stdin.buffer.read(), sender=self.__class__ 19 | ).handle() 20 | -------------------------------------------------------------------------------- /swh/web/inbound_email/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/inbound_email/tests/__init__.py -------------------------------------------------------------------------------- /swh/web/inbound_email/tests/resources/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SoftwareHeritage/swh-web/280a2c3b72fb20d5eb4ee605ff05050db10f98b5/swh/web/inbound_email/tests/resources/__init__.py -------------------------------------------------------------------------------- /swh/web/inbound_email/tests/resources/multipart_alternative_text_only.eml: -------------------------------------------------------------------------------- 1 | Return-Path:12 | {% if snapshot_context and snapshot_context.origin_info %} 13 |
14 | The snapshot associated to the visit of origin {{ snapshot_context.origin_info.url }} 15 | on {{ snapshot_context.timestamp }} is empty ! 16 |
17 | {% else %} 18 |The snapshot is empty !
19 | {% endif %} 20 |
<%= link_to post.title, post %>
5 | <% end %> 6 | 7 | <%- available_things = things.select(&:available?) -%> 8 | <%%- x = 1 + 2 -%%> 9 | <%% value = 'real string #{@value}' %%> 10 | <%%= available_things.inspect %%> 11 | -------------------------------------------------------------------------------- /swh/web/tests/resources/contents/code/extensions/test.f90: -------------------------------------------------------------------------------- 1 | subroutine test_sub(k) 2 | implicit none 3 | 4 | !=============================== 5 | ! This is a test subroutine 6 | !=============================== 7 | 8 | integer, intent(in) :: k 9 | double precision, allocatable :: a(:) 10 | integer, parameter :: nmax=10 11 | integer :: i 12 | 13 | allocate (a(nmax)) 14 | 15 | do i=1,nmax 16 | a(i) = dble(i)*5.d0 17 | enddo 18 | 19 | print *, 'Hello world' 20 | write (*,*) a(:) 21 | 22 | end subroutine test_sub 23 | -------------------------------------------------------------------------------- /swh/web/tests/resources/contents/code/extensions/test.feature: -------------------------------------------------------------------------------- 1 | # language: en 2 | Feature: Addition 3 | In order to avoid silly mistakes 4 | As a math idiot 5 | I want to be told the sum of two numbers 6 | 7 | @this_is_a_tag 8 | Scenario Outline: Add two numbers 9 | * I have a calculator 10 | Given I have entered