# [PATCH 4/8] Add a function to set a non-default work tree

6 messages from 2008-04-17 to 2008-04-22. Participants: Daniel Barkalow, Johan Herland, Junio C Hamano.
Thread: https://gitlist.dev/t/13164

## Daniel Barkalow, 2008-04-17 23:32

Subject: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <alpine.LNX.1.00.0804171931550.19665@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.1.00.0804171931550.19665%40iabervon.org

```
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
---
 cache.h       |    1 +
 environment.c |    6 ++++++
 2 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/cache.h b/cache.h
index 96dcb49..d88a4e2 100644
--- a/cache.h
+++ b/cache.h
@@ -311,6 +311,7 @@ extern char *get_index_file(void);
 extern char *get_graft_file(void);
 extern int set_git_dir(const char *path);
 extern const char *get_git_work_tree(void);
+extern void set_git_work_tree(const char *tree);
 
 #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
 
diff --git a/environment.c b/environment.c
index 6739a3f..d6c6a6b 100644
--- a/environment.c
+++ b/environment.c
@@ -81,6 +81,12 @@ const char *get_git_dir(void)
 	return git_dir;
 }
 
+void set_git_work_tree(const char *new_work_tree)
+{
+	get_git_work_tree(); /* make sure it's initialized */
+	work_tree = xstrdup(make_absolute_path(new_work_tree));
+}
+
 const char *get_git_work_tree(void)
 {
 	static int initialized = 0;
-- 
1.5.4.3.610.gea6cd

```

## Johan Herland, 2008-04-19 17:33

Subject: Re: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <200804191933.51303.johan@herland.net>
URL: https://gitlist.dev/e/200804191933.51303.johan%40herland.net
In-Reply-To: <alpine.LNX.1.00.0804171931550.19665@iabervon.org>

```
On Friday 18 April 2008, Daniel Barkalow wrote:
> Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
> ---
>  cache.h       |    1 +
>  environment.c |    6 ++++++
>  2 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/cache.h b/cache.h
> index 96dcb49..d88a4e2 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -311,6 +311,7 @@ extern char *get_index_file(void);
>  extern char *get_graft_file(void);
>  extern int set_git_dir(const char *path);
>  extern const char *get_git_work_tree(void);
> +extern void set_git_work_tree(const char *tree);
>  
>  #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
>  
> diff --git a/environment.c b/environment.c
> index 6739a3f..d6c6a6b 100644
> --- a/environment.c
> +++ b/environment.c
> @@ -81,6 +81,12 @@ const char *get_git_dir(void)
>  	return git_dir;
>  }
>  
> +void set_git_work_tree(const char *new_work_tree)
> +{
> +	get_git_work_tree(); /* make sure it's initialized */
> +	work_tree = xstrdup(make_absolute_path(new_work_tree));

Shouldn't we free(work_tree) before resetting it?

> +}
> +
>  const char *get_git_work_tree(void)
>  {
>  	static int initialized = 0;


...Johan

-- 
Johan Herland, <johan@herland.net>
www.herland.net

```

## Junio C Hamano, 2008-04-20 05:07

Subject: Re: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <7vprslcdxf.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vprslcdxf.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <alpine.LNX.1.00.0804171931550.19665@iabervon.org>

```
Daniel Barkalow <barkalow@iabervon.org> writes:

> Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
> ---
>  cache.h       |    1 +
>  environment.c |    6 ++++++
>  2 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/cache.h b/cache.h
> index 96dcb49..d88a4e2 100644
> --- a/cache.h
> +++ b/cache.h
> @@ -311,6 +311,7 @@ extern char *get_index_file(void);
>  extern char *get_graft_file(void);
>  extern int set_git_dir(const char *path);
>  extern const char *get_git_work_tree(void);
> +extern void set_git_work_tree(const char *tree);
>  
>  #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
>  
> diff --git a/environment.c b/environment.c
> index 6739a3f..d6c6a6b 100644
> --- a/environment.c
> +++ b/environment.c
> @@ -81,6 +81,12 @@ const char *get_git_dir(void)
>  	return git_dir;
>  }
>  
> +void set_git_work_tree(const char *new_work_tree)
> +{
> +	get_git_work_tree(); /* make sure it's initialized */
> +	work_tree = xstrdup(make_absolute_path(new_work_tree));
> +}
> +

Somehow this feels wrong.  Maybe you would need to move that "static int"
variable inside get_git_work_tree() outside so that you can reset from
this new function at will?

How should the setting of new work tree from sideways using this interface
interact with bareness of the repository?

Should it reset is_bare_repository_cfg to zero?  Should it refuse to set a
work tree if is_bare_repository_cfg is true already?

```

