Skip to content

Commit

Permalink
feat(phoenix): Implement an exit builtin
Browse files Browse the repository at this point in the history
  • Loading branch information
AtkinsSJ committed May 23, 2024
1 parent 5de3052 commit 3184d34
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 0 deletions.
2 changes: 2 additions & 0 deletions packages/phoenix/src/main_cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -64,6 +65,7 @@ const ctx = new Context({
name: 'node',
filesystem: CreateFilesystemProvider(),
env: CreateEnvProvider(),
system: CreateSystemProvider(),
}),
});

Expand Down
2 changes: 2 additions & 0 deletions packages/phoenix/src/main_puter.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {};
Expand Down Expand Up @@ -73,6 +74,7 @@ window.main_shell = async () => {
filesystem: CreateFilesystemProvider({ puterSDK }),
drivers: CreateDriversProvider({ puterSDK }),
env: CreateEnvProvider({ config }),
system: CreateSystemProvider({ puterSDK })
}),
}));
};
9 changes: 9 additions & 0 deletions packages/phoenix/src/platform/node/system.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import process from 'node:process';

export const CreateSystemProvider = () => {
return {
exit: (code) => {
process.exit(code);
},
}
}
7 changes: 7 additions & 0 deletions packages/phoenix/src/platform/puter/system.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export const CreateSystemProvider = ({ puterSDK }) => {
return {
exit: (code) => {
puterSDK.exit(code);
},
}
}
2 changes: 2 additions & 0 deletions packages/phoenix/src/puter-shell/coreutils/__exports__.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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,
Expand Down
48 changes: 48 additions & 0 deletions packages/phoenix/src/puter-shell/coreutils/exit.js
Original file line number Diff line number Diff line change
@@ -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);
}
};

0 comments on commit 3184d34

Please sign in to comment.