mirror of
https://github.com/HeyPuter/puter
synced 2024-11-15 06:15:47 +00:00
feat(phoenix): Implement an exit
builtin
This commit is contained in:
parent
5de3052026
commit
3184d3482c
@ -21,6 +21,7 @@ import { launchPuterShell } from './puter-shell/main.js';
|
||||
import { NodeStdioPTT } from './pty/NodeStdioPTT.js';
|
||||
import { CreateFilesystemProvider } from './platform/node/filesystem.js';
|
||||
import { CreateEnvProvider } from './platform/node/env.js';
|
||||
import { CreateSystemProvider } from './platform/node/system.js';
|
||||
import { parseArgs } from '@pkgjs/parseargs';
|
||||
import capcon from 'capture-console';
|
||||
import fs from 'fs';
|
||||
@ -64,6 +65,7 @@ const ctx = new Context({
|
||||
name: 'node',
|
||||
filesystem: CreateFilesystemProvider(),
|
||||
env: CreateEnvProvider(),
|
||||
system: CreateSystemProvider(),
|
||||
}),
|
||||
});
|
||||
|
||||
|
@ -22,6 +22,7 @@ import { CreateFilesystemProvider } from './platform/puter/filesystem.js';
|
||||
import { CreateDriversProvider } from './platform/puter/drivers.js';
|
||||
import { XDocumentPTT } from './pty/XDocumentPTT.js';
|
||||
import { CreateEnvProvider } from './platform/puter/env.js';
|
||||
import { CreateSystemProvider } from './platform/puter/system.js';
|
||||
|
||||
window.main_shell = async () => {
|
||||
const config = {};
|
||||
@ -73,6 +74,7 @@ window.main_shell = async () => {
|
||||
filesystem: CreateFilesystemProvider({ puterSDK }),
|
||||
drivers: CreateDriversProvider({ puterSDK }),
|
||||
env: CreateEnvProvider({ config }),
|
||||
system: CreateSystemProvider({ puterSDK })
|
||||
}),
|
||||
}));
|
||||
};
|
||||
|
9
packages/phoenix/src/platform/node/system.js
Normal file
9
packages/phoenix/src/platform/node/system.js
Normal file
@ -0,0 +1,9 @@
|
||||
import process from 'node:process';
|
||||
|
||||
export const CreateSystemProvider = () => {
|
||||
return {
|
||||
exit: (code) => {
|
||||
process.exit(code);
|
||||
},
|
||||
}
|
||||
}
|
7
packages/phoenix/src/platform/puter/system.js
Normal file
7
packages/phoenix/src/platform/puter/system.js
Normal file
@ -0,0 +1,7 @@
|
||||
export const CreateSystemProvider = ({ puterSDK }) => {
|
||||
return {
|
||||
exit: (code) => {
|
||||
puterSDK.exit(code);
|
||||
},
|
||||
}
|
||||
}
|
@ -31,6 +31,7 @@ import module_dirname from './dirname.js'
|
||||
import module_echo from './echo.js'
|
||||
import module_env from './env.js'
|
||||
import module_errno from './errno.js'
|
||||
import module_exit from './exit.js'
|
||||
import module_false from './false.js'
|
||||
import module_grep from './grep.js'
|
||||
import module_head from './head.js'
|
||||
@ -75,6 +76,7 @@ export default {
|
||||
"echo": module_echo,
|
||||
"env": module_env,
|
||||
"errno": module_errno,
|
||||
"exit": module_exit,
|
||||
"false": module_false,
|
||||
"grep": module_grep,
|
||||
"head": module_head,
|
||||
|
48
packages/phoenix/src/puter-shell/coreutils/exit.js
Normal file
48
packages/phoenix/src/puter-shell/coreutils/exit.js
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (C) 2024 Puter Technologies Inc.
|
||||
*
|
||||
* This file is part of Phoenix Shell.
|
||||
*
|
||||
* Phoenix Shell is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import { Exit } from './coreutil_lib/exit.js';
|
||||
|
||||
export default {
|
||||
name: 'exit',
|
||||
usage: 'exit [CODE]',
|
||||
description: 'Exit the shell and return the given CODE. If no argument is given, uses the most recent return code.',
|
||||
args: {
|
||||
$: 'simple-parser',
|
||||
allowPositionals: true
|
||||
},
|
||||
execute: async ctx => {
|
||||
const { positionals, exit } = ctx.locals;
|
||||
|
||||
let status_code = 0;
|
||||
|
||||
if (positionals.length === 0) {
|
||||
status_code = exit;
|
||||
} else if (positionals.length === 1) {
|
||||
const maybe_number = Number(positionals[0]);
|
||||
if (Number.isInteger(maybe_number)) {
|
||||
status_code = maybe_number;
|
||||
}
|
||||
} else {
|
||||
await ctx.externs.err.write('exit: Too many arguments');
|
||||
throw new Exit(1);
|
||||
}
|
||||
|
||||
ctx.platform.system.exit(status_code);
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue
Block a user