## Daniel Barkalow, 2008-04-20 19:52

Subject: Re: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <alpine.LNX.1.00.0804201546340.19665@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.1.00.0804201546340.19665%40iabervon.org
In-Reply-To: <7vprslcdxf.fsf@gitster.siamese.dyndns.org>

```
On Sat, 19 Apr 2008, Junio C Hamano wrote:

> Daniel Barkalow <barkalow@iabervon.org> writes:
> 
> > Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
> > ---
> >  cache.h       |    1 +
> >  environment.c |    6 ++++++
> >  2 files changed, 7 insertions(+), 0 deletions(-)
> >
> > diff --git a/cache.h b/cache.h
> > index 96dcb49..d88a4e2 100644
> > --- a/cache.h
> > +++ b/cache.h
> > @@ -311,6 +311,7 @@ extern char *get_index_file(void);
> >  extern char *get_graft_file(void);
> >  extern int set_git_dir(const char *path);
> >  extern const char *get_git_work_tree(void);
> > +extern void set_git_work_tree(const char *tree);
> >  
> >  #define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
> >  
> > diff --git a/environment.c b/environment.c
> > index 6739a3f..d6c6a6b 100644
> > --- a/environment.c
> > +++ b/environment.c
> > @@ -81,6 +81,12 @@ const char *get_git_dir(void)
> >  	return git_dir;
> >  }
> >  
> > +void set_git_work_tree(const char *new_work_tree)
> > +{
> > +	get_git_work_tree(); /* make sure it's initialized */
> > +	work_tree = xstrdup(make_absolute_path(new_work_tree));
> > +}
> > +
> 
> Somehow this feels wrong.  Maybe you would need to move that "static int"
> variable inside get_git_work_tree() outside so that you can reset from
> this new function at will?

Yeah, that's better.

> How should the setting of new work tree from sideways using this interface
> interact with bareness of the repository?

I'm only using it before any initialization and when I'm going to force 
the repository (which doesn't even exist yet; I haven't set git_dir let 
alone created it, let alone looked at its configuration) to be bare, so I 
hadn't considered that.

> Should it reset is_bare_repository_cfg to zero?  Should it refuse to set a
> work tree if is_bare_repository_cfg is true already?

is_bare_repository_cfg starts out -1 (not yet specified); this should 
probably set it to false and require that it not have been specified 
previously.

	-Daniel
*This .sig left intentionally blank*

```

## Junio C Hamano, 2008-04-22 00:09

Subject: Re: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <7v3apeagxj.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7v3apeagxj.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <alpine.LNX.1.00.0804201546340.19665@iabervon.org>

```
Daniel Barkalow <barkalow@iabervon.org> writes:

> On Sat, 19 Apr 2008, Junio C Hamano wrote:
> ...
>> How should the setting of new work tree from sideways using this interface
>> interact with bareness of the repository?
>
> I'm only using it before any initialization and when I'm going to force 
> the repository (which doesn't even exist yet; I haven't set git_dir let 
> alone created it, let alone looked at its configuration) to be bare, so I 
> hadn't considered that.

That is not quite an explanation that builds confidence in a patch that
adds a generic-sounding helper function that could be called by later
callers.  Doesn't it have a very tempting name for people to call?

```

## Daniel Barkalow, 2008-04-22 03:47

Subject: Re: [PATCH 4/8] Add a function to set a non-default work tree
Message-ID: <alpine.LNX.1.00.0804212340590.19665@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.1.00.0804212340590.19665%40iabervon.org
In-Reply-To: <7v3apeagxj.fsf@gitster.siamese.dyndns.org>

```
On Mon, 21 Apr 2008, Junio C Hamano wrote:

> Daniel Barkalow <barkalow@iabervon.org> writes:
> 
> > On Sat, 19 Apr 2008, Junio C Hamano wrote:
> > ...
> >> How should the setting of new work tree from sideways using this interface
> >> interact with bareness of the repository?
> >
> > I'm only using it before any initialization and when I'm going to force 
> > the repository (which doesn't even exist yet; I haven't set git_dir let 
> > alone created it, let alone looked at its configuration) to be bare, so I 
> > hadn't considered that.
> 
> That is not quite an explanation that builds confidence in a patch that
> adds a generic-sounding helper function that could be called by later
> callers.  Doesn't it have a very tempting name for people to call?

My latest version has it die() if you've gotten meaningfully far in 
initializing the repository state. I'm also not sure there's a tempting 
use case for it aside for in setup code where it clearly works, at least 
until we've got support for dealing with multiple working trees in the 
same process or something of that sort. But, in any case, it'll now fail 
fast and obviously outside of what I've planned for.

	-Daniel
*This .sig left intentionally blank*

```
