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

Reply via email to