🚚 Add command-line scripts from ssn repo

This commit is contained in:
C-3PO 2018-10-19 01:10:21 +02:00
parent d37a12eac8
commit e46faff11b
Signed by: c3po
GPG key ID: 62993C4BB4D86F24
10 changed files with 160 additions and 6 deletions

View file

@ -1,4 +1,4 @@
This repository contains command-line tools for handling patches. It uses the functions exposed by the `ssn` library and makes them available for use on the shell. This repository contains command-line tools for handling patches. It uses the functions exposed by the [ssn](/swtor/ssn) library and makes them available for use on the shell.
# Installation # Installation
For this tool to work, `tsc` and `tslint` must be globally available, e.g. by running: For this tool to work, `tsc` and `tslint` must be globally available, e.g. by running:
@ -16,7 +16,7 @@ npm install && npm start
For a better command line experience, add the following to your `~/.bashrc` file: For a better command line experience, add the following to your `~/.bashrc` file:
```bash ```bash
alias swtor_install='node /path/to/installation/patcher/dist/installPatch.js' alias swtor_install='node /path/to/installation/ssn-tools/dist/installPatch.js'
complete -W 'assets_swtor_de_de assets_swtor_en_us assets_swtor_fr_fr assets_swtor_main assets_swtor_test_de_de assets_swtor_test_en_us assets_swtor_test_fr_fr assets_swtor_test_main eualas movies_de_de movies_en_us movies_fr_fr patcher2014 patcher2017 retailclient_liveqatest retailclient_swtor retailclient_publictest' 'swtor_install' complete -W 'assets_swtor_de_de assets_swtor_en_us assets_swtor_fr_fr assets_swtor_main assets_swtor_test_de_de assets_swtor_test_en_us assets_swtor_test_fr_fr assets_swtor_test_main eualas movies_de_de movies_en_us movies_fr_fr patcher2014 patcher2017 retailclient_liveqatest retailclient_swtor retailclient_publictest' 'swtor_install'
``` ```

12
package-lock.json generated
View file

@ -3,21 +3,27 @@
"requires": true, "requires": true,
"lockfileVersion": 1, "lockfileVersion": 1,
"dependencies": { "dependencies": {
"@types/node": {
"version": "10.12.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.0.tgz",
"integrity": "sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ==",
"dev": true
},
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
}, },
"ssn": { "ssn": {
"version": "git+https://git.jedipedia.net/swtor/ssn.git#6d05939ef4c3139d689102544e01e7a849bf196c", "version": "git+https://git.jedipedia.net/swtor/ssn.git#684a123a7689ae2bc12a7ba00a6466366fc5bc19",
"from": "git+https://git.jedipedia.net/swtor/ssn.git", "from": "git+https://git.jedipedia.net/swtor/ssn.git",
"requires": { "requires": {
"ssn-installer": "git+https://git.jedipedia.net/swtor/ssn-installer.git#8c8c5cf68a1a74527de5ccd268db0aa34b795e13", "ssn-installer": "git+https://git.jedipedia.net/swtor/ssn-installer.git#01926cfe97a3166cff46a2061dda519f9c262d40",
"xml-js": "^1.6.8" "xml-js": "^1.6.8"
} }
}, },
"ssn-installer": { "ssn-installer": {
"version": "git+https://git.jedipedia.net/swtor/ssn-installer.git#8c8c5cf68a1a74527de5ccd268db0aa34b795e13", "version": "git+https://git.jedipedia.net/swtor/ssn-installer.git#01926cfe97a3166cff46a2061dda519f9c262d40",
"from": "git+https://git.jedipedia.net/swtor/ssn-installer.git" "from": "git+https://git.jedipedia.net/swtor/ssn-installer.git"
}, },
"xml-js": { "xml-js": {

View file

@ -13,5 +13,8 @@
}, },
"dependencies": { "dependencies": {
"ssn": "git+https://git.jedipedia.net/swtor/ssn.git" "ssn": "git+https://git.jedipedia.net/swtor/ssn.git"
},
"devDependencies": {
"@types/node": "^10.12.0"
} }
} }

7
src/failWithError.ts Normal file
View file

@ -0,0 +1,7 @@
export default function failWithError(usage: string, msg?: string) {
if (msg !== undefined) {
process.stderr.write(`Error: ${msg.trim()}\n`);
}
process.stderr.write(`Usage: ${usage} \n`);
process.exit(1);
}

20
src/getManifest.ts Normal file
View file

@ -0,0 +1,20 @@
import { getManifest, IManifest, Product, verifyProductName } from 'ssn';
import failWithError from './failWithError';
const failFunction = failWithError.bind(null, 'node dist/getManifest.js <product>');
if (process.argv.length !== 3) {
failFunction(`Expected 1 argument but ${process.argv.length - 2} arguments were supplied.`);
}
//Check that product name is valid
const product = process.argv[2];
if (!verifyProductName(product)) {
failFunction(`"${product} is not a valid product name.`);
}
//Get manifest and write output to stdout
getManifest(product as Product).then((output: IManifest) => {
process.stdout.write(JSON.stringify(output));
//process.exit(0);
});

30
src/getSolidpkg.ts Normal file
View file

@ -0,0 +1,30 @@
import { getSolidpkg, ISolidSimple, Product, verifyProductName } from 'ssn';
import failWithError from './failWithError';
const failFunction = failWithError.bind(null, 'node dist/getSolidpkg.js <product> <from> <to>');
if (process.argv.length !== 5) {
failFunction(`Expected 3 arguments but ${process.argv.length - 2} arguments were supplied.`);
}
//Check that product name is valid
const product = process.argv[2];
if (!verifyProductName(product)) {
failFunction(`"${product.substring(0, 300)}" is not a valid product name.`);
}
//Check that from and to are valid numbers
const from = process.argv[3];
const to = process.argv[4];
if (!from.match(/^(-1|0|[1-9][0-9]{0,2})$/)) {
failFunction(`from value "${from.substring(0, 300)}" is not a valid integer; it must be in range [-1, 999].`);
}
if (!to.match(/^(0|[1-9][0-9]{0,2})$/)) {
failFunction(`to value "${to.substring(0, 300)}" is not a valid integer; it must be in range [0, 999].`);
}
//Get solidpkg and write output to stdout
getSolidpkg(product as Product, Number(from), Number(to)).then((output: ISolidSimple) => {
process.stdout.write(JSON.stringify(output));
//process.exit(0);
});

30
src/getSolidpkgZip.ts Normal file
View file

@ -0,0 +1,30 @@
import { getSolidpkgZip, ISsnFileEntry, Product, verifyProductName } from 'ssn';
import failWithError from './failWithError';
const failFunction = failWithError.bind(null, 'node dist/getSolidpkgZip.js <product> <from> <to>');
if (process.argv.length !== 5) {
failFunction(`Expected 3 arguments but ${process.argv.length - 2} arguments were supplied.`);
}
//Check that product name is valid
const product = process.argv[2];
if (!verifyProductName(product)) {
failFunction(`"${product.substring(0, 300)}" is not a valid product name.`);
}
//Check that from and to are valid numbers
const from = process.argv[3];
const to = process.argv[4];
if (!from.match(/^(-1|0|[1-9][0-9]{0,2})$/)) {
failFunction(`from value "${from.substring(0, 300)}" is not a valid integer; it must be in range [-1, 999].`);
}
if (!to.match(/^(0|[1-9][0-9]{0,2})$/)) {
failFunction(`to value "${to.substring(0, 300)}" is not a valid integer; it must be in range [0, 999].`);
}
//Get solidpkg's .zip file and write output to stdout
getSolidpkgZip(product as Product, Number(from), Number(to)).then((output: ISsnFileEntry[]) => {
process.stdout.write(JSON.stringify(output));
//process.exit(0);
});

View file

@ -1 +0,0 @@
//TODO

43
src/installPatch.ts Normal file
View file

@ -0,0 +1,43 @@
import { getPatch, Product, verifyProductName } from 'ssn';
import failWithError from './failWithError';
const failFunction = failWithError.bind(null, 'node dist/installPatch.js <product> <from> <to>');
if (process.argv.length !== 5) {
failFunction(`Expected 3 arguments but ${process.argv.length - 2} arguments were supplied.`);
}
//Check that product name is valid
const product = process.argv[2];
if (!verifyProductName(product)) {
failFunction(`"${product.substring(0, 300)}" is not a valid product name.`);
}
//Check that from and to are valid numbers
const from = process.argv[3];
const to = process.argv[4];
if (!from.match(/^(-1|0|[1-9][0-9]{0,2})$/)) {
failFunction(`from value "${from.substring(0, 300)}" is not a valid integer; it must be in range [-1, 999].`);
}
if (!to.match(/^(0|[1-9][0-9]{0,2})$/)) {
failFunction(`to value "${to.substring(0, 300)}" is not a valid integer; it must be in range [0, 999].`);
}
//TODO: set directory with existing patch data
//TODO: set target directory where patch should be installed
//TODO: set temp directory where patch files should be stored.
//TODO: set location of xdelta3 executable
//TODO: set from=any so it detects current version automatically (based on .version files)
//TODO: set to=manifest/current to install whatever is the current version in manifest/on CDN
(async () => {
await getPatch({
/* tslint:disable:object-literal-sort-keys */
product: product as Product,
from: Number(from),
to: Number(to),
sourceDirectory: process.cwd(),
targetDirectory: process.cwd(),
/* tslint:enable:object-literal-sort-keys */
});
})();

16
src/tslint.json Normal file
View file

@ -0,0 +1,16 @@
{
"defaultSeverity": "error",
"extends": [
"tslint:recommended"
],
"jsRules": {},
"rules": {
"comment-format": false,
"indent": [true, "spaces", 2],
"max-line-length": false,
"no-bitwise": false,
"no-console": false,
"quotemark": [true, "single"]
},
"rulesDirectory": []
}