[darcs-users] [darcs-devel] [issue1648] darcs apply -i <foo.dpatch is wrong
judah.jacobson at gmail.com
Sun Oct 11 16:27:14 UTC 2009
On Sun, Oct 11, 2009 at 8:16 AM, Eric Kow <kowey at darcs.net> wrote:
> On Sun, Oct 11, 2009 at 08:02:33 +0000, Trent W. Buck wrote:
>> When "apply interactive" is in ~/.darcs/defaults, patches cannot be
>> read from standard input. This breaks workflows in e.g. mutt.
Is the workflow essentially "mutt <args> | darcs apply" in the bash
shell? If not, can you elaborate?
> Oh! That's worth keeping in mind for folks (like me) who want apply
> -i to be default
>> It might seem counterintuitive to have "two" input streams, but
>> clearly something like this can be implemented, because less(1) does
>> it. For example, "dmesg | less" will let you scroll up and down,
>> which presumably is reading the arrow keypresses from stdin.
> less(1) may not be reading its keypresses from stdin but directly from
> the terminal (I'm not sure if I'm using the right terminology or if
> anything I'm saying makes sense, but I recall something similar with
> OpenSSH being clever enough to write things out not to stdout but to the
You can read directly from the terminal by opening "/dev/tty".
> Darcs on the other hand is not so clever, and we (incidentally) exploit
> that stupidity to script our interactive testing (echo yn | darcs foo).
> Hmm, not sure what to do about this, so I'm replying to the list in the
> hope that somebody will pipe up with a nice, elegant solution that will
> just fix everything.
This seems like something Haskeline could conceivably do; namely, when
stdin isn't a terminal, read from /dev/tty instead of stdin. However,
usually we really do want to read from stdin; a couple examples are
testing (as you mentioned) and running in the emacs shell.
The current rules are listed at:
In particular, if you do "cat | darcs" then haskeline uses
stdin/stdout with no rich editing. In contrast, if you do "darcs |
cat" then haskeline uses rich editing with stdin for input and
/dev/tty for output.
The real trick is figuring out what the user wants you to do. I can
see two options:
1) Query an environmental flag (e.g. HASKELINE_FORCE_TTY).
2) Add a parameter to one of Haskeline's functions. I'm a little wary
of this since it changes the API, and as I said before you can't
always automatically detect whether the user wants tty or stdin.
More information about the darcs-users