git 2.9.2: is RUNTIME_PREFIX supposed to work?

4 messages, 3 authors, 2016-09-27 · open the first message on its own page

git 2.9.2: is RUNTIME_PREFIX supposed to work?

From: Paul Smith <hidden>
Date: 2016-09-26 21:32:21

Hi all.  I'm trying to create a relocatable installation of Git 2.9.2,
so I can copy it anywhere and it continues to run without any problem.
This is on GNU/Linux systems, FWIW.

Looking through the code (for some other reason) I discovered the
RUNTIME_PREFIX setting which appears to attempt to set up the system
paths based on a prefix determined from the directory containing the
git command.  That looks like exactly what I want.

If I set RUNTIME_PREFIX=YesPlease and gitexecdir=libexec/git-core on
the make invocation, it appears to do the right thing when I invoke
.../libexec/git-core/git, even if I move it around.  Cool!

Except, when it doesn't.  And when it doesn't is all the situations
where Git runs subcommands: for example, "git pull" which wants to
invoke fetch and merge-base commands.

When RUNTIME_PREFIX is defined, it's a requirement that the argv[0] for
the process be a fully-qualified pathname: if it's not, then git will
assert at exec_cmd.c:23 in system_path():

	assert(argv0_path);

The argv0_path variable is set based on argv[0] passed in to main().
When I invoke top-level Git commands, that value is a fully-qualified
path just as you'd expect.  However, when Git itself invokes
subcommands it does so in a weird way where argv[0] is the command it
wants to invoke, using the magical execv() facility that lets you
invoke a command while providing a different value as argv[0].

For example my core dump from the assert of the merge-base shows:

  (gdb) p argv[0]
  $2 = 0x7fffd70c338e "merge-base"
  (gdb) p argv[1]
  $3 = 0x7fffd70c3399 "--fork-point"
  (gdb) p argv[2]
  $4 = 0x7fffd70c33a6 "refs/remotes/origin/master"
  (gdb) p argv[3]
  $5 = 0x7fffd70c33c1 "master"

Looking at builtin/pull.c I see get_rebase_fork_point() calls
capture_command() with this Git command, which calls start_command(),
which calls execv_git_command(), which calls sane_execvp(), which
invokes "git" as the filename but with argv[0] as "merge-base":

        sane_execvp("git", (char **)nargv.argv);
           ...calls sane_execvp():
        if (!execvp(file, argv))
                return 0; /* cannot happen ;-) */

This causes the assert.

So, my question is: is this a bug in RUNTIME_PREFIX support?  Or is
RUNTIME_PREFIX no longer supported, or maybe not supported at all on
UNIX-type operating systems?

Cheers!

Re: git 2.9.2: is RUNTIME_PREFIX supposed to work?

From: Junio C Hamano <hidden>
Date: 2016-09-26 21:57:56

On Mon, Sep 26, 2016 at 2:32 PM, Paul Smith [off-list ref] wrote:
Hi all.  I'm trying to create a relocatable installation of Git 2.9.2,
so I can copy it anywhere and it continues to run without any problem.
This is on GNU/Linux systems, FWIW.
I had an impression that the setting was only to support MS Windows.

Re: git 2.9.2: is RUNTIME_PREFIX supposed to work?

From: Paul Smith <hidden>
Date: 2016-09-27 13:25:10

On Mon, 2016-09-26 at 14:57 -0700, Junio C Hamano wrote:
On Mon, Sep 26, 2016 at 2:32 PM, Paul Smith [off-list ref] wrote:
quoted
Hi all.  I'm trying to create a relocatable installation of Git 2.9.2,
so I can copy it anywhere and it continues to run without any problem.
This is on GNU/Linux systems, FWIW.
I had an impression that the setting was only to support MS Windows.
Hm.  You may be right.  If so that's too bad, because a relocatable Git
is very handy even on UNIX systems.  Is there a reason for invoking the
subcommands by providing the plain command ("fetch", "merge-base") as
argv[0], rather than giving the fully-qualified path to a Git command?

Re: git 2.9.2: is RUNTIME_PREFIX supposed to work?

From: Johannes Schindelin <hidden>
Date: 2016-09-27 15:34:35

Hi Paul,

On Tue, 27 Sep 2016, Paul Smith wrote:
On Mon, 2016-09-26 at 14:57 -0700, Junio C Hamano wrote:
quoted
On Mon, Sep 26, 2016 at 2:32 PM, Paul Smith [off-list ref] wrote:
quoted
Hi all.  I'm trying to create a relocatable installation of Git 2.9.2,
so I can copy it anywhere and it continues to run without any problem.
This is on GNU/Linux systems, FWIW.
I had an impression that the setting was only to support MS Windows.
Hm.  You may be right.  If so that's too bad, because a relocatable Git
is very handy even on UNIX systems.
I see no reason why we have to keep the RUNTIME_PREFIX functional for
Windows only. Paul, how about giving it a try to fix things? I can make
sure that your changes do not break anything on Windows.

Ciao,
Johannes
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help