---

# The following variables will be set by the runner of this playbook:
# project_path: PROJECTS_DIR/_local_path_
# scm_type: git|hg|svn
# scm_url: https://server/repo
# scm_branch: HEAD
# scm_clean: true/false
# scm_delete_on_update: true/false
# scm_username: username (only for svn)
# scm_password: password (only for svn)
# scm_accept_hostkey: true/false (only for git)

- hosts: all
  connection: local
  gather_facts: false
  tasks:

    - name: delete project directory before update
      file:
        path: "{{project_path|quote}}"
        state: absent
      when: scm_delete_on_update|default('')

    - name: update project using git and accept hostkey
      git:
        dest: "{{project_path|quote}}"
        repo: "{{scm_url|quote}}"
        version: "{{scm_branch|quote}}"
        force: "{{scm_clean}}"
        accept_hostkey: "{{scm_accept_hostkey}}"
        #clone: "{{ scm_full_checkout }}"
        #update: "{{ scm_full_checkout }}"
      when: scm_type == 'git' and scm_accept_hostkey is defined
      register: scm_result

    - name: Set the git repository version
      set_fact:
        scm_version: "{{ scm_result['after'] }}"
      when: "'after' in scm_result"

    - name: update project using git
      git:
        dest: "{{project_path|quote}}"
        repo: "{{scm_url|quote}}"
        version: "{{scm_branch|quote}}"
        force: "{{scm_clean}}"
        #clone: "{{ scm_full_checkout }}"
        #update: "{{ scm_full_checkout }}"
      when: scm_type == 'git' and scm_accept_hostkey is not defined
      register: scm_result

    - name: Set the git repository version
      set_fact:
        scm_version: "{{ scm_result['after'] }}"
      when: "'after' in scm_result"

    - name: update project using hg
      hg:
        dest: "{{project_path|quote}}"
        repo: "{{scm_url|quote}}"
        revision: "{{scm_branch|quote}}"
        force: "{{scm_clean}}"
        #clone: "{{ scm_full_checkout }}"
        #update: "{{ scm_full_checkout }}"
      when: scm_type == 'hg'
      register: scm_result

    - name: Set the hg repository version
      set_fact:
        scm_version: "{{ scm_result['after'] }}"
      when: "'after' in scm_result"

    - name: update project using svn
      subversion:
        dest: "{{project_path|quote}}"
        repo: "{{scm_url|quote}}"
        revision: "{{scm_branch|quote}}"
        force: "{{scm_clean}}"
        #checkout: "{{ scm_full_checkout }}"
        #update: "{{ scm_full_checkout }}"
      when: scm_type == 'svn' and not scm_username|default('')
      register: scm_result

    - name: Set the svn repository version
      set_fact:
        scm_version: "{{ scm_result['after'] }}"
      when: "'after' in scm_result"

    - name: update project using svn with auth
      subversion:
        dest: "{{project_path|quote}}"
        repo: "{{scm_url|quote}}"
        revision: "{{scm_branch|quote}}"
        force: "{{scm_clean}}"
        username: "{{scm_username|quote}}"
        password: "{{scm_password|quote}}"
        #checkout: "{{ scm_full_checkout }}"
        #update: "{{ scm_full_checkout }}"
      when: scm_type == 'svn' and scm_username|default('')
      register: scm_result

    - name: Set the svn repository version
      set_fact:
        scm_version: "{{ scm_result['after'] }}"
      when: "'after' in scm_result"

    - name: detect requirements.yml
      stat: path={{project_path|quote}}/roles/requirements.yml
      register: doesRequirementsExist

    - name: fetch galaxy roles from requirements.yml
      command: ansible-galaxy install -r requirements.yml -p {{project_path|quote}}/roles/ --force
      args:
        chdir: "{{project_path|quote}}/roles"
      when: doesRequirementsExist.stat.exists and scm_full_checkout|bool

      # format provided by ansible is ["Revision: 12345", "URL: ..."]
    - name: parse subversion version string properly
      set_fact:
        scm_version: "{{scm_version|regex_replace('^.*Revision: ([0-9]+).*$', '\\1')}}"
      when: scm_type == 'svn'

    - name: Repository Version
      debug: msg="Repository Version {{ scm_version }}"
      when: scm_version is defined

    - name: Write Repository Version
      copy:
        dest: "{{ scm_revision_output }}"
        content: "{{ scm_version }}"
      when: scm_version is defined and scm_revision_output is defined
