resources:
- repo: self
  fetchDepth: 1

phases:
- phase: linux_clang
  displayName: linux-clang
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get -y install git gcc make libssl-dev libcurl4-openssl-dev libexpat-dev tcl tk gettext git-email zlib1g-dev apache2-bin &&

       export CC=clang || exit 1

       ci/install-dependencies.sh
       ci/run-build-and-tests.sh || {
           ci/print-test-failures.sh
           exit 1
       }

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-build-and-tests.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'linux-clang'
      platform: Linux
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: linux_gcc
  displayName: linux-gcc
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get -y install git gcc make libssl-dev libcurl4-openssl-dev libexpat-dev tcl tk gettext git-email zlib1g-dev apache2-bin || exit 1

       ci/install-dependencies.sh
       ci/run-build-and-tests.sh || {
           ci/print-test-failures.sh
           exit 1
       }

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-build-and-tests.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'linux-gcc'
      platform: Linux
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: osx_clang
  displayName: osx-clang
  condition: succeeded()
  queue:
    name: Hosted macOS
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       export CC=clang

       ci/install-dependencies.sh
       ci/run-build-and-tests.sh || {
           ci/print-test-failures.sh
           exit 1
       }

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-build-and-tests.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'osx-clang'
      platform: macOS
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: osx_gcc
  displayName: osx-gcc
  condition: succeeded()
  queue:
    name: Hosted macOS
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       ci/install-dependencies.sh
       ci/run-build-and-tests.sh || {
           ci/print-test-failures.sh
           exit 1
       }

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-build-and-tests.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'osx-gcc'
      platform: macOS
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: gettext_poison
  displayName: GETTEXT_POISON
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get -y install git gcc make libssl-dev libcurl4-openssl-dev libexpat-dev tcl tk gettext git-email zlib1g-dev &&

       export jobname=GETTEXT_POISON || exit 1

       ci/run-build-and-tests.sh || {
           ci/print-test-failures.sh
           exit 1
       }

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-build-and-tests.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'gettext-poison'
      platform: Linux
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: windows
  displayName: Windows
  condition: succeeded()
  queue:
    name: Hosted
    timeoutInMinutes: 240
  steps:
  - powershell: |
       # Helper to check the error level of the latest command (exit with error when appropriate)
       function c() { if (!$?) { exit(1) } }

       if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
         net use s: \\gitfileshare.file.core.windows.net\test-cache "$GITFILESHAREPWD" /user:AZURE\gitfileshare /persistent:no; c
         cmd /c mklink /d "$(Build.SourcesDirectory)\test-cache" S:\; c
       }

       # Add build agent's MinGit to PATH
       $env:PATH = $env:AGENT_HOMEDIRECTORY +"\externals\\git\cmd;" +$env:PATH

       # Helper to initialize (or update) a Git worktree
       function init ($path, $url, $set_origin) {
           if (Test-Path $path) {
               cd $path; c
               if (Test-Path .git) {
                   git init; c
               } else {
                   git status
               }
           } else {
               git init $path; c
               cd $path; c
           }
           git config core.autocrlf false; c
           git config core.untrackedCache true; c
           if (($set_origin -ne 0) -and !(git config remote.origin.url)) {
               git remote add origin $url; c
           }
           git fetch --depth=1 $url master; c
           git reset --hard FETCH_HEAD; c
           git clean -df; c
       }

       # Initialize Git for Windows' SDK
       $sdk_path = "$(Build.SourcesDirectory)\git-sdk-64"
       init "$sdk_path" "https://dev.azure.com/git-for-windows/git-sdk-64/_git/git-sdk-64" 0
       init usr\src\build-extra https://github.com/git-for-windows/build-extra 1

       cd "$(Build.SourcesDirectory)"; c

       $env:HOME = "$(Build.SourcesDirectory)"
       $env:MSYSTEM = "MINGW64"
       git-sdk-64\git-cmd --command=usr\\bin\\bash.exe -lc @"
         . ci/lib.sh

         make -j10 DEVELOPER=1 NO_PERL=1 || exit 1
         NO_PERL=1 NO_SVN_TESTS=1 GIT_TEST_OPTS=\"--no-chain-lint --no-bin-wrappers --quiet --write-junit-xml\" time make -j15 -k DEVELOPER=1 test || {
           NO_PERL=1 NO_SVN_TESTS=1 GIT_TEST_OPTS=\"-i -v -x\" make -k -C t failed; exit 1
         }

         save_good_tree
       "@
       c

       if ("$GITFILESHAREPWD" -ne "" -and "$GITFILESHAREPWD" -ne "`$`(gitfileshare.pwd)") {
         cmd /c rmdir "$(Build.SourcesDirectory)\test-cache"
       }
    displayName: 'build & test'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'windows'
      platform: Windows
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: linux32
  displayName: Linux32
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get -y install \
           apt-transport-https \
           ca-certificates \
           curl \
           software-properties-common &&
       curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&
       sudo add-apt-repository \
          "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
          $(lsb_release -cs) \
          stable" &&
       sudo apt-get update &&
       sudo apt-get -y install docker-ce &&

       sudo AGENT_OS="$AGENT_OS" BUILD_BUILDNUMBER="$BUILD_BUILDNUMBER" BUILD_REPOSITORY_URI="$BUILD_REPOSITORY_URI" BUILD_SOURCEBRANCH="$BUILD_SOURCEBRANCH" BUILD_SOURCEVERSION="$BUILD_SOURCEVERSION" SYSTEM_PHASENAME="$SYSTEM_PHASENAME" SYSTEM_TASKDEFINITIONSURI="$SYSTEM_TASKDEFINITIONSURI" SYSTEM_TEAMPROJECT="$SYSTEM_TEAMPROJECT" CC=$CC MAKEFLAGS=-j3 bash -lxc ci/run-linux32-docker.sh || exit 1

       sudo chmod a+r t/out/TEST-*.xml

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-linux32-docker.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
  - task: PublishTestResults@2
    displayName: 'Publish Test Results **/TEST-*.xml'
    inputs:
      mergeTestResults: true
      testRunTitle: 'linux32'
      platform: Linux
      publishRunAttachments: false
    condition: succeededOrFailed()

- phase: static_analysis
  displayName: StaticAnalysis
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get install -y coccinelle &&

       export jobname=StaticAnalysis &&

       ci/run-static-analysis.sh || exit 1

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/run-static-analysis.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)

- phase: documentation
  displayName: Documentation
  condition: succeeded()
  queue:
    name: Hosted Ubuntu 1604
  steps:
  - bash: |
       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || ci/mount-fileshare.sh //gitfileshare.file.core.windows.net/test-cache gitfileshare "$GITFILESHAREPWD" "$HOME/test-cache" || exit 1

       sudo apt-get update &&
       sudo rm /var/lib/apt/lists/lock &&
       sudo apt-get install -y asciidoc xmlto asciidoctor &&

       export ALREADY_HAVE_ASCIIDOCTOR=yes. &&
       export jobname=Documentation &&

       ci/test-documentation.sh || exit 1

       test "$GITFILESHAREPWD" = '$(gitfileshare.pwd)' || sudo umount "$HOME/test-cache" || exit 1
    displayName: 'ci/test-documentation.sh'
    env:
      GITFILESHAREPWD: $(gitfileshare.pwd)
