git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* git-new-workdir should not share .git/rr-cache/MERGE_RR
@ 2008-07-12 11:27 Kalle Olavi Niemitalo
  2008-07-12 14:56 ` [PATCH 1/2] Move MERGE_RR from .git/rr-cache/ into .git/ Johannes Schindelin
  0 siblings, 1 reply; 5+ messages in thread
From: Kalle Olavi Niemitalo @ 2008-07-12 11:27 UTC (permalink / raw)
  To: git

The contrib/workdir/git-new-workdir script makes .git/rr-cache in
each workdir a symlink to the shared .git/rr-cache directory.
This lets git-rerere share conflict resolutions between workdirs.
However, that directory also contains .git/rr-cache/MERGE_RR,
which lists the files for which conflict resolutions should be
saved in the next commit.  It is thus possible that git-merge in
one workdir records conflicts to the shared MERGE_RR file, and
git-commit in another workdir saves the staged files to rr-cache
as conflict resolutions, even though those files are from a
different branch and never saw the merge.  Such invalid conflict
resolutions need then be separately deleted.  This happened to
me, with git version 1.5.6.

I don't see any way to modify the symlinks made by
git-new-workdir so that new SHA-1 directories in .git/rr-cache
would be shared but .git/rr-cache/MERGE_RR would not.  On IRC,
"gitte" suggested changing Git to use $GIT_DIR/MERGE_RR instead
of $GIT_DIR/rr-cache/MERGE_RR.  I suppose compatibility with
people's existing repositories would require the modified Git to
keep reading $GIT_DIR/rr-cache/MERGE_RR too, so that Git could be
painlessly upgraded during a merge, but it is not obvious to me
how lock files should then work.

Alternatively, the SHA-1 directories in .git/rr-cache could be
moved to a subdirectory; then git-new-workdir could be changed to
symlink only that subdirectory.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] Move MERGE_RR from .git/rr-cache/ into .git/
  2008-07-12 11:27 git-new-workdir should not share .git/rr-cache/MERGE_RR Kalle Olavi Niemitalo
@ 2008-07-12 14:56 ` Johannes Schindelin
  2008-07-12 14:56   ` [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions Johannes Schindelin
  0 siblings, 1 reply; 5+ messages in thread
From: Johannes Schindelin @ 2008-07-12 14:56 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo; +Cc: git, gitster, spearce


If you want to reuse the rerere cache in another repository, and set
a symbolic link to it, you do not want to have the two repositories
interfer with each other by accessing the _same_ MERGE_RR.

For example, if you use contrib/git-new-workdir to set up a second
working directory, and you have a conflict in one working directory,
but commit in the other working directory first, the wrong "resolution"
will be recorded.

The easy solution is to move MERGE_RR out of the rr-cache/ directory,
which also corresponds with the notion that rr-cache/ contains cached
resolutions, not some intermediate temporary states.

Noticed by Kalle Olavi Niemitalo.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---

	Shawn, I Cc:ed you because of 2/2.

	On Sat, 12 Jul 2008, Kalle Olavi Niemitalo wrote:

	> I don't see any way to modify the symlinks made by 
	> git-new-workdir so that new SHA-1 directories in .git/rr-cache
	> would be shared but .git/rr-cache/MERGE_RR would not.  On IRC, 
	> "gitte" suggested changing Git to use $GIT_DIR/MERGE_RR instead of 
	> $GIT_DIR/rr-cache/MERGE_RR.

	"gitte" actually expected that a patch would not be that hard.

	> I suppose compatibility with people's existing repositories 
	> would require the modified Git to keep reading 
	> $GIT_DIR/rr-cache/MERGE_RR too, so that Git could be painlessly 
	> upgraded during a merge, but it is not obvious to me how lock files 
	> should then work.

	"rerere" is not perfect.  Thus, I suspect that we can just leave 
	an existing MERGE_RR alone, and the user just has to record the 
	resolution another time.  Too bad.

 branch.c          |    2 +-
 builtin-rerere.c  |    2 +-
 t/t4200-rerere.sh |    6 +++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/branch.c b/branch.c
index 56e9492..b1e59f2 100644
--- a/branch.c
+++ b/branch.c
@@ -166,7 +166,7 @@ void create_branch(const char *head,
 void remove_branch_state(void)
 {
 	unlink(git_path("MERGE_HEAD"));
-	unlink(git_path("rr-cache/MERGE_RR"));
+	unlink(git_path("MERGE_RR"));
 	unlink(git_path("MERGE_MSG"));
 	unlink(git_path("SQUASH_MSG"));
 }
diff --git a/builtin-rerere.c b/builtin-rerere.c
index 69c3a52..1db2e0c 100644
--- a/builtin-rerere.c
+++ b/builtin-rerere.c
@@ -429,7 +429,7 @@ static int setup_rerere(struct path_list *merge_rr)
 	if (!is_rerere_enabled())
 		return -1;
 
-	merge_rr_path = xstrdup(git_path("rr-cache/MERGE_RR"));
+	merge_rr_path = xstrdup(git_path("MERGE_RR"));
 	fd = hold_lock_file_for_update(&write_lock, merge_rr_path, 1);
 	read_rr(merge_rr);
 	return fd;
diff --git a/t/t4200-rerere.sh b/t/t4200-rerere.sh
index cf10557..b5a4202 100755
--- a/t/t4200-rerere.sh
+++ b/t/t4200-rerere.sh
@@ -57,7 +57,7 @@ test_expect_success 'conflicting merge' '
 	! git merge first
 '
 
-sha1=$(sed -e 's/	.*//' .git/rr-cache/MERGE_RR)
+sha1=$(sed -e 's/	.*//' .git/MERGE_RR)
 rr=.git/rr-cache/$sha1
 test_expect_success 'recorded preimage' "grep ^=======$ $rr/preimage"
 
@@ -143,7 +143,7 @@ test_expect_success 'rerere kicked in' "! grep ^=======$ a1"
 test_expect_success 'rerere prefers first change' 'test_cmp a1 expect'
 
 rm $rr/postimage
-echo "$sha1	a1" | perl -pe 'y/\012/\000/' > .git/rr-cache/MERGE_RR
+echo "$sha1	a1" | perl -pe 'y/\012/\000/' > .git/MERGE_RR
 
 test_expect_success 'rerere clear' 'git rerere clear'
 
@@ -190,7 +190,7 @@ test_expect_success 'file2 added differently in two branches' '
 	git add file2 &&
 	git commit -m version2 &&
 	! git merge fourth &&
-	sha1=$(sed -e "s/	.*//" .git/rr-cache/MERGE_RR) &&
+	sha1=$(sed -e "s/	.*//" .git/MERGE_RR) &&
 	rr=.git/rr-cache/$sha1 &&
 	echo Cello > file2 &&
 	git add file2 &&
-- 
1.5.6.2.511.ge432a

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions
  2008-07-12 14:56 ` [PATCH 1/2] Move MERGE_RR from .git/rr-cache/ into .git/ Johannes Schindelin
