{% 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 %}{% if section != Section::General %}{{ section.title() }} · {% endif %}Settings · {{ repo.owner }}/{{ repo.name }}{% endblock %} {% block bodyattrs %} data-repo="{{ repo.url }}"{% endblock %} {% block tabs %}{% call m::tabs(repo, "settings") %}{% endblock %} {% block content %}
{{ n }}
{% endif %} {% if let Some(e) = error %}{{ e }}
{% endif %} {% match section %} {% when Section::General %} {% when Section::Landing %} {% when Section::PushProtection %}A push that adds what looks like a credential (cloud keys, tokens, private keys) is refused before any of it is stored, naming the file, line and a fingerprint for each. Only what a push adds is scanned, up to a budget; the push log says when a large push was not scanned in full. What the repository already holds is scanned in the background (Found in history, below).
No refused push is waiting on a decision.
{% else %}From refused pushes, newest first. Allow a finding only when it is not a real secret (an example key, a test fixture): a push adding that same value then passes.
| When | Who | Where | What | Fingerprint | Allow, because… |
|---|---|---|---|---|---|
| {% if f.pusher.is_empty() %}anonymous{% else %}{{ f.pusher }}{% endif %}{% if !f.via.is_empty() %} via {{ f.via }}{% endif %} | {{ f.path }}:{{ f.line }} | {{ f.description }}{{ f.excerpt }} | {{ f.fingerprint }} |
Every change reachable from this repository's bookmarks is scanned with the same rules in the background, a budget at a time: its whole history once, then what each push adds.
{% if !history_scan_on %}The history scan is off on this hub (history_scan_limit = 0 under [limits]).
{% else if !row.push_protection %}History is not scanned while push protection is off.
{% else if let Some(s) = history_scan %}{% if s.requested_ms.is_some() && s.target_heads.is_empty() %}A scan of the whole history is waiting to start.{% else if !s.target_heads.is_empty() %}Scanning: {{ s.position }} of {{ s.pending }} changes{% if s.requested_ms.is_some() %} (asked for){% endif %}.{% else if let Some(t) = s.finished_ms %}Scanned up to the bookmarks .{% else %}Scanned up to the bookmarks.{% endif %} {{ s.changes }} changes ({{ s.bytes|bytes }}) scanned in all.{% if !s.error.is_empty() %} The last pass failed: {{ s.error }}{% endif %}
{% else %}Not scanned yet: the scan reaches every repository soon after the hub starts.{% endif %}
Nothing open: no possible secret was found in history, or each was allowed or resolved.
{% else %}Values already in history: removing them from the files now leaves them in every earlier change, so a real one must be revoked or rotated, then marked resolved, with how. One that is not a secret (an example key, a test fixture) can be allowed instead, as for a push.
| Where | What | Fingerprint | Found | Allow, because… | Resolved, because… |
|---|---|---|---|---|---|
| {{ f.path }}:{{ f.line }}{% if !f.change_hash.is_empty() %} in {{ f.change_hash|short }}{% endif %}{% if !f.bookmark.is_empty() %} on {{ f.bookmark }}{% endif %} | {{ f.description }}{{ f.excerpt }} | {{ f.fingerprint }} |
| Where | What | Fingerprint | How | By | When |
|---|---|---|---|---|---|
| {{ f.path }}:{{ f.line }}{% if !f.change_hash.is_empty() %} {{ f.change_hash|short }}{% endif %} | {{ f.description }} | {{ f.fingerprint }} | {{ f.resolved_reason }} | {{ f.resolved_by }} | {% if let Some(t) = f.resolved_ms %}{% endif %} |
| Fingerprint | Rule | Reason | By | When | |
|---|---|---|---|---|---|
{{ b.fingerprint }} | {{ b.rule }} | {{ b.reason }} | {{ b.by_name }} |
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 %}| Runner | Status | Serves | Machine | |
|---|---|---|---|---|
| {{ r.name }} | {{ r.status() }} | {{ serves }} | {% if r.arch.is_empty() %}unknown{% else %}{{ r.arch }} · {{ r.os }}{% endif %} | {% if *own %}{% endif %} |
This repository's data lives in {{ st.url }}, your bucket. This server keeps a cache and the credentials, sealed.
Nobody beyond the owner{% if !teams.is_empty() %} and the organisation's members{% endif %}.
{% else %}| {% if let Some(a) = c.account %}{{ a.username }}{% else if let Some(t) = c.team %}team {{ t.name }}{% endif %} | {{ c.role }} |
Settings that change what this repository is. Each asks you to confirm; none can be undone from here except archiving.
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.
{% 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 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 %}
The repository moves to the trash and is removed after the retention period.