Re: [PATCH v2 3/3] remote-helpers: export GIT_DIR variable to helpers
- From
Dmitry Ivankov <divanorama@gmail.com>
- Date
- Jul 13, 2011, 17:14 UTC
- Message-ID
- <CA+gfSn8=kLvYzFcdB-caNLfK3RQtOP8V=-jdFtDgQ41KG0ngOQ@mail.gmail.com>
- In-Reply-To
- <1310577055-6347-3-git-send-email-divanorama@gmail.com>
+Sverre Sorry for the noise.
On Wed, Jul 13, 2011 at 11:10 PM, Dmitry Ivankov <divanorama@gmail.com> wrote:
Show 147 quoted lines
> The gitdir capability is recognized by git and can be used to tell
> the helper where the .git directory is. But it is not mentioned in
> the documentation and considered worse than if gitdir was passed
> via GIT_DIR environment variable.
>
> Do export GIT_DIR for a remote helper. Switch testgit to use env
> instead of less favoured capability gitdir.
>
> Mention it's possible uses in documentation: data storage, auxiliary
> git commands needed by a helper.
>
> Signed-off-by: Dmitry Ivankov <divanorama@gmail.com>
> ---
> Instead of documenting capability gitdir export GIT_DIR. Turned out
> to be quite straightforward.
>
> Documentation/git-remote-helpers.txt | 18 ++++++++++++++++++
> git-remote-testgit.py | 14 +-------------
> transport-helper.c | 10 ++++++++++
> 3 files changed, 29 insertions(+), 13 deletions(-)
>
> diff --git a/Documentation/git-remote-helpers.txt b/Documentation/git-remote-helpers.txt
> index 58f6ad4..394fc8e 100644
> --- a/Documentation/git-remote-helpers.txt
> +++ b/Documentation/git-remote-helpers.txt
> @@ -47,6 +47,9 @@ arguments. The first argument specifies a remote repository as in git;
> it is either the name of a configured remote or a URL. The second
> argument specifies a URL; it is usually of the form
> '<transport>://<address>', but any arbitrary string is possible.
> +'GIT_DIR' environment variable is set up for the remote helper and
> +can be used to store some additional data or to invoke auxiliary git
> +commands.
>
> When git encounters a URL of the form '<transport>://<address>', where
> '<transport>' is a protocol that it cannot handle natively, it
> @@ -159,6 +162,14 @@ Supported if the helper has the "import" capability.
> +
> Supported if the helper has the "connect" capability.
>
> +'gitdir' <path>::
> + Tells helper the location of current repository .git
> + directory. The path is absolute. The command is issued
> + immediately after "gitdir" capability line is read by
> + the caller.
> ++
> +Supported if the helper has the "gitdir" capability.
> +
> If a fatal error occurs, the program writes the error message to
> stderr and exits. The caller should expect that a suitable error
> message has been printed if the child closes the connection without
> @@ -175,6 +186,7 @@ CAPABILITIES
> 'push'::
> 'import'::
> 'connect'::
> +'gitdir'::
> This helper supports the corresponding command with the same name.
>
> 'refspec' 'spec'::
> @@ -187,6 +199,12 @@ CAPABILITIES
> all, it must cover all refs reported by the list command; if
> it is not used, it is effectively "{asterisk}:{asterisk}"
>
> +'gitdir'::
> + The helper wants to know .git directory location. The gitdir
> + command is sent immediately after reading this capability.
> + The helper can read it immediately too or it can proceed with
> + reporting other capabilities and read it as a next command.
> +
> REF LIST ATTRIBUTES
> -------------------
>
> diff --git a/git-remote-testgit.py b/git-remote-testgit.py
> index df9d512..df3e37f 100644
> --- a/git-remote-testgit.py
> +++ b/git-remote-testgit.py
> @@ -35,7 +35,7 @@ def get_repo(alias, url):
> prefix = 'refs/testgit/%s/' % alias
> debug("prefix: '%s'", prefix)
>
> - repo.gitdir = ""
> + repo.gitdir = os.environ["GIT_DIR"]
> repo.alias = alias
> repo.prefix = prefix
>
> @@ -70,7 +70,6 @@ def do_capabilities(repo, args):
>
> print "import"
> print "export"
> - print "gitdir"
> print "refspec refs/heads/*:%s*" % repo.prefix
>
> print # end capabilities
> @@ -150,22 +149,11 @@ def do_export(repo, args):
> repo.non_local.push(repo.gitdir)
>
>
> -def do_gitdir(repo, args):
> - """Stores the location of the gitdir.
> - """
> -
> - if not args:
> - die("gitdir needs an argument")
> -
> - repo.gitdir = ' '.join(args)
> -
> -
> COMMANDS = {
> 'capabilities': do_capabilities,
> 'list': do_list,
> 'import': do_import,
> 'export': do_export,
> - 'gitdir': do_gitdir,
> }
>
>
> diff --git a/transport-helper.c b/transport-helper.c
> index 660147f..3282693 100644
> --- a/transport-helper.c
> +++ b/transport-helper.c
> @@ -105,6 +105,12 @@ static struct child_process *get_helper(struct transport *transport)
> int refspec_alloc = 0;
> int duped;
> int code;
> + char git_dir_buf[sizeof(GIT_DIR_ENVIRONMENT) + PATH_MAX + 1];
> + const char *helper_env[] = {
> + git_dir_buf,
> + NULL
> + };
> +
>
> if (data->helper)
> return data->helper;
> @@ -120,6 +126,10 @@ static struct child_process *get_helper(struct transport *transport)
> helper->argv[2] = remove_ext_force(transport->url);
> helper->git_cmd = 0;
> helper->silent_exec_failure = 1;
> +
> + snprintf(git_dir_buf, sizeof(git_dir_buf), "%s=%s", GIT_DIR_ENVIRONMENT, get_git_dir());
> + helper->env = helper_env;
> +
> code = start_command(helper);
> if (code < 0 && errno == ENOENT)
> die("Unable to find remote helper for '%s'", data->name);
> --
> 1.7.3.4
>
>