From dc29c8cfcedc86d335753bbeb8df11041236eca7 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 20 Nov 2018 15:35:16 -0400 Subject: [PATCH 01/80] update documentation and README for Linux support --- .github/ISSUE_TEMPLATE/installation-issue.md | 21 +++ README.md | 99 ++++++------ docs/installation.md | 27 ++++ docs/process/publishing-linux-releases.md | 154 +++++++++++++++++++ 4 files changed, 249 insertions(+), 52 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/installation-issue.md create mode 100644 docs/process/publishing-linux-releases.md diff --git a/.github/ISSUE_TEMPLATE/installation-issue.md b/.github/ISSUE_TEMPLATE/installation-issue.md new file mode 100644 index 00000000000..0d2175f7faa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-issue.md @@ -0,0 +1,21 @@ +--- +name: "\U0001F4BB Installation issue" +about: Report a problem when installing the application +title: '' +labels: '' +assignees: '' + +--- + +### Operating System/Distribution + +Which distribution of Linux are you using? + +### Installer + +Which version of the app? +Which installer type? + +### What happened? + +Provide as much detail as possible. Error messages or output are extremely useful. diff --git a/README.md b/README.md index 006b2c5f32d..1cb904c65f7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# [GitHub Desktop](https://desktop.github.com) +# [GitHub Desktop](https://desktop.github.com) - The Linux Fork + +[![Build Status](https://brendanforster.visualstudio.com/desktop-linux/_apis/build/status/Azure%20Pipelines%20Build?branchName=linux)](https://brendanforster.visualstudio.com/desktop-linux/_build/latest?definitionId=10&branchName=linux) [GitHub Desktop](https://desktop.github.com/) is an open source [Electron](https://www.electronjs.org/)-based GitHub app. It is written in [TypeScript](https://www.typescriptlang.org) and @@ -16,78 +18,71 @@ uses [React](https://reactjs.org/). /> -## Where can I get it? - -Download the official installer for your operating system: - - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32) - - [Windows machine-wide install](https://central.github.com/deployments/desktop/desktop/latest/win32?format=msi) - -Linux is not officially supported; however, you can find installers created for Linux from a fork of GitHub Desktop in the [Community Releases](https://github.com/desktop/desktop#community-releases) section. - -### Beta Channel - -Want to test out new features and get fixes before everyone else? Install the -beta channel to get access to early builds of Desktop: +## What is this repository for? - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin?env=beta) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64?env=beta) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32?env=beta) - - [Windows (ARM64)](https://central.github.com/deployments/desktop/desktop/latest/win32-arm64?env=beta) +This repository contains specific patches on top of the upstream +`desktop/desktop` repository to support Linux usage. -The release notes for the latest beta versions are available [here](https://desktop.github.com/release-notes/?env=beta). +It also hosts preview packages for various Linux distributions: -### Community Releases + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) -There are several community-supported package managers that can be used to -install GitHub Desktop: - - Windows users can install using [winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/) `c:\> winget install github-desktop` or [Chocolatey](https://chocolatey.org/) `c:\> choco install github-desktop` - - macOS users can install using [Homebrew](https://brew.sh/) package manager: - `$ brew install --cask github` +Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to +help out with testing on your distribution. -Installers for various Linux distributions can be found on the -[`shiftkey/desktop`](https://github.com/shiftkey/desktop) fork. +## packagecloud -## Is GitHub Desktop right for me? What are the primary areas of focus? +We are trialing using [PackageCloud](https://packagecloud.io/) for distributing +the installers for Debian and RPM-based distributions. -[This document](https://github.com/desktop/desktop/blob/development/docs/process/what-is-desktop.md) describes the focus of GitHub Desktop and who the product is most useful for. +### Debian/Ubuntu distributions -## I have a problem with GitHub Desktop +To setup the package repository, run these commands: -Note: The [GitHub Desktop Code of Conduct](https://github.com/desktop/desktop/blob/development/CODE_OF_CONDUCT.md) applies in all interactions relating to the GitHub Desktop project. +``` +$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - +$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' +$ sudo apt-get update +``` -First, please search the [open issues](https://github.com/desktop/desktop/issues?q=is%3Aopen) -and [closed issues](https://github.com/desktop/desktop/issues?q=is%3Aclosed) -to see if your issue hasn't already been reported (it may also be fixed). +Then install GitHub Desktop: -There is also a list of [known issues](https://github.com/desktop/desktop/blob/development/docs/known-issues.md) -that are being tracked against Desktop, and some of these issues have workarounds. +``` +$ sudo apt install github-desktop +``` -If you can't find an issue that matches what you're seeing, open a [new issue](https://github.com/desktop/desktop/issues/new/choose), -choose the right template and provide us with enough information to investigate -further. +### Red Hat/CentOS/Fedora distributions -## The issue I reported isn't fixed yet. What can I do? +To setup the package repository, run these commands: -If nobody has responded to your issue in a few days, you're welcome to respond to it with a friendly ping in the issue. Please do not respond more than a second time if nobody has responded. The GitHub Desktop maintainers are constrained in time and resources, and diagnosing individual configurations can be difficult and time consuming. While we'll try to at least get you pointed in the right direction, we can't guarantee we'll be able to dig too deeply into any one person's issue. +``` +$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' +``` -## How can I contribute to GitHub Desktop? +Then install GitHub Desktop: -The [CONTRIBUTING.md](./.github/CONTRIBUTING.md) document will help you get setup and -familiar with the source. The [documentation](docs/) folder also contains more -resources relevant to the project. +``` +# if yum is your package manager +$ sudo yum install github-desktop +# if dnf is your package manager +$ sudo dnf install github-desktop +``` -If you're looking for something to work on, check out the [help wanted](https://github.com/desktop/desktop/issues?q=is%3Aissue+is%3Aopen+label%3A%22help%20wanted%22) label. +## Other Distributions -## Building Desktop +Arch Linux users can install GitHub Desktop from the +[AUR](https://aur.archlinux.org/packages/github-desktop-bin/). -To setup your development environment for building Desktop, check out: [`setup.md`](./docs/contributing/setup.md). +`gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. -## More Resources +## More information -See [desktop.github.com](https://desktop.github.com) for more product-oriented +Please check out the [README](https://github.com/desktop/desktop#github-desktop) +on the upstream [GitHub Desktop project](https://github.com/desktop/desktop) and +[desktop.github.com](https://desktop.github.com) for more product-oriented information about GitHub Desktop. See our [getting started documentation](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/overview/getting-started-with-github-desktop) for more information on how to set up, authenticate, and configure GitHub Desktop. diff --git a/docs/installation.md b/docs/installation.md index 6681d22a00b..af08c517d13 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,6 +13,26 @@ On Windows you have two options: - Download the `GitHubDesktopSetup.exe` and run it to install it for the current user. - Download the `GitHubDesktopSetup.msi` and run it to install a machine-wide version of GitHub Desktop - each logged-in user will then be able to run GitHub Desktop from the program at `%PROGRAMFILES(x86)\GitHub Desktop Installer\desktop.exe`. +### Linux + +On Linux there are four different package formats available, depending on your +distribution: + + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) + - Snap (`.snap`) - also available from [snapcraft.io](https://snapcraft.io/github-desktop) + +If you install the Snap package, ensure you also connect it to your password +manager: + +```shellsession +$ sudo snap connect github-desktop:password-manager-service +``` + +Without this, GitHub Desktop cannot store or retrieve account details it +requires in the user's keychain. + ## Data Directories GitHub Desktop will create directories to manage the files and data it needs to function. If you manage a network of computers and want to install GitHub Desktop, here is more information about how things work. @@ -25,6 +45,13 @@ GitHub Desktop will create directories to manage the files and data it needs to - `%LOCALAPPDATA%\GitHubDesktop\` - contains the latest versions of the app, and some older versions if the user has updated from a previous version. - `%APPDATA%\GitHub Desktop\` - this directory contains user-specific data which the application requires to run, and is created on launch if it doesn't exist. Log files are also stored in this location. +### Linux + +This varies based on the installer chosen: + + - AppImage, Debian and RPM: `~/.config/GitHub Desktop/` + - Snap: `~/snap/github-desktop/current/.config/GitHub Desktop/` + ## Log Files GitHub Desktop will generate logs as part of its normal usage, to assist with troubleshooting. They are located in the data directory that GitHub Desktop uses (see above) under a `logs` subdirectory, organized by date using the format `YYYY-MM-DD.desktop.production.log`, where `YYYY-MM-DD` is the day the log was created. diff --git a/docs/process/publishing-linux-releases.md b/docs/process/publishing-linux-releases.md new file mode 100644 index 00000000000..76a5648b68a --- /dev/null +++ b/docs/process/publishing-linux-releases.md @@ -0,0 +1,154 @@ +# Publishing Linux Releases + +This document outlines the steps I take once a release has been published from +the main GitHub Desktop project. + +This document assumes you have these remotes configured: + +``` +$ git remote -v +origin https://github.com/shiftkey/desktop (fetch) +origin https://github.com/shiftkey/desktop (push) +upstream https://github.com/desktop/desktop (fetch) +upstream https://github.com/desktop/desktop (push) +``` + +Ensure that `development` and `linux` are up-to-date: + +``` +$ git fetch --all +$ git checkout development +$ git reset upstream/development --hard +$ git push origin development +$ git checkout linux +$ git reset origin/linux --hard +$ git rebase development linux +``` + +We want to ensure our changes work against the current branch, so take some time +to rebase the changes and force push `linux` once you're done. + +``` +$ git push origin linux --force-with-lease +``` + +Wait for the continuous integration tests to pass. If `linux` is not passing the +continuous integration tests we need to investigate and identify why things are +no longer working. + +### 1. Create a branch from the release tag + +Each release tag from the upstream project matches the format `release-X.Y.Z` +where `X.Y.Z` are version numbers. We should create a corresponding branch in +this repository named `linux-release-X.Y.Z` as a starting point for the next +Linux release. + +On the command line, this looks like this (using the `2.1.3` release as an +example): + +``` +$ git checkout -b linux-release-2.1.3 release-2.1.3 +$ git push origin linux-release-2.1.3 -u +``` + +### 2. Open pull request to apply the necessary patches to the new branch + +The first step to cutting a release is to backport the latest fixes to the +release branch: + +``` +$ git checkout -b apply-changes-2.1.3 linux +$ git submodule update +$ git rebase --onto linux-release-2.1.3 development apply-changes-2.1.3 +``` + +Work through the conflicts reported until the branch is cleanly applied to the +previous release. + +When the branch is ready to go, push the branch to the remote: + +``` +$ git push origin apply-changes-2.1.3 -u +``` + +Open a pull request that targets `linux-release-2.1.3`. Review the changes and +ensure the tests pass. + +### 3. Approve and merge PR + +If we're satisifed with the pull request, we can merge the pull request to +update the release branch. + +Ensure **rebase and merge** is used here, as we want to preserve the commit +history as-is without introducing merge commits. + +If there are additional changes that need to go into the release, make sure to +include them + +### 4. Tag the release + +Ensure you are on the latest version that passes all tests: + +``` +$ git checkout linux-release-2.1.3 +$ git pull +``` + +We need to bump the version here to indicate this is not the exact same version +as the original release. The convention we follow is `release-X.Y.Z-linuxA` +where `A` is an auto-incrementing number (starting from 1). + +Update the `version` field in `app/package.json` to this new version. For +example, updating to the first release of `2.1.3` would look like this: + +```diff +diff --git a/app/package.json b/app/package.json +index fbbbb976f..3baaf9e33 100644 +--- a/app/package.json ++++ b/app/package.json +@@ -3,7 +3,7 @@ + "productName": "GitHub Desktop", + "bundleID": "com.github.GitHubClient", + "companyName": "GitHub, Inc.", +- "version": "2.1.0", ++ "version": "2.1.3-linux1", + "main": "./main.js", + "repository": { + "type": "git", +``` + +Commit and push this change to ensure we still pass the CI suite: + +``` +$ git commit -am "bump version for release" +$ git push +``` + +With this passing CI, we can tag this version to indicate this is what we are +releasing: + +``` +$ git tag release-2.1.3-linux1 +``` + +With those things in place, push the changes to the branch as well as the new +tag: + +``` +$ git push --follow-tags +``` + +### 5. Publish to GitHub + +After the tagged build completes, it will have the installers available as +artifacts. Over on Azure Pipelines - switch to the Releases tab and run "Publish +to Beta Channel" with the Snap release disabled +([**#204**](https://github.com/shiftkey/desktop/issues/202) is the tracking +issue for re-enabling that). + +When that is done, there should be a draft release available assigned to the tag +from earlier. Edit the release to add the release notes and checksums. + +**TODO:** it'd be great to have some sort of script to generate the release +notes from the changelog in this "markdown + sections" format, which would save +a lot of manual effort. From 96032f1c180d2e0f4a7fd4a28e1e23b91940d9e2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 1 Nov 2018 18:06:04 -0300 Subject: [PATCH 02/80] improvements to electron-builder config --- app/package.json | 2 +- package.json | 4 +- script/dist-info.ts | 2 +- script/electron-builder-linux.yml | 6 ++- script/package.ts | 86 +++++++++++++++++++++++++++++++ yarn.lock | 57 ++++++++++++++++---- 6 files changed, 142 insertions(+), 15 deletions(-) diff --git a/app/package.json b/app/package.json index 3179fc8622a..3b00c2632e4 100644 --- a/app/package.json +++ b/app/package.json @@ -1,5 +1,5 @@ { - "name": "desktop", + "name": "github-desktop", "productName": "GitHub Desktop", "bundleID": "com.github.GitHubClient", "companyName": "GitHub, Inc.", diff --git a/package.json b/package.json index 7b801e03378..d62ebd289ce 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,9 @@ "webpack-dev-middleware": "^5.3.1", "webpack-hot-middleware": "^2.25.1", "webpack-merge": "^5.8.0", - "xml2js": "^0.5.0" + "xml2js": "^0.5.0", + "xvfb-maybe": "^0.2.1", + "yaml": "^1.4.0" }, "devDependencies": { "@github/markdownlint-github": "^0.1.0", diff --git a/script/dist-info.ts b/script/dist-info.ts index 0be8117f7dd..31cca463381 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -25,7 +25,7 @@ export function getExecutableName() { if (process.platform === 'win32') { return `${getWindowsIdentifierName()}${suffix}` } else if (process.platform === 'linux') { - return 'desktop' + return `github-desktop${suffix}` } else { return productName } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index de59d242e2c..f83059045bb 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -1,9 +1,11 @@ -productName: 'GitHubDesktop' artifactName: '${productName}-${os}-${arch}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' icon: 'app/static/logos' + mimeTypes: + - x-scheme-handler/x-github-client + - x-scheme-handler/x-github-desktop-auth target: - deb - rpm @@ -24,6 +26,7 @@ deb: - libcurl3 | libcurl4 # keytar dependencies - libsecret-1-0 + - gnome-keyring rpm: depends: # default Electron dependencies @@ -34,3 +37,4 @@ rpm: - libcurl # keytar dependencies - libsecret + - gnome-keyring diff --git a/script/package.ts b/script/package.ts index a1e2eb8bce6..19eac68a4e2 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,8 +1,14 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' +import { createReadStream } from 'fs' +import { writeFile } from 'fs/promises' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' +import * as crypto from 'crypto' + +import glob = require('glob') + import { getProductName, getCompanyName } from '../app/package-info' import { getDistPath, @@ -32,6 +38,8 @@ if (process.platform === 'darwin') { packageOSX() } else if (process.platform === 'win32') { packageWindows() +} else if (process.platform === 'linux') { + packageLinux() } else { console.error(`I don't know how to package for ${process.platform} :(`) process.exit(1) @@ -136,3 +144,81 @@ function packageWindows() { process.exit(1) }) } + +function getSha256Checksum(fullPath: string): Promise { + return new Promise((resolve, reject) => { + const algo = 'sha256' + const shasum = crypto.createHash(algo) + + const s = createReadStream(fullPath) + s.on('data', function (d) { + shasum.update(d) + }) + s.on('error', err => { + reject(err) + }) + s.on('end', function () { + const d = shasum.digest('hex') + resolve(d) + }) + }) +} + +function generateChecksums() { + const distRoot = getDistRoot() + + const installersPath = `${distRoot}/GitHubDesktop-linux-*` + + glob(installersPath, async (error, files) => { + if (error != null) { + throw error + } + + const checksums = new Map() + + for (const f of files) { + const checksum = await getSha256Checksum(f) + checksums.set(f, checksum) + } + + let checksumsText = `Checksums: \n` + + for (const [fullPath, checksum] of checksums) { + const fileName = path.basename(fullPath) + checksumsText += `${checksum} - ${fileName}\n` + } + + const checksumFile = path.join(distRoot, 'checksums.txt') + + await writeFile(checksumFile, checksumsText) + }) +} + +function packageLinux() { + const electronBuilder = path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + 'electron-builder' + ) + + const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + + const args = [ + 'build', + '--prepackaged', + distPath, + '--x64', + '--config', + configPath, + ] + + const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + + if (error != null) { + throw error + } + + generateChecksums() +} diff --git a/yarn.lock b/yarn.lock index e1c12aa8341..2b2ab0b475e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -523,6 +523,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.3.4": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -2871,9 +2878,9 @@ camel-case@^4.1.2: tslib "^2.0.3" camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== camelcase@^5.3.1: version "5.3.1" @@ -6386,7 +6393,15 @@ js-queue@2.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -8204,6 +8219,11 @@ realistic-structured-clone@^2.0.1: typeson "^5.8.2" typeson-registry "^1.0.0-alpha.20" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -8344,9 +8364,9 @@ resolve@^1.1.6, resolve@^1.3.2: path-parse "^1.0.5" resolve@^1.10.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" @@ -9106,9 +9126,9 @@ strip-ansi@^3.0.0: ansi-regex "^2.0.0" strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4" + integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg== dependencies: ansi-regex "^4.1.0" @@ -10039,7 +10059,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: +which@^1.2.4, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -10154,6 +10174,14 @@ xtend@^4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xvfb-maybe@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz#ed8cb132957b7848b439984c66f010ea7f24361b" + integrity sha1-7YyxMpV7eEi0OZhMZvAQ6n8kNhs= + dependencies: + debug "^2.2.0" + which "^1.2.4" + y18n@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" @@ -10174,6 +10202,13 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.4.0.tgz#b729a3ef7e35bdc5ece8f28900e20a9b41510fc3" + integrity sha512-rzU83hGJrNgyT7OE2mP/SILeZxEMRJ0mza0n4KFtkNL1aXUZ79ZgZ5pIH56yT6LiqujcAs/Rqzp0ApvvNYfUfw== + dependencies: + "@babel/runtime" "^7.3.4" + yargs-parser@20.x: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" From bc30a6005908cf5c93dd50357d1876cf3642063e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 19 Apr 2019 10:05:03 -0300 Subject: [PATCH 03/80] redirect in-app menu for reporting an issue to the fork (#141) --- app/src/main-process/menu/build-default-menu.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main-process/menu/build-default-menu.ts b/app/src/main-process/menu/build-default-menu.ts index a0e394c04c0..8a7efa9a802 100644 --- a/app/src/main-process/menu/build-default-menu.ts +++ b/app/src/main-process/menu/build-default-menu.ts @@ -1,4 +1,4 @@ -import { Menu, shell, app, BrowserWindow } from 'electron' +import { Menu, shell, BrowserWindow } from 'electron' import { ensureItemIds } from './ensure-item-ids' import { MenuEvent } from './menu-event' import { truncateWithEllipsis } from '../../lib/truncate-with-ellipsis' @@ -489,22 +489,11 @@ export function buildDefaultMenu({ label: __DARWIN__ ? 'Report Issue…' : 'Report issue…', click() { shell - .openExternal('https://github.com/desktop/desktop/issues/new/choose') + .openExternal('https://github.com/shiftkey/desktop/issues/new/choose') .catch(err => log.error('Failed opening issue creation page', err)) }, } - const contactSupportItem: Electron.MenuItemConstructorOptions = { - label: __DARWIN__ ? 'Contact GitHub Support…' : '&Contact GitHub support…', - click() { - shell - .openExternal( - `https://github.com/contact?from_desktop_app=1&app_version=${app.getVersion()}` - ) - .catch(err => log.error('Failed opening contact support page', err)) - }, - } - const showUserGuides: Electron.MenuItemConstructorOptions = { label: 'Show User Guides', click() { @@ -543,7 +532,6 @@ export function buildDefaultMenu({ const helpItems = [ submitIssueItem, - contactSupportItem, showUserGuides, showKeyboardShortcuts, showLogsItem, From 2e0127baee152e20f608c4a5c7096cfb3319c9d8 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 30 May 2019 16:47:05 -0300 Subject: [PATCH 04/80] workaround for Linux users of the app to use it on very low resolution screens --- app/src/main-process/app-window.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 0a8e7299d92..81d63eebc1a 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -77,6 +77,12 @@ export class AppWindow { windowOptions.frame = false } else if (__LINUX__) { windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png') + + // relax restriction here for users trying to run app at a small + // resolution and any other side-effects of dropping this restriction are + // currently unsupported + delete windowOptions.minHeight + delete windowOptions.minWidth } this.window = new BrowserWindow(windowOptions) From 7771b659e1eb0414967de2d6b30e2b955b676645 Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Sun, 29 Mar 2020 16:01:51 -0500 Subject: [PATCH 05/80] add CLI support to Debian package, add Elementary OS shell and editor support (#231) --- app/static/linux/github | 28 ++++++++++++++++++++++++++++ script/linux-after-install.sh | 16 ++++++++++++---- script/linux-after-remove.sh | 4 ++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 app/static/linux/github diff --git a/app/static/linux/github b/app/static/linux/github new file mode 100644 index 00000000000..dfb32bf6ea4 --- /dev/null +++ b/app/static/linux/github @@ -0,0 +1,28 @@ +#!/bin/sh + +if [ ! -L "$0" ]; then + # if path is not a symlink, find relatively + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$0")")")") +else + if command -v readlink >/dev/null; then + # if readlink exists, follow the symlink and then find relatively + SYMLINK=$(readlink -f "$0") + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$SYMLINK")")")") + else + # else use the standard install location + GITHUB_PATH="/opt/GitHub Desktop" + fi +fi +# check if this is a dev install or standard +if [ -f "$GITHUB_PATH/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" +else + BINARY_NAME="github-desktop" +fi + +ELECTRON="$GITHUB_PATH/$BINARY_NAME" +CLI="$GITHUB_PATH/resources/app/cli.js" + +ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" + +exit $? diff --git a/script/linux-after-install.sh b/script/linux-after-install.sh index b6f0a7d1f0c..9a007ee6327 100644 --- a/script/linux-after-install.sh +++ b/script/linux-after-install.sh @@ -4,13 +4,21 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" INSTALL_DIR="/opt/${productFilename}" -SCRIPT=$"#!/bin/sh -export PATH=\"$INSTALL_DIR:\$PATH\"" +CLI_DIR="$INSTALL_DIR/resources/app/static" case "$1" in configure) - echo "$SCRIPT" > "${PROFILE_D_FILE}"; - . "${PROFILE_D_FILE}"; + # add executable permissions for CLI interface + chmod +x "$CLI_DIR"/github || : + # check if this is a dev install or standard + if [ -f "$INSTALL_DIR/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" + else + BINARY_NAME="github-desktop" + fi + # create symbolic links to /usr/bin directory + ln -f -s "$INSTALL_DIR"/$BINARY_NAME /usr/bin || : + ln -f -s "$CLI_DIR"/github /usr/bin || : ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/script/linux-after-remove.sh b/script/linux-after-remove.sh index 9a73886e2a5..64c0803dec3 100644 --- a/script/linux-after-remove.sh +++ b/script/linux-after-remove.sh @@ -8,6 +8,10 @@ case "$1" in echo "#!/bin/sh" > "${PROFILE_D_FILE}"; . "${PROFILE_D_FILE}"; rm "${PROFILE_D_FILE}"; + # remove symbolic links in /usr/bin directory + unlink /usr/bin/github-desktop || : + unlink /usr/bin/github-desktop-dev || : + unlink /usr/bin/github || : ;; *) From 5f776f5d1ed968ffe49c17b73679d6eb89ea363e Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:06:52 -0500 Subject: [PATCH 06/80] polish About modal for Linux build (#241) Updated the "About GitHub Desktop" model to remove the button to check for updates (since it didn't do anything on Linux) and replace with a link to the linux releases page --- app/src/ui/about/about.tsx | 20 ++++++++++++++++++-- app/src/ui/lib/releases.ts | 2 ++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/ui/about/about.tsx b/app/src/ui/about/about.tsx index 4c3d6df132a..3da23954011 100644 --- a/app/src/ui/about/about.tsx +++ b/app/src/ui/about/about.tsx @@ -14,7 +14,7 @@ import { Disposable } from 'event-kit' import { Loading } from '../lib/loading' import { RelativeTime } from '../relative-time' import { assertNever } from '../../lib/fatal-error' -import { ReleaseNotesUri } from '../lib/releases' +import { ReleaseNotesUri, LinuxReleasesUri } from '../lib/releases' import { encodePathAsUrl } from '../../lib/path' import { isTopMostDialog } from '../dialog/is-top-most' import { isWindowsAndNoLongerSupportedByElectron } from '../../lib/get-os' @@ -137,6 +137,17 @@ export class About extends React.Component { return null } + if (__LINUX__) { + const linuxReleaseLink = ( + View Releases + ) + return ( + +