@ 2008-07-12 14:56   ` Johannes Schindelin
  2008-07-13  1:16     ` Shawn O. Pearce
  0 siblings, 1 reply; 5+ messages in thread
From: Johannes Schindelin @ 2008-07-12 14:56 UTC (permalink / raw)
  To: Kalle Olavi Niemitalo; +Cc: git, gitster, spearce


Now that MERGE_RR was moved out of .git/rr-cache/, we have to delete
it somewhere else.  Just in case somebody wants to use a newer git-gui
with an older Git, the file .git/rr-cache/MERGE_RR is removed, too (if
it exists).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 git-gui/lib/merge.tcl |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/lib/merge.tcl b/lib/merge.tcl
index cc26b07..5c01875 100644
--- a/lib/merge.tcl
+++ b/lib/merge.tcl
@@ -257,6 +257,7 @@ proc _reset_wait {fd} {
 
 		catch {file delete [gitdir MERGE_HEAD]}
 		catch {file delete [gitdir rr-cache MERGE_RR]}
+		catch {file delete [gitdir MERGE_RR]}
 		catch {file delete [gitdir SQUASH_MSG]}
 		catch {file delete [gitdir MERGE_MSG]}
 		catch {file delete [gitdir GITGUI_MSG]}
-- 
1.5.6.2.511.ge432a

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions
  2008-07-12 14:56   ` [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions Johannes Schindelin
@ 2008-07-13  1:16     ` Shawn O. Pearce
  2008-07-13  8:58       ` Junio C Hamano
  0 siblings, 1 reply; 5+ messages in thread
From: Shawn O. Pearce @ 2008-07-13  1:16 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: Kalle Olavi Niemitalo, git, gitster

Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> 
> Now that MERGE_RR was moved out of .git/rr-cache/, we have to delete
> it somewhere else.  Just in case somebody wants to use a newer git-gui
> with an older Git, the file .git/rr-cache/MERGE_RR is removed, too (if
> it exists).
> 
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>

Ack, I can pull this into git-gui.git.  But I want to make sure
Junio is going to take 1/2 into git.git.


>  git-gui/lib/merge.tcl |    1 +
>  1 files changed, 1 insertions(+), 0 deletions(-)
> 
> diff --git a/lib/merge.tcl b/lib/merge.tcl
> index cc26b07..5c01875 100644
> --- a/lib/merge.tcl
> +++ b/lib/merge.tcl
> @@ -257,6 +257,7 @@ proc _reset_wait {fd} {
>  
>  		catch {file delete [gitdir MERGE_HEAD]}
>  		catch {file delete [gitdir rr-cache MERGE_RR]}
> +		catch {file delete [gitdir MERGE_RR]}
>  		catch {file delete [gitdir SQUASH_MSG]}
>  		catch {file delete [gitdir MERGE_MSG]}
>  		catch {file delete [gitdir GITGUI_MSG]}
> -- 

-- 
Shawn.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions
  2008-07-13  1:16     ` Shawn O. Pearce
@ 2008-07-13  8:58       ` Junio C Hamano
  0 siblings, 0 replies; 5+ messages in thread
From: Junio C Hamano @ 2008-07-13  8:58 UTC (permalink / raw)
  To: Shawn O. Pearce; +Cc: Johannes Schindelin, Kalle Olavi Niemitalo, git, gitster

"Shawn O. Pearce" <spearce@spearce.org> writes:

> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>> 
>> Now that MERGE_RR was moved out of .git/rr-cache/, we have to delete
>> it somewhere else.  Just in case somebody wants to use a newer git-gui
>> with an older Git, the file .git/rr-cache/MERGE_RR is removed, too (if
>> it exists).
>> 
>> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> Ack, I can pull this into git-gui.git.  But I want to make sure
> Junio is going to take 1/2 into git.git.

Will do.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2008-07-13  8:59 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-12 11:27 git-new-workdir should not share .git/rr-cache/MERGE_RR Kalle Olavi Niemitalo
2008-07-12 14:56 ` [PATCH 1/2] Move MERGE_RR from .git/rr-cache/ into .git/ Johannes Schindelin
2008-07-12 14:56   ` [PATCH 2/2 (for GIT-GUI)] git-gui: MERGE_RR lives in .git/ directly with newer Git versions Johannes Schindelin
2008-07-13  1:16     ` Shawn O. Pearce
2008-07-13  8:58       ` Junio C Hamano

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).