Partial import processing
This commit is contained in:
@@ -35,6 +35,7 @@ const FilesystemIPC = require('../src/renderer/ipc/FilesystemIPC');
|
|||||||
const MountsIPC = require('../src/renderer/ipc/MountsIPC');
|
const MountsIPC = require('../src/renderer/ipc/MountsIPC');
|
||||||
const PlatformIPC = require('../src/renderer/ipc/PlatformIPC');
|
const PlatformIPC = require('../src/renderer/ipc/PlatformIPC');
|
||||||
const ReleaseIPC = require('../src/renderer/ipc/ReleaseIPC');
|
const ReleaseIPC = require('../src/renderer/ipc/ReleaseIPC');
|
||||||
|
const SkynetIPC = require('../src/renderer/ipc/SkynetIPC');
|
||||||
const StateIPC = require('../src/renderer/ipc/StateIPC');
|
const StateIPC = require('../src/renderer/ipc/StateIPC');
|
||||||
const SystemIPC = require('../src/renderer/ipc/SystemIPC');
|
const SystemIPC = require('../src/renderer/ipc/SystemIPC');
|
||||||
const UpgradeIPC = require('../src/renderer/ipc/UpgradeIPC');
|
const UpgradeIPC = require('../src/renderer/ipc/UpgradeIPC');
|
||||||
@@ -331,6 +332,7 @@ FilesystemIPC.addListeners(ipcMain, AppFunctions);
|
|||||||
MountsIPC.addListeners(ipcMain, AppFunctions);
|
MountsIPC.addListeners(ipcMain, AppFunctions);
|
||||||
PlatformIPC.addListeners(ipcMain, AppFunctions);
|
PlatformIPC.addListeners(ipcMain, AppFunctions);
|
||||||
ReleaseIPC.addListeners(ipcMain, AppFunctions);
|
ReleaseIPC.addListeners(ipcMain, AppFunctions);
|
||||||
|
SkynetIPC.addListeners(ipcMain, AppFunctions);
|
||||||
StateIPC.addListeners(ipcMain, AppFunctions);
|
StateIPC.addListeners(ipcMain, AppFunctions);
|
||||||
SystemIPC.addListeners(ipcMain, AppFunctions);
|
SystemIPC.addListeners(ipcMain, AppFunctions);
|
||||||
UpgradeIPC.addListeners(ipcMain, AppFunctions);
|
UpgradeIPC.addListeners(ipcMain, AppFunctions);
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ class App extends IPCContainer {
|
|||||||
const selectAppPlatformDisplay = createModalConditionally(this.props.DisplaySelectAppPlatform,
|
const selectAppPlatformDisplay = createModalConditionally(this.props.DisplaySelectAppPlatform,
|
||||||
<SelectAppPlatform/>);
|
<SelectAppPlatform/>);
|
||||||
const upgradeDisplay = createModalConditionally(showUpgrade, <UpgradeUI/>);
|
const upgradeDisplay = createModalConditionally(showUpgrade, <UpgradeUI/>);
|
||||||
const importDisplay = createModalConditionally(showSkynetImport, <SkynetImport/>);
|
const importDisplay = createModalConditionally(showSkynetImport, <SkynetImport version={selectedVersion}/>);
|
||||||
|
|
||||||
let mainContent = [];
|
let mainContent = [];
|
||||||
if (this.props.DisplaySelectAppPlatform || !this.props.AppReady) {
|
if (this.props.DisplaySelectAppPlatform || !this.props.AppReady) {
|
||||||
|
|||||||
@@ -114,6 +114,9 @@ exports.IPC_Get_Platform_Reply = 'get_platform_reply';
|
|||||||
exports.IPC_Get_State = 'get_state';
|
exports.IPC_Get_State = 'get_state';
|
||||||
exports.IPC_Get_State_Reply = 'get_state_reply';
|
exports.IPC_Get_State_Reply = 'get_state_reply';
|
||||||
|
|
||||||
|
exports.IPC_Import_Skylinks = 'import_skylinks';
|
||||||
|
exports.IPC_Import_Skylinks_Reply = 'import_skylinks_reply';
|
||||||
|
|
||||||
exports.IPC_Install_Dependency = 'install_dependency';
|
exports.IPC_Install_Dependency = 'install_dependency';
|
||||||
exports.IPC_Install_Dependency_Reply = 'install_dependency_reply';
|
exports.IPC_Install_Dependency_Reply = 'install_dependency_reply';
|
||||||
|
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
|
|||||||
rowSpan={5}
|
rowSpan={5}
|
||||||
text={props.remote ? props.provider.substr(6) : props.provider}
|
text={props.remote ? props.provider.substr(6) : props.provider}
|
||||||
type={'Heading2'}/>
|
type={'Heading2'}/>
|
||||||
{(props.provider === 'Skynet') ? (
|
{((props.provider === 'Skynet') && (props.MState.Mounted)) ? (
|
||||||
<a href={'#'}
|
<a href={'#'}
|
||||||
col={configButton ? 24 : 18}
|
col={configButton ? 24 : 18}
|
||||||
onClick={props.MState.AllowMount ? () => props.displaySkynetExport(true) : e => {e.preventDefault();}}
|
onClick={props.MState.AllowMount ? () => props.displaySkynetExport(true) : e => {e.preventDefault();}}
|
||||||
@@ -191,7 +191,7 @@ export default connect(mapStateToProps, mapDispatchToProps)(props => {
|
|||||||
<u>Export</u>
|
<u>Export</u>
|
||||||
</a>
|
</a>
|
||||||
) : null}
|
) : null}
|
||||||
{(props.provider === 'Skynet') ? (
|
{((props.provider === 'Skynet') && (props.MState.Mounted)) ? (
|
||||||
<a href={'#'}
|
<a href={'#'}
|
||||||
col={configButton ? 24 + 13 : 18 + 13}
|
col={configButton ? 24 + 13 : 18 + 13}
|
||||||
onClick={props.MState.AllowMount ? () => props.displaySkynetImport(true) : e => {e.preventDefault();}}
|
onClick={props.MState.AllowMount ? () => props.displaySkynetImport(true) : e => {e.preventDefault();}}
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import {connect} from 'react-redux';
|
|||||||
import './SkynetImport.css'
|
import './SkynetImport.css'
|
||||||
import Box from '../../components/UI/Box/Box';
|
import Box from '../../components/UI/Box/Box';
|
||||||
import Button from '../../components/UI/Button/Button';
|
import Button from '../../components/UI/Button/Button';
|
||||||
import {displaySkynetImport} from '../../redux/actions/skynet_actions';
|
import {
|
||||||
|
displaySkynetImport, importSkylinks
|
||||||
|
} from '../../redux/actions/skynet_actions';
|
||||||
import {
|
import {
|
||||||
notifyError,
|
notifyError,
|
||||||
notifyInfo
|
notifyInfo
|
||||||
@@ -15,6 +17,7 @@ const mapDispatchToProps = dispatch => {
|
|||||||
displaySkynetImport: display => dispatch(displaySkynetImport(display)),
|
displaySkynetImport: display => dispatch(displaySkynetImport(display)),
|
||||||
notifyInfo: msg => dispatch(notifyInfo('Import Syntax', msg)),
|
notifyInfo: msg => dispatch(notifyInfo('Import Syntax', msg)),
|
||||||
notifyError: msg => dispatch(notifyError(msg)),
|
notifyError: msg => dispatch(notifyError(msg)),
|
||||||
|
importSkylinks: (version, jsonArray) => dispatch(importSkylinks(version, jsonArray)),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -55,12 +58,12 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
|
|
||||||
processNext = () => {
|
processNext = () => {
|
||||||
const items = this.state.import_list.split('\n');
|
const items = this.state.import_list.split('\n');
|
||||||
let jsonItems = [];
|
let importsArray = [];
|
||||||
try {
|
try {
|
||||||
for (let item of items) {
|
for (let item of items) {
|
||||||
item = item.trim();
|
item = item.trim();
|
||||||
if (item.startsWith('[')) {
|
if (item.startsWith('[')) {
|
||||||
jsonItems = JSON.parse(this.state.import_list.trim());
|
importsArray = JSON.parse(this.state.import_list.trim());
|
||||||
break;
|
break;
|
||||||
} else if (item.indexOf('=') >= 0) {
|
} else if (item.indexOf('=') >= 0) {
|
||||||
const parts = item.split(',')
|
const parts = item.split(',')
|
||||||
@@ -83,19 +86,19 @@ export default connect(null, mapDispatchToProps)(class extends Component {
|
|||||||
if (!importItem.skylink) {
|
if (!importItem.skylink) {
|
||||||
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
throw new Error('Invalid syntax for import: directory="",skylink="",token=""');
|
||||||
}
|
}
|
||||||
jsonItems.push(importItem);
|
importsArray.push(importItem);
|
||||||
} else if (item.length > 0) {
|
} else if (item.length > 0) {
|
||||||
jsonItems.push({
|
importsArray.push({
|
||||||
directory: '/',
|
directory: '/',
|
||||||
skylink: item,
|
skylink: item,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jsonItems.length === 0) {
|
if (importsArray.length === 0) {
|
||||||
throw new Error('Nothing to import');
|
throw new Error('Nothing to import');
|
||||||
}
|
}
|
||||||
console.log(jsonItems);
|
this.props.importSkylinks(this.props.version, importsArray);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.props.notifyError(e);
|
this.props.notifyError(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -683,6 +683,48 @@ module.exports.getMissingDependencies = dependencies => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
module.exports.importSkylinks = (version, jsonArray) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const repertoryExec = _getRepertoryExec(version);
|
||||||
|
const processOptions = {
|
||||||
|
cwd: repertoryExec.working,
|
||||||
|
detached: true,
|
||||||
|
shell: false,
|
||||||
|
windowsHide: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
const args = _getDefaultRepertoryArgs('Skynet');
|
||||||
|
args.push('-ij');
|
||||||
|
args.push(JSON.stringify(jsonArray));
|
||||||
|
|
||||||
|
let result = '';
|
||||||
|
const process = new spawn(repertoryExec.cmd, args, processOptions);
|
||||||
|
|
||||||
|
process.on('error', (err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.stdout.on('data', (d)=> {
|
||||||
|
result += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.stderr.on('data', (d)=> {
|
||||||
|
result += d;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.on('exit', code => {
|
||||||
|
if (code === 0) {
|
||||||
|
result = result.substr(result.indexOf('{'));
|
||||||
|
resolve(JSON.parse(result));
|
||||||
|
} else {
|
||||||
|
reject(new Error('Failed to import: ' + code + ':' + result));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
process.unref();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
//https://stackoverflow.com/questions/31645738/how-to-create-full-path-with-nodes-fs-mkdirsync
|
//https://stackoverflow.com/questions/31645738/how-to-create-full-path-with-nodes-fs-mkdirsync
|
||||||
module.exports.mkDirByPathSync = (targetDir, { isRelativeToScript = false } = {}) => {
|
module.exports.mkDirByPathSync = (targetDir, { isRelativeToScript = false } = {}) => {
|
||||||
const sep = path.sep;
|
const sep = path.sep;
|
||||||
|
|||||||
@@ -1,5 +1,27 @@
|
|||||||
import {createAction} from '@reduxjs/toolkit';
|
import {createAction} from '@reduxjs/toolkit';
|
||||||
|
import {getIPCRenderer} from '../../utils';
|
||||||
|
import * as Constants from '../../constants';
|
||||||
|
import {notifyError} from './error_actions';
|
||||||
|
|
||||||
export const displaySkynetExport = createAction('skynet/displaySkynetExport');
|
export const displaySkynetExport = createAction('skynet/displaySkynetExport');
|
||||||
export const displaySkynetImport = createAction('skynet/displaySkynetImport');
|
export const displaySkynetImport = createAction('skynet/displaySkynetImport');
|
||||||
|
|
||||||
|
export const importSkylinks = (version, jsonArray) => {
|
||||||
|
return dispatch => {
|
||||||
|
const ipcRenderer = getIPCRenderer();
|
||||||
|
if (ipcRenderer) {
|
||||||
|
ipcRenderer.once(Constants.IPC_Import_Skylinks_Reply, (_, arg) => {
|
||||||
|
if (arg.data.Success) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
dispatch(notifyError(arg.data.Error));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ipcRenderer.send(Constants.IPC_Import_Skylinks, {
|
||||||
|
Version: version,
|
||||||
|
JsonArray: jsonArray,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|||||||
21
src/renderer/ipc/SkynetIPC.js
Normal file
21
src/renderer/ipc/SkynetIPC.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
const Constants = require('../../constants');
|
||||||
|
const helpers = require('../../helpers');
|
||||||
|
|
||||||
|
const addListeners = (ipcMain, {standardIPCReply}) => {
|
||||||
|
ipcMain.on(Constants.IPC_Import_Skylinks, (event, data) => {
|
||||||
|
helpers
|
||||||
|
.importSkylinks(data.Version, data.JsonArray)
|
||||||
|
.then(result => {
|
||||||
|
standardIPCReply(event, Constants.IPC_Import_Skylinks_Reply, {
|
||||||
|
Result: result,
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
standardIPCReply(event, Constants.IPC_Import_Skylinks_Reply, {}, error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
addListeners
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user