From d7fe3923fcdbf91574f411779589037ebd6a822a Mon Sep 17 00:00:00 2001
From: Peter Squicciarini <stripedpajamas273@gmail.com>
Date: Fri, 17 May 2019 19:47:03 -0700
Subject: [PATCH] Refactor update_version to support Windows builds

---
 sum.sh            |   8 ++-
 update_version.sh | 149 +++++++++++++++++++++++++++++++---------------
 win32-build.yml   |  13 ++--
 3 files changed, 117 insertions(+), 53 deletions(-)

diff --git a/sum.sh b/sum.sh
index 1367666..d12d048 100755
--- a/sum.sh
+++ b/sum.sh
@@ -10,6 +10,10 @@ sum_file () {
 if [[ "$SHOULD_BUILD" == "yes" ]]; then
   if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
     sum_file VSCodium-darwin-*.zip
+  elif [[ "$CI_WINDOWS" == "True" ]]; then
+    sum_file VSCodiumSetup-*.exe
+    sum_file VSCodiumUserSetup-*.exe
+    sum_file VSCodium-win32-*.zip
   else # linux
     if [[ "$BUILDARCH" == "x64" ]]; then
       deb_arch=amd64
@@ -21,7 +25,7 @@ if [[ "$SHOULD_BUILD" == "yes" ]]; then
     sum_file VSCodium-linux*.tar.gz
     sum_file vscode/.build/linux/deb/${deb_arch}/deb/*.deb
     sum_file vscode/.build/linux/rpm/${rpm_arch}/*.rpm
-    cp vscode/.build/linux/deb/${deb_arch}/deb/*.sha256 .
-    cp vscode/.build/linux/rpm/${rpm_arch}/*.sha256 .
+    cp vscode/.build/linux/deb/${deb_arch}/deb/*.{sha256,sha1} .
+    cp vscode/.build/linux/rpm/${rpm_arch}/*.{sha256,sha1} .
   fi
 fi
diff --git a/update_version.sh b/update_version.sh
index dd5a34d..270b56c 100755
--- a/update_version.sh
+++ b/update_version.sh
@@ -26,68 +26,123 @@ fi
 
 URL_BASE=https://github.com/VSCodium/vscodium/releases/download/${LATEST_MS_TAG}
 
+# to make testing on forks easier
+if [[ "$CI_WINDOWS" == "True" ]]; then
+  # BUILD_REPOSITORY_URI = e.g. https://github.com/VSCodium/vscodium
+  VERSIONs_REPO=$(echo ${BUILD_REPOSITORY_URI} | awk -F"/" '{ print $4 }')/versions
+else
+  # TRAVIS_REPO_SLUG = e.g. VSCodium/vscodium
+  VERSIONS_REPO=$(echo ${TRAVIS_REPO_SLUG} | awk -F"/" '{ print $1 }')/versions
+fi
+
+# generateJson <assetName>
+# e.g. generateJson VSCodium-darwin-1.33.0.zip
+generateJson() {
+  local assetName=$1
+
+  # generate parts
+  local url=${URL_BASE}/${assetName}
+  local name=$LATEST_MS_TAG
+  local version=$LATEST_MS_COMMIT
+  local productVersion=$LATEST_MS_TAG
+  local timestamp=$(node -e 'console.log(Date.now())')
+
+  local sha1hash=$(cat ${assetName}.sha1 | awk '{ print $1 }')
+  local sha256hash=$(cat ${assetName}.sha256 | awk '{ print $1 }')
+
+  # check that nothing is blank (blank indicates something awry with build)
+  for key in url name version productVersion sha1hash timestamp sha256hash; do
+    if [[ "${!key}" == "" ]]; then
+      echo "Missing data for version update; exiting..."
+      exit 1
+    fi
+  done
+
+  # generate json
+  local json=$(jq \
+    --arg url             "${url}" \
+    --arg name            "${name}" \
+    --arg version         "${version}" \
+    --arg productVersion  "${productVersion}" \
+    --arg hash            "${sha1hash}" \
+    --arg timestamp       "${timestamp}" \
+    --arg sha256hash      "${sha256hash}" \
+    '. | .url=$url | .name=$name | .version=$version | .productVersion=$productVersion | .hash=$hash | .timestamp=$timestamp | .sha256hash=$sha256hash' \
+    <<<'{}')
+
+  echo "$json"
+}
+
+updateLatestVersion() {
+  cd versions
+
+  local versionPath=$1
+  local json=$2
+
+  # create/update the latest.json file in the correct location
+  mkdir -p $versionPath
+  echo $json > $versionPath/latest.json
+
+  cd ..
+}
+
+# init versions repo for later commiting + pushing the json file to it
+# thank you https://www.vinaygopinath.me/blog/tech/commit-to-master-branch-on-github-using-travis-ci/
+git clone https://github.com/${VERSIONS_REPO}.git
+cd versions
+git config user.email "travis@travis-ci.org"
+git config user.name "Travis CI"
+git remote rm origin
+git remote add origin https://${GITHUB_USERNAME}:${GITHUB_TOKEN}@github.com/${VERSIONS_REPO}.git > /dev/null 2>&1
+cd ..
+
 if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
   # zip, sha1, and sha256 files are all at top level dir
-  ASSET_PATH=.
   ASSET_NAME=VSCodium-darwin-${LATEST_MS_TAG}.zip
   VERSION_PATH="darwin"
+  JSON="$(generateJson ${ASSET_NAME})"
+  updateLatestVersion "$VERSION_PATH" "$JSON"
 elif [[ "$CI_WINDOWS" == "True" ]]; then
-  # TODO: make this logic work for Windows builds too
-  # or re-implement it in PowerShell and call that from the Windows build
-  exit
+  # windows update service supports user and archive types
+  # so we will run the commands twice
+
+  # user installer
+  ASSET_NAME=VSCodiumUserSetup-${BUILDARCH}-${LATEST_MS_TAG}.exe
+
+  if [[ "$BUILDARCH" == "x64" ]]; then
+    VERSION_PATH="win32/${BUILDARCH}/user"
+  else
+    VERSION_PATH="win32/user"
+  fi
+  JSON="$(generateJson ${ASSET_NAME} ${ASSET_PATH})"
+  updateLatestVersion "$VERSION_PATH" "$JSON"
+
+  # windows archive
+  ASSET_NAME=VSCodium-win32-${BUILDARCH}-${LATEST_MS_TAG}.zip
+
+  if [[ "$BUILDARCH" == "x64" ]]; then
+    VERSION_PATH="win32/${BUILDARCH}/archive"
+  else
+    VERSION_PATH="win32/archive"
+  fi
+  JSON="$(generateJson ${ASSET_NAME} ${ASSET_PATH})"
+  updateLatestVersion "$VERSION_PATH" "$JSON"
 else # linux
   # update service links to tar.gz file
   # see https://update.code.visualstudio.com/api/update/linux-x64/stable/VERSION
   # and https://update.code.visualstudio.com/api/update/linux-ia32/stable/VERSION
   # as examples
-  ASSET_PATH=.
   ASSET_NAME=VSCodium-linux-${BUILDARCH}-${LATEST_MS_TAG}.tar.gz
   VERSION_PATH="linux/${BUILDARCH}"
+  JSON="$(generateJson ${ASSET_NAME})"
+  updateLatestVersion "$VERSION_PATH" "$JSON"
 fi
 
-# generate parts
-url=${URL_BASE}/${ASSET_NAME}
-name=$LATEST_MS_TAG
-version=$LATEST_MS_COMMIT
-productVersion=$LATEST_MS_TAG
-sha1hash=$(cat ${ASSET_PATH}/${ASSET_NAME}.sha1 | awk '{ print $ 1 }')
-timestamp=$(node -e 'console.log(Date.now())')
-sha256hash=$(cat ${ASSET_PATH}/${ASSET_NAME}.sha256 | awk '{ print $ 1 }')
-
-# check that nothing is blank (blank indicates something awry with build)
-for key in url name version productVersion sha1hash timestamp sha256hash; do
-  if [[ "${!key}" == "" ]]; then
-    echo "Missing data for version update; exiting..."
-    exit 1
-  fi
-done
-
-# generate json
-JSON=$(jq \
-  --arg url             "${url}" \
-  --arg name            "${name}" \
-  --arg version         "${version}" \
-  --arg productVersion  "${productVersion}" \
-  --arg hash            "${sha1hash}" \
-  --arg timestamp       "${timestamp}" \
-  --arg sha256hash      "${sha256hash}" \
-  '. | .url=$url | .name=$name | .version=$version | .productVersion=$productVersion | .hash=$hash | .timestamp=$timestamp | .sha256hash=$sha256hash' \
-  <<<'{}')
-
-echo $JSON
-
-# clone down the current versions repo
-# create/update the latest.json file in the correct location
-# commit and push (thank you https://www.vinaygopinath.me/blog/tech/commit-to-master-branch-on-github-using-travis-ci/)
-git clone https://github.com/VSCodium/versions.git
 cd versions
-git config user.email "travis@travis-ci.org"
-git config user.name "Travis CI"
-mkdir -p $VERSION_PATH
-echo $JSON > $VERSION_PATH/latest.json
-git add $VERSION_PATH
+
+git add .
 dateAndMonth=`date "+%D %T"`
 git commit -m "Travis update: $dateAndMonth (Build $TRAVIS_BUILD_NUMBER)"
-git remote rm origin
-git remote add origin https://${GITHUB_USERNAME}:${GITHUB_TOKEN}@github.com/VSCodium/versions.git > /dev/null 2>&1
 git push origin master --quiet
+
+cd ..
diff --git a/win32-build.yml b/win32-build.yml
index 62fcb9b..fc3538e 100644
--- a/win32-build.yml
+++ b/win32-build.yml
@@ -16,9 +16,11 @@ steps:
   inputs: 
     scriptPath: get_repo.sh
 - powershell: |
+    $LATEST_MS_COMMIT="$(git -C vscode rev-list --tags --max-count=1)"
     $LATEST_MS_TAG="$(git -C vscode describe --tags)"
     Write-Host "##vso[task.setvariable variable=LATEST_MS_TAG]$LATEST_MS_TAG"
-  displayName: 'set env LATEST_MS_TAG'
+    Write-Host "##vso[task.setvariable variable=LATEST_MS_COMMIT]$LATEST_MS_COMMIT"
+  displayName: 'set env LATEST_MS_TAG, LATEST_MS_COMMIT'
 - task: PowerShell@2
   inputs:
     filePath: 'check_tags.ps1'
@@ -40,9 +42,7 @@ steps:
     if [[ "$SHOULD_BUILD" == "yes" ]]; then mv vscode\\.build\\win32-$(BUILDARCH)\\archive\\VSCode-win32-$(BUILDARCH).zip VSCodium-win32-$(BUILDARCH)-${LATEST_MS_TAG}.zip; fi
   displayName: 'move the zip folder'
 - powershell: |
-    Get-FileHash VSCodiumSetup-$(BUILDARCH)-$(LATEST_MS_TAG).exe -Algorithm SHA256 | Format-List > VSCodiumSetup-$(BUILDARCH)-$(LATEST_MS_TAG).sha256
-    Get-FileHash VSCodiumUserSetup-$(BUILDARCH)-$(LATEST_MS_TAG).exe -Algorithm SHA256 | Format-List > VSCodiumUserSetup-$(BUILDARCH)-$(LATEST_MS_TAG).sha256
-    Get-FileHash VSCodium-win32-$(BUILDARCH)-$(LATEST_MS_TAG).zip -Algorithm SHA256 | Format-List > VSCodium-win32-$(BUILDARCH)-$(LATEST_MS_TAG).sha256
+    bash ./sum.sh
   condition: eq(variables['SHOULD_BUILD'], 'yes')
   displayName: 'compute sums'
 - task: CopyFiles@2
@@ -61,3 +61,8 @@ steps:
   inputs:
     PathtoPublish: $(Build.ArtifactStagingDirectory)
     ArtifactName: 'everything'
+- bash: ./update_version.sh
+  displayName: 'update version json'
+  env:
+    GITHUB_TOKEN: $(GITHUB_TOKEN)
+    GITHUB_USERNAME: $(GITHUB_USERNAME)