wrote code to corelate issues and code revisions.

changed the code revision view to show corelated issues
This commit is contained in:
hyung-hwan 2016-01-22 18:12:06 +00:00
parent ab7156eb67
commit fdfa5ecaa0
22 changed files with 418 additions and 207 deletions

View File

@ -142,7 +142,7 @@ CREATE TABLE issue_change (
PRIMARY KEY (projectid, id, sno), PRIMARY KEY (projectid, id, sno),
KEY issue_update_time (projectid, id, updatedon), KEY issue_update_time (projectid, id, updatedon),
CONSTRAINT issue_update_id FOREIGN KEY (projectid,id) REFERENCES issue(projectid,id) CONSTRAINT issue_change_id FOREIGN KEY (projectid,id) REFERENCES issue(projectid,id)
ON DELETE RESTRICT ON UPDATE CASCADE ON DELETE RESTRICT ON UPDATE CASCADE
) charset=utf8 engine=InnoDB; ) charset=utf8 engine=InnoDB;
@ -168,6 +168,31 @@ CREATE TABLE issue_change_file_list (
ON DELETE RESTRICT ON UPDATE CASCADE ON DELETE RESTRICT ON UPDATE CASCADE
) charset=utf8 engine=InnoDB; ) charset=utf8 engine=InnoDB;
CREATE TABLE issue_coderev (
projectid VARCHAR(32) NOT NULL,
issueid BIGINT NOT NULL,
codeproid VARCHAR(32) NOT NULL,
coderev VARCHAR(64) NOT NULL, -- git commit id is 40 characters. subversion revision is a number.
UNIQUE KEY issue_coderev_uid(projectid, issueid, codeproid, coderev),
KEY issue_coderev_codekey (codeproid, coderev),
KEY issue_coderev_issuekey (projectid, issueid),
CONSTRAINT issue_coderev_projectid FOREIGN KEY (projectid) REFERENCES project(id)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT issue_coderev_codeproid FOREIGN KEY (codeproid) REFERENCES project(id)
ON DELETE RESTRICT ON UPDATE CASCADE
-- Commit message is typypicall free text. Its issue reference could be error-prone.
-- So i won't have this constraint enforced.
-- CONSTRAINT issue_coderev_issueid FOREIGN KEY (projectid,issueid) REFERENCES issue(projectid,id)
-- ON DELETE RESTRICT ON UPDATE CASCADE
) charset=utf8 engine=InnoDB;
CREATE TABLE file ( CREATE TABLE file (
projectid VARCHAR(32) NOT NULL, projectid VARCHAR(32) NOT NULL,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,

View File

@ -109,6 +109,45 @@ sub close_database
$dbh->disconnect (); $dbh->disconnect ();
} }
sub find_issue_reference_in_commit_message
{
my ($dbh, $prefix, $projectid, $revision, $commit_message) = @_;
# find [[#IXXXX]]
my @issue_ids = ($commit_message =~ /\[\[#I(\d+)\]\]/g);
# find unique issue ids in the findings.
my %tmp;
@tmp{@issue_ids}=1;
my @unique_issue_ids=keys %tmp;
$dbh->begin_work ();
my $query = $dbh->prepare ("DELETE FROM ${QC}${prefix}issue_coderev${QC} WHERE ${QC}codeproid${QC}=? AND ${QC}coderev${QC}=?");
if (!$query || !$query->execute ($projectid, $revision))
{
my $errstr = $dbh->errstr();
if ($query) { $query->finish (); }
$dbh->rollback ();
return (-1, $errstr);
}
$query->finish ();
for my $issue_id(@unique_issue_ids)
{
my $query = $dbh->prepare ("INSERT INTO ${QC}${prefix}issue_coderev${QC} (${QC}projectid${QC},${QC}issueid${QC},${QC}codeproid${QC},${QC}coderev${QC}) VALUES (?,?,?,?)");
if ($query)
{
# ignore errors
$query->execute ($projectid, $issue_id, $projectid, $revision);
$query->finish ();
}
}
$dbh->commit ();
return (0, undef);
}
sub write_commit_log sub write_commit_log
{ {
my ($dbh, $prefix, $projectid, $revision, $userid) = @_; my ($dbh, $prefix, $projectid, $revision, $userid) = @_;
@ -136,7 +175,7 @@ sub write_commit_log
if (!$query || !$query->execute ('code', $projectid, $message, 'commit', $userid)) if (!$query || !$query->execute ('code', $projectid, $message, 'commit', $userid))
{ {
my $errstr = $dbh->errstr(); my $errstr = $dbh->errstr();
$query->finish (); if ($query) { $query->finish (); }
$dbh->rollback (); $dbh->rollback ();
return (-1, $errstr); return (-1, $errstr);
} }
@ -185,8 +224,8 @@ sub get_commit_message
return undef; return undef;
} }
my $author = $fs->revision_prop ($REV, 'svn:log'); my $logmsg = $fs->revision_prop ($REV, 'svn:log');
return $author; return $logmsg;
} }
@ -317,6 +356,7 @@ sub email_message_to_project_members
my $query = $dbh->prepare ("SELECT ${QC}userid${QC} FROM ${QC}${prefix}project_membership${QC} WHERE ${QC}projectid${QC}=?"); my $query = $dbh->prepare ("SELECT ${QC}userid${QC} FROM ${QC}${prefix}project_membership${QC} WHERE ${QC}projectid${QC}=?");
if (!$query || !$query->execute ($projectid)) if (!$query || !$query->execute ($projectid))
{ {
if ($query) { $query->finish (); }
return (-1, $dbh->errstr()); return (-1, $dbh->errstr());
} }
@ -408,6 +448,9 @@ if (!defined($dbh))
exit (1); exit (1);
} }
my $raw_commit_message = get_commit_message();
find_issue_reference_in_commit_message ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $raw_commit_message);
write_commit_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $AUTHOR); write_commit_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $AUTHOR);
if (lc($cfg->{commit_notification}) eq 'yes') if (lc($cfg->{commit_notification}) eq 'yes')
@ -424,10 +467,9 @@ if (lc($cfg->{commit_notification}) eq 'yes')
$commit_message = format_commit_url($cfg->{commit_notification_url}, $REPOBASE, $AUTHOR, $REV); $commit_message = format_commit_url($cfg->{commit_notification_url}, $REPOBASE, $AUTHOR, $REV);
} }
my $m = get_commit_message (); if (defined($raw_commit_message))
if (defined($m))
{ {
$commit_message = $commit_message . "\n" . $m; $commit_message = $commit_message . "\n" . $raw_commit_message;
} }

