completions/apt-get.ps1

<#
 # apt-get completion
 #>

Import-Module NativeCommandCompleter.psm -ErrorAction SilentlyContinue

$msg = data { ConvertFrom-StringData @'
    apt_get = APT package handling utility - command-line interface
    update = Retrieve new lists of packages
    upgrade = Perform an upgrade
    distUpgrade = Distribution upgrade
    dselectUpgrade = Follow dselect selections
    install = Install new packages
    reinstall = Reinstall packages
    remove = Remove packages
    purge = Remove packages and config files
    source = Download source archives
    buildDep = Configure build-dependencies for source packages
    satisfy = Satisfy dependency strings
    check = Verify that there are no broken dependencies
    download = Download the binary package into the current directory
    clean = Erase downloaded archive files
    autoclean = Erase old downloaded archive files
    autoremove = Remove automatically all unused packages
    changelog = Download and display the changelog for the given package
    indextargets = List index targets
    help = Display help
    version = Show version
    configFile = Specify a configuration file
    option = Set a configuration option
    assumeYes = Automatic yes to prompts
    assumeNo = Automatic no to prompts
    noInstallRecommends = Do not install recommended packages
    installSuggests = Install suggested packages
    downloadOnly = Download only - do NOT install or unpack archives
    fixBroken = Fix broken dependencies
    fixMissing = Fix missing packages
    noDownload = Disable downloading of packages
    quiet = Produce output suitable for logging
    simulate = Perform a simulation of events
    showUpgraded = Show upgraded packages
    verboseVersions = Show full versions for upgraded packages
    hostArchitecture = Set host architecture
    buildProfiles = Specify build profiles
    compile = Compile source packages after downloading them
    ignoreHold = Ignore package holds
    withNewPkgs = Upgrade with new packages
    noUpgrade = Do not upgrade packages
    onlyUpgrade = Do not install new packages
    allowDowngrades = Allow downgrades
    allowRemoveEssential = Allow removing essential packages
    allowChangeHeldPackages = Allow changing held packages
    forceYes = Force yes (deprecated)
    printUris = Print the URIs of files to install
    purgeRemove = Use purge instead of remove
    reinstallOption = Reinstall packages that are already installed
    listCleanup = Erase obsolete files from /var/lib/apt/lists
    targetRelease = Control default input for policy engine
    trivialOnly = Only perform operations that are trivial
    noRemove = Abort if any packages are to be removed
    opt_autoRemove = Remove automatically unused packages
    onlySource = Only download source packages
    diffOnly = Download only the diff file
    dscOnly = Download only the dsc file
    tarOnly = Download only the tar file
    archOnly = Only process architecture-dependent build-dependencies
    indepOnly = Only process architecture-independent build-dependencies
    allowUnauthenticated = Allow unauthenticated packages
    noAllowInsecureRepositories = Disallow insecure repositories
    allowReleaseinfoChange = Allow repository changes
    showProgress = Show progress information
    withSource = Include source URIs in print-uris output
    errorOn = Set error conditions
    markAuto = Mark automatically installed packages
    markManual = Mark manually installed packages
    solver = Use given dependency solver
'@
 }
Import-LocalizedData -BindingVariable localizedMessages -ErrorAction SilentlyContinue;
foreach ($key in $localizedMessages.Keys) { $msg[$key] = $localizedMessages[$key] }

$installedPackageCompleter = {
    if ([string]::IsNullOrWhiteSpace($wordToComplete) -or $wordToComplete.Length -lt 2) { return $null }
    if (-not (Test-Path -LiteralPath '/var/lib/dpkg/status')) { return $null }
    $q = "*${wordToComplete}*"
    $table = @{};
    $pkg = "";
    $installed = $false;
    Get-Content -LiteralPath '/var/lib/dpkg/status' | ForEach-Object {
        switch -Regex ($_) {
            '^Package: (.*)$' { $pkg = $Matches[1] }
            '^Status: ' { $installed = $_ -match '\binstalled\b' }
            '^Description-?[a-zA-Z_]*: (.*)$' {
                if ($installed -and -not [string]::IsNullOrEmpty($pkg) -and $pkg -like $q ) {
                    $table.Add($pkg, $Matches[1]);
                }
            }
        }
    }
    foreach ($k in $table.Keys) {
        "{0}`t{1}" -f $k, $table[$k]
    }
}

