allow aliasing a repo to another name
all documentation is inside Alias.pm.
This commit is contained in:
parent
bc3eb34211
commit
07169c37ec
81
src/lib/Gitolite/Triggers/Alias.pm
Executable file
81
src/lib/Gitolite/Triggers/Alias.pm
Executable file
|
@ -0,0 +1,81 @@
|
||||||
|
package Gitolite::Triggers::Alias;
|
||||||
|
|
||||||
|
use Gitolite::Rc;
|
||||||
|
use Gitolite::Common;
|
||||||
|
use Gitolite::Conf::Load;
|
||||||
|
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
|
||||||
|
# aliasing a repo to another
|
||||||
|
# ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
=for usage
|
||||||
|
|
||||||
|
Why:
|
||||||
|
|
||||||
|
We had an existing repo "foo" that lots of people use. We wanted to
|
||||||
|
rename it to "foo/code", so that related repos "foo/upstream" and
|
||||||
|
"foo/docs" (both containing stuff we did not want to put in "foo") could
|
||||||
|
also be made and then the whole thing would be structured nicely.
|
||||||
|
|
||||||
|
At the same time we did not want to *force* all the users to change the
|
||||||
|
name. At least git operations should still work with the old name,
|
||||||
|
although it is OK for "info" and other "commands" to display/require the
|
||||||
|
proper name (i.e., the new name).
|
||||||
|
|
||||||
|
How:
|
||||||
|
|
||||||
|
* add a new variable REPO_ALIASES to the rc file, with entries like:
|
||||||
|
|
||||||
|
REPO_ALIASES =>
|
||||||
|
{
|
||||||
|
'foo' => 'foo/code',
|
||||||
|
}
|
||||||
|
|
||||||
|
* add the following line to the INPUT section in the rc file:
|
||||||
|
|
||||||
|
'Alias::input',
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
* only git operations (clone/fetch/push) are alias aware. Nothing else in
|
||||||
|
gitolite, such as all the gitolite commands etc., are alias-aware and will
|
||||||
|
always use/require the proper repo name.
|
||||||
|
|
||||||
|
* http mode has not been tested and will not be. If someone has the time to
|
||||||
|
test it and make it work please let me know.
|
||||||
|
|
||||||
|
* funnily enough, this even works with mirroring! That is, a master can
|
||||||
|
push a repo "foo" to a slave per its configuration, while the slave thinks
|
||||||
|
it is getting repo "bar" from the master per its configuration.
|
||||||
|
|
||||||
|
Just make sure to put the Alias::input line *before* the Mirroring::input
|
||||||
|
line in the rc file on the slave.
|
||||||
|
|
||||||
|
However, it will probably not work with redirected pushes unless you setup
|
||||||
|
the opposite alias ("bar" -> "foo") on master.
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub input {
|
||||||
|
my $git_commands = "git-upload-pack|git-receive-pack|git-upload-archive";
|
||||||
|
my $user = $ARGV[0] || '@all'; # user name is undocumented for now
|
||||||
|
|
||||||
|
if ( $ENV{SSH_ORIGINAL_COMMAND} =~ /(?:$git_commands) '(\S+)'$/ ) {
|
||||||
|
my $repo = $1;
|
||||||
|
( my $norm = $repo ) =~ s/\.git$//; # normalised repo name
|
||||||
|
|
||||||
|
my $target;
|
||||||
|
|
||||||
|
return unless $target = $rc{REPO_ALIASES}{$norm};
|
||||||
|
$target = $target->{$user} if ref($target) eq 'HASH';
|
||||||
|
return unless $target;
|
||||||
|
|
||||||
|
_warn "'$norm' is an alias for '$target'";
|
||||||
|
|
||||||
|
$ENV{SSH_ORIGINAL_COMMAND} =~ s/'$repo'/'$target'/;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
Loading…
Reference in a new issue