summaryrefslogtreecommitdiff
path: root/src/rebar_prv_shell.erl
Commit message (Collapse)AuthorAgeFilesLines
* Support --setcookie optionFred Hebert2016-02-211-2/+14
| | | | Replicates `erl` behaviour.
* Display error message when bad config is loadedFred Hebert2016-01-171-2/+7
| | | | | | | | | | | | | | | | If a bad configuration file is submitted to rebar3 shell, display the following error: ===> The configuration file submitted could not be read and will be ignored. And keep going otherwise rather than silently failing. While crash-fast is usually a good mechanism, the shell so far is very tolerant of failures from apps to boot and whatnot, so this feels appropriate. Fixes #1019
* Correct TTY type detectionFred Hebert2016-01-061-17/+23
| | | | | | | | | | | | | | This reuses the trick used within OTP to pick within old and new shell. The 'user' structure is the same for all cases (escript, escript + dumb TERM, unstable install, unstable install + dumb TERM), so we take it down first. Then we boot the TTY driver, which fails if TERM=dumb, in which case we boot the retro-style usr. If it worked, we shut down the driver again, and boot a modern shell structure. This avoids all warnings and seems to work in all cases.
* Support old-style shell for rebar3 shellFred Hebert2016-01-061-0/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is quite the hack. This requires to detect the current shell running; if it's the new shell, business as usual. However, if it's the old shell, we have to find a way to take over it and drive IO. This requires a few steps because: - the old shell does not let you be supervised intelligently (it uses supervisor_bridge, so killing the child is not a supported operation from the supervisor) - the old shell ignores all trappable exit signals except those coming from the Port in charge of stdio ({fd, 0, 1}) - the old shell shuts down on all exit signals from the stdio Port except for badsig, and replicates the shutdown reason otherwise - An escript does not tolerate the `user` process dying (old shell) for any non-normal reason without also taking the whole escript down - Booting in an escript has an implicit 'noshell' argument interpreted by the old shell as a way to boot the stdio Port with only stdout taken care of Because of all these points, we have to kill the old `user` process by sending it a message pretending to be the Stdio port dying of reason `normal`, which lets it die without triggering the ire of its supervision tree and keeping the escript alive. This, in turn, kills the old stdio port since its parent (user.erl) has died. Then we have to boot our copy of user.erl (rebar_user.erl) which conveniently ignores the possibility of running the stdio port on stdout only -- always using stdin *and* stdout, giving us a bona fide old-style shell. A known issue introduced is that running r3:do(ct) seems to then kill the shell, and r3:do(dialyzer) appears to have an odd failure, but otherwise most other commands appear to work fine.
* Fix IO locking up in shell appsFred Hebert2015-11-141-5/+19
| | | | | | | | | | | | | | | | | | | | | Application masters are booted at the root of apps, and take over the group leader role to redirect IO. To cut the chain short and properly have their role inherited, they are their own leader, and keep a reference to the old leader in their internal state, which we cannot change. This is done so process ownership to a given application can be established, and allows to properly clean up resources outside the supervision tree when an app is shut down. This patch goes around and finds all processes whose group leaders are application masters older than the new `user' process booted by the shell providers, and swaps them with that new `user'. This lets the application masters survive, and fixes the blocking IO issue (resolving issue #899) This may mean an incomplete clean up is down on application shutdown, but that seems like a fair compromise.
* Feature: rebar shell [--script <FILE>]Geoff Cant2015-11-131-29/+131
| | | | | | | | | | | | | | | | | Adds the ability to run an escript before starting the apps and interactive shell for a project. This is intended to improve the local development experience for projects by providing an easy way to run companion services (mock rest APIs, databases etc) that the project relies on. This patch also adds {shell, Defaults} to the rebar config file so that a project can supply default values for many of the new or improved 'rebar3 shell' options: * {apps, OTPApps} * {script_file, EscriptFileName} * {config, ConfigFileName} The order of option precedence is command line, rebar.config, relx.
* Shell handles all possible relx app formatsFred Hebert2015-09-261-2/+15
| | | | | | | | | The list of applications in the relx config section could contain tuples. The tuple will either contain a version constraint for the app, the start type of the app or both. This fix silently expands `{shell_apps, [Apps]}` to support the same format.
* fix dialyzer warnings, except 'no local return' warningsTristan Sloughter2015-08-081-1/+1
|
* Detect missing EPMD, error, fallback and advise.Fred Hebert2015-08-051-2/+8
|
* Run agent as current process & hibernateFred Hebert2015-07-031-3/+9
| | | | | | | This tries to reduce memory usage when running `rebar3 shell` by running the agent in the current process (and avoiding to copy state cross-boundaries), and using frequent hibernation after each run to force a full GC and compaction of the current process.
* OTP apps show proper outputFred Hebert2015-06-151-1/+4
| | | | | | | | | | Whenever the old shell got killed and an app got loaded prior, the whole thing would silently drop output as the old 'user' process was replaced while application master processes would keep the old one's pid in their internal state. To work around this limitation, make sure the apps are booted only after the shell is replaced so that only the new `user` pid is used.
* Handle custom logger shell breakageFred Hebert2015-06-011-6/+12
| | | | | | | When swapping handlers, if a custom shell has been installed, it's possible it'll take over the tty and other options. This may break common operations that work on an otherwise regular shell, so we ignore failures and let things work with the custom shell only.
* Merge pull request #487 from ferd/fix-provider-barenessTristan Sloughter2015-05-301-1/+1
|\ | | | | fix bareness issues
| * fix bareness issuesFred Hebert2015-05-311-1/+1
| | | | | | | | | | | | - Crashes in providers lib when no providers in a namespace are bare - Making sure bareness matches semantics; i.e. a bare provider is visible, a non-bare provider is hidden.
* | Fix badarg exception when setting group_leader for a dead pidAndras Boroska2015-05-301-2/+4
|/ | | | | | When setting up a shell some time elapses between listing the pids and setting the group_leader. If the process exited during that time then erlang:group_leader/2 will crash with badarg.
* Optionally allow node names to the rebar3 shell.Fred Hebert2015-05-301-12/+30
| | | | | Helps with integration efforts, but unfortunately can't support the '-sname' and '-name' options, only '--sname' and '--name'.
* Fix config loading in shellFred Hebert2015-05-301-1/+4
| | | | | | | | | | | | | | | Config files from the command line would expect the wrong format: {app1, [...]}. {app2, [...]}. Instead of the correct sys.config format: [{app1, [...]}, {app2, [...]}] Not supported yet: the recursive file references documented in http://www.erlang.org/doc/man/config.html
* Add support to boot apps from releases in shellFred Hebert2015-05-291-1/+14
| | | | Precedence still goes to shell_apps.
* Get prebooted apps to acknowledge sys.configFred Hebert2015-05-291-3/+16
| | | | | Change the order from load-config -> start-apps to load-apps -> load-config -> start-apps
* Rebar agent reloads the config file on every runFred Hebert2015-05-281-1/+1
| | | | | This allows proper checking of new configurations, deps, or plugins, and makes sure they are detected during an active shell session.
* Add a shell agentFred Hebert2015-05-261-10/+14
| | | | | The shell agent allows to run rebar3 commands and autoload compiled modules when that is done.
* Adding app auto-boot to rebar shellFred Hebert2015-05-231-35/+63
| | | | | | | | | | - moved path addition, config loading and app boot to before the shell is available - apps successfully booting are in an INFO message, failed to boot into an ERROR message - A warning is printed when apps are booted informing to please use releases for actual deployment, and is omitted otherwise. - Some minor refactorings otherwise.
* print and format error message for bad .app files and all bad configsTristan Sloughter2015-05-221-15/+6
|
* try to read a config file when running `rebar shell`Nathaniel Waisbrot2015-05-071-1/+61
| | | | | | Adds a `--config` flag to the shell command to specify a config file. If the flag is not specified, attempts to read the sys_config defined for relx.
* real bootstrappingTristan Sloughter2015-04-221-1/+1
|
* track and cleanup code paths for different contextsTristan Sloughter2015-04-211-6/+7
|
* add default test paths in the `shell` and `cover` providersalisdair sullivan2015-04-031-2/+14
|
* update all examples in providers to use rebar3Tristan Sloughter2015-03-071-1/+1
|
* remove unneeded add path that breaks with apps/ dir as wellTristan Sloughter2014-12-011-1/+0
|
* move back to using format_error/1Tristan Sloughter2014-11-091-4/+4
|
* handle throw by relxTristan Sloughter2014-11-081-2/+2
|
* add format_error/2 provider callback to providersTristan Sloughter2014-10-221-1/+6
|
* move providers to separate appTristan Sloughter2014-10-031-9/+9
|
* return error messages from providersTristan Sloughter2014-09-271-1/+1
|
* more dialyzer fun. no likey opaque typesTristan Sloughter2014-09-211-8/+8
|
* add support for plugins as pre and post hooksTristan Sloughter2014-09-181-7/+3
|
* reworking of help display and parse of commandsTristan Sloughter2014-09-171-1/+1
|
* rename shell providerTristan Sloughter2014-08-241-0/+118