Files I've added

This still won't work, still a WIP
This commit is contained in:
David Baker 2019-12-06 18:20:31 +00:00
parent a2c5d6176f
commit 5a0c1cda22
7 changed files with 3207 additions and 0 deletions

8
.buildkite/pipeline.yaml Normal file
View file

@ -0,0 +1,8 @@
steps:
- label: ":eslint: Lint"
command:
- "yarn install"
- "yarn lint"
plugins:
- docker#v3.0.1:
image: "node:10"

19
.eslintrc.js Normal file
View file

@ -0,0 +1,19 @@
const jsSdkEslintCfg = require('matrix-js-sdk/.eslintrc');
module.exports = {
parserOptions: {
ecmaVersion: 8,
},
env: {
node: true,
// we also have some browser code (ie. the preload script)
browser: true,
},
extends: ["eslint:recommended", "google"],
rules: jsSdkEslintCfg.rules,
}
// js-sdk uses a babel rule which we can't use because we
// don't use babel, so remove it & put the original back
delete module.exports.rules["babel/no-invalid-this"];
module.exports.rules["no-invalid-this"] = "error";

7
README Normal file
View file

@ -0,0 +1,7 @@
Riot Desktop
============
This is *not* where the source for Riot desktop lives... yet. As of now,
it still lives in the main riot-web repo: https://github.com/vector-im/riot-web
This is an experimental split-out of the riot desktop code from the main repo.

86
package.json Normal file
View file

@ -0,0 +1,86 @@
{
"name": "riot-desktop",
"productName": "Riot",
"main": "src/electron-main.js",
"version": "1.5.5",
"description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.",
"repository": {
"type": "git",
"url": "https://github.com/vector-im/riot-desktop"
},
"license": "Apache-2.0",
"files": [],
"scripts": {
"mkdirs": "mkdir -p packages && mkdir -p deploys",
"fetch": "yarn run mkdirs && scripts/fetch-package.js",
"check": "scripts/check-webapp.js",
"start": "yarn run check && yarn install:electron && electron .",
"install:electron": "electron-builder install-app-deps",
"lint": "eslint src/",
"build:electron:linux": "yarn check && electron-builder -l --x64",
"build:electron:macos": "yarn check && electron-builder -m --x64",
"build:electron:windows": "yarn check && electron-builder -w --ia32 --x64",
"clean": "rimraf webapp dist packages deploys"
},
"dependencies": {
"auto-launch": "^5.0.1",
"electron-store": "^2.0.0",
"electron-window-state": "^4.1.0",
"minimist": "^1.2.0",
"png-to-ico": "^1.0.2"
},
"devDependencies": {
"electron-builder": "^21.2.0",
"electron-builder-squirrel-windows": "^21.2.0",
"electron-devtools-installer": "^2.2.4",
"electron-notarize": "^0.2.0",
"eslint": "^5.8.0",
"eslint-config-google": "^0.7.1",
"eslint-plugin-babel": "^4.1.2",
"follow-redirects": "^1.9.0",
"matrix-js-sdk": "^2.4.6-rc.1",
"tar": "^5.0.5"
},
"build": {
"appId": "im.riot.app",
"electronVersion": "7.1.3",
"files": [
"node_modules/**",
"src/**"
],
"extraResources": [
{
"from": "res/img",
"to": "img"
},
"webapp/**/*"
],
"linux": {
"target": "deb",
"category": "Network;InstantMessaging;Chat",
"maintainer": "support@riot.im",
"desktop": {
"StartupWMClass": "riot"
}
},
"deb": {
"afterInstall": "build/linux/after-install.tpl"
},
"mac": {
"category": "public.app-category.social-networking",
"darkModeSupport": true
},
"win": {
"target": {
"target": "squirrel"
},
"sign": "scripts/electron_winSign"
},
"directories": {
"buildResources": "electron_app/build",
"output": "dist"
},
"afterSign": "scripts/electron_afterSign.js"
}
}

15
scripts/check-webapp.js Executable file
View file

@ -0,0 +1,15 @@
#!/usr/bin/env node
const fs = require('fs').promises;
async function main() {
try {
const webappDir = await fs.opendir('webapp');
return 0;
} catch (e) {
console.log("No 'webapp' directory found. Run 'yarn run fetch' or symlink manually");
return 1;
}
}
main().then((ret) => process.exit(ret));

184
scripts/fetch-package.js Executable file
View file

@ -0,0 +1,184 @@
#!/usr/bin/env node
const process = require('process');
const path = require('path');
const fs = require('fs');
const fsPromises = require('fs').promises;
const { https } = require('follow-redirects');
const child_process = require('child_process');
const tar = require('tar');
const riotDesktopPackageJson = require('../package.json');
const PUBKEYURL = "https://packages.riot.im/riot-release-key.asc";
const PACKAGE_URL_PREFIX = "https://github.com/vector-im/riot-web/releases/download/";
async function downloadToFile(url, filename) {
console.log("Downloading " + url + "...");
const outStream = await fs.createWriteStream(filename);
return new Promise((resolve, reject) => {
https.get(url, (resp) => {
if (resp.statusCode / 100 !== 2) {
reject("Download failed: " + resp.statusCode);
return;
}
resp.on('data', (chunk) => {
outStream.write(chunk);
});
resp.on('end', (chunk) => {
outStream.end();
resolve();
});
});
}).catch(async (e) => {
outStream.end();
await fsPromises.unlink(filename);
throw e;
});
}
async function verifyFile(filename) {
return new Promise((resolve, reject) => {
const gpgProc = child_process.execFile('gpg', ['--verify', filename + '.asc', filename], (error) => {
if (error) {
reject(error);
} else {
resolve();
}
});
});
}
async function main() {
let verify = true;
let importkey = false;
let pkgDir = 'packages';
let deployDir = 'deploys';
let targetVersion;
while (process.argv.length > 2) {
switch (process.argv[2]) {
case '--noverify':
verify = false;
break;
case '--importkey':
importkey = true;
break;
case '--packages':
process.argv.shift();
pkgDir = process.argv[2];
break;
case '--deploys':
process.argv.shift();
deployDir = process.argv[2];
break;
default:
targetVersion = process.argv[2];
}
process.argv.shift();
}
if (targetVersion === undefined) {
targetVersion = 'v' + riotDesktopPackageJson.version;
}
const haveGpg = await new Promise((resolve) => {
child_process.execFile('gpg', ['--version'], (error) => {
resolve(!error);
});
});
if (importkey) {
if (!haveGpg) {
console.log("Can't import key without working GPG binary: install GPG and try again");
return 1;
}
await new Promise((resolve) => {
const gpgProc = child_process.execFile('gpg', ['--import'], (error) => {
if (error) {
console.log("Failed to import key", error);
} else {
console.log("Key imported!");
}
resolve(!error);
});
https.get(PUBKEYURL, (resp) => {
resp.on('data', (chunk) => {
gpgProc.stdin.write(chunk);
});
resp.on('end', (chunk) => {
gpgProc.stdin.end();
});
});
});
}
if (verify && !haveGpg) {
console.log("No working GPG binary: install GPG or pass --noverify to skip verification");
return 1;
}
const haveDeploy = false;
const expectedDeployDir = path.join(deployDir, 'riot-' + targetVersion);
try {
const webappDir = await fs.opendir(expectedDeployDir);
console.log(expectedDeployDir + "already exists");
haveDeploy = true;
} catch (e) {
}
if (!haveDeploy) {
const filename = 'riot-' + targetVersion + '.tar.gz';
const outPath = path.join(pkgDir, filename);
const url = PACKAGE_URL_PREFIX + targetVersion + '/' + filename;
try {
await fsPromises.stat(outPath);
console.log("Already have " + filename + ": not redownloading");
} catch (e) {
try {
await downloadToFile(url, outPath);
} catch (e) {
console.log("Failed to download " + url, e);
return 1;
}
}
if (verify) {
try {
await fsPromises.stat(outPath+'.asc');
console.log("Already have " + filename + ".asc: not redownloading");
} catch (e) {
try {
await downloadToFile(url + '.asc', outPath + '.asc');
} catch (e) {
console.log("Failed to download " + url, e);
return 1;
}
}
try {
await verifyFile(outPath);
console.log(outPath + " downloaded and verified");
} catch (e) {
console.log("Signature verification failed!", e);
return 1;
}
} else {
console.log(outPath + " downloaded but NOT verified");
}
await tar.x({
file: outPath,
cwd: deployDir,
});
}
console.log("Symlink " + expectedDeployDir + " -> webapp");
// Does this do a sensible thing on Windows?
await fsPromises.symlink(expectedDeployDir, 'webapp');
}
main().then((ret) => process.exit(ret));

2888
yarn.lock Normal file

File diff suppressed because it is too large Load diff