aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl-install')
-rwxr-xr-xsrc/gl-install102
1 files changed, 24 insertions, 78 deletions
diff --git a/src/gl-install b/src/gl-install
index de7aefd..ac9e84e 100755
--- a/src/gl-install
+++ b/src/gl-install
@@ -2,6 +2,8 @@
# INTERNAL COMMAND. NOT MEANT TO BE RUN BY THE USER DIRECTLY.
+# sets up REPO_BASE, GL_ADMINDIR. Symlinks hooks
+
use strict;
use warnings;
@@ -10,108 +12,52 @@ use warnings;
# ----------------------------------------------------------------------------
BEGIN {
- die "ENV GL_RC not set\n" unless $ENV{GL_RC};
+ die "ENV GL_RC not set\n" unless $ENV{GL_RC};
die "ENV GL_BINDIR not set\n" unless $ENV{GL_BINDIR};
}
use lib $ENV{GL_BINDIR};
+
use gitolite_rc;
+use gitolite_env;
use gitolite;
-# ----------------------------------------------------------------------------
-# start...
-# ----------------------------------------------------------------------------
-
-# setup quiet mode if asked; please do not use this when running manually
-open STDOUT, ">", "/dev/null" if (@ARGV and shift eq '-q');
-
-# wrapper around mkdir; it's not an error if the directory exists, but it is
-# an error if it doesn't exist and we can't create it
-sub wrap_mkdir
-{
- my $dir = shift;
- my $perm = shift; # optional
- if ( -d $dir ) {
- print "$dir already exists\n";
- return;
- }
- mkdir($dir) or die "mkdir $dir failed: $!\n";
- chmod $perm, $dir if $perm;
- print "created $dir\n";
-}
-
-unless ($ENV{GL_RC}) {
- # doesn't exist. Copy it across, tell user to edit it and come back
- my $glrc = $ENV{HOME} . "/.gitolite.rc";
- if ($GL_PACKAGE_CONF) {
- system("cp $GL_PACKAGE_CONF/example.gitolite.rc $glrc");
- } else {
- system("cp $ENV{GL_BINDIR}/../conf/example.gitolite.rc $glrc");
- }
- print "created $glrc\n";
- print "please edit it, change the paths if you wish to, and RERUN THIS SCRIPT\n";
- exit;
-}
-
-# add a custom path for git binaries, if specified
-$ENV{PATH} .= ":$GIT_PATH" if $GIT_PATH;
-
-# set the umask before creating any files/directories
-umask($REPO_UMASK);
+setup_environment();
# mkdir $REPO_BASE, $GL_ADMINDIR if they don't already exist
wrap_mkdir($REPO_BASE);
-wrap_mkdir($GL_ADMINDIR, 0700);
+wrap_mkdir( $GL_ADMINDIR, 0700 );
+
# mkdir $GL_ADMINDIR's subdirs
-for my $dir (qw(conf doc keydir logs src hooks hooks/common hooks/gitolite-admin)) {
- # some of them will stay empty; too lazy to fix right now ;-)
- wrap_mkdir("$GL_ADMINDIR/$dir", 0700);
+for my $dir (qw(conf keydir logs hooks hooks/common hooks/gitolite-admin)) {
+ wrap_mkdir( "$GL_ADMINDIR/$dir", 0700 );
}
-# "src" and "doc" will be overwritten on each install, but not conf
-if ($GL_PACKAGE_HOOKS) {
- system("cp -R -p $GL_PACKAGE_HOOKS $GL_ADMINDIR");
-} else {
- system("cp -R -p $ENV{GL_BINDIR}/../src $ENV{GL_BINDIR}/../doc $ENV{GL_BINDIR}/../hooks $GL_ADMINDIR");
- system("cp $ENV{GL_BINDIR}/../conf/VERSION $GL_ADMINDIR/conf");
-}
+# hooks must be propagated to all the repos in case they changed
-unless (-f $GL_CONF or $GL_PACKAGE_CONF) {
- print <<EOF;
- please do the following:
- 1. create and edit $GL_CONF to contain something like this:
- repo gitolite-admin
- RW+ = yourname
- 2. copy "yourname.pub" to $GL_ADMINDIR/keydir
- 3. run this command
- $GL_ADMINDIR/src/gl-compile-conf
-EOF
-}
+# See http://sitaramc.github.com/gitolite/hook_prop.html if you're not sure
+# what is happening here, especially the picture toward the end.
-# finally, hooks must be propagated to all the repos in case they changed
+# all repos, all hooks
chdir($REPO_BASE) or die "chdir $REPO_BASE failed: $!\n";
for my $repo (`find . -type d -name "*.git" -prune`) {
- chomp ($repo);
- # propagate our own, plus any local admin-defined, hooks
- ln_sf("$GL_ADMINDIR/hooks/common", "*", "$repo/hooks");
- # in case of package install, GL_ADMINDIR is no longer the top cop;
- # override with the package hooks
- ln_sf("$GL_PACKAGE_HOOKS/common", "*", "$repo/hooks") if $GL_PACKAGE_HOOKS;
+ chomp($repo);
+ # propagate user hooks
+ ln_sf( "$GL_ADMINDIR/hooks/common", "*", "$repo/hooks" );
+ # propagate package hooks, overriding user hooks
+ ln_sf( "$GL_PACKAGE_HOOKS/common", "*", "$repo/hooks" );
chmod 0755, "$repo/hooks/update";
}
-# oh and one of those repos is a bit more special and has an extra hook :)
+# (special!) gitolite-admin repo, post-update hook, package hook only
if ( -d "gitolite-admin.git/hooks" ) {
- print "copying post-update hook to gitolite-admin repo...\n";
- unlink "gitolite-admin.git/hooks/post-update";
- symlink "$GL_ADMINDIR/hooks/gitolite-admin/post-update", "gitolite-admin.git/hooks/post-update"
- or die "could not symlink post-update hook\n";
- # ditto... (see previous block)
- ln_sf("$GL_PACKAGE_HOOKS/gitolite-admin", "post-update", "gitolite-admin.git/hooks") if $GL_PACKAGE_HOOKS;
+ ln_sf( "$GL_PACKAGE_HOOKS/gitolite-admin", "post-update", "gitolite-admin.git/hooks" );
chmod 0755, "gitolite-admin.git/hooks/post-update";
}
-# fixup program renames
+# deal with old program names...
+# not needed for RPM/DEB type systems since they take care of it themselves
+# but people upgrading might appreciate this; not sure how useful it is though
for my $oldname (qw(pta-hook.sh conf-convert.pl 00-easy-install.sh gl-easy-install 99-emergency-addkey.sh gl-emergency-addkey install.pl update-hook.pl hooks/update ga-post-update-hook VERSION)) {
unlink "$GL_ADMINDIR/src/$oldname";
unlink "$ENV{HOME}/gitolite-install/src/$oldname";