Re: [PATCH v2 02/44] ruby: add support for internal ruby programs
- From
Felipe Contreras <felipe.contreras@gmail.com>
- Date
- Sep 29, 2013, 04:56 UTC
- Message-ID
- <CAMP44s28B+UX1ofQb_sZfaPG2htvQ=W_EvScVbFgmR9P4SnvPg@mail.gmail.com>
- In-Reply-To
- <CALkWK0=XSxiz+MoU2H7Zxo4gSRvs+C5fGpnD2ioBvrXzdLpmww@mail.gmail.com>
On Sat, Sep 28, 2013 at 11:40 PM, Ramkumar Ramachandra <artagnon@gmail.com> wrote:
Show 8 quoted lines
> Felipe Contreras wrote: >> +$(RUBY_PROGRAMS): git-ruby$X >> + $(QUIET_BUILT_IN)$(RM) $@ && \ >> + ln >lt; $@ 2>/dev/null || \ >> + ln -s >lt; $@ 2>/dev/null || \ >> + cp >lt; $@ > > Why so many fallbacks? Will the hard-link (the first ln) ever fail?
Because that's what the code right on top of this is doing. I presume it would fail in file-systems that don't have hard-links.
Show 37 quoted lines
>> diff --git a/ruby.c b/ruby.c
>> index ee6a0e7..339e376 100644
>> --- a/ruby.c
>> +++ b/ruby.c
>> @@ -52,5 +52,22 @@ static int run_ruby_command(const char *cmd, int argc, const char **argv)
>>
>> int main(int argc, const char **argv)
>> {
>> - return run_ruby_command(argv[1], argc, argv);
>> + if (!strcmp(argv[0], "git-ruby")) {
>> + return run_ruby_command(argv[1], argc, argv);
>> + } else {
>> + const char *cmd = argv[0];
>> + static char buf[PATH_MAX + 1];
>> + const char *args[argc + 1];
>> + int i;
>> +
>> + snprintf(buf, PATH_MAX, "%s/%s.rb",
>> + git_exec_path(), basename((char *)cmd));
>> +
>> + args[0] = "git";
>> + args[1] = buf;
>> + for (i = 0; i < argc - 1; i++)
>> + args[i + 2] = (char *)argv[i + 1];
>> +
>> + return run_ruby_command(cmd, argc + 1, args);
>> + }
>> }
>
> Can you explain this in greater detail in your commit message? When I
> pass an argument,
>
> $ git ruby foo
> git-ruby: No such file or directory -- foo (LoadError)
>
> I get this as before. How exactly will new ruby scripts be executed?
> (I can only guess at this point)If you do:
% git ruby foo
It's the same as
% ruby foo
You need the script right there, as a file named "foo".
However, this already works before this patch.
What this patch does is enable:
% git foo
But for this you need two things:
1) A binary named git-foo in your path, that is a link to git-ruby, which is what the variable RUBY_PROGRAMS is for in the Makefile
2) A script named git-foo.rb in your exec-path.
So basically "git-foo" is the same as "git ruby $GIT_EXEC_PATH/git-foo.rb".
-- Felipe Contreras