# Contributor: Daniele Basso <d dot bass05 at proton dot me>

pkgname=code-electron-latest
pkgdesc='VSCode on latest stable electron'
pkgver=1.100.3
pkgrel=1
arch=('x86_64')
_vscode_arch=x64 # https://gitlab.archlinux.org/archlinux/packaging/packages/code/-/raw/main/PKGBUILD
_electron_arch=x64
url=https://github.com/microsoft/vscode
license=('MIT')
depends=( ripgrep xdg-utils # electron* is added at build process
libsecret libxkbfile )
optdepends=('x11-ssh-askpass: SSH authentication')
makedepends=( nodejs-lts-iron # -git .nvmrc wants -jod. But build fails
git npm pnpm python desktop-file-utils 
patch libarchive ) # base base-devel
conflicts=(code vscode)
provides=(code vscode)
options=(!strip) # sign of ext
# Do not sync $pkgrel
source=(vscode::"git+${url}.git#tag=${pkgver}"
"https://gitlab.archlinux.org/archlinux/packaging/packages/code/-/raw/${pkgver}-1/"{code.sh,code.mjs,clipath.patch,product_json.diff})
sha512sums=('dd9c523f5c9af0608af563661fe20c71b1f91bbb3502f85c0c97a46287640d7a87e029f06c63b5394a45301c94db5f0583dba0d7f8658d57c1d78390d16d8181'
            '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37'
            '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033'
            'e570b30cd470190aa56596913478d5fb8ba265a0f8c9d1408ea2118612cc69a360cc55e4523c3dc9c65f73e3dea53fc6620c97f6592fb9f86c3aca51ad3d9744'
            'b1aa0d7c5b3e3e8ba1172822d75ea38e90efc431b270e0b4ca9e45bf9c0be0f60922c8618969ef071b5b6dbd9ac9f030294f1bf49bcc28c187b46d113dca63a7')

prepare() {
  cd vscode

  # vsce-sign for extensions
  pnpm add @vscode/vsce-sign @vscode/vsce-sign-linux-$_vscode_arch

  # electron version
  _electronver=$(cat /usr/lib/electron/version)
  npm pkg set devDependencies.electron=${_electronver} # needed?
  sed -i "s/^target=.*/target=\"${_electronver/}\"/" .npmrc # native modules
  echo Replaced version of electron with $(rg -N 'target' .npmrc)

  # -git does not need this. app.dock is only for macOS
  sed -i '/app\.dock\.setMenu/i\// @ts-ignore' src/vs/platform/menubar/electron-main/menubar.ts

  # Launcher
  _electron=electron${_electronver%%.*}
  sed -e "s|name=electron|name=$_electron |" -e '/PKGBUILD/d' -i ../code.sh
  sed "1s|.*|#!/usr/lib/$_electron/electron|" -i ../code.mjs

  patch -p0 -i ../product_json.diff # https://github.com/Microsoft/vscode/issues/31168 for details.

  # Set the commit and build date
  sed -e "s/@COMMIT@/$(git rev-parse HEAD)/" -e "s/@DATE@/$(date -u -Is | sed 's/\+00:00/Z/')/" -i product.json

  # Appdata and desktop file
  sed -i 's|/usr/share/@@NAME@@/@@NAME@@|@@NAME@@|g
          s|@@NAME_SHORT@@|Code|g
          s|@@NAME_LONG@@|Code - OSS|g
          s|@@NAME@@|code-oss|g
          s|@@ICON@@|com.visualstudio.code.oss|g
          s|@@EXEC@@|code-oss|g
          s|@@LICENSE@@|MIT|g
          s|@@URLPROTOCOL@@|vscode|g' \
          resources/linux/code{.appdata.xml,.desktop,-url-handler.desktop}

  desktop-file-edit --set-key StartupWMClass --set-value code-oss resources/linux/code.desktop

  cp resources/linux/{code,code-oss}-url-handler.desktop
  desktop-file-edit --set-key MimeType --set-value x-scheme-handler/code-oss resources/linux/code-oss-url-handler.desktop

  # shell completions
  cp resources/completions/bash/code resources/completions/bash/code-oss
  cp resources/completions/zsh/_code resources/completions/zsh/_code-oss
  # Patch completions with correct names
  sed -i 's|@@APPNAME@@|code|g' resources/completions/{bash/code,zsh/_code}
  sed -i 's|@@APPNAME@@|code-oss|g' resources/completions/{bash/code-oss,zsh/_code-oss}

  patch -p1 -i "$srcdir/clipath.patch"
}

