Compare commits

...

4 Commits

Author SHA1 Message Date
1e526899ad fixed deleting mod twice 2021-01-21 16:22:00 +01:00
7a0ae4eb99 delete git mods 2021-01-20 21:08:28 +01:00
fbf7551fc2 git support
builds mods with gradle from source
2021-01-20 18:15:13 +01:00
0b6fc9174e curse: fixed callback if no mods are in the config 2021-01-20 13:47:12 +01:00
5 changed files with 136 additions and 5 deletions

32
package-lock.json generated
View File

@ -4,15 +4,47 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"flex-exec": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/flex-exec/-/flex-exec-1.0.0.tgz",
"integrity": "sha1-BpdLaFMoOdKhLDLevNsSN4IA/fA="
},
"follow-redirects": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
"integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA=="
},
"gift": {
"version": "0.10.2",
"resolved": "https://registry.npmjs.org/gift/-/gift-0.10.2.tgz",
"integrity": "sha512-wC9aKnQpjfOTWX+JG4DPJkS89ux6sl8EN4hXhv/2vBoXCDTEz1JiTeGTSeuKYlCqIgUFM1JwPVym34Sys3hvzw==",
"requires": {
"flex-exec": "^1.0.0",
"underscore": "^1.8.3"
}
},
"gradle-to-js": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/gradle-to-js/-/gradle-to-js-2.0.0.tgz",
"integrity": "sha512-eoYJiSoreHG0cS5aUmv7ISJhajuULlqdqG3QKVti6x1EFkBXE8rGH6ipGKWEesXpCkfNgzBrhzo5ztIH1JWZMw==",
"requires": {
"lodash.merge": "4.6.2"
}
},
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
},
"node-json-minify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-json-minify/-/node-json-minify-1.0.0.tgz",
"integrity": "sha1-e7NDL5ZYtr6x2ZP9XVOzyinQ15w="
},
"underscore": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.0.tgz",
"integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ=="
}
}
}

View File

@ -14,6 +14,8 @@
"license": "LGPL-3.0",
"dependencies": {
"follow-redirects": "^1.13.0",
"gift": "^0.10.2",
"gradle-to-js": "^2.0.0",
"node-json-minify": "^1.0.0"
}
}

View File

@ -5,6 +5,7 @@ function main() {
let downloadStarted = false;
let dep = new Map();
mods_lock = new Map(Object.entries(mods_lock));
if(global.config.mods.curse.length === 0) globCallback("curse", {});
global.config.mods.curse.forEach(mod => {
getData(`search?categoryId=0&gameId=432&gameVersion=${encodeURI(global.config.gameVersion)}&index=0&pageSize=1&searchFilter=${encodeURI(mod)}&sectionId=6&sort=0`, (result) => { // resolve projectID
resolveDep(result[0].id, downloadMods);
@ -63,7 +64,7 @@ function main() {
function downloadMods() {
if(!downloadStarted) {
downloadStarted = true;
globCallback(Object.fromEntries(dep));
globCallback("curse", Object.fromEntries(dep));
dep.forEach((mod, modId) => {
let path = getPath(mod)
if(mods_lock.has(modId)) {

95
src/git.js Normal file
View File

@ -0,0 +1,95 @@
const git = require("gift");
const glob = require("glob");
const childProcess = require("child_process");
const fs = require("fs");
const g2js = require('gradle-to-js/lib/parser');
let modsLock;
let globCallback;
let loopCounter = 0;
function main () {
modsLock = new Map(Object.entries(modsLock));
let deleteMods = new Map(modsLock);
let cacheDir = process.env.XDG_CACHE_HOME;
if(cacheDir == null) cacheDir = `${process.env.HOME}/.cache`;
let repoPathRoot = `${cacheDir}/minecraft-mod-packager`;
global.config.mods.git.forEach((gitRepo) => {
++loopCounter;
deleteMods.delete(gitRepo.url);
let repoPath = `${repoPathRoot}/${gitRepo.url.replace("://", "+")}/${gitRepo.branch}`;
fs.access(repoPath, (err) => {
if(err) {
if(err.code !== "ENOENT") throw err;
git.clone(gitRepo.url, repoPath, undefined, gitRepo.branch, (err, repo) => {
if(err) throw err;
build(repo, repoPath, gitRepo);
});
}
else {
let repo = git(repoPath);
repo.pull(["origin"], gitRepo.branch, (err) => {
if(err) throw err;
build(repo, repoPath, gitRepo);
});
}
});
});
deleteMods.forEach((mod, url) => {
modsLock.delete(url);
fs.unlink(modPath(mod.filename), (err) => {
if(err) throw err;
});
});
mayCb();
}
function build(repo, repoPath, gitRepo) {
if(modsLock.has(gitRepo.url)) newLock = modsLock.get(gitRepo.url);
else {
newLock = {};
modsLock.set(gitRepo.url, newLock);
}
repo.current_commit((err, commit) => {
if(err) throw err;
if(commit.id === newLock.commitId) cbDecrease();
else {
newLock.commitId = commit.id;
childProcess.execFile("gradle", ["build"], {cwd: repoPath}, (err) => {
if(err) throw err;
let buildPath = `${repoPath}/build/libs`;
fs.readFile(`${repoPath}/gradle.properties`, "utf-8", (err, data) => {
if(err) throw err;
g2js.parseText(data).then((gradleProp) => {
let modFile = `${gradleProp.archives_base_name}-${gradleProp.mod_version}.jar`;
if(newLock.filename != null) fs.unlink(`mods/${newLock.filename}`, (err) => {
if(err) throw err;
});
fs.copyFile(`${buildPath}/${modFile}`, `mods/${modFile}`, (err) => {
if(err) throw err;
});
newLock.filename = modFile;
cbDecrease();
});
});
});
}
});
}
function cbDecrease() {
--loopCounter;
mayCb();
}
function mayCb() {
if(loopCounter <= 0) globCallback("git", Object.fromEntries(modsLock));
}
function modPath(filename) {
return `mods/${filename}`;
}
module.exports = (mods_lock_p, cb) => {
globCallback = cb;
modsLock = mods_lock_p;
main()
}

View File

@ -17,14 +17,15 @@ try {
}
catch(err) {
if(err.errno !== -2) throw err;
modsLock = {curse: new Map()};
modsLock = {curse: {}, git: {}};
}
const numberCallback = 1;
const numberCallback = 2;
let callbackCounter = 0;
require("./curse.js")(modsLock.curse, finnish);
require("./git.js")(modsLock.git, finnish);
function finnish(curse) {
save_mods_lock.curse = curse;
function finnish(name, data) {
save_mods_lock[name] = data;
if(++callbackCounter == numberCallback) {
fs.writeFile(modLockPath, JSON.stringify(save_mods_lock), (err) => {
if(err) throw err;