{linuxReleaseLink}

+
+ ) + } + const updateStatus = this.state.updateState.status switch (updateStatus) { @@ -229,7 +240,12 @@ export class About extends React.Component { private renderUpdateDetails() { if (__LINUX__) { - return null + return ( +

+ Please visit the GitHub Desktop for Linux release page for + Linux-specific release notes and to download the latest version. +

+ ) } if (__RELEASE_CHANNEL__ === 'development') { diff --git a/app/src/ui/lib/releases.ts b/app/src/ui/lib/releases.ts index 958ccad3722..ba088f73374 100644 --- a/app/src/ui/lib/releases.ts +++ b/app/src/ui/lib/releases.ts @@ -2,3 +2,5 @@ export const ReleaseNotesUri = __RELEASE_CHANNEL__ === 'beta' ? 'https://desktop.github.com/release-notes/?env=beta' : 'https://desktop.github.com/release-notes/' + +export const LinuxReleasesUri = 'https://github.com/shiftkey/desktop/releases/' From 41b3fc80776ff153e4813404077e2bfbaaa728c9 Mon Sep 17 00:00:00 2001 From: jfgordon2 <55799997+jfgordon2@users.noreply.github.com> Date: Mon, 30 Mar 2020 12:23:37 -0500 Subject: [PATCH 07/80] Detach CLI process from terminal (#239) --- app/static/linux/github | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/static/linux/github b/app/static/linux/github index dfb32bf6ea4..0f7513eb244 100644 --- a/app/static/linux/github +++ b/app/static/linux/github @@ -23,6 +23,13 @@ fi ELECTRON="$GITHUB_PATH/$BINARY_NAME" CLI="$GITHUB_PATH/resources/app/cli.js" -ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" +case $1 in + # if help in the first variable, return contents to shell + *help*|*--help*) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@";; + # any other, redirect to /dev/null to detach from controlling terminal + *) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" < /dev/null > /dev/null &;; +esac exit $? From 8a356ab6852028f5aeb54fd616a96125ce3d13b9 Mon Sep 17 00:00:00 2001 From: Jeff Gordon Date: Tue, 14 Apr 2020 05:02:06 -0500 Subject: [PATCH 08/80] Added test for symlinks Reduce errors produced in terminal from debian package installations by testing for existence of symlink prior to executing unlink --- script/linux-after-remove.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/script/linux-after-remove.sh b/script/linux-after-remove.sh index 64c0803dec3..d85b3eb28e8 100644 --- a/script/linux-after-remove.sh +++ b/script/linux-after-remove.sh @@ -2,6 +2,7 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" +BASE_FILE="/usr/bin/github" case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) @@ -9,9 +10,9 @@ case "$1" in . "${PROFILE_D_FILE}"; rm "${PROFILE_D_FILE}"; # remove symbolic links in /usr/bin directory - unlink /usr/bin/github-desktop || : - unlink /usr/bin/github-desktop-dev || : - unlink /usr/bin/github || : + test -f ${BASE_FILE} && unlink ${BASE_FILE} + test -f ${BASE_FILE}-desktop && unlink ${BASE_FILE}-desktop + test -f ${BASE_FILE}-desktop-dev && unlink ${BASE_FILE}-desktop-dev ;; *) From 7f0a0dbb388ef460608587c8a08c424c41cdfefb Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 16 Apr 2020 13:43:46 -0300 Subject: [PATCH 09/80] set filemode for chrome-sandbox to reflect the permissions it needs (#254) --- script/package.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/script/package.ts b/script/package.ts index 19eac68a4e2..07f4b925430 100644 --- a/script/package.ts +++ b/script/package.ts @@ -195,6 +195,14 @@ function generateChecksums() { } function packageLinux() { + const helperPath = path.join(getDistPath(), 'chrome-sandbox') + const exists = fs.pathExistsSync(helperPath) + + if (exists) { + console.log('Updating file mode for chrome-sandbox…') + fs.chmodSync(helperPath, 0o4755) + } + const electronBuilder = path.resolve( __dirname, '..', From 000ac96060d60fed2d28d323d9e22ba74becfca9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 27 Jul 2023 09:03:14 -0300 Subject: [PATCH 10/80] fix: corrected exports of modules --- script/package.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/script/package.ts b/script/package.ts index 07f4b925430..447d8e62256 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,7 +1,8 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' -import { createReadStream } from 'fs' +import { createReadStream, chmodSync } from 'fs' +import { pathExistsSync } from 'fs-extra' import { writeFile } from 'fs/promises' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' @@ -196,11 +197,11 @@ function generateChecksums() { function packageLinux() { const helperPath = path.join(getDistPath(), 'chrome-sandbox') - const exists = fs.pathExistsSync(helperPath) + const exists = pathExistsSync(helperPath) if (exists) { console.log('Updating file mode for chrome-sandbox…') - fs.chmodSync(helperPath, 0o4755) + chmodSync(helperPath, 0o4755) } const electronBuilder = path.resolve( From 881a06e11e8fb1b9f0a883dad570c6c154f133a7 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 23 Apr 2020 14:05:20 -0300 Subject: [PATCH 11/80] move debian packaging out to dedicated step (#263) --- package.json | 3 + script/electron-builder-linux.yml | 17 --- script/package-debian.ts | 105 +++++++++++++ script/package-electron-builder.ts | 68 +++++++++ script/package.ts | 78 ++++------ .../deb/postinst.sh} | 2 +- .../deb/postrm.sh} | 0 yarn.lock | 144 ++++++++++++++++-- 8 files changed, 335 insertions(+), 82 deletions(-) create mode 100644 script/package-debian.ts create mode 100644 script/package-electron-builder.ts rename script/{linux-after-install.sh => resources/deb/postinst.sh} (95%) mode change 100644 => 100755 rename script/{linux-after-remove.sh => resources/deb/postrm.sh} (100%) mode change 100644 => 100755 diff --git a/package.json b/package.json index d62ebd289ce..9fa877212c7 100644 --- a/package.json +++ b/package.json @@ -165,5 +165,8 @@ "markdownlint-cli": "^0.32.2", "reserved-words": "^0.1.2", "tsconfig-paths": "^3.9.0" + }, + "optionalDependencies": { + "electron-installer-debian": "3.0.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index f83059045bb..8e67df04ebd 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -7,26 +7,9 @@ linux: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth target: - - deb - rpm - AppImage maintainer: 'GitHub, Inc ' -deb: - afterInstall: './script/linux-after-install.sh' - afterRemove: './script/linux-after-remove.sh' - depends: - # default Electron dependencies - - gconf2 - - gconf-service - - libnotify4 - - libappindicator1 - - libxtst6 - - libnss3 - # dugite-native dependencies - - libcurl3 | libcurl4 - # keytar dependencies - - libsecret-1-0 - - gnome-keyring rpm: depends: # default Electron dependencies diff --git a/script/package-debian.ts b/script/package-debian.ts new file mode 100644 index 00000000000..b6df4eb96f3 --- /dev/null +++ b/script/package-debian.ts @@ -0,0 +1,105 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +const distRoot = getDistRoot() + +// best guess based on documentation +type DebianOptions = { + // required + src: string + dest: string + arch: 'amd64' | 'i386' | 'arm64' + // optional + description?: string + productDescription?: string + categories?: Array + section?: string + priority?: 'required' | 'important' | 'standard' | 'optional' | 'extra' + homepage?: string + icon?: any + scripts?: { + preinst?: string + postinst?: string + prerm?: string + postrm?: string + } + mimeType?: Array + maintainer?: string + depends?: Array +} + +const options: DebianOptions = { + src: getDistPath(), + dest: distRoot, + arch: 'amd64', + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + section: 'GNOME;GTK;Development', + priority: 'extra', + homepage: 'https://github.com/shiftkey/desktop', + depends: [ + // additional core dependencies - are these still needed? + 'gconf2', + 'gconf-service', + 'libappindicator1', + // Desktop-specific dependencies + 'libcurl3 | libcurl4', + 'libsecret-1-0', + 'gnome-keyring', + ], + icon: { + '256x256': 'app/static/logos/256x256.png', + '512x512': 'app/static/logos/512x512.png', + '1024x1024': 'app/static/logos/1024x1024.png', + }, + scripts: { + postinst: 'script/resources/deb/postinst.sh', + postrm: 'script/resources/deb/postrm.sh', + }, + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], + maintainer: 'Brendan Forster ', +} + +export async function packageDebian(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-debian') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.deb` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.deb` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts new file mode 100644 index 00000000000..daba1973377 --- /dev/null +++ b/script/package-electron-builder.ts @@ -0,0 +1,68 @@ +/* eslint-disable no-sync */ + +import * as path from 'path' +import * as cp from 'child_process' +import { promisify } from 'util' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { getDistPath, getDistRoot } from './dist-info' + +export async function packageElectronBuilder(): Promise> { + const distPath = getDistPath() + const distRoot = getDistRoot() + + const electronBuilder = path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + 'electron-builder' + ) + + const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + + const args = [ + 'build', + '--prepackaged', + distPath, + '--x64', + '--config', + configPath, + ] + + const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + + if (error != null) { + return Promise.reject(error) + } + + const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` + + let files = await globPromise(appImageInstaller) + if (files.length !== 1) { + return Promise.reject( + `Expected one AppImage installer but instead found '${files.join( + ', ' + )}' - exiting...` + ) + } + + const appImageInstallerPath = files[0] + + const rpmInstaller = `${distRoot}/GitHubDesktop-linux-*.rpm` + + files = await globPromise(rpmInstaller) + if (files.length !== 1) { + return Promise.reject( + `Expected one RPM installer but instead found '${files.join( + ', ' + )}' - exiting...` + ) + } + + const rpmInstallerPath = files[0] + + return Promise.resolve([appImageInstallerPath, rpmInstallerPath]) +} diff --git a/script/package.ts b/script/package.ts index 447d8e62256..eb28bb39175 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,15 +1,13 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' -import { createReadStream, chmodSync } from 'fs' -import { pathExistsSync } from 'fs-extra' +import { createReadStream } from 'fs' import { writeFile } from 'fs/promises' +import { pathExists, chmod } from 'fs-extra' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' import * as crypto from 'crypto' -import glob = require('glob') - import { getProductName, getCompanyName } from '../app/package-info' import { getDistPath, @@ -31,6 +29,9 @@ import { getVersion } from '../app/package-info' import { rename } from 'fs/promises' import { join } from 'path' +import { packageElectronBuilder } from './package-electron-builder' +import { packageDebian } from './package-debian' + const distPath = getDistPath() const productName = getProductName() const outputDir = getDistRoot() @@ -165,69 +166,46 @@ function getSha256Checksum(fullPath: string): Promise { }) } -function generateChecksums() { +async function generateChecksums(files: Array) { const distRoot = getDistRoot() - const installersPath = `${distRoot}/GitHubDesktop-linux-*` - - glob(installersPath, async (error, files) => { - if (error != null) { - throw error - } + const checksums = new Map() - const checksums = new Map() - - for (const f of files) { - const checksum = await getSha256Checksum(f) - checksums.set(f, checksum) - } + for (const f of files) { + const checksum = await getSha256Checksum(f) + checksums.set(f, checksum) + } - let checksumsText = `Checksums: \n` + let checksumsText = `Checksums: \n` - for (const [fullPath, checksum] of checksums) { - const fileName = path.basename(fullPath) - checksumsText += `${checksum} - ${fileName}\n` - } + for (const [fullPath, checksum] of checksums) { + const fileName = path.basename(fullPath) + checksumsText += `${checksum} - ${fileName}\n` + } - const checksumFile = path.join(distRoot, 'checksums.txt') + const checksumFile = path.join(distRoot, 'checksums.txt') - await writeFile(checksumFile, checksumsText) - }) + await writeFile(checksumFile, checksumsText) } -function packageLinux() { +async function packageLinux() { const helperPath = path.join(getDistPath(), 'chrome-sandbox') - const exists = pathExistsSync(helperPath) + const exists = await pathExists(helperPath) if (exists) { console.log('Updating file mode for chrome-sandbox…') - chmodSync(helperPath, 0o4755) + await chmod(helperPath, 0o4755) } - const electronBuilder = path.resolve( - __dirname, - '..', - 'node_modules', - '.bin', - 'electron-builder' - ) - - const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') - - const args = [ - 'build', - '--prepackaged', - distPath, - '--x64', - '--config', - configPath, - ] + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() - const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + const installers = [...files, debianPackage] - if (error != null) { - throw error + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) } - generateChecksums() + generateChecksums(installers) } diff --git a/script/linux-after-install.sh b/script/resources/deb/postinst.sh old mode 100644 new mode 100755 similarity index 95% rename from script/linux-after-install.sh rename to script/resources/deb/postinst.sh index 9a007ee6327..79081967042 --- a/script/linux-after-install.sh +++ b/script/resources/deb/postinst.sh @@ -3,7 +3,7 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" -INSTALL_DIR="/opt/${productFilename}" +INSTALL_DIR="/usr/lib/github-desktop" CLI_DIR="$INSTALL_DIR/resources/app/static" case "$1" in diff --git a/script/linux-after-remove.sh b/script/resources/deb/postrm.sh old mode 100644 new mode 100755 similarity index 100% rename from script/linux-after-remove.sh rename to script/resources/deb/postrm.sh diff --git a/yarn.lock b/yarn.lock index 2b2ab0b475e..031d21fefab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -949,6 +949,13 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@malept/cross-spawn-promise@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" + integrity sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg== + dependencies: + cross-spawn "^7.0.1" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -3283,7 +3290,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3292,6 +3299,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + css-loader@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" @@ -3716,6 +3732,34 @@ electron-builder@^23.6.0: simple-update-notifier "^1.0.7" yargs "^17.5.1" +electron-installer-common@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.1.tgz#42738f140c15270758681ac3f32039430b9fc023" + integrity sha512-d9gEXhfSSyMn8mkFNdbUdkqdLkxVZ8nO3NDso3nuSnG1+wy7cJuuCjutwR4+zsXdQuNFC1n/DxpTk4pBLZSCTQ== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + asar "^2.0.1" + debug "^4.1.1" + fs-extra "^8.0.1" + glob "^7.1.4" + lodash "^4.17.15" + parse-author "^2.0.0" + semver "^7.1.1" + tmp-promise "^2.0.1" + +electron-installer-debian@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.0.0.tgz#abd76db8e89bc1ba1e5366975a941461dda06e6d" + integrity sha512-91iiicfK5hq6D6Xit7SFCN2GpccFBQbZB1JpYaxFdaueEjM/1hSULtCPf4e5w/2vQKZ73AfBZrxxIJqO3DhGPw== + dependencies: + debug "^4.1.1" + electron-installer-common "^0.10.0" + fs-extra "^8.0.1" + get-folder-size "^2.0.1" + lodash "^4.17.4" + word-wrap "^1.2.3" + yargs "^15.0.1" + electron-notarize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" @@ -4788,7 +4832,7 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.1.0: +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -4877,6 +4921,11 @@ galactus@^0.2.1: flora-colossus "^1.0.0" fs-extra "^4.0.0" +gar@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" + integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4887,6 +4936,14 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-folder-size@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" + integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== + dependencies: + gar "^1.0.4" + tiny-each-async "2.0.3" + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -6837,11 +6894,21 @@ lodash.upperfirst@4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lodash@^4.17.11: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lodash@^4.17.19: + version "4.17.19" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" + integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8438,6 +8505,13 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8582,10 +8656,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -8594,6 +8668,11 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.3.tgz#e4345ce73071c53f336445cfc19efb1c311df2a6" + integrity sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA== + semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -8608,13 +8687,6 @@ semver@^7.3.7: dependencies: lru-cache "^6.0.0" -semver@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -9343,6 +9415,11 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +tiny-each-async@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" + integrity sha1-jru/1tYpXxNwAD+7NxYq/loKUdE= + tmp-promise@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.5.tgz#3208d7fa44758f86a2a4c4060f3c33fea30e8038" @@ -9351,6 +9428,13 @@ tmp-promise@^1.0.5: bluebird "^3.5.0" tmp "0.0.33" +tmp-promise@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.0.2.tgz#ee605edb10f100954be5dd8b9dbe1bfd56194202" + integrity sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q== + dependencies: + tmp "0.1.0" + tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" @@ -9365,6 +9449,13 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" + integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== + dependencies: + rimraf "^2.6.3" + tmp@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -10214,6 +10305,14 @@ yargs-parser@20.x: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@^18.1.1: + version "18.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.2.tgz#2f482bea2136dbde0861683abea7756d30b504f1" + integrity sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -10232,6 +10331,23 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@^15.0.1: + version "15.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" + integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.1" + yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" From 69e5ccd5bc6f5403a244cd891e94d5783eb995a6 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 17 May 2020 14:42:40 -0300 Subject: [PATCH 12/80] move redhat packaging out to own step (#273) --- package.json | 3 +- script/electron-builder-linux.yml | 1 - script/package-electron-builder.ts | 17 +---- script/package-redhat.ts | 102 +++++++++++++++++++++++++++++ script/package.ts | 22 ++++--- script/resources/rpm/post.sh | 12 ++++ script/resources/rpm/preun.sh | 8 +++ yarn.lock | 14 +++- 8 files changed, 153 insertions(+), 26 deletions(-) create mode 100644 script/package-redhat.ts create mode 100755 script/resources/rpm/post.sh create mode 100755 script/resources/rpm/preun.sh diff --git a/package.json b/package.json index 9fa877212c7..cdb9e057550 100644 --- a/package.json +++ b/package.json @@ -167,6 +167,7 @@ "tsconfig-paths": "^3.9.0" }, "optionalDependencies": { - "electron-installer-debian": "3.0.0" + "electron-installer-debian": "3.0.0", + "electron-installer-redhat": "3.0.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index 8e67df04ebd..af0a94fc2ff 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -7,7 +7,6 @@ linux: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth target: - - rpm - AppImage maintainer: 'GitHub, Inc ' rpm: diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index daba1973377..7b26f48b2b5 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -40,7 +40,7 @@ export async function packageElectronBuilder(): Promise> { const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` - let files = await globPromise(appImageInstaller) + const files = await globPromise(appImageInstaller) if (files.length !== 1) { return Promise.reject( `Expected one AppImage installer but instead found '${files.join( @@ -51,18 +51,5 @@ export async function packageElectronBuilder(): Promise> { const appImageInstallerPath = files[0] - const rpmInstaller = `${distRoot}/GitHubDesktop-linux-*.rpm` - - files = await globPromise(rpmInstaller) - if (files.length !== 1) { - return Promise.reject( - `Expected one RPM installer but instead found '${files.join( - ', ' - )}' - exiting...` - ) - } - - const rpmInstallerPath = files[0] - - return Promise.resolve([appImageInstallerPath, rpmInstallerPath]) + return Promise.resolve([appImageInstallerPath]) } diff --git a/script/package-redhat.ts b/script/package-redhat.ts new file mode 100644 index 00000000000..4903be3811d --- /dev/null +++ b/script/package-redhat.ts @@ -0,0 +1,102 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +const distRoot = getDistRoot() + +// best guess based on documentation +type RedhatOptions = { + // required + src: string + dest: string + arch: 'x86_64' + // optional + description?: string + productDescription?: string + categories?: Array + icon?: any + scripts?: { + pre?: string + post?: string + preun?: string + postun?: string + } + homepage?: string + mimeType?: Array + requires?: Array +} + +const options: RedhatOptions = { + src: getDistPath(), + dest: distRoot, + arch: 'x86_64', + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + categories: ['GNOME', 'GTK', 'Development'], + requires: [ + // default Electron dependencies + 'libXScrnSaver', + 'libappindicator', + 'libX11-xcb', + 'alsa-lib', + // dugite-native dependencies + 'libcurl', + // keytar dependencies + 'libsecret', + 'gnome-keyring', + ], + icon: { + '256x256': 'app/static/logos/256x256.png', + '512x512': 'app/static/logos/512x512.png', + '1024x1024': 'app/static/logos/1024x1024.png', + }, + scripts: { + post: 'script/resources/rpm/post.sh', + preun: 'script/resources/rpm/preun.sh', + }, + homepage: 'https://github.com/shiftkey/desktop', + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], +} + +export async function packageRedhat(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-redhat') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.rpm` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package.ts b/script/package.ts index eb28bb39175..38075a7eccd 100644 --- a/script/package.ts +++ b/script/package.ts @@ -31,6 +31,7 @@ import { join } from 'path' import { packageElectronBuilder } from './package-electron-builder' import { packageDebian } from './package-debian' +import { packageRedhat } from './package-redhat' const distPath = getDistPath() const productName = getProductName() @@ -196,16 +197,21 @@ async function packageLinux() { console.log('Updating file mode for chrome-sandbox…') await chmod(helperPath, 0o4755) } + try { + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() + const redhatPackage = await packageRedhat() - const files = await packageElectronBuilder() - const debianPackage = await packageDebian() + const installers = [...files, debianPackage, redhatPackage] - const installers = [...files, debianPackage] + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) + } - console.log(`Installers created:`) - for (const installer of installers) { - console.log(` - ${installer}`) + generateChecksums(installers) + } catch (err) { + console.error('A problem occurred with the packaging step', err) + process.exit(1) } - - generateChecksums(installers) } diff --git a/script/resources/rpm/post.sh b/script/resources/rpm/post.sh new file mode 100755 index 00000000000..092c75b9d26 --- /dev/null +++ b/script/resources/rpm/post.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +INSTALL_DIR="/usr/lib/github-desktop" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +# add executable permissions for CLI interface +chmod +x "$CLI_DIR"/github || : + +# create symbolic links to /usr/bin directory +ln -f -s "$CLI_DIR"/github /usr/bin || : + +exit 0 diff --git a/script/resources/rpm/preun.sh b/script/resources/rpm/preun.sh new file mode 100755 index 00000000000..fdb0a748a34 --- /dev/null +++ b/script/resources/rpm/preun.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +BASE_FILE="/usr/bin/github" + +# remove symbolic links in /usr/bin directory +test -f ${BASE_FILE} && unlink ${BASE_FILE} + +exit 0 diff --git a/yarn.lock b/yarn.lock index 031d21fefab..3cd879bd60f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3760,6 +3760,18 @@ electron-installer-debian@3.0.0: word-wrap "^1.2.3" yargs "^15.0.1" +electron-installer-redhat@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz#0a066eb9f9b3e691d58c2b41eea1055e8d5ffa92" + integrity sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A== + dependencies: + debug "^4.1.1" + electron-installer-common "^0.10.0" + fs-extra "^8.1.0" + lodash "^4.17.15" + word-wrap "^1.2.3" + yargs "^15.1.0" + electron-notarize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" @@ -10348,7 +10360,7 @@ yargs@^15.0.1: y18n "^4.0.0" yargs-parser "^18.1.1" -yargs@^15.4.1: +yargs@^15.1.0, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== From 1c3bc789a14edc2a730509316d75625b0f59c69d Mon Sep 17 00:00:00 2001 From: Lukas Neubert <40118727+Serkonda@users.noreply.github.com> Date: Sat, 30 May 2020 22:14:50 +0200 Subject: [PATCH 13/80] readme: add language property to code blocks (#287) --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1cb904c65f7..355c3a1899b 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ the installers for Debian and RPM-based distributions. To setup the package repository, run these commands: -``` +```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' $ sudo apt-get update @@ -49,7 +49,7 @@ $ sudo apt-get update Then install GitHub Desktop: -``` +```sh $ sudo apt install github-desktop ``` @@ -57,16 +57,17 @@ $ sudo apt install github-desktop To setup the package repository, run these commands: -``` +```sh $ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey $ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: -``` +```sh # if yum is your package manager $ sudo yum install github-desktop + # if dnf is your package manager $ sudo dnf install github-desktop ``` From 80a0a2b93dd223fd8bd1c2635863b17838b63989 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 31 May 2020 10:10:54 -0300 Subject: [PATCH 14/80] wire up sponsorship details for the repository --- .github/FUNDING.yml | 1 + README.md | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..6905d384f6a --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: shiftkey diff --git a/README.md b/README.md index 355c3a1899b..009033b41e5 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,10 @@ help out with testing on your distribution. ## packagecloud -We are trialing using [PackageCloud](https://packagecloud.io/) for distributing -the installers for Debian and RPM-based distributions. +We use [PackageCloud](https://packagecloud.io/) for distributing +the installers for Debian and RPM-based distributions. These are not free services, +so if you can afford to help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) +the project using the link in the header. ### Debian/Ubuntu distributions From 491de989ef88a98bf365b58eb7852fc6a5871933 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 24 Jun 2020 13:32:28 -0300 Subject: [PATCH 15/80] drop unnecessary libappindicator dependency for RPM package (#300) --- script/package-redhat.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 4903be3811d..fdf617d0a92 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -44,7 +44,6 @@ const options: RedhatOptions = { requires: [ // default Electron dependencies 'libXScrnSaver', - 'libappindicator', 'libX11-xcb', 'alsa-lib', // dugite-native dependencies From f0be0e9ae7b3e77e61f9130e93423ebd544f1cba Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 24 Jun 2020 13:51:38 -0300 Subject: [PATCH 16/80] run codeql on linux branch (#302) --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0118ec3438c..c1328f2d9cb 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,7 +2,7 @@ name: 'Code scanning - action' on: push: - branches: ['development'] + branches: ['development', 'linux'] pull_request: branches: ['development'] schedule: From 0910d1bf3226d91f5e708195ebc46bd4c267e0c0 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 27 Jul 2020 14:42:15 -0300 Subject: [PATCH 17/80] add in libcurl4 as optional dependency for RPM (#315) --- script/package-redhat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index fdf617d0a92..939e576acdf 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -47,7 +47,7 @@ const options: RedhatOptions = { 'libX11-xcb', 'alsa-lib', // dugite-native dependencies - 'libcurl', + '(libcurl or libcurl4)', // keytar dependencies 'libsecret', 'gnome-keyring', From 04253adfe2c697d9fdaf52029d775d62796c1b25 Mon Sep 17 00:00:00 2001 From: Dan McCarthy Date: Tue, 4 Aug 2020 07:00:32 -0500 Subject: [PATCH 18/80] allow tilde character when specifying a local repository (#316) There already exists a function that will convert a tilde path to an absolute path. It was originally used for this purpose, but the functionality was removed during a commit that changed which function was used to validate git repositories. This reinstates that functionality and allows us to type a ~/ tilde path to get our home directories when typing in a path. --- app/src/ui/add-repository/add-existing-repository.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/ui/add-repository/add-existing-repository.tsx b/app/src/ui/add-repository/add-existing-repository.tsx index 3ea78822309..6190dbe1362 100644 --- a/app/src/ui/add-repository/add-existing-repository.tsx +++ b/app/src/ui/add-repository/add-existing-repository.tsx @@ -16,6 +16,7 @@ import { FoldoutType } from '../../lib/app-state' import untildify from 'untildify' import { showOpenDialog } from '../main-process-proxy' import { Ref } from '../lib/ref' +import { isGitRepository } from './create-repository' interface IAddExistingRepositoryProps { readonly dispatcher: Dispatcher @@ -237,9 +238,9 @@ export class AddExistingRepository extends React.Component< } private onPathChanged = async (path: string) => { - if (this.state.path !== path) { - this.updatePath(path) - } + const isRepository = await isGitRepository(this.resolvedPath(path)) + + this.setState({ path, isRepository }) } private showFilePicker = async () => { From 97c927450411d006a88dcf78dd374b3ec78df31f Mon Sep 17 00:00:00 2001 From: KrisAphalon Date: Sat, 24 Oct 2020 22:48:15 +0200 Subject: [PATCH 19/80] remove deprecated apt-key from installation setup (#354) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 009033b41e5..18226e8b4f0 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ the project using the link in the header. To setup the package repository, run these commands: ```sh -$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo apt-key add - +$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' $ sudo apt-get update ``` From 72a29eb6d70a52aaa13560b32a1e41f230d85c8c Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 5 Nov 2020 23:23:08 -0400 Subject: [PATCH 20/80] add optional x11 dependency for SUSE-based distributions (#369) --- script/package-redhat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 939e576acdf..6afc79c6fec 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -44,7 +44,7 @@ const options: RedhatOptions = { requires: [ // default Electron dependencies 'libXScrnSaver', - 'libX11-xcb', + '(libX11-xcb or libX11-xcb1)', 'alsa-lib', // dugite-native dependencies '(libcurl or libcurl4)', From 234cbd512ffcc10ca3eeb5ce7465e341657d445d Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 17 Dec 2020 15:03:36 -0400 Subject: [PATCH 21/80] align CI with the upstream settings for Actions (#393) --- .github/workflows/ci.yml | 69 ++++++++-------------------------------- 1 file changed, 13 insertions(+), 56 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 638f19ec1ba..e95aa1fae6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,32 +4,14 @@ on: push: branches: - development + - linux + - 'linux-release-*' + tags: + - 'release-*.*.*-linux*' pull_request: - workflow_call: - inputs: - repository: - default: desktop/desktop - required: false - type: string - ref: - required: true - type: string - upload-artifacts: - default: false - required: false - type: boolean - environment: - type: string - required: true - secrets: - DESKTOP_OAUTH_CLIENT_ID: - DESKTOP_OAUTH_CLIENT_SECRET: - APPLE_ID: - APPLE_ID_PASSWORD: - APPLE_APPLICATION_CERT: - APPLE_APPLICATION_CERT_PASSWORD: - WINDOWS_CERT_PFX: - WINDOWS_CERT_PASSWORD: + branches: + - linux + - 'linux-release-*' jobs: lint: @@ -60,13 +42,18 @@ jobs: fail-fast: false matrix: node: [18.14.0] - os: [macos-11, windows-2019] + os: [macos-11, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: - os: macos-11 friendlyName: macOS - os: windows-2019 friendlyName: Windows + - os: ubuntu-20.04 + friendlyName: Ubuntu + exclude: + - os: ubuntu-20.04 + arch: arm64 timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} @@ -96,13 +83,6 @@ jobs: - name: Build production app run: yarn build:prod env: - DESKTOP_OAUTH_CLIENT_ID: ${{ secrets.DESKTOP_OAUTH_CLIENT_ID }} - DESKTOP_OAUTH_CLIENT_SECRET: - ${{ secrets.DESKTOP_OAUTH_CLIENT_SECRET }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - APPLE_APPLICATION_CERT: ${{ secrets.APPLE_APPLICATION_CERT }} - KEY_PASSWORD: ${{ secrets.APPLE_APPLICATION_CERT_PASSWORD }} npm_config_arch: ${{ matrix.arch }} TARGET_ARCH: ${{ matrix.arch }} - name: Prepare testing environment @@ -114,26 +94,3 @@ jobs: - name: Run script tests if: matrix.arch == 'x64' run: yarn test:script - - name: Install Windows code signing certificate - if: ${{ runner.os == 'Windows' }} - shell: bash - env: - CERT_CONTENTS: ${{ secrets.WINDOWS_CERT_PFX }} - run: base64 -d <<<"$CERT_CONTENTS" > ./script/windows-certificate.pfx - - name: Package production app - run: yarn package - env: - npm_config_arch: ${{ matrix.arch }} - WINDOWS_CERT_PASSWORD: ${{ secrets.WINDOWS_CERT_PASSWORD }} - - name: Upload artifacts - uses: actions/upload-artifact@v3 - if: ${{ inputs.upload-artifacts }} - with: - name: ${{matrix.friendlyName}}-${{matrix.arch}} - path: | - dist/GitHub Desktop-${{matrix.arch}}.zip - dist/GitHubDesktop-*.nupkg - dist/GitHubDesktopSetup-${{matrix.arch}}.exe - dist/GitHubDesktopSetup-${{matrix.arch}}.msi - dist/bundle-size.json - if-no-files-found: error From 6c12f8d898ee598108a7346b8e4b5e2d17bf7e76 Mon Sep 17 00:00:00 2001 From: Kevin Evans Date: Sun, 27 Dec 2020 07:23:30 -0800 Subject: [PATCH 22/80] Add smaller icons (#395) --- app/static/logos/128x128.png | Bin 0 -> 25377 bytes app/static/logos/32x32.png | Bin 0 -> 5333 bytes app/static/logos/64x64.png | Bin 0 -> 13966 bytes script/package-debian.ts | 3 +++ script/package-redhat.ts | 3 +++ 5 files changed, 6 insertions(+) create mode 100644 app/static/logos/128x128.png create mode 100644 app/static/logos/32x32.png create mode 100644 app/static/logos/64x64.png diff --git a/app/static/logos/128x128.png b/app/static/logos/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..97432b294a45b95a47ef38219a850bbf4ef01da9 GIT binary patch literal 25377 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 literal 0 HcmV?d00001 diff --git a/app/static/logos/64x64.png b/app/static/logos/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8d61b8efc7b6ece2b8333ef18cd631e75ef80f GIT binary patch literal 13966 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 literal 0 HcmV?d00001 diff --git a/script/package-debian.ts b/script/package-debian.ts index b6df4eb96f3..82f1bb775a8 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -57,6 +57,9 @@ const options: DebianOptions = { 'gnome-keyring', ], icon: { + '32x32': 'app/static/logos/32x32.png', + '64x64': 'app/static/logos/64x64.png', + '128x128': 'app/static/logos/128x128.png', '256x256': 'app/static/logos/256x256.png', '512x512': 'app/static/logos/512x512.png', '1024x1024': 'app/static/logos/1024x1024.png', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 6afc79c6fec..405c435f924 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -53,6 +53,9 @@ const options: RedhatOptions = { 'gnome-keyring', ], icon: { + '32x32': 'app/static/logos/32x32.png', + '64x64': 'app/static/logos/64x64.png', + '128x128': 'app/static/logos/128x128.png', '256x256': 'app/static/logos/256x256.png', '512x512': 'app/static/logos/512x512.png', '1024x1024': 'app/static/logos/1024x1024.png', From e7bbe147c492d10d3f365080ec940e70e3cd4e37 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 24 Jan 2021 21:37:38 -0400 Subject: [PATCH 23/80] update tooling dependencies (#424) --- package.json | 4 +- script/electron-builder-linux.yml | 4 - script/package-debian.ts | 4 - script/package-redhat.ts | 4 - yarn.lock | 140 ++++++++++++++++-------------- 5 files changed, 78 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index cdb9e057550..27796197e87 100644 --- a/package.json +++ b/package.json @@ -167,7 +167,7 @@ "tsconfig-paths": "^3.9.0" }, "optionalDependencies": { - "electron-installer-debian": "3.0.0", - "electron-installer-redhat": "3.0.0" + "electron-installer-debian": "3.1.0", + "electron-installer-redhat": "3.2.0" } } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index af0a94fc2ff..bf3a36cffdd 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -11,10 +11,6 @@ linux: maintainer: 'GitHub, Inc ' rpm: depends: - # default Electron dependencies - - libXScrnSaver - - libappindicator - - libnotify # dugite-native dependencies - libcurl # keytar dependencies diff --git a/script/package-debian.ts b/script/package-debian.ts index 82f1bb775a8..35402cafaf2 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -47,10 +47,6 @@ const options: DebianOptions = { priority: 'extra', homepage: 'https://github.com/shiftkey/desktop', depends: [ - // additional core dependencies - are these still needed? - 'gconf2', - 'gconf-service', - 'libappindicator1', // Desktop-specific dependencies 'libcurl3 | libcurl4', 'libsecret-1-0', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 405c435f924..3b5a55b8a25 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -42,10 +42,6 @@ const options: RedhatOptions = { 'This is the unofficial port of GitHub Desktop for Linux distributions', categories: ['GNOME', 'GTK', 'Development'], requires: [ - // default Electron dependencies - 'libXScrnSaver', - '(libX11-xcb or libX11-xcb1)', - 'alsa-lib', // dugite-native dependencies '(libcurl or libcurl4)', // keytar dependencies diff --git a/yarn.lock b/yarn.lock index 3cd879bd60f..d3a156f8e0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1233,7 +1233,7 @@ dependencies: "@types/node" "*" -"@types/fs-extra@^9.0.11": +"@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== @@ -1255,9 +1255,9 @@ "@types/node" "*" "@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" @@ -2436,19 +2436,7 @@ asar@^2.0.1: mkdirp "^0.5.1" tmp-promise "^1.0.5" -asar@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" - integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - -asar@^3.1.0: +asar@^3.0.0, asar@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== @@ -3391,7 +3379,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.3.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3405,6 +3393,27 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -3732,42 +3741,46 @@ electron-builder@^23.6.0: simple-update-notifier "^1.0.7" yargs "^17.5.1" -electron-installer-common@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.1.tgz#42738f140c15270758681ac3f32039430b9fc023" - integrity sha512-d9gEXhfSSyMn8mkFNdbUdkqdLkxVZ8nO3NDso3nuSnG1+wy7cJuuCjutwR4+zsXdQuNFC1n/DxpTk4pBLZSCTQ== +electron-installer-common@^0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" + integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== dependencies: "@malept/cross-spawn-promise" "^1.0.0" - asar "^2.0.1" + asar "^3.0.0" debug "^4.1.1" - fs-extra "^8.0.1" + fs-extra "^9.0.0" glob "^7.1.4" lodash "^4.17.15" parse-author "^2.0.0" semver "^7.1.1" - tmp-promise "^2.0.1" + tmp-promise "^3.0.2" + optionalDependencies: + "@types/fs-extra" "^9.0.1" -electron-installer-debian@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.0.0.tgz#abd76db8e89bc1ba1e5366975a941461dda06e6d" - integrity sha512-91iiicfK5hq6D6Xit7SFCN2GpccFBQbZB1JpYaxFdaueEjM/1hSULtCPf4e5w/2vQKZ73AfBZrxxIJqO3DhGPw== +electron-installer-debian@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz#2f6107f559f6564c44e3832fb2942dd8de4d40cc" + integrity sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w== dependencies: + "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" - electron-installer-common "^0.10.0" - fs-extra "^8.0.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" get-folder-size "^2.0.1" lodash "^4.17.4" word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz#0a066eb9f9b3e691d58c2b41eea1055e8d5ffa92" - integrity sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A== +electron-installer-redhat@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.2.0.tgz#2c0f5da6f4a244453e4675ab1eca0877a66788c5" + integrity sha512-XMA+fQj3ULNVMl4eG+hIvrYITEqP1pfpERvx6kRwuPd06vdtB4KucL9241DAHT0NR5E9gnyJHM9Y6N24kk0mcA== dependencies: + "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" - electron-installer-common "^0.10.0" - fs-extra "^8.1.0" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" lodash "^4.17.15" word-wrap "^1.2.3" yargs "^15.1.0" @@ -4844,7 +4857,7 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.1, fs-extra@^8.1.0: +fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -4853,7 +4866,7 @@ fs-extra@^8.0.1, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0, fs-extra@^9.0.1: +fs-extra@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== @@ -4863,6 +4876,16 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -8517,13 +8540,6 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" -rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8663,10 +8679,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +"semver@2 || 3 || 4 || 5": + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.5.0: version "7.5.0" @@ -8675,6 +8691,16 @@ semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.5.0: dependencies: lru-cache "^6.0.0" +semver@^5.4.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== + +semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -9440,13 +9466,6 @@ tmp-promise@^1.0.5: bluebird "^3.5.0" tmp "0.0.33" -tmp-promise@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-2.0.2.tgz#ee605edb10f100954be5dd8b9dbe1bfd56194202" - integrity sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q== - dependencies: - tmp "0.1.0" - tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" @@ -9461,13 +9480,6 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - tmp@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" From 6755faced6f0b8c4e4522fcce811917edebbb487 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 10:46:08 -0400 Subject: [PATCH 24/80] run packaging step on Linux builds if all other CI steps pass (#435) --- .github/workflows/ci.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e95aa1fae6b..becf0b87003 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,17 +42,17 @@ jobs: fail-fast: false matrix: node: [18.14.0] - os: [macos-11, windows-2019, ubuntu-20.04] + os: [macos-11, windows-2019, ubuntu-18.04] arch: [x64, arm64] include: - os: macos-11 friendlyName: macOS - os: windows-2019 friendlyName: Windows - - os: ubuntu-20.04 + - os: ubuntu-18.04 friendlyName: Ubuntu exclude: - - os: ubuntu-20.04 + - os: ubuntu-18.04 arch: arm64 timeout-minutes: 60 env: @@ -94,3 +94,21 @@ jobs: - name: Run script tests if: matrix.arch == 'x64' run: yarn test:script + - name: Package application + run: yarn run package + if: ${{ matrix.os == 'ubuntu-18.04' && matrix.arch == 'x64' }} + - name: Create Release + uses: softprops/action-gh-release@v1 + if: + ${{ matrix.os == 'ubuntu-18.04' && startsWith(github.ref, + 'refs/tags/') }} + with: + files: | + dist/*.AppImage + dist/*.deb + dist/*.rpm + dist/*.txt + draft: true + prerelease: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 4114529f629da7a4b95ded21e69a6c662abf6755 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 15:11:16 -0400 Subject: [PATCH 25/80] enable dependabot monitoring for specific dependencies in project (#440) --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ca79ca5b4d5..0b10093544d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,13 @@ updates: directory: / schedule: interval: weekly + + - package-ecosystem: 'npm' + directory: '/' + open-pull-requests-limit: 5 + schedule: + interval: 'weekly' + allow: + - dependency-name: 'electron-builder' + - dependency-name: 'electron-packager' + - dependency-name: 'electron-installer-*' From f8f5c9c5fe9828a293dd6004b2540416e79704ac Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 15 Feb 2021 15:22:09 -0400 Subject: [PATCH 26/80] bump electron-installer-redhat to latest version (#438) --- package.json | 2 +- yarn.lock | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 27796197e87..7b4f82b32de 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,6 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.2.0" + "electron-installer-redhat": "3.3.0" } } diff --git a/yarn.lock b/yarn.lock index d3a156f8e0d..2327157ac24 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3035,6 +3035,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3772,10 +3781,10 @@ electron-installer-debian@3.1.0: word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.2.0.tgz#2c0f5da6f4a244453e4675ab1eca0877a66788c5" - integrity sha512-XMA+fQj3ULNVMl4eG+hIvrYITEqP1pfpERvx6kRwuPd06vdtB4KucL9241DAHT0NR5E9gnyJHM9Y6N24kk0mcA== +electron-installer-redhat@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz#acdb59d13d738c55debc5214114d36096eda1aed" + integrity sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg== dependencies: "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" @@ -3783,7 +3792,7 @@ electron-installer-redhat@3.2.0: fs-extra "^9.0.0" lodash "^4.17.15" word-wrap "^1.2.3" - yargs "^15.1.0" + yargs "^16.0.2" electron-notarize@^1.0.0: version "1.0.0" @@ -10350,6 +10359,11 @@ yargs-parser@^19.0.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-19.0.4.tgz#99183a3a59268b205c6b04177f2a5bfb46e79ba7" integrity sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw== +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -10372,7 +10386,7 @@ yargs@^15.0.1: y18n "^4.0.0" yargs-parser "^18.1.1" -yargs@^15.1.0, yargs@^15.4.1: +yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -10389,6 +10403,19 @@ yargs@^15.1.0, yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.2: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.5.1: version "17.7.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.0.tgz#b21e9af1e0a619a2a9c67b1133219b2975a07985" From 1ec28ad1517cfab01004b0c0b84403d4eee19b19 Mon Sep 17 00:00:00 2001 From: Mrlinkwii Date: Sat, 8 May 2021 22:41:34 +0100 Subject: [PATCH 27/80] add missing MIME type to AppImage package (#496) --- script/electron-builder-linux.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index bf3a36cffdd..b21abd89723 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -6,6 +6,10 @@ linux: mimeTypes: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth + # workaround for handling OAuth flow until we figure out what we're doing + # With the development OAuth details + # see https://github.com/shiftkey/desktop/issues/72 for more details + - x-scheme-handler/x-github-desktop-dev-auth target: - AppImage maintainer: 'GitHub, Inc ' From 1cca8700190b605e9ae6aeb3dfd36d048d64ad3a Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 22 Jun 2021 14:26:24 -0300 Subject: [PATCH 28/80] add section about known issues and add to Linux section (#537) --- README.md | 5 +++++ docs/known-issues.md | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/README.md b/README.md index 18226e8b4f0..5f84b021e2b 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,11 @@ Arch Linux users can install GitHub Desktop from the `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +## Known issues + +If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) +document for guidance and workarounds for common limitations. + ## More information Please check out the [README](https://github.com/desktop/desktop#github-desktop) diff --git a/docs/known-issues.md b/docs/known-issues.md index 2a8d7b89cbe..6a0eb7938a0 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -11,6 +11,8 @@ - [I get a black screen when launching Desktop](#i-get-a-black-screen-when-launching-desktop) - [Failed to open CA file after an update](#failed-to-open-ca-file-after-an-update) - [Authentication errors due to modified registry entries](#authentication-errors-due-to-modified-registry-entries) +- [Linux](#linux) + - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) # Known Issues @@ -225,3 +227,11 @@ Related issue: [#15217](https://github.com/desktop/desktop/issues/15217) If you see an error that says "Not enough resources are available to process this command" when signing in to GitHub Desktop, it's likely that you have too many credentials stored in Windows Credentials Manager. **Workaround:** open the Credential Manager application, click on Windows Credentials and go through the list to see if there are some you can delete. + +## Linux + +### I get a white screen when launching Desktop + +Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. + +**Workaround:** if you set the `GITHUB_DESKTOP_DISABLE_HARDWARE_ACCELERATION` environment variable to any value and launch Desktop again it will disable hardware acceleration on launch, so the application is usable. From a8b1612e95c4d783e9a6330232e9d1b99e3c5371 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 16:06:28 -0300 Subject: [PATCH 29/80] drop prerelease: true from release step in workflow (#551) --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index becf0b87003..1a43392d319 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,6 +109,5 @@ jobs: dist/*.rpm dist/*.txt draft: true - prerelease: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ed5f6db35968d0b6f011ccb29884224dac4d114b Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 16:24:46 -0300 Subject: [PATCH 30/80] refresh smaller icons to use new theme (#530) * drop explicit window icon on Linux * drop old icon used in app window * regenerate smaller icons from new 256px source --- app/src/main-process/app-window.ts | 3 --- app/static/linux/icon-logo.png | Bin 118370 -> 0 bytes app/static/logos/128x128.png | Bin 25377 -> 12473 bytes app/static/logos/32x32.png | Bin 5333 -> 1851 bytes app/static/logos/64x64.png | Bin 13966 -> 4779 bytes 5 files changed, 3 deletions(-) delete mode 100644 app/static/linux/icon-logo.png diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 81d63eebc1a..849010eb5bc 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -17,7 +17,6 @@ import { URLActionType } from '../lib/parse-app-url' import { ILaunchStats } from '../lib/stats' import { menuFromElectronMenu } from '../models/app-menu' import { now } from './now' -import * as path from 'path' import windowStateKeeper from 'electron-window-state' import * as ipcMain from './ipc-main' import * as ipcWebContents from './ipc-webcontents' @@ -76,8 +75,6 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { - windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png') - // relax restriction here for users trying to run app at a small // resolution and any other side-effects of dropping this restriction are // currently unsupported diff --git a/app/static/linux/icon-logo.png b/app/static/linux/icon-logo.png deleted file mode 100644 index 7e598fe01189e9dc3d1c34bee0d850c54eb71c1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118370 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

dd`1+QBLhMR9?LkaCHw)NK&N^%gW$tI% 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 literal 25377 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 diff --git a/app/static/logos/64x64.png b/app/static/logos/64x64.png index 2d8d61b8efc7b6ece2b8333ef18cd631e75ef80f..77fe2a72c18be8ac2d1de0140ae665f1e82346dc 100644 GIT binary patch literal 4779 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 FV1jxK_(=c& literal 13966 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 From b186ba9af99457d5d0eb91221d847fb647b150a1 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 6 Jul 2021 17:57:09 -0300 Subject: [PATCH 31/80] [docs] add new section for org repos (#552) --- docs/known-issues.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/known-issues.md b/docs/known-issues.md index 6a0eb7938a0..e0cc67e722e 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -13,6 +13,7 @@ - [Authentication errors due to modified registry entries](#authentication-errors-due-to-modified-registry-entries) - [Linux](#linux) - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) + - [I cannot access repositories under my organization](#i-cannot-access-repositories-under-my-organization) # Known Issues @@ -235,3 +236,20 @@ If you see an error that says "Not enough resources are available to process thi Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. **Workaround:** if you set the `GITHUB_DESKTOP_DISABLE_HARDWARE_ACCELERATION` environment variable to any value and launch Desktop again it will disable hardware acceleration on launch, so the application is usable. + +### I cannot access repositories under my organization + +The GitHub Desktop application is an OAuth application, but this fork does not +have the same permissions as the app does on Windows and macOS, which manifests +in a couple of different ways: + + - the "Clone a Repository" view does not show all organization repositories + - pushes to a repository owned by an organization may be rejected with a + generic error message + +The root cause of this is organizations by default will have "OAuth App access +restrictions" enabled, which blocks the GitHub Desktop development app that is +used by this fork. + +**Workaround:** ask your organization admin to [approve access](https://docs.github.com/en/organizations/restricting-access-to-your-organizations-data/approving-oauth-apps-for-your-organization) +to the GitHub Desktop development app. From b8b3387bf7bfb321d3cb1cfce574cf6bb3382cf7 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 14 Jul 2021 11:53:03 -0300 Subject: [PATCH 32/80] introduce abstractions to make Flatpak integration easier (#555) Co-Authored-By: nullrequest <30698906+advaithm@users.noreply.github.com> --- app/src/lib/editors/launch.ts | 22 ++++++- app/src/lib/editors/linux.ts | 3 +- app/src/lib/helpers/linux.ts | 93 +++++++++++++++++++++++++++++ app/src/lib/shells/linux.ts | 26 ++++---- app/src/lib/shells/shared.ts | 20 ++++++- app/test/unit/helpers/linux-test.ts | 30 ++++++++++ 6 files changed, 180 insertions(+), 14 deletions(-) create mode 100644 app/src/lib/helpers/linux.ts create mode 100644 app/test/unit/helpers/linux-test.ts diff --git a/app/src/lib/editors/launch.ts b/app/src/lib/editors/launch.ts index 63bcfdbcd11..45cbfd1b306 100644 --- a/app/src/lib/editors/launch.ts +++ b/app/src/lib/editors/launch.ts @@ -1,7 +1,25 @@ import { spawn, SpawnOptions } from 'child_process' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnEditor } from '../helpers/linux' import { ExternalEditorError, FoundEditor } from './shared' +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** * Open a given file or folder in the desired external editor. * @@ -35,6 +53,8 @@ export async function launchExternalEditor( // In macOS we can use `open`, which will open the right executable file // for us, we only need the path to the editor .app folder. spawn('open', ['-a', editorPath, fullPath], opts) + } else if (__LINUX__) { + spawnEditor(editorPath, fullPath, opts) } else { spawn(editorPath, [fullPath], opts) } diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index d7a0308b3c2..e53cee7c535 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -1,4 +1,5 @@ -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists } from '../helpers/linux' + import { IFoundEditor } from './found-editor' /** Represents an external editor on Linux */ diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts new file mode 100644 index 00000000000..73fe58887fe --- /dev/null +++ b/app/src/lib/helpers/linux.ts @@ -0,0 +1,93 @@ +import { join } from 'path' +import { pathExists as pathExistsInternal } from 'fs-extra' +import { + ChildProcess, + spawn, + SpawnOptionsWithoutStdio, + SpawnOptions, +} from 'child_process' + +export function isFlatpakBuild() { + return __LINUX__ && process.env.FLATPAK_HOST === '1' +} + +/** + * Convert an executable path to be relative to the flatpak host + * + * @param path a path to an executable relative to the root of the filesystem + * + */ +export function convertToFlatpakPath(path: string) { + if (!__LINUX__) { + return path + } + + if (path.startsWith('/opt/')) { + return path + } + + return join('/var/run/host', path) +} + +/** + * Checks the file path on disk exists before attempting to launch a specific shell + * + * @param path + * + * @returns `true` if the path can be resolved, or `false` otherwise + */ +export async function pathExists(path: string): Promise { + if (isFlatpakBuild()) { + path = convertToFlatpakPath(path) + } + + try { + return await pathExistsInternal(path) + } catch { + return false + } +} + +/** + * Spawn a particular shell in a way that works for Flatpak-based usage + * + * @param path path to shell, relative to the root of the filesystem + * @param args arguments to provide to the shell + * @param options additional options to provide to spawn function + * + * @returns a child process to observe and monitor + */ +export function spawnShell( + path: string, + args: string[], + options?: SpawnOptionsWithoutStdio +): ChildProcess { + if (isFlatpakBuild()) { + return spawn('flatpak-spawn', ['--host', path, ...args], options) + } + + return spawn(path, args, options) +} + +/** + * Spawn a given editor in a way that works for Flatpak-based usage + * + * @param path path to editor, relative to the root of the filesystem + * @param workingDirectory working directory to open initially in editor + * @param options additional options to provide to spawn function + */ +export function spawnEditor( + path: string, + workingDirectory: string, + options: SpawnOptions +): ChildProcess { + if (isFlatpakBuild()) { + return spawn( + 'flatpak-spawn', + ['--host', path, `"${workingDirectory}"`], + options + ) + } else { + return spawn(path, [workingDirectory], options) + } +} diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 7ab0a4a5e89..393e0bb7e30 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -1,8 +1,8 @@ -import { spawn, ChildProcess } from 'child_process' +import { ChildProcess } from 'child_process' import { assertNever } from '../fatal-error' import { IFoundShell } from './found-shell' import { parseEnumValue } from '../enum' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnShell } from '../helpers/linux' export enum Shell { Gnome = 'GNOME Terminal', @@ -27,7 +27,7 @@ export function parse(label: string): Shell { } async function getPathIfAvailable(path: string): Promise { - return (await pathExists(path)) ? path : null + return (await pathExistsLinux(path)) ? path : null } function getShellPath(shell: Shell): Promise { @@ -164,21 +164,25 @@ export function launch( case Shell.Terminator: case Shell.XFCE: case Shell.Alacritty: - return spawn(foundShell.path, ['--working-directory', path]) + return spawnShell(foundShell.path, ['--working-directory', path]) case Shell.Urxvt: - return spawn(foundShell.path, ['-cd', path]) + return spawnShell(foundShell.path, ['-cd', path]) case Shell.Konsole: - return spawn(foundShell.path, ['--workdir', path]) + return spawnShell(foundShell.path, ['--workdir', path]) case Shell.Xterm: - return spawn(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) + return spawnShell(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) case Shell.Terminology: - return spawn(foundShell.path, ['-d', path]) + return spawnShell(foundShell.path, ['-d', path]) case Shell.Deepin: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Elementary: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Kitty: - return spawn(foundShell.path, ['--single-instance', '--directory', path]) + return spawnShell(foundShell.path, [ + '--single-instance', + '--directory', + path, + ]) default: return assertNever(shell, `Unknown shell: ${shell}`) } diff --git a/app/src/lib/shells/shared.ts b/app/src/lib/shells/shared.ts index 8d9dad37f7c..149fd4d846c 100644 --- a/app/src/lib/shells/shared.ts +++ b/app/src/lib/shells/shared.ts @@ -3,9 +3,10 @@ import { ChildProcess } from 'child_process' import * as Darwin from './darwin' import * as Win32 from './win32' import * as Linux from './linux' +import { pathExists as pathExistsLinux } from '../helpers/linux' import { IFoundShell } from './found-shell' import { ShellError } from './error' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' export type Shell = Darwin.Shell | Win32.Shell | Linux.Shell @@ -72,6 +73,23 @@ export async function findShellOrDefault(shell: Shell): Promise { } } +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** Launch the given shell at the path. */ export async function launchShell( shell: FoundShell, diff --git a/app/test/unit/helpers/linux-test.ts b/app/test/unit/helpers/linux-test.ts new file mode 100644 index 00000000000..df18564e441 --- /dev/null +++ b/app/test/unit/helpers/linux-test.ts @@ -0,0 +1,30 @@ +import { convertToFlatpakPath } from '../../../src/lib/helpers/linux' + +describe('convertToFlatpakPath()', () => { + if (__LINUX__) { + it('converts /usr paths', () => { + const path = '/usr/bin/subl' + const expectedPath = '/var/run/host/usr/bin/subl' + expect(convertToFlatpakPath(path)).toEqual(expectedPath) + }) + + it('preserves /opt paths', () => { + const path = '/opt/slickedit-pro2018/bin/vs' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__WIN32__) { + it('returns same path', () => { + const path = 'C:\\Windows\\System32\\Notepad.exe' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__DARWIN__) { + it('returns same path', () => { + const path = '/usr/local/bin/code' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } +}) From 261de428de5443861a700ff65400684b54427ee8 Mon Sep 17 00:00:00 2001 From: nullrequest <30698906+advaithm@users.noreply.github.com> Date: Mon, 19 Jul 2021 17:49:26 +0530 Subject: [PATCH 33/80] escape paths with regex over quotes in flatpaks (#558) --- app/src/lib/helpers/linux.ts | 9 +++++++-- app/test/unit/helpers/linux-test.ts | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 73fe58887fe..fbe3c7742e2 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -28,7 +28,9 @@ export function convertToFlatpakPath(path: string) { return join('/var/run/host', path) } - +export function formatWorkingDirectoryForFlatpak(path: string): string { + return path.replace(/(\s)/, ' ') +} /** * Checks the file path on disk exists before attempting to launch a specific shell * @@ -82,9 +84,12 @@ export function spawnEditor( options: SpawnOptions ): ChildProcess { if (isFlatpakBuild()) { + const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( + workingDirectory + ) return spawn( 'flatpak-spawn', - ['--host', path, `"${workingDirectory}"`], + ['--host', path, EscapedworkingDirectory], options ) } else { diff --git a/app/test/unit/helpers/linux-test.ts b/app/test/unit/helpers/linux-test.ts index df18564e441..52873f4e9d0 100644 --- a/app/test/unit/helpers/linux-test.ts +++ b/app/test/unit/helpers/linux-test.ts @@ -1,4 +1,7 @@ -import { convertToFlatpakPath } from '../../../src/lib/helpers/linux' +import { + convertToFlatpakPath, + formatWorkingDirectoryForFlatpak, +} from '../../../src/lib/helpers/linux' describe('convertToFlatpakPath()', () => { if (__LINUX__) { @@ -28,3 +31,17 @@ describe('convertToFlatpakPath()', () => { }) } }) + +describe('formatWorkingDirectoryForFlatpak()', () => { + if (__LINUX__) { + it('escapes string', () => { + const path = '/home/test/path with space' + const expectedPath = '/home/test/path with space' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(expectedPath) + }) + it('returns same path', () => { + const path = '/home/test/path_wthout_spaces' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(path) + }) + } +}) From 7d84d0f8ddda18770027a2b84ebe75817eabf1b9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 19 Jul 2021 10:31:32 -0300 Subject: [PATCH 34/80] point window icon to new version (#561) --- app/src/main-process/app-window.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 849010eb5bc..b4f2c6ff869 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -7,6 +7,7 @@ import { nativeTheme, } from 'electron' import { Emitter, Disposable } from 'event-kit' +import { join } from 'path' import { encodePathAsUrl } from '../lib/path' import { getWindowState, @@ -75,6 +76,8 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { + windowOptions.icon = join(__dirname, 'static', 'logos', '512x512.png') + // relax restriction here for users trying to run app at a small // resolution and any other side-effects of dropping this restriction are // currently unsupported From a8db2563983e7ae72eda9271203c8ef1c9a8f4c8 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 22 Jul 2021 12:21:27 -0300 Subject: [PATCH 35/80] detect and support running post-install script with offline yarn (#567) --- script/post-install.ts | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/script/post-install.ts b/script/post-install.ts index 4d35d219a80..3d7d3586ff0 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -13,6 +13,22 @@ const options: SpawnSyncOptions = { stdio: 'inherit', } +/** Check if the caller has set the OFFLINe environment variable */ +function isOffline() { + return process.env.OFFLINE === '1' +} + +/** Format the arguments to ensure these work offline */ +function getYarnArgs(baseArgs: Array): Array { + const args = baseArgs + + if (isOffline()) { + args.splice(1, 0, '--offline') + } + + return args +} + function findYarnVersion(callback: (path: string) => void) { glob('vendor/yarn-*.js', (error, files) => { if (error != null) { @@ -28,27 +44,27 @@ function findYarnVersion(callback: (path: string) => void) { } findYarnVersion(path => { - let result = spawnSync( - 'node', - [path, '--cwd', 'app', 'install', '--force'], - options - ) + const installArgs = getYarnArgs([path, '--cwd', 'app', 'install', '--force']) + + let result = spawnSync('node', installArgs, options) if (result.status !== 0) { process.exit(result.status || 1) } - result = spawnSync( - 'git', - ['submodule', 'update', '--recursive', '--init'], - options - ) + if (isOffline()) { + result = spawnSync( + 'git', + ['submodule', 'update', '--recursive', '--init'], + options + ) - if (result.status !== 0) { - process.exit(result.status || 1) + if (result.status !== 0) { + process.exit(result.status || 1) + } } - result = spawnSync('node', [path, 'compile:script'], options) + result = spawnSync('node', getYarnArgs([path, 'compile:script']), options) if (result.status !== 0) { process.exit(result.status || 1) From 0ed992664259e3ba4017c0fb89721108f74d44c2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 13 Aug 2021 13:49:01 -0300 Subject: [PATCH 36/80] assorted lint fixes not caught by CI From a8018ba19c81988db84272a953f3abbb2ab69292 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 30 Aug 2021 08:57:56 -0300 Subject: [PATCH 37/80] submodules should be updated if OFFLINE=1 is not set (#587) --- script/post-install.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/post-install.ts b/script/post-install.ts index 3d7d3586ff0..0665cc3bac8 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -52,7 +52,7 @@ findYarnVersion(path => { process.exit(result.status || 1) } - if (isOffline()) { + if (!isOffline()) { result = spawnSync( 'git', ['submodule', 'update', '--recursive', '--init'], From dbcfbf3b3ffef0ec3f6bcbb8ca073c40255cb264 Mon Sep 17 00:00:00 2001 From: Gagan Yadav Date: Sun, 5 Sep 2021 19:37:17 +0530 Subject: [PATCH 38/80] Add instructions for opensuse dist in README.md (#592) --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 5f84b021e2b..166d2fc9294 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,19 @@ $ sudo yum install github-desktop $ sudo dnf install github-desktop ``` +### OpenSUSE distribution +```sh +$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +``` + +Then install GitHub Desktop: + +```sh +# if zypper is your package manager +$ sudo zypper ref && sudo zypper in github-desktop +``` + ## Other Distributions Arch Linux users can install GitHub Desktop from the From f23688461ba78c56e9f5ea62dafe0fa4a02f8813 Mon Sep 17 00:00:00 2001 From: Luna <30698906+Lunarequest@users.noreply.github.com> Date: Thu, 30 Sep 2021 21:27:13 +0530 Subject: [PATCH 39/80] Flatpak: locate and launch flatpaked code editors (#602) --- app/src/lib/helpers/linux.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index fbe3c7742e2..9a2f88c21f4 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -22,7 +22,7 @@ export function convertToFlatpakPath(path: string) { return path } - if (path.startsWith('/opt/')) { + if (path.startsWith('/opt/') || path.startsWith('/var/lib/flatpak')) { return path } @@ -31,6 +31,13 @@ export function convertToFlatpakPath(path: string) { export function formatWorkingDirectoryForFlatpak(path: string): string { return path.replace(/(\s)/, ' ') } + +export function formatPathForFlatpak(path: string): string { + if (path.startsWith('/var/lib/flatpak/app')) { + return path.replace('/var/lib/flatpak/app/', '') + } + return path +} /** * Checks the file path on disk exists before attempting to launch a specific shell * @@ -84,12 +91,13 @@ export function spawnEditor( options: SpawnOptions ): ChildProcess { if (isFlatpakBuild()) { + const actualpath = formatPathForFlatpak(path) const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( workingDirectory ) return spawn( 'flatpak-spawn', - ['--host', path, EscapedworkingDirectory], + ['--host', actualpath, EscapedworkingDirectory], options ) } else { From 54b533fe52380d62504161b566b6e72ab5d83619 Mon Sep 17 00:00:00 2001 From: Foxler2010 Date: Thu, 30 Sep 2021 19:15:38 +0000 Subject: [PATCH 40/80] fixed a typo in the README (#605) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 166d2fc9294..0f1476f185c 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ To setup the package repository, run these commands: ```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null -$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftky-desktop.list' +$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' $ sudo apt-get update ``` From e257959aeda431e56276df12a7bea0a18d256030 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Oct 2021 18:49:32 -0300 Subject: [PATCH 41/80] move icons to correct location, update usages in tooling (#606) --- app/static/{ => linux}/logos/1024x1024.png | Bin app/static/{ => linux}/logos/128x128.png | Bin app/static/{ => linux}/logos/256x256.png | Bin app/static/{ => linux}/logos/32x32.png | Bin app/static/{ => linux}/logos/512x512.png | Bin app/static/{ => linux}/logos/64x64.png | Bin script/build.ts | 9 ++++++++- script/electron-builder-linux.yml | 2 +- script/package-debian.ts | 12 ++++++------ script/package-redhat.ts | 12 ++++++------ 10 files changed, 21 insertions(+), 14 deletions(-) rename app/static/{ => linux}/logos/1024x1024.png (100%) rename app/static/{ => linux}/logos/128x128.png (100%) rename app/static/{ => linux}/logos/256x256.png (100%) rename app/static/{ => linux}/logos/32x32.png (100%) rename app/static/{ => linux}/logos/512x512.png (100%) rename app/static/{ => linux}/logos/64x64.png (100%) diff --git a/app/static/logos/1024x1024.png b/app/static/linux/logos/1024x1024.png similarity index 100% rename from app/static/logos/1024x1024.png rename to app/static/linux/logos/1024x1024.png diff --git a/app/static/logos/128x128.png b/app/static/linux/logos/128x128.png similarity index 100% rename from app/static/logos/128x128.png rename to app/static/linux/logos/128x128.png diff --git a/app/static/logos/256x256.png b/app/static/linux/logos/256x256.png similarity index 100% rename from app/static/logos/256x256.png rename to app/static/linux/logos/256x256.png diff --git a/app/static/logos/32x32.png b/app/static/linux/logos/32x32.png similarity index 100% rename from app/static/logos/32x32.png rename to app/static/linux/logos/32x32.png diff --git a/app/static/logos/512x512.png b/app/static/linux/logos/512x512.png similarity index 100% rename from app/static/logos/512x512.png rename to app/static/linux/logos/512x512.png diff --git a/app/static/logos/64x64.png b/app/static/linux/logos/64x64.png similarity index 100% rename from app/static/logos/64x64.png rename to app/static/linux/logos/64x64.png diff --git a/script/build.ts b/script/build.ts index 1b6428b5540..082deaab9c8 100755 --- a/script/build.ts +++ b/script/build.ts @@ -181,13 +181,20 @@ function packageApp() { ) } + // this setting only works for macOS and Windows, so let's clear it now to ensure + // the app is working as expected + const icon = + process.platform === 'linux' + ? undefined + : path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()) + const options: Options & IPackageAdditionalOptions = { name: getExecutableName(), platform: toPackagePlatform(process.platform), arch: toPackageArch(process.env.TARGET_ARCH), asar: false, // TODO: Probably wanna enable this down the road. out: getDistRoot(), - icon: path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()), + icon, dir: outRoot, overwrite: true, tmpdir: false, diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index b21abd89723..1963aaf486a 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -2,7 +2,7 @@ artifactName: '${productName}-${os}-${arch}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' - icon: 'app/static/logos' + icon: 'app/static/linux/logos' mimeTypes: - x-scheme-handler/x-github-client - x-scheme-handler/x-github-desktop-auth diff --git a/script/package-debian.ts b/script/package-debian.ts index 35402cafaf2..15314d519dd 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -53,12 +53,12 @@ const options: DebianOptions = { 'gnome-keyring', ], icon: { - '32x32': 'app/static/logos/32x32.png', - '64x64': 'app/static/logos/64x64.png', - '128x128': 'app/static/logos/128x128.png', - '256x256': 'app/static/logos/256x256.png', - '512x512': 'app/static/logos/512x512.png', - '1024x1024': 'app/static/logos/1024x1024.png', + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', }, scripts: { postinst: 'script/resources/deb/postinst.sh', diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 3b5a55b8a25..66ef2f39f37 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -49,12 +49,12 @@ const options: RedhatOptions = { 'gnome-keyring', ], icon: { - '32x32': 'app/static/logos/32x32.png', - '64x64': 'app/static/logos/64x64.png', - '128x128': 'app/static/logos/128x128.png', - '256x256': 'app/static/logos/256x256.png', - '512x512': 'app/static/logos/512x512.png', - '1024x1024': 'app/static/logos/1024x1024.png', + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', }, scripts: { post: 'script/resources/rpm/post.sh', From 31e87651a155f70ba7a4a208d8b44c92f4f21e74 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 22 Oct 2021 13:53:49 -0300 Subject: [PATCH 42/80] enable release job to access contents --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a43392d319..31d49dc7d31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: name: ${{ matrix.friendlyName }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} permissions: - contents: read + contents: write strategy: fail-fast: false matrix: From 595e09d0b396ba40668900f9796827e527eef3a6 Mon Sep 17 00:00:00 2001 From: Reinaldo Date: Sun, 13 Feb 2022 12:02:15 -0500 Subject: [PATCH 43/80] Changed apt-get to apt in the debian installation section of the readme file (#656) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f1476f185c..e585ba3bb9c 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ To setup the package repository, run these commands: ```sh $ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' -$ sudo apt-get update +$ sudo apt update ``` Then install GitHub Desktop: From f12decd9aa3cf3fb0a4664b3db38eac18b17a31f Mon Sep 17 00:00:00 2001 From: "Matthew W. Thomas" Date: Sat, 12 Mar 2022 12:08:56 -0600 Subject: [PATCH 44/80] Add mirror to README (#667) * Update README.md to add mirror I added `mirror.mwt.me` as a possible repo option. I tried to keep this stylistically consistent with the rest of the document. I also offloaded the GPG key download to keys.openpgp.org. This allows this step to work even if PackageCloud is out of bandwidth. It also has the advantage of putting the key id in the README and does not require users to trust me. * undo use of openpgp.org * Mention AppImage and Flatpak --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e585ba3bb9c..c09be89ddc4 100644 --- a/README.md +++ b/README.md @@ -32,36 +32,61 @@ It also hosts preview packages for various Linux distributions: Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to help out with testing on your distribution. -## packagecloud +## Repositories -We use [PackageCloud](https://packagecloud.io/) for distributing -the installers for Debian and RPM-based distributions. These are not free services, -so if you can afford to help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) -the project using the link in the header. +You can use your operating system's package manager to install `github-desktop` and +keep it up to date on Debian/RPM based distributions. There are two options for this: + +* A [PackageCloud](https://packagecloud.io/) repository with excellent global connectivity + but very limited bandwidth. This option will stop working each month when the bandwidth + limit is reached. +* A [mirror](https://mattwthomas.com/mirrors/) in the US which has effectively infinite + bandwidth and performs well in most regions (especially the Americas and Europe). + +PackageCloud, which both options depend on, is not a free service. So, if you can afford to +help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) the project +using the link in the header. ### Debian/Ubuntu distributions -To setup the package repository, run these commands: +First install our GPG certificate: + +```sh +$ wget -qO - https://mirror.mwt.me/ghd/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null +``` + +To setup the package repository, run one of these commands: ```sh -$ wget -qO - https://packagecloud.io/shiftkey/desktop/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null +# if you want to use packagecloud.io $ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' -$ sudo apt update + +# if you want to use the US mirror +$ sudo sh -c 'echo "deb [arch=amd64] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' ``` Then install GitHub Desktop: ```sh -$ sudo apt install github-desktop +$ sudo apt update && sudo apt install github-desktop ``` ### Red Hat/CentOS/Fedora distributions -To setup the package repository, run these commands: +First install our GPG certificate: ```sh -$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' +$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +``` + +To setup the package repository, run one of these commands: + +```sh +# if you want to use packagecloud.io +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' + +# if you want to use the US mirror +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: @@ -75,9 +100,22 @@ $ sudo dnf install github-desktop ``` ### OpenSUSE distribution + + +First install our GPG certificate: + +```sh +$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +``` + +To setup the package repository, run one of these commands: + ```sh -$ sudo rpm --import https://packagecloud.io/shiftkey/desktop/gpgkey -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://packagecloud.io/shiftkey/desktop/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +# if you want to use packagecloud.io +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' + +# if you want to use the US mirror +$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' ``` Then install GitHub Desktop: @@ -94,6 +132,8 @@ Arch Linux users can install GitHub Desktop from the `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +GitHub Desktop is also available cross-platform as a [Flatpak](https://github.com/flathub/io.github.shiftey.Desktop) and [AppImage](https://appimage.github.io/GitHubDesktop/). + ## Known issues If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) From 3343e773f5d6ae5e58aa77352c3c808a34626538 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 12:28:32 -0300 Subject: [PATCH 45/80] reformat helper file related to spawning flatpak --- app/src/lib/helpers/linux.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 9a2f88c21f4..5595d2a537e 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -92,9 +92,8 @@ export function spawnEditor( ): ChildProcess { if (isFlatpakBuild()) { const actualpath = formatPathForFlatpak(path) - const EscapedworkingDirectory = formatWorkingDirectoryForFlatpak( - workingDirectory - ) + const EscapedworkingDirectory = + formatWorkingDirectoryForFlatpak(workingDirectory) return spawn( 'flatpak-spawn', ['--host', actualpath, EscapedworkingDirectory], From b0f341db39dacbe5875b3f7f6773155d9cee0afc Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 13:52:37 -0300 Subject: [PATCH 46/80] Add additional validation to find the app-specific argument we require (#687 #689) --- app/src/main-process/main.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index b7728befaf3..93bb949f1e1 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -269,6 +269,16 @@ function handlePossibleProtocolLauncherArgs(args: ReadonlyArray) { } else { log.error(`Malformed launch arguments received: ${args}`) } + } else if (__LINUX__) { + // we expect this call to have several parameters before the URL we want, + // so we should filter out the program name as well as any parameters that + // look like arguments to Electron + const argsWithoutParameters = args.filter( + a => !a.endsWith('github-desktop') && !a.startsWith('--') + ) + if (argsWithoutParameters.length > 0) { + handleAppURL(argsWithoutParameters[0]) + } } else if (args.length > 1) { handleAppURL(args[1]) } From 0f3b9a65d49c864b502e3a4e52bad9b1f5c9cb5c Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 3 Apr 2022 17:51:22 -0300 Subject: [PATCH 47/80] update Actions CI status in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c09be89ddc4..82c5ad9d987 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # [GitHub Desktop](https://desktop.github.com) - The Linux Fork -[![Build Status](https://brendanforster.visualstudio.com/desktop-linux/_apis/build/status/Azure%20Pipelines%20Build?branchName=linux)](https://brendanforster.visualstudio.com/desktop-linux/_build/latest?definitionId=10&branchName=linux) +[![CI](https://github.com/shiftkey/desktop/actions/workflows/ci.yml/badge.svg)](https://github.com/shiftkey/desktop/actions/workflows/ci.yml) [GitHub Desktop](https://desktop.github.com/) is an open source [Electron](https://www.electronjs.org/)-based GitHub app. It is written in [TypeScript](https://www.typescriptlang.org) and From febbae1c953289a548249579f981fd3f338c87ad Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 15 Apr 2022 13:22:29 -0300 Subject: [PATCH 48/80] move electron-winstaller to optional dependency to not block arm32 usage --- package.json | 4 +- yarn.lock | 159 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 95 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index 7b4f82b32de..37350047cff 100644 --- a/package.json +++ b/package.json @@ -159,7 +159,6 @@ "electron": "24.4.0", "electron-builder": "^23.6.0", "electron-packager": "^15.1.0", - "electron-winstaller": "^5.0.0", "eslint-plugin-github": "^4.3.7", "jest-esm-transformer": "^1.0.0", "markdownlint-cli": "^0.32.2", @@ -168,6 +167,7 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.3.0" + "electron-installer-redhat": "3.3.0", + "electron-winstaller": "^5.0.0" } } diff --git a/yarn.lock b/yarn.lock index 2327157ac24..5a66442a258 100644 --- a/yarn.lock +++ b/yarn.lock @@ -617,19 +617,30 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" +"@electron/asar@^3.2.1": + version "3.2.4" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.4.tgz#7e8635a3c4f6d8b3f8ae6efaf5ecb9fbf3bd9864" + integrity sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g== + dependencies: + chromium-pickle-js "^0.2.0" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + "@electron/get@^1.6.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.7.1.tgz#41aa60871b9d7e225bbe68135012f88a9ef87012" - integrity sha512-+BOIzkmYbe+oOBGqSByq8zXYXCFztccoymR3uNkvX5ckJ/5xU+4peVyEvFyH6+zfv58hCo99RxgIpwuaMfRtRg== + version "1.14.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40" + integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw== dependencies: debug "^4.1.1" env-paths "^2.2.0" fs-extra "^8.1.0" got "^9.6.0" - sanitize-filename "^1.6.2" - sumchecker "^3.0.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" optionalDependencies: - global-agent "^2.0.2" + global-agent "^3.0.0" global-tunnel-ng "^2.7.1" "@electron/get@^2.0.0": @@ -660,6 +671,19 @@ minimatch "^3.0.4" plist "^3.0.4" +"@electron/universal@^1.2.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785" + integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ== + dependencies: + "@electron/asar" "^3.2.1" + "@malept/cross-spawn-promise" "^1.1.0" + debug "^4.3.1" + dir-compare "^3.0.0" + fs-extra "^9.0.1" + minimatch "^3.0.4" + plist "^3.0.4" + "@es-joy/jsdoccomment@~0.37.1": version "0.37.1" resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz#fa32a41ba12097452693343e09ad4d26d157aedd" @@ -2746,6 +2770,11 @@ buffer-equal@1.0.0: resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== +buffer-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" + integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== + buffer-from@1.x, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -3181,9 +3210,9 @@ concat-map@0.0.1: integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + version "1.1.13" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" + integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -3242,11 +3271,6 @@ core-js@^2.4.1, core-js@^2.5.3: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-js@^3.6.5: - version "3.8.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" - integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3267,6 +3291,15 @@ cross-env@^5.0.5: cross-spawn "^5.1.0" is-windows "^1.0.0" +cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" + integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + is-wsl "^2.2.0" + which "^2.0.2" + cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -3446,7 +3479,7 @@ decode-uri-component@^0.2.0: decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== dependencies: mimic-response "^1.0.0" @@ -3587,6 +3620,14 @@ dir-compare@^2.4.0: commander "2.9.0" minimatch "3.0.4" +dir-compare@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" + integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== + dependencies: + buffer-equal "^1.0.0" + minimatch "^3.0.4" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3706,9 +3747,9 @@ dotenv@^9.0.2: integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== duplexer@^0.1.2: version "0.1.2" @@ -3794,18 +3835,18 @@ electron-installer-redhat@3.3.0: word-wrap "^1.2.3" yargs "^16.0.2" -electron-notarize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" - integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og== +electron-notarize@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.2.2.tgz#ebf2b258e8e08c1c9f8ff61dc53d5b16b439daf4" + integrity sha512-ZStVWYcWI7g87/PgjPJSIIhwQXOaw4/XeXU+pWqMMktSLHaGMLHdyPPN7Cmao7+Cr7fYufA16npdtMndYciHNw== dependencies: debug "^4.1.1" fs-extra "^9.0.1" -electron-osx-sign@^0.4.11: - version "0.4.17" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz#2727ca0c79e1e4e5ccd3861fb3da9c3c913b006c" - integrity sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ== +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== dependencies: bluebird "^3.5.0" compare-version "^0.1.2" @@ -3827,27 +3868,29 @@ electron-osx-sign@^0.6.0: plist "^3.0.1" electron-packager@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.1.0.tgz#16a3733e4cad26112a2ac36f0b0f35c3b0170eff" - integrity sha512-THNm4bz1DfvR9f0g51+NjuAYELflM8+1vhQ/iv/G8vyZNKzSMuFd5doobngQKq3rRsLdPNZVnGqDdgS884d7Og== + version "15.5.2" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.5.2.tgz#9864796b8af63aa87b43151d0b6990ba7093e6b8" + integrity sha512-8zUdkSONn0jomu/efqoxApGzgqIb56ooMs671HeB/BXTPnWcWvqpEY08g16PL6ok2ymA5zPj8vmUszLrq99F0Q== dependencies: "@electron/get" "^1.6.0" - asar "^3.0.0" + "@electron/universal" "^1.2.1" + asar "^3.1.0" + cross-spawn-windows-exe "^1.2.0" debug "^4.0.1" - electron-notarize "^1.0.0" - electron-osx-sign "^0.4.11" + electron-notarize "^1.1.1" + electron-osx-sign "^0.5.0" extract-zip "^2.0.0" filenamify "^4.1.0" - fs-extra "^9.0.0" + fs-extra "^10.1.0" galactus "^0.2.1" get-package-info "^1.0.0" junk "^3.1.0" parse-author "^2.0.0" plist "^3.0.0" - rcedit "^2.0.0" + rcedit "^3.0.1" resolve "^1.1.6" semver "^7.1.3" - yargs-parser "^19.0.1" + yargs-parser "^20.2.9" electron-publish@23.6.0: version "23.6.0" @@ -5108,19 +5151,6 @@ glob@~8.0.3: minimatch "^5.0.1" once "^1.3.0" -global-agent@^2.0.2: - version "2.1.12" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" - integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== - dependencies: - boolean "^3.0.1" - core-js "^3.6.5" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -6563,7 +6593,7 @@ jsesc@^2.5.1: json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== json-buffer@3.0.1: version "3.0.1" @@ -7885,7 +7915,7 @@ pify@^2.0.0: pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pirates@^4.0.1: version "4.0.1" @@ -7982,7 +8012,7 @@ prelude-ls@~1.1.2: prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -8096,7 +8126,7 @@ prop-types@^15.7.2: proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== proxy-addr@~2.0.7: version "2.0.7" @@ -8188,10 +8218,12 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" -rcedit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.1.0.tgz#37ae6ad1fc8d7734b2e445ec3d378ace89d4076d" - integrity sha512-Nrd/65LzMjFmKpS9d2fqIxVYdW0M8ovsN0PgZhCrPMQss2yznkp6/zjEQ1a9DzzoGv2uuN3yDJAeHybOD5ZNKA== +rcedit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-3.0.1.tgz#ae21b43e49c075f4d84df1929832a12c302f3c90" + integrity sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw== + dependencies: + cross-spawn-windows-exe "^1.1.0" react-is@^16.12.0: version "16.13.1" @@ -8509,7 +8541,7 @@ resolve@^2.0.0-next.3: responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" @@ -8627,7 +8659,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: +sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== @@ -9302,7 +9334,7 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== -sumchecker@^3.0.0, sumchecker@^3.0.1: +sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== @@ -9881,7 +9913,7 @@ urix@^0.1.0: url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" @@ -10354,12 +10386,7 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^19.0.1: - version "19.0.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-19.0.4.tgz#99183a3a59268b205c6b04177f2a5bfb46e79ba7" - integrity sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw== - -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== From 8731eba64cc59a4f5fa27ae3dcedb466f4049117 Mon Sep 17 00:00:00 2001 From: Etaash-mathamsetty <45927311+Etaash-mathamsetty@users.noreply.github.com> Date: Thu, 21 Apr 2022 17:10:20 +0000 Subject: [PATCH 49/80] Add support for GNOME console and newer GNOME editors (#700) * add support for gnome console * Delete configurationCache.log * Update linux.ts * fix cap of gnome * support new GNOME Text Editor * support GNOME builder --- app/src/lib/shells/linux.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 393e0bb7e30..28bdeb898b0 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -6,6 +6,7 @@ import { pathExists as pathExistsLinux, spawnShell } from '../helpers/linux' export enum Shell { Gnome = 'GNOME Terminal', + GnomeConsole = 'GNOME Console', Mate = 'MATE Terminal', Tilix = 'Tilix', Terminator = 'Terminator', @@ -34,6 +35,8 @@ function getShellPath(shell: Shell): Promise { switch (shell) { case Shell.Gnome: return getPathIfAvailable('/usr/bin/gnome-terminal') + case Shell.GnomeConsole: + return getPathIfAvailable('/usr/bin/kgx') case Shell.Mate: return getPathIfAvailable('/usr/bin/mate-terminal') case Shell.Tilix: @@ -68,6 +71,7 @@ export async function getAvailableShells(): Promise< > { const [ gnomeTerminalPath, + gnomeConsolePath, mateTerminalPath, tilixPath, terminatorPath, @@ -82,6 +86,7 @@ export async function getAvailableShells(): Promise< kittyPath, ] = await Promise.all([ getShellPath(Shell.Gnome), + getShellPath(Shell.GnomeConsole), getShellPath(Shell.Mate), getShellPath(Shell.Tilix), getShellPath(Shell.Terminator), @@ -101,6 +106,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Gnome, path: gnomeTerminalPath }) } + if (gnomeConsolePath) { + shells.push({ shell: Shell.GnomeConsole, path: gnomeConsolePath }) + } + if (mateTerminalPath) { shells.push({ shell: Shell.Mate, path: mateTerminalPath }) } @@ -159,6 +168,7 @@ export function launch( const shell = foundShell.shell switch (shell) { case Shell.Gnome: + case Shell.GnomeConsole: case Shell.Mate: case Shell.Tilix: case Shell.Terminator: From cd3a3bec7da4a01da30e613ee227210b5688e7ef Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sat, 7 May 2022 10:50:19 -0400 Subject: [PATCH 50/80] Adds LXTerminal to terminals and Geany and Mousepad to supported editors (#711) * add LXTerminal to supported terminals * add geany to supported editors list * Update linux.ts * add mousepad to supported editors * lint changed files Co-authored-by: Brendan Forster --- app/src/lib/shells/linux.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 28bdeb898b0..2eb1aa3b824 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -19,6 +19,7 @@ export enum Shell { XFCE = 'XFCE Terminal', Alacritty = 'Alacritty', Kitty = 'Kitty', + LXTerminal = 'LXDE Terminal', } export const Default = Shell.Gnome @@ -61,6 +62,8 @@ function getShellPath(shell: Shell): Promise { return getPathIfAvailable('/usr/bin/alacritty') case Shell.Kitty: return getPathIfAvailable('/usr/bin/kitty') + case Shell.LXTerminal: + return getPathIfAvailable('/usr/bin/lxterminal') default: return assertNever(shell, `Unknown shell: ${shell}`) } @@ -84,6 +87,7 @@ export async function getAvailableShells(): Promise< xfcePath, alacrittyPath, kittyPath, + lxterminalPath, ] = await Promise.all([ getShellPath(Shell.Gnome), getShellPath(Shell.GnomeConsole), @@ -99,6 +103,7 @@ export async function getAvailableShells(): Promise< getShellPath(Shell.XFCE), getShellPath(Shell.Alacritty), getShellPath(Shell.Kitty), + getShellPath(Shell.LXTerminal), ]) const shells: Array> = [] @@ -158,6 +163,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Kitty, path: kittyPath }) } + if (lxterminalPath) { + shells.push({ shell: Shell.LXTerminal, path: lxterminalPath }) + } + return shells } @@ -193,6 +202,8 @@ export function launch( '--directory', path, ]) + case Shell.LXTerminal: + return spawnShell(foundShell.path, ['--working-directory=' + path]) default: return assertNever(shell, `Unknown shell: ${shell}`) } From c9d21fb78e3d37ab0e41101a579e61835b4ffe59 Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sat, 7 May 2022 14:04:01 -0400 Subject: [PATCH 51/80] add armv7l support to scripts (#712) * add armv7l support to scripts * lint fix new files Co-authored-by: Brendan Forster --- script/build.ts | 6 +++++- script/dist-info.ts | 8 ++++++-- script/package-debian.ts | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/script/build.ts b/script/build.ts index 082deaab9c8..69875807399 100755 --- a/script/build.ts +++ b/script/build.ts @@ -156,7 +156,11 @@ function packageApp() { targetArch = os.arch() } - if (targetArch === 'arm64' || targetArch === 'x64') { + if ( + targetArch === 'arm64' || + targetArch === 'x64' || + targetArch === 'armv7l' + ) { return targetArch } diff --git a/script/dist-info.ts b/script/dist-info.ts index 31cca463381..864330225a0 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -112,11 +112,12 @@ export const isPublishable = () => export const getChannel = () => process.env.RELEASE_CHANNEL ?? process.env.NODE_ENV ?? 'development' -export function getDistArchitecture(): 'arm64' | 'x64' { +export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { // If a specific npm_config_arch is set, we use that one instead of the OS arch (to support cross compilation) if ( process.env.npm_config_arch === 'arm64' || - process.env.npm_config_arch === 'x64' + process.env.npm_config_arch === 'x64' || + process.env.npm_config_arch === 'armv7l' ) { return process.env.npm_config_arch } @@ -124,6 +125,9 @@ export function getDistArchitecture(): 'arm64' | 'x64' { if (process.arch === 'arm64') { return 'arm64' } + if (process.arch === 'armv7l') { + return 'armv7l' + } // TODO: Check if it's x64 running on an arm64 Windows with IsWow64Process2 // More info: https://www.rudyhuyn.com/blog/2017/12/13/how-to-detect-that-your-x86-application-runs-on-windows-on-arm/ diff --git a/script/package-debian.ts b/script/package-debian.ts index 15314d519dd..fc6ae2cf57c 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -16,7 +16,7 @@ type DebianOptions = { // required src: string dest: string - arch: 'amd64' | 'i386' | 'arm64' + arch: 'amd64' | 'i386' | 'arm64' | 'armhf' // optional description?: string productDescription?: string From 03e984b469e5c14d74263044467fa1e6ec3faa79 Mon Sep 17 00:00:00 2001 From: PadowYT2 Date: Fri, 20 May 2022 22:10:51 +0800 Subject: [PATCH 52/80] Add support for detecting PhpStorm editor (#717) --- app/src/lib/editors/linux.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index e53cee7c535..56bd780ca22 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -148,6 +148,10 @@ const editors: ILinuxExternalEditor[] = [ name: 'Mousepad', paths: ['/usr/bin/mousepad'], }, + { + name: 'IntelliJ PhpStorm', + paths: ['/snap/bin/phpstorm'], + }, ] async function getAvailablePath(paths: string[]): Promise { From eb56101a4e4aa3ff02f112346fa5929278f47f52 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 7 Jul 2022 12:46:31 -0300 Subject: [PATCH 53/80] Linux build does not have the equivalent of beta channel --- app/src/ui/about/about.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/ui/about/about.tsx b/app/src/ui/about/about.tsx index 3da23954011..3c4abeeaf35 100644 --- a/app/src/ui/about/about.tsx +++ b/app/src/ui/about/about.tsx @@ -317,6 +317,10 @@ export class About extends React.Component { return } + if (__LINUX__) { + return + } + return (

Looking for the latest features?

From e378d75d6a026f398fc7e1e73829be9a86b95604 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 15 Oct 2022 16:34:00 -0300 Subject: [PATCH 54/80] allow for packaging parameters to be derived from process.arch (#774) --- script/package-debian.ts | 13 ++++++++++++- script/package-electron-builder.ts | 13 ++++++++++++- script/package-redhat.ts | 15 +++++++++++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/script/package-debian.ts b/script/package-debian.ts index fc6ae2cf57c..9a918473070 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -9,6 +9,17 @@ import { rename } from 'fs-extra' import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'arm64' + case 'arm': + return 'armhf' + default: + return 'amd64' + } +} + const distRoot = getDistRoot() // best guess based on documentation @@ -39,7 +50,7 @@ type DebianOptions = { const options: DebianOptions = { src: getDistPath(), dest: distRoot, - arch: 'amd64', + arch: getArchitecture(), description: 'Simple collaboration from your desktop', productDescription: 'This is the unofficial port of GitHub Desktop for Linux distributions', diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index 7b26f48b2b5..6292c28b9f4 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -9,6 +9,17 @@ const globPromise = promisify(glob) import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return '--arm64' + case 'arm': + return '--armv7l' + default: + return '--x64' + } +} + export async function packageElectronBuilder(): Promise> { const distPath = getDistPath() const distRoot = getDistRoot() @@ -27,7 +38,7 @@ export async function packageElectronBuilder(): Promise> { 'build', '--prepackaged', distPath, - '--x64', + getArchitecture(), '--config', configPath, ] diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 66ef2f39f37..37bd3819293 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -9,6 +9,17 @@ import { rename } from 'fs-extra' import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'aarch64' + case 'arm': + return 'armv7l' + default: + return 'x86_64' + } +} + const distRoot = getDistRoot() // best guess based on documentation @@ -16,7 +27,7 @@ type RedhatOptions = { // required src: string dest: string - arch: 'x86_64' + arch: string // optional description?: string productDescription?: string @@ -36,7 +47,7 @@ type RedhatOptions = { const options: RedhatOptions = { src: getDistPath(), dest: distRoot, - arch: 'x86_64', + arch: getArchitecture(), description: 'Simple collaboration from your desktop', productDescription: 'This is the unofficial port of GitHub Desktop for Linux distributions', From c0a9a4c2f39e6af3ad94c93c65ee26ded2826367 Mon Sep 17 00:00:00 2001 From: Sarim Khan Date: Fri, 17 Feb 2023 19:43:51 +0600 Subject: [PATCH 55/80] Fix args processing on first launch on linux (#793) --- app/src/main-process/main.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index 93bb949f1e1..801577cd00b 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -151,6 +151,10 @@ if (__WIN32__ && process.argv.length > 1) { } } +if (__LINUX__ && process.argv.length > 1) { + handlePossibleProtocolLauncherArgs(process.argv) +} + initializeDesktopNotifications() function handleAppURL(url: string) { From 9c536507d2a029aa66e98cfaf4eab1fe94472fe6 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 20 Feb 2023 15:38:16 -0400 Subject: [PATCH 56/80] refresh docs to move away from PackageCloud (#836) --- README.md | 113 ++++++++++++++++++------------------------- docs/known-issues.md | 18 +++++++ 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 82c5ad9d987..c2e6ccd7b68 100644 --- a/README.md +++ b/README.md @@ -23,122 +23,105 @@ uses [React](https://reactjs.org/). This repository contains specific patches on top of the upstream `desktop/desktop` repository to support Linux usage. -It also hosts preview packages for various Linux distributions: +It also publishes [releases](https://github.com/shiftkey/desktop/releases) for various Linux distributions: - AppImage (`.AppImage`) - Debian (`.deb`) - RPM (`.rpm`) -Check out the [latest releases](https://github.com/shiftkey/desktop/releases) to -help out with testing on your distribution. - -## Repositories +## Installation via package manager You can use your operating system's package manager to install `github-desktop` and -keep it up to date on Debian/RPM based distributions. There are two options for this: - -* A [PackageCloud](https://packagecloud.io/) repository with excellent global connectivity - but very limited bandwidth. This option will stop working each month when the bandwidth - limit is reached. -* A [mirror](https://mattwthomas.com/mirrors/) in the US which has effectively infinite - bandwidth and performs well in most regions (especially the Americas and Europe). +keep it up to date on Debian and RPM-based distributions. -PackageCloud, which both options depend on, is not a free service. So, if you can afford to -help with these costs please [**Sponsor**](https://github.com/sponsors/shiftkey) the project -using the link in the header. +### Debian/Ubuntu -### Debian/Ubuntu distributions +There are two APT package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -First install our GPG certificate: +#### [@shiftkey](https://github.com/shiftkey) package feed -```sh -$ wget -qO - https://mirror.mwt.me/ghd/gpgkey | sudo tee /etc/apt/trusted.gpg.d/shiftkey-desktop.asc > /dev/null ``` - -To setup the package repository, run one of these commands: - -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo "deb [arch=amd64] https://packagecloud.io/shiftkey/desktop/any/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' - -# if you want to use the US mirror -$ sudo sh -c 'echo "deb [arch=amd64] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.asc] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` -Then install GitHub Desktop: +#### [@mwt](https://github.com/mwt) package feed ```sh -$ sudo apt update && sudo apt install github-desktop +wget -qO - https://mirror.mwt.me/ghd/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` -### Red Hat/CentOS/Fedora distributions +#### Installation -First install our GPG certificate: +Once you have a feed configured, run this command to install the application: ```sh -$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo apt update && sudo apt install github-desktop ``` -To setup the package repository, run one of these commands: +### Red Hat/CentOS/Fedora/OpenSUSE -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' - -# if you want to use the US mirror -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/shiftkey-desktop.repo' -``` +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -Then install GitHub Desktop: +#### [@shiftkey](https://github.com/shiftkey) package feed -```sh -# if yum is your package manager -$ sudo yum install github-desktop - -# if dnf is your package manager -$ sudo dnf install github-desktop +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/yum.repos.d/shiftkey-packages.repo' ``` -### OpenSUSE distribution - - -First install our GPG certificate: +#### [@mwt](https://github.com/mwt) package feed ```sh -$ sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo rpm --import https://mirror.mwt.me/ghd/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' ``` -To setup the package repository, run one of these commands: +#### Installation -```sh -# if you want to use packagecloud.io -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://packagecloud.io/shiftkey/desktop/el/7/\$basearch\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' +Once you have a feed configured, run this command to install the application: -# if you want to use the US mirror -$ sudo sh -c 'echo -e "[shiftkey]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/zypp/repos.d/shiftkey-desktop.repo' -``` +```sh +# if yum is your package manager +sudo yum install github-desktop -Then install GitHub Desktop: +# if dnf is your package manager +sudo dnf install github-desktop -```sh # if zypper is your package manager -$ sudo zypper ref && sudo zypper in github-desktop +sudo zypper ref && sudo zypper in github-desktop ``` ## Other Distributions -Arch Linux users can install GitHub Desktop from the -[AUR](https://aur.archlinux.org/packages/github-desktop-bin/). +### Arch Linux + +Arch Linux users can install GitHub Desktop from the [AUR](https://aur.archlinux.org/packages/github-desktop-bin/). `gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. +### Cross-Distribution Packages + GitHub Desktop is also available cross-platform as a [Flatpak](https://github.com/flathub/io.github.shiftey.Desktop) and [AppImage](https://appimage.github.io/GitHubDesktop/). +### deb-get + +Debian/Ubuntu users can also install directly from this repository using [`deb-get`](https://github.com/wimpysworld/deb-get): `deb-get install github-desktop`. + ## Known issues If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) document for guidance and workarounds for common limitations. +If your package manager is still trying to reach PackageCloud, refer to the +[cleanup instructions](docs/known-issues.md#the-packagecloud-package-feed-is-no-longer-working) +for details about migrating away. + ## More information Please check out the [README](https://github.com/desktop/desktop#github-desktop) diff --git a/docs/known-issues.md b/docs/known-issues.md index e0cc67e722e..cbddf7f67ba 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -231,6 +231,24 @@ If you see an error that says "Not enough resources are available to process thi ## Linux +### The PackageCloud package feed is no longer working + +The PackageCloud feed has been closed down. If you are seeing errors about this you should remove the configuration for this feed and refer to the [README](https://github.com/shiftkey/desktop#repositories) +for the new settings. + +#### APT configuration + +``` +sudo rm /etc/apt/trusted.gpg.d/shiftkey-desktop.asc +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + +#### RPM configuration + +``` +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + ### I get a white screen when launching Desktop Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. From 9a478289b9118a93e5229318267c9de788212ef7 Mon Sep 17 00:00:00 2001 From: "Matthew W. Thomas" Date: Mon, 20 Feb 2023 16:11:29 -0600 Subject: [PATCH 57/80] Update readme to use new mirror origin (#838) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c2e6ccd7b68..da50bdb43ba 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,8 @@ sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages. #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/ghd/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/ghd/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation @@ -78,8 +78,8 @@ sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://r #### [@mwt](https://github.com/mwt) package feed ```sh -sudo rpm --import https://mirror.mwt.me/ghd/gpgkey -sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/ghd/rpm\nenabled=1\ngpgcheck=0\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/ghd/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' ``` #### Installation From f4c6000245d78d1744c2715854f6a83ef558be63 Mon Sep 17 00:00:00 2001 From: Jumpei Ogawa Date: Wed, 22 Feb 2023 10:10:26 +0900 Subject: [PATCH 58/80] doc: rename GPG public key file to use .gpg extension (#839) See: https://github.com/shiftkey/desktop/issues/834#issuecomment-1439099319 --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index da50bdb43ba..89d78570ff4 100644 --- a/README.md +++ b/README.md @@ -43,15 +43,15 @@ releases from this repository. #### [@shiftkey](https://github.com/shiftkey) package feed ``` -wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.asc] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.asc > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.asc] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation From 0ffd3a456d58cbd0c7515275a3b902e934b98a85 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Feb 2023 10:36:24 -0400 Subject: [PATCH 59/80] patch `electron-installer-redhat` to disable `.build-id` links in directory (#837) * add patch-package so we can patch a node_modules package * generate patch to disable build-id contents for RPM package * move patch-package command to post-install script * regenerate patch file --- package.json | 2 + patches/electron-installer-redhat+3.3.0.patch | 10 +++ script/post-install.ts | 8 ++ yarn.lock | 88 +++++++++++++++---- 4 files changed, 92 insertions(+), 16 deletions(-) create mode 100644 patches/electron-installer-redhat+3.3.0.patch diff --git a/package.json b/package.json index 37350047cff..7ad9d9c8b47 100644 --- a/package.json +++ b/package.json @@ -162,6 +162,8 @@ "eslint-plugin-github": "^4.3.7", "jest-esm-transformer": "^1.0.0", "markdownlint-cli": "^0.32.2", + "patch-package": "^6.5.1", + "postinstall-postinstall": "^2.1.0", "reserved-words": "^0.1.2", "tsconfig-paths": "^3.9.0" }, diff --git a/patches/electron-installer-redhat+3.3.0.patch b/patches/electron-installer-redhat+3.3.0.patch new file mode 100644 index 00000000000..1c89e87c8fc --- /dev/null +++ b/patches/electron-installer-redhat+3.3.0.patch @@ -0,0 +1,10 @@ +diff --git a/node_modules/electron-installer-redhat/resources/spec.ejs b/node_modules/electron-installer-redhat/resources/spec.ejs +index 48f1dfd..360aec5 100644 +--- a/node_modules/electron-installer-redhat/resources/spec.ejs ++++ b/node_modules/electron-installer-redhat/resources/spec.ejs +@@ -1,4 +1,5 @@ + %define _binary_payload w<%= compressionLevel %>.xzdio ++%define _build_id_links none + + Name: <%= name %> + Version: <%= version %> diff --git a/script/post-install.ts b/script/post-install.ts index 0665cc3bac8..3f79a3d1f2d 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -69,4 +69,12 @@ findYarnVersion(path => { if (result.status !== 0) { process.exit(result.status || 1) } + + if (process.platform === 'linux') { + result = spawnSync('node', getYarnArgs([path, 'patch-package']), options) + + if (result.status !== 0) { + process.exit(result.status || 1) + } + } }) diff --git a/yarn.lock b/yarn.lock index 5a66442a258..74c962b8f6f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2035,6 +2035,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2956,15 +2961,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3309,7 +3306,7 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -4813,6 +4810,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -5940,7 +5944,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6763,6 +6767,13 @@ klaw-sync@^3.0.0: dependencies: graceful-fs "^4.1.11" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -7665,6 +7676,14 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -7835,6 +7854,26 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -7999,6 +8038,11 @@ postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8581,6 +8625,13 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8720,10 +8771,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5": - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== +"semver@2 || 3 || 4 || 5", semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.5.0: version "7.5.0" @@ -9514,7 +9565,7 @@ tmp-promise@^3.0.2: dependencies: tmp "^0.2.0" -tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -10358,6 +10409,11 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yaml@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.4.0.tgz#b729a3ef7e35bdc5ece8f28900e20a9b41510fc3" From 4318556ce71e7a7a5e30878927cf3f66077f66c9 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 26 Feb 2023 12:45:52 -0400 Subject: [PATCH 60/80] Delete FUNDING.yml --- .github/FUNDING.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 6905d384f6a..00000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: shiftkey From e80b7b2b872a1f2ced8b6a713636bd2e0e4c8a64 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Wed, 1 Mar 2023 13:31:39 -0400 Subject: [PATCH 61/80] change keyring path to more predictable directory (#843) --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 89d78570ff4..d382f048941 100644 --- a/README.md +++ b/README.md @@ -43,15 +43,15 @@ releases from this repository. #### [@shiftkey](https://github.com/shiftkey) package feed ``` -wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/shiftkey-packages.gpg > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/shiftkey-packages.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' ``` #### [@mwt](https://github.com/mwt) package feed ```sh -wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /etc/apt/keyrings/mwt-desktop.gpg > /dev/null -sudo sh -c 'echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/mwt-desktop.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' ``` #### Installation From 37a0fa8a30cbbfbb9b2560273755f2a973379900 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 7 Apr 2023 12:05:58 -0300 Subject: [PATCH 62/80] upgrade to supported Ubuntu runner (#863) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31d49dc7d31..fb1fa065dd8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,17 +42,17 @@ jobs: fail-fast: false matrix: node: [18.14.0] - os: [macos-11, windows-2019, ubuntu-18.04] + os: [macos-11, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: - os: macos-11 friendlyName: macOS - os: windows-2019 friendlyName: Windows - - os: ubuntu-18.04 + - os: ubuntu-20.04 friendlyName: Ubuntu exclude: - - os: ubuntu-18.04 + - os: ubuntu-20.04 arch: arm64 timeout-minutes: 60 env: @@ -96,11 +96,11 @@ jobs: run: yarn test:script - name: Package application run: yarn run package - if: ${{ matrix.os == 'ubuntu-18.04' && matrix.arch == 'x64' }} + if: ${{ matrix.os == 'ubuntu-20.04' && matrix.arch == 'x64' }} - name: Create Release uses: softprops/action-gh-release@v1 if: - ${{ matrix.os == 'ubuntu-18.04' && startsWith(github.ref, + ${{ matrix.os == 'ubuntu-20.04' && startsWith(github.ref, 'refs/tags/') }} with: files: | From 88103dee6604a42b089ce26b3816b0790bac31b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Apr 2023 15:24:34 +0000 Subject: [PATCH 63/80] Bump electron-installer-redhat from 3.3.0 to 3.4.0 (#848) * Bump electron-installer-redhat from 3.3.0 to 3.4.0 Dependabot couldn't find the original pull request head commit, 6b63cfc1af923f12c049530d60f311d5434c2e3f. * regenerate patch file --------- Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Brendan Forster --- package.json | 2 +- ... => electron-installer-redhat+3.4.0.patch} | 6 +-- yarn.lock | 41 ++++--------------- 3 files changed, 11 insertions(+), 38 deletions(-) rename patches/{electron-installer-redhat+3.3.0.patch => electron-installer-redhat+3.4.0.patch} (78%) diff --git a/package.json b/package.json index 7ad9d9c8b47..edc7e9ce3bd 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,7 @@ }, "optionalDependencies": { "electron-installer-debian": "3.1.0", - "electron-installer-redhat": "3.3.0", + "electron-installer-redhat": "3.4.0", "electron-winstaller": "^5.0.0" } } diff --git a/patches/electron-installer-redhat+3.3.0.patch b/patches/electron-installer-redhat+3.4.0.patch similarity index 78% rename from patches/electron-installer-redhat+3.3.0.patch rename to patches/electron-installer-redhat+3.4.0.patch index 1c89e87c8fc..9f8d649ba51 100644 --- a/patches/electron-installer-redhat+3.3.0.patch +++ b/patches/electron-installer-redhat+3.4.0.patch @@ -1,10 +1,10 @@ diff --git a/node_modules/electron-installer-redhat/resources/spec.ejs b/node_modules/electron-installer-redhat/resources/spec.ejs -index 48f1dfd..360aec5 100644 +index e07a8a3..486f59e 100644 --- a/node_modules/electron-installer-redhat/resources/spec.ejs +++ b/node_modules/electron-installer-redhat/resources/spec.ejs @@ -1,4 +1,5 @@ %define _binary_payload w<%= compressionLevel %>.xzdio +%define _build_id_links none - Name: <%= name %> - Version: <%= version %> + %if "%{_host_cpu}" != "%{_target_cpu}" + %global __strip /bin/true diff --git a/yarn.lock b/yarn.lock index 74c962b8f6f..bd71fb717cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -973,14 +973,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@malept/cross-spawn-promise@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" - integrity sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg== - dependencies: - cross-spawn "^7.0.1" - -"@malept/cross-spawn-promise@^1.1.0": +"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== @@ -3819,10 +3812,10 @@ electron-installer-debian@3.1.0: word-wrap "^1.2.3" yargs "^15.0.1" -electron-installer-redhat@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz#acdb59d13d738c55debc5214114d36096eda1aed" - integrity sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg== +electron-installer-redhat@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" + integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== dependencies: "@malept/cross-spawn-promise" "^1.0.0" debug "^4.1.1" @@ -4922,17 +4915,7 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^1.0.0" - -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6979,21 +6962,11 @@ lodash.upperfirst@4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -lodash@^4.17.19: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== - loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" From 612c082b03a19027c833c59ce6b5f4c237311f32 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Fri, 7 Apr 2023 17:09:47 -0300 Subject: [PATCH 64/80] moved OpenSUSE instructions to separate steps (#864) --- README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d382f048941..ce8980a0c19 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Once you have a feed configured, run this command to install the application: sudo apt update && sudo apt install github-desktop ``` -### Red Hat/CentOS/Fedora/OpenSUSE +### Red Hat/CentOS/Fedora There are two RPM package feeds available, both hosted in the US. You only need to add one or the other here, as both of these are generated based on the @@ -97,6 +97,33 @@ sudo dnf install github-desktop sudo zypper ref && sudo zypper in github-desktop ``` +#### OpenSUSE + +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. + +#### [@shiftkey](https://github.com/shiftkey) package feed + +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/zypp/repos.d/shiftkey-packages.repo' +``` + +#### [@mwt](https://github.com/mwt) package feed + +```sh +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/zypp/repos.d/mwt-packages.repo' +``` + +#### Installation + +```sh +sudo zypper ref && sudo zypper in github-desktop +``` + + ## Other Distributions ### Arch Linux From b983b380d5af21582aaae10f7029f5a9317a72f1 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 3 Jul 2023 12:46:46 -0300 Subject: [PATCH 65/80] reformat changed files --- app/src/lib/editors/launch.ts | 1 - app/src/lib/helpers/linux.ts | 1 - app/src/lib/shells/shared.ts | 1 - 3 files changed, 3 deletions(-) diff --git a/app/src/lib/editors/launch.ts b/app/src/lib/editors/launch.ts index 45cbfd1b306..b3f0713983b 100644 --- a/app/src/lib/editors/launch.ts +++ b/app/src/lib/editors/launch.ts @@ -10,7 +10,6 @@ import { ExternalEditorError, FoundEditor } from './shared' * @param path the location of some program on disk * * @returns `true` if the path exists on disk, or `false` otherwise - * */ function pathExists(path: string) { if (__LINUX__) { diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts index 5595d2a537e..f7c4ea64006 100644 --- a/app/src/lib/helpers/linux.ts +++ b/app/src/lib/helpers/linux.ts @@ -15,7 +15,6 @@ export function isFlatpakBuild() { * Convert an executable path to be relative to the flatpak host * * @param path a path to an executable relative to the root of the filesystem - * */ export function convertToFlatpakPath(path: string) { if (!__LINUX__) { diff --git a/app/src/lib/shells/shared.ts b/app/src/lib/shells/shared.ts index 149fd4d846c..6f414239cd0 100644 --- a/app/src/lib/shells/shared.ts +++ b/app/src/lib/shells/shared.ts @@ -80,7 +80,6 @@ export async function findShellOrDefault(shell: Shell): Promise { * @param path the location of some program on disk * * @returns `true` if the path exists on disk, or `false` otherwise - * */ function pathExists(path: string) { if (__LINUX__) { From 8fda089bef47cd4fdb2665d2a71bc315782fbbcb Mon Sep 17 00:00:00 2001 From: "Cayden R. Haun" Date: Mon, 3 Jul 2023 15:04:05 -0500 Subject: [PATCH 66/80] Add support for Flatpak installs of several editors (#887) * Update linux.ts Fix #885 for VSCode, VSCodium, and VSCode Insiders * Use full path for Flatpak binaries Adds full path, as previous method didn't function properly. --- app/src/lib/editors/linux.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index 56bd780ca22..b4f23f1b924 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -43,18 +43,26 @@ const editors: ILinuxExternalEditor[] = [ '/snap/bin/code', '/usr/bin/code', '/mnt/c/Program Files/Microsoft VS Code/bin/code', + '/var/lib/flatpak/app/com.visualstudio.code/current/active/export/bin/com.visualstudio.code', + '.local/share/flatpak/app/com.visualstudio.code/current/active/export/bin/com.visualstudio.code', ], }, { name: 'Visual Studio Code (Insiders)', - paths: ['/snap/bin/code-insiders', '/usr/bin/code-insiders'], + paths: [ + '/snap/bin/code-insiders', + '/usr/bin/code-insiders', + '/var/lib/flatpak/app/com.visualstudio.code.insiders/current/active/export/bin/com.visualstudio.code.insiders', + '.local/share/flatpak/app/com.visualstudio.code.insiders/current/active/export/bin/com.visualstudio.code.insiders', + ], }, { name: 'VSCodium', paths: [ '/usr/bin/codium', - '/var/lib/flatpak/app/com.vscodium.codium', + '/var/lib/flatpak/app/com.vscodium.codium/current/active/export/bin/com.vscodium.codium', '/usr/share/vscodium-bin/bin/codium', + '.local/share/flatpak/app/com.vscodium.codium/current/active/export/bin/com.vscodium.codium', ], }, { From 49c420ad1b9c011fa457d5c7e7dcf97a250c680f Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 3 Jul 2023 17:04:21 -0300 Subject: [PATCH 67/80] remove geany as supported editor because it doesn't work as expected (#894) --- app/src/lib/editors/linux.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index b4f23f1b924..ba5ad5ac587 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -148,10 +148,6 @@ const editors: ILinuxExternalEditor[] = [ name: 'Notepadqq', paths: ['/usr/bin/notepadqq'], }, - { - name: 'Geany', - paths: ['/usr/bin/geany'], - }, { name: 'Mousepad', paths: ['/usr/bin/mousepad'], From 25d2098f12c7cd0c96e9da870cf7b5c88a71ebec Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 8 Jul 2023 10:35:26 -0300 Subject: [PATCH 68/80] bump dugite to v2.5.1 to get support for older glibc versions --- app/package.json | 2 +- app/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index 3b00c2632e4..f18c28322d7 100644 --- a/app/package.json +++ b/app/package.json @@ -31,7 +31,7 @@ "desktop-trampoline": "desktop/desktop-trampoline#v0.9.8", "dexie": "^3.2.2", "dompurify": "^2.3.3", - "dugite": "^2.5.0", + "dugite": "^2.5.1", "electron-window-state": "^5.0.3", "event-kit": "^2.0.0", "focus-trap-react": "^8.1.0", diff --git a/app/yarn.lock b/app/yarn.lock index 9c463f0ee86..ab9a316c36d 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -381,10 +381,10 @@ dompurify@^2.3.3: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c" integrity sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg== -dugite@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.5.0.tgz#8b235564fdf8692688283c714149a59d9da79865" - integrity sha512-sYsSOqV7NidthDtMUPgKCvqMGqswKkcyAxOMhwEswlcGZ+kHadT2SEDFUJOy0AVR/yTJL6wBF7q1OiySfU0gGA== +dugite@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.5.1.tgz#6ab808ebf321809edf42d974e62eea9c9e256722" + integrity sha512-9OjUguynzq8v3GSmp01kbVcMmErc65ZZ0OssO/0PM2RyhD8Dzb8cCuy3z72+IxLwPwNi754jZ0FtMLAFA3D0qA== dependencies: progress "^2.0.3" tar "^6.1.11" From acee7c4dd61aab088ee21a71fd85289f9bb2d558 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 8 Jul 2023 11:01:23 -0300 Subject: [PATCH 69/80] restore missing electron-builder package --- package.json | 2 +- yarn.lock | 1008 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 792 insertions(+), 218 deletions(-) diff --git a/package.json b/package.json index edc7e9ce3bd..c92d0687f9a 100644 --- a/package.json +++ b/package.json @@ -157,7 +157,7 @@ "@types/webpack-merge": "^5.0.0", "@types/xml2js": "^0.4.11", "electron": "24.4.0", - "electron-builder": "^23.6.0", + "electron-builder": "^24.4.0", "electron-packager": "^15.1.0", "eslint-plugin-github": "^4.3.7", "jest-esm-transformer": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index bd71fb717cd..08fd9693f52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -658,15 +658,54 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/universal@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" - integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== +"@electron/notarize@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-1.2.4.tgz#a7d38773f4cad40df111a5edc64037e5d768ea1e" + integrity sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +"@electron/osx-sign@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.0.4.tgz#8e91442846471636ca0469426a82b253b9170151" + integrity sha512-xfhdEcIOfAZg7scZ9RQPya1G1lWo8/zMCwUXAulq0SfY7ONIW+b9qGyKdMyuMctNYwllrIS+vmxfijSfjeh97g== dependencies: + compare-version "^0.1.2" + debug "^4.3.4" + fs-extra "^10.0.0" + isbinaryfile "^4.0.8" + minimist "^1.2.6" + plist "^3.0.5" + +"@electron/rebuild@^3.2.13": + version "3.2.13" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.2.13.tgz#98fbb98981b1a86162546a2ab91b2355569cca4c" + integrity sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g== + dependencies: + "@malept/cross-spawn-promise" "^2.0.0" + chalk "^4.0.0" + debug "^4.1.1" + detect-libc "^2.0.1" + fs-extra "^10.0.0" + got "^11.7.0" + node-abi "^3.0.0" + node-api-version "^0.1.4" + node-gyp "^9.0.0" + ora "^5.1.0" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.3.4.tgz#bccd94b635d7c85eeed5eabba457eb4ed2be2777" + integrity sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg== + dependencies: + "@electron/asar" "^3.2.1" "@malept/cross-spawn-promise" "^1.1.0" - asar "^3.1.0" debug "^4.3.1" - dir-compare "^2.4.0" + dir-compare "^3.0.0" fs-extra "^9.0.1" minimatch "^3.0.4" plist "^3.0.4" @@ -700,6 +739,18 @@ dependencies: lodash "^4.17.15" +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -980,6 +1031,13 @@ dependencies: cross-spawn "^7.0.1" +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== + dependencies: + cross-spawn "^7.0.1" + "@malept/flatpak-bundler@^0.4.0": version "0.4.0" resolved "https://registry.yarnpkg.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz#e8a32c30a95d20c2b1bb635cc580981a06389858" @@ -1011,11 +1069,23 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + "@opentelemetry/api@^1.0.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" @@ -1159,9 +1229,9 @@ "@types/node" "*" "@types/debug@^4.1.6": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== dependencies: "@types/ms" "*" @@ -1243,6 +1313,13 @@ dependencies: "@types/node" "*" +"@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/fs-extra@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-7.0.0.tgz#9c4ad9e1339e7448a76698829def1f159c1b636c" @@ -1250,13 +1327,6 @@ dependencies: "@types/node" "*" -"@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - "@types/fuzzaldrin-plus@^0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@types/fuzzaldrin-plus/-/fuzzaldrin-plus-0.0.1.tgz#bfe5e25bc5b4066848171baf7a8aaf30e267d30a" @@ -1716,13 +1786,6 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.1": - version "17.0.22" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.22.tgz#7dd37697691b5f17d020f3c63e7a45971ff71e9a" - integrity sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g== - dependencies: - "@types/yargs-parser" "*" - "@types/yauzl@^2.9.1": version "2.9.1" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" @@ -2018,6 +2081,11 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2038,6 +2106,11 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -2084,13 +2157,30 @@ acorn@^8.0.4, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agentkeepalive@^4.2.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== + dependencies: + debug "^4.1.0" + depd "^2.0.0" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + airbnb-browser-shims@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/airbnb-browser-shims/-/airbnb-browser-shims-3.0.0.tgz#7978e65fa106f7436a6ae2cad9ad871982e13c7d" @@ -2136,12 +2226,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957" - integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA== - -ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -2233,6 +2318,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -2260,6 +2350,11 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2281,43 +2376,59 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8" - integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA== +app-builder-lib@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.4.0.tgz#1606f94e99366eea9e7507228961b8396e40d546" + integrity sha512-EcdqtWvg1LAApKCfyRBukcVkmsa94s2e1VKHjZLpvA9/D14QEt8rHhffYeaA+cH/pVeoNVn2ob735KnfJKEEow== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" - "@electron/universal" "1.2.1" + "@electron/notarize" "^1.2.3" + "@electron/osx-sign" "^1.0.4" + "@electron/rebuild" "^3.2.13" + "@electron/universal" "1.3.4" "@malept/flatpak-bundler" "^0.4.0" + "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "23.6.0" - builder-util-runtime "9.1.1" + builder-util "24.4.0" + builder-util-runtime "9.2.1" chromium-pickle-js "^0.2.0" debug "^4.3.4" - ejs "^3.1.7" - electron-osx-sign "^0.6.0" - electron-publish "23.6.0" + ejs "^3.1.8" + electron-publish "24.4.0" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" is-ci "^3.0.0" - isbinaryfile "^4.0.10" + isbinaryfile "^5.0.0" js-yaml "^4.1.0" lazy-val "^1.0.5" - minimatch "^3.1.2" - read-config-file "6.2.0" + minimatch "^5.1.1" + read-config-file "6.3.2" sanitize-filename "^1.6.3" - semver "^7.3.7" - tar "^6.1.11" + semver "^7.3.8" + tar "^6.1.12" temp-file "^3.4.0" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + are-docs-informative@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -2473,7 +2584,7 @@ asar@^3.0.0, asar@^3.1.0: assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assign-symbols@^1.0.0: version "1.0.0" @@ -2501,9 +2612,9 @@ async-exit-hook@^2.0.1: integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== async@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" @@ -2648,6 +2759,15 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird-lst@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" @@ -2763,11 +2883,6 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer-equal@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - integrity sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ== - buffer-equal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.1.tgz#2f7651be5b1b3f057fcd6e7ee16cf34767077d90" @@ -2783,7 +2898,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.1.0: +buffer@^5.1.0, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2791,31 +2906,30 @@ buffer@^5.1.0: base64-js "^1.3.1" ieee754 "^1.1.13" -builder-util-runtime@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" - integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw== +builder-util-runtime@9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd" + integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9" - integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ== +builder-util@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.4.0.tgz#dbb201a118fd573180e6a1070cf4c0be6de80cd7" + integrity sha512-tONb/GIK1MKa1BcOPHE1naId3o5nj6gdka5kP7yUJh2DOfF+jMq3laiu+UOZH6A7ZtkMtnGNMYFKFTIv408n/A== dependencies: "7zip-bin" "~5.1.1" "@types/debug" "^4.1.6" - "@types/fs-extra" "^9.0.11" app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "9.1.1" - chalk "^4.1.1" + builder-util-runtime "9.2.1" + chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" - fs-extra "^10.0.0" + fs-extra "^10.1.0" http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" is-ci "^3.0.0" js-yaml "^4.1.0" source-map-support "^0.5.19" @@ -2832,6 +2946,24 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2954,7 +3086,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3037,6 +3169,23 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -3088,6 +3237,11 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3130,16 +3284,16 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^2.0.10: version "2.0.16" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -colors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3147,13 +3301,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A== - dependencies: - graceful-readlink ">= 1.0.0" - commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3207,6 +3354,19 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" +config-file-ts@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.4.tgz#6c0741fbe118a7cf786c65f139030f0448a2cc99" + integrity sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ== + dependencies: + glob "^7.1.6" + typescript "^4.0.2" + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + console-polyfill@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861" @@ -3411,7 +3571,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.3.1, debug@^4.3.4: +debug@4, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3500,6 +3660,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" @@ -3552,6 +3719,16 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +depd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" @@ -3562,6 +3739,11 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -3600,16 +3782,6 @@ diff@^3.1.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dir-compare@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631" - integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA== - dependencies: - buffer-equal "1.0.0" - colors "1.0.3" - commander "2.9.0" - minimatch "3.0.4" - dir-compare@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" @@ -3625,15 +3797,15 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948" - integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA== +dmg-builder@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.4.0.tgz#46c80f119465f6a7275766c72b4f3d514cc8013d" + integrity sha512-p5z9Cx539GSBYb+b09Z+hMhuBTh/BrI71VRg4rgF6f2xtIRK/YlTGVS/O08k5OojoyhZcpS7JXxDVSmQoWgiiQ== dependencies: - app-builder-lib "23.6.0" - builder-util "23.6.0" - builder-util-runtime "9.1.1" - fs-extra "^10.0.0" + app-builder-lib "24.4.0" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" optionalDependencies: @@ -3746,6 +3918,11 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + easy-stack@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz#12c91b3085a37f0baa336e9486eac4bf94e3e788" @@ -3756,30 +3933,29 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" -electron-builder@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b" - integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw== - dependencies: - "@types/yargs" "^17.0.1" - app-builder-lib "23.6.0" - builder-util "23.6.0" - builder-util-runtime "9.1.1" - chalk "^4.1.1" - dmg-builder "23.6.0" - fs-extra "^10.0.0" +electron-builder@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.4.0.tgz#8846efa45bac8f6b9afc181abf71a4e12530f045" + integrity sha512-D5INxodxaUIJgEX6p/fqBd8wQNS8XRAToNIJ9SQC+taNS5D73ZsjLuXiRraFGCB0cVk9KeKhEkdEOH5AaVya4g== + dependencies: + app-builder-lib "24.4.0" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + dmg-builder "24.4.0" + fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" - read-config-file "6.2.0" - simple-update-notifier "^1.0.7" - yargs "^17.5.1" + read-config-file "6.3.2" + simple-update-notifier "^1.1.0" + yargs "^17.6.2" electron-installer-common@^0.10.2: version "0.10.3" @@ -3845,18 +4021,6 @@ electron-osx-sign@^0.5.0: minimist "^1.2.0" plist "^3.0.1" -electron-osx-sign@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz#9b69c191d471d9458ef5b1e4fdd52baa059f1bb8" - integrity sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg== - dependencies: - bluebird "^3.5.0" - compare-version "^0.1.2" - debug "^2.6.8" - isbinaryfile "^3.0.2" - minimist "^1.2.0" - plist "^3.0.1" - electron-packager@^15.1.0: version "15.5.2" resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.5.2.tgz#9864796b8af63aa87b43151d0b6990ba7093e6b8" @@ -3882,16 +4046,16 @@ electron-packager@^15.1.0: semver "^7.1.3" yargs-parser "^20.2.9" -electron-publish@23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9" - integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg== +electron-publish@24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.4.0.tgz#a58f49ecd727620f65372881788ebb1a9b853284" + integrity sha512-U3mnVSxIfNrLW7ZnwiedFhcLf6ExPFXgAsx89WpfQFsV4gFAt/LG+H74p0m9NSvsLXiZuF82yXoxi7Ou8GHq4Q== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "23.6.0" - builder-util-runtime "9.1.1" - chalk "^4.1.1" - fs-extra "^10.0.0" + builder-util "24.4.0" + builder-util-runtime "9.2.1" + chalk "^4.1.2" + fs-extra "^10.1.0" lazy-val "^1.0.5" mime "^2.5.2" @@ -3955,6 +4119,13 @@ encodeurl@^1.0.2, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -3992,6 +4163,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" @@ -4588,6 +4764,11 @@ expect@^26.6.2: jest-message-util "^26.6.2" jest-regex-util "^26.0.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + express@^4.17.3: version "4.17.3" resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" @@ -4665,9 +4846,9 @@ extract-zip@^2.0.0, extract-zip@^2.0.1: "@types/yauzl" "^2.9.1" extsprintf@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fake-indexeddb@^2.0.4: version "2.0.4" @@ -4737,10 +4918,10 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -filelist@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.3.tgz#448607750376484932f67ef1b9ff07386b036c83" - integrity sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" @@ -4837,6 +5018,14 @@ for-in@^1.0.2: resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -4932,6 +5121,13 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + fs-monkey@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" @@ -5000,6 +5196,20 @@ gar@^1.0.4: resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -5091,6 +5301,17 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@^10.2.2: + version "10.3.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.2.tgz#04fe71118ec6d2f4cb761849acbacec14b06cb1e" + integrity sha512-vsuLzB3c/uyDLLEdBZtT8vGnN0z57rwOxHV2oYZib/7HWmBspUaja/McYIobBjC4qaUTuNpUyFO2IdqM4DZIJA== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -5191,7 +5412,7 @@ globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -got@^11.8.5: +got@^11.7.0, got@^11.8.5: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== @@ -5230,10 +5451,10 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w== +graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== growly@^1.3.0: version "1.3.0" @@ -5313,6 +5534,11 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5426,7 +5652,7 @@ htmlparser2@^6.1.0: domutils "^2.5.2" entities "^2.0.0" -http-cache-semantics@^4.0.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -5468,7 +5694,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5481,6 +5707,13 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + iconv-corefoundation@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a" @@ -5554,6 +5787,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -5562,7 +5800,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5591,6 +5829,11 @@ interpret@^1.0.1: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" integrity sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA= +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -5789,6 +6032,16 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -5910,6 +6163,11 @@ is-typedarray@^1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakref@^1.0.1, is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -5944,11 +6202,16 @@ isbinaryfile@^3.0.2: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= -isbinaryfile@^4.0.10: +isbinaryfile@^4.0.8: version "4.0.10" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -6007,15 +6270,24 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" jest-changed-files@^26.6.2: version "26.6.2" @@ -6786,12 +7058,7 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" -lazy-val@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65" - integrity sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q== - -lazy-val@^1.0.5: +lazy-val@^1.0.4, lazy-val@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== @@ -6967,6 +7234,14 @@ lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -7006,6 +7281,16 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== + make-dir@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" @@ -7023,6 +7308,27 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" integrity sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y= +make-fetch-happen@^11.0.3: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -7209,13 +7515,6 @@ mini-css-extract-plugin@^2.5.3: dependencies: schema-utils "^4.0.0" -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -7230,6 +7529,20 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" +minimatch@^5.1.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" @@ -7247,6 +7560,45 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== + dependencies: + minipass "^5.0.0" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + minipass@^3.0.0: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" @@ -7254,12 +7606,17 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.3.tgz#00bfbaf1e16e35e804f4aa31a7c1f6b8d9f0ee72" - integrity sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw== +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -minizlib@^2.1.1: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.1.tgz#dff63464407cd8b83d7f008c0f116fa8c9b77ebf" + integrity sha512-NQ8MCKimInjVlaIqx51RKJJB7mINVkLTJbsZKmto4UAAOC/CWXES8PGaOgoBZyqoUsUA/U3DToGK7GJkkHbjJw== + +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -7302,7 +7659,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -7335,7 +7692,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -7358,11 +7715,25 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^3.0.0: + version "3.45.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" + integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== + dependencies: + semver "^7.3.5" + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== +node-api-version@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080" + integrity sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g== + dependencies: + semver "^7.3.5" + node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" @@ -7370,6 +7741,23 @@ node-fetch@^2.6.7, node-fetch@^2.6.9: dependencies: whatwg-url "^5.0.0" +node-gyp@^9.0.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -7406,6 +7794,13 @@ node-releases@^2.0.6: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + normalize-package-data@^2.0.0, normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -7470,6 +7865,16 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -7686,6 +8091,21 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -7737,6 +8157,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" @@ -7877,6 +8304,14 @@ path-parse@^1.0.5, path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7951,6 +8386,15 @@ plist@^3.0.0, plist@^3.0.1, plist@^3.0.4: base64-js "^1.5.1" xmlbuilder "^15.1.1" +plist@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== + dependencies: + "@xmldom/xmldom" "^0.8.8" + base64-js "^1.5.1" + xmlbuilder "^15.1.1" + pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -8114,6 +8558,14 @@ progress@^2.0.3: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise.prototype.finally@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" @@ -8257,11 +8709,12 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== -read-config-file@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.2.0.tgz#71536072330bcd62ba814f91458b12add9fc7ade" - integrity sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg== +read-config-file@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-6.3.2.tgz#556891aa6ffabced916ed57457cb192e61880411" + integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== dependencies: + config-file-ts "^0.2.4" dotenv "^9.0.2" dotenv-expand "^5.1.0" js-yaml "^4.1.0" @@ -8339,6 +8792,15 @@ readable-stream@^3.0.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -8569,11 +9031,24 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -8605,7 +9080,7 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -8790,6 +9265,13 @@ semver@^7.3.7: dependencies: lru-cache "^6.0.0" +semver@^7.3.8: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -8935,7 +9417,17 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -simple-update-notifier@^1.0.7: +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +simple-update-notifier@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== @@ -8994,7 +9486,7 @@ slide@~1.1.3: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.0.2: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== @@ -9034,6 +9526,23 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -9137,6 +9646,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +ssri@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + stack-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" @@ -9175,6 +9691,15 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -9193,14 +9718,14 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.matchall@^3.0.0: version "3.0.0" @@ -9293,6 +9818,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -9314,12 +9846,12 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -9443,14 +9975,14 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar@^6.1.11: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -9675,7 +10207,7 @@ trim-repeated@^1.0.0: truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" - integrity sha1-QFkjkJWS1W94pYGENLC3hInKXys= + integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== dependencies: utf8-byte-length "^1.0.1" @@ -9826,6 +10358,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typescript@^4.0.2: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + typescript@^4.6.4: version "4.6.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" @@ -9886,6 +10423,20 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -9953,7 +10504,7 @@ use@^2.0.0: utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= + integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -10081,6 +10632,13 @@ watchpack@^2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -10253,6 +10811,13 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -10276,6 +10841,15 @@ worker-farm@^1.3.1: errno "^0.1.4" xtend "^4.0.1" +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -10285,14 +10859,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -10472,10 +11046,10 @@ yargs@^16.0.2: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.5.1: - version "17.7.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.0.tgz#b21e9af1e0a619a2a9c67b1133219b2975a07985" - integrity sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ== +yargs@^17.0.1, yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" From 507cc498cf5129a9f373680c53037436b7d79d3b Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sun, 9 Jul 2023 18:54:14 -0300 Subject: [PATCH 70/80] switch Linux build over to use configured docker image (#898) Co-authored-by: theofficialgman <28281419+theofficialgman@users.noreply.github.com> --- .github/workflows/ci.yml | 92 ++++++++++++++++++++++++++---- script/build.ts | 23 ++++---- script/dist-info.ts | 15 ++--- script/electron-builder-linux.yml | 2 +- script/package-debian.ts | 5 +- script/package-electron-builder.ts | 3 +- script/package-redhat.ts | 5 +- 7 files changed, 104 insertions(+), 41 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fb1fa065dd8..62c5a7c6b3e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,12 +36,13 @@ jobs: build: name: ${{ matrix.friendlyName }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} + container: ${{ matrix.image }} permissions: contents: write strategy: fail-fast: false matrix: - node: [18.14.0] + node: [18.16.1] os: [macos-11, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: @@ -51,40 +52,97 @@ jobs: friendlyName: Windows - os: ubuntu-20.04 friendlyName: Ubuntu + image: ubuntu:18.04 + arch: x64 + environment: + AS: as + STRIP: strip + AR: ar + CC: gcc + CPP: cpp + CXX: g++ + LD: ld + FC: gfortran + PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig exclude: - os: ubuntu-20.04 arch: arm64 timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} + AS: ${{ matrix.environment.AS }} + STRIP: ${{ matrix.environment.STRIP }} + AR: ${{ matrix.environment.AR }} + CC: ${{ matrix.environment.CC }} + CPP: ${{ matrix.environment.CPP }} + CXX: ${{ matrix.environment.CXX }} + LD: ${{ matrix.environment.LD }} + FC: ${{ matrix.environment.FC }} + PKG_CONFIG_PATH: ${{ matrix.environment.PKG_CONFIG_PATH }} + npm_config_arch: ${{ matrix.arch }} steps: + - name: Install dependencies into dockerfile on Ubuntu + if: matrix.friendlyName == 'Ubuntu' + run: | + # ubuntu dockerfile is very minimal (only 122 packages are installed) + # add dependencies expected by scripts + apt update + apt install -y software-properties-common lsb-release \ + sudo wget curl build-essential jq autoconf automake \ + pkg-config ca-certificates rpm + # install new enough git to run actions/checkout + sudo add-apt-repository ppa:git-core/ppa -y + sudo apt update + sudo apt install -y git + # avoid "fatal: detected dubious ownership in repository at '/__w/shiftkey/desktop'" error + git config --global --add safe.directory '*' + - name: Add additional dependencies for Ubuntu x64 + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'x64' }} + run: | + # add electron unit test dependencies + sudo apt install -y libasound2 libatk-bridge2.0-0 libatk1.0-0 \ + libatspi2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libdrm2 \ + libexpat1 libgbm1 libgcc1 libglib2.0-0 libgtk-3-0 libnspr4 \ + libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 \ + libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \ + libsecret-1-0 - uses: actions/checkout@v3 with: repository: ${{ inputs.repository || github.repository }} ref: ${{ inputs.ref }} submodules: recursive - name: Use Node.js ${{ matrix.node }} + if: matrix.friendlyName != 'Ubuntu' uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} cache: yarn - + - name: Install unofficial-builds Node.js ${{ matrix.node }} on Ubuntu + if: matrix.friendlyName == 'Ubuntu' + run: | + # This version supports older GLIBC (official builds required a minimum of GLIBC 2.28) + # this might break if you bump the `matrix.node` version - ensure you are on the latest version + # of which ever major/minor release which should have this variant available + # + # See https://github.com/nodejs/unofficial-builds/ for more information on these versions. + # + curl -sL 'https://unofficial-builds.nodejs.org/download/release/v${{ matrix.node }}/node-v${{ matrix.node }}-linux-x64-glibc-217.tar.xz' | xzcat | sudo tar -vx --strip-components=1 -C /usr/local/ + sudo npm install --global yarn # This step can be removed as soon as official Windows arm64 builds are published: # https://github.com/nodejs/build/issues/2450#issuecomment-705853342 + # + # This version is pinned to 18.16.0 as the later version does not have the required + # `win-arm64/node.lib` output that we can consume in this CI build. - name: Get NodeJS node-gyp lib for Windows arm64 if: ${{ matrix.os == 'windows-2019' && matrix.arch == 'arm64' }} - run: .\script\download-nodejs-win-arm64.ps1 ${{ matrix.node }} - + run: .\script\download-nodejs-win-arm64.ps1 18.16.0 + - name: Get app version + id: version + run: echo version=$(jq -r ".version" app/package.json) >> $GITHUB_OUTPUT - name: Install and build dependencies run: yarn - env: - npm_config_arch: ${{ matrix.arch }} - TARGET_ARCH: ${{ matrix.arch }} - name: Build production app run: yarn build:prod - env: - npm_config_arch: ${{ matrix.arch }} - TARGET_ARCH: ${{ matrix.arch }} - name: Prepare testing environment if: matrix.arch == 'x64' run: yarn test:setup @@ -96,11 +154,11 @@ jobs: run: yarn test:script - name: Package application run: yarn run package - if: ${{ matrix.os == 'ubuntu-20.04' && matrix.arch == 'x64' }} + if: ${{ matrix.friendlyName == 'Ubuntu' }} - name: Create Release uses: softprops/action-gh-release@v1 if: - ${{ matrix.os == 'ubuntu-20.04' && startsWith(github.ref, + ${{ matrix.friendlyName == 'Ubuntu' && startsWith(github.ref, 'refs/tags/') }} with: files: | @@ -111,3 +169,13 @@ jobs: draft: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Upload output artifacts + uses: actions/upload-artifact@v3 + if: matrix.friendlyName == 'Ubuntu' + with: + name: ${{ matrix.friendlyName }}-${{ matrix.arch }}-artifacts + path: | + dist/*.AppImage + dist/*.deb + dist/*.rpm + retention-days: 5 diff --git a/script/build.ts b/script/build.ts index 69875807399..1017b40cbe9 100755 --- a/script/build.ts +++ b/script/build.ts @@ -3,9 +3,8 @@ import * as path from 'path' import * as cp from 'child_process' -import * as os from 'os' + import packager, { - OfficialArch, OsxNotarizeOptions, OsxSignOptions, Options, @@ -151,21 +150,19 @@ function packageApp() { ) } - const toPackageArch = (targetArch: string | undefined): OfficialArch => { - if (targetArch === undefined) { - targetArch = os.arch() + const getPackageArch = (): 'arm64' | 'x64' | 'armv7l' => { + const arch = process.env.npm_config_arch || process.arch + + if (arch === 'arm64' || arch === 'x64') { + return arch } - if ( - targetArch === 'arm64' || - targetArch === 'x64' || - targetArch === 'armv7l' - ) { - return targetArch + if (arch === 'arm') { + return 'armv7l' } throw new Error( - `Building Desktop for architecture '${targetArch}' is not supported` + `Building Desktop for architecture '${arch}' is not supported. Currently these architectures are supported: arm, arm64, x64` ) } @@ -195,7 +192,7 @@ function packageApp() { const options: Options & IPackageAdditionalOptions = { name: getExecutableName(), platform: toPackagePlatform(process.platform), - arch: toPackageArch(process.env.TARGET_ARCH), + arch: getPackageArch(), asar: false, // TODO: Probably wanna enable this down the road. out: getDistRoot(), icon, diff --git a/script/dist-info.ts b/script/dist-info.ts index 864330225a0..c40d2a4945a 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -114,18 +114,13 @@ export const getChannel = () => export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { // If a specific npm_config_arch is set, we use that one instead of the OS arch (to support cross compilation) - if ( - process.env.npm_config_arch === 'arm64' || - process.env.npm_config_arch === 'x64' || - process.env.npm_config_arch === 'armv7l' - ) { - return process.env.npm_config_arch - } + const arch = process.env.npm_config_arch || process.arch - if (process.arch === 'arm64') { - return 'arm64' + if (arch === 'arm64' || arch === 'x64' || arch === 'armv7l') { + return arch } - if (process.arch === 'armv7l') { + + if (arch === 'arm') { return 'armv7l' } diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index 1963aaf486a..c40d57c7e98 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -1,4 +1,4 @@ -artifactName: '${productName}-${os}-${arch}-${version}.${ext}' +artifactName: 'GitHubDesktop-${os}-${arch}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' diff --git a/script/package-debian.ts b/script/package-debian.ts index 9a918473070..b184481843d 100644 --- a/script/package-debian.ts +++ b/script/package-debian.ts @@ -10,7 +10,8 @@ import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return 'arm64' case 'arm': @@ -107,7 +108,7 @@ export async function packageDebian(): Promise { const oldPath = files[0] - const newFileName = `GitHubDesktop-linux-${getVersion()}.deb` + const newFileName = `GitHubDesktop-linux-${getArchitecture()}-${getVersion()}.deb` const newPath = join(distRoot, newFileName) await rename(oldPath, newPath) diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts index 6292c28b9f4..2f56e73fba5 100644 --- a/script/package-electron-builder.ts +++ b/script/package-electron-builder.ts @@ -10,7 +10,8 @@ const globPromise = promisify(glob) import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return '--arm64' case 'arm': diff --git a/script/package-redhat.ts b/script/package-redhat.ts index 37bd3819293..61fe4a1162e 100644 --- a/script/package-redhat.ts +++ b/script/package-redhat.ts @@ -10,7 +10,8 @@ import { getVersion } from '../app/package-info' import { getDistPath, getDistRoot } from './dist-info' function getArchitecture() { - switch (process.arch) { + const arch = process.env.npm_config_arch || process.arch + switch (arch) { case 'arm64': return 'aarch64' case 'arm': @@ -103,7 +104,7 @@ export async function packageRedhat(): Promise { const oldPath = files[0] - const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newFileName = `GitHubDesktop-linux-${getArchitecture()}-${getVersion()}.rpm` const newPath = join(distRoot, newFileName) await rename(oldPath, newPath) From 5d17ff9703441b80153f794fa5f2c9562ea3adbd Mon Sep 17 00:00:00 2001 From: theofficialgman <28281419+theofficialgman@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:09:35 -0400 Subject: [PATCH 71/80] enable workflow for ARM32/ARM64 on Ubuntu (#897) --- .github/workflows/ci.yml | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 62c5a7c6b3e..dfe09675ddd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,9 +64,36 @@ jobs: LD: ld FC: gfortran PKG_CONFIG_PATH: /usr/lib/x86_64-linux-gnu/pkgconfig - exclude: - os: ubuntu-20.04 + friendlyName: Ubuntu + image: ubuntu:18.04 arch: arm64 + environment: + AS: aarch64-linux-gnu-as + STRIP: aarch64-linux-gnu-strip + AR: aarch64-linux-gnu-ar + CC: aarch64-linux-gnu-gcc + CPP: aarch64-linux-gnu-cpp + CXX: aarch64-linux-gnu-g++ + LD: aarch64-linux-gnu-ld + FC: aarch64-linux-gnu-gfortran + PKG_CONFIG_PATH: /usr/lib/aarch64-linux-gnu/pkgconfig + - os: ubuntu-20.04 + friendlyName: Ubuntu + image: ubuntu:18.04 + arch: arm + node: 18.16.1 + environment: + AS: arm-linux-gnueabihf-as + STRIP: arm-linux-gnueabihf-strip + AR: arm-linux-gnueabihf-ar + CC: arm-linux-gnueabihf-gcc + CPP: arm-linux-gnueabihf-cpp + CXX: arm-linux-gnueabihf-g++ + LD: arm-linux-gnueabihf-ld + FC: arm-linux-gnueabihf-gfortran + PKG_CONFIG_PATH: /usr/lib/arm-linux-gnueabihf/pkgconfig + timeout-minutes: 60 env: RELEASE_CHANNEL: ${{ inputs.environment }} @@ -106,6 +133,20 @@ jobs: libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 \ libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 \ libsecret-1-0 + - name: Add additional dependencies for Ubuntu arm64 + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'arm64' }} + run: | + sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu + - name: Add additional dependencies for Ubuntu arm + if: ${{ matrix.friendlyName == 'Ubuntu' && matrix.arch == 'arm' }} + run: | + sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf pkg-config-arm-linux-gnueabihf + sudo sed -i "s/^deb/deb [arch=amd64,i386]/g" /etc/apt/sources.list + echo "deb [arch=arm64,armhf] http://ports.ubuntu.com/ $(lsb_release -s -c) main universe multiverse restricted" | sudo tee -a /etc/apt/sources.list + echo "deb [arch=arm64,armhf] http://ports.ubuntu.com/ $(lsb_release -s -c)-updates main universe multiverse restricted" | sudo tee -a /etc/apt/sources.list + sudo dpkg --add-architecture armhf + sudo apt-get update + sudo apt-get install -y libx11-dev:armhf libx11-xcb-dev:armhf libxkbfile-dev:armhf libsecret-1-dev:armhf - uses: actions/checkout@v3 with: repository: ${{ inputs.repository || github.repository }} From 5c3018a43d20ca5672a399abd7663c9e7af67e38 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 10 Jul 2023 08:50:35 -0300 Subject: [PATCH 72/80] introduce separate publish step which runs after build (#899) --- .github/workflows/ci.yml | 73 ++++++++++++---- .gitignore | 1 + script/generate-release-notes.ts | 140 +++++++++++++++++++++++++++++++ script/package.ts | 3 + 4 files changed, 203 insertions(+), 14 deletions(-) create mode 100644 script/generate-release-notes.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfe09675ddd..8be277e7ff7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ on: - 'linux-release-*' tags: - 'release-*.*.*-linux*' + - 'release-*.*.*-test*' pull_request: branches: - linux @@ -196,20 +197,6 @@ jobs: - name: Package application run: yarn run package if: ${{ matrix.friendlyName == 'Ubuntu' }} - - name: Create Release - uses: softprops/action-gh-release@v1 - if: - ${{ matrix.friendlyName == 'Ubuntu' && startsWith(github.ref, - 'refs/tags/') }} - with: - files: | - dist/*.AppImage - dist/*.deb - dist/*.rpm - dist/*.txt - draft: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Upload output artifacts uses: actions/upload-artifact@v3 if: matrix.friendlyName == 'Ubuntu' @@ -219,4 +206,62 @@ jobs: dist/*.AppImage dist/*.deb dist/*.rpm + dist/*.sha256 retention-days: 5 + + publish: + name: Create GitHub release + needs: [build, lint] + runs-on: ubuntu-latest + if: startsWith(github.ref, 'refs/tags/') + permissions: + contents: write + steps: + - uses: actions/checkout@v3 + + - name: Download all artifacts + uses: actions/download-artifact@v2 + with: + path: './artifacts' + + - name: Display structure of downloaded files + run: ls -R + working-directory: './artifacts' + + - name: Get tag name without prefix + run: | + RELEASE_TAG=${GITHUB_REF/refs\/tags\//} + echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV + tagNameWithoutPrefix="${RELEASE_TAG:1}" + echo "RELEASE_TAG_WITHOUT_PREFIX=${tagNameWithoutPrefix}" >> $GITHUB_ENV + + # TODO: generate release notes + # - pull in default if version matches X.Y.Z-linux1 + # - otherwise stub template + + - name: Generate release notes + run: | + yarn + node -r ts-node/register script/generate-release-notes.ts "${{ github.workspace }}/artifacts" "${{ env.RELEASE_TAG_WITHOUT_PREFIX }}" + RELEASE_NOTES_FILE=script/release_notes.txt + if [[ ! -f "$RELEASE_NOTES_FILE" ]]; then + echo "$RELEASE_NOTES_FILE does not exist. Something might have gone wrong while generating the release notes." + exit 1 + fi + echo "Release notes:" + echo "---" + cat ${RELEASE_NOTES_FILE} + echo "---" + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + name: GitHub Desktop for Linux ${{ env.RELEASE_TAG_WITHOUT_PREFIX }} + body_path: script/release_notes.txt + files: | + artifacts/*.AppImage + artifacts/*.deb + artifacts/*.rpm + draft: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 30a0037ef0b..4b8a3b69fe7 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ app/node_modules/ junit*.xml *.swp tslint-rules/ +script/release_notes.txt diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts new file mode 100644 index 00000000000..b52d4f622a4 --- /dev/null +++ b/script/generate-release-notes.ts @@ -0,0 +1,140 @@ +/* eslint-disable no-sync */ + +const glob = require('glob') +const { basename } = require('path') +const fs = require('fs') + +type ChecksumEntry = { filename: string; checksum: string } + +type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> + +// 3 architectures * 3 package formats * 2 files (package + checksum file) +const SUCCESSFUL_RELEASE_FILE_COUNT = 3 * 3 * 2 + +const Glob = glob.GlobSync + +const args = process.argv.slice(2) +const artifactsDir = args[0] + +if (!artifactsDir) { + console.error( + `🔴 First parameter with artifacts directory not found. Aborting...` + ) + process.exit(1) +} + +const releaseTagWithoutPrefix = args[1] +if (!releaseTagWithoutPrefix) { + console.error(`🔴 Second parameter with release tag not found. Aborting...`) + process.exit(1) +} + +console.log( + `Preparing release notes for release tag ${releaseTagWithoutPrefix}` +) + +const files = new Glob(artifactsDir + '/**/*', { nodir: true }) + +let countFiles = 0 +const shaEntries = new Array() + +for (const file of files.found) { + if (file.endsWith('.sha256')) { + shaEntries.push(getShaContents(file)) + } + + countFiles++ +} + +if (SUCCESSFUL_RELEASE_FILE_COUNT !== countFiles) { + console.error( + `🔴 Artifacts folder has ${countFiles} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` + ) + process.exit(1) +} + +const shaEntriesByArchitecture: ChecksumGroups = { + x64: shaEntries.filter( + e => + e.filename.includes('-linux-x86_64-') || + e.filename.includes('-linux-amd64-') + ), + arm: shaEntries.filter( + e => + e.filename.includes('-linux-armv7l-') || + e.filename.includes('-linux-armhf-') + ), + arm64: shaEntries.filter( + e => + e.filename.includes('-linux-aarch64-') || + e.filename.includes('-linux-arm64-') + ), +} + +console.log(`Found ${countFiles} files in artifacts directory`) +console.log(shaEntriesByArchitecture) + +const draftReleaseNotes = generateDraftReleaseNotes( + [], + shaEntriesByArchitecture +) +const releaseNotesPath = __dirname + '/release_notes.txt' + +fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) + +console.log( + `✅ All done! The release notes have been written to ${releaseNotesPath}` +) + +/** + * Returns the filename (excluding .sha256) and its contents (a SHA256 checksum). + */ +function getShaContents(filePath: string): { + filename: string + checksum: string +} { + const filename = basename(filePath).slice(0, -7) + const checksum = fs.readFileSync(filePath, 'utf8') + + return { filename, checksum } +} + +function formatEntry(e: ChecksumEntry): string { + return `**${e.filename}**\n${e.checksum}\n` +} + +/** + * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ + */ +function generateDraftReleaseNotes( + releaseNotesEntries: Array, + shaEntries: ChecksumGroups +): string { + const changelogText = releaseNotesEntries.join('\n') + + const x64Section = shaEntries.x64.map(formatEntry).join('\n') + const armSection = shaEntries.arm.map(formatEntry).join('\n') + const arm64Section = shaEntries.arm64.map(formatEntry).join('\n') + + const draftReleaseNotes = `${changelogText} + +## Fixes and improvements + +TODO + +## SHA-256 checksums + +### x64 + +${x64Section} + +### ARM64 + +${arm64Section} + +### ARM + +${armSection}` + + return draftReleaseNotes +} diff --git a/script/package.ts b/script/package.ts index 38075a7eccd..0aec32ee541 100644 --- a/script/package.ts +++ b/script/package.ts @@ -182,6 +182,9 @@ async function generateChecksums(files: Array) { for (const [fullPath, checksum] of checksums) { const fileName = path.basename(fullPath) checksumsText += `${checksum} - ${fileName}\n` + + const checksumFilePath = `${fullPath}.sha256` + await writeFile(checksumFilePath, checksum) } const checksumFile = path.join(distRoot, 'checksums.txt') From 299c386fd9c2ac0243adeb7e1e1e5bda471a1a74 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Mon, 10 Jul 2023 11:05:10 -0300 Subject: [PATCH 73/80] add support for generating release notes from upstream release (#900) --- script/generate-release-notes.ts | 209 +++++++++++++++++++++++++++---- 1 file changed, 184 insertions(+), 25 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index b52d4f622a4..a299e3f860a 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -1,13 +1,23 @@ /* eslint-disable no-sync */ const glob = require('glob') -const { basename } = require('path') +const { basename, dirname, join } = require('path') const fs = require('fs') type ChecksumEntry = { filename: string; checksum: string } type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> +type ReleaseNotesGroupType = 'new' | 'added' | 'fixed' | 'improved' | 'removed' + +type ReleaseNotesGroups = Record> + +type ReleaseNoteEntry = { + text: string + ids: Array + contributor?: string +} + // 3 architectures * 3 package formats * 2 files (package + checksum file) const SUCCESSFUL_RELEASE_FILE_COUNT = 3 * 3 * 2 @@ -74,11 +84,13 @@ const shaEntriesByArchitecture: ChecksumGroups = { console.log(`Found ${countFiles} files in artifacts directory`) console.log(shaEntriesByArchitecture) +const releaseNotesByGroup = getReleaseGroups(releaseTagWithoutPrefix) + const draftReleaseNotes = generateDraftReleaseNotes( - [], + releaseNotesByGroup, shaEntriesByArchitecture ) -const releaseNotesPath = __dirname + '/release_notes.txt' +const releaseNotesPath = join(__dirname, 'release_notes.txt') fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) @@ -99,42 +111,189 @@ function getShaContents(filePath: string): { return { filename, checksum } } -function formatEntry(e: ChecksumEntry): string { - return `**${e.filename}**\n${e.checksum}\n` +function extractIds(str: string): Array { + const idRegex = /#(\d+)/g + + const idArray = new Array() + let match + + while ((match = idRegex.exec(str))) { + const textValue = match[1].trim() + const numValue = parseInt(textValue, 10) + if (!isNaN(numValue)) { + idArray.push(numValue) + } + } + + return idArray } -/** - * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ - */ -function generateDraftReleaseNotes( - releaseNotesEntries: Array, - shaEntries: ChecksumGroups +function parseCategory(str: string): ReleaseNotesGroupType | null { + const input = str.toLocaleLowerCase() + switch (input) { + case 'added': + case 'fixed': + case 'improved': + case 'new': + case 'removed': + return input + default: + return null + } +} + +function getReleaseGroups(version: string): ReleaseNotesGroups { + if (!version.endsWith('-linux1')) { + return { + new: [], + added: [], + fixed: [], + improved: [], + removed: [], + } + } + + const upstreamVersion = version.replace('-linux1', '') + const rootDir = dirname(__dirname) + const changelogFile = fs.readFileSync(join(rootDir, 'changelog.json')) + const changelogJson = JSON.parse(changelogFile) + const releases = changelogJson['releases'] + const changelogForVersion: Array | undefined = + releases[upstreamVersion] + + if (!changelogForVersion) { + console.error( + `🔴 Changelog version ${upstreamVersion} not found in changelog.json, which is required for publishing a release based off an upstream releease. Aborting...` + ) + process.exit(1) + } + + console.log(`found release notes`, changelogForVersion) + + const releaseNotesByGroup: ReleaseNotesGroups = { + new: [], + added: [], + fixed: [], + improved: [], + removed: [], + } + + const releaseEntryExternalContributor = /\[(.*)\](.*)- (.*)\. Thanks (.*)!/ + const releaseEntryRegex = /\[(.*)\](.*)- (.*)/ + + for (const entry of changelogForVersion) { + const externalMatch = releaseEntryExternalContributor.exec(entry) + if (externalMatch) { + const category = parseCategory(externalMatch[1]) + const text = externalMatch[2].trim() + const ids = extractIds(externalMatch[3]) + const contributor = externalMatch[4] + + if (!category) { + console.warn(`unable to identify category for '${entry}'`) + } else { + releaseNotesByGroup[category].push({ + text, + ids, + contributor, + }) + } + } else { + const match = releaseEntryRegex.exec(entry) + if (match) { + const category = parseCategory(match[1]) + const text = match[2].trim() + const ids = extractIds(match[3]) + if (!category) { + console.warn(`unable to identify category for '${entry}'`) + } else { + releaseNotesByGroup[category].push({ + text, + ids, + }) + } + } else { + console.warn(`release entry does not match any format: '${entry}'`) + } + } + } + + return releaseNotesByGroup +} + +function formatReleaseNote(note: ReleaseNoteEntry): string { + const idsAsUrls = note.ids + .map(id => `https://github.com/desktop/desktop/issues/${id}`) + .join(' ') + const contributorNote = note.contributor + ? `. Thanks ${note.contributor}!` + : '' + + const template = ` - ${note.text} - ${idsAsUrls}${contributorNote}` + + return template.trim() +} + +function renderSection( + name: string, + items: Array, + omitIfEmpty: boolean = true ): string { - const changelogText = releaseNotesEntries.join('\n') + if (items.length === 0 && omitIfEmpty) { + return '' + } - const x64Section = shaEntries.x64.map(formatEntry).join('\n') - const armSection = shaEntries.arm.map(formatEntry).join('\n') - const arm64Section = shaEntries.arm64.map(formatEntry).join('\n') + const itemsText = + items.length === 0 ? 'TODO' : items.map(formatReleaseNote).join('\n') - const draftReleaseNotes = `${changelogText} + return ` +## ${name} -## Fixes and improvements +${itemsText} + ` +} -TODO +function formatEntry(e: ChecksumEntry): string { + return `**${e.filename}**\n${e.checksum}\n` +} -## SHA-256 checksums +function renderArchitectureIfNotEmpty( + name: string, + items: Array +): string { + if (items.length === 0) { + return '' + } -### x64 + const itemsText = items.map(formatEntry).join('\n') -${x64Section} + return ` + +## ${name} -### ARM64 +${itemsText} + ` +} -${arm64Section} +/** + * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ + */ +function generateDraftReleaseNotes( + releaseNotesGroups: ReleaseNotesGroups, + shaEntries: ChecksumGroups +): string { + const draftReleaseNotes = ` +${renderSection('New', releaseNotesGroups.new)} +${renderSection('Added', releaseNotesGroups.added)} +${renderSection('Fixed', releaseNotesGroups.fixed, false)} +${renderSection('Improved', releaseNotesGroups.improved, false)} +${renderSection('Removed', releaseNotesGroups.removed)} -### ARM +## SHA-256 checksums -${armSection}` +${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} +${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} +${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` return draftReleaseNotes } From 715fdc32833f6e7ef61cb13e54eee7cab50cdeeb Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 11 Jul 2023 16:54:23 -0300 Subject: [PATCH 74/80] allow for -test1 versioning with release tag --- script/generate-release-notes.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index a299e3f860a..d263954e079 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -142,8 +142,16 @@ function parseCategory(str: string): ReleaseNotesGroupType | null { } } +function isInitialTag(tag: string): boolean { + return tag.endsWith('-linux1') || tag.endsWith('-test1') +} + +function getVersionWithoutSuffix(tag: string): string { + return tag.replace('-linux1', '').replace('-test1', '') +} + function getReleaseGroups(version: string): ReleaseNotesGroups { - if (!version.endsWith('-linux1')) { + if (!isInitialTag(version)) { return { new: [], added: [], @@ -153,7 +161,7 @@ function getReleaseGroups(version: string): ReleaseNotesGroups { } } - const upstreamVersion = version.replace('-linux1', '') + const upstreamVersion = getVersionWithoutSuffix(version) const rootDir = dirname(__dirname) const changelogFile = fs.readFileSync(join(rootDir, 'changelog.json')) const changelogJson = JSON.parse(changelogFile) From b0881a7be98d92a59026122cca22d09caa6033a2 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 11 Jul 2023 16:56:11 -0300 Subject: [PATCH 75/80] tweak release notes output so that checksum is before file name --- script/generate-release-notes.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index d263954e079..edbdce15954 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -262,7 +262,7 @@ ${itemsText} } function formatEntry(e: ChecksumEntry): string { - return `**${e.filename}**\n${e.checksum}\n` + return `${e.checksum} ${e.filename}` } function renderArchitectureIfNotEmpty( @@ -276,11 +276,9 @@ function renderArchitectureIfNotEmpty( const itemsText = items.map(formatEntry).join('\n') return ` - ## ${name} -${itemsText} - ` +${itemsText}` } /** @@ -298,7 +296,6 @@ ${renderSection('Improved', releaseNotesGroups.improved, false)} ${renderSection('Removed', releaseNotesGroups.removed)} ## SHA-256 checksums - ${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} ${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} ${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` From bf1893e09d361d5ce819dc7148cdeed55f3db22e Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 13 Jul 2023 13:37:56 -0300 Subject: [PATCH 76/80] backport some release fixes after initial testing (#905) * adjust release flow to skip the release- prefix * aupdate glob to look recursively for artifacts * fail when the files cannot be found --- .github/workflows/ci.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8be277e7ff7..aed79b0d74a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -232,7 +232,7 @@ jobs: run: | RELEASE_TAG=${GITHUB_REF/refs\/tags\//} echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV - tagNameWithoutPrefix="${RELEASE_TAG:1}" + tagNameWithoutPrefix="${RELEASE_TAG:8}" echo "RELEASE_TAG_WITHOUT_PREFIX=${tagNameWithoutPrefix}" >> $GITHUB_ENV # TODO: generate release notes @@ -259,9 +259,10 @@ jobs: name: GitHub Desktop for Linux ${{ env.RELEASE_TAG_WITHOUT_PREFIX }} body_path: script/release_notes.txt files: | - artifacts/*.AppImage - artifacts/*.deb - artifacts/*.rpm + artifacts/**/*.AppImage + artifacts/**/*.deb + artifacts/**/*.rpm draft: true + fail_on_unmatched_files: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 10631bdd76dd54046a659b8b8724af43ff5385df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 09:00:33 -0300 Subject: [PATCH 77/80] Bump actions/download-artifact from 2 to 3 (#907) Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 2 to 3. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v2...v3) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aed79b0d74a..2bfc793d6b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -220,7 +220,7 @@ jobs: - uses: actions/checkout@v3 - name: Download all artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: path: './artifacts' From 540003fe155e0d0afd00e15881e86ae509ebe199 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 27 Jul 2023 17:17:43 -0300 Subject: [PATCH 78/80] remove rpm section as unnecessary --- script/electron-builder-linux.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index c40d57c7e98..cafa95924b9 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -13,10 +13,3 @@ linux: target: - AppImage maintainer: 'GitHub, Inc ' -rpm: - depends: - # dugite-native dependencies - - libcurl - # keytar dependencies - - libsecret - - gnome-keyring From 462efede2ed83af8d15a3a70f1e1c39a6eb85e0a Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Thu, 27 Jul 2023 17:25:23 -0300 Subject: [PATCH 79/80] strip out checksum generation for release --- script/generate-release-notes.ts | 94 ++++---------------------------- 1 file changed, 10 insertions(+), 84 deletions(-) diff --git a/script/generate-release-notes.ts b/script/generate-release-notes.ts index edbdce15954..31183e51bd1 100644 --- a/script/generate-release-notes.ts +++ b/script/generate-release-notes.ts @@ -1,13 +1,9 @@ /* eslint-disable no-sync */ const glob = require('glob') -const { basename, dirname, join } = require('path') +const { dirname, join } = require('path') const fs = require('fs') -type ChecksumEntry = { filename: string; checksum: string } - -type ChecksumGroups = Record<'x64' | 'arm' | 'arm64', Array> - type ReleaseNotesGroupType = 'new' | 'added' | 'fixed' | 'improved' | 'removed' type ReleaseNotesGroups = Record> @@ -45,51 +41,22 @@ console.log( const files = new Glob(artifactsDir + '/**/*', { nodir: true }) -let countFiles = 0 -const shaEntries = new Array() +const matches = files.found as Array -for (const file of files.found) { - if (file.endsWith('.sha256')) { - shaEntries.push(getShaContents(file)) - } +const fileCount = matches.length - countFiles++ -} - -if (SUCCESSFUL_RELEASE_FILE_COUNT !== countFiles) { +if (SUCCESSFUL_RELEASE_FILE_COUNT !== fileCount) { console.error( - `🔴 Artifacts folder has ${countFiles} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` + `🔴 Artifacts folder has ${fileCount} assets, expecting ${SUCCESSFUL_RELEASE_FILE_COUNT}. Please check the GH Actions artifacts to see which are missing.` ) process.exit(1) } -const shaEntriesByArchitecture: ChecksumGroups = { - x64: shaEntries.filter( - e => - e.filename.includes('-linux-x86_64-') || - e.filename.includes('-linux-amd64-') - ), - arm: shaEntries.filter( - e => - e.filename.includes('-linux-armv7l-') || - e.filename.includes('-linux-armhf-') - ), - arm64: shaEntries.filter( - e => - e.filename.includes('-linux-aarch64-') || - e.filename.includes('-linux-arm64-') - ), -} - -console.log(`Found ${countFiles} files in artifacts directory`) -console.log(shaEntriesByArchitecture) +console.log(`Found ${fileCount} files in artifacts directory`) const releaseNotesByGroup = getReleaseGroups(releaseTagWithoutPrefix) -const draftReleaseNotes = generateDraftReleaseNotes( - releaseNotesByGroup, - shaEntriesByArchitecture -) +const draftReleaseNotes = generateDraftReleaseNotes(releaseNotesByGroup) const releaseNotesPath = join(__dirname, 'release_notes.txt') fs.writeFileSync(releaseNotesPath, draftReleaseNotes, { encoding: 'utf8' }) @@ -98,19 +65,6 @@ console.log( `✅ All done! The release notes have been written to ${releaseNotesPath}` ) -/** - * Returns the filename (excluding .sha256) and its contents (a SHA256 checksum). - */ -function getShaContents(filePath: string): { - filename: string - checksum: string -} { - const filename = basename(filePath).slice(0, -7) - const checksum = fs.readFileSync(filePath, 'utf8') - - return { filename, checksum } -} - function extractIds(str: string): Array { const idRegex = /#(\d+)/g @@ -261,44 +215,16 @@ ${itemsText} ` } -function formatEntry(e: ChecksumEntry): string { - return `${e.checksum} ${e.filename}` -} - -function renderArchitectureIfNotEmpty( - name: string, - items: Array -): string { - if (items.length === 0) { - return '' - } - - const itemsText = items.map(formatEntry).join('\n') - - return ` -## ${name} - -${itemsText}` -} - /** * Takes the release notes entries and the SHA entries, then merges them into the full draft release notes ✨ */ function generateDraftReleaseNotes( - releaseNotesGroups: ReleaseNotesGroups, - shaEntries: ChecksumGroups + releaseNotesGroups: ReleaseNotesGroups ): string { - const draftReleaseNotes = ` + return ` ${renderSection('New', releaseNotesGroups.new)} ${renderSection('Added', releaseNotesGroups.added)} ${renderSection('Fixed', releaseNotesGroups.fixed, false)} ${renderSection('Improved', releaseNotesGroups.improved, false)} -${renderSection('Removed', releaseNotesGroups.removed)} - -## SHA-256 checksums -${renderArchitectureIfNotEmpty('x64', shaEntries.x64)} -${renderArchitectureIfNotEmpty('ARM64', shaEntries.arm64)} -${renderArchitectureIfNotEmpty('ARM', shaEntries.arm)}` - - return draftReleaseNotes +${renderSection('Removed', releaseNotesGroups.removed)}` } From 4fbb9571c680107847501a50f4c58f928bcf2b38 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Sat, 29 Jul 2023 09:39:05 -0300 Subject: [PATCH 80/80] Apply suggestions from code review --- app/src/lib/editors/linux.ts | 4 ---- docs/installation.md | 12 ------------ script/electron-builder-linux.yml | 2 +- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index ba5ad5ac587..d2adc77b8ee 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -152,10 +152,6 @@ const editors: ILinuxExternalEditor[] = [ name: 'Mousepad', paths: ['/usr/bin/mousepad'], }, - { - name: 'IntelliJ PhpStorm', - paths: ['/snap/bin/phpstorm'], - }, ] async function getAvailablePath(paths: string[]): Promise { diff --git a/docs/installation.md b/docs/installation.md index af08c517d13..e931a69ab89 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -21,17 +21,6 @@ distribution: - AppImage (`.AppImage`) - Debian (`.deb`) - RPM (`.rpm`) - - Snap (`.snap`) - also available from [snapcraft.io](https://snapcraft.io/github-desktop) - -If you install the Snap package, ensure you also connect it to your password -manager: - -```shellsession -$ sudo snap connect github-desktop:password-manager-service -``` - -Without this, GitHub Desktop cannot store or retrieve account details it -requires in the user's keychain. ## Data Directories @@ -50,7 +39,6 @@ GitHub Desktop will create directories to manage the files and data it needs to This varies based on the installer chosen: - AppImage, Debian and RPM: `~/.config/GitHub Desktop/` - - Snap: `~/snap/github-desktop/current/.config/GitHub Desktop/` ## Log Files diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index cafa95924b9..77203eb0b46 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -12,4 +12,4 @@ linux: - x-scheme-handler/x-github-desktop-dev-auth target: - AppImage - maintainer: 'GitHub, Inc ' + maintainer: 'Brendan Forster'