gitprep / templates / auto / _new.html.ep /
36025d0 8 years ago
2 contributor
163 lines | 4.32kb
<%
  # API
  my $api = gitprep_api;
  my $session_user = session('user');

  my $op = param('op') || '';

  # Authentication
  unless ($api->logined) {
    $self->redirect_to('/');
    return;
  }
  
  my $errors;
  if ($op eq 'create') {
    # Parameters
    my $project = param('project');
    my $description = param('description');
    my $readme = param('readme');
    my $private = param('private');
    
    # Validator
    my $vc = app->vc;
    
    # Validation
    my $validation = $vc->validation;
    
    # "project"
    if (!(defined $project && length $project)) {
      $validation->add_failed(project => 'Repository name is empty');
    }
    elsif (!$vc->check($project, 'project_name')) {
      $validation->add_failed(project => 'Invalid repository name');
    }
    elsif (app->manager->exists_project($session_user, $project)) {
      $validation->add_failed(project => 'Repository already exists');
    }
    
    # "description"
    $description ||= '';
    
    # "readme"
    $readme = $readme ? 1 :0;
    
    # "private"
    $private = $private ? 1 : 0;
    
    # Git
    if ($validation->is_valid) {
      # Not logined
      unless ($api->logined) {
        return $self->reply->exception;
      }
      
      my $manager = app->manager;
      # Create repository
      eval {
        $manager->create_project(
          $session_user,
          $project,
          {description => $description, readme => $readme, private => $private}
        );
      };
      
      if (my $e = $@) {
        app->log->error(url_for . ": $e");
        $errors = ['Internal error'];
      }
      else {
        $self->redirect_to("/$session_user/$project");
        return;
      }
    }
    else { $errors = $validation->messages }
  }
%>

% layout 'common', title => 'Create a New Repository';

  %= include '/include/header', no_project_header => 1;
  
  <div class="new-container">
    % if ($errors) {
      <div class="alert alert-error">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        % for my $error (@$errors) {
          <p><%= $error %></p>
        % }
      </div>
    % }
    <div class="new-title-container">
      <div class="new-title">
        Create a new repository
      </div>
      <div class="new-description">
        A repository contains all the files for your project, including the revision history.
      </div>
    </div>
    <form action="<%= url_for->query(op => 'create') %>" method="post">
      <div class="new-repository">
        <table>
          <tr>
            <td>
              <b>Owner</b>
            </td>
            <td>
            
            </td>
            <td>
              <b>Repository name</b>
            </td>
          </tr>
          <tr>
            <td>
              <i class="icon-user"></i><%= $session_user %>
            </td>
            <td style="padding:0 10px">
              /
            </td>
            <td>
              <%= text_field 'project'%>
            </td>
          </tr>
        </table>
        <div class="2th-child">
          <b>Description</b> <span style="color:#767676">(optional)</span>
        </div>
        <div class="last-child">
          <%= text_field 'description' %>
        </div>
      </div>
      <ul class="new-private">
        <li>
          <div>
            <%= radio_button private => 0, checked => undef %><span>Public</span>
          </div>
          <div class="last-child">
            Anyone can see this repository. You choose who can commit.
          </div>
        </li>
        <li>
          <div>
            <%= radio_button private => 1 %><span>Private</span>
          </div>
          <div class="last-child">
            You choose who can see and commit to this repository.
          </div>
        </li>
      </ul>
      
      <div class="new-readme">
        <div>
          <%= check_box readme => 1 %><span>Initialize this this repository with a README<span>
        </div>
        <div class="last-child">
          This will let you immediately clone the repository to your computer. Skip this step if you’re importing an existing repository.
        </div>
      </div>
      
      <input type="submit" class="btn btn-success" value="Create repository">
    </form>
  </div>
  %= include '/include/footer';