completions/cp.ps1

<#
 # cp completion
 #>

Import-Module NativeCommandCompleter.psm -ErrorAction SilentlyContinue

$msg = data { ConvertFrom-StringData @'
    gnu_archive = Same as -dpR
    gnu_attributesOnly = Copy just the attributes
    gnu_backup = Make backup of each existing destination file
    gnu_backup_none = Never make backups
    gnu_backup_numbered = Make numbered backups
    gnu_backup_existing = Numbered backups if any exist, else simple
    gnu_backup_simple = Make simple backups
    gnu_short_backup = Make backup of each existing destination file
    gnu_copyContents = Copy contents of special files when recursive
    gnu_short_d = Same as --no-dereference --preserve=links
    gnu_force = Do not prompt before overwriting
    gnu_interactive = Prompt before overwrite
    gnu_short_H = Follow command-line symbolic links
    gnu_link = Link files instead of copying
    gnu_stripTrailingSlashes = Remove trailing slashes from source
    gnu_suffix = Backup suffix
    gnu_targetDirectory = Target directory
    gnu_short_update = Equivalent to --update[=older]
    gnu_update = Do not overwrite newer files
    gnu_verbose = Verbose mode
    gnu_help = Display help and exit
    gnu_version = Display version and exit
    gnu_dereference = Always follow symbolic links
    gnu_noClobber = Do not overwrite an existing file
    gnu_noDereference = Never follow symbolic links
    gnu_short_p = Same as --preserve=mode,ownership,timestamps
    gnu_preserve = Preserve ATTRIBUTES if possible
    gnu_noPreserve = Don't preserve ATTRIBUTES
    gnu_parents = Use full source file name under DIRECTORY
    gnu_recursive = Copy directories recursively
    gnu_reflink = Control clone/CoW copies
    gnu_removeDestination = First remove existing destination files
    gnu_sparse = Control creation of sparse files
    gnu_symbolicLink = Make symbolic links instead of copying
    gnu_noTargetDirectory = Treat DEST as a normal file
    gnu_oneFileSystem = Stay on this file system
    gnu_short_Z = Set SELinux context of copy to default type
    gnu_context = Set SELinux context of copy to CONTEXT
    gnu_attrList_mode = Permissions (including any ACL and xattr permissions)
    gnu_attrList_ownership = User and group
    gnu_attrList_timestamps = File timestamps
    gnu_attrList_links = Hard links
    gnu_attrList_context = Security context
    gnu_attrList_xattr = Extended attributes
    gnu_attrList_all = All attributes
    gnu_update_older = Files being replaced if they're older than the corresponding source file
    gnu_update_none = Similar to the --no-clobber option, but no failure
    gnu_update_all = All existing files in the destination being replaced (default)
    gnu_reflink_always = Perform a lightweight copy, where the data blocks are copied only when modified
    gnu_reflink_auto = Attempt lightweight copy, if failed, fall back to a standard copy
    gnu_reflink_never = Ensure a standard copy is performed
    gnu_sparse_always = Create a sparse DEST file whenever the SOURCE file contains a long enough sequence of zero bytes
    gnu_sparse_auto = Detected by a crude heuristic and the corresponding DEST file is made sparse as well
    gnu_sparse_never = Inhibit creation of sparse files
    macos_recursive = Copy directories recursively
    macos_followSymlink = -R: Follow symlink arguments
    macos_followAllSymlink = -R: Follow all symlinks
    macos_dontFollowSymlink = -R: Don't follow symlinks (default)
    macos_force = Don't confirm to overwrite
    macos_interactive = Prompt before overwrite
    macos_dontOverwrite = Don't overwrite existing
    macos_preserve = Preserve attributes of source
    macos_verbose = Print filenames as they're copied
    macos_archive = Archive mode (-pPR)
    macos_clonefile2 = Clone using clonefile(2)
    macos_ommitXattrs = Omit xattrs, resource forks
    macos_hardlink = Hard link instead of copying
    macos_dontTraverse = Don't traverse mount points
    macos_symlink = Symlink instead of copying
'@
 }
Import-LocalizedData -BindingVariable localizedMessages -ErrorAction SilentlyContinue;
foreach ($key in $localizedMessages.Keys) { $msg[$key] = $localizedMessages[$key] }

cp --version 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0)
{
    $attr_list_arguments = @(
        "mode`t{0}" -f $msg.gnu_attrList_mode
        "ownership`t{0}" -f $msg.gnu_attrList_ownership
        "timestamps`t{0}" -f $msg.gnu_attrList_timestamps
        "links`t{0}" -f $msg.gnu_attrList_links
        "context`t{0}" -f $msg.gnu_attrList_context
        "xattr`t{0}" -f $msg.gnu_attrList_xattr
        "all`t{0}" -f $msg.gnu_attrList_all
    )
    Register-NativeCompleter -Name cp -Parameters @(
        New-ParamCompleter -ShortName a -LongName archive -Description $msg."gnu_archive"
        New-ParamCompleter -LongName attributes-only -Description $msg.gnu_attributesOnly
        New-ParamCompleter -LongName backup -Description $msg.gnu_backup -Arguments @(
            "none `t{0}" -f $msg.gnu_backup_none
            "off `t{0}" -f $msg.gnu_backup_none
            "numbered `t{0}" -f $msg.gnu_backup_numbered
            "t `t{0}" -f $msg.gnu_backup_numbered
            "existing `t{0}" -f $msg.gnu_backup_existing
            "nil `t{0}" -f $msg.gnu_backup_existing
            "simple `t{0}" -f $msg.gnu_backup_simple
            "never `t{0}" -f $msg.gnu_backup_simple
        ) -VariableName 'CONTROL'
        New-ParamCompleter -ShortName b -Description $msg.gnu_short_backup
        New-ParamCompleter -LongName copy-contents -Description $msg.gnu_copyContents
        New-ParamCompleter -ShortName d -Description $msg.gnu_short_d
        New-ParamCompleter -ShortName f -LongName force -Description $msg.gnu_force
        New-ParamCompleter -ShortName i -LongName interactive -Description $msg.gnu_interactive
        New-ParamCompleter -ShortName H -Description $msg.gnu_short_H
        New-ParamCompleter -ShortName l -LongName link -Description $msg.gnu_link
        New-ParamCompleter -LongName strip-trailing-slashes -Description $msg.gnu_stripTrailingSlashes
        New-ParamCompleter -ShortName S -LongName suffix -Description $msg.gnu_suffix -Type Required -VariableName 'SUFFIX'
        New-ParamCompleter -ShortName t -LongName target-directory -Description $msg.gnu_targetDirectory -Type Directory -VariableName 'DIRECTORY'
        New-ParamCompleter -ShortName u -Description $msg.gnu_short_update
        New-ParamCompleter -LongName update -Description $msg.gnu_update -Type FlagOrValue -Arguments @(
            "older `t{0}" -f $msg.gnu_update_older
            "none `t{0}" -f $msg.gnu_update_none
            "all `t{0}" -f $msg.gnu_update_all
        ) -VariableName 'UPDATE'
        New-ParamCompleter -ShortName v -LongName verbose -Description $msg.gnu_verbose
        New-ParamCompleter -LongName help -Description $msg.gnu_help
        New-ParamCompleter -LongName version -Description $msg.gnu_version
        New-ParamCompleter -ShortName L -LongName dereference -Description $msg.gnu_dereference
        New-ParamCompleter -ShortName n -LongName no-clobber -Description $msg.gnu_noClobber
        New-ParamCompleter -ShortName P -LongName no-dereference -Description $msg.gnu_noDereference
        New-ParamCompleter -ShortName p -Description $msg.gnu_short_p
        New-ParamCompleter -LongName preserve -Description $msg.gnu_preserve -Arguments $attr_list_arguments -Type FlagOrValue,List -VariableName 'ATTR_LIST'
        New-ParamCompleter -LongName no-preserve -Description $msg.gnu_noPreserve -Arguments $attr_list_arguments -Type List -VariableName 'ATTR_LIST'
        New-ParamCompleter -LongName parents -Description $msg.gnu_parents
        New-ParamCompleter -ShortName r,R -LongName recursive -Description $msg.gnu_recursive
        New-ParamCompleter -LongName reflink -Description $msg.gnu_reflink -Type FlagOrValue -Arguments @(
            "always `t{0}" -f $msg.gnu_reflink_always 
            "auto `t{0}" -f $msg.gnu_reflink_auto
            "never `t{0}" -f  $msg.gnu_reflink_never
        ) -VariableName 'WHEN'
        New-ParamCompleter -LongName remove-destination -Description $msg.gnu_removeDestination
        New-ParamCompleter -LongName sparse -Description $msg.gnu_sparse -Arguments @(
            "always `t{0}" -f $msg.gnu_sparse_always 
            "auto `t{0}" -f $msg.gnu_sparse_auto
            "never `t{0}" -f  $msg.gnu_sparse_never
        ) -VariableName 'WHEN'
        New-ParamCompleter -ShortName s -LongName symbolic-link -Description $msg.gnu_symbolicLink
        New-ParamCompleter -ShortName T -LongName no-target-directory -Description $msg.gnu_noTargetDirectory
        New-ParamCompleter -ShortName x -LongName one-file-system -Description $msg.gnu_oneFileSystem
        New-ParamCompleter -ShortName Z -Description $msg.gnu_short_Z
        New-ParamCompleter -ShortName X -LongName context -Description $msg.gnu_context -Type Required -VariableName 'CTX'
    )
}
else
{
    Register-NativeCompleter -Name cp -Parameters @(
        New-ParamCompleter -ShortName R -Description $msg.macos_recursive
        New-ParamCompleter -ShortName H -Description $msg.macos_followSymlink
        New-ParamCompleter -ShortName L -Description $msg.macos_followAllSymlink
        New-ParamCompleter -ShortName P -Description $msg.macos_dontFollowSymlink
        New-ParamCompleter -ShortName f -Description $msg.macos_force
        New-ParamCompleter -ShortName i -Description $msg.macos_interactive
        New-ParamCompleter -ShortName n -Description $msg.macos_dontOverwrite
        New-ParamCompleter -ShortName p -Description $msg.macos_preserve
        New-ParamCompleter -ShortName v -Description $msg.macos_verbose
        New-ParamCompleter -ShortName a -Description $msg.macos_archive
        New-ParamCompleter -ShortName c -Description $msg.macos_clonefile2
        New-ParamCompleter -ShortName X -Description $msg.macos_ommitXattrs
        New-ParamCompleter -ShortName l -Description $msg.macos_hardlink
        New-ParamCompleter -ShortName x -Description $msg.macos_dontTraverse
        New-ParamCompleter -ShortName s -Description $msg.macos_symlink
    )
}