Sync a declarative package list with the pacman package manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

3.8 KiB

ADDED Requirements

Requirement: Batch package resolution from local, sync, and AUR databases

The system SHALL resolve packages in a single pass through local DB → sync DBs → AUR using batch operations to minimize subprocess/API calls.

Scenario: Package exists in local DB

  • WHEN a package from collected state exists in the local database
  • THEN the system SHALL mark it as found, set Installed=true, and exclude it from AUR queries

Scenario: Package exists in sync DB

  • WHEN a package from collected state does NOT exist in local DB but exists in ANY enabled sync database
  • THEN the system SHALL mark it as found, set Installed=false, and exclude it from AUR queries

Scenario: Package exists only in AUR

  • WHEN a package from collected state does NOT exist in local or sync databases but exists in AUR
  • THEN the system SHALL mark it as found with InAUR=true, set Installed=false, and use the cached AUR info

Scenario: Package not found anywhere

  • WHEN a package from collected state is NOT in local DB, NOT in any sync DB, and NOT in AUR
  • THEN the system SHALL return an error listing the unfound package(s)

Scenario: Batch AUR query

  • WHEN multiple packages need AUR lookup
  • THEN the system SHALL make a SINGLE HTTP request to AUR RPC with all package names (existing behavior preserved)

Requirement: Efficient local DB lookup using dyalpm

The system SHALL use dyalpm's PkgCache() iterator to build a lookup map in O(n) time, where n is total packages in local DB, instead of O(n*m) subprocess calls.

Scenario: Build local package map

  • WHEN initializing package resolution
  • THEN the system SHALL iterate localDB.PkgCache() once and store all package names in a map for O(1) lookups

Scenario: Check package in local map

  • WHEN checking if a package exists in local DB
  • THEN the system SHALL perform an O(1) map lookup instead of spawning a subprocess

Requirement: Efficient sync DB lookup using dyalpm

The system SHALL use each sync DB's PkgCache() iterator to check packages across all enabled repositories.

Scenario: Check package in sync DBs

  • WHEN a package is not found in local DB
  • THEN the system SHALL check all enabled sync databases using their iterators

Scenario: Package found in multiple sync repos

  • WHEN a package exists in more than one sync repository (e.g., core and community)
  • THEN the system SHALL use the first match found

Requirement: Track installed status in PackageInfo

The system SHALL include an Installed bool field in PackageInfo to indicate whether the package is currently installed.

Scenario: Package is installed

  • WHEN a package exists in the local database
  • THEN PackageInfo.Installed SHALL be true

Scenario: Package is not installed

  • WHEN a package exists only in sync DB or AUR (not in local DB)
  • THEN PackageInfo.Installed SHALL be false

Requirement: Mark installed packages as deps, then state packages as explicit

After package sync completes, the system SHALL mark all installed packages as dependencies, then override the collected state packages to be explicit. This avoids diffing before/after states.

Scenario: Mark all installed as deps

  • WHEN package sync has completed (non-dry-run)
  • THEN the system SHALL run pacman -D --asdeps to mark ALL currently installed packages as dependencies

Scenario: Override state packages to explicit

  • WHEN all installed packages have been marked as deps
  • THEN the system SHALL run pacman -D --asexplicit on the collected state packages, overriding their dependency status

Scenario: Dry-run skips marking

  • WHEN operating in dry-run mode
  • THEN the system SHALL NOT execute any pacman -D marking operations