# [PATCH] gitweb: prefer git_get_project_owner() over get_file_owner()

3 messages from 2007-07-03 to 2007-07-07. Participants: Miklos Vajna, Junio C Hamano, Luben Tuikov.
Thread: https://gitlist.dev/t/8846

## Miklos Vajna, 2007-07-03 22:11

Subject: [PATCH] gitweb: prefer git_get_project_owner() over get_file_owner()
Message-ID: <20070703221122.GI32766@genesis.frugalware.org>
URL: https://gitlist.dev/e/20070703221122.GI32766%40genesis.frugalware.org
In-Reply-To: <11834866911868-git-send-email-vmiklos@frugalware.org>

```
This way if $projects_list exists, it'll be used, otherwise get_file_owner()
will be used as before.

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

Sorry for sending it again, even if sending it to myself first, the long
description was left out somehow.

Also it seems that i had some problem with git-send-email, my bad.

 gitweb/gitweb.perl |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index dbfb044..6201b90 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -3166,7 +3166,7 @@ sub git_project_list_body {
 			$pr->{'descr'} = chop_str($descr, 25, 5);
 		}
 		if (!defined $pr->{'owner'}) {
-			$pr->{'owner'} = get_file_owner("$projectroot/$pr->{'path'}") || "";
+			$pr->{'owner'} = git_get_project_owner("$pr->{'path'}") || "";
 		}
 		if ($check_forks) {
 			my $pname = $pr->{'path'};
@@ -3590,7 +3590,7 @@ sub git_project_index {
 
 	foreach my $pr (@projects) {
 		if (!exists $pr->{'owner'}) {
-			$pr->{'owner'} = get_file_owner("$projectroot/$pr->{'path'}");
+			$pr->{'owner'} = git_get_project_owner("$pr->{'path'}");
 		}
 
 		my ($path, $owner) = ($pr->{'path'}, $pr->{'owner'});
-- 
1.5.2.2

```

## Junio C Hamano, 2007-07-04 05:10

Subject: Re: [PATCH] gitweb: prefer git_get_project_owner() over get_file_owner()
Message-ID: <7vzm2ckb3h.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vzm2ckb3h.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20070703221122.GI32766@genesis.frugalware.org>

```
Miklos Vajna <vmiklos@frugalware.org> writes:

> This way if $projects_list exists, it'll be used, otherwise get_file_owner()
> will be used as before.
>
> Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>

The patch looks good to me.

HOWEVER.

It strikes me that repeated call to git_get_project_owner()
would be way too inefficient.  Not caller's fault.

How about doing something like this on top of your patch?

 gitweb/gitweb.perl |   28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index dbfb044..f114585 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -1465,12 +1465,12 @@ sub git_get_projects_list {
 	return @list;
 }
 
-sub git_get_project_owner {
-	my $project = shift;
-	my $owner;
+our $gitweb_project_owner = undef;
+sub git_get_project_list_from_file {
 
-	return undef unless $project;
+	return if (defined $gitweb_project_owner);
 
+	$gitweb_project_owner = {};
 	# read from file (url-encoded):
 	# 'git%2Fgit.git Linus+Torvalds'
 	# 'libs%2Fklibc%2Fklibc.git H.+Peter+Anvin'
@@ -1482,13 +1482,25 @@ sub git_get_project_owner {
 			my ($pr, $ow) = split ' ', $line;
 			$pr = unescape($pr);
 			$ow = unescape($ow);
-			if ($pr eq $project) {
-				$owner = to_utf8($ow);
-				last;
-			}
+			$gitweb_project_owner->{$project} = to_utf8($ow);
 		}
 		close $fd;
 	}
+}
+
+sub git_get_project_owner {
+	my $project = shift;
+	my $owner;
+
+	return undef unless $project;
+
+	if (!defined $gitweb_project_owner) {
+		git_get_project_list_from_file();
+	}
+
+	if (exists $gitweb_project_owner->{$project}) {
+		$owner = $gitweb_project_owner->{$project};
+	}
 	if (!defined $owner) {
 		$owner = get_file_owner("$projectroot/$project");
 	}

```

## Luben Tuikov, 2007-07-07 19:05

Subject: Re: [PATCH] gitweb: prefer git_get_project_owner() over get_file_owner()
Message-ID: <260120.95921.qm@web31806.mail.mud.yahoo.com>
URL: https://gitlist.dev/e/260120.95921.qm%40web31806.mail.mud.yahoo.com
In-Reply-To: <7vzm2ckb3h.fsf@assigned-by-dhcp.cox.net>

```
--- Junio C Hamano <gitster@pobox.com> wrote:
> Miklos Vajna <vmiklos@frugalware.org> writes:
> 
> > This way if $projects_list exists, it'll be used, otherwise get_file_owner()
> > will be used as before.
> >
> > Signed-off-by: Miklos Vajna <vmiklos@frugalware.org>
> 
> The patch looks good to me.
> 
> HOWEVER.
> 
> It strikes me that repeated call to git_get_project_owner()
> would be way too inefficient.  Not caller's fault.
> 
> How about doing something like this on top of your patch?

Yes, this sounds sensible. ACK.

    Luben


> 
>  gitweb/gitweb.perl |   28 ++++++++++++++++++++--------
>  1 files changed, 20 insertions(+), 8 deletions(-)
> 
> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
> index dbfb044..f114585 100755
> --- a/gitweb/gitweb.perl
> +++ b/gitweb/gitweb.perl
> @@ -1465,12 +1465,12 @@ sub git_get_projects_list {
>  	return @list;
>  }
>  
> -sub git_get_project_owner {
> -	my $project = shift;
> -	my $owner;
> +our $gitweb_project_owner = undef;
> +sub git_get_project_list_from_file {
>  
> -	return undef unless $project;
> +	return if (defined $gitweb_project_owner);
>  
> +	$gitweb_project_owner = {};
>  	# read from file (url-encoded):
>  	# 'git%2Fgit.git Linus+Torvalds'
>  	# 'libs%2Fklibc%2Fklibc.git H.+Peter+Anvin'
> @@ -1482,13 +1482,25 @@ sub git_get_project_owner {
>  			my ($pr, $ow) = split ' ', $line;
>  			$pr = unescape($pr);
>  			$ow = unescape($ow);
> -			if ($pr eq $project) {
> -				$owner = to_utf8($ow);
> -				last;
> -			}
> +			$gitweb_project_owner->{$project} = to_utf8($ow);
>  		}
>  		close $fd;
>  	}
> +}
> +
> +sub git_get_project_owner {
> +	my $project = shift;
> +	my $owner;
> +
> +	return undef unless $project;
> +
> +	if (!defined $gitweb_project_owner) {
> +		git_get_project_list_from_file();
> +	}
> +
> +	if (exists $gitweb_project_owner->{$project}) {
> +		$owner = $gitweb_project_owner->{$project};
> +	}
>  	if (!defined $owner) {
>  		$owner = get_file_owner("$projectroot/$project");
>  	}
> 
> 

```