View File

@ -7,9 +7,13 @@ use DBI;
use File::Basename; use File::Basename;
use POSIX qw(strftime); use POSIX qw(strftime);
use SVN::Core;
use SVN::Repos;
use SVN::Fs;
my $CFG_FILE = '@CFGDIR@/codepot.ini'; my $CFG_FILE = '@CFGDIR@/codepot.ini';
my $REPO = $ARGV[0]; my $REPOFS = $ARGV[0];
my $REPOBASE = basename($REPO); my $REPOBASE = basename($REPOFS);
my $REV = $ARGV[1]; my $REV = $ARGV[1];
my $USER = $ARGV[2]; my $USER = $ARGV[2];
my $PROPNAME = $ARGV[3]; my $PROPNAME = $ARGV[3];
@ -88,6 +92,46 @@ sub close_database
$dbh->disconnect (); $dbh->disconnect ();
} }
sub find_issue_reference_in_commit_message
{
my ($dbh, $prefix, $projectid, $revision, $commit_message) = @_;
# find [[#IXXXX]]
my @issue_ids = ($commit_message =~ /\[\[#I(\d+)\]\]/g);
# find unique issue ids in the findings.
my %tmp;
@tmp{@issue_ids}=1;
my @unique_issue_ids=keys %tmp;
$dbh->begin_work ();
my $query = $dbh->prepare ("DELETE FROM ${QC}${prefix}issue_coderev${QC} WHERE ${QC}codeproid${QC}=? AND ${QC}coderev${QC}=?");
if (!$query || !$query->execute ($projectid, $revision))
{
my $errstr = $dbh->errstr();
if ($query) { $query->finish (); }
$dbh->rollback ();
return (-1, $errstr);
}
$query->finish ();
for my $issue_id(@unique_issue_ids)
{
my $query = $dbh->prepare ("INSERT INTO ${QC}${prefix}issue_coderev${QC} (${QC}projectid${QC},${QC}issueid${QC},${QC}codeproid${QC},${QC}coderev${QC}) VALUES (?,?,?,?)");
if ($query)
{
# ignore errors
$query->execute ($projectid, $issue_id, $projectid, $revision);
$query->finish ();
}
}
$dbh->commit ();
return (0, undef);
}
sub write_revprop_change_log sub write_revprop_change_log
{ {
my ($dbh, $prefix, $projectid, $revision, $userid, $propname, $action) = @_; my ($dbh, $prefix, $projectid, $revision, $userid, $propname, $action) = @_;
@ -106,7 +150,7 @@ sub write_revprop_change_log
if (!$query || !$query->execute ('code', $projectid, $message, $createdon, 'revpropchange', $userid)) if (!$query || !$query->execute ('code', $projectid, $message, $createdon, 'revpropchange', $userid))
{ {
my $errstr = $dbh->errstr(); my $errstr = $dbh->errstr();
$query->finish (); if ($query) { $query->finish (); }
$dbh->rollback (); $dbh->rollback ();
return (-1, $errstr); return (-1, $errstr);
} }
@ -116,6 +160,27 @@ sub write_revprop_change_log
return (0, undef); return (0, undef);
} }
sub get_commit_message
{
my $pool = SVN::Pool->new(undef);
my $svn = eval { SVN::Repos::open ($REPOFS, $pool) };
if (!defined($svn))
{
print (STDERR "Cannot open svn - $REPOFS\n");
return undef;
}
my $fs = $svn->fs ();
if (!defined($fs))
{
print (STDERR "Cannot open fs - $REPOFS\n");
return undef;
}
my $logmsg = $fs->revision_prop ($REV, 'svn:log');
return $logmsg;
}
#------------------------------------------------------------ #------------------------------------------------------------
# MAIN # MAIN
#------------------------------------------------------------ #------------------------------------------------------------
@ -134,6 +199,9 @@ if (!defined($dbh))
exit (1); exit (1);
} }
my $raw_commit_message = get_commit_message();
find_issue_reference_in_commit_message ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $raw_commit_message);
write_revprop_change_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $USER, $PROPNAME, $ACTION); write_revprop_change_log ($dbh, $cfg->{database_prefix}, $REPOBASE, $REV, $USER, $PROPNAME, $ACTION);
close_database ($dbh); close_database ($dbh);

