Scriptlike: New lib to aid in writing script-like programs

Jesse Phillips Jesse.K.Phillips+D at gmail.com
Tue Feb 11 17:01:05 PST 2014


On Wednesday, 12 February 2014 at 00:07:42 UTC, Nick Sabalausky 
wrote:
> As for the license, if you don't mind switching to zlib then 
> great, just go ahead and submit a pull request if you'd like 
> to. But I'm not married to zlib license or anything. My reasons 
> for using zlib license are relatively minor, and I'm not 
> opposed to switching to Boost, especially since it's already 
> the Phobos license after all. What are your thoughts?

I've been using Boost to be compatible Phobos. I haven't released 
anything which I feel needs a more restrictive license (zlib I 
think is permissive).

> So with Scriptlike, I'm hoping to avoid the need to ever deal 
> with slashes at all, because all the clutter and meticulous 
> care of always doing it the proper std.path-way is (hopefully) 
> hidden behind-the-scenes via the Path type.

Any hard coded paths I'll use / and buildPath for everything 
else. My experience so far has been positive on Windows (but 
maybe I still have some legacy conversions from the old days).

> Path.toString() automatically quotes paths correctly when they 
> contain spaces. So you can just pass it off to spawnShell or 
> whatever and it's automatically all ready-to-go. Don't even 
> need to call the std.path.escape*() funcs (which I've had 
> trouble with on windows anyway, although DMD #10863 is 
> apparently fixed in master now, so that should at least help).
>
> Of course, if for any reason you need to keep the path 
> un-quoted, there's Path.toRawString() for that.

Ah, I use execute(char[][]) and pipeProcess(char[][]) these 
bypass the shell (it seems) and require that the arguments aren't 
quoted. I prefer these because:

     auto cmd = ["dmd"];
     cmd ~= "file.d";//...

Is just a nice way to build a command.

> Do you think enabling dry run should automatically enable 
> command echoing?

Yes, I can't think of a reason I wouldn't want it to.

> >> - Less-pedantic filesystem operations for when you don't
> care whether
> >> it exists or not: existsAsFile, existsAsDir, existsAsSymlink,
> >> tryRename, trySymlink, tryCopy, tryMkdir, tryMkdirRecurse,
> tryRmdir,
> >> tryRmdirRecurse, tryRemove: All check whether the source
> path exists
> >> and return WITHOUT throwing if there's nothing to do.
> >
> > This is my biggest gripe with the current available functions!
>
> Yea, I'm constantly making wrappers for those things in my 
> scripts. Finally decided to just toss them into a common lib.
>
> I *do* think std.file's pedantic behavior with those does make 
> a lot of sense in the general case. I'm not sure that I'd even 
> want std.file to relax those checks by default. But for simple 
> shell-script-like stuff, it does tend to be more bother than 
> benefit.

Yeah, going back to being strict is harder.

> >> - One simple call, runShell, to run a shell command
> script-style (ie,
> >> synchronously with forwarded stdout/in/err) from any working
> >> directory. (Also automatically works around DMD #10863
> without waiting
> >> for v2.066 - BTW, thanks all involved who fixed that.)
> >
> > Aside from the bug, I don't understand what this provides
> over "execute."
>
> First of all, "spawn(Process|Shell)().wait()" is a better 
> comparison for runShell than execute(Process|Shell). The 
> execute functions, at least by default, hide the child's 
> stdout/stderr. Granted, execute does capture the child's 
> stdout, so you *could* output it yourself afterwords, but then 
> the user doesn't see the output in real-time (and forget about 
> anything interactive), so that's not a good solution.

Hmm, I've been needing to retain the output and do things with it 
quite a bit. Haven't played with it, but you may be able to get 
interaction by using pipeProcess, but then there is just more 
work to make it act like spawn.

> - runShell optionally takes a Path to use as the initial 
> working directory to launch the process from (and then uses 
> scope(exit) to automatically chdir back when the process 
> finishes). Nothing in std.process does that right now, although 
> there is a request in bugzilla for it: 
> http://d.puremagic.com/issues/show_bug.cgi?id=11363

That is likely quite useful.

> Plus there's the automatic command echoing (not that I couldn't 
> do that in some more direct std.process wrappers, like I do for 
> certain std.file functions).

I wonder if a generic wrapper could be created to handle this.


More information about the Digitalmars-d-announce mailing list