version: 2.1

# Required for dynamic configuration
setup: true

# Orbs
orbs:
  path-filtering: circleci/path-filtering@0.1.0

# All input parameters to pass to build config
parameters:
  run-docs-only:
    type: boolean
    default: false
  
  upload-to-s3:
    type: string
    default: '1'

  run-build-linux:
    type: boolean
    default: false

  run-build-mac:
    type: boolean
    default: false

  run-linux-publish:
    type: boolean
    default: false

  linux-publish-arch-limit:
    type: enum
    default: all
    enum: ["all", "arm", "arm64", "x64", "ia32"]

  run-macos-publish:
    type: boolean
    default: false

  macos-publish-arch-limit:
    type: enum
    default: all
    enum: ["all", "osx-x64", "osx-arm64", "mas-x64", "mas-arm64"]

# Envs
env-global: &env-global
  ELECTRON_OUT_DIR: Default

env-linux-medium: &env-linux-medium
  <<: *env-global
  NUMBER_OF_NINJA_PROCESSES: 3

# Executors
executors:
  linux-docker:
    parameters:
      size:
        description: "Docker executor size"
        default: 2xlarge+
        type: enum
        enum: ["medium", "xlarge", "2xlarge+"]
    docker:
      - image: ghcr.io/electron/build:27db4a3e3512bfd2e47f58cea69922da0835f1d9
    resource_class: << parameters.size >>

# List of always run steps
step-checkout-electron: &step-checkout-electron
  checkout:
    path: src/electron

steps-lint: &steps-lint
  steps:
    - *step-checkout-electron
    - run:
        name: Setup third_party Depot Tools
        command: |
          # "depot_tools" has to be checkout into "//third_party/depot_tools" so pylint.py can a "pylintrc" file.
          git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git src/third_party/depot_tools
          echo 'export PATH="$PATH:'"$PWD"'/src/third_party/depot_tools"' >> $BASH_ENV
    - run:
        name: Download GN Binary
        command: |
          chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
          gn_version="$(curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/DEPS?format=TEXT" | base64 -d | grep gn_version | head -n1 | cut -d\' -f4)"

          cipd ensure -ensure-file - -root . \<<-CIPD
          \$ServiceURL https://chrome-infra-packages.appspot.com/
          @Subdir src/buildtools/linux64
          gn/gn/linux-amd64 $gn_version
          CIPD

          echo 'export CHROMIUM_BUILDTOOLS_PATH="'"$PWD"'/src/buildtools"' >> $BASH_ENV
    - run:
        name: Download clang-format Binary
        command: |
          chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"

          sha1_path='buildtools/linux64/clang-format.sha1'
          curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/${sha1_path}?format=TEXT" | base64 -d > "src/${sha1_path}"

          download_from_google_storage.py --no_resume --no_auth --bucket chromium-clang-format -s "src/${sha1_path}"
    - run:
        name: Run Lint
        command: |
          # gn.py tries to find a gclient root folder starting from the current dir.
          # When it fails and returns "None" path, the whole script fails. Let's "fix" it.
          touch .gclient
          # Another option would be to checkout "buildtools" inside the Electron checkout,
          # but then we would lint its contents (at least gn format), and it doesn't pass it.

          cd src/electron
          node script/yarn install --frozen-lockfile
          node script/yarn lint
    - run:
        name: Run Script Typechecker
        command: |
          cd src/electron
          node script/yarn tsc -p tsconfig.script.json

# List of always run jobs.
jobs:
  lint:
    executor:
      name: linux-docker
      size: medium
    environment:
      <<: *env-linux-medium
    <<: *steps-lint

# Initial setup workflow
workflows:
  lint:
    jobs:
      # Job inherited from path-filtering orb
      - path-filtering/filter:
          base-revision: main
          # Params for mapping; `path-to-test parameter-to-set value-for-parameter` for each row
          mapping: |
            ^((?!docs/).)*$ run-build-mac true
            ^((?!docs/).)*$ run-build-linux true
            docs/.* run-docs-only true
            ^((?!docs/).)*$ run-docs-only false
          config-path: .circleci/build_config.yml
      - lint