wrote code to corelate issues and code revisions.
changed the code revision view to show corelated issues
This commit is contained in:
parent
ab7156eb67
commit
fdfa5ecaa0
@ -142,7 +142,7 @@ CREATE TABLE issue_change (
|
||||
PRIMARY KEY (projectid, id, sno),
|
||||
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
|
||||
|
||||
) charset=utf8 engine=InnoDB;
|
||||
@ -168,6 +168,31 @@ CREATE TABLE issue_change_file_list (
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) 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 (
|
||||
projectid VARCHAR(32) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
|
@ -109,6 +109,45 @@ sub close_database
|
||||
$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
|
||||
{
|
||||
my ($dbh, $prefix, $projectid, $revision, $userid) = @_;
|
||||
@ -136,7 +175,7 @@ sub write_commit_log
|
||||
if (!$query || !$query->execute ('code', $projectid, $message, 'commit', $userid))
|
||||
{
|
||||
my $errstr = $dbh->errstr();
|
||||
$query->finish ();
|
||||
if ($query) { $query->finish (); }
|
||||
$dbh->rollback ();
|
||||
return (-1, $errstr);
|
||||
}
|
||||
@ -185,8 +224,8 @@ sub get_commit_message
|
||||
return undef;
|
||||
}
|
||||
|
||||
my $author = $fs->revision_prop ($REV, 'svn:log');
|
||||
return $author;
|
||||
my $logmsg = $fs->revision_prop ($REV, 'svn:log');
|
||||
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}=?");
|
||||
if (!$query || !$query->execute ($projectid))
|
||||
{
|
||||
if ($query) { $query->finish (); }
|
||||
return (-1, $dbh->errstr());
|
||||
}
|
||||
|
||||
@ -408,6 +448,9 @@ if (!defined($dbh))
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
my $m = get_commit_message ();
|
||||
if (defined($m))
|
||||
if (defined($raw_commit_message))
|
||||
{
|
||||
$commit_message = $commit_message . "\n" . $m;
|
||||
$commit_message = $commit_message . "\n" . $raw_commit_message;
|
||||
}
|
||||
|
||||
|
||||
|
@ -7,9 +7,13 @@ use DBI;
|
||||
use File::Basename;
|
||||
use POSIX qw(strftime);
|
||||
|
||||
use SVN::Core;
|
||||
use SVN::Repos;
|
||||
use SVN::Fs;
|
||||
|
||||
my $CFG_FILE = '@CFGDIR@/codepot.ini';
|
||||
my $REPO = $ARGV[0];
|
||||
my $REPOBASE = basename($REPO);
|
||||
my $REPOFS = $ARGV[0];
|
||||
my $REPOBASE = basename($REPOFS);
|
||||
my $REV = $ARGV[1];
|
||||
my $USER = $ARGV[2];
|
||||
my $PROPNAME = $ARGV[3];
|
||||
@ -88,6 +92,46 @@ sub close_database
|
||||
$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
|
||||
{
|
||||
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))
|
||||
{
|
||||
my $errstr = $dbh->errstr();
|
||||
$query->finish ();
|
||||
if ($query) { $query->finish (); }
|
||||
$dbh->rollback ();
|
||||
return (-1, $errstr);
|
||||
}
|
||||
@ -116,6 +160,27 @@ sub write_revprop_change_log
|
||||
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
|
||||
#------------------------------------------------------------
|
||||
@ -134,6 +199,9 @@ if (!defined($dbh))
|
||||
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);
|
||||
close_database ($dbh);
|
||||
|
||||
|
@ -724,7 +724,7 @@ class Code extends Controller
|
||||
{
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
$this->load->model ('SubversionModel', 'subversion');
|
||||
$this->load->model ('CodeReviewModel', 'code_review');
|
||||
$this->load->model ('CodeModel', 'code');
|
||||
|
||||
$login = $this->login->getUser ();
|
||||
$revision_saved = -1;
|
||||
@ -759,10 +759,10 @@ class Code extends Controller
|
||||
}
|
||||
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)
|
||||
{
|
||||
$status = 'error - ' . $this->code_review->getErrorMessage();
|
||||
$status = 'error - ' . $this->code->getErrorMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -792,7 +792,7 @@ class Code extends Controller
|
||||
{
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
$this->load->model ('SubversionModel', 'subversion');
|
||||
$this->load->model ('CodeReviewModel', 'code_review');
|
||||
$this->load->model ('CodeModel', 'code');
|
||||
|
||||
$login = $this->login->getUser ();
|
||||
$revision_saved = -1;
|
||||
@ -832,9 +832,9 @@ class Code extends Controller
|
||||
}
|
||||
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
|
||||
{
|
||||
@ -993,7 +993,7 @@ class Code extends Controller
|
||||
{
|
||||
$this->load->model ('ProjectModel', 'projects');
|
||||
$this->load->model ('SubversionModel', 'subversion');
|
||||
$this->load->model ('CodeReviewModel', 'code_review');
|
||||
$this->load->model ('CodeModel', 'code');
|
||||
|
||||
$login = $this->login->getUser ();
|
||||
if (CODEPOT_SIGNIN_COMPULSORY && $login['id'] == '')
|
||||
@ -1048,7 +1048,11 @@ class Code extends Controller
|
||||
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)
|
||||
{
|
||||
$data['project'] = $project;
|
||||
@ -1122,6 +1126,7 @@ class Code extends Controller
|
||||
$data['headpath'] = $path;
|
||||
$data['file'] = $file;
|
||||
$data['reviews'] = $reviews;
|
||||
$data['related_issues'] = $related_issues;
|
||||
|
||||
$data['revision'] = $rev;
|
||||
$data['prev_revision'] = $prev_revision;
|
||||
|
@ -1,6 +1,6 @@
|
||||
wwwdir=$(WWWDIR)/codepot/models
|
||||
www_DATA = \
|
||||
codereviewmodel.php \
|
||||
codemodel.php \
|
||||
dbloginmodel.php \
|
||||
filemodel.php \
|
||||
index.html \
|
||||
|
@ -145,7 +145,7 @@ sysconfdir = @sysconfdir@
|
||||
target_alias = @target_alias@
|
||||
wwwdir = $(WWWDIR)/codepot/models
|
||||
www_DATA = \
|
||||
codereviewmodel.php \
|
||||
codemodel.php \
|
||||
dbloginmodel.php \
|
||||
filemodel.php \
|
||||
index.html \
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
class CodeReviewModel extends Model
|
||||
class CodeModel extends Model
|
||||
{
|
||||
protected $errmsg = '';
|
||||
|
||||
@ -9,12 +9,36 @@ class CodeReviewModel extends Model
|
||||
return $this->errmsg;
|
||||
}
|
||||
|
||||
function CodeReviewModel ()
|
||||
function CodeModel ()
|
||||
{
|
||||
parent::Model ();
|
||||
$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)
|
||||
{
|
||||
$this->db->trans_begin ();
|
@ -255,7 +255,7 @@ $this->load->view (
|
||||
<div style='clear: both'></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'>
|
||||
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
|
||||
</div>
|
||||
|
@ -287,7 +287,7 @@ $this->load->view (
|
||||
<div style='clear: both'></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'>
|
||||
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
|
||||
</div>
|
||||
|
@ -281,7 +281,7 @@ $this->load->view (
|
||||
<div style='clear: both'></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'>
|
||||
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
|
||||
</div>
|
||||
|
@ -883,7 +883,7 @@ $this->load->view (
|
||||
<div style='clear: both;'></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'>
|
||||
<pre><?php print htmlspecialchars ($file['logmsg']); ?></pre>
|
||||
</div>
|
||||
|
@ -362,7 +362,6 @@ $(function() {
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
function make_edit_review_comment_ok_function (no)
|
||||
{
|
||||
var form_name = '#code_revision_edit_review_comment_form_' + no;
|
||||
@ -673,10 +672,41 @@ $history = $file['history'];
|
||||
<div style='clear: both'></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">
|
||||
<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>
|
||||
<?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>
|
||||
|
||||
|
@ -613,7 +613,7 @@ $this->load->view (
|
||||
|
||||
<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_body'>
|
||||
<div id='file_show_metadata_body' class='codepot-metadata-collapsible-body'>
|
||||
<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 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_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'] != ''): ?>
|
||||
<div>
|
||||
<a id="file_show_add_file_button" href='#'><?php print $this->lang->line('Add')?></a>
|
||||
|
@ -927,7 +927,7 @@ function print_issue_state ($con, $issue, $old, $issue_type_array, $issue_status
|
||||
|
||||
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 ': ';
|
||||
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)
|
||||
{
|
||||
printf ('<li class="issue-status-%s">', $issue->status);
|
||||
printf ('<li class="codepot-issue-status-%s">', $issue->status);
|
||||
print $con->lang->line('Status');
|
||||
print ': ';
|
||||
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)
|
||||
{
|
||||
printf ('<li class="issue-priority-%s">', $issue->priority);
|
||||
printf ('<li class="codepot-issue-priority-%s">', $issue->priority);
|
||||
print $con->lang->line('Priority');
|
||||
print ': ';
|
||||
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)
|
||||
{
|
||||
print '<li class="issue-owner">';
|
||||
print '<li class="codepot-issue-owner">';
|
||||
if ($issue->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_metadata_header' class='collapsible-box-header'><?php print $this->lang->line('State')?></div>
|
||||
<div id='issue_show_metadata_body'>
|
||||
<ul id='issue_show_metadata_list' class='codepot-issue-horizontal-list'>
|
||||
<div id='issue_show_metadata_body' class='codepot-metadata-collapsible-body'>
|
||||
<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 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 by')?> <?php print htmlspecialchars($issue->updatedby); ?></li>
|
||||
</ul>
|
||||
|
||||
<ul id='issue_show_state_list' class='codepot-issue-horizontal-list'>
|
||||
<ul id='issue_show_state_list' class='codepot-horizontal-list'>
|
||||
<?php
|
||||
print_issue_state ($this, $issue, NULL, $issue_type_array, $issue_status_array, $issue_priority_array);
|
||||
?>
|
||||
</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>
|
||||
</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>';
|
||||
|
||||
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 '</ul>';
|
||||
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>';
|
||||
|
||||
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 '</ul>';
|
||||
|
||||
|
@ -549,7 +549,7 @@ $this->load->view (
|
||||
<?php print $this->lang->line('WIKI_ATTACHMENTS')?>
|
||||
<a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a>
|
||||
</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;' />
|
||||
|
||||
<ul id='wiki_edit_file_list'>
|
||||
|
@ -445,6 +445,13 @@ $(function () {
|
||||
shift: false,
|
||||
alt: true
|
||||
},
|
||||
{ // alt-k
|
||||
command: 'insertOrderedList',
|
||||
key: 'K',
|
||||
meta: false,
|
||||
shift: false,
|
||||
alt: true
|
||||
},
|
||||
{ // alt-p
|
||||
command: 'append-pre',
|
||||
key: 'P',
|
||||
@ -592,7 +599,7 @@ $this->load->view (
|
||||
<?php print $this->lang->line('WIKI_ATTACHMENTS')?>
|
||||
<a href='#' id='wiki_edit_add_files_button'><?php print $this->lang->line('New')?></a>
|
||||
</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;' />
|
||||
|
||||
<ul id='wiki_edit_file_list'>
|
||||
|
@ -252,7 +252,7 @@ $this->load->view (
|
||||
|
||||
<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_body'>
|
||||
<div id='wiki_show_metadata_body' class='codepot-metadata-collapsible-body'>
|
||||
|
||||
<ul id='wiki_show_metadata_list'>
|
||||
<li><?php print $this->lang->line('Created on')?> <?php print codepot_dbdatetodispdate($wiki->createdon); ?></li>
|
||||
|
@ -78,17 +78,6 @@
|
||||
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_against_body {
|
||||
border: none;
|
||||
@ -240,14 +229,28 @@
|
||||
line-height: 1.2em;
|
||||
padding: 0.2em 0.2em 0.2em 0.2em;
|
||||
}
|
||||
/*
|
||||
#code_revision_result_files_table,
|
||||
#code_revision_result_properties_table {
|
||||
padding: 0.5em 0 0.5em 0;
|
||||
background: inherit;
|
||||
line-height: 1.5em;
|
||||
|
||||
#code_revision_related_issue_list {
|
||||
padding-top: 0.3em;
|
||||
border-top: 1px dashed #EAEAEA
|
||||
}
|
||||
|
||||
#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_properties_table td {
|
||||
|
@ -600,6 +600,12 @@ pre, code, tt {
|
||||
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 {
|
||||
-moz-border-radius: 45%;
|
||||
-webkit-border-radius: 45%;
|
||||
@ -1015,16 +1021,135 @@ pre.codepot-line-numbered span.codepot-line-number-clear {
|
||||
}
|
||||
|
||||
.codepot-committer-icon-24x24 {
|
||||
width: 24px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
vertical-align: middle;
|
||||
margin-right: 2px;
|
||||
vertical-align: middle;
|
||||
margin-right: 2px;
|
||||
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
-webkit-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 === */
|
||||
.codepot-footer-pusher {
|
||||
clear: both;
|
||||
|
@ -22,13 +22,6 @@
|
||||
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 {
|
||||
padding: 0 !important;
|
||||
margin: 0 0 0.5em 0 !important;
|
||||
|
@ -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 {
|
||||
padding: 0.2em 0.2em 0.2em 0.2em;
|
||||
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 {
|
||||
.codepot-issue-start ul.codepot-horizontal-list,
|
||||
.codepot-issue-change ul.codepot-horizontal-list {
|
||||
padding: 0.3em 0 0.3em 0;
|
||||
}
|
||||
|
||||
@ -65,111 +53,6 @@ textarea.codepot-issue-edit-comment {
|
||||
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
|
||||
*---------------------------------------------*/
|
||||
@ -246,13 +129,15 @@ li.issue-owner {
|
||||
/*---------------------------------------------
|
||||
* issue show
|
||||
*---------------------------------------------*/
|
||||
#issue_show_metadata_body {
|
||||
background-color: #FCFCFC;
|
||||
padding: 1em 1em;
|
||||
#issue_show_metadata_list li {
|
||||
margin-top: 0.1em;
|
||||
margin-bottom: 0.2em;
|
||||
}
|
||||
|
||||
#issue_show_state_list {
|
||||
padding-top: 0.2em;
|
||||
#issue_show_state_list,
|
||||
#issue_show_coderev_list {
|
||||
padding-top: 0.3em;
|
||||
border-top: 1px dashed #EAEAEA
|
||||
}
|
||||
|
||||
#issue_show_metadata_list li {
|
||||
|
@ -46,13 +46,6 @@
|
||||
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,
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user