wrote code to corelate issues and code revisions.
changed the code revision view to show corelated issues
This commit is contained in:
		| @ -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, | ||||
| */ | ||||
|  | ||||
		Reference in New Issue
	
	Block a user