<% # API my $api = gitprep_api; # Parameters my $base_user_id = param('user'); my $base_project_id = param('project'); my $row_id = param('row_id'); # Issue my $issue = app->dbi->model('issue')->select( [ {__MY__ => '*'}, {open_user => ['id']} ], where => {'issue.row_id' => $row_id} )->one; # Pull requests my $pull_request = app->dbi->model('pull_request')->select( where => {row_id => $issue->{pull_request}} )->one; # Base information my $base_project_row_id = $pull_request->{base_project}; my $base_project = app->dbi->model('project')->select( [ {__MY__ => '*'}, {user => ['id']} ], where => {'project.row_id' => $base_project_row_id} )->one; my $base_branch = $pull_request->{base_branch}; Carp::croak "pull_request invalid user id" if $base_user_id ne $base_project->{'user.id'}; Carp::croak "pull_request invalid project id" if $base_project_id ne $base_project->{id}; # Target information my $target_project_row_id = $pull_request->{target_project}; my $target_project = app->dbi->model('project')->select( [ {__MY__ => '*'}, {user => ['id']} ], where => {'project.row_id' => $target_project_row_id} )->one; my $target_branch = $pull_request->{target_branch}; my $target_user_id = $target_project->{'user.id'}; my $target_project_id = $target_project->{id}; # Session my $session_user_row_id = $api->session_user_row_id; my $session_user_id = $api->session_user_id; # Base repository information my $base_rep_info = app->rep_info($base_user_id, $base_project_id); # Target repository information my $target_rep_info = app->rep_info($target_user_id, $base_project_id); # Working repository information my $work_rep_info = app->work_rep_info($base_user_id, $base_project_id); # Display patch if (stash('patch')) { # Lock working repository my $lock_fh = $self->app->manager->lock_rep($work_rep_info); # Prepare merge $self->app->manager->prepare_merge( $work_rep_info, $base_rep_info, $base_branch, $target_rep_info, $target_branch ); # Create patch my $patch = $self->app->manager->get_patch( $work_rep_info, $target_rep_info, $target_branch ); $self->res->headers->content_type('text/plain; charset=utf-8'); $self->render(text => $patch); return; } # Git my $git = $self->app->git; if (lc $self->req->method eq 'post') { # Access controll unless ($api->can_write_access($session_user_id, $base_user_id, $base_project_id)) { $self->reply->exception('Forbbiden'); return; } # Close pull request my $op = param('op'); if ($op eq 'close') { app->dbi->model('issue')->update( { open => 0, open_user => $session_user_row_id }, where => {row_id => $row_id} ); $self->redirect_to('current'); return; } elsif ($op eq 'reopen') { my $open_time = time; app->dbi->model('issue')->update( { open => 1, open_time => $open_time, open_user => $session_user_row_id }, where => {row_id => $row_id} ); $self->redirect_to('current'); return; } elsif ($op eq 'merge') { # Lock working repository my $lock_fh = $self->app->manager->lock_rep($work_rep_info); # Prepare merge $self->app->manager->prepare_merge( $work_rep_info, $base_rep_info, $base_branch, $target_rep_info, $target_branch ); # Merge my $merge_success = $self->app->manager->merge( $work_rep_info, $target_rep_info, $target_branch ); if ($merge_success) { # Push app->manager->push($work_rep_info, $base_branch); app->dbi->model('issue')->update( { open => 0 }, where => {row_id => $row_id} ); $self->redirect_to("/$base_user_id/$base_project_id/tree/$base_branch"); } } } # Commits my $commits = $git->forward_commits($base_rep_info, $base_branch, $target_branch); my $commits_count = @$commits; my $commits_date = {}; my $authors = {}; for my $commit (@$commits) { my $date = $commit->{age_string_date_local}; $commits_date->{$date} ||= []; $authors->{$commit->{author}} = 1; push @{$commits_date->{$date}}, $commit; } my $authors_count = keys %$authors; # Start commit my $start_commit = $git->separated_commit($base_rep_info, $base_branch, $target_branch); # End commit my $end_commit = $git->get_commit($target_rep_info, $target_branch); # Issue first message my $issue_message_first = app->dbi->model('issue_message')->select( [ {__MY__ => '*'}, {user => ['id']} ], where => {issue => $row_id, number => 1} )->one; # Check merge automatically my $merge_success; if ($api->can_write_access($session_user_id, $base_user_id, $base_project_id) && $issue->{open}) { my $lock_fh = $self->app->manager->lock_rep($work_rep_info); # Prepare merge $self->app->manager->prepare_merge( $work_rep_info, $base_rep_info, $base_branch, $target_rep_info, $target_branch ); # Check merge automatical $merge_success = $self->app->manager->merge( $work_rep_info, $target_rep_info, $target_branch ); } # HTTP repository URL my $http_rep_url = url_for("$target_user_id/$target_project_id.git")->to_abs; # SSH repository URL my $url = url_for->to_abs; $url->base(undef); my $ssh_port = config->{basic}{ssh_port}; my $rep_home = app->rep_home; my $execute_user = getpwuid($>); my $ssh_rep_url_base = defined app->config->{basic}{'ssh_rep_url_base'} ? app->config->{basic}{'ssh_rep_url_base'} : $rep_home; my $ssh_rep_url = "ssh://$execute_user\@" . $url->host . ($ssh_port ? ":$ssh_port" : '') . "$ssh_rep_url_base/$user/$project.git"; my $patch_url = url_for("/$base_user_id/$base_project_id/pull/$issue->{row_id}.patch")->to_abs; my $pre_content_base = "git checkout -b $target_user_id-$target_branch $base_branch"; my $pre_content_http = "git pull $http_rep_url $target_branch"; my $pre_content_ssh = "git pull $ssh_rep_url $target_branch"; # Commit body arguments my %commit_body_args = ( id => $end_commit->{id}, from_id => $start_commit->{id}, rev => $end_commit->{id}, from_rev => $start_commit->{id} ); %> % layout 'common', title => "Pull Requests Tags \x{30fb} $base_user_id/$base_project_id"; %= include '/include/header';
<% my $pull_title = $pull_request->{target_branch}; $pull_title =~ s/_/ /g; $pull_title = ucfirst $pull_title; %> <%= $pull_title %> #<%= $issue->{row_id} %>
% if ($issue->{open}) {
Open
% } else {
Closed
% }
% my $open_user_id = $issue->{'open_user.id'}; "><%= $open_user_id %> wants to merge <%= $commits_count %> commits into <%= $pull_request->{base_branch} %> from % if ($base_user_id ne $target_user_id) { <%= $target_user_id %> / % } <%= $pull_request->{target_branch} %>
% if (!$commits_count) {
There isn't anything to compare.
% } else {
<%= $issue_message_first->{'user.id'} %> commented <%= $api->age_string($issue_message_first->{update_time}) %>
<%= $issue_message_first->{message} %>
% for my $date (reverse sort keys %$commits_date) { % my $commits = $commits_date->{$date};
Commits on <%= $date %>
% }
%= include '/include/commit_body', %commit_body_args; % } % if ($api->can_write_access($session_user_id, $base_user_id, $base_project_id)) { % if ($commits_count && $merge_success && $issue->{open}) {
<%= "\x{2714}" %>
This branch has no conflicts with the base branch
Merging can be performed automatically.
<%= hidden_field op => 'merge' %> <%= submit_button 'Merge pull request', class => "btn btn-success" %> You can also view command line instructions.
% } % if ($issue->{open}) {
<%= hidden_field op => 'close' %> <%= submit_button 'Close pull request', class => 'btn' %>
% } else {
<%= hidden_field op => 'reopen' %> <%= submit_button 'Reopen pull request', class => 'btn' %>
% } % }
%= include '/include/footer';