| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously, built-in commands were fairly primitive, merely outputting
STDOUT and STDERR with the print! macros. However, we need them to
behave like normal programs, that is:
- Acknowledge their verse's meter (forking, piping, etc.),
- Ability to capture STDOUT and STDERR (>, 2>),
- and Affect the currently running environment.
For these reasons, the anthology was reworked, and now contains the
Anthology struct, which mimics both std::process::{Child, Command}.
The AnthologyStdin helper struct was also created, for built-ins to
take input on STDIN, though no built-in is currently using it.
Each built-ins' incant functions were updated to return a
std::process::Output. It contains output from STDOUT, output from
STDERR, and the exit code of the "process".
A fix was also implemented for aliases, where the STDOUT and STDERR
vectors were not being copied to the newly constructed verse.
Notes:
There is some cleanup that needs to happen on this patch. For one, the
spellcheck function is no longer being used, so there is a generic OS
error if the program cannot be found in the $PATH. Also,
anthology::lookup gets called twice, which shouldn't need to happen.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This patch overhauls the reading and reciting of verses, such that the
redirection of STDERR (in addition to STDOUT, which was already a
feature), is now possible.
Removed the 'stdout' argument from recite(), since it is no longer
needed with how incantations function.
A verse's couplet indicator is now a u8, instead of a bool, with certain
values corresponding to types of couplets, for instance:
ls | grep Ca | lolcat
^ ^ ^
| | 2: right side of a couplet
| 3: both sides of a couplet
1: left side of a couplet
Incantions are no longer hanlded in rune.rs, and the task macros have
been removed. Now, a verse incants itself, matching on its own meter to
determine how to handle the next verse.
The following runes were added to help with handling STDERR:
Write2 -> 2>
WriteAll -> &>
Addendum2 -> 2>>
AddendumAll -> &>>
The 'io' field in verse was changed from an Option<Rune>, to an array of
Runes, since a single verse might have multiple IO operations.
The following fields were added to Verse, to assist with handling
STDERR:
ip -> List of filenames to read into STDIN
op -> List of filenames to send STDOUT to
ep -> List of filenames to send STDERR to
Keep track of channels when reading a poem. Channels are relating to IO
operations. If channel is None, words get pushed to the verse's primary
stanza (i.e. the verb or the clause). If a channel is selected, words
are pushed to one of the aforementioned new fields in Verse.
Read -> ip
Write/Addedum -> op
Write2/Addedum2 -> ep
WriteAll/AddendumAll -> op and ep
Notes:
This commit also added tests for the new Runes.
|
|
|
|
|
| |
Sort the output of the built-in 'export' and 'alias' commands, in cases
where all environment variables/aliases are printed out.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously, the recite() function created the 'out' variable, which was
a String, that got passed to the various incant functions, in order to
capture STDOUT in certain situations. In cases where STDOUT was
captured, it was first converted to a String, and then appended to the
'out' variable, by means of String::from_utf8_lossy(). This works for
basic text, however, does NOT work for binary data. This becomes
problematic, when for example, downling a tar file with curl/wget, that
is then piped ('|') to the tar program. Using from_utf8_lossy() in this
case can corrupt the tar file. This patch makes it so that out is stored
as bytes by default, and only converted to a String when necessary.
|
|
|
|
|
|
| |
Instead of handling aliases in the recite() function, which requires two
loops to handle properly with the current implementation, offload
checking for aliases to the read() function.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Make sure to interpret alias values as their own poems, since aliases
can be fairly complex.
Notes:
Previously, I was doing a simple find and replace for aliases within
each verse. However, aliases can be fairly complex, containing their own
range of meters, commands, and io operations. This could cause problems,
since a verse should never have, for instance, a pipe (`|`) in the
middle of it. This patch fixes it, so that we iterate once through the
poem, generating a new poem based on aliases that are found. In order to
avoid two loops in the recite() function, it might make sense to offload
handling aliases to read().
|
|
|
|
|
|
| |
Add docstring comments for all the incant function throughout the
anthology, documenting what each function does, and an example of it's
shell command.
|
|
The shell now has support for aliases (via alias foo=bar). The 'unalias'
command is also available to remove aliases. Finally,
Environment::aliases was changed to be a HashMap<String, String>,
instead of a Vec<String>.
Since the verse's verb might change (for instance, it is an environment
variable, or an alias), add another check in Poem::recite, which simply
continues, instead of running the spellchecker, if the verb is empty.
|