View File

@ -724,7 +724,7 @@ class Code extends Controller
{ {
$this->load->model ('ProjectModel', 'projects'); $this->load->model ('ProjectModel', 'projects');
$this->load->model ('SubversionModel', 'subversion'); $this->load->model ('SubversionModel', 'subversion');
$this->load->model ('CodeReviewModel', 'code_review'); $this->load->model ('CodeModel', 'code');
$login = $this->login->getUser (); $login = $this->login->getUser ();
$revision_saved = -1; $revision_saved = -1;
@ -759,10 +759,10 @@ class Code extends Controller
} }
else else
{ {
$review_sno = $this->code_review->insertReview ($projectid, $rev, $login['id'], $review_comment); $review_sno = $this->code->insertReview ($projectid, $rev, $login['id'], $review_comment);
if ($review_sno === FALSE) if ($review_sno === FALSE)
{ {
$status = 'error - ' . $this->code_review->getErrorMessage(); $status = 'error - ' . $this->code->getErrorMessage();
} }
else else
{ {
@ -792,7 +792,7 @@ class Code extends Controller
{ {
$this->load->model ('ProjectModel', 'projects'); $this->load->model ('ProjectModel', 'projects');
$this->load->model ('SubversionModel', 'subversion'); $this->load->model ('SubversionModel', 'subversion');
$this->load->model ('CodeReviewModel', 'code_review'); $this->load->model ('CodeModel', 'code');
$login = $this->login->getUser (); $login = $this->login->getUser ();
$revision_saved = -1; $revision_saved = -1;
@ -832,9 +832,9 @@ class Code extends Controller
} }
else else
{ {
if ($this->code_review->updateReview ($projectid, $rev, (integer)$review_no, $login['id'], $review_comment, TRUE) === FALSE) if ($this->code->updateReview ($projectid, $rev, (integer)$review_no, $login['id'], $review_comment, TRUE) === FALSE)
{ {
$status = 'error - ' . $this->code_review->getErrorMessage(); $status = 'error - ' . $this->code->getErrorMessage();
} }
else else
{ {
@ -993,8 +993,8 @@ class Code extends Controller
{ {
$this->load->model ('ProjectModel', 'projects'); $this->load->model ('ProjectModel', 'projects');
$this->load->model ('SubversionModel', 'subversion'); $this->load->model ('SubversionModel', 'subversion');
$this->load->model ('CodeReviewModel', 'code_review'); $this->load->model ('CodeModel', 'code');
$login = $this->login->getUser (); $login = $this->login->getUser ();
if (CODEPOT_SIGNIN_COMPULSORY && $login['id'] == '') if (CODEPOT_SIGNIN_COMPULSORY && $login['id'] == '')
redirect ("main/signin/" . $this->converter->AsciiTohex(current_url())); redirect ("main/signin/" . $this->converter->AsciiTohex(current_url()));
@ -1048,7 +1048,11 @@ class Code extends Controller
if (array_key_exists('rev', $h)) $r_rev = $h['rev']; if (array_key_exists('rev', $h)) $r_rev = $h['rev'];
} }
} }
$reviews = $this->code_review->getReviews ($projectid, $r_rev);
$related_issues = $this->code->getRelatedIssues ($projectid, $r_rev);
if ($related_issues == FALSE) $related_issues = array();
$reviews = $this->code->getReviews ($projectid, $r_rev);
if ($reviews === FALSE) if ($reviews === FALSE)
{ {
$data['project'] = $project; $data['project'] = $project;
@ -1122,7 +1126,8 @@ class Code extends Controller
$data['headpath'] = $path; $data['headpath'] = $path;
$data['file'] = $file; $data['file'] = $file;
$data['reviews'] = $reviews; $data['reviews'] = $reviews;
$data['related_issues'] = $related_issues;
$data['revision'] = $rev; $data['revision'] = $rev;
$data['prev_revision'] = $prev_revision; $data['prev_revision'] = $prev_revision;
$data['next_revision'] = $this->subversion->getNextRev ($projectid, $path, $rev); $data['next_revision'] = $this->subversion->getNextRev ($projectid, $path, $rev);

View File

@ -1,6 +1,6 @@
wwwdir=$(WWWDIR)/codepot/models wwwdir=$(WWWDIR)/codepot/models
www_DATA = \ www_DATA = \
codereviewmodel.php \ codemodel.php \
dbloginmodel.php \ dbloginmodel.php \
filemodel.php \ filemodel.php \
index.html \ index.html \

View File

@ -145,7 +145,7 @@ sysconfdir = @sysconfdir@
target_alias = @target_alias@ target_alias = @target_alias@
wwwdir = $(WWWDIR)/codepot/models wwwdir = $(WWWDIR)/codepot/models
www_DATA = \ www_DATA = \
codereviewmodel.php \ codemodel.php \
dbloginmodel.php \ dbloginmodel.php \
filemodel.php \ filemodel.php \
index.html \ index.html \

View File

@ -1,6 +1,6 @@
<?php <?php
class CodeReviewModel extends Model class CodeModel extends Model
{ {
protected $errmsg = ''; protected $errmsg = '';
@ -9,12 +9,36 @@ class CodeReviewModel extends Model
return $this->errmsg; return $this->errmsg;
} }
function CodeReviewModel () function CodeModel ()
{ {
parent::Model (); parent::Model ();
$this->load->database (); $this->load->database ();
} }
function getRelatedIssues ($projectid, $revision)
{
$this->db->trans_begin ();
$this->db->from ('issue');
$this->db->join ('issue_coderev', 'issue.projectid = issue_coderev.projectid AND issue.id = issue_coderev.issueid');
//$this->db->where ('issue_coderev.projectid', (string)$projectid);
$this->db->where ('issue_coderev.codeproid', (string)$projectid);
$this->db->where ('issue_coderev.coderev', $revision);
$this->db->order_by ('issue.projectid ASC');
$this->db->order_by ('issue_coderev.issueid ASC');
$this->db->select ('issue.projectid, issue_coderev.issueid, issue.summary, issue.type, issue.status, issue.priority, issue.owner');
$query = $this->db->get ();
if ($this->db->trans_status() === FALSE)
{
$this->errmsg = $this->db->_error_message();
$this->db->trans_rollback ();
return FALSE;
}
$this->db->trans_commit ();
return $query->result();
}
function getReviews ($projectid, $revision) function getReviews ($projectid, $revision)
{ {
$this->db->trans_begin (); $this->db->trans_begin ();

View File

@ -255,7 +255,7 @@ $this->load->view (
<div style='clear: both'></div> <div style='clear: both'></div>
</div> </div>
<div id='code_blame_metadata_body'> <div id='code_blame_metadata_body' class='codepot-metadata-collapsible-body'>
<div class='codepot-plain-text-view'> <div class='codepot-plain-text-view'>
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre> <pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
</div> </div>

View File

@ -287,7 +287,7 @@ $this->load->view (
<div style='clear: both'></div> <div style='clear: both'></div>
</div> </div>
<div id='code_diff_metadata_body'> <div id='code_diff_metadata_body' class='codepot-metadata-collapsible-body'>
<div class='codepot-plain-text-view'> <div class='codepot-plain-text-view'>
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre> <pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
</div> </div>

View File

@ -281,7 +281,7 @@ $this->load->view (
<div style='clear: both'></div> <div style='clear: both'></div>
</div> </div>
<div id='code_file_metadata_body'> <div id='code_file_metadata_body' class='codepot-metadata-collapsible-body'>
<div class='codepot-plain-text-view'> <div class='codepot-plain-text-view'>
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre> <pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
</div> </div>

View File

@ -883,7 +883,7 @@ $this->load->view (
<div style='clear: both;'></div> <div style='clear: both;'></div>
</div> </div>
<div id='code_folder_metadata_body'> <div id='code_folder_metadata_body' class='codepot-metadata-collapsible-body'>
<div class='codepot-plain-text-view'> <div class='codepot-plain-text-view'>
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre> <pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
</div> </div>

View File

@ -362,7 +362,6 @@ $(function() {
} }
); );
function make_edit_review_comment_ok_function (no) function make_edit_review_comment_ok_function (no)
{ {
var form_name = '#code_revision_edit_review_comment_form_' + no; var form_name = '#code_revision_edit_review_comment_form_' + no;
@ -673,10 +672,41 @@ $history = $file['history'];
<div style='clear: both'></div> <div style='clear: both'></div>
</div> </div>
<div id="code_revision_metadata_body">
<div id="code_revision_metadata_body" class='codepot-metadata-collapsible-body'>
<div class="codepot-plain-text-view"> <div class="codepot-plain-text-view">
<pre id="code_revision_metadata_text"><?php print htmlspecialchars($history['msg']); ?></pre> <?php
$transformed_message = htmlspecialchars($history['msg']);
foreach ($related_issues as $ri)
{
$hex_issueid = $this->converter->AsciiToHex ($ri->issueid);
//$transformed_message = preg_replace ("/\[\[#I{$ri->issueid}\]\]/", anchor ("/issue/show/{$ri->projectid}/{$hex_issueid}", $ri->issueid . ':' . htmlspecialchars($ri->summary), "class='codepot-issue-type-{$ri->type}'"), $transformed_message);
//$transformed_message = preg_replace ("/\[\[(#I{$ri->issueid})\]\]/", "[[<span class='codepot-issue-type-{$ri->type}'>\${1}</span>]]", $transformed_message);
$transformed_message = preg_replace (
"/\[\[(#I{$ri->issueid})\]\]/",
'[[' . anchor ("/issue/show/{$ri->projectid}/{$hex_issueid}", "\${1}", "class='codepot-issue-type-{$ri->type}'") . ']]',
$transformed_message
);
}
?>
<pre id="code_revision_metadata_text"><?php print $transformed_message; ?></pre>
</div> </div>
<?php
if (!empty($related_issues))
{
print '<div><ul id="code_revision_related_issue_list" class="codepot-horizontal-list">';
foreach ($related_issues as $ri)
{
$hex_issueid = $this->converter->AsciiToHex ($ri->issueid);
print '<li>';
print anchor ("/issue/show/{$ri->projectid}/{$hex_issueid}", $ri->issueid . ':' . htmlspecialchars($ri->summary), "class='codepot-issue-type-{$ri->type}'");
print '</li>';
}
print '</ul></div>';
}
?>
<div style='clear: both'></div>
</div> </div>
</div> </div>

View File

@ -613,7 +613,7 @@ $this->load->view (
<div id='file_show_metadata' class='collapsible-box'> <div id='file_show_metadata' class='collapsible-box'>
<div id='file_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('Metadata')?></div> <div id='file_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('Metadata')?></div>
<div id='file_show_metadata_body'> <div id='file_show_metadata_body' class='codepot-metadata-collapsible-body'>
<ul id='file_show_metadata_list'> <ul id='file_show_metadata_list'>
<li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($file->createdon); ?></li> <li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($file->createdon); ?></li>
<li><?php print $this->lang->line('Created by')?> <?php print htmlspecialchars($file->createdby); ?></li> <li><?php print $this->lang->line('Created by')?> <?php print htmlspecialchars($file->createdby); ?></li>
@ -626,7 +626,7 @@ $this->load->view (
<div id='file_show_files' class='collapsible-box'> <div id='file_show_files' class='collapsible-box'>
<div id='file_show_files_header' class='collapsible-box-header'><?php print $this->lang->line('Files')?></div> <div id='file_show_files_header' class='collapsible-box-header'><?php print $this->lang->line('Files')?></div>
<div id='file_show_files_body'> <div id='file_show_files_body' class='codepot-metadata-collapsible-body'>
<?php if (isset($login['id']) && $login['id'] != ''): ?> <?php if (isset($login['id']) && $login['id'] != ''): ?>
<div> <div>
<a id="file_show_add_file_button" href='#'><?php print $this->lang->line('Add')?></a> <a id="file_show_add_file_button" href='#'><?php print $this->lang->line('Add')?></a>

View File

@ -927,7 +927,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
if ($old == NULL || $issue->type != $old->type) if ($old == NULL || $issue->type != $old->type)
{ {
printf ('<li class="issue-type-%s">', $issue->type); printf ('<li class="codepot-issue-type-%s">', $issue->type);
print $con->lang->line('Type'); print $con->lang->line('Type');
print ': '; print ': ';
print htmlspecialchars($type); print htmlspecialchars($type);
@ -936,7 +936,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
if ($old == NULL || $issue->status != $old->status) if ($old == NULL || $issue->status != $old->status)
{ {
printf ('<li class="issue-status-%s">', $issue->status); printf ('<li class="codepot-issue-status-%s">', $issue->status);
print $con->lang->line('Status'); print $con->lang->line('Status');
print ': '; print ': ';
print htmlspecialchars($status); print htmlspecialchars($status);
@ -945,7 +945,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
if ($old == NULL || $issue->priority != $old->priority) if ($old == NULL || $issue->priority != $old->priority)
{ {
printf ('<li class="issue-priority-%s">', $issue->priority); printf ('<li class="codepot-issue-priority-%s">', $issue->priority);
print $con->lang->line('Priority'); print $con->lang->line('Priority');
print ': '; print ': ';
print htmlspecialchars($priority); print htmlspecialchars($priority);
@ -954,7 +954,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
if ($old == NULL || $issue->owner != $old->owner) if ($old == NULL || $issue->owner != $old->owner)
{ {
print '<li class="issue-owner">'; print '<li class="codepot-issue-owner">';
if ($issue->owner != '') if ($issue->owner != '')
{ {
print $con->lang->line('Owner'); print $con->lang->line('Owner');
@ -994,20 +994,31 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
<div id='issue_show_state' class='collapsible-box'> <div id='issue_show_state' class='collapsible-box'>
<div id='issue_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('State')?></div> <div id='issue_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('State')?></div>
<div id='issue_show_metadata_body'> <div id='issue_show_metadata_body' class='codepot-metadata-collapsible-body'>
<ul id='issue_show_metadata_list' class='codepot-issue-horizontal-list'> <ul id='issue_show_metadata_list' class='codepot-horizontal-list'>
<li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($issue->createdon); ?></li> <li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($issue->createdon); ?></li>
<li><?php print $this->lang->line('Created by')?> <?php print htmlspecialchars($issue->createdby); ?></li> <li><?php print $this->lang->line('Created by')?> <?php print htmlspecialchars($issue->createdby); ?></li>
<li><?php print $this->lang->line('Last updated on')?> <?php print codepot_dbdatetodispdate($issue->updatedon); ?></li> <li><?php print $this->lang->line('Last updated on')?> <?php print codepot_dbdatetodispdate($issue->updatedon); ?></li>
<li><?php print $this->lang->line('Last updated by')?> <?php print htmlspecialchars($issue->updatedby); ?></li> <li><?php print $this->lang->line('Last updated by')?> <?php print htmlspecialchars($issue->updatedby); ?></li>
</ul> </ul>
<ul id='issue_show_state_list' class='codepot-issue-horizontal-list'> <ul id='issue_show_state_list' class='codepot-horizontal-list'>
<?php <?php
print_issue_state ($this, $issue, NULL, $issue_type_array, $issue_status_array, $issue_priority_array); print_issue_state ($this, $issue, NULL, $issue_type_array, $issue_status_array, $issue_priority_array);
?> ?>
</ul> </ul>
<?php
if (!empty($related_code_revisions))
{
print '<ul id="issue_show_coderev_list" class="codepot-horizontal-list">';
foreach ($related_code_revisions as $r)
{
}
print '</ul>';
}
?>
<div style='clear: both'></div> <div style='clear: both'></div>
</div> </div>
</div> </div>
@ -1088,7 +1099,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
print '<div style="clear: both;"></div>'; print '<div style="clear: both;"></div>';
print '</div>'; print '</div>';
print '<ul id="issue_show_change_start_list" class="codepot-issue-horizontal-list">'; print '<ul id="issue_show_change_start_list" class="codepot-horizontal-list">';
print_issue_state ($this, $new, NULL, $issue_type_array, $issue_status_array, $issue_priority_array); print_issue_state ($this, $new, NULL, $issue_type_array, $issue_status_array, $issue_priority_array);
print '</ul>'; print '</ul>';
print '<div style="clear: both;"></div>'; print '<div style="clear: both;"></div>';
@ -1118,7 +1129,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
print '<div style="clear: both;"></div>'; print '<div style="clear: both;"></div>';
print '</div>'; print '</div>';
print '<ul class="codepot-issue-horizontal-list">'; print '<ul class="codepot-horizontal-list">';
print_issue_state ($this, $new, $old, $issue_type_array, $issue_status_array, $issue_priority_array); print_issue_state ($this, $new, $old, $issue_type_array, $issue_status_array, $issue_priority_array);
print '</ul>'; print '</ul>';

View File

@ -549,7 +549,7 @@ $this->load->view (
<?php print $this->lang->line('WIKI_ATTACHMENTS')?> <?php print $this->lang->line('WIKI_ATTACHMENTS')?>
<a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a> <a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a>
</div> </div>
<div id='wiki_edit_files_body'> <div id='wiki_edit_files_body' class='codepot-metadata-collapsible-body'>
<input type='file' id='wiki_edit_add_files' name='wiki_add_files' multiple='' autocomplete='off' style='color: transparent; visibility: hidden; display: none;' /> <input type='file' id='wiki_edit_add_files' name='wiki_add_files' multiple='' autocomplete='off' style='color: transparent; visibility: hidden; display: none;' />
<ul id='wiki_edit_file_list'> <ul id='wiki_edit_file_list'>

View File

@ -445,6 +445,13 @@ $(function () {
shift: false, shift: false,
alt: true alt: true
}, },
{ // alt-k
command: 'insertOrderedList',
key: 'K',
meta: false,
shift: false,
alt: true
},
{ // alt-p { // alt-p
command: 'append-pre', command: 'append-pre',
key: 'P', key: 'P',
@ -592,7 +599,7 @@ $this->load->view (
<?php print $this->lang->line('WIKI_ATTACHMENTS')?> <?php print $this->lang->line('WIKI_ATTACHMENTS')?>
<a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a> <a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a>
</div> </div>
<div id='wiki_edit_files_body'> <div id='wiki_edit_files_body' class='codepot-metadata-collapsible-body'>
<input type='file' id='wiki_edit_add_files' name='wiki_add_files' multiple='' autocomplete='off' style='color: transparent; visibility: hidden; display: none;' /> <input type='file' id='wiki_edit_add_files' name='wiki_add_files' multiple='' autocomplete='off' style='color: transparent; visibility: hidden; display: none;' />
<ul id='wiki_edit_file_list'> <ul id='wiki_edit_file_list'>

View File

@ -252,7 +252,7 @@ $this->load->view (
<div id='wiki_show_metadata' class='collapsible-box'> <div id='wiki_show_metadata' class='collapsible-box'>
<div id='wiki_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('Metadata')?></div> <div id='wiki_show_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('Metadata')?></div>
<div id='wiki_show_metadata_body'> <div id='wiki_show_metadata_body' class='codepot-metadata-collapsible-body'>
<ul id='wiki_show_metadata_list'> <ul id='wiki_show_metadata_list'>
<li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($wiki->createdon); ?></li> <li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($wiki->createdon); ?></li>

View File

@ -78,17 +78,6 @@
float: right; float: right;
} }
#code_folder_metadata_body,
#code_file_metadata_body,
#code_blame_metadata_body,
#code_revision_metadata_body,
#code_diff_metadata_body,
#code_diff_metadata_against_body {
background-color: #FCFCFC;
padding: 0.2em 0.2em 0.2em 0.2em;
margin: 0;
}
#code_diff_metadata_body, #code_diff_metadata_body,
#code_diff_metadata_against_body { #code_diff_metadata_against_body {
border: none; border: none;
@ -240,14 +229,28 @@
line-height: 1.2em; line-height: 1.2em;
padding: 0.2em 0.2em 0.2em 0.2em; padding: 0.2em 0.2em 0.2em 0.2em;
} }
/*
#code_revision_result_files_table, #code_revision_related_issue_list {
#code_revision_result_properties_table { padding-top: 0.3em;
padding: 0.5em 0 0.5em 0; border-top: 1px dashed #EAEAEA
background: inherit; }
line-height: 1.5em;
#code_revision_related_issue_list li {
margin-top: 0.1em;
margin-bottom: 0.1em;
}
#code_revision_metadata_text a,
#code_revision_related_issue_list a {
padding: 0.3em;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
color: inherit;
filter:alpha(opacity=85); /* IE */
opacity: 0.85; /* Safari, Opera */
-moz-opacity:0.85; /* FireFox */
} }
*/
#code_revision_result_files_table td, #code_revision_result_files_table td,
#code_revision_result_properties_table td { #code_revision_result_properties_table td {

View File

@ -600,6 +600,12 @@ pre, code, tt {
padding-right: .2em; padding-right: .2em;
} }
.codepot-metadata-collapsible-body {
background-color: #FCFCFC !important;
padding: 0.4em 0.2em 0.2em 0.2em !important;
margin: 0px !important;
}
span.codepot-open-issue-count { span.codepot-open-issue-count {
-moz-border-radius: 45%; -moz-border-radius: 45%;
-webkit-border-radius: 45%; -webkit-border-radius: 45%;
@ -1015,16 +1021,135 @@ pre.codepot-line-numbered span.codepot-line-number-clear {
} }
.codepot-committer-icon-24x24 { .codepot-committer-icon-24x24 {
width: 24px; width: 24px;
height: 24px; height: 24px;
vertical-align: middle; vertical-align: middle;
margin-right: 2px; margin-right: 2px;
-moz-border-radius: 3px; -moz-border-radius: 3px;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
border-radius: 3px; border-radius: 3px;
} }
/* === list === */
ul.codepot-horizontal-list {
clear: both;
padding: 0;
margin: 0;
list-style: outside none none !important;
}
ul.codepot-horizontal-list li {
padding: 0.2em 0.2em 0.2em 0.2em;
margin: 0 0.2em 0 0.2em;
float: left;
}
/* === common issue class === */
.codepot-issue-type-defect {
background-color: #D9534F;
color: #FFFFFF !important;
}
.codepot-issue-type-request {
background-color: #44AD8E;
color: #FFFFFF !important;
}
.codepot-issue-type-enhancement {
background-color: #558FAD;
color: #FFFFFF !important;
}
.codepot-issue-type-feature {
background-color: #5577BC;
color: #FFFFFF !important;
}
.codepot-issue-type-other {
background-color: #4E8BCA;
color: #FFFFFF !important;
}
.codepot-issue-status-new {
background-color: #44AD8E;
color: #FFFFFF !important;
}
.codepot-issue-status-accepted {
background-color: #44AD8E;
color: #FFFFFF !important;
}
.codepot-issue-status-rejected {
background-color: #AD448E;
color: #FFFFFF !important;
}
.codepot-issue-status-started {
background-color: #44ADAD;
color: #FFFFFF !important;
}
.codepot-issue-status-stalled {
background-color: #ADAD8E;
color: #FFFFFF !important;
}
.codepot-issue-status-testing {
background-color: #44ADBB;
color: #FFFFFF !important;
}
.codepot-issue-status-resolved {
background-color: #34AD56;
color: #FFFFFF !important;
}
.codepot-issue-status-worked-around {
background-color: #65AD67;
color: #FFFFFF !important;
}
.codepot-issue-status-other {
background-color: #888888;
color: #FFFFFF !important;
}
.codepot-issue-type-other {
background-color: #4E8BCA;
color: #FFFFFF !important;
}
.codepot-issue-priority-critical {
background-color: #D9534F;
color: #FFFFFF !important;
}
.codepot-issue-priority-high {
background-color: #B9534F;
color: #FFFFFF !important;
}
.codepot-issue-priority-medium {
background-color: #99534F;
color: #FFFFFF !important;
}
.codepot-issue-priority-low {
background-color: #EEE39E;
color: #FFFFFF !important;
}
.codepot-issue-priority-other {
background-color: #FFF39E;
}
.codepot-issue-owner {
background-color: #FFF39E;
}
/* === footer === */ /* === footer === */
.codepot-footer-pusher { .codepot-footer-pusher {
clear: both; clear: both;

View File

@ -22,13 +22,6 @@
white-space: nowrap; white-space: nowrap;
} }
#file_show_metadata_body,
#file_show_files_body {
background-color: #FCFCFC;
margin: 0 !important;
padding: 0.5em 0.5em 0.5em 0.5em !important;
}
#file_show_metadata_list { #file_show_metadata_list {
padding: 0 !important; padding: 0 !important;
margin: 0 0 0.5em 0 !important; margin: 0 0 0.5em 0 !important;

View File

@ -1,18 +1,6 @@
ul.codepot-issue-horizontal-list {
clear: both;
padding: 0;
margin: 0;
list-style: outside none none !important;
}
ul.codepot-issue-horizontal-list li { .codepot-issue-start ul.codepot-horizontal-list,
padding: 0.2em 0.2em 0.2em 0.2em; .codepot-issue-change ul.codepot-horizontal-list {
margin: 0 0.2em 0 0.2em;
float: left;
}
.codepot-issue-start ul.codepot-issue-horizontal-list,
.codepot-issue-change ul.codepot-issue-horizontal-list {
padding: 0.3em 0 0.3em 0; padding: 0.3em 0 0.3em 0;
} }
@ -65,111 +53,6 @@ textarea.codepot-issue-edit-comment {
font-size: 0.9em; font-size: 0.9em;
} }
li.issue-type-defect {
background-color: #D9534F;
color: #FFFFFF;
}
li.issue-type-request {
background-color: #44AD8E;
color: #FFFFFF;
}
li.issue-type-enhancement {
background-color: #558FAD;
color: #FFFFFF;
}
li.issue-type-feature {
background-color: #5577BC;
color: #FFFFFF;
}
li.issue-type-other {
background-color: #4E8BCA;
color: #FFFFFF;
}
li.issue-status-new {
background-color: #44AD8E;
color: #FFFFFF;
}
li.issue-status-accepted {
background-color: #44AD8E;
color: #FFFFFF;
}
li.issue-status-rejected {
background-color: #AD448E;
color: #FFFFFF;
}
li.issue-status-started {
background-color: #44ADAD;
color: #FFFFFF;
}
li.issue-status-stalled {
background-color: #ADAD8E;
color: #FFFFFF;
}
li.issue-status-testing {
background-color: #44ADBB;
color: #FFFFFF;
}
li.issue-status-resolved {
background-color: #34AD56;
color: #FFFFFF;
}
li.issue-status-worked-around {
background-color: #65AD67;
color: #FFFFFF;
}
li.issue-status-other {
background-color: #888888;
color: #FFFFFF;
}
li.issue-type-other {
background-color: #4E8BCA;
color: #FFFFFF;
}
li.issue-priority-critical {
background-color: #D9534F;
color: #FFFFFF;
}
li.issue-priority-high {
background-color: #B9534F;
color: #FFFFFF;
}
li.issue-priority-medium {
background-color: #99534F;
color: #FFFFFF;
}
li.issue-priority-low {
background-color: #EEE39E;
color: #FFFFFF;
}
li.issue-priority-other {
background-color: #FFF39E;
}
li.issue-owner {
background-color: #FFF39E;
}
/*--------------------------------------------- /*---------------------------------------------
* issue home * issue home
*---------------------------------------------*/ *---------------------------------------------*/
@ -246,13 +129,15 @@ li.issue-owner {
/*--------------------------------------------- /*---------------------------------------------
* issue show * issue show
*---------------------------------------------*/ *---------------------------------------------*/
#issue_show_metadata_body { #issue_show_metadata_list li {
background-color: #FCFCFC; margin-top: 0.1em;
padding: 1em 1em; margin-bottom: 0.2em;
} }
#issue_show_state_list { #issue_show_state_list,
padding-top: 0.2em; #issue_show_coderev_list {
padding-top: 0.3em;
border-top: 1px dashed #EAEAEA
} }
#issue_show_metadata_list li { #issue_show_metadata_list li {

View File

@ -46,13 +46,6 @@
column-gap: 2em; column-gap: 2em;
} }
#wiki_show_metadata_body,
#wiki_edit_files_body {
background-color: #FCFCFC;
margin: 0 !important;
padding: 0.5em 0.5em 0.5em 0.5em !important;
}
/* /*
#wiki_show_file_list a, #wiki_show_file_list a,
*/ */