Working directory for external commands

  • Thread starter Duckz King_duckz
  • Start date

D

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 = 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?
 
Ad

Advertisements

M

Marnen Laibow-Koser

Duckz said:
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
(e-mail address removed)
 
R

Robert Klemme

2010/2/9 Duckz King_duckz said:
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/
 
D

Duckz King_duckz

@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).
 
A

Albert Schlef

Duckz said:
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.
 
Ad

Advertisements

Ad

Advertisements


Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top