# [PATCH] Add merge-subtree back

6 messages from 2008-02-23 to 2008-02-28. Participants: Junio C Hamano, Daniel Barkalow, Miklos Vajna, Johannes Schindelin.
Thread: https://gitlist.dev/t/12272

## Junio C Hamano, 2008-02-23 19:16

Subject: [PATCH] Add merge-subtree back
Message-ID: <7vprun32m2.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vprun32m2.fsf%40gitster.siamese.dyndns.org

```
An earlier commit e1b3a2c (Build-in merge-recursive) made the
subtree merge strategy backend unavailable.  This resurrects
it.

A new test t6029 currently only tests the strategy is available,
but it should be enhanced to check the real "subtree" case.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Makefile                 |    8 +++-----
 git.c                    |    1 +
 t/t6029-merge-subtree.sh |   32 ++++++++++++++++++++++++++++++++
 3 files changed, 36 insertions(+), 5 deletions(-)
 create mode 100755 t/t6029-merge-subtree.sh

diff --git a/Makefile b/Makefile
index 90c0dd8..40fa41b 100644
--- a/Makefile
+++ b/Makefile
@@ -261,17 +261,18 @@ PROGRAMS = \
 # Empty...
 EXTRA_PROGRAMS =
 
+# List built-in command $C whose implementation cmd_$C() is not in
+# builtin-$C.o but is linked in as part of some other command.
 BUILT_INS = \
 	git-format-patch$X git-show$X git-whatchanged$X git-cherry$X \
 	git-get-tar-commit-id$X git-init$X git-repo-config$X \
 	git-fsck-objects$X git-cherry-pick$X git-peek-remote$X git-status$X \
+	git-merge-subtree$X \
 	$(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS))
 
 # what 'all' will build and 'install' will install, in gitexecdir
 ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
 
-ALL_PROGRAMS += git-merge-subtree$X
-
 # what 'all' will build but not install in gitexecdir
 OTHER_PROGRAMS = git$X gitweb/gitweb.cgi
 
@@ -807,9 +808,6 @@ help.o: help.c common-cmds.h GIT-CFLAGS
 		'-DGIT_MAN_PATH="$(mandir_SQ)"' \
 		'-DGIT_INFO_PATH="$(infodir_SQ)"' $<
 
-git-merge-subtree$X: git-merge-recursive$X
-	$(QUIET_BUILT_IN)$(RM) $@ && ln git-merge-recursive$X $@
-
 $(BUILT_INS): git$X
 	$(QUIET_BUILT_IN)$(RM) $@ && ln git$X $@
 
diff --git a/git.c b/git.c
index fc15686..bd424ea 100644
--- a/git.c
+++ b/git.c
@@ -332,6 +332,7 @@ static void handle_internal_command(int argc, const char **argv)
 		{ "merge-file", cmd_merge_file },
 		{ "merge-ours", cmd_merge_ours, RUN_SETUP },
 		{ "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
+		{ "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },
 		{ "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE },
 		{ "name-rev", cmd_name_rev, RUN_SETUP },
 		{ "pack-objects", cmd_pack_objects, RUN_SETUP },
diff --git a/t/t6029-merge-subtree.sh b/t/t6029-merge-subtree.sh
new file mode 100755
index 0000000..3900a05
--- /dev/null
+++ b/t/t6029-merge-subtree.sh
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+test_description='subtree merge strategy'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+	s="1 2 3 4 5 6 7 8"
+	for i in $s; do echo $i; done >hello &&
+	git add hello &&
+	git commit -m initial &&
+	git checkout -b side &&
+	echo >>hello world &&
+	git add hello &&
+	git commit -m second &&
+	git checkout master &&
+	for i in mundo $s; do echo $i; done >hello &&
+	git add hello &&
+	git commit -m master
+
+'
+
+test_expect_success 'subtree available and works like recursive' '
+
+	git merge -s subtree side &&
+	for i in mundo $s world; do echo $i; done >expect &&
+	diff -u expect hello
+
+'
+
+test_done
-- 
1.5.4.2.300.g8d945

```

## Daniel Barkalow, 2008-02-24 06:19

Subject: Re: [PATCH] Add merge-subtree back
Message-ID: <alpine.LNX.1.00.0802240040010.19024@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.1.00.0802240040010.19024%40iabervon.org
In-Reply-To: <7vprun32m2.fsf@gitster.siamese.dyndns.org>

```
On Sat, 23 Feb 2008, Junio C Hamano wrote:

> An earlier commit e1b3a2c (Build-in merge-recursive) made the
> subtree merge strategy backend unavailable.  This resurrects
> it.

That's really quite subtle. I think there should probably be a 
cmd_merge_subtree that shares almost everything with cmd_merge_recursive, 
but is a different function.

Or maybe there should be a "--subtree" option to merge that has that 
effect with arbitrary stratgeies by changing what gets sent to the 
strategy.

But restoring access to the strategy for now is obviously fine.

	-Daniel
*This .sig left intentionally blank*

```

## Miklos Vajna, 2008-02-28 01:51

Subject: [PATCH] New test to check the real "subtree" case
Message-ID: <20080228015122.GB31441@genesis.frugalware.org>
URL: https://gitlist.dev/e/20080228015122.GB31441%40genesis.frugalware.org
In-Reply-To: <7vprun32m2.fsf@gitster.siamese.dyndns.org>

```
t6029 already checks if subtree available and works like recursive, but
this new one actually tests the extra functionality the subtree merge
strategy provides.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
---

On Sat, Feb 23, 2008 at 11:16:21AM -0800, Junio C Hamano <gitster@pobox.com> wrote:
> A new test t6029 currently only tests the strategy is available,
> but it should be enhanced to check the real "subtree" case.

i think something like this should do it.

 t/t3035-merge-subtree.sh |   54 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)
 create mode 100755 t/t3035-merge-subtree.sh

diff --git a/t/t3035-merge-subtree.sh b/t/t3035-merge-subtree.sh
new file mode 100755
index 0000000..e400dce
--- /dev/null
+++ b/t/t3035-merge-subtree.sh
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+test_description='merge-subtree backend test'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+	mkdir git-gui &&
+	cd git-gui &&
+	git init &&
+	echo git-gui > git-gui.sh &&
+	o1=$(git hash-object git-gui.sh) &&
+	git add git-gui.sh &&
+	git commit -m "initial git-gui" &&
+	cd .. &&
+	mkdir git &&
+	cd git &&
+	git init &&
+	echo git >git.c &&
+	o2=$(git hash-object git.c) &&
+	git add git.c &&
+	git commit -m "initial git"
+'
+
+test_expect_success 'initial merge' '
+	git remote add -f gui ../git-gui &&
+	git merge -s ours --no-commit gui/master &&
+	git read-tree --prefix=git-gui/ -u gui/master &&
+	git commit -m "Merge git-gui as our subdirectory" &&
+	git ls-files -s >actual &&
+	(
+		echo "100644 $o1 0	git-gui/git-gui.sh"
+		echo "100644 $o2 0	git.c"
+	) >expected &&
+	git diff -u expected actual
+'
+
+test_expect_success 'merge update' '
+	cd ../git-gui &&
+	echo git-gui2 > git-gui.sh &&
+	o3=$(git hash-object git-gui.sh) &&
+	git add git-gui.sh &&
+	git commit -m "update git-gui" &&
+	cd ../git &&
+	git pull -s subtree gui master &&
+	git ls-files -s >actual &&
+	(
+		echo "100644 $o3 0	git-gui/git-gui.sh"
+		echo "100644 $o2 0	git.c"
+	) >expected &&
+	git diff -u expected actual
+'
+
+test_done
-- 
1.5.4.3

```

## Johannes Schindelin, 2008-02-28 09:45

Subject: Re: [PATCH] New test to check the real "subtree" case
Message-ID: <alpine.LSU.1.00.0802280944110.22527@racer.site>
URL: https://gitlist.dev/e/alpine.LSU.1.00.0802280944110.22527%40racer.site
In-Reply-To: <20080228015122.GB31441@genesis.frugalware.org>

```
Hi,

On Thu, 28 Feb 2008, Miklos Vajna wrote:

> On Sat, Feb 23, 2008 at 11:16:21AM -0800, Junio C Hamano <gitster@pobox.com> wrote:
> > A new test t6029 currently only tests the strategy is available,
> > but it should be enhanced to check the real "subtree" case.
> 
> i think something like this should do it.
> 
>  t/t3035-merge-subtree.sh |   54 ++++++++++++++++++++++++++++++++++++++++++++++

Why yet another file?  Why not enhance t6029, as suggested?

Ciao,
Dscho

```

