# [PATCH] git-subtree: compare file names by absolute paths

3 messages from 2016-08-12 to 2016-08-12. Participants: Ivan Oleynikov, Junio C Hamano.
Thread: https://gitlist.dev/t/43797

## Ivan Oleynikov, 2016-08-12 15:49

Subject: [PATCH] git-subtree: compare file names by absolute paths
Message-ID: <20160812154942.GA27294@metrotek.spb.ru>
URL: https://gitlist.dev/e/20160812154942.GA27294%40metrotek.spb.ru

```
This commit removes false positive assertion fails of `git subtree split` when
the --prefix argument is not in a particular form produced by `git ls-tree`.

For example, typical usage of the command could be:

  git subtree split -b split --prefix=some/relative/path

But

  git subtree split -b split --prefix=./some/relative/path

Would fail with multiple assertion errors. This commit makes the latter command
work without errors.

Signed-off-by: Ivan Oleynikov <io@metrotek.spb.ru>
---

Notes:
    The bug fixed by this commit can be reproduced like this:
    
    $ git init
    Initialized empty Git repository in /tmp/test/.git/
    $ mkdir a b
    $ touch a/file b/file
    $ git add a
    $ git commit -m a
    [master (root-commit) b42584a] a
     1 file changed, 0 insertions($), 0 deletions(-)
     create mode 100644 a/file
    $ git add b
    $ git commit -m b
    [master 5114301] b
     1 file changed, 0 insertions($), 0 deletions(-)
     create mode 100644 b/file
    $ git subtree split -b split_a --prefix=a
    Created branch 'split_a'
    e9f5d81efacb33ab6cf67fe9ff376b33a483a92f
    $ git subtree split -b split_b --prefix=./b
    assertion failed:  [ b = ./b ]
    No new revisions were found
    
    When the commit is applied `git subtree split` works as expected:
    
    $ git init
    Initialized empty Git repository in /tmp/test/.git/
    $ mkdir a b
    $ touch a/file b/file
    $ git add a
    $ git commit -m a
    [master (root-commit) bc80f36] a
     1 file changed, 0 insertions($), 0 deletions(-)
     create mode 100644 a/file
    $ git add b
    $ git commit -m b
    [master e59c446] b
     1 file changed, 0 insertions($), 0 deletions(-)
     create mode 100644 b/file
    $ git subtree split -b split_a --prefix=a
    Created branch 'split_a'
    d542e9cd2de5956dd7ca77b169dba1c8418fa03a
    $ git subtree split -b split_b --prefix=./b
    Created branch 'split_b'
    3ae7854c0c395413c807b2bc4e75b651adc63f8c

 contrib/subtree/git-subtree.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index b567eae..d9351b9 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -411,7 +411,7 @@ subtree_for_commit()
 	dir="$2"
 	git ls-tree "$commit" -- "$dir" |
 	while read mode type tree name; do
-		assert [ "$name" = "$dir" ]
+		assert [ "$(readlink -f $name)" = "$(readlink -f $dir)" ]
 		assert [ "$type" = "tree" -o "$type" = "commit" ]
 		[ "$type" = "commit" ] && continue  # ignore submodules
 		echo $tree
-- 
2.1.4


-- 
Ivan Oleynikov
STC Metrotek
St.Petersburg

```

## Ivan Oleynikov, 2016-08-12 17:47

Subject: Re: [PATCH] git-subtree: compare file names by absolute paths
Message-ID: <20160812174730.GA28761@metrotek.spb.ru>
URL: https://gitlist.dev/e/20160812174730.GA28761%40metrotek.spb.ru
In-Reply-To: <20160812154942.GA27294@metrotek.spb.ru>

```
quote on Fri, Aug 12, 2016 at 06:49:42PM +0300 (Ivan Oleynikov):

BTW, this patch should be applied to `maint` branch. The similar change also
works if applied to master (patch for master must be a bit different).

-- 
Ivan Oleynikov
STC Metrotek
St.Petersburg

```

## Junio C Hamano, 2016-08-12 18:30

Subject: Re: [PATCH] git-subtree: compare file names by absolute paths
Message-ID: <xmqqwpjlx2ks.fsf@gitster.mtv.corp.google.com>
URL: https://gitlist.dev/e/xmqqwpjlx2ks.fsf%40gitster.mtv.corp.google.com
In-Reply-To: <20160812154942.GA27294@metrotek.spb.ru>

```
Ivan Oleynikov <io@metrotek.spb.ru> writes:

> Cc: git@vger.kernel.org,  dvh@metrotek.spb.ru,  apenwarr@gmail.com

I think Avery no longer actively works on this script; Dave Greene
has been helping it move forward by reviewing, so let's ask him to
lend his eyes.

> This commit removes false positive assertion fails of `git subtree split` when
> the --prefix argument is not in a particular form produced by `git ls-tree`.
>
> For example, typical usage of the command could be:
>
>   git subtree split -b split --prefix=some/relative/path
>
> But
>
>   git subtree split -b split --prefix=./some/relative/path
>
> Would fail with multiple assertion errors. This commit makes the latter command
> work without errors.
>
> Signed-off-by: Ivan Oleynikov <io@metrotek.spb.ru>
> ---
>
> Notes:
>     The bug fixed by this commit can be reproduced like this:
>     
>     $ git init
>     Initialized empty Git repository in /tmp/test/.git/
>     $ mkdir a b
>     $ touch a/file b/file
>     $ git add a
>     $ git commit -m a
>     [master (root-commit) b42584a] a
>      1 file changed, 0 insertions($), 0 deletions(-)
>      create mode 100644 a/file
>     $ git add b
>     $ git commit -m b
>     [master 5114301] b
>      1 file changed, 0 insertions($), 0 deletions(-)
>      create mode 100644 b/file
>     $ git subtree split -b split_a --prefix=a
>     Created branch 'split_a'
>     e9f5d81efacb33ab6cf67fe9ff376b33a483a92f
>     $ git subtree split -b split_b --prefix=./b
>     assertion failed:  [ b = ./b ]
>     No new revisions were found
>     
>     When the commit is applied `git subtree split` works as expected:
>     
>     $ git init
>     Initialized empty Git repository in /tmp/test/.git/
>     $ mkdir a b
>     $ touch a/file b/file
>     $ git add a
>     $ git commit -m a
>     [master (root-commit) bc80f36] a
>      1 file changed, 0 insertions($), 0 deletions(-)
>      create mode 100644 a/file
>     $ git add b
>     $ git commit -m b
>     [master e59c446] b
>      1 file changed, 0 insertions($), 0 deletions(-)
>      create mode 100644 b/file
>     $ git subtree split -b split_a --prefix=a
>     Created branch 'split_a'
>     d542e9cd2de5956dd7ca77b169dba1c8418fa03a
>     $ git subtree split -b split_b --prefix=./b
>     Created branch 'split_b'
>     3ae7854c0c395413c807b2bc4e75b651adc63f8c
>
>  contrib/subtree/git-subtree.sh | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
> index b567eae..d9351b9 100755
> --- a/contrib/subtree/git-subtree.sh
> +++ b/contrib/subtree/git-subtree.sh
> @@ -411,7 +411,7 @@ subtree_for_commit()
>  	dir="$2"
>  	git ls-tree "$commit" -- "$dir" |
>  	while read mode type tree name; do
> -		assert [ "$name" = "$dir" ]
> +		assert [ "$(readlink -f $name)" = "$(readlink -f $dir)" ]
>  		assert [ "$type" = "tree" -o "$type" = "commit" ]
>  		[ "$type" = "commit" ] && continue  # ignore submodules
>  		echo $tree
> -- 
> 2.1.4

```