$packageCompleter = {
    if ([string]::IsNullOrWhiteSpace($wordToComplete) -or $wordToComplete.Length -lt 2) { return }
    $q = ".*${wordToComplete}.*"
    try {
        $table = @{}
        $pkg = ""
        apt-cache --no-generate show $q |
            ForEach-Object -Process {
                switch -Regex ($_) {
                    '^Package: (.*)$' {
                        $pkg = $Matches[1]
                    }
                    '^Description-?[a-zA-Z_]*: (.*)$' {
                        if (-not [string]::IsNullOrEmpty($pkg) -and -not $table.ContainsKey($pkg)) {
                            $table.Add($pkg, $Matches[1]);
                        }
                    }
                }
                # Limit to 200 items
                if ($table.Count -gt 200) { break; }
            }
        foreach ($k in $table.Keys) {
            "{0}`t{1}" -f $k, $table[$k]
        }
    } catch {}
}

Register-NativeCompleter -Name apt-get -Description $msg.apt_get -SubCommands @(
    New-CommandCompleter -Name update -Description $msg.update -NoFileCompletions
    New-CommandCompleter -Name upgrade -Description $msg.upgrade -NoFileCompletions
    New-CommandCompleter -Name dist-upgrade -Description $msg.distUpgrade -NoFileCompletions
    New-CommandCompleter -Name dselect-upgrade -Description $msg.dselectUpgrade
    New-CommandCompleter -Name install -Description $msg.install -ArgumentCompleter $packageCompleter
    New-CommandCompleter -Name reinstall -Description $msg.reinstall -ArgumentCompleter $installedPackageCompleter
    New-CommandCompleter -Name remove -Description $msg.remove -ArgumentCompleter $installedPackageCompleter
    New-CommandCompleter -Name purge -Description $msg.purge -ArgumentCompleter $installedPackageCompleter
    New-CommandCompleter -Name source -Description $msg.source -ArgumentCompleter $packageCompleter
    New-CommandCompleter -Name build-dep -Description $msg.buildDep -ArgumentCompleter $installedPackageCompleter
    New-CommandCompleter -Name satisfy -Description $msg.satisfy
    New-CommandCompleter -Name check -Description $msg.check
    New-CommandCompleter -Name download -Description $msg.download -ArgumentCompleter $packageCompleter
    New-CommandCompleter -Name clean -Description $msg.clean
    New-CommandCompleter -Name autoclean -Description $msg.autoclean
    New-CommandCompleter -Name autoremove -Description $msg.autoremove
    New-CommandCompleter -Name changelog -Description $msg.changelog -ArgumentCompleter $packageCompleter
    New-CommandCompleter -Name indextargets -Description $msg.indextargets
) -Parameters @(
    New-ParamCompleter -ShortName h -LongName help -Description $msg.help
    New-ParamCompleter -ShortName v -LongName version -Description $msg.version
    New-ParamCompleter -ShortName c -LongName config-file -Description $msg.configFile -Type File
    New-ParamCompleter -ShortName o -LongName option -Description $msg.option -Type Required
    New-ParamCompleter -ShortName y -LongName yes, assume-yes -Description $msg.assumeYes
    New-ParamCompleter -LongName assume-no -Description $msg.assumeNo
    New-ParamCompleter -LongName no-install-recommends -Description $msg.noInstallRecommends
    New-ParamCompleter -LongName install-suggests -Description $msg.installSuggests
    New-ParamCompleter -ShortName d -LongName download-only -Description $msg.downloadOnly
    New-ParamCompleter -ShortName f -LongName fix-broken -Description $msg.fixBroken
    New-ParamCompleter -ShortName m -LongName fix-missing, ignore-missing -Description $msg.fixMissing
    New-ParamCompleter -LongName no-download -Description $msg.noDownload
    New-ParamCompleter -ShortName q -LongName quiet -Description $msg.quiet
    New-ParamCompleter -ShortName s -LongName simulate,just-print,dry-run,recon,no-act -Description $msg.simulate
    New-ParamCompleter -LongName show-upgraded -Description $msg.showUpgraded
    New-ParamCompleter -ShortName V -LongName verbose-versions -Description $msg.verboseVersions
    New-ParamCompleter -ShortName a -LongName host-architecture -Description $msg.hostArchitecture -Type Required -VariableName 'architecture'
    New-ParamCompleter -ShortName P -LongName build-profiles -Description $msg.buildProfiles -Type Required -VariableName 'profiles'
    New-ParamCompleter -ShortName b -LongName compile,build -Description $msg.compile
    New-ParamCompleter -LongName ignore-hold -Description $msg.ignoreHold
    New-ParamCompleter -LongName with-new-pkgs -Description $msg.withNewPkgs
    New-ParamCompleter -LongName no-upgrade -Description $msg.noUpgrade
    New-ParamCompleter -LongName only-upgrade -Description $msg.onlyUpgrade
    New-ParamCompleter -LongName allow-downgrades -Description $msg.allowDowngrades
    New-ParamCompleter -LongName allow-remove-essential -Description $msg.allowRemoveEssential
    New-ParamCompleter -LongName allow-change-held-packages -Description $msg.allowChangeHeldPackages
    New-ParamCompleter -LongName force-yes -Description $msg.forceYes
    New-ParamCompleter -LongName print-uris -Description $msg.printUris
    New-ParamCompleter -LongName purge -Description $msg.purgeRemove
    New-ParamCompleter -LongName reinstall -Description $msg.reinstallOption
    New-ParamCompleter -LongName list-cleanup -Description $msg.listCleanup
    New-ParamCompleter -ShortName t -LongName target-release,default-release -Description $msg.targetRelease -Type Required -VariableName 'target-release'
    New-ParamCompleter -LongName trivial-only -Description $msg.trivialOnly
    New-ParamCompleter -LongName no-remove -Description $msg.noRemove
    New-ParamCompleter -LongName auto-remove,autoremove -Description $msg.opt_autoRemove
    New-ParamCompleter -LongName only-source -Description $msg.onlySource
    New-ParamCompleter -LongName diff-only -Description $msg.diffOnly
    New-ParamCompleter -LongName dsc-only -Description $msg.dscOnly
    New-ParamCompleter -LongName tar-only -Description $msg.tarOnly
    New-ParamCompleter -LongName arch-only -Description $msg.archOnly
    New-ParamCompleter -LongName indep-only -Description $msg.indepOnly
    New-ParamCompleter -LongName allow-unauthenticated -Description $msg.allowUnauthenticated
    New-ParamCompleter -LongName no-allow-insecure-repositories -Description $msg.noAllowInsecureRepositories
    New-ParamCompleter -LongName allow-releaseinfo-change -Description $msg.allowReleaseinfoChange
    New-ParamCompleter -LongName show-progress -Description $msg.showProgress
    New-ParamCompleter -LongName with-source -Description $msg.withSource -Type File -VariableName 'filename'
    New-ParamCompleter -ShortName e -LongName error-on -Description $msg.errorOn -Type FlagOrValue -VariableName 'any'
    New-ParamCompleter -LongName mark-auto -Description $msg.markAuto
    New-ParamCompleter -LongName mark-manual -Description $msg.markManual
    New-ParamCompleter -LongName solver -Description $msg.solver -Type Required -VariableName 'name'
) -NoFileCompletions