## Miklos Vajna, 2008-02-28 12:36

Subject: [PATCH] Improve t6029 to check the real "subtree" case
Message-ID: <20080228123654.GE31441@genesis.frugalware.org>
URL: https://gitlist.dev/e/20080228123654.GE31441%40genesis.frugalware.org
In-Reply-To: <alpine.LSU.1.00.0802280944110.22527@racer.site>

```
t6029 already checks if subtree available and works like recursive. This
patch adds code to test test the extra functionality the subtree merge
strategy provides.

Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
---

On Thu, Feb 28, 2008 at 09:45:03AM +0000, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> Why yet another file?  Why not enhance t6029, as suggested?

here it is.

 t/t6029-merge-subtree.sh |   47 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 47 insertions(+), 0 deletions(-)

diff --git a/t/t6029-merge-subtree.sh b/t/t6029-merge-subtree.sh
index 3900a05..35d66e8 100755
--- a/t/t6029-merge-subtree.sh
+++ b/t/t6029-merge-subtree.sh
@@ -29,4 +29,51 @@ test_expect_success 'subtree available and works like recursive' '
 
 '
 
+test_expect_success 'setup' '
+	mkdir git-gui &&
+	cd git-gui &&
+	git init &&
+	echo git-gui > git-gui.sh &&
+	o1=$(git hash-object git-gui.sh) &&
+	git add git-gui.sh &&
+	git commit -m "initial git-gui" &&
+	cd .. &&
+	mkdir git &&
+	cd git &&
+	git init &&
+	echo git >git.c &&
+	o2=$(git hash-object git.c) &&
+	git add git.c &&
+	git commit -m "initial git"
+'
+
+test_expect_success 'initial merge' '
+	git remote add -f gui ../git-gui &&
+	git merge -s ours --no-commit gui/master &&
+	git read-tree --prefix=git-gui/ -u gui/master &&
+	git commit -m "Merge git-gui as our subdirectory" &&
+	git ls-files -s >actual &&
+	(
+		echo "100644 $o1 0	git-gui/git-gui.sh"
+		echo "100644 $o2 0	git.c"
+	) >expected &&
+	git diff -u expected actual
+'
+
+test_expect_success 'merge update' '
+	cd ../git-gui &&
+	echo git-gui2 > git-gui.sh &&
+	o3=$(git hash-object git-gui.sh) &&
+	git add git-gui.sh &&
+	git commit -m "update git-gui" &&
+	cd ../git &&
+	git pull -s subtree gui master &&
+	git ls-files -s >actual &&
+	(
+		echo "100644 $o3 0	git-gui/git-gui.sh"
+		echo "100644 $o2 0	git.c"
+	) >expected &&
+	git diff -u expected actual
+'
+
 test_done
-- 
1.5.4

```

## Johannes Schindelin, 2008-02-28 14:57

Subject: Re: [PATCH] Improve t6029 to check the real "subtree" case
Message-ID: <alpine.LSU.1.00.0802281456550.22527@racer.site>
URL: https://gitlist.dev/e/alpine.LSU.1.00.0802281456550.22527%40racer.site
In-Reply-To: <20080228123654.GE31441@genesis.frugalware.org>

```
Hi,

On Thu, 28 Feb 2008, Miklos Vajna wrote:

> On Thu, Feb 28, 2008 at 09:45:03AM +0000, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> > Why yet another file?  Why not enhance t6029, as suggested?
> 
> here it is.

Thanks.

> diff --git a/t/t6029-merge-subtree.sh b/t/t6029-merge-subtree.sh
> index 3900a05..35d66e8 100755
> --- a/t/t6029-merge-subtree.sh
> +++ b/t/t6029-merge-subtree.sh
> @@ -29,4 +29,51 @@ test_expect_success 'subtree available and works like recursive' '
>  
>  '
>  
> +test_expect_success 'setup' '

I'd call this 'setup subproject', but that's just nitpicking.

Ciao,
Dscho

```
