git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [GITK PATCH 2/3] gitk: support path filters even in subdirectories

From
Pat Thoyts <patthoyts@googlemail.com>
Date
Feb 25, 2010, 01:51 UTC
Message-ID
<a5b261831002241751v5294af48rac8b5f52ba6cb045@mail.gmail.com>
In-Reply-To
<alpine.DEB.1.00.1002232122110.3980@intel-tinevez-2-302>

On 23 February 2010 20:22, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:

Show 11 quoted lines
> Hi,
>
> On Tue, 23 Feb 2010, Kirill wrote:
>
>> I believe the fact that pathprefix is set only under several conditions,
>> the invocation without arguments is broken.
>
> You are absolutely correct!
>
> Will fix and push to work/gitk-dashdash-dot,
> Dscho

This doesn't seem to work for me. We are trying to have the file tree window display filenames when 'gitk -- .' is used and with your patch this isn't happening when I apply this to gitk. I broke out the path_filter function into a separate test to play with it a bit. It seems this function is trying to match a path prefix to the provided file name so here is a test script with three implementations. The original, dscho's new one (git rev-parse --show-prefix returns an empty string when run in the toplevel directory so I force the 'pathprefix' variable for the tests).

With this script I get the following results: C:\src\gitk>tclsh told.tcl original-2 failed . gitk expected 1 got 0 original-3 failed ./ gitk expected 1 got 0 original-5 failed ./po po/de.po expected 1 got 0 dscho-2 failed . gitk expected 1 got 0 dscho-3 failed ./ gitk expected 1 got 0 dscho-5 failed ./po po/de.po expected 1 got 0

So it looks like a simple string match on a normalized path works ok. [file normalize $name] doesn't require the target file to exists btw.

--- test script begins ---
proc path_filter_orig {filter name} {
    foreach p $filter {
        set l [string length $p]
	if {[string index $p end] eq "/"} {
	    if {[string compare -length $l $p $name] == 0} {
		return 1
	    }
	} else {
	    if {[string compare -length $l $p $name] == 0 &&
		([string length $name] == $l ||
		 [string index $name $l] eq "/")} {
		return 1
	    }
	}
    }
    return 0
}
proc path_filter_dscho {filter name} {
    set pathprefix ""
    foreach p $filter {
        if {$p == "."} {
            set p $pathprefix
        } else {
            set p $pathprefix$p
        }
        set l [string length $p]
	if {[string index $p end] eq "/"} {
	    if {[string compare -length $l $p $name] == 0} {
		return 1
	    }
	} else {
	    if {[string compare -length $l $p $name] == 0 &&
		([string length $name] == $l ||
		 [string index $name $l] eq "/")} {
		return 1
	    }
	}
    }
    return 0
}
proc path_filter {filter name} {
    set name [file normalize $name]
    foreach p $filter {
        set p [file normalize $p]
        if {[string equal $p $name] || [string match $p* $name]} {
            return 1
        }
    }
    return 0
}
set tests {
    1  ""   gitk   0
    2  .    gitk   1
    3  ./   gitk   1
    4  po   po/de.po  1
    5  ./po po/de.po 1
    6  po   gitk   0
    7  po   a/b    0
    8  a    a/b/c  1
}
foreach {id filter name result} $tests {
    set testresult [path_filter_orig $filter $name]
    if {$testresult != $result} {
        puts "original-$id failed $filter $name expected $result got
$testresult"
    }
}
foreach {id filter name result} $tests {
    set testresult [path_filter_dscho $filter $name]
    if {$testresult != $result} {
        puts "dscho-$id failed $filter $name expected $result got $testresult"
    }
}
foreach {id filter name result} $tests {
    set testresult [path_filter $filter $name]
    if {$testresult != $result} {
        puts "new-$id failed $filter $name expected $result got $testresult"
    }
}
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 9 of 10 in “gitk: support "gitk <tracheophyte> -- ."”
  1. gitk: support "gitk <tracheophyte> -- ."Johannes Schindelin, Feb 23, 2010
  2. 2/3 gitk: support path filters even in subdirectoriesJohannes Schindelin, Feb 23, 2010
  3. 3/3 gitk: strip prefix from filenames in subdirectoriesJohannes Schindelin, Feb 23, 2010
  4. KirillFeb 23, 2010
  5. Johannes SchindelinFeb 23, 2010
  6. KirillFeb 23, 2010
  7. KirillFeb 23, 2010
  8. Johannes SchindelinFeb 23, 2010
  9. Pat ThoytsFeb 25, 2010
  10. Johannes SchindelinFeb 25, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.