diff --git a/packages/api/src/controllers/runners.js b/packages/api/src/controllers/runners.js index 977fd85fb..e90fa21de 100644 --- a/packages/api/src/controllers/runners.js +++ b/packages/api/src/controllers/runners.js @@ -54,12 +54,16 @@ module.exports = { DBGATE_API: process.argv[1], }, }); - subprocess.stdout.on('data', (data) => this.dispatchMessage(runid, data.toString())); - subprocess.stderr.on('data', (data) => - data.toString.split('\n').forEach((message) => { - this.dispatchMessage(runid, { severity: 'error', message }); - }) - ); + const pipeDispatcher = (severity) => (data) => + data + .toString() + .split('\n') + .forEach((message) => { + if (message.trim()) this.dispatchMessage(runid, { severity, message: message.trim() }); + }); + + subprocess.stdout.on('data', pipeDispatcher('info')); + subprocess.stderr.on('data', pipeDispatcher('error')); subprocess.on('exit', (code) => { socket.emit(`runner-done-${runid}`, code); }); @@ -101,6 +105,7 @@ module.exports = { res.push({ name: file, size: stat.size, + path: path.join(directory, file), }); } return res; diff --git a/packages/web/src/query/RunnerOuputFiles.js b/packages/web/src/query/RunnerOuputFiles.js index ed1cd9233..e071bd576 100644 --- a/packages/web/src/query/RunnerOuputFiles.js +++ b/packages/web/src/query/RunnerOuputFiles.js @@ -5,6 +5,7 @@ import styled from 'styled-components'; import TableControl, { TableColumn } from '../utility/TableControl'; import formatFileSize from '../utility/formatFileSize'; import resolveApi from '../utility/resolveApi'; +import getElectron from '../utility/getElectron'; export default function RunnerOutputFiles({ runnerId, executeNumber }) { const socket = useSocket(); @@ -28,19 +29,59 @@ export default function RunnerOutputFiles({ runnerId, executeNumber }) { setFiles([]); }, [executeNumber]); + const electron = getElectron(); + return ( formatFileSize(row.size)} /> - ( - - download - - )} - /> + {!electron && ( + ( + + download + + )} + /> + )} + {electron && ( + ( + { + const file = electron.remote.dialog.showSaveDialogSync(electron.remote.getCurrentWindow(), {}); + if (file) { + const fs = window.require('fs'); + fs.copyFile(row.path, file, () => {}); + } + }} + > + save + + )} + /> + )} + {electron && ( + ( + { + electron.remote.shell.showItemInFolder(row.path); + }} + > + show + + )} + /> + )} ); } diff --git a/packages/web/src/utility/getElectron.js b/packages/web/src/utility/getElectron.js new file mode 100644 index 000000000..0599f25ec --- /dev/null +++ b/packages/web/src/utility/getElectron.js @@ -0,0 +1,7 @@ +export default function getElectron() { + if (window.require) { + const electron = window.require('electron'); + return electron; + } + return null; +}