* [PATCH] Preserve cwd in setup_git_directory()
@ 2008-07-24 3:14 Nguyễn Thái Ngọc Duy
2008-07-24 6:50 ` Johannes Sixt
2008-07-24 12:26 ` Johannes Schindelin
0 siblings, 2 replies; 9+ messages in thread
From: Nguyễn Thái Ngọc Duy @ 2008-07-24 3:14 UTC (permalink / raw)
To: git, Johannes Schindelin, Geoff Russell
When GIT_DIR is not set, cwd is used to determine where .git is.
If core.worktree is set, setup_git_directory() needs to jump back
to the original cwd in order to calculate worktree, this leads to
incorrect .git location later in setup_work_tree().
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
setup.c | 4 ++++
t/t1501-worktree.sh | 13 ++++++++++++-
2 files changed, 16 insertions(+), 1 deletions(-)
diff --git a/setup.c b/setup.c
index 6cf9094..ef58761 100644
--- a/setup.c
+++ b/setup.c
@@ -577,10 +577,14 @@ const char *setup_git_directory(void)
/* If the work tree is not the default one, recompute prefix */
if (inside_work_tree < 0) {
static char buffer[PATH_MAX + 1];
+ static char cwd[PATH_MAX + 1];
char *rel;
+ getcwd(cwd, PATH_MAX);
if (retval && chdir(retval))
die ("Could not jump back into original cwd");
rel = get_relative_cwd(buffer, PATH_MAX, get_git_work_tree());
+ if (retval && chdir(cwd))
+ die ("Could not jump back into original cwd");
return rel && *rel ? strcat(rel, "/") : NULL;
}
diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
index 2ee88d8..64f8dea 100755
--- a/t/t1501-worktree.sh
+++ b/t/t1501-worktree.sh
@@ -29,7 +29,18 @@ test_rev_parse() {
}
mkdir -p work/sub/dir || exit 1
-mv .git repo.git || exit 1
+
+git config core.worktree "$(pwd)"/work
+mv .git work || exit 1
+test_expect_success '--git-dir with relative .git' '
+ (
+ MYPWD="$(pwd)"
+ cd work/sub/dir &&
+ test "$MYPWD"/work/.git = "$(git rev-parse --git-dir)"
+ )
+'
+
+mv work/.git repo.git || exit 1
say "core.worktree = relative path"
GIT_DIR=repo.git
--
1.5.5.GIT
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 3:14 [PATCH] Preserve cwd in setup_git_directory() Nguyễn Thái Ngọc Duy
@ 2008-07-24 6:50 ` Johannes Sixt
2008-07-24 8:12 ` Nguyen Thai Ngoc Duy
2008-07-24 12:26 ` Johannes Schindelin
1 sibling, 1 reply; 9+ messages in thread
From: Johannes Sixt @ 2008-07-24 6:50 UTC (permalink / raw)
To: Nguyễn Thái Ngọc Duy
Cc: git, Johannes Schindelin, Geoff Russell
Nguyễn Thái Ngọc Duy schrieb:
> --- a/setup.c
> +++ b/setup.c
> @@ -577,10 +577,14 @@ const char *setup_git_directory(void)
> /* If the work tree is not the default one, recompute prefix */
> if (inside_work_tree < 0) {
> static char buffer[PATH_MAX + 1];
> + static char cwd[PATH_MAX + 1];
> char *rel;
> + getcwd(cwd, PATH_MAX);
This needs an error check.
-- Hannes
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 6:50 ` Johannes Sixt
@ 2008-07-24 8:12 ` Nguyen Thai Ngoc Duy
0 siblings, 0 replies; 9+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2008-07-24 8:12 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git, Johannes Schindelin, Geoff Russell
When GIT_DIR is not set, cwd is used to determine where .git is.
If core.worktree is set, setup_git_directory() needs to jump back
to the original cwd in order to setup worktree, this leads to
incorrect .git location later in setup_work_tree().
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
On Thu, Jul 24, 2008 at 08:50:16AM +0200, Johannes Sixt wrote:
> Nguyễn Thái Ngọc Duy schrieb:
> > --- a/setup.c
> > +++ b/setup.c
> > @@ -577,10 +577,14 @@ const char *setup_git_directory(void)
> > /* If the work tree is not the default one, recompute prefix */
> > if (inside_work_tree < 0) {
> > static char buffer[PATH_MAX + 1];
> > + static char cwd[PATH_MAX + 1];
> > char *rel;
> > + getcwd(cwd, PATH_MAX);
>
> This needs an error check.
Check added.
setup.c | 5 +++++
t/t1501-worktree.sh | 13 ++++++++++++-
2 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/setup.c b/setup.c
index 6cf9094..fa1d696 100644
--- a/setup.c
+++ b/setup.c
@@ -577,10 +577,15 @@ const char *setup_git_directory(void)
/* If the work tree is not the default one, recompute prefix */
if (inside_work_tree < 0) {
static char buffer[PATH_MAX + 1];
+ static char cwd[PATH_MAX + 1];
char *rel;
+ if (!getcwd(cwd, PATH_MAX))
+ die ("Could not get the current working directory");
if (retval && chdir(retval))
die ("Could not jump back into original cwd");
rel = get_relative_cwd(buffer, PATH_MAX, get_git_work_tree());
+ if (retval && chdir(cwd))
+ die ("Could not jump back into original cwd");
return rel && *rel ? strcat(rel, "/") : NULL;
}
diff --git a/t/t1501-worktree.sh b/t/t1501-worktree.sh
index 2ee88d8..d53d66a 100755
--- a/t/t1501-worktree.sh
+++ b/t/t1501-worktree.sh
@@ -29,7 +29,18 @@ test_rev_parse() {
}
mkdir -p work/sub/dir || exit 1
-mv .git repo.git || exit 1
+
+git config core.worktree "$(pwd)"/work
+mv .git work || exit 1
+test_expect_success '--git-dir with relative .git' '
+ (
+ MYPWD="$(pwd)"
+ cd work/sub/dir &&
+ test "$MYPWD"/work/.git = "$(git rev-parse --git-dir)"
+ )
+'
+
+mv work/.git repo.git || exit 1
say "core.worktree = relative path"
GIT_DIR=repo.git
--
1.5.5.GIT
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 3:14 [PATCH] Preserve cwd in setup_git_directory() Nguyễn Thái Ngọc Duy
2008-07-24 6:50 ` Johannes Sixt
@ 2008-07-24 12:26 ` Johannes Schindelin
2008-07-24 12:40 ` Nguyen Thai Ngoc Duy
1 sibling, 1 reply; 9+ messages in thread
From: Johannes Schindelin @ 2008-07-24 12:26 UTC (permalink / raw)
To: Nguyễn Thái Ngọc Duy; +Cc: git, Geoff Russell
[-- Attachment #1: Type: TEXT/PLAIN, Size: 888 bytes --]
Hi,
On Thu, 24 Jul 2008, Nguyễn Thái Ngọc Duy wrote:
> When GIT_DIR is not set, cwd is used to determine where .git is. If
> core.worktree is set, setup_git_directory() needs to jump back to the
> original cwd in order to calculate worktree, this leads to incorrect
> .git location later in setup_work_tree().
I do not understand. core.worktree is either absolute, in which case
there is no problem. Or it is relative to where the config lives, no?
Besides, this touches a _very_ delicate part of Git. I'd rather not touch
it during the -rc cycle.
I remember I was opposed to the whole worktree crap, and judging by the
sheer amount of bug reports, next to nobody uses it anyway.
It was implemented in a really ugly manner, too, and my attempt to fix it
was still messy. That is why we have _only_ problems with it.
Just thinking of worktree makes me uneasy,
Dscho
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 12:26 ` Johannes Schindelin
@ 2008-07-24 12:40 ` Nguyen Thai Ngoc Duy
2008-07-24 14:09 ` Johannes Schindelin
0 siblings, 1 reply; 9+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2008-07-24 12:40 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, Geoff Russell
On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> Hi,
>
>
> On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
>
> > When GIT_DIR is not set, cwd is used to determine where .git is. If
> > core.worktree is set, setup_git_directory() needs to jump back to the
> > original cwd in order to calculate worktree, this leads to incorrect
> > .git location later in setup_work_tree().
>
>
> I do not understand. core.worktree is either absolute, in which case
> there is no problem. Or it is relative to where the config lives, no?
The problem is GIT_DIR is not absolute in this case. So cwd must stay
where git dir is until it is absolute-ized by setup_work_tree().
--
Duy
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 12:40 ` Nguyen Thai Ngoc Duy
@ 2008-07-24 14:09 ` Johannes Schindelin
2008-07-24 18:37 ` Nguyen Thai Ngoc Duy
0 siblings, 1 reply; 9+ messages in thread
From: Johannes Schindelin @ 2008-07-24 14:09 UTC (permalink / raw)
To: Nguyen Thai Ngoc Duy; +Cc: git, Geoff Russell
Hi,
On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
> On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>
> > On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
> >
> > > When GIT_DIR is not set, cwd is used to determine where .git is. If
> > > core.worktree is set, setup_git_directory() needs to jump back to
> > > the original cwd in order to calculate worktree, this leads to
> > > incorrect .git location later in setup_work_tree().
> >
> > I do not understand. core.worktree is either absolute, in which case
> > there is no problem. Or it is relative to where the config lives, no?
>
> The problem is GIT_DIR is not absolute in this case. So cwd must stay
> where git dir is until it is absolute-ized by setup_work_tree().
I do not see GIT_DIR being set in your test case at all.
I do not see how get_git_work_tree() ro get_relative_cwd() should ever be
allowed to chdir().
_If_ they were (which I strongly doubt), they should chdir() back
themselves.
I now wasted easily 30 minutes just trying to make sense of your patch and
your response. And I am still puzzled.
Your commit message was of no help.
This patch is definitely the opposite of "obviously correct".
Ciao,
Dscho
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 14:09 ` Johannes Schindelin
@ 2008-07-24 18:37 ` Nguyen Thai Ngoc Duy
2008-07-25 9:48 ` Geoff Russell
0 siblings, 1 reply; 9+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2008-07-24 18:37 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git, Geoff Russell
On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> Hi,
>
> On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
>
> > On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> >
>
> > > On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
> > >
> > > > When GIT_DIR is not set, cwd is used to determine where .git is. If
> > > > core.worktree is set, setup_git_directory() needs to jump back to
> > > > the original cwd in order to calculate worktree, this leads to
> > > > incorrect .git location later in setup_work_tree().
> > >
> > > I do not understand. core.worktree is either absolute, in which case
> > > there is no problem. Or it is relative to where the config lives, no?
> >
> > The problem is GIT_DIR is not absolute in this case. So cwd must stay
> > where git dir is until it is absolute-ized by setup_work_tree().
>
>
> I do not see GIT_DIR being set in your test case at all.
>
> I do not see how get_git_work_tree() ro get_relative_cwd() should ever be
> allowed to chdir().
>
> _If_ they were (which I strongly doubt), they should chdir() back
> themselves.
>
> I now wasted easily 30 minutes just trying to make sense of your patch and
> your response. And I am still puzzled.
>
> Your commit message was of no help.
Alright, let's look at the code.
1. cwd is moved to toplevel working directory by setup_git_directory_gently()
2. setup_git_env() by default will set git_dir variable as ".git" as
part of check_repository_format_gently()
3. now in setup_git_directory() finds out core.worktree, it chdir()
to get relative prefix
4. setup_work_tree() sees that git_dir is not absolute path, it makes
git_dir absolute
If in step 3, it does not chdir(), step 4 will be right. In this case,
step 3 does chdir() and not going back, access to git repository will
fail as Geoff Russell discovered.
--
Duy
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-24 18:37 ` Nguyen Thai Ngoc Duy
@ 2008-07-25 9:48 ` Geoff Russell
2008-07-25 10:04 ` Johannes Schindelin
0 siblings, 1 reply; 9+ messages in thread
From: Geoff Russell @ 2008-07-25 9:48 UTC (permalink / raw)
To: Nguyen Thai Ngoc Duy; +Cc: Johannes Schindelin, git
Hi,
On 7/25/08, Nguyen Thai Ngoc Duy <pclouds@gmail.com> wrote:
> On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > Hi,
> >
> > On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
> >
> > > On 7/24/08, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > >
> >
> > > > On Thu, 24 Jul 2008, Nguyen Thai Ngoc Duy wrote:
> > > >
> > > > > When GIT_DIR is not set, cwd is used to determine where .git is. If
> > > > > core.worktree is set, setup_git_directory() needs to jump back to
> > > > > the original cwd in order to calculate worktree, this leads to
> > > > > incorrect .git location later in setup_work_tree().
> > > >
> > > > I do not understand. core.worktree is either absolute, in which case
> > > > there is no problem. Or it is relative to where the config lives, no?
> > >
> > > The problem is GIT_DIR is not absolute in this case. So cwd must stay
> > > where git dir is until it is absolute-ized by setup_work_tree().
> >
> >
> > I do not see GIT_DIR being set in your test case at all.
> >
> > I do not see how get_git_work_tree() ro get_relative_cwd() should ever be
> > allowed to chdir().
> >
> > _If_ they were (which I strongly doubt), they should chdir() back
> > themselves.
> >
> > I now wasted easily 30 minutes just trying to make sense of your patch and
> > your response. And I am still puzzled.
> >
> > Your commit message was of no help.
>
>
> Alright, let's look at the code.
>
> 1. cwd is moved to toplevel working directory by setup_git_directory_gently()
> 2. setup_git_env() by default will set git_dir variable as ".git" as
> part of check_repository_format_gently()
> 3. now in setup_git_directory() finds out core.worktree, it chdir()
> to get relative prefix
> 4. setup_work_tree() sees that git_dir is not absolute path, it makes
> git_dir absolute
>
> If in step 3, it does not chdir(), step 4 will be right. In this case,
> step 3 does chdir() and not going back, access to git repository will
> fail as Geoff Russell discovered.
> --
>
> Duy
>
There seem to be plenty of things happening here which I know nothing
about, which
is really why I hit the problem in the first place. I was pretty
surprised to find that
my command line switch (--work-tree) was being stored in the config file, which
ended up causing the problem. Duy thinks he can fix this, which is
fine, but as a matter of principle, I'm not keen on command line switches
being magically saved for me when I didn't ask for this to happen.
The reason for
using a command line switch is because I want to override default
behaviour on this execution, if I wanted to change the default behaviour, then
I'd set values in the config file.
Whatever you decide, I reckon its pretty magical to have a software
problem, send
an email to a list and get the solution in 45 minutes. I've never got that
service from any other piece of software (or hardware)!
Cheers,
Geoff Russell
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Preserve cwd in setup_git_directory()
2008-07-25 9:48 ` Geoff Russell
@ 2008-07-25 10:04 ` Johannes Schindelin
0 siblings, 0 replies; 9+ messages in thread
From: Johannes Schindelin @ 2008-07-25 10:04 UTC (permalink / raw)
To: Geoff Russell; +Cc: Nguyen Thai Ngoc Duy, git
Hi,
On Fri, 25 Jul 2008, Geoff Russell wrote:
> I was pretty surprised to find that my command line switch (--work-tree)
> was being stored in the config file, which ended up causing the problem.
> Duy thinks he can fix this, which is fine, but as a matter of principle,
> I'm not keen on command line switches being magically saved for me when
> I didn't ask for this to happen.
You were initializing a repository. How on earth could you be surprised
when _important_ things like work-tree git-dir or if it is bare are stored
inside the freshly initialized repository?
> The reason for using a command line switch is because I want to override
> default behaviour on this execution, if I wanted to change the default
> behaviour, then I'd set values in the config file.
No, you would not. Because there is no config file yet.
Htrh,
Dscho
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-07-25 10:04 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-24 3:14 [PATCH] Preserve cwd in setup_git_directory() Nguyễn Thái Ngọc Duy
2008-07-24 6:50 ` Johannes Sixt
2008-07-24 8:12 ` Nguyen Thai Ngoc Duy
2008-07-24 12:26 ` Johannes Schindelin
2008-07-24 12:40 ` Nguyen Thai Ngoc Duy
2008-07-24 14:09 ` Johannes Schindelin
2008-07-24 18:37 ` Nguyen Thai Ngoc Duy
2008-07-25 9:48 ` Geoff Russell
2008-07-25 10:04 ` Johannes Schindelin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).