[PATCH] Do not load user or system gitconfig and gitattributes

John Keeping john at keeping.me.uk
Mon Apr 8 21:44:37 CEST 2013


On Mon, Apr 08, 2013 at 09:33:31PM +0200, Jason A. Donenfeld wrote:
> From: "Jason A. Donenfeld" <Jason at zx2c4.com>
> 
> While doing any kind of git loading, unset HOME variables and set
> NOSYSTEM variables so that cgit does not load any settings that a user
> may have set for his own /usr/bin/git usage.
> 
> This fixes a fatal error introduced with git 1.8, whereupon git would
> fatally exit when failing to access particular files.
> 
> Reported-by: Ferry Huberts <ferry.huberts at pelagic.nl>
> Tested-by: Jason A. Donenfeld <Jason at zx2c4.com>
> Tested-by: Ferry Huberts <ferry.huberts at pelagic.nl>
> Signed-off-by: Jason A. Donenfeld <Jason at zx2c4.com>
> ---

Looks sensible, but I don't think it's quite guaranteed to do what you
want, since Git can call git_config at any time and it re-reads the
files whenever it does.  We may not be doing anything that causes it to
be reparsed now, but will we notice if that changes?

Is there any reason not to leave $HOME and $XDG_CONFIG_HOME unset?

Another (very) minor point:

    /*
     * Git prefers to format multi-line comments
     * like this.
     */

I don't know how closely you think CGit should stick to that style
though.

[patch left unsnipped for reference]

> diff --git a/cgit.c b/cgit.c
> index f73c7b0..0bf8972 100644
> --- a/cgit.c
> +++ b/cgit.c
> @@ -459,12 +459,36 @@ static char *guess_defbranch(void)
>  
>  static int prepare_repo_cmd(struct cgit_context *ctx)
>  {
> +	char *user_home;
> +	char *xdg_home;
>  	unsigned char sha1[20];
>  	int nongit = 0;
>  	int rc;
>  
> +	/* The path to the git repository. */
>  	setenv("GIT_DIR", ctx->repo->path, 1);
> +
> +	/* Do not look in /etc/ for gitconfig and gitattributes. */
> +	setenv("GIT_CONFIG_NOSYSTEM", "1", 1);
> +	setenv("GIT_ATTR_NOSYSTEM", "1", 1);
> +
> +	/* We unset HOME and XDG_CONFIG_HOME before calling the git setup function
> +	 * so that we don't make unneccessary filesystem accesses. */
> +	user_home = getenv("HOME");
> +	xdg_home = getenv("XDG_CONFIG_HOME");
> +	unsetenv("HOME");
> +	unsetenv("XDG_CONFIG_HOME");
> +
> +	/* Setup the git directory and initialize the notes system. Both of these
> +	 * load local configuration from the git repository, so we do them both while
> +	 * the HOME variables are unset. */
>  	setup_git_directory_gently(&nongit);
> +	init_display_notes(NULL);
> +
> +	/* We restore the unset variables afterward. */
> +	setenv("HOME", user_home, 1);
> +	setenv("XDG_CONFIG_HOME", xdg_home, 1);
> +
>  	if (nongit) {
>  		const char *name = ctx->repo->name;
>  		rc = errno;
> diff --git a/ui-commit.c b/ui-commit.c
> index 6b41017..a5a6ea8 100644
> --- a/ui-commit.c
> +++ b/ui-commit.c
> @@ -37,7 +37,6 @@ void cgit_print_commit(char *hex, const char *prefix)
>  	}
>  	info = cgit_parse_commit(commit);
>  
> -	init_display_notes(NULL);
>  	format_display_notes(sha1, &notes, PAGE_ENCODING, 0);
>  
>  	load_ref_decorations(DECORATE_FULL_REFS);
> diff --git a/ui-log.c b/ui-log.c
> index 93af0ce..2aa12c3 100644
> --- a/ui-log.c
> +++ b/ui-log.c
> @@ -403,7 +403,6 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
>  		commit->parents = NULL;
>  	}
>  
> -	init_display_notes(NULL);
>  	for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
>  		print_commit(commit, &rev);
>  		free(commit->buffer);
> -- 
> 1.8.1.5
> 
> 
> _______________________________________________
> cgit mailing list
> cgit at hjemli.net
> http://hjemli.net/mailman/listinfo/cgit




More information about the CGit mailing list