View Issue Details

IDProjectCategoryView StatusLast Update
0009774mantisbtintegrationpublic2010-04-23 23:22
Reportermmcloughlin Assigned Tojreese  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionsuspended 
Product Version1.2.0a2 
Target Version1.3.0-beta.1 
Summary0009774: Source control integration: Issue references in log messages not found if split over multiple lines
Description

scripts/checkin.php is responsible for processing source control log messages to find references to issues. By default these references are of the form "issue 5", or "fixed issue 2", or similar as defined by source_control_regexp and source-control_fixed_regexp. These references will be missed by scripts/checkin.php if they span multiple lines.

For an example see Steps To Reproduce.

The problem is partly with the default choice of regular expression, and partly with the fact that scripts/checkin.php parses STDIN on a line-by-line basis.

I attach a patch against SVN trunk revision 5752.

Steps To Reproduce

In the shell

$ cd <mantis directory>/scripts
$ ./checkin.php <<< "This commit fixes issue 1."
$ ./checkin.php <<< "This commit fixes issue
1."
Comment does not reference any issues.

Tagspatch
Attached Files
source-control-log-newline.patch (2,228 bytes)   
Index: scripts/checkin.php
===================================================================
--- scripts/checkin.php	(revision 5752)
+++ scripts/checkin.php	(working copy)
@@ -38,32 +38,26 @@
 	exit( 1 );
 }
 
-if( !defined( "STDIN" ) ) {
-	define( "STDIN", fopen( 'php://stdin', 'r' ) );
-}
-
 # Detect references to issues + concat all lines to have the comment log.
 $t_commit_regexp = config_get( 'source_control_regexp' );
 $t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' );
 
-$t_comment = '';
+$t_comment = file_get_contents('php://stdin');
 $t_issues = array();
 $t_fixed_issues = array();
-while(( $t_line = fgets( STDIN, 1024 ) ) ) {
-	$t_comment .= $t_line;
-	if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) {
-		for( $i = 0;$i < count( $t_matches[0] );++$i ) {
-			$t_issues[] = $t_matches[1][$i];
-		}
-	}
 
-	if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) {
-		for( $i = 0;$i < count( $t_matches[0] );++$i ) {
-			$t_fixed_issues[] = $t_matches[1][$i];
-		}
-	}
+if( preg_match_all( $t_commit_regexp, $t_comment, $t_matches ) ) {
+    for( $i = 0;$i < count( $t_matches[0] );++$i ) {
+        $t_issues[] = $t_matches[1][$i];
+    }
 }
 
+if( preg_match_all( $t_commit_fixed_regexp, $t_comment, $t_matches ) ) {
+    for( $i = 0;$i < count( $t_matches[0] );++$i ) {
+        $t_fixed_issues[] = $t_matches[1][$i];
+    }
+}
+
 # If no issues found, then no work to do.
 if(( count( $t_issues ) == 0 ) && ( count( $t_fixed_issues ) == 0 ) ) {
 	echo "Comment does not reference any issues.\n";
Index: config_defaults_inc.php
===================================================================
--- config_defaults_inc.php	(revision 5752)
+++ config_defaults_inc.php	(working copy)
@@ -1294,7 +1294,7 @@
 	# Regular expression used to detect issue ids within checkin comments.
 	# see preg_match_all() documentation at
 	# http://www.php.net/manual/en/function.preg-match-all.php
-	$g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";
+	$g_source_control_regexp = "/\bissue\s+#?(\d+)\b/i";
 
 	# Regular expression used to detect the fact that an issue is fixed and extracts
 	# its issue id.  If there is a match to this regular expression, then the issue
0001-proposed-fix-for-issue-9774.patch (2,054 bytes)   
diff --git a/config_defaults_inc.php b/config_defaults_inc.php
index c90c501..21341a6 100644
--- a/config_defaults_inc.php
+++ b/config_defaults_inc.php
@@ -1294,7 +1294,7 @@
 	# Regular expression used to detect issue ids within checkin comments.
 	# see preg_match_all() documentation at
 	# http://www.php.net/manual/en/function.preg-match-all.php
-	$g_source_control_regexp = "/\bissue [#]{0,1}(\d+)\b/i";
+	$g_source_control_regexp = "/\bissue[ \r\n]{0,1}[#]{0,1}(\d+)\b/i";
 
 	# Regular expression used to detect the fact that an issue is fixed and extracts
 	# its issue id.  If there is a match to this regular expression, then the issue
diff --git a/scripts/checkin.php b/scripts/checkin.php
index 0a5ebd0..682e42e 100644
--- a/scripts/checkin.php
+++ b/scripts/checkin.php
@@ -38,29 +38,23 @@ if( is_blank( $t_username ) || ( user_get_id_by_name( $t_username ) === false )
 	exit( 1 );
 }
 
-if( !defined( "STDIN" ) ) {
-	define( "STDIN", fopen( 'php://stdin', 'r' ) );
-}
-
 # Detect references to issues + concat all lines to have the comment log.
 $t_commit_regexp = config_get( 'source_control_regexp' );
 $t_commit_fixed_regexp = config_get( 'source_control_fixed_regexp' );
 
-$t_comment = '';
+$t_comment = file_get_contents("php://stdin");
 $t_issues = array();
 $t_fixed_issues = array();
-while(( $t_line = fgets( STDIN, 1024 ) ) ) {
-	$t_comment .= $t_line;
-	if( preg_match_all( $t_commit_regexp, $t_line, $t_matches ) ) {
-		for( $i = 0;$i < count( $t_matches[0] );++$i ) {
-			$t_issues[] = $t_matches[1][$i];
-		}
+
+if( preg_match_all( $t_commit_regexp, $t_comment, $t_matches ) ) {
+	for( $i = 0;$i < count( $t_matches[0] );++$i ) {
+		$t_issues[] = $t_matches[1][$i];
 	}
+}
 
-	if( preg_match_all( $t_commit_fixed_regexp, $t_line, $t_matches ) ) {
-		for( $i = 0;$i < count( $t_matches[0] );++$i ) {
-			$t_fixed_issues[] = $t_matches[1][$i];
-		}
+if( preg_match_all( $t_commit_fixed_regexp, $t_comment, $t_matches ) ) {
+	for( $i = 0;$i < count( $t_matches[0] );++$i ) {
+		$t_fixed_issues[] = $t_matches[1][$i];
 	}
 }
 

Activities

slankes

slankes

2008-11-16 17:23

reporter   ~0019910

Ups - sorry. I didn't notice that there was a patch attached so I came up with basically the same solution again (except that mmcloughlin has the better regexp-substitution).

So - sorry for the noise.

siebrand

siebrand

2009-01-12 18:38

developer   ~0020597

Please provide a patch based on git trunk for easier integration.