---
# @file System Taskfile Commands
# @brief Defines commands provided by the Install Doctor CLI system
# @description
#     The tasks / commands defined in this `Taskfile.yml` are all accessible by using the `task-menu` command.
#     `task-menu` is a custom fork created to make browsing through various post-provisioning commands easier
#     after setting up a device with Install Doctor. For each of the command below, you can run `task-menu command-name`
#     to directly invoke the task. Alternatively, you can simply run `task-menu` from anywhere on the device to open
#     an interactive command menu.
#
#     ## Documentation
#
#     The documentation for each command is defined in this file under the `summary` key. If a command has a `summary` defined
#     then, our documentation system will automatically integrate the documentation into our documentation portal. The
#     Install Doctor CLI (which is defined in this file) is available for viewing [here](https://install.doctor/docs/cli).

version: '3'

tasks:
  bitwarden:
    cmds:
      - |
        ### Command to copy to clipboard
        COPY="wl-copy"
        ### Get list of all logins as json
        logins="$(bw list items)"
        ### Grab the name of every login and pip them into fzf
        name="$(echo "$logins" | jq -r '.[].name' | fzf)"
        ### Find the login with the selected name (as a json)
        selected="$(echo "$logins" | jq -r ".[] | select(.name == \"$name\")")"
        ### Print the name of the selected login
        echo "Name: $(echo "$selected" | jq -r '.name')"
        echo "> Copying Username"
        ### Copy the username to the clipboard
        printf '%s' "$(echo "$selected" | jq -r '.login.username')" | $COPY
        echo "Press any key to copy password..."
        ### Wait for user input before coping the password
        read -r
        echo "> Copying Password"
        ### Copy the password to the clipboard
        printf '%s' "$(echo "$selected" | jq -r '.login.password')" | $COPY

  build:packer:
    desc: Builds Packer boxes using all supported virtualization platform / operating system combinations
    summary: |
      # {{ .AppName}} Packer Build

  build:packer:
    desc: Builds Packer boxes using all supported virtualization platform / operating system combinations
    summary: |
      # {{ .AppName}} Packer Build

      This command will use Packer to build all the supported virtualization platform / operating system
      combinations. This command can be used to test {{ .AppName }} on all the various systems that are
      supported.

      ## Supported Virtualization Platforms

      * KVM
      * Hyper-V
      * VirtualBox
      * Parallels
      * VMWare

      ## Supported Operating Systems

      * Archlinux
      * CentOS
      * Debian
      * Fedora
      * macOS
      * Ubuntu
      * Windows

      ## Qubes Support

      Qubes can leverage the assets generated from the VirtualBox builds to power HVMs.
    cmds:
      - |
        cd "${XDG_DATA_HOME:-$HOME/.local/share}/bento"
        packer init -upgrade ./packer_templates
        logg info 'Building Ubuntu VirtualBox VMs'
        packer build -var-file=os_pkrvars/ubuntu/ubuntu-22.04-x86_64.pkrvars.hcl ./packer_templates

  brave:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: Brave Browser
      RcloneRepository: brave
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: Brave Browser
          ProfileFolderDarwin: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
          ProfileFolderLinux: ~/.config/BraveSoftware/Brave-Browser/Default
          ProfileFolderWindows: %APPDATA%/Local/BraveSoftware/Brave-Browser/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: brave

  brave:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: Brave Browser
      RcloneRepository: brave
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/Brave Browser.app
          AppName: Brave Browser
          ProfileFolderDarwin: ~/Library/Application Support/BraveSoftware/Brave-Browser/Default
          ProfileFolderLinux: ~/.config/BraveSoftware/Brave-Browser/Default
          ProfileFolderWindows: %APPDATA%/Local/BraveSoftware/Brave-Browser/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: brave

  chrome:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: Google Chrome
      RcloneRepository: chrome
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: Google Chrome
          ProfileFolderDarwin: ~/Library/Application Support/Google/Chrome/Default
          ProfileFolderLinux: ~/.config/google-chrome/default
          ProfileFolderWindows: %LOCALAPPDATA%/Google/Chrome/User Data/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: chrome

  chrome:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: Google Chrome
      RcloneRepository: chrome
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/Google Chrome.app
          AppName: Google Chrome
          ProfileFolderDarwin: ~/Library/Application Support/Google/Chrome/Default
          ProfileFolderLinux: ~/.config/google-chrome/default
          ProfileFolderWindows: %LOCALAPPDATA%/Google/Chrome/User Data/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: chrome

  edge:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: Microsoft Edge
      RcloneRepository: edge
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: Microsoft Edge
          ProfileFolderDarwin: ~/Library/Application Support/Microsoft Edge/Default
          ProfileFolderLinux: ~/.config/microsoft-edge/Default
          ProfileFolderWindows: %LOCALAPPDATA%/Microsoft/Edge/User Data/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: edge

  edge:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: Microsoft Edge
      RcloneRepository: edge
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/Microsoft Edge.app
          AppName: Microsoft Edge
          ProfileFolderDarwin: ~/Library/Application Support/Microsoft Edge/Default
          ProfileFolderLinux: ~/.config/microsoft-edge/Default
          ProfileFolderWindows: %LOCALAPPDATA%/Microsoft/Edge/User Data/Default
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: edge

  ferdium:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: Ferdium
      RcloneRepository: ferdium
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: Ferdium
          ProfileFolderDarwin: ~/Library/Application Support/Ferdium
          ProfileFolderLinux: ~/.config/Ferdium/
          ProfileFolderWindows: %APPDATA%/Ferdium
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: ferdium

  ferdium:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: Ferdium
      RcloneRepository: ferdium
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/Ferdium.app
          AppName: Ferdium
          ProfileFolderDarwin: ~/Library/Application Support/Ferdium
          ProfileFolderLinux: ~/.config/Ferdium/
          ProfileFolderWindows: %APPDATA%/Ferdium
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: ferdium

  firefox:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: Firefox
      RcloneRepository: firefox
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: Firefox
          ProfileFolderDarwin: ~/Library/Application Support/Firefox/Profiles/profile.private
          ProfileFolderLinux: ~/.mozilla/firefox
          ProfileFolderWindows: %APPDATA%/Mozilla/Firefox/Profiles
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: firefox

  firefox:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: Firefox
      RcloneRepository: firefox
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/Firefox.app
          AppName: Firefox
          ProfileFolderDarwin: ~/Library/Application Support/Firefox/Profiles/profile.private
          ProfileFolderLinux: ~/.mozilla/firefox
          ProfileFolderWindows: %APPDATA%/Mozilla/Firefox/Profiles
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: firefox

  font-test:
    cmds:
      - |
        echo -en "Regular"
        echo -en "\e[3m Italic \e[0m"
        echo -en "\e[1m Bold \e[0m"
        echo -en "\e[3m\e[1m Bold-Italic \e[0m"
        echo -en " \e[4mUnderline\e[0m "
        echo -e " \e[9mStrikethrough\e[0m"

  librewolf:profile:backup:
    desc: Backs up the user's {{ .AppName }} profile to the user's S3-backed Restic repository
    vars:
      AppName: LibreWolf
      RcloneRepository: librewolf
    summary: |
      # {{ .AppName }} Profile Backup

      This command backups the {{ .AppName }} user data profile to an S3-backed Restic repository if the profile exists. If the repository
      has not been initialized then it will initialize it. After you backup the profile, you can restore it with the
      `{{ .RcloneRepository }}:profile:restore` command like so:

      ```
      run {{ .RcloneRepository }}:profile:restore
      ```

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      The backup uses Restic so all the functionality that Restic offers is available with backups made by this command.
    cmds:
      - task: profile:backup
        vars:
          AppName: LibreWolf
          ProfileFolderDarwin: ~/Library/Application Support/LibreWolf/Profiles/profile.default
          ProfileFolderLinux: ~/.librewolf
          ProfileFolderWindows: %USERPROFILE%/.librewolf
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: librewolf

  librewolf:profile:restore:
    desc: Restores the user's {{ .AppName }} profile from the user's S3-backed Restic repository
    vars:
      AppName: LibreWolf
      RcloneRepository: librewolf
    summary: |
      # {{ .AppName }} Profile Import / Restore

      This command imports / restores the {{ .AppName }} profile from the S3 Restic repository, if it exists. In order to use this
      command for the first time, you should initialize {{ .AppName }} by opening the application. You should also customize
      the application by applying your preferred settings (i.e. customize it how you want it to open in the future). Then, after making
      any changes you wish to be saved, you can backup the {{ .AppName }} profile to the user's S3 bucket
      by running the `{{ .RcloneRepository }}:profile:backup` task. After this is done, you can restore the application
      settings by running this command (i.e. `{{ .RcloneRepository }}:profile:restore`).

      The {{ .AppName }} backup is encrypted with the same key that Chezmoi uses (stored in `~/.config/age/chezmoi.txt`, by default).
      Since the backup leverages Restic, you can leverage all the functionality that Restic offers if something goes awry.
    cmds:
      - task: profile:restore
        vars:
          AppFolder: /Applications/LibreWolf.app
          AppName: LibreWolf
          ProfileFolderDarwin: ~/Library/Application Support/LibreWolf/Profiles/profile.default
          ProfileFolderLinux: ~/.librewolf
          ProfileFolderWindows: %USERPROFILE%/.librewolf
          ProfileFolder: '{{if eq OS "linux"}}{{.ProfileFolderLinux}}{{else if eq OS "darwin"}}{{.ProfileFolderDarwin}}{{else}}{{.ProfileFolderWindows}}{{end}}'
          RcloneRepository: librewolf

  macos:plists:
    cmds:
      - |
        find /usr/local/src/install.doctor/home/Library/Preferences -type f -mindepth 1 -maxdepth 1 | while read PLIST; do
          if [[ "$PLIST" == *".plist" ]]; then
            PLIST_FILE="$(basename "$PLIST")"
            cp -f "$HOME/Library/Preferences/$PLIST_FILE" "/usr/local/src/install.doctor/home/Library/Preferences/$PLIST_FILE"
            plutil -convert xml1 "/usr/local/src/install.doctor/home/Library/Preferences/$PLIST_FILE"
          fi
        done

  profile:backup:
    cmds:
      - |
        if [ -d "{{ .ProfileFolder }}" ]; then
          if [ -d "$HOME/.local/mnt/s3" ]; then
            if command -v rclone > /dev/null && command -v restic > /dev/null; then
              logg info '{{ .AppName }} profile folder exists and user S3 mount exists. Backing the profile up to user S3 bucket via Restic.'
              if ([ -z "$(restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" cat config)" ]) 2>/dev/null; then
                logg info 'Initializing {{ .AppName }} Restic repository'
                restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" init
              fi
              restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" --verbose backup --tag "{{ .ProfileFolder }}" --tag {{ OS }} --tag "$HOST" "{{ .ProfileFolder }}"
            else
              logg error 'Both rclone and restic must be available' && exit 1
            fi
          else
            logg error 'User S3 bucket mount is unavailable. The presence of this folder is used to detect whether or not the user S3 Rclone configuration is in place.' && exit 1
          fi
        else
          logg warn 'The {{ .ProfileFolder }} folder does not exist. Skipping.'
        fi

  profile:restore:
    cmds:
      - |
        if [ -d '{{ .AppFolder }}' ]; then
          if [ -d "$HOME/.local/mnt/s3" ]; then
            if command -v rclone > /dev/null && command -v restic > /dev/null; then
              if ([ -z "$(restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" cat config)" ]) 2>/dev/null; then
                logg warn 'The {{ .AppName }} Rclone repository has not been initialized. Skipping.'
              else
                restic -r "rclone:$USER-s3:user/{{ .RcloneRepository }}" --password-file "${XDG_CONFIG_HOME:-$HOME/.config}/age/chezmoi.txt" restore latest --target '{{ .ProfileFolder }}'
              fi
            else
              logg error 'Both rclone and restic must be available' && exit 1
            fi
          else
            logg error 'User S3 bucket mount is unavailable. The presence of this folder is used to detect whether or not the user S3 Rclone configuration is in place.' && exit 1
          fi
        else
          logg info 'The {{ .AppFolder }} folder that is used to detect the presence of {{ .AppName }} on the system is not present so the profile will not be restored for this type of {{ .AppName }} install.'
        fi

  squash-symlink:
    summary: |
      This command, when used in conjunction with the `find` command, will scan through a directory
      and convert any symlinks into regular files by copying their source over the initial symlink.

      **Example usage:**

      ```
      find . -type l -exec 'run squash-symlink --' {} +
      ```

      ## TODO

      Test and fix this so it can be accessed by `run squash-symlink -- $PATH`
    cmds:
      - |
        set -e
        for link; do
          test -h "$link" || continue
          dir=$(dirname "$link")
          reltarget=$(readlink "$link")
          case $reltarget in
            /*) abstarget=$reltarget;;
            *)  abstarget=$dir/$reltarget;;
          esac
          rm -fv "$link"
          cp -afv "$abstarget" "$link" || {
            ### On failure, restore the symlink
            rm -rfv "$link"
            ln -sfv "$reltarget" "$link"
          }
        done
