set=UTF-8
Content-Disposition: inline; filename="2e4a941626c240bc7858aa7564882c01f657f4e8..119397b175874bd606952e93b7249ae4ffb9afbe.patch"
Last-Modified: Sat, 04 Jan 2025 01:53:47 GMT
Expires: Sat, 04 Jan 2025 05:53:47 GMT

From 119397b175874bd606952e93b7249ae4ffb9afbe Mon Sep 17 00:00:00 2001
From: Jason A. Donenfeld
Date: Thu, 29 Jul 2010 20:38:01 +0200
Subject: Add support for 'enable-gitweb-owner' option

When this option is enabled (which it is by default), cgit will lookup
the 'gitweb.owner' setting in each git config file found when processing
the 'scan-path' option.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
---
 cgit.c       |  3 +++
 cgit.h       |  1 +
 cgitrc.5.txt |  5 +++++
 scan-tree.c  | 33 ++++++++++++++++++++++++---------
 4 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/cgit.c b/cgit.c
index f9a42bb..eff5b7a 100644
--- a/cgit.c
+++ b/cgit.c
@@ -135,6 +135,8 @@ void config_cb(const char *name, const char *value)
 		ctx.cfg.snapshots = cgit_parse_snapshots_mask(value);
 	else if (!strcmp(name, "enable-filter-overrides"))
 		ctx.cfg.enable_filter_overrides = atoi(value);
+	else if (!strcmp(name, "enable-gitweb-owner"))
+		ctx.cfg.enable_gitweb_owner = atoi(value);
 	else if (!strcmp(name, "enable-index-links"))
 		ctx.cfg.enable_index_links = atoi(value);
 	else if (!strcmp(name, "enable-log-filecount"))
@@ -293,6 +295,7 @@ static void prepare_context(struct cgit_context *ctx)
 	ctx->cfg.css = "/cgit.css";
 	ctx->cfg.logo = "/cgit.png";
 	ctx->cfg.local_time = 0;
+	ctx->cfg.enable_gitweb_owner = 1;
 	ctx->cfg.enable_tree_linenumbers = 1;
 	ctx->cfg.max_repo_count = 50;
 	ctx->cfg.max_commit_count = 50;
diff --git a/cgit.h b/cgit.h
index ada8535..232099d 100644
--- a/cgit.h
+++ b/cgit.h
@@ -183,6 +183,7 @@ struct cgit_config {
 	int cache_static_ttl;
 	int embedded;
 	int enable_filter_overrides;
+	int enable_gitweb_owner;
 	int enable_index_links;
 	int enable_log_filecount;
 	int enable_log_linecount;
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 6fb1083..5d77973 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -95,6 +95,11 @@ enable-filter-overrides::
 	Flag which, when set to "1", allows all filter settings to be
 	overridden in repository-specific cgitrc files. Default value: none.
 
+enable-gitweb-owner::
+	If set to "1" and scan-path is enabled, we first check each repository
+	for the git config value "gitweb.owner" to determine the owner.
+	Default value: "1". See also: scan-path.
+
 enable-index-links::
 	Flag which, when set to "1", will make cgit generate extra links for
 	each repo in the repository index (specifically, to the "summary",
diff --git a/scan-tree.c b/scan-tree.c
index a83a78c..e987824 100644
--- a/scan-tree.c
+++ b/scan-tree.c
@@ -47,12 +47,20 @@ static int is_git_dir(const char *path)
 
 struct cgit_repo *repo;
 repo_config_fn config_fn;
+char *owner;
 
 static void repo_config(const char *name, const char *value)
 {
 	config_fn(repo, name, value);
 }
 
+static int git_owner_config(const char *key, const char *value, void *cb)
+{
+	if (!strcmp(key, "gitweb.owner"))
+		owner = xstrdup(value);
+	return 0;
+}
+
 static void add_repo(const char *base, const char *path, repo_config_fn fn)
 {
 	struct stat st;
@@ -67,11 +75,10 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
 	}
 	if (!stat(fmt("%s/noweb", path), &st))
 		return;
-	if ((pwd = getpwuid(st.st_uid)) == NULL) {
-		fprintf(stderr, "Error reading owner-info for %s: %s (%d)\n",
-			path, strerror(errno), errno);
-		return;
-	}
+
+	owner = NULL;
+	if (ctx.cfg.enable_gitweb_owner)
+		git_config_from_file(git_owner_config, fmt("%s/config", path), NULL);
 	if (base == path)
 		p = fmt("%s", path);
 	else
@@ -86,10 +93,18 @@ static void add_repo(const char *base, const char *path, repo_config_fn fn)
 			*p = '\0';
 	repo->name = repo->url;
 	repo->path = xstrdup(path);
-	p = (pwd && pwd->pw_gecos) ? strchr(pwd->pw_gecos, ',') : NULL;
-	if (p)
-		*p = '\0';
-	repo->owner = (pwd ? xstrdup(pwd->pw_gecos ? pwd->pw_gecos : pwd->pw_name)<style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="ch">#!/bin/sh</span>

<span class="nv">test_description</span><span class="o">=</span><span class="s1">&#39;Check content on summary page&#39;</span>
.<span class="w"> </span>./setup.sh

test_expect_success<span class="w"> </span><span class="s1">&#39;generate foo summary&#39;</span><span class="w"> </span><span class="s1">&#39;cgit_url &quot;foo&quot; &gt;tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find commit 1&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;commit 1&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find commit 5&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;commit 5&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find branch master&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;master&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;no tags&#39;</span><span class="w"> </span><span class="s1">&#39;! grep &quot;tags&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;clone-url expanded correctly&#39;</span><span class="w"> </span><span class="s1">&#39;</span>
<span class="s1">	grep &quot;git://example.org/foo.git&quot; tmp</span>
<span class="s1">&#39;</span>

test_expect_success<span class="w"> </span><span class="s1">&#39;generate bar summary&#39;</span><span class="w"> </span><span class="s1">&#39;cgit_url &quot;bar&quot; &gt;tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;no commit 45&#39;</span><span class="w"> </span><span class="s1">&#39;! grep &quot;commit 45&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find commit 46&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;commit 46&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find commit 50&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;commit 50&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;find branch master&#39;</span><span class="w"> </span><span class="s1">&#39;grep &quot;master&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;no tags&#39;</span><span class="w"> </span><span class="s1">&#39;! grep &quot;tags&quot; tmp&#39;</span>
test_expect_success<span class="w"> </span><span class="s1">&#39;clone-url expanded correctly&#39;</span><span class="w"> </span><span class="s1">&#39;</span>
<span class="s1">	grep &quot;git://example.org/bar.git&quot; tmp</span>
<span class="s1">&#39;</span>

test_done
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3-54-g00ecf</a> (<a href='https://git-scm.com/'>git 2.39.0</a>) at 2025-01-04 01:53:47 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
