{% 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 %}

Diffusion

When a repository this one pins as a subrepo moves on, Diffusion opens a proposal here that moves the pin, tested by this repository's own pipeline, with the upstream's changes listed. By default it never lands anything by itself.

Landing

An untested (amber) upstream always waits for a person. A landing by Diffusion still needs this repository's required checks and approvals, and a trust policy that lets the hub's key move the bookmark; otherwise the bump waits, and its timeline says why.

A subrepo's .oxymodules entry overrides this with follow = green, any or off; land = auto or propose overrides the landing, target names the bookmark to move (else the one this repository's proposals land on) and watch lists paths whose upstream changes are flagged.

{% 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 %}