pushd / popd for std.process/std.file

Jakob Ovrum jakobovrum at gmail.com
Tue Jul 9 08:02:58 PDT 2013


On Tuesday, 9 July 2013 at 14:21:48 UTC, David wrote:
> Having pushd/popd in std.process would make a lot of code look 
> better,
> often you have to change the workding directory only for a few 
> commands,
> with pushd/popd you don't have to temporarily store the old one 
> explicitly.
>
> pushd/popd: https://en.wikipedia.org/wiki/Pushd_and_popd
>
> What do you think?
>
>
> void build() {
>     pushd("../build")
>     scope(exit) popd();
>
>     shell("cmake ../src/c/bla");
>     shell("make");
> }

I think it's a good idea, except instead of maintaing a separate 
stack it could use the call stack through RAII. Also, considering 
`getcwd` and `chdir` are in std.file, maybe that's the better 
location?

Example implementation using RAII:
---
auto pushd(in char[] path)
{
     import std.file : chdir, getcwd;

     auto workingDir = getcwd();

     struct PopWorkingDir
     {
         ~this()
         {
             chdir(workingDir);
         }
     }

     chdir(path);

     return PopWorkingDir();
}

void main()
{
     auto a = pushd("test");

     import std.file : write;

     write("test.txt", "hi"); // Writes test/test.txt
}

---
Not sure if I like the fact that it will silently fail without 
the seemingly unused variable 'a' here (because the destructor is 
run immediately), but isn't this how we already do stuff like 
threading locks?



More information about the Digitalmars-d mailing list