build() {
  cd vscode
  # Stop DL electron
  export XDG_CACHE_HOME="$srcdir" HOME="$srcdir"/home ELECTRON_SKIP_BINARY_DOWNLOAD=1 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
  _cache_dir="$XDG_CACHE_HOME/electron/$(echo -n "https://github.com/electron/electron/releases/download/v${_electronver}" | sha256sum | cut -d ' ' -f 1)"
  mkdir -p "$_cache_dir"
  _zip="electron-v${_electronver}-linux-${_electron_arch}.zip"
  bsdtar --format zip -cf "${_cache_dir}/${_zip}" /dev/null 2> /dev/null
  echo "$(sha256sum "$_cache_dir/$_zip" | cut -d " " -f 1) *$_zip" > build/checksums/electron.txt

  npm install
  # Remove -min if minify cause OOM
  npm run gulp vscode-linux-${_vscode_arch} #-min
}

package() {
  _elnum=$(cut -d. -f1 /usr/lib/electron/version) # hide ver from --printsrcinfo
  depends+=(electron${_elnum})
  # Launcher
  install -Dm755 code.sh "$pkgdir"/usr/bin/code
  install -Dm755 code.mjs "$pkgdir"/usr/lib/code/code.mjs
  ln -sf /usr/bin/code "$pkgdir"/usr/bin/code-oss
  # Resource files
  cp -r --reflink=auto --no-preserve=ownership --preserve=mode VSCode-linux-${_vscode_arch}/resources/app/* "$pkgdir"/usr/lib/code/
  chmod -R u=rwX,go=rX "$pkgdir" # todo: cleanup
  # system-wide tools
  ln -svf /usr/bin/rg "$pkgdir"/usr/lib/code/node_modules/@vscode/ripgrep/bin/rg
  ln -svf /usr/bin/xdg-open "$pkgdir"/usr/lib/code/node_modules/open/xdg-open
  # Appdata and desktop file
  install -Dm644 vscode/resources/linux/code.appdata.xml "$pkgdir"/usr/share/metainfo/code-oss.appdata.xml
  install -Dm644 vscode/resources/linux/code.desktop "$pkgdir"/usr/share/applications/code-oss.desktop
  install -Dm644 vscode/resources/linux/code-url-handler.desktop "$pkgdir"/usr/share/applications/code-url-handler.desktop
  install -Dm644 vscode/resources/linux/code-oss-url-handler.desktop "$pkgdir"/usr/share/applications/code-oss-url-handler.desktop
  # SVG icon
  install -d "$pkgdir"/usr/share/icons/hicolor/scalable/apps
  ln -sf /usr/lib/code/out/media/code-icon.svg "$pkgdir"/usr/share/icons/hicolor/scalable/apps/com.visualstudio.code.oss.svg
  # Shell completions
  install -Dm644 vscode/resources/completions/bash/code "$pkgdir"/usr/share/bash-completion/completions/code
  install -Dm644 vscode/resources/completions/bash/code-oss "$pkgdir"/usr/share/bash-completion/completions/code-oss
  install -Dm644 vscode/resources/completions/zsh/_code "$pkgdir"/usr/share/zsh/site-functions/_code
  install -Dm644 vscode/resources/completions/zsh/_code-oss "$pkgdir"/usr/share/zsh/site-functions/_code-oss
  # License, use $pkgname for namcap
  install -d "$pkgdir"/usr/share/licenses/${pkgname}
  mv -v "$pkgdir"/usr/lib/code/LICENSE.txt "$pkgdir"/usr/share/licenses/${pkgname}/LICENSE
  mv -v "$pkgdir"/usr/lib/code/ThirdPartyNotices.txt "$pkgdir"/usr/share/licenses/${pkgname}/
}