Working directory for external commands

Discussion in 'Ruby' started by Duckz King_duckz, Feb 9, 2010.

  1. Hello everyone, I've been searching on google for a while now but I
    can't find any solution to my question. Basically I want to be able to
    specify the working directory for any external command I might launch,
    without using ugly globals :S
    What I'm trying to write is a wrapper class for git. As a client, I want
    to be able to write, for example:

    Code:
    git = GitWrapper.new
    puts git.status
    
    and of course I don't want to know what's happening inside status().

    In order to invoke git I'm doing `git status`, or `"c:/program
    files/git/bin/sh.exe" -c "git status"`, depending on the OS and other
    things. The problem is, backticks as well as %x, system and friends rely
    on Dir.pwd, so in order to get a valid result from git I should do:
    Code:
    def status()
    Dir.chdir("some/dir") do
    return `git status`
    end
    end
    
    which I'd rather avoid for its obvious fragility:
    Code:
    git = GitWrapper.new
    a = Thread.new {10000.times do {Dir.chdir("some/other/dir");
    do_some_work(); `rm -rf '*'`}}
    puts git.status() # OMG!!!!!111
    a.join
    
    Any suggestions?
    --
    Posted via http://www.ruby-forum.com/.
     
    Duckz King_duckz, Feb 9, 2010
    #1
    1. Advertising

  2. Duckz King_duckz wrote:
    > Hello everyone, I've been searching on google for a while now but I
    > can't find any solution to my question. Basically I want to be able to
    > specify the working directory for any external command I might launch,
    > without using ugly globals :S
    > What I'm trying to write is a wrapper class for git.


    This doesn't directly answer your question, but have you looked at Grit?

    Best,
    -- 
    Marnen Laibow-Koser
    http://www.marnen.org

    --
    Posted via http://www.ruby-forum.com/.
     
    Marnen Laibow-Koser, Feb 9, 2010
    #2
    1. Advertising

  3. 2010/2/9 Duckz King_duckz <>:
    > Hello everyone, I've been searching on google for a while now but I
    > can't find any solution to my question. Basically I want to be able to
    > specify the working directory for any external command I might launch,
    > without using ugly globals :S
    > What I'm trying to write is a wrapper class for git. As a client, I want
    > to be able to write, for example:
    >
    >
    Code:
    > git =3D GitWrapper.new
    > puts git.status
    > 
    >
    > and of course I don't want to know what's happening inside status().
    >
    > In order to invoke git I'm doing `git status`, or `"c:/program
    > files/git/bin/sh.exe" -c "git status"`, depending on the OS and other
    > things. The problem is, backticks as well as %x, system and friends rely
    > on Dir.pwd, so in order to get a valid result from git I should do:
    >
    Code:
    > def status()
    > =A0 =A0Dir.chdir("some/dir") do
    > =A0 =A0 =A0 =A0return `git status`
    > =A0 =A0end
    > end
    > 
    > which I'd rather avoid for its obvious fragility:
    >
    Code:
    > git =3D GitWrapper.new
    > a =3D Thread.new {10000.times do {Dir.chdir("some/other/dir");
    > do_some_work(); `rm -rf '*'`}}
    > puts git.status() # OMG!!!!!111
    > a.join
    > 
    >
    > Any suggestions?


    The only safe way I can think of is to defer the chdir to a child
    process. The shortest form would be

    irb(main):006:0> s=3D`cd /tmp && exec pwd`
    =3D> "/tmp\n"
    irb(main):007:0>

    (Using "git status" instead of "pwd" of course.)

    A Ruby solution would probably include IO.popen or popen3 and fork.

    Kind regards

    robert

    --=20
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
     
    Robert Klemme, Feb 9, 2010
    #3
  4. @Marnen Laibow-Koser:
    I didn't hear of it, but from a quick look it seems to allow a much
    cleaner solution, I'll look into that! Anyways, the global Dir problem
    has already occurred to me in other situations, and I'm still interested
    in finding a safe solution! I wonder why popen or system don't allow an
    optional parameter to specify the working directory!

    @Robert Klemme:
    Thanks for the hint, I guess I'll follow that path to write an intial
    version, before looking in depth into Grit. Are there any issues with
    fork implementation on Windows in Ruby 1.9.1? Still, I find it a shame
    you can't specify the cwd as a parameter (as in CreateProcess() on
    Windows for example, but I'm sure most OS have an equivalent).
    --
    Posted via http://www.ruby-forum.com/.
     
    Duckz King_duckz, Feb 9, 2010
    #4
  5. Duckz King_duckz wrote:
    > I guess I'll follow that path to write an intial
    > version, before looking in depth into Grit.


    BTW, there are two gems: 'grit' and 'git'. I don't know what's the
    difference between them.
    --
    Posted via http://www.ruby-forum.com/.
     
    Albert Schlef, Feb 9, 2010
    #5
  6. Albert Schlef wrote:
    > Duckz King_duckz wrote:
    >> I guess I'll follow that path to write an intial
    >> version, before looking in depth into Grit.

    >
    > BTW, there are two gems: 'grit' and 'git'. I don't know what's the
    > difference between them.


    Grit is pure Ruby. I think the git gem is just a wrapper.

    Best,
    -- 
    Marnen Laibow-Koser
    http://www.marnen.org

    --
    Posted via http://www.ruby-forum.com/.
     
    Marnen Laibow-Koser, Feb 9, 2010
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. caleb
    Replies:
    0
    Views:
    2,923
    caleb
    Jan 3, 2006
  2. Ben Pfaff

    Re: man pages for C commands (GCC commands)

    Ben Pfaff, Jun 24, 2003, in forum: C Programming
    Replies:
    4
    Views:
    4,011
    Thomas Stegen
    Jun 28, 2003
  3. Avi Kak
    Replies:
    4
    Views:
    444
    Fernando Perez
    Jul 26, 2004
  4. Tim Stanka
    Replies:
    1
    Views:
    836
    Jeff Epler
    Aug 2, 2004
  5. James Colannino

    output from external commands

    James Colannino, Oct 24, 2005, in forum: Python
    Replies:
    2
    Views:
    300
    James Colannino
    Oct 24, 2005
Loading...

Share This Page