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
[/code]
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
[/code]
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
[/code]
Any suggestions?
on 2010-02-09 01:01
on 2010-02-09 01:57
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 marnen@marnen.org
on 2010-02-09 09:04
2010/2/9 Duckz King_duckz <king_duckz@yahoo.it>: > [/code] > return `git status` > [/code] > > 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=`cd /tmp && exec pwd` => "/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
on 2010-02-09 11:51
@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).
on 2010-02-09 14:22
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.
on 2010-02-09 14:38
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 marnen@marnen.org
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.