2 # (c) Petr Baudis <pasky@suse.cz>
13 use POSIX
qw(strftime);
16 <script type="text/javascript">
18 function adduseritem(elem)
20 var inp = document.createElement('input');
23 var li = document.createElement('li');
24 li.appendChild(document.createTextNode('Add user: '));
26 elem.parentNode.insertBefore(li, elem);
31 my $gcgi = Girocco
::CGI
->new('Project Settings', undef, $script);
34 my $name = $cgi->param('name');
35 $name =~ s
#\.git$## if $name; #
37 unless (defined $name) {
38 print "<p>I need the project name as an argument now.</p>\n";
42 if (!Girocco
::Project
::does_exist
($name,1) && !Girocco
::Project
::valid_name
($name)) {
43 print "<p>Invalid project name. Go away, sorcerer.</p>\n";
47 if (!Girocco
::Project
::does_exist
($name,1)) {
48 print "<p>Sorry but the project $name does not exist. Now, how did you <em>get</em> here?!</p>\n";
52 my $proj = Girocco
::Project
->load($name);
54 print "<p>not found project $name, that's really weird!</p>\n";
57 push(@Girocco::Config
::project_fields
, "notifycia")
58 if $proj->{notifycia
} && !grep(/notifycia/, @Girocco::Config
::project_fields
);
60 $escname =~ s/[+]/%2B/g;
62 my $tzoffset = $cgi->param('tzoffset') || 0;
63 $tzoffset =~ /^[-+]?\d{1,5}$/ or $tzoffset = 0;
64 $tzoffset = 0 + $tzoffset;
65 $tzoffset >= -43200 && $tzoffset <= 43200 or $tzoffset = 0;
69 defined($es) or $es = time();
71 my $str = strftime
("%Y-%m-%d %H:%M:%S ", (gmtime($es))[0..5], -1, -1, -1);
73 my $moff = int(abs($tzoffset) / 60);
74 $str .= sprintf("%s%02d%02d",
75 ($tzoffset >= 0 ?
"+" : "-"),
77 $moff - 60 * int($moff / 60));
84 my $y0 = $cgi->param('y0') || '';
85 if (($y0 eq 'Update' || $y0 eq 'Restart Mirroring') && $cgi->request_method eq 'POST') {
86 # submitted, let's see
87 my $ts = "<span class=\"timestamp\">" . format_epoch_ts
() . "</span>";
88 $gcgi->err_prelude("<p class=\"failed\">Project update failed at $ts.</p>\n");
89 if ($proj->cgi_fill($gcgi) and $proj->authenticate($gcgi) and $proj->update) {
90 print "<p class=\"updated\">Project successfully updated at $ts.</p>\n";
91 if ($proj->{clone_failed
}) {
93 print "<p>Please <a href=\"@{[url_path($Girocco::Config::webadmurl)]}".
94 "/mirrorproj.cgi?name=$escname\">pass onwards</a>.</p>\n";
95 print "<script language=\"javascript\">document.location=".
96 "'@{[url_path($Girocco::Config::webadmurl)]}/mirrorproj.cgi?name=$escname'</script>\n";
102 # $proj may be insane now but that's actually good for us since we'll let the
103 # user fix the invalid values he or she entered
104 my %h = $proj->form_defaults;
107 <p>Here you may adjust the settings of project $h{name}. Go wild.
109 if ($proj->{mirror
}) {
111 Since this is a mirrored project, you may opt to remove it from the site as well.
112 Just <a href="@{[url_path($Girocco::Config::webadmurl)]}/delproj.cgi?name=$escname">remove it</a>.</p>
115 if ($proj->is_empty) {
117 Since this is an empty project, you may opt to remove it from the site as well.
118 Just <a href="@{[url_path($Girocco::Config::webadmurl)]}/delproj.cgi?name=$escname">remove it</a>.</p>
123 <a href="@{[url_path($Girocco::Config::webadmurl)]}/delproj.cgi?name=$escname">request an authorization code</a> in order
124 to remove this project from the site.</p>
128 <p>Use the <b>+</b> button to enable access for more than a single user at a time.</p>
132 my $button_label = $proj->{clone_failed
} ?
'Restart Mirroring' : 'Update';
133 my $showstatusopt = $proj->{mirror
} && !$proj->{clone_failed
} && !$proj->{clone_in_progress
};
134 my $statuschecked = $proj->{statusupdates
} ?
'checked="checked"' : '';
137 <form method="post" action="@{[url_path($Girocco::Config::webadmurl)]}/editproj.cgi">
138 <input type="hidden" name="tzoffset" value="0" />
140 <tr><td class="formlabel">Project name:</td><td class="formdata"><a
141 href="@{[url_path($Girocco::Config::gitweburl)]}/$h{name}.git">$h{name}</a>.git
142 <input type="hidden" name="name" value="$h{name}" /></td></tr>
144 if ($Girocco::Config
::project_passwords
) {
146 <tr><td class="formlabel"><strong>Admin password:</strong></td><td>
147 <input type="password" name="cpwd" /> <sup class="sup"><span><a
148 href="@{[url_path($Girocco::Config::webadmurl)]}/pwproj.cgi?name=$escname"
149 class="ctxaction">(forgot password?)</a></span></sup></td></tr>
150 <tr><td class="formlabel">New admin password (twice):<br />
151 <em>(leave empty to keep it the same)</em></td><td>
152 <input type="password" name="pwd" /><br /><input type="password" name="pwd2" /><br />
156 if ($Girocco::Config
::project_owners
eq 'email') {
158 <tr><td class="formlabel">E-mail contact:</td><td><input type="text" name="email" value="$h{email}" /></td></tr>
162 if ($proj->{mirror
}) {
163 print "<tr><td class=\"formlabel\">Repository URL:</td><td><input type=\"text\" name=\"url\" value=\"$h{url}\" /></td></tr>\n";
164 print '<tr><td class="formlabel">Mirror refs:</td><td class="formdatatd">'.
165 '<label title="Unchecking this will mirror the entire refs namespace which is usually unnecessary. '.
166 'Non-git sources always mirror the entire refs namespace regardless of this setting.">'.
167 '<input type="checkbox" name="cleanmirror" value="1" '.($h{'cleanmirror'} ?
'checked="checked" ' : '').
168 'style="vertical-align:middle" /><span style="vertical-align:middle; margin-left:0.5ex">'.
169 'Only mirror <code>refs/heads/*</code>, <code>refs/tags/*</code> and <code>refs/notes/*</code></span></label></td></tr>'."\n"
170 if grep(/cleanmirror/, @Girocco::Config
::project_fields
);
173 <tr><td class="formlabel" style="vertical-align:middle">Users:</td><td>
176 $Girocco::Config
::manage_users
and print "<p>Only <a href=\"".
177 "@{[url_path($Girocco::Config::webadmurl)]}/reguser.cgi\">registered users</a> may push.</p>";
178 if ($Girocco::Config
::mob
and not grep { $_ eq $Girocco::Config
::mob
} @
{$h{users
}}) {
179 print "<p><em>(Please consider adding the <tt>$Girocco::Config::mob</tt> user.\n";
180 print "<sup class=\"sup\"><span><a href=\"@{[url_path($Girocco::Config::htmlurl)]}/mob.html\">(learn more)</a></span></sup>)\n";
183 foreach my $user (@
{$h{users
}}) {
185 $mlm = " <sup class=\"sup\"><span><a href=\"@{[url_path($Girocco::Config::htmlurl)]}/mob.html\">(learn more)</a></span></sup>"
186 if $Girocco::Config
::mob
&& $user eq $Girocco::Config
::mob
;
187 print "<li><input type=\"checkbox\" name=\"user\" value=\"$user\" checked=\"1\" /> $user$mlm</li>\n";
190 <li>Add user: <input type="text" name="user" /></li>
191 <button type="button" onclick="adduseritem(this)"><b>+</b></button>
197 print '<tr><td class="formlabel">Default branch:</td><td><select size="1" name="HEAD">';
198 for ($proj->get_heads) {
199 my $selected = $proj->{HEAD
} eq $_ ?
' selected="selected"' : '';
200 print "<option$selected>".Girocco
::CGI
::html_esc
($_)."</option>";
202 print '</select></td></tr>
205 print '<tr><td class="formlabel">Tags (select to delete):</td><td>';
206 print '<select size="6" name="tags" multiple="multiple">';
207 for ($proj->get_ctag_names) {
208 print '<option>'.Girocco
::CGI
::html_esc
($_).'</option>';
210 print '</select></td></tr>
214 $gcgi->print_form_fields($Girocco::Project
::metadata_fields
, \
%h, @Girocco::Config
::project_fields
);
215 print <<EOT if $showstatusopt;
216 <tr><td class="formlabel">Enable status update emails:</td>
217 <td class="formdatatd"
218 ><input type="hidden" name="setstatusupdates" value="1"
219 /><input type="checkbox" name="statusupdates" value="1" $statuschecked /></td></tr>
222 <tr><td class="formlabel"></td><td><input type="submit" name="y0" value="$button_label" /></td></tr>
225 <script type="text/javascript">
228 var tzoffset = (new Date).getTimezoneOffset() * -60;
229 var form0 = document.forms[0];
230 if (form0 && form0.tzoffset) {
231 form0.tzoffset.value = tzoffset;