--base-path-relaxed option
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 --base-path-relaxed option
From: Jens Axboe <[email protected]>
I switched git.kernel.dk to --base-path a few minutes ago, to get rid of a /data/git postfix in the posted urls. But transitioning is tricky, since now all old paths will fail miserably.
So I added this --base-path-relaxed option, that will make git-daemon try the absolute path without prefixing --base-path before giving up. With this in place and --base-path-relaxed added, both my new url of
git://git.kernel.dk/linux-2.6-block.git
and the old
git://git.kernel.dk/data/git/linux-2.6-block.git
work fine.
---
* I think this patch is a right step; we would need to help people transitioning their repository URL, not necessarily limited to --base-path usage. This patch only deals with "with this base path or without" case, and does not help people who used to use base-path A and now wants to use different base-path B, so in that sense there *might* still be a room for improvement. It could be as simple as allowing more than than one base-path and taking the first match.
If you set one of them to an empty string, it would cover the case this patch addresses, I think.
I personally do not think we would want to try 47 different base-paths, though. List?
Documentation/git-daemon.txt | 6 ++++++ daemon.c | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-)
Documentation/git-daemon.txt +6 -0
@@ -54,6 +54,12 @@ OPTIONS 'git://example.com/hello.git', `git-daemon` will interpret the path as '/srv/git/hello.git'. +--base-path-relaxed:: + If --base-path is enabled and repo lookup fails, with this option + `git-daemon` will attempt to lookup without prefixing the base path. + This is useful for switching to --base-path usage, while still + allowing the old paths. + --interpolated-path=pathtemplate:: To support virtual hosting, an interpolated path template can be used to dynamically construct alternate paths. The template
daemon.c +24 -2
@@ -16,7 +16,8 @@ static int reuseaddr;static const char daemon_usage[] ="git-daemon [--verbose] [--syslog] [--export-all]\n" " [--timeout=n] [--init-timeout=n] [--strict-paths]\n" -" [--base-path=path] [--user-path | --user-path=path]\n" +" [--base-path=path] [--base-path-relaxed]\n" +" [--user-path | --user-path=path]\n" " [--interpolated-path=path]\n" " [--reuseaddr] [--detach] [--pid-file=file]\n" " [--[enable|disable|allow-override|forbid-override]=service]\n"
@@ -34,6 +35,7 @@ static int export_all_trees;/* Take all paths relative to this one if non-NULL */ static char *base_path;static char *interpolated_path; +static int base_path_relaxed;/* Flag indicating client sent extra args. */ static int saw_extended_args;
@@ -180,6 +182,7 @@ static char *path_ok(struct interp *itable) {static char rpath[PATH_MAX ];static char interp_path[PATH_MAX ]; +int retried_path =0 ;char *path;char *dir;
@@ -235,7 +238,22 @@ static char *path_ok(struct interp *itable) dir = rpath; } - path =enter_repo (dir, strict_paths); +do { + path =enter_repo (dir, strict_paths); +if (path) +break ; + +/* +* if we fail and base_path_relaxed is enabled, try without +* prefixing the base path +*/ +if (base_path && base_path_relaxed && !retried_path) { + dir = itable[INTERP_SLOT_DIR ].value; + retried_path =1 ; +continue ; + } +break ; + }while (1 );if (!path) {logerror ("'%s': unable to chdir or not a git archive" , dir);
@@ -1061,6 +1079,10 @@ int main(int argc, char **argv) base_path = arg+12 ;continue ; } +if (!strcmp (arg,"--base-path-relaxed" )) { + base_path_relaxed =1 ; +continue ; + }if (!prefixcmp (arg,"--interpolated-path=" )) { interpolated_path = arg+20 ;continue ;
Signature · 1 line
Jens Axboe