TasneemLo has uploaded a new change for review.
https://gerrit.wikimedia.org/r/243096
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
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
6 files changed, 114 insertions(+), 1 deletion(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/codesniffer
refs/changes/96/243096/1
diff --git a/MediaWiki/Sniffs/Usage/DirUsageSniff.php
b/MediaWiki/Sniffs/Usage/DirUsageSniff.php
new file mode 100644
index 0000000..1181a2b
--- /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/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
--
To view, visit https://gerrit.wikimedia.org/r/243096
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0172800a4b18d0045c361872166d36cd04172823
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/tools/codesniffer
Gerrit-Branch: master
Gerrit-Owner: TasneemLo <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits