---

- name: Install Xcode CLI tools on Mac OS X
  tags:
    - macosx
    - darwin
    - xcode_cli_tools
    - xcode_tools
  hosts: all
  tasks:
    - name: Pre-flight checks
      when: ansible_system != 'Darwin'
      ansible.builtin.fail:
        msg: "Unsupported OS '{{ ansible_system }}'"
    - name: Check Command Line Tools are already installed
      check_mode: false
      register: cli_tools_check
      ansible.builtin.command: xcode-select --print-path
      ignore_errors: true
      changed_when: false
    - name: Try headless installing command line tools
      when: cli_tools_check is failed
      block:
        - name: Force `softwareupdate` to list the Command Line Tools
          ansible.builtin.file:
            path: /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
            state: touch
            mode: u=rw,g=rw,o=r
        - name: Get the tools' label
          register: cli_tools_label
          ansible.builtin.shell: >-
            set -o pipefail && \
            /usr/sbin/softwareupdate --list
            | grep -B 1 -E 'Command Line Tools'
            | awk -F'*' '/^ *\\*/ {print $2}'
            | sed -e 's/^ *Label: //' -e 's/^ *//'
            | sort -V
            | tail -n1
          changed_when:
            - cli_tools_label.rc == 0
            - cli_tools_label.stdout is not match('Command Line Tools for Xcode')
          failed_when: cli_tools_label.rc != 0
        - name: Install the tools
          register: headless_cli_tools_installation
          ansible.builtin.command: >-
            /usr/sbin/softwareupdate --install --agree-to-license
            {{ cli_tools_label.stdout | quote }}
          changed_when:
            - headless_cli_tools_installation.rc == 0
            - headless_cli_tools_installation.stdout is not match('No new software available.')
        - name: Print message on failure
          when: headless_cli_tools_installation is failed
          ansible.builtin.fail:
            msg: >-
              Headless installation failed. Please execute
              'xcode-select --install' in a terminal.
