1 Repositories and Priority
Anagnostakis Ioannis edited this page 2026-06-25 03:12:30 +03:00

Repositories and Priority

This is slacker's defining idea, and the thing that sets it apart from a plain mirror tool: every repository lives in one priority-ordered model, and priority is never silently violated.


The priority rule

When the same package name is offered by several repositories, the one from the highest-priority repository wins. More importantly:

An installed package is never silently migrated to a different repository, and never downgraded. A candidate is proposed only from a repository of higher or equal priority. The single exception is an explicit repo:name pin.

So giving a repository a distinct, high priority locks its packages: nothing from a lower repo can replace them, even with a newer version number.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#161b22','primaryBorderColor':'#1f6feb','primaryTextColor':'#e6edf3','lineColor':'#6e7781','fontFamily':'monospace'}}}%%
flowchart TB
  I["installed package<br/>(its build tag = its source)"] --> D{"candidate repo's priority<br/>vs the installed source"}
  D -->|higher or equal| U["may upgrade / replace"]
  D -->|lower| K["kept — never downgraded<br/>never migrated"]
  PIN["repo:name pin"] -. "forces a repo,<br/>overriding priority" .-> U
  classDef grey fill:#0d1117,stroke:#6e7781,color:#8b949e;
  classDef blue fill:#0d1117,stroke:#1f6feb,color:#e6edf3;
  classDef green fill:#0d1117,stroke:#2ea043,color:#e6edf3;
  class I,PIN grey
  class D blue
  class U green
  class K grey

How does slacker know an installed package's "source" without a database? From its build tag — the build field minus the leading digits (1_SBo_SBo, 7cfcf, 1 → official). A user tag-priority line, or the highest-priority binary repo that ships that tag (cf → conraid, alien → alienbob, auto-detected), decides its owning priority.


The repos file

# priority  name        url|mirror|mirror/<subpath>                          [flags]
100         slackware   mirror                                                official
91          testing     mirror/testing                                        subtree immutable
90          extras      mirror/extra                                          subtree immutable
80          conraid     https://slackers.it/repository/slackware64-current    immutable
60          alienbob    https://slackware.nl/people/alien/sbrepos/current/x86_64
# tag-priority lines (may share a priority):
100         SBo         _SBo
100         local       _rtz

The URL field

Form Meaning
a literal URL https://, http://, or file:// (the last for a local clone / NFS / mounted media — three slashes for an absolute path)
mirror the active line from mirrors, as-is — use it for the official repo
mirror/<subpath> the active mirror with a subpath appended (mirror/extra, mirror/testing, mirror/patches) — a subtree that follows whichever mirror you picked

A URL points at the repo root containing PACKAGES.TXT; for official mirrors, MANIFEST.bz2 lives in a per-arch subdir slacker finds automatically.

The flags

Flag What it does
official Marks the tracked repo: it powers show-changelog and is the default for install-new. Placement is still by priority only — the official repo can sit anywhere.
immutable Every package attributed to this repo is kept out of clean-system. Use it for extra/testing/patches you keep installed, instead of blacklisting each one.
subtree This URL is a Slackware distribution subtree (extra, patches, testing, pasture). Their PACKAGES.TXT lists package locations relative to the distribution root, so packages and GPG-KEY are fetched from the parent (root) URL while metadata comes from the URL itself. Without it, those packages 404 with a doubled path segment. The four subtrees must always carry this flag.
verify=... Per-repo verification override (see Security).

mirror/extra + subtree are a pair. mirror/extra resolves the URL; subtree fixes how packages and the key are fetched from it.


Pinning and selectors

A PATTERN on the command line may be:

Form Matches
firefox exact package name
python a name substring — all python-*
kde a Slackware series (a, ap, d, k, kde, l, n, t, x, xap, xfce, y, …) — that series only, never substrings
repo:name a pin — force one repository regardless of priority (e.g. alienbob:vlc)
@repo a set selector — every package in that repo (install @gnome, remove @gnome)
@_tag every package with that build tag (remove @_SBo)

The @ is required, so a bare word is never mistaken for a repo. An unknown @repo/@_tag gives a "did you mean" suggestion and lists the available repos and tags.

When a pattern matches more than one package, install/upgrade/reinstall/ remove show a numbered list — Enter for all, numbers/ranges like 1 3 5 or 2-4, n to cancel.


Managing repos from the CLI

slacker add-repo  85 ktown https://slackware.nl/people/alien/ktown/current/x86_64
slacker add-repo  90 extras mirror/extra subtree immutable
slacker del-repo  ktown
slacker add-tag   100 SBo _SBo
slacker del-tag   _SBo
slacker list-repos          # priority, verify, flags, installed counts

add-repo validates the line and, on confirmation, fetches and vets the repo (see Security).