jenkins-bot has submitted this change and it was merged.
Change subject: Sniff to warn check usage of dirname(__FILE__)
......................................................................
Sniff to warn check usage of dirname(__FILE__)
Add functionality to change from dirname(__FILE__) to __FILE__.
Fail: dirname( __FILE__ )
Pass: dirname( __FILE__ . "/.." )
Pass: dirname( __FILE__, 2 )
Pass: dirname( joinpaths( __FILE__, ".." ) )
Pass: $abc->dirname( __FILE__ )
Pass: parent::dirname( __FILE__ )
Bug: T114267
Change-Id: I0172800a4b18d0045c361872166d36cd04172823
---
A MediaWiki/Sniffs/Usage/DirUsageSniff.php
R MediaWiki/Sniffs/Usage/GotoUsageSniff.php
M MediaWiki/Tests/MediaWikiStandardTest.php
A MediaWiki/Tests/files/Usage/dir_usage_fail.php
A MediaWiki/Tests/files/Usage/dir_usage_pass.php
R MediaWiki/Tests/files/Usage/goto_usage_fail.php
R MediaWiki/Tests/files/Usage/goto_usage_pass.php
M TestHelper.php
8 files changed, 117 insertions(+), 4 deletions(-)
Approvals:
Legoktm: Looks good to me, approved
jenkins-bot: Verified
diff --git a/MediaWiki/Sniffs/Usage/DirUsageSniff.php
b/MediaWiki/Sniffs/Usage/DirUsageSniff.php
new file mode 100644
index 0000000..3890a53
--- /dev/null
+++ b/MediaWiki/Sniffs/Usage/DirUsageSniff.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Report error when dirname(__FILE__) is used instead of __DIR__
+ *
+ * Fail: dirname( __FILE__ )
+ * Pass: dirname( __FILE__ . "/.." )
+ * Pass: dirname( __FILE__, 2 )
+ * Pass: dirname( joinpaths( __FILE__, ".." ) )
+ * Pass: $abc->dirname( __FILE__ )
+ * Pass: parent::dirname( __FILE__ )
+ */
+
+// @codingStandardsIgnoreStart
+class MediaWiki_Sniffs_Usage_DirUsageSniff implements PHP_CodeSniffer_Sniff {
+ // @codingStandardsIgnoreEnd
+ public function register() {
+ // As per
https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP#Other
+ return array( T_STRING );
+ }
+
+ public function process( PHP_CodeSniffer_File $phpcsFile, $stackPtr ) {
+ $tokens = $phpcsFile->getTokens();
+
+ $ignore = array(
+ T_DOUBLE_COLON => true,
+ T_OBJECT_OPERATOR => true,
+ T_FUNCTION => true,
+ T_CONST => true,
+ );
+
+ // Check if the function is dirname()
+ if ( strtolower( $tokens[$stackPtr]['content'] ) != "dirname" )
{
+ return;
+ }
+
+ // Check if it's a PHP function
+ $prevToken = $phpcsFile->findPrevious( T_WHITESPACE, (
$stackPtr - 1 ), null, true );
+ if ( isset( $ignore[$tokens[$prevToken]['code']] ) === true ) {
+ return;
+ }
+
+ // Find the paranthesis for the function
+ $nextToken = $phpcsFile->findNext( T_WHITESPACE, ( $stackPtr +
1 ), null, true );
+ if ( $tokens[$nextToken]['code'] !== T_OPEN_PARENTHESIS ) {
+ return;
+ }
+
+ // Check if __FILE__ is inside it
+ $nextToken = $phpcsFile->findNext( T_WHITESPACE, ( $nextToken +
1 ), null, true );
+ if ( $tokens[$nextToken]['code'] !== T_FILE ) {
+ return;
+ }
+
+ // Find close paranthesis
+ $nextToken = $phpcsFile->findNext( T_WHITESPACE, ( $nextToken +
1 ), null, true );
+ if ( $tokens[$nextToken]['code'] !== T_CLOSE_PARENTHESIS ) {
+ return;
+ }
+
+ $fix = $phpcsFile->addFixableError(
+ 'Use __DIR__ constant instead of calling
dirname(__FILE__)',
+ $stackPtr,
+ 'FunctionFound'
+ );
+ if ( $fix === true ) {
+ $curToken = $stackPtr;
+ while ( $curToken <= $nextToken ) {
+ if ( $tokens[$curToken]['code'] === T_FILE ) {
+ $phpcsFile->fixer->replaceToken(
$curToken, '__DIR__' );
+ } else {
+ $phpcsFile->fixer->replaceToken(
$curToken, '' );
+ }
+ $curToken += 1;
+ }
+ }
+ }
+}
diff --git a/MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php
b/MediaWiki/Sniffs/Usage/GotoUsageSniff.php
similarity index 84%
rename from MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php
rename to MediaWiki/Sniffs/Usage/GotoUsageSniff.php
index f549f15..dd081ee 100644
--- a/MediaWiki/Sniffs/GotoUsage/GotoUsageSniff.php
+++ b/MediaWiki/Sniffs/Usage/GotoUsageSniff.php
@@ -3,7 +3,7 @@
* Report error when `goto` is used
*/
// @codingStandardsIgnoreStart
-class MediaWiki_Sniffs_GotoUsage_GotoUsageSniff implements
PHP_CodeSniffer_Sniff {
+class MediaWiki_Sniffs_Usage_GotoUsageSniff implements PHP_CodeSniffer_Sniff {
// @codingStandardsIgnoreEnd
public function register() {
// As per
https://www.mediawiki.org/wiki/Manual:Coding_conventions/PHP#Other
diff --git a/MediaWiki/Tests/MediaWikiStandardTest.php
b/MediaWiki/Tests/MediaWikiStandardTest.php
index 8351e7a..b422ac9 100644
--- a/MediaWiki/Tests/MediaWikiStandardTest.php
+++ b/MediaWiki/Tests/MediaWikiStandardTest.php
@@ -45,8 +45,8 @@
public static function testProvider() {
$tests = array();
- $standard = dirname( dirname( __FILE__ ) );
- $directoryIterator = new RecursiveDirectoryIterator( dirname(
__FILE__ ) . '/files' );
+ $standard = dirname( __DIR__ );
+ $directoryIterator = new RecursiveDirectoryIterator( __DIR__ .
'/files' );
$iterator = new RecursiveIteratorIterator( $directoryIterator );
foreach ( $iterator as $dir ) {
if ( $dir->isDir() ) {
diff --git a/MediaWiki/Tests/files/Usage/dir_usage_fail.php
b/MediaWiki/Tests/files/Usage/dir_usage_fail.php
new file mode 100644
index 0000000..0449ea2
--- /dev/null
+++ b/MediaWiki/Tests/files/Usage/dir_usage_fail.php
@@ -0,0 +1,4 @@
+<?php
+
+$tmp = dirname( __FILE__ );
+echo "Done";
diff --git a/MediaWiki/Tests/files/Usage/dir_usage_pass.php
b/MediaWiki/Tests/files/Usage/dir_usage_pass.php
new file mode 100644
index 0000000..ec2e6a4
--- /dev/null
+++ b/MediaWiki/Tests/files/Usage/dir_usage_pass.php
@@ -0,0 +1,32 @@
+<?php
+
+class FOO extends BAR {
+ function __construct() {
+ }
+
+ function dirname( $a ) {
+ return BAR::dirname( __FILE__ );
+ }
+
+ function foo( $a ) {
+ return BAR::foo( __FILE__ );
+ }
+
+ function bar( $a ) {
+ return BAR::bar( 0 );
+ }
+}
+
+$foo = FOO();
+
+$tmp = dirname( __FILE__ . "/.." );
+$tmp = dirname( joinpaths( __FILE__, ".." ) );
+$tmp = $foo->dirname( __FILE__ );
+
+$f = __FILE__;
+$tmp = dirname( $f );
+$tmp = dirname( $f . "/.." );
+$tmp = dirname( joinpaths( $f, ".." ) );
+$tmp = $foo->dirname( $f );
+
+echo "Done";
diff --git a/MediaWiki/Tests/files/GotoUsage/goto_usage_fail.php
b/MediaWiki/Tests/files/Usage/goto_usage_fail.php
similarity index 100%
rename from MediaWiki/Tests/files/GotoUsage/goto_usage_fail.php
rename to MediaWiki/Tests/files/Usage/goto_usage_fail.php
diff --git a/MediaWiki/Tests/files/GotoUsage/goto_usage_pass.php
b/MediaWiki/Tests/files/Usage/goto_usage_pass.php
similarity index 100%
rename from MediaWiki/Tests/files/GotoUsage/goto_usage_pass.php
rename to MediaWiki/Tests/files/Usage/goto_usage_pass.php
diff --git a/TestHelper.php b/TestHelper.php
index e49c18d..d0f61c6 100644
--- a/TestHelper.php
+++ b/TestHelper.php
@@ -32,7 +32,7 @@
protected $phpcs;
public function __construct() {
- $this->rootDir = dirname( dirname( __FILE__ ) );
+ $this->rootDir = dirname( __DIR__ );
$this->dirName = basename( $this->rootDir );
$this->phpcs = new PHP_CodeSniffer_CLI();
}
--
To view, visit https://gerrit.wikimedia.org/r/243096
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I0172800a4b18d0045c361872166d36cd04172823
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/tools/codesniffer
Gerrit-Branch: master
Gerrit-Owner: TasneemLo <[email protected]>
Gerrit-Reviewer: Addshore <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: Polybuildr <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits