# [PATCH] gitweb: Make search type a popup menu

3 messages from 2006-10-24 to 2006-10-24. Participants: Petr Baudis, Jakub Narebski.
Thread: https://gitlist.dev/t/6027

## Petr Baudis, 2006-10-24 03:15

Subject: [PATCH] gitweb: Make search type a popup menu
Message-ID: <20061024031546.2877.51620.stgit@rover>
URL: https://gitlist.dev/e/20061024031546.2877.51620.stgit%40rover

```
This makes the multiple search types actually usable by the user;
if you don't read the gitweb source, you don't even have an idea
that you can write things like that there.

Signed-off-by: Petr Baudis <pasky@suse.cz>
---

 gitweb/gitweb.css  |    2 ++
 gitweb/gitweb.perl |   61 ++++++++++++++++++++++++++++++++++++++--------------
 2 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/gitweb/gitweb.css b/gitweb/gitweb.css
index 3f62b6d..0eda982 100644
--- a/gitweb/gitweb.css
+++ b/gitweb/gitweb.css
@@ -333,6 +333,8 @@ div.index_include {
 }
 
 div.search {
+	font-size: 12px;
+	font-weight: normal;
 	margin: 4px 8px;
 	position: absolute;
 	top: 56px;
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 695c632..e77fc11 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -342,6 +342,13 @@ if (defined $searchtext) {
 	$searchtext = quotemeta $searchtext;
 }
 
+our $searchtype = $cgi->param('st');
+if (defined $searchtype) {
+	if ($searchtype =~ m/[^a-z]/) {
+		die_error(undef, "Invalid searchtype parameter");
+	}
+}
+
 # now read PATH_INFO and use it as alternative to parameters
 sub evaluate_path_info {
 	return if defined $project;
@@ -406,6 +413,7 @@ my %actions = (
 	"log" => \&git_log,
 	"rss" => \&git_rss,
 	"search" => \&git_search,
+	"search_help" => \&git_search_help,
 	"shortlog" => \&git_shortlog,
 	"summary" => \&git_summary,
 	"tag" => \&git_tag,
@@ -455,6 +463,7 @@ sub href(%) {
 		page => "pg",
 		order => "o",
 		searchtext => "s",
+		searchtype => "st",
 	);
 	my %mapping = @mapping;
 
@@ -1528,6 +1537,10 @@ #provides backwards capability for those
 		      $cgi->hidden(-name => "p") . "\n" .
 		      $cgi->hidden(-name => "a") . "\n" .
 		      $cgi->hidden(-name => "h") . "\n" .
+		      $cgi->popup_menu(-name => 'st', -default => 'commit',
+				       -values => ['commit', 'author', 'committer', 'pickaxe']) .
+		      $cgi->sup($cgi->a({-href => href(action=>"search_help")}, "?")) .
+		      " search:\n",
 		      $cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
 		      "</div>" .
 		      $cgi->end_form() . "\n";
@@ -3573,18 +3586,8 @@ sub git_search {
 		die_error(undef, "Unknown commit object");
 	}
 
-	my $commit_search = 1;
-	my $author_search = 0;
-	my $committer_search = 0;
-	my $pickaxe_search = 0;
-	if ($searchtext =~ s/^author\\://i) {
-		$author_search = 1;
-	} elsif ($searchtext =~ s/^committer\\://i) {
-		$committer_search = 1;
-	} elsif ($searchtext =~ s/^pickaxe\\://i) {
-		$commit_search = 0;
-		$pickaxe_search = 1;
-
+	$searchtype ||= 'commit';
+	if ($searchtype eq 'pickaxe') {
 		# pickaxe may take all resources of your box and run for several minutes
 		# with every query - so decide by yourself how public you make this feature
 		my ($have_pickaxe) = gitweb_check_feature('pickaxe');
@@ -3592,23 +3595,24 @@ sub git_search {
 			die_error('403 Permission denied', "Permission denied");
 		}
 	}
+
 	git_header_html();
 	git_print_page_nav('','', $hash,$co{'tree'},$hash);
 	git_print_header_div('commit', esc_html($co{'title'}), $hash);
 
 	print "<table cellspacing=\"0\">\n";
 	my $alternate = 1;
-	if ($commit_search) {
+	if ($searchtype eq 'commit' or $searchtype eq 'author' or $searchtype eq 'committer') {
 		$/ = "\0";
 		open my $fd, "-|", git_cmd(), "rev-list", "--header", "--parents", $hash or next;
 		while (my $commit_text = <$fd>) {
 			if (!grep m/$searchtext/i, $commit_text) {
 				next;
 			}
-			if ($author_search && !grep m/\nauthor .*$searchtext/i, $commit_text) {
+			if ($searchtype eq 'author' && !grep m/\nauthor .*$searchtext/i, $commit_text) {
 				next;
 			}
-			if ($committer_search && !grep m/\ncommitter .*$searchtext/i, $commit_text) {
+			if ($searchtype eq 'committer' && !grep m/\ncommitter .*$searchtext/i, $commit_text) {
 				next;
 			}
 			my @commit_lines = split "\n", $commit_text;
@@ -3650,7 +3654,7 @@ sub git_search {
 		close $fd;
 	}
 
-	if ($pickaxe_search) {
+	if ($searchtype eq 'pickaxe') {
 		$/ = "\n";
 		my $git_command = git_cmd_str();
 		open my $fd, "-|", "$git_command rev-list $hash | " .
@@ -3710,6 +3714,31 @@ sub git_search {
 	git_footer_html();
 }
 
+sub git_search_help {
+	git_header_html();
+	git_print_page_nav('','', $hash,$hash,$hash);
+	print <<EOT;
+<dl>
+<dt><b>commit</b></dt>
+<dd>The commit messages and authorship information will be scanned for the given string.</dd>
+<dt><b>author</b></dt>
+<dd>Name and e-mail of the change author and date of birth of the patch will be scanned for the given string.</dd>
+<dt><b>committer</b></dt>
+<dd>Name and e-mail of the committer and date of commit will be scanned for the given string.</dd>
+EOT
+	my ($have_pickaxe) = gitweb_check_feature('pickaxe');
+	if ($have_pickaxe) {
+		print <<EOT;
+<dt><b>pickaxe</b></dt>
+<dd>All commits that caused the string to appear or disappear from any file (changes that
+added, removed or "modified" the string) will be listed. This search can take a while and
+takes a lot of strain on the server, so please use it wisely.</dd>
+EOT
+	}
+	print "</dl>\n";
+	git_footer_html();
+}
+
 sub git_shortlog {
 	my $head = git_get_head_hash($project);
 	if (!defined $hash) {

```

## Jakub Narebski, 2006-10-24 07:33

Subject: Re: [PATCH] gitweb: Make search type a popup menu
Message-ID: <ehkfis$6da$1@sea.gmane.org>
URL: https://gitlist.dev/e/ehkfis%246da%241%40sea.gmane.org
In-Reply-To: <20061024031546.2877.51620.stgit@rover>

```
Petr Baudis wrote:

> This makes the multiple search types actually usable by the user;
> if you don't read the gitweb source, you don't even have an idea
> that you can write things like that there.

This is I think good change, although I'm not sure if I like changing
using search operators to using additional CGI parameter.

Having help page for search is _certainly_ very good change. Perhaps
we should put it out-of-line, not embedded? Just a thought...

This patch changes search box into something similar to Google
"Advanced Search". Yet Google "Advanced Search" box generates search
query using search operators. Search operators are just more powerfull.
I know that gitweb doesn't use this power now (it uses only one operator,
first if I remember correctly), but we can do this in the future
(e.g. searching for both author and specified string in commit message,
or searching for given author OR given committer). Well, we can always
change it back...
-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

```

## Petr Baudis, 2006-10-24 11:27

Subject: Re: [PATCH] gitweb: Make search type a popup menu
Message-ID: <20061024112727.GZ20017@pasky.or.cz>
URL: https://gitlist.dev/e/20061024112727.GZ20017%40pasky.or.cz
In-Reply-To: <ehkfis$6da$1@sea.gmane.org>

```
Dear diary, on Tue, Oct 24, 2006 at 09:33:12AM CEST, I got a letter
where Jakub Narebski <jnareb@gmail.com> said that...
> Petr Baudis wrote:
> 
> > This makes the multiple search types actually usable by the user;
> > if you don't read the gitweb source, you don't even have an idea
> > that you can write things like that there.
> 
> This is I think good change, although I'm not sure if I like changing
> using search operators to using additional CGI parameter.
> 
> Having help page for search is _certainly_ very good change. Perhaps
> we should put it out-of-line, not embedded? Just a thought...

You mean out-of-file? I've pondered it but I think this is simpler than
having yet another external file with yet another configuration option,
and the help file is not anyway likely something you will want to
customize per-site.

> This patch changes search box into something similar to Google
> "Advanced Search". Yet Google "Advanced Search" box generates search
> query using search operators. Search operators are just more powerfull.
> I know that gitweb doesn't use this power now (it uses only one operator,
> first if I remember correctly), but we can do this in the future
> (e.g. searching for both author and specified string in commit message,
> or searching for given author OR given committer). Well, we can always
> change it back...

Well, yes, that's something we can do when we actually implement the
operators, but I think doing it this way is less powerful, but much more
*useful* since users not familiar with gitweb will have an actual idea
on how to use it, and gitweb is something that will have 90% of users
not familiar with it. So perhaps have an "extended" search type which
will accept the keywords?

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
#!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj
$/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1
lK[d2%Sa2/d0$^Ixp"|dc`;s/\W//g;$_=pack('H*',/((..)*)$/)

```
