cgit.c: add 'clone-url' setting with support for macro expansion

The current 'clone-prefix' setting has some known issues:
* All repos get the same 'clone-prefix' value since the setting is not
  adopted during repo registration (in cgitrc, or during scan-path traversal),
  but only when the setting is used.
* The generated clone-urls for a repo is a combination of 'clone-prefix', a
  slash and the repo url. This doesn't work well with e.g. ssh-style urls
  like 'git@example.org:repo.git', since the inserted slash will make the
  repo relative to the filesystem root.
* If 'remove-suffix' is enabled, the generated clone-urls will not work for
  cloning (except for http-urls to cgit itself) since they miss the '.git'
  suffix.

The new 'clone-url' setting is designed to avoid the mentioned issues:
* Each repo adopts the default 'clone-url' when the repo is defined. This
  allows different groups of repos to adopt different values.
* The clone-urls for a repo is generated by expanding environment variables
  in a string template without inserting arbitrary characters, hence any
  kind of clone-url can be generated.
* Macro expansion also eases the 'remove-suffix' pain since it's now
  possible to define e.g. 'clone-url=git://foo.org/$CGIT_REPO_URL.git' for
  a set of repos. A furter improvement would be to define e.g.
  $CGIT_REPO_SUFFIX to '.git' for all repos which had their url prettified,
  or to store the original $CGIT_REPO_URL in e.g. $CGIT_REPO_REAL_URL before
  suffix removal.

Reviewed-by: Ferry Huberts <mailings@hupie.com>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
This commit is contained in:
Lars Hjemli 2011-06-06 20:49:13 +00:00
parent 3ec6b30950
commit a1429dbc89
7 changed files with 26 additions and 4 deletions

2
cgit.c
View File

@ -244,6 +244,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.robots = xstrdup(value); ctx.cfg.robots = xstrdup(value);
else if (!strcmp(name, "clone-prefix")) else if (!strcmp(name, "clone-prefix"))
ctx.cfg.clone_prefix = xstrdup(value); ctx.cfg.clone_prefix = xstrdup(value);
else if (!strcmp(name, "clone-url"))
ctx.cfg.clone_url = xstrdup(value);
else if (!strcmp(name, "local-time")) else if (!strcmp(name, "local-time"))
ctx.cfg.local_time = atoi(value); ctx.cfg.local_time = atoi(value);
else if (!prefixcmp(name, "mimetype.")) else if (!prefixcmp(name, "mimetype."))

1
cgit.h
View File

@ -165,6 +165,7 @@ struct cgit_config {
char *agefile; char *agefile;
char *cache_root; char *cache_root;
char *clone_prefix; char *clone_prefix;
char *clone_url;
char *css; char *css;
char *favicon; char *favicon;
char *footer; char *footer;

View File

@ -76,6 +76,11 @@ clone-prefix::
setting is only used if `repo.clone-url` is unspecified. Default value: setting is only used if `repo.clone-url` is unspecified. Default value:
none. none.
clone-url::
Space-separated list of clone-url templates. This setting is only
used if `repo.clone-url` is unspecified. Default value: none. See
also: "MACRO EXPANSION", "FILTER API".
commit-filter:: commit-filter::
Specifies a command which will be invoked to format commit messages. Specifies a command which will be invoked to format commit messages.
The command will get the message on its STDIN, and the STDOUT from the The command will get the message on its STDIN, and the STDOUT from the
@ -363,7 +368,7 @@ repo.about-filter::
repo.clone-url:: repo.clone-url::
A list of space-separated urls which can be used to clone this repo. A list of space-separated urls which can be used to clone this repo.
Default value: none. Default value: none. See also: "MACRO EXPANSION".
repo.commit-filter:: repo.commit-filter::
Override the default commit-filter. Default value: none. See also: Override the default commit-filter. Default value: none. See also:
@ -511,6 +516,12 @@ can be accomplished by adding the following line to /etc/cgitrc:
include=/etc/cgitrc.d/$HTTP_HOST include=/etc/cgitrc.d/$HTTP_HOST
The following options are expanded during request processing, and support
the environment variables defined in "FILTER API":
- clone-url
- repo.clone-url
EXAMPLE CGITRC FILE EXAMPLE CGITRC FILE
------------------- -------------------
@ -520,8 +531,8 @@ EXAMPLE CGITRC FILE
cache-size=1000 cache-size=1000
# Specify some default clone prefixes # Specify some default clone urls using macro expansion
clone-prefix=git://example.com ssh://example.com/pub/git http://example.com/git clone-url=git://foo.org/$CGIT_REPO_URL git@foo.org:$CGIT_REPO_URL
# Specify the css url # Specify the css url
css=/css/cgit.css css=/css/cgit.css

View File

@ -70,6 +70,7 @@ struct cgit_repo *cgit_add_repo(const char *url)
ret->about_filter = ctx.cfg.about_filter; ret->about_filter = ctx.cfg.about_filter;
ret->commit_filter = ctx.cfg.commit_filter; ret->commit_filter = ctx.cfg.commit_filter;
ret->source_filter = ctx.cfg.source_filter; ret->source_filter = ctx.cfg.source_filter;
ret->clone_url = ctx.cfg.clone_url;
return ret; return ret;
} }

View File

@ -62,6 +62,7 @@ enable-log-linecount=1
summary-log=5 summary-log=5
summary-branches=5 summary-branches=5
summary-tags=5 summary-tags=5
clone-url=git://example.org/\$CGIT_REPO_URL.git
repo.url=foo repo.url=foo
repo.path=$PWD/trash/repos/foo/.git repo.path=$PWD/trash/repos/foo/.git

View File

@ -9,6 +9,9 @@ run_test 'find commit 1' 'grep -e "commit 1" trash/tmp'
run_test 'find commit 5' 'grep -e "commit 5" trash/tmp' run_test 'find commit 5' 'grep -e "commit 5" trash/tmp'
run_test 'find branch master' 'grep -e "master" trash/tmp' run_test 'find branch master' 'grep -e "master" trash/tmp'
run_test 'no tags' '! grep -e "tags" trash/tmp' run_test 'no tags' '! grep -e "tags" trash/tmp'
run_test 'clone-url expanded correctly' '
grep -e "git://example.org/foo.git" trash/tmp
'
run_test 'generate bar summary' 'cgit_url "bar" >trash/tmp' run_test 'generate bar summary' 'cgit_url "bar" >trash/tmp'
run_test 'no commit 45' '! grep -e "commit 45" trash/tmp' run_test 'no commit 45' '! grep -e "commit 45" trash/tmp'
@ -16,5 +19,8 @@ run_test 'find commit 46' 'grep -e "commit 46" trash/tmp'
run_test 'find commit 50' 'grep -e "commit 50" trash/tmp' run_test 'find commit 50' 'grep -e "commit 50" trash/tmp'
run_test 'find branch master' 'grep -e "master" trash/tmp' run_test 'find branch master' 'grep -e "master" trash/tmp'
run_test 'no tags' '! grep -e "tags" trash/tmp' run_test 'no tags' '! grep -e "tags" trash/tmp'
run_test 'clone-url expanded correctly' '
grep -e "git://example.org/bar.git" trash/tmp
'
tests_done tests_done

View File

@ -62,7 +62,7 @@ void cgit_print_summary()
NULL, NULL, 0, 0); NULL, NULL, 0, 0);
} }
if (ctx.repo->clone_url) if (ctx.repo->clone_url)
print_urls(ctx.repo->clone_url, NULL); print_urls(expand_macros(ctx.repo->clone_url), NULL);
else if (ctx.cfg.clone_prefix) else if (ctx.cfg.clone_prefix)
print_urls(ctx.cfg.clone_prefix, ctx.repo->url); print_urls(ctx.cfg.clone_prefix, ctx.repo->url);
html("</table>"); html("</table>");