{% extends "base.html" %} {% import "webhooks_panel.html" as w %} {% import "assistants_panel.html" as ai %} {% import "variables_panel.html" as va %} {% import "secrets_panel.html" as se %} {% import "repo_tabs.html" as m %} {% block title %}Settings · {{ repo.owner }}/{{ repo.name }}{% endblock %} {% block bodyattrs %} data-repo="{{ repo.url }}"{% endblock %} {% block tabs %}{% call m::tabs(repo, "settings") %}{% endblock %} {% block content %}

Settings {{ repo.owner }}/{{ repo.name }}

{% if let Some(n) = notice %}

{{ n }}

{% endif %} {% if let Some(e) = error %}

{{ e }}

{% endif %}

General

Separated by spaces or commas; letters, digits and dashes. People find repositories by them under Explore.

Landing requirements

Git mirror

For tools that only speak Git (CI runners, IDEs): git clone {{ shell.base_url }}{{ repo.url }}.git. Private repositories take a personal access token as the password. Pushing to the mirror is refused.{% if row.git_mirror && !row.git_mirror_state.is_empty() %} Last exported state {{ row.git_mirror_state|short }}.{% endif %}

Required checks

Any token with checks:write reports checks with POST {{ shell.base_url }}/api/v1/repos/{{ repo.owner }}/{{ repo.name }}/checks.

OxygenFlow

Pushes to this repository {% if flow_enabled %}start runs{% else %}do not start runs{% endif %} of its .flow/pipeline.kdl.

{% if site_admin %}

Runs use the site's runners, so only site administrators change this. It takes effect at the next push.

{% else %}

A site administrator turns OxygenFlow on or off here.

{% endif %}
{% if role == crate::auth::Role::Admin %}

Coverage

A job's coverage artifact (LCOV) gives each run a coverage check, measured against {{ row.default_bookmark }}. Without rules it only reports; with them it fails when they are broken, and a required check named coverage then holds a proposal back.

Runners

The OxygenFlow runners that may take this repository's jobs: the site's, {{ row.owner }}'s, and this repository's own.

{% if let Some(t) = runner_token %}

Register a runner for this repository with:

flow runner register {{ shell.base_url }} --token {{ t }} --name NAME
{% endif %} {% if runners.is_empty() %}

None yet: runs wait until a runner that serves this repository is added.

{% else %}
{% for (r, serves, own) in runners %}{% endfor %}
RunnerStatusServesMachine
{{ r.name }}{{ r.status() }}{{ serves }}{% if r.arch.is_empty() %}unknown{% else %}{{ r.arch }} · {{ r.os }}{% endif %} {% if *own %}
{% endif %}
{% endif %}
{% call w::panel(repo.url ~ "/settings", hooks, shell.csrf, "Each delivery is signed with the secret (X-Oxyhub-Signature) and retried with backoff for a day.") %} {% call va::panel(repo.url ~ "/settings", variables, shell.csrf, "This repository's jobs get these, beside the ones the site and its owner set.") %} {% call se::panel(repo.url ~ "/settings", secrets, shell.csrf, "This repository's jobs may use these, beside the ones the site and its owner set.") %} {% call ai::panel(repo.url ~ "/settings", assistants, shell.csrf, "This repository may ask these, beside the ones the site and its owner provide.") %} {% if role == crate::auth::Role::Admin %}{% if let Some(st) = storage %}

Storage

This repository's data lives in {{ st.url }}, your bucket. This server keeps a cache and the credentials, sealed.

Since
Last check
{% if let Some(t) = st.checked_ms %}: {{ st.check_result }}{% else %}never{% endif %}
Replace the credentials

The new credentials must pass the check before they replace the old ones. Fill the fields for your provider.

{% if st.url.starts_with("s3://") %}
{% else if st.url.starts_with("gs://") %}{% else %}
{% endif %}
{% endif %}{% endif %}

Collaborators

{% if collaborators.is_empty() %}

Nobody beyond the owner{% if !teams.is_empty() %} and the organisation's members{% endif %}.

{% else %} {% for c in collaborators %} {% endfor %}
{% if let Some(a) = c.account %}{{ a.username }}{% else if let Some(t) = c.team %}team {{ t.name }}{% endif %}{{ c.role }}
{% if let Some(a) = c.account %}{% else if let Some(t) = c.team %}{% endif %}
{% endif %}
{% if !teams.is_empty() %}
{% endif %}

Advanced

Settings that change what this repository is. Each asks you to confirm; none can be undone from here except archiving.

Transfer ownership

Move this repository to a user or an organisation you may create repositories under. Its address changes to /OWNER/{{ repo.name }}; the old address redirects, and oxy remotes keep working.

Transfer
{% if row.archived %}Bring this repository back{% else %}Archive this repository{% endif %}

{% if row.archived %}It is archived: read-only for everyone, shown with a badge.{% if !row.archived_reason.is_empty() %} Reason: {{ row.archived_reason }}{% endif %}{% else %}Read-only for everyone, including you: no pushes, edits, issues, proposals or comments, until an admin brings it back. Say why, for whoever finds it later.{% endif %}

{% if row.archived %}Unarchive{% else %}Archive{% endif %}
{% if row.archived %}{% else %} {% endif %}
Delete wiki data

{% if repo.wiki %}The wiki's repository moves to the trash with its history; a new first page starts a fresh one.{% else %}This repository has no wiki.{% endif %}

{% if repo.wiki %}
Delete wiki data
{% else %}{% endif %}
Delete this repository

The repository moves to the trash and is removed after the retention period.

Delete
{% endif %}
{% endblock %}