From b3e0c49d3eb59941f8fef8270c46c51a781b355d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Kr=C3=BCger?= Date: Mon, 15 Nov 2010 21:54:32 +0100 Subject: [PATCH] Girocco::Project: add infrastructure for getting/setting HEAD MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Provide the underlying functionality for adding an outstanding feature to Girocco, namely allowing admins to change the default branch of their repositories. Signed-off-by: Jan Krüger --- Girocco/Project.pm | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Girocco/Project.pm b/Girocco/Project.pm index e4bd91c..50bbb32 100644 --- a/Girocco/Project.pm +++ b/Girocco/Project.pm @@ -291,6 +291,8 @@ sub load { ($self->{crypt}, $self->{gid}, $ulist) = @_; $ulist ||= ''; $self->{users} = [split /,/, $ulist]; + $self->{HEAD} = $self->get_HEAD; + $self->{orig_HEAD} = $self->{HEAD}; $self->{orig_users} = [@{$self->{users}}]; $self->{mirror} = ! -e $self->_nofetch_path; $self->{clone_in_progress} = -e $self->_clonep_path; @@ -351,6 +353,8 @@ sub cgi_fill { $self->{users} = [grep { Girocco::User::valid_name($_) && Girocco::User::does_exist($_) } $cgi->param('user')]; + $self->{HEAD} = $cgi->param('HEAD') if $cgi->param('HEAD'); + $self->{notifymail} = $gcgi->wparam('notifymail'); if ($self->{notifymail}) { (valid_email_multi($self->{notifymail}) and length($self->{notifymail}) <= 512) @@ -475,6 +479,8 @@ sub update { $self->_properties_save; $self->_group_update; + $self->set_HEAD($self->{HEAD}) unless $self->{orig_HEAD} eq $self->{HEAD}; + my @users_add = grep { $a = $_; not scalar grep { $a eq $_ } $self->{orig_users} } $self->{users}; my @users_del = grep { $a = $_; not scalar grep { $a eq $_ } $self->{users} } $self->{orig_users}; $self->perm_user_add($_, Girocco::User::resolve_uid($_)) foreach (@users_add); @@ -508,6 +514,37 @@ sub has_forks { return glob($Girocco::Config::reporoot.'/'.$self->{name}.'/*'); } +sub get_heads { + my $self = shift; + my $fh; + open($fh, '-|', "$Girocco::Config::git_bin --git-dir=$self->{path} show-ref --heads") or die "could not get list of heads"; + my @res; + while (<$fh>) { + chomp; + next if !m#^[0-9a-f]{40}\s+refs/heads/(.*)+$ #x; + push @res, $1; + } + close $fh; + @res; +} + +sub get_HEAD { + my $self = shift; + my $HEAD = `$Girocco::Config::git_bin --git-dir=$self->{path} symbolic-ref HEAD`; + chomp $HEAD; + die "could not get HEAD" if ($HEAD !~ m{^refs/heads/(.+)$}); + return $1; +} + +sub set_HEAD { + my $self = shift; + my $newHEAD = shift; + # Cursory checks only -- if you want to break your HEAD, be my guest + if ($newHEAD =~ /^\/|['<>]|\.\.|\/$/) { + die "grossly invalid new HEAD: $newHEAD"; + } + system("$Girocco::Config::git_bin --git-dir=$self->{path} symbolic-ref HEAD 'refs/heads/$newHEAD'") or die "could not set HEAD"; +} ### static methods -- 2.11.4.GIT