* Version 2.6.2 (stable) - API 2.6.2 (stable) - 2016-07-13


- Added a new --exclude CLI argument to exclude a list of sniffs from checking and fixing (request #904)
  -- Accepts the same sniff codes as the --sniffs command line argument, but provides the opposite functionality
- Added a new -q command line argument to disable progress and verbose information from being printed (request #969)
  -- Useful if a coding standard hard-codes progess or verbose output but you want PHPCS to be quiet
  -- Use the command "phpcs --config-set quiet true" to turn quiet mode on by default
- Generic LineLength sniff no longer errors for comments that cannot be broken out onto a new line (request #766)
  -- A typical case is a comment that contains a very long URL
  -- The comment is ignored if putting the URL on a indented new comment line would be longer than the allowed length
- Settings extensions in a ruleset no longer causes PHP notices during unit testing
  -- Thanks to Klaus Purer for the patch
- Version control reports now show which errors are fixable if you are showing sources
- Added a new sniff to enforce a single space after a NOT operator (request #1051)
  -- Include in a ruleset using the code Generic.Formatting.SpaceAfterNot
- The Squiz.Commenting.BlockComment sniff now supports tabs for indenting comment lines (request #1056)
- Fixed bug #790 : Incorrect missing @throws error in methods that use closures
- Fixed bug #908 : PSR2 standard is not checking that closing brace is on line following the body
- Fixed bug #945 : Incorrect indent behavior using deep-nested function and arrays
- Fixed bug #961 : Two anonymous functions passed as function/method arguments cause indentation false positive
- Fixed bug #1005 : Using global composer vendor autoload breaks PHP lowercase built-in function sniff
  -- Thanks to Michael Butler for the patch
- Fixed bug #1007 : Squiz Unreachable code detection is not working properly with a closure inside a case
- Fixed bug #1023 : PSR2.Classes.ClassDeclaration fails if class extends base class and "implements" is on trailing line
- Fixed bug #1026 : Arrays in comma delimited class properties cause ScopeIndent to increase indent
- Fixed bug #1028 : Squiz ArrayDeclaration incorrectly fixes multi-line array where end bracket is not on a new line
- Fixed bug #1034 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error when first arg is a variadic
- Fixed bug #1036 : Adjacent assignments aligned analysis statement wrong
- Fixed bug #1049 : Version control reports can show notices when the report width is very small
- Fixed bug #21050 : PEAR MultiLineCondition sniff suppresses errors on last condition line
 

* Version 2.6.2 (stable) - API 2.6.2 (stable) - 2016-07-14


- Added a new --exclude CLI argument to exclude a list of sniffs from checking and fixing (request #904)
  -- Accepts the same sniff codes as the --sniffs command line argument, but provides the opposite functionality
- Added a new -q command line argument to disable progress and verbose information from being printed (request #969)
  -- Useful if a coding standard hard-codes progess or verbose output but you want PHPCS to be quiet
  -- Use the command "phpcs --config-set quiet true" to turn quiet mode on by default
- Generic LineLength sniff no longer errors for comments that cannot be broken out onto a new line (request #766)
  -- A typical case is a comment that contains a very long URL
  -- The comment is ignored if putting the URL on a indented new comment line would be longer than the allowed length
- Settings extensions in a ruleset no longer causes PHP notices during unit testing
  -- Thanks to Klaus Purer for the patch
- Version control reports now show which errors are fixable if you are showing sources
- Added a new sniff to enforce a single space after a NOT operator (request #1051)
  -- Include in a ruleset using the code Generic.Formatting.SpaceAfterNot
- The Squiz.Commenting.BlockComment sniff now supports tabs for indenting comment lines (request #1056)
- Fixed bug #790 : Incorrect missing @throws error in methods that use closures
- Fixed bug #908 : PSR2 standard is not checking that closing brace is on line following the body
- Fixed bug #945 : Incorrect indent behavior using deep-nested function and arrays
- Fixed bug #961 : Two anonymous functions passed as function/method arguments cause indentation false positive
- Fixed bug #1005 : Using global composer vendor autoload breaks PHP lowercase built-in function sniff
  -- Thanks to Michael Butler for the patch
- Fixed bug #1007 : Squiz Unreachable code detection is not working properly with a closure inside a case
- Fixed bug #1023 : PSR2.Classes.ClassDeclaration fails if class extends base class and "implements" is on trailing line
- Fixed bug #1026 : Arrays in comma delimited class properties cause ScopeIndent to increase indent
- Fixed bug #1028 : Squiz ArrayDeclaration incorrectly fixes multi-line array where end bracket is not on a new line
- Fixed bug #1034 : Squiz FunctionDeclarationArgumentSpacing gives incorrect error when first arg is a variadic
- Fixed bug #1036 : Adjacent assignments aligned analysis statement wrong
- Fixed bug #1049 : Version control reports can show notices when the report width is very small
- Fixed bug #21050 : PEAR MultiLineCondition sniff suppresses errors on last condition line
   

* Version 2.6.1 (stable) - API 2.6.1 (stable) - 2016-05-31


- The PHP-supplied T_COALESCE token has been replicated for PHP versions before 7.0
- Function return types of self, parent and callable are now tokenized as T_RETURN_TYPE
  -- Thanks to Jaroslav Hanslík for the patch
- The default_standard config setting now allows multiple standards to be listed, like on the command line
  -- Thanks to Michael Mayer for the patch
- Installations done via composer now only include the composer autoloader for PHP 5.3.2+ (request #942)
- Added a rollbackChangeset() method to the Fixer class to purposely rollback the active changeset
- Fixed bug #940 : Auto-fixing issue encountered with inconsistent use of braces
- Fixed bug #943 : Squiz.PHP.InnerFunctions.NotAllowed reported in anonymous classes
- Fixed bug #944 : PHP warning when running the latest phar
- Fixed bug #951 : InlineIfDeclaration: invalid error produced with UTF-8 string
- Fixed bug #957 : Operator spacing sniff errors when plus is used as part of a number
  -- Thanks to Klaus Purer for the patch
- Fixed bug #959 : Call-time pass-by-reference false positive if there is a square bracket before the ampersand
  -- Thanks to Konstantin Leboev for the patch
- Fixed bug #962 : Null coalescing operator (??) not detected as a token
  -- Thanks to Joel Posti for the patch
- Fixed bug #973 : Anonymous class declaration and PSR1.Files.SideEffects.FoundWithSymbols
- Fixed bug #974 : Error when file ends with "function"
- Fixed bug #979 : Anonymous function with return type hint is not refactored as expected
- Fixed bug #983 : Squiz.WhiteSpace.MemberVarSpacing.AfterComment fails to fix error when comment is not a docblock
- Fixed bug #1010 : Squiz NonExectuableCode sniff does not detect boolean OR
  -- Thanks to Derek Henderson for the patch
- Fixed bug #1015 : The Squiz.Commenting.FunctionComment sniff doesn't allow description in @return tag
  -- Thanks to Alexander Obuhovich for the patch
- Fixed bug #1022 : Duplicate spaces after opening bracket error with PSR2 standard
- Fixed bug #1025 : Syntax error in JS file can cause undefined index for parenthesis_closer
   

* Version 2.6.0 (stable) - API 2.6.0 (stable) - 2016-04-04


- Paths used when setting CLI arguments inside ruleset.xml files are now relative to the ruleset location (request #847)
  -- This change only applies to paths within ARG tags, used to set CLI arguments
  -- Previously, the paths were relative to the directory PHPCS was being run from
  -- Absolute paths are still allowed and work the same way they always have
  -- This change allows ruleset.xml files to be more portable
- Content passed via STDIN will now be processed even if files are specified on the command line or in a ruleset
- When passing content via STDIN, you can now specify the file path to use on the command line (request #934)
  -- This allows sniffs that check file paths to work correctly
  -- This is the same functionality provided by the phpcs_input_file line, except it is available on the command line
- Files processed with custom tokenizers will no longer be skipped if they appear minified (request #877)
  -- If the custom tokenizer wants minified files skipped, it can set a $skipMinified member var to TRUE
  -- See the included JS and CSS tokenizers for an example
- Config vars set in ruleset.xml files are now processed earlier, allowing them to be used during sniff registration
  -- Among other things, this allows the installed_paths config var to be set in ruleset.xml files
  -- Thanks to Pieter Frenssen for the patch
- Improved detection of regular expressions in the JS tokenizer
- Generic PHP Syntax sniff now uses PHP_BINARY (if available) to determine the path to PHP if no other path is available
  -- You can still manually set php_path to use a specific binary for testing
  -- Thanks to Andrew Berry for the patch
- The PHP-supplied T_POW_EQUAL token has been replicated for PHP versions before 5.6
- Added support for PHP7 use group declarations (request #878)
  -- New tokens T_OPEN_USE_GROUP and T_CLOSE_USE_GROUP are assigned to the open and close curly braces
- Generic ScopeIndent sniff now reports errors for every line that needs the indent changed (request #903)
  -- Previously, it ignored lines that were indented correctly in the context of their block
  -- This change produces more technically accurate error messages, but is much more verbose
- The PSR2 and Squiz standards now allow multi-line default values in function declarations (request #542)
  -- Previously, these would automatically make the function a multi-line declaration
- Squiz InlineCommentSniff now allows docblocks on require(_once) and include(_once) statements
  -- Thanks to Gary Jones for the patch
- Squiz and PEAR Class and File sniffs no longer assume the first comment in a file is always a file comment
  -- phpDocumentor assigns the comment to the file only if it is not followed by a structural element
  -- These sniffs now follow this same rule
- Squiz ClassCommentSniff no longer checks for blank lines before class comments
  -- Removes the error Squiz.Commenting.ClassComment.SpaceBefore
- Renamed Squiz.CSS.Opacity.SpacingAfterPoint to Squiz.CSS.Opacity.DecimalPrecision
  -- Please update your ruleset if you are referencing this error code directly
- Fixed PHP tokenizer problem that caused an infinite loop when checking a comment with specific content
- Generic Disallow Space and Tab indent sniffs now detect and fix indents inside embedded HTML chunks (request #882)
- Squiz CSS IndentationSniff no longer assumes the class opening brace is at the end of a line
- Squiz FunctionCommentThrowTagSniff now ignores non-docblock comments
- Squiz ComparisonOperatorUsageSniff now allows conditions like while(true)
- PEAR FunctionCallSignatureSniff (and the Squiz and PSR2 sniffs that use it) now correctly check the first argument
  -- Further fix for bug #698
- Fixed bug #791 : codingStandardsChangeSetting settings not working with namespaces
- Fixed bug #872 : Incorrect detection of blank lines between CSS class names
- Fixed bug #879 : Generic InlineControlStructureSniff can create parse error when case/if/elseif/else have mixed brace and braceless definitions
- Fixed bug #883 : PSR2 is not checking for blank lines at the start and end of control structures
- Fixed bug #884 : Incorrect indentation notice for anonymous classes
- Fixed bug #887 : Using curly braces for a shared CASE/DEFAULT statement can generate an error in PSR2 SwitchDeclaration
- Fixed bug #889 : Closure inside catch/else/elseif causes indentation error
- Fixed bug #890 : Function call inside returned short array value can cause indentation error inside CASE statements
- Fixed bug #897 : Generic.Functions.CallTimePassByReference.NotAllowed false positive when short array syntax
- Fixed bug #900 : Squiz.Functions.FunctionDeclarationArgumentSpacing bug when no space between type hint and argument
- Fixed bug #902 : T_OR_EQUAL and T_POW_EQUAL are not seen as assignment tokens
- Fixed bug #910 : Unrecognized "extends" and indentation on anonymous classes
- Fixed bug #915 : JS Tokenizer generates errors when processing some decimals
- Fixed bug #928 : Endless loop when sniffing a PHP file with a git merge conflict inside a function
- Fixed bug #937 : Shebang can cause PSR1 SideEffects warning
  -- Thanks to Clay Loveless for the patch
- Fixed bug #938 : CallTimePassByReferenceSniff ignores functions with return value
   

* Version 2.5.1 (stable) - API 2.5.1 (stable) - 2016-01-20


- The PHP-supplied T_SPACESHIP token has been replicated for PHP versions before 7.0
- T_SPACESHIP is now correctly identified as an operator
  -- Thanks to Alexander Obuhovich for the patch
- Generic LowerCaseKeyword now ensures array type hints are lowercase as well
  -- Thanks to Mathieu Rochette for the patch
- Squiz ComparisonOperatorUsageSniff no longer hangs on JS FOR loops that don't use semicolons
- PHP_CodesSniffer now includes the composer autoload.php file, if there is one
  -- Thanks to Klaus Purer for the patch
- Added error Squiz.Commenting.FunctionComment.ScalarTypeHintMissing for PHP7 only (request #858)
  -- These errors were previously reported as Squiz.Commenting.FunctionComment.TypeHintMissing on PHP7
  -- Disable this error message in a ruleset.xml file if your code needs to run on both PHP5 and PHP7
- The PHP 5.6 __debugInfo magic method no longer produces naming convention errors
  -- Thanks to Michael Nowack for the patch
- PEAR and Squiz FunctionComment sniffs now support variadic functions (request #841)
- Fixed bug #622 : Wrong detection of Squiz.CSS.DuplicateStyleDefinition with media queries
- Fixed bug #752 : The missing exception error is reported in first found DocBlock
- Fixed bug #794 : PSR2 MultiLineFunctionDeclaration forbids comments after opening parenthesis of a multiline call
- Fixed bug #820 : PEAR/PSR2 FunctionCallSignature sniffs suggest wrong indent when there are multiple arguments on a line
- Fixed bug #822 : Ruleset hard-coded file paths are not used if not running from the same directory as the ruleset
- Fixed bug #825 : FunctionCallArgumentSpacing sniff complains about more than one space before comment in multi-line function call
- Fixed bug #828 : Null classname is tokenized as T_NULL instead of T_STRING
- Fixed bug #829 : Short array argument not fixed correctly when multiple function arguments are on the same line
- Fixed bug #831 : PHPCS freezes in an infinite loop under Windows if no standard is passed
- Fixed bug #832 : Tokenizer does not support context sensitive parsing
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #835 : PEAR.Functions.FunctionCallSignature broken when closure uses return types
- Fixed bug #838 : CSS indentation fixer changes color codes
  -- Thanks to Klaus Purer for the patch
- Fixed bug #839 : "__()" method is marked as not camel caps
  -- Thanks to Tim Bezhashvyly for the patch
- Fixed bug #852 : Generic.Commenting.DocComment not finding errors when long description is omitted
- Fixed bug #854 : Return typehints in interfaces are not reported as T_RETURN_TYPE
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #855 : Capital letter detection for multibyte strings doesn't work correctly
- Fixed bug #857 : PSR2.ControlStructure.SwitchDeclaration shouldn't check indent of curly brace closers
- Fixed bug #859 : Switch statement indention issue when returning function call with closure
- Fixed bug #861 : Single-line arrays and function calls can generate incorrect indentation errors
- Fixed bug #867 : Squiz.Strings.DoubleQuoteUsage broken for some escape codes
  -- Thanks to Jack Blower for the help with the fix
- Fixed bug #21005 : Incorrect indent detection when multiple properties are initialized to arrays
- Fixed bug #21010 : Incorrect missing colon detection in CSS when first style is not on new line
- Fixed bug #21011 : Incorrect error message text when newline found after opening brace
   

* Version 2.5.0 (stable) - API 2.5.0 (stable) - 2015-12-11


- PHPCS will now look for a phpcs.xml file in parent directories as well as the current directory (request #626)
- PHPCS will now use a phpcs.xml file even if files are specified on the command line
  -- This file is still only used if no standard is specified on the command line
- Added support for a phpcs.xml.dist file (request #583)
  -- If both a phpcs.xml and phpcs.xml.dist file are present, the phpcs.xml file will be used
- Added support for setting PHP ini values in ruleset.xml files (request #560)
  -- Setting the value of the new ini tags to name="memory_limit" value="32M" is the same as -d memory_limit=32M
- Added support for one or more bootstrap files to be run before processing begins
  -- Use the --bootstrap=file,file,file command line argument to include bootstrap files
  -- Useful if you want to override some of the high-level settings of PHPCS or PHPCBF
  -- Thanks to John Maguire for the patch
- Added additional verbose output for CSS tokenizing
- Squiz ComparisonOperatorUsageSniff now checks FOR, WHILE and DO-WHILE statements
  -- Thanks to Arnout Boks for the patch
- Fixed bug #660 : Syntax checks can fail on Windows with PHP5.6
- Fixed bug #784 : $this->trait is seen as a T_TRAIT token
- Fixed bug #786 : Switch indent issue with short array notation
- Fixed bug #787 : SpacingAfterDefaultBreak confused by multi-line statements
- Fixed bug #797 : Parsing CSS url() value breaks further parsing
- Fixed bug #805 : Squiz.Commenting.FunctionComment.InvalidTypeHint on Scalar types on PHP7
- Fixed bug #807 : Cannot fix line endings when open PHP tag is not on the first line
- Fixed bug #808 : JS tokeniser incorrectly setting some function and class names to control structure tokens
- Fixed bug #809 : PHPCBF can break a require_once statement with a space before the open parenthesis
- Fixed bug #813 : PEAR FunctionCallSignature checks wrong indent when first token on line is part of a multi-line string
   

* Version 2.4.0 (stable) - API 2.4.0 (stable) - 2015-11-24


- Added support for PHP 7 anonymous classes
  -- Anonymous classes are now tokenized as T_ANON_CLASS and ignored by normal class sniffs
- Added support for PHP 7 function return type declarations
  -- Return types are now tokenized as T_RETURN_TYPE
- Fixed tokenizing of the XOR operator, which was incorrectly identified as a power operator (bug #765)
  -- The T_POWER token has been removed and replaced by the T_BITWISE_XOR token
  -- The PHP-supplied T_POW token has been replicated for PHP versions before 5.6
- Traits are now tokenized in PHP versions before 5.4 to make testing easier
- Improved regular expression detection in JS files
- PEAR FunctionCallSignatureSniff now properly detects indents in more mixed HTML/PHP code blocks
- Full report now properly indents lines when newlines are found inside error messages
- Generating documentation without specifying a standard now uses the default standard instead
  -- Thanks to Ken Guest for the patch
- Generic InlineControlStructureSniff now supports braceless do/while loops in JS
  -- Thanks to Pieter Frenssen for the patch
- Added more guard code for function declarations with syntax errors
  -- Thanks to Yun Young-jin for the patch
- Added more guard code for foreach declarations with syntax errors
  -- Thanks to Johan de Ruijter for the patch
- Added more guard code for class declarations with syntax errors
- Squiz ArrayDeclarationSniff now has guard code for arrays with syntax errors
- Generic InlineControlStructureSniff now correctly fixes ELSEIF statements
- Fixed bug #601 : Expected type hint int[]; found array in Squiz FunctionCommentSniff
  -- Thanks to Scato Eggen for the patch
- Fixed bug #625 : Consider working around T_HASHBANG in HHVM 3.5.x and 3.6.x
  -- Thanks to Kunal Mehta for the patch
- Fixed bug #692 : Comment tokenizer can break when using mbstring function overloading
- Fixed bug #694 : Long sniff codes can cause PHP warnings in source report when showing error codes
- Fixed bug #698 : PSR2.Methods.FunctionCallSignature.Indent forces exact indent of ternary operator parameters
- Fixed bug #704 : ScopeIndent can fail when an opening parenthesis is on a line by itself
- Fixed bug #707 : Squiz MethodScopeSniff doesn't handle nested functions
- Fixed bug #709 : Squiz.Sniffs.Whitespace.ScopeClosingBraceSniff marking indented endif in mixed inline HTML blocks
- Fixed bug #711 : Sniffing from STDIN shows Generic.Files.LowercasedFilename.NotFound error
- Fixed bug #714 : Fixes suppression of errors using docblocks
  -- Thanks to Andrzej Karmazyn for the patch
- Fixed bug #716 : JSON report is invalid when messages contain newlines or tabs
  -- Thanks to Pieter Frenssen for the patch
- Fixed bug #723 : ScopeIndent can fail when multiple array closers are on the same line
- Fixed bug #730 : ScopeIndent can fail when a short array opening square bracket is on a line by itself
- Fixed bug #732 : PHP Notice if @package name is made up of all invalid characters
  -- Adds new error code PEAR.Commenting.FileComment.InvalidPackageValue
- Fixed bug #748 : Auto fix for Squiz.Commenting.BlockComment.WrongEnd is incorrect
  -- Thanks to J.D. Grimes for the patch
- Fixed bug #753 : PSR2 standard shouldn't require space after USE block when next code is a closing tag
- Fixed bug #768 : PEAR FunctionCallSignature sniff forbids comments after opening parenthesis of a multiline call
- Fixed bug #769 : Incorrect detection of variable reference operator when used with short array syntax
  -- Thanks to Klaus Purer for the patch
- Fixed bug #772 : Syntax error when using PHPCBF on alternative style foreach loops
- Fixed bug #773 : Syntax error when stripping trailing PHP close tag and previous statement has no semicolon
- Fixed bug #778 : PHPCBF creates invalid PHP for inline FOREACH containing multiple control structures
- Fixed bug #781 : Incorrect checking for PHP7 return types on multi-line function declartions
- Fixed bug #782 : Conditional function declarations cause fixing conflicts in Squiz standard
  -- Squiz.ControlStructures.ControlSignature no longer enforces a single newline after open brace
  -- Squiz.WhiteSpace.ControlStructureSpacing can be used to checl spacing at the start/end of control structures
   

* Version 2.3.4 (stable) - API 2.3.4 (stable) - 2015-09-09


- JSON report format now includes the fixable status for each error message and the total number of fixable errors
- Added more guard code for function declarations with syntax errors
- Added tokenizer support for the PHP declare construct
  -- Thanks to Andy Blyler for the patch
- Generic UnnecessaryStringConcatSniff can now allow strings concatenated over multiple lines
  -- Set the allowMultiline property to TRUE (default is FALSE) in your ruleset.xml file to enable this
  -- By default, concat used only for getting around line length limits still generates an error
  -- Thanks to Stefan Lenselink for the contribution
- Invalid byte sequences no longer throw iconv_strlen() errors (request #639)
  -- Thanks to Willem Stuursma for the patch
- Generic TodoSniff and FixmeSniff are now better at processing strings with invalid characters
- PEAR FunctionCallSignatureSniff now ignores indentation of inline HTML content
- Squiz ControlSignatureSniff now supports control structures with only inline HTML content
- Fixed bug #636 : Some class names cause CSS tokenizer to hang
- Fixed bug #638 : VCS blame reports output error content from the blame commands for files not under VC
- Fixed bug #642 : Method params incorrectly detected when default value uses short array syntax
  -- Thanks to Josh Davis for the patch
- Fixed bug #644 : PEAR ScopeClosingBrace sniff does not work with mixed HTML/PHP
- Fixed bug #645 : FunctionSignature and ScopeIndent sniffs don't detect indents correctly when PHP open tag is not on a line by itself
- Fixed bug #648 : Namespace not tokenized correctly when followed by multiple use statements
- Fixed bug #654 : Comments affect indent check for BSDAllman brace style
- Fixed bug #658 : Squiz.Functions.FunctionDeclarationSpacing error for multi-line declarations with required spaces greater than zero
  -- Thanks to J.D. Grimes for the patch
- Fixed bug #663 : No space after class name generates: Class name "" is not in camel caps format
- Fixed bug #667 : Scope indent check can go into infinite loop due to some parse errors
- Fixed bug #670 : Endless loop in PSR1 SideEffects sniffer if no semicolon after last statement
  -- Thanks to Thomas Jarosch for the patch
- Fixed bug #672 : Call-time pass-by-reference false positive
- Fixed bug #683 : Comments are incorrectly reported by PSR2.ControlStructures.SwitchDeclaration sniff
- Fixed bug #687 : ScopeIndent does not check indent correctly for method prefixes like public and abstract
- Fixed bug #689 : False error on some comments after class closing brace
   

* Version 2.3.3 (stable) - API 2.3.3 (stable) - 2015-06-24


- Improved the performance of the CSS tokenizer, especially on very large CSS files (thousands of lines)
  -- Thanks to Klaus Purer for the patch
- Defined tokens for lower PHP versions are now phpcs-specific strings instead of ints
  -- Stops conflict with other projects, like PHP_CodeCoverage
- Added more guard code for syntax errors to various sniffs
- Improved support for older HHVM versions
  -- Thanks to Kunal Mehta for the patch
- Squiz ValidLogicalOperatorsSniff now ignores XOR as type casting is different when using the ^ operator (request #567)
- Squiz CommentedOutCodeSniff is now better at ignoring URLs inside comments
- Squiz ControlSignatureSniff is now better at checking embedded PHP code
- Squiz ScopeClosingBraceSniff is now better at checking embedded PHP code
- Fixed bug #584 : Squiz.Arrays.ArrayDeclaration sniff gives incorrect NoComma error for multiline string values
- Fixed bug #589 : PEAR.Functions.FunctionCallSignature sniff not checking all function calls
- Fixed bug #592 : USE statement tokenising can sometimes result in mismatched scopes
- Fixed bug #594 : Tokenizer issue on closure that returns by reference
- Fixed bug #595 : Colons in CSS selectors within media queries throw false positives
  -- Thanks to Klaus Purer for the patch
- Fixed bug #598 : PHPCBF can break function/use closure brace placement
- Fixed bug #603 : Squiz ControlSignatureSniff hard-codes opener type while fixing
- Fixed bug #605 : Auto report-width specified in ruleset.xml ignored
- Fixed bug #611 : Invalid numeric literal on CSS files under PHP7
- Fixed bug #612 : Multi-file diff generating incorrectly if files do not end with EOL char
- Fixed bug #615 : Squiz OperatorBracketSniff incorrectly reports and fixes operations using self::
- Fixed bug #616 : Squiz DisallowComparisonAssignmentSniff inconsistent errors with inline IF statements
- Fixed bug #617 : Space after switch keyword in PSR-2 is not being enforced
- Fixed bug #621 : PSR2 SwitchDeclaration sniff doesn't detect, or correctly fix, case body on same line as statement
   

* Version 2.3.2 (stable) - API 2.3.2 (stable) - 2015-04-29


- The error message for PSR2.ControlStructures.SwitchDeclaration.WrongOpenercase is now clearer (request #579)
- Fixed bug #545 : Long list of CASE statements can cause tokenizer to reach a depth limit
- Fixed bug #565 : Squiz.WhiteSpace.OperatorSpacing reports negative number in short array
  -- Thanks to Vašek Purchart for the patch
  -- Same fix also applied to Squiz.Formatting.OperatorBracket
- Fixed bug #569 : Generic ScopeIndentSniff throws PHP notices in JS files
- Fixed bug #570 : Phar class fatals in PHP less than 5.3
   

* Version 2.3.1 (stable) - API 2.3.1 (stable) - 2015-04-23


- PHPCS can now exit with 0 even if errors are found
  -- Set the ignore_errors_on_exit config variable to 1 to set this behaviour
  -- Use with the ignore_warnings_on_exit config variable to never return a non-zero exit code
- Added Generic DisallowLongArraySyntaxSniff to enforce the use of the PHP short array syntax (request #483)
  -- Thanks to Xaver Loppenstedt for helping with tests
- Added Generic DisallowShortArraySyntaxSniff to ban the use of the PHP short array syntax (request #483)
  -- Thanks to Xaver Loppenstedt for helping with tests
- Generic ScopeIndentSniff no longer does exact checking for content inside parenthesis (request #528)
  -- Only applies to custom coding standards that set the "exact" flag to TRUE
- Squiz ConcatenationSpacingSniff now has a setting to ignore newline characters around operators (request #511)
    -- Default remains FALSE, so newlines are not allowed
    -- Override the "ignoreNewlines" setting in a ruleset.xml file to change
- Squiz InlineCommentSniff no longer checks the last char of a comment if the first char is not a letter (request #505)
- The Squiz standard has increased the max padding for statement alignment from 12 to 20
- Fixed bug #479 : Yielded values are not recognised as returned values in Squiz FunctionComment sniff
- Fixed bug #512 : Endless loop whilst parsing mixture of control structure styles
- Fixed bug #515 : Spaces in JS block incorrectly flagged as indentation error
- Fixed bug #523 : Generic ScopeIndent errors for IF in FINALLY
- Fixed bug #527 : Closure inside IF statement is not tokenized correctly
- Fixed bug #529 : Squiz.Strings.EchoedStrings gives false positive when echo'ing using an inline condition
- Fixed bug #537 : Using --config-set is breaking phpcs.phar
- Fixed bug #543 : SWITCH with closure in condition generates inline control structure error
- Fixed bug #551 : Multiple catch blocks not checked in Squiz.ControlStructures.ControlSignature sniff
- Fixed bug #554 : ScopeIndentSniff causes errors when encountering an unmatched parenthesis
- Fixed bug #558 : PHPCBF adds brace for ELSE IF split over multiple lines
- Fixed bug #564 : Generic MultipleStatementAlignment sniff reports incorrect errors for multiple assignments on a single line
   

* Version 2.3.0 (stable) - API 2.3.0 (stable) - 2015-03-04


- The existence of the main config file is now cached to reduce is_file() calls when it doesn't exist (request #486)
- Abstract classes inside the Sniffs directory are now ignored even if they are named [Name]Sniff.php (request #476)
  -- Thanks to David Vernet for the patch
- PEAR and Squiz FileComment sniffs no longer have @ in their error codes
  -- e.g., PEAR.Commenting.FileComment.Duplicate@categoryTag becomes PEAR.Commenting.FileComment.DuplicateCategoryTag
  -- e.g., Squiz.Commenting.FileComment.Missing@categoryTag becomes Squiz.Commenting.FileComment.MissingCategoryTag
- PEAR MultiLineConditionSniff now allows comment lines inside multi-line IF statement conditions
  -- Thanks to Klaus Purer for the patch
- Generic ForbiddenFunctionsSniff now supports setting null replacements in ruleset files (request #263)
- Generic opening function brace sniffs now support checking of closures
  -- Set the checkClosures property to TRUE (default is FALSE) in your ruleset.xml file to enable this
  -- Can also set the checkFunctions property to FALSE (default is TRUE) in your ruleset.xml file to only check closures
  -- Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff
- Generic OpeningFunctionBraceKernighanRitchieSniff can now fix all the errors it finds
- Generic OpeningFunctionBraceKernighanRitchieSniff now allows empty functions with braces next to each other
- Generic OpeningFunctionBraceBsdAllmanSniff now allows empty functions with braces next to each other
- Improved auto report width for the "full" report
- Improved conflict detection during auto fixing
- Generic ScopeIndentSniff is no longer confused by empty closures
- Squiz ControlSignatureSniff now always ignores comments (fixes bug #490)
  -- Include the Squiz.Commenting.PostStatementComment sniff in your ruleset.xml to ban these comments again
- Squiz OperatorSpacingSniff no longer throws errors for code in the form ($foo || -1 === $bar)
- Fixed errors tokenizing T_ELSEIF tokens on HHVM 3.5
- Squiz ArrayDeclarationSniff is no longer tricked by comments after array values
- PEAR IncludingFileSniff no longer produces invalid code when removing parenthesis from require/include statements
- Fixed bug #415 : The @codingStandardsIgnoreStart has no effect during fixing
- Fixed bug #432 : Properties of custom sniffs cannot be configured
- Fixed bug #453 : PSR2 standard does not allow closing tag for mixed PHP/HTML files
- Fixed bug #457 : FunctionCallSignature sniffs do not support here/nowdoc syntax and can cause syntax error when fixing
- Fixed bug #466 : PropertyLabelSpacing JS fixer issue when there is no space after colon
- Fixed bug #473 : Writing a report for an empty folder to existing file includes the existing contents
- Fixed bug #485 : PHP notice in Squiz.Commenting.FunctionComment when checking malformed @throws comment
- Fixed bug #491 : Generic InlineControlStructureSniff can correct with missing semicolon
  -- Thanks to Jesse Donat for the patch
- Fixed bug #492 : Use statements don't increase the scope indent
- Fixed bug #493 : PSR1_Sniffs_Methods_CamelCapsMethodNameSniff false positives for some magic method detection
  -- Thanks to Andreas Möller for the patch
- Fixed bug #496 : Closures in PSR2 are not checked for a space after the function keyword
- Fixed bug #497 : Generic InlineControlStructureSniff does not support alternative SWITCH syntax
- Fixed bug #500 : Functions not supported as values in Squiz ArrayDeclaration sniff
- Fixed bug #501 : ScopeClosingBrace and ScopeIndent conflict with closures used as array values
  -- Generic ScopeIndentSniff may now report fewer errors for closures, but perform the same fixes
- Fixed bug #502 : PSR1 SideEffectsSniff sees declare() statements as side effects
   

* Version 2.2.0 (stable) - API 2.2.0 (stable) - 2015-01-22


- Added (hopefully) tastefully used colors to report and progress output for the phpcs command
  -- Use the --colors command line argument to use colors in output
  -- Use the command "phpcs --config-set colors true" to turn colors on by default
  -- Use the --no-colors command line argument to turn colors off when the config value is set
- Added support for using the full terminal width for report output
  -- Use the --report-width=auto command line argument to auto-size the reports
  -- Use the command "phpcs --config-set report_width auto" to use auto-sizing by default
- Reports will now size to fit inside the report width setting instead of always using padding to fill the space
- If no files or standards are specified, PHPCS will now look for a phpcs.xml file in the current directory
  -- This file has the same format as a standard ruleset.xml file
  -- The phpcs.xml file should specify (at least) files to process and a standard/sniffs to use
  -- Useful for running the phpcs and phpcbf commands without any arguments at the top of a repository
- Default file paths can now be specified in a ruleset.xml file using the "file" tag
  -- File paths are only processed if no files were specified on the command line
- Extensions specified on the CLI are now merged with those set in ruleset.xml files
  -- Previously, the ruleset.xml file setting replaced the CLI setting completely
- Squiz coding standard now requires lowercase PHP constants (true, false and null)
  -- Removed Squiz.NamingConventions.ConstantCase sniff as the rule is now consistent across PHP and JS files
- Squiz FunctionOpeningBraceSpaceSniff no longer does additional checks for JS functions
  -- PHP and JS functions and closures are now treated the same way
- Squiz MultiLineFunctionDeclarationSniff now supports JS files
- Interactive mode no longer breaks if you also specify a report type on the command line
- PEAR InlineCommentSniff now fixes the Perl-style comments that it finds (request #375)
- PSR2 standard no longer fixes the placement of docblock open tags as comments are excluded from this standard
- PSR2 standard now sets a default tab width of 4 spaces
- Generic DocCommentSniff now only disallows lowercase letters at the start of a long/short comment (request #377)
  -- All non-letter characters are now allowed, including markdown special characters and numbers
- Generic DisallowMultipleStatementsSniff now allows multiple open/close tags on the same line (request #423)
- Generic CharacterBeforePHPOpeningTagSniff now only checks the first PHP tag it finds (request #423)
- Generic CharacterBeforePHPOpeningTagSniff now allows a shebang line at the start of the file (request #20481)
- Generic InlineHTMLUnitTest now allows a shebang line at the start of the file (request #20481)
- PEAR ObjectOperatorIndentSniff now only checks object operators at the start of a line
- PEAR FileComment and ClassComment sniffs no longer have @ in their error codes
  -- E.g., PEAR.Commenting.FileComment.Missing@categoryTag becomes PEAR.Commenting.FileComment.MissingCategoryTag
  -- Thanks to Grzegorz Rygielski for the patch
- Squiz ControlStructureSpacingSniff no longer enforces a blank line before CATCH statements
- Squiz FunctionCommentSniff now fixes the return type in the @return tag (request #392)
- Squiz BlockCommentSniff now only disallows lowercase letters at the start of the comment
- Squiz InlineCommentSniff now only disallows lowercase letters at the start of the comment
- Squiz OperatorSpacingSniff now has a setting to ignore newline characters around operators (request #348)
  -- Default remains FALSE, so newlines are not allowed
  -- Override the "ignoreNewlines" setting in a ruleset.xml file to change
- PSR2 ControlStructureSpacingSniff now checks for, and fixes, newlines after the opening parenthesis
- Added a markdown document generator (--generator=markdown to use)
  -- Thanks to Stefano Kowalke for the contribution
- Fixed bug #379 : Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast incorrectly detects comments
- Fixed bug #382 : JS tokenizer incorrect for inline conditionally created immediately invoked anon function
- Fixed bug #383 : Squiz.Arrays.ArrayDeclaration.ValueNoNewline incorrectly detects nested arrays
- Fixed bug #386 : Undefined offset in Squiz.FunctionComment sniff when param has no comment
- Fixed bug #390 : Indentation of non-control structures isn't adjusted when containing structure is fixed
- Fixed bug #400 : InlineControlStructureSniff fails to fix when statement has no semicolon
- Fixed bug #401 : PHPCBF no-patch option shows an error when there are no fixable violations in a file
- Fixed bug #405 : The "Squiz.WhiteSpace.FunctionSpacing" sniff removes class "}" during fixing
- Fixed bug #407 : PEAR.ControlStructures.MultiLineCondition doesn't account for comments at the end of lines
- Fixed bug #410 : The "Squiz.WhiteSpace.MemberVarSpacing" not respecting "var"
- Fixed bug #411 : Generic.WhiteSpace.ScopeIndent.Incorrect - false positive with multiple arrays in argument list
- Fixed bug #412 : PSR2 multi-line detection doesn't work for inline IF and string concats
- Fixed bug #414 : Squiz.WhiteSpace.MemberVarSpacing - inconsistent checking of member vars with comment
- Fixed bug #433 : Wrong detection of Squiz.Arrays.ArrayDeclaration.KeyNotAligned when key contains space
- Fixed bug #434 : False positive for spacing around "=>" in inline array within foreach
- Fixed bug #452 : Ruleset exclude-pattern for specific sniff code ignored when using CLI --ignore option
- Fixed bug #20482 : Scope indent sniff can get into infinite loop when processing a parse error
   

* Version 2.1.0 (stable) - API 2.1.0 (stable) - 2014-12-18


- Time and memory output is now shown if progress information is also shown (request #335)
- A tilde can now be used to reference a user's home directory in a path to a standard (request #353)
- Added PHP_CodeSniffer_File::findStartOfStatement() to find the first non-whitespace token in a statement
  -- Possible alternative for code using PHP_CodeSniffer_File::findPrevious() with the local flag set
- Added PHP_CodeSniffer_File::findEndOfStatement() to find the last non-whitespace token in a statement
  -- Possible alternative for code using PHP_CodeSniffer_File::findNext() with the local flag set
- Generic opening function brace sniffs now ensure the opening brace is the last content on the line
  -- Affects OpeningFunctionBraceBsdAllmanSniff and OpeningFunctionBraceKernighanRitchieSniff
  -- Also enforced in PEAR FunctionDeclarationSniff and Squiz MultiLineFunctionDeclarationSniff
- Generic DisallowTabIndentSniff now replaces tabs everywhere it finds them, except in strings and here/now docs
- Generic EmptyStatementSniff error codes now contain the type of empty statement detected (request #314)
  -- All messages generated by this sniff are now errors (empty CATCH was previously a warning)
  -- Message code Generic.CodeAnalysis.EmptyStatement.NotAllowed has been removed
  -- Message code Generic.CodeAnalysis.EmptyStatement.NotAllowedWarning has been removed
  -- New message codes have the format Generic.CodeAnalysis.EmptyStatement.Detected[TYPE]
  -- Example code is Generic.CodeAnalysis.EmptyStatement.DetectedCATCH
  -- You can now use a custom ruleset to change messages to warnings and to exclude them
- PEAR and Squiz FunctionCommentSniffs no longer ban @return tags for constructors and destructors
  -- Removed message PEAR.Commenting.FunctionComment.ReturnNotRequired
  -- Removed message Squiz.Commenting.FunctionComment.ReturnNotRequired
  -- Change initiated by request #324 and request #369
- Squiz EmptyStatementSniff has been removed
  -- Squiz standard now includes Generic EmptyStatementSniff and turns off the empty CATCH error
- Squiz ControlSignatureSniff fixes now retain comments between the closing parenthesis and open brace
- Squiz SuperfluousWhitespaceSniff now checks for extra blank lines inside closures
  -- Thanks to Sertan Danis for the patch
- Squiz ArrayDeclarationSniff now skips function calls while checking multi-line arrays
- Fixed bug #337 : False positive with anonymous functions in Generic_Sniffs_WhiteSpace_ScopeIndentSniff
- Fixed bug #339 : reformatting brace location can result in broken code
- Fixed bug #342 : Nested ternary operators not tokenized correctly
- Fixed bug #345 : Javascript regex not tokenized when inside array
- Fixed bug #346 : PHP path can't be determined in some cases in "phpcs.bat" (on Windows XP)
- Fixed bug #358 : False positives for Generic_Sniffs_WhiteSpace_ScopeIndentSniff
- Fixed bug #361 : Sniff-specific exclude patterns don't work for Windows
- Fixed bug #364 : Don't interpret "use function" as declaration
- Fixed bug #366 : phpcbf with PSR2 errors on control structure alternative syntax
- Fixed bug #367 : Nested Anonymous Functions Causing False Negative
- Fixed bug #371 : Shorthand binary cast causes tokenizer errors
  -- New token T_BINARY_CAST added for the b"string" cast format (the 'b' is the T_BINARY_CAST token)
- Fixed bug #372 : phpcbf parse problem, wrong brace placement for inline IF
- Fixed bug #373 : Double quote usage fix removing too many double quotes
- Fixed bug #20196 : 1.5.2 breaks scope_closer position
   

* Version 2.0.0 (stable) - API 2.0.0 (stable) - 2014-12-05


- JS tokenizer now sets functions as T_CLOSUREs if the function is anonymous
- JS tokenizer now sets all objects to T_OBJECT
  -- Object end braces are set to a new token T_CLOSE_OBJECT
  -- T_OBJECT tokens no longer act like scopes; i.e., they have no condition/opener/closer
  -- T_PROPERTY tokens no longer act like scopes; i.e., they have no condition/opener/closer
  -- T_OBJECT tokens have a bracket_closer instead, which can be used to find the ending
  -- T_CLOSE_OBJECT tokens have a bracket_opener
- Improved regular expression detection in the JS tokenizer
- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment
  -- When the comment is found, the comment line and the following line will be ignored
  -- Thanks to Andy Bulford for the contribution
- PHPCBF now prints output when it is changing into directories
- Improved conflict detection during auto fixing
- The -vvv command line argument will now output the current file content for each loop during fixing
- Generic ScopeIndentSniff now checks that open/close PHP tags are aligned to the correct column
- PEAR FunctionCallSignatureSniff now checks indent of closing parenthesis even if it is not on a line by itself
- PEAR FunctionCallSignatureSniff now supports JS files
- PEAR MultiLineConditionSniff now supports JS files
- Squiz DocCommentAlignmentSniff now supports JS files
- Fixed a problem correcting the closing brace line in Squiz ArrayDeclarationSniff
- Fixed a problem auto-fixing the Squiz.WhiteSpace.FunctionClosingBraceSpace.SpacingBeforeNestedClose error
- Squiz EmbeddedPhpSniff no longer reports incorrect alignment of tags when they are not on new lines
- Squiz EmbeddedPhpSniff now aligns open tags correctly when moving them onto a new line
- Improved fixing of arrays with multiple values in Squiz ArrayDeclarationSniff
- Improved detection of function comments in Squiz FunctionCommentSpacingSniff
- Improved fixing of lines after cases statements in Squiz SwitchDeclarationSniff
- Fixed bug #311 : Suppression of function prototype breaks checking of lines within function
- Fixed bug #320 : Code sniffer identation issue
- Fixed bug #333 : Nested ternary operators causing problems
   

* Version 2.0.0RC4 (beta) - API 2.0.0RC4 (beta) - 2014-11-07


- JS tokenizer now detects xor statements correctly
- Improved detection of properties and objects in the JS tokenizer
- Generic ScopeIndentSniff can now fix indents using tabs instead of spaces
  -- Set the tabIndent property to TRUE in your ruleset.xml file to enable this
  -- It is important to also set a tab-width setting, either in the ruleset or on the command line, for accuracy
- Generic ScopeIndentSniff now checks and auto-fixes JS files
- Generic DisallowSpaceIndentSniff is now able to replace space indents with tab indents during fixing
- Support for phpcs-only and phpcbf-only attributes has been added to all ruleset.xml elements
  -- Allows parts of the ruleset to only apply when using a specific tool
  -- Useful for doing things like excluding indent fixes but still reporting indent errors
- Unit tests can now set command line arguments during a test run
  -- Override getCliValues() and pass an array of CLI arguments for each file being tested
- File-wide sniff properties can now be set using T_INLINE_HTML content during unit test runs
  -- Sniffs that start checking at the open tag can only, normally, have properties set using a ruleset
- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present
  -- Thanks to Thibaud Fabre for the patch
- Generic DocCommentSniff now checks that the end comment tag is on a new line
- Generic MultipleStatementAlignmentSniff no longer skips assignments for closures
- Squiz DocCommentAlignment sniff now has better checking for single line doc block
- Running unit tests with the -v CLI argument no longer generates PHP errors
- Fixed bug #295 : ScopeIndentSniff hangs when processing nested closures
- Fixed bug #298 : False positive in ScopeIndentSniff when anonymous functions are used with method chaining
- Fixed bug #302 : Fixing code in Squiz InlineComment sniff can remove some comment text
- Fixed bug #303 : Open and close tag on same line can cause a PHP notice checking scope indent
- Fixed bug #306 : File containing only a namespace declaration raises undefined index notice
- Fixed bug #307 : Conditional breaks in case statements get incorrect indentions
- Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure
- Fixed bug #310 : Variadics not recognized by tokenizer
   

* Version 2.0.0RC3 (beta) - API 2.0.0RC3 (beta) - 2014-10-16


- Improved default output for PHPCBF and removed the options to print verbose and progress output
- If a .fixed file is supplied for a unit test file, the auto fixes will be checked against it during testing
  -- See Generic ScopeIndentUnitTest.inc and ScopeIndentUnitTest.inc.fixed for an example
- Fixer token replacement methods now return TRUE if the change was accepted and FALSE if rejected
- The --config-show command now pretty-prints the config values
  -- Thanks to Ken Guest for the patch
- Setting and removing config values now catches exceptions if the config file is not writable
  -- Thanks to Ken Guest for the patch
- Setting and removing config values now prints a message to confirm the action and show old values
- Generic ScopeIndentSniff has been completely rewritten to improve fixing and embedded PHP detection
- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents at the start of block comments
- Generic DisallowTabIndent and DisallowSpaceIndent sniffs now detect indents inside multi-line strings
- Generic DisallowTabIndentSniff now replaces tabs inside doc block comments
- Squiz ControlStructureSpacingSniff error codes have been corrected; they were reversed
- Squiz EmbeddedPhpSniff now checks open and close tag indents and fixes some errors
- Squiz FileCommentSniff no longer throws incorrect blank line before comment errors in JS files
- Squiz ClassDeclarationSniff now has better checking for blank lines after a closing brace
- Removed error Squiz.Classes.ClassDeclaration.NoNewlineAfterCloseBrace (request #285)
  -- Already handled by Squiz.Classes.ClassDeclaration.CloseBraceSameLine
- Fixed bug #280 : The --config-show option generates error when there is no config file
   

* Version 2.0.0RC2 (beta) - API 2.0.0RC2 (beta) - 2014-09-26


- Minified JS and CSS files are now detected and skipped (fixes bug #252 and bug #19899)
  -- A warning will be added to the file so it can be found in the report and ignored in the future
- Fixed incorrect length of JS object operator tokens
- PHP tokenizer no longer converts class/function names to special tokens types
  -- Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE
- PHPCS can now exit with 0 if only warnings were found (request #262)
  -- Set the ignore_warnings_on_exit config variable to 1 to set this behaviour
  -- Default remains at exiting with 0 only if no errors and no warnings were found
  -- Also changes return value of PHP_CodeSniffer_Reporting::printReport()
- Rulesets can now set associative array properties
  -- property name="[property]" type="array" value="foo=>bar,baz=>qux"
- Generic ForbiddenFunctionsSniff now has a public property called forbiddenFunctions (request #263)
  -- Override the property in a ruleset.xml file to define forbidden functions and their replacements
  -- A replacement of NULL indicates that no replacement is available
  -- e.g., value="delete=>unset,print=>echo,create_function=>null"
  -- Custom sniffs overriding this one will need to change the visibility of their member var
- Improved closure support in Generic ScopeIndentSniff
- Improved indented PHP tag support in Generic ScopeIndentSniff
- Improved fixing of mixed line indents in Generic ScopeIndentSniff
- Added conflict detection to the file fixer
  -- If 2 sniffs look to be conflicting, one change will be ignored to allow a fix to occur
- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore
  -- Thanks to Alex Slobodiskiy for the patch
- Standards can now be located within hidden directories (further fix for bug #20323)
  -- Thanks to Klaus Purer for the patch
- Sniff ignore patterns now replace Win dir separators like file ignore patterns already did
- Exclude patterns now use backtick delimiters, allowing all special characters to work correctly again
  -- Thanks to Jeremy Edgell for the patch
- Errors converted to warnings in a ruleset (and vice versa) now retain their fixable status
  -- Thanks to Alexander Obuhovich for the patch
- Squiz ConcatenationSpacingSniff now has a setting to specify how many spaces there should around concat operators
  -- Default remains at 0
  -- Override the "spacing" setting in a ruleset.xml file to change
- Added auto-fixes for Squiz InlineCommentSniff
- Generic DocCommentSniff now correctly fixes additional blank lines at the end of a comment
- Squiz OperatorBracketSniff now correctly fixes operations that include arrays
- Zend ClosingTagSniff fix now correctly leaves closing tags when followed by HTML
- Added Generic SyntaxSniff to check for syntax errors in PHP files
  -- Thanks to Blaine Schmeisser for the contribution
- Added Generic OneTraitPerFileSniff to check that only one trait is defined in each file
  -- Thanks to Alexander Obuhovich for the contribution
- Squiz DiscouragedFunctionsSniff now warns about var_dump()
- PEAR ValidFunctionNameSniff no longer throws an error for _()
- Squiz and PEAR FunctionCommentSniffs now support _()
- Generic DisallowTabIndentSniff now checks for, and fixes, mixed indents again
- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names
- Fixed bug #243 : Missing DocBlock not detected
- Fixed bug #248 : FunctionCommentSniff expects ampersand on param name
- Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff
- Fixed bug #20373 : Inline comment sniff tab handling way
- Fixed bug #20377 : Error when trying to execute phpcs with report=json
- Fixed bug #20378 : Report appended to existing file if no errors found in run
- Fixed bug #20381 : Invalid "Comment closer must be on a new line"
  -- Thanks to Brad Kent for the patch
- Fixed bug #20402 : SVN pre-commit hook fails due to unknown argument error
   

* Version 2.0.0RC1 (beta) - API 2.0.0RC1 (beta) - 2014-08-06


- PHPCBF will now fix incorrect newline characters in a file
- PHPCBF now exists cleanly when there are no errors to fix
- Added phpcbf.bat file for Windows
- Verbose option no longer errors when using a phar file with a space in the path
- Fixed a reporting error when using HHVM
  -- Thanks to Martins Sipenko for the patch
- addFixableError() and addFixableWarning() now only return true if the fixer is enabled
  -- Saves checking ($phpcsFile->fixer->enabled === true) before every fix
- Added addErrorOnLine() and addWarningOnLine() to add a non-fixable violation to a line at column 1
  -- Useful if you are generating errors using an external tool or parser and only know line numbers
  -- Thanks to Ondřej Mirtes for the patch
- CSS tokenizer now identifies embedded PHP code using the new T_EMBEDDED_PHP token type
  -- The entire string of PHP is contained in a single token
- PHP tokenizer contains better detection of short array syntax
- Unit test runner now also test any standards installed under the installed_paths config var
- Exclude patterns now use {} delimiters, allowing the | special character to work correctly again
- The filtering component of the --extensions argument is now ignored again when passing filenames
  -- Can still be used to specify a custom tokenizer for each extension when passing filenames
  -- If no tokenizer is specified, default values will be used for common file extensions
- Diff report now produces relative paths on Windows, where possible (further fix for bug #20234)
- If a token's content has been modified by the tab-width setting, it will now have an orig_content in the tokens array
- Generic DisallowSpaceIndent and DisallowTabIndent sniffs now check original indent content even when tab-width is set
  -- Previously, setting --tab-width would force both to check the indent as spaces
- Fixed a problem where PHPCBF could replace tabs with too many spaces when changing indents
- Fixed a problem that could occur with line numbers when using HHVM to check files with Windows newline characters
- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version
- Squiz ArrayDeclarationSniff now supports short array syntax
- Squiz ControlSignatureSniff no longer uses the Abstract Pattern sniff
  -- If you are extending this sniff, you'll need to rewrite your code
  -- The rewrite allows this sniff to fix all control structure formatting issues it finds
- The installed_paths config var now accepts relative paths
  -- The paths are relative to the PHP_CodeSniffer install directory
  -- Thanks to Weston Ruter for the patch
- Generic ScopeIndentSniff now accounts for different open tag indents
- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent
  -- Thanks to Daniel Tschinder for the patch
- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures
  -- Thanks to Dawid Nowak for the patch
- PSR2 UseDeclarationSniff now checks for a single space after the USE keyword
- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace
  -- Thanks to Ole Martin Handeland for the patch
- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL
  -- Thanks to Renan Gonçalves for the patch
- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299)
- Squiz SelfMemberReferenceSniff now works correctly with namespaces
- Squiz FunctionCommentSniff is now more relaxed when checking namespaced type hints
- Tab characters are now encoded in abstract pattern errors messages
  -- Thanks to Blaine Schmeisser for the patch
- Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313)
- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314)
- Source report no longer shows errors if category or sniff names ends in an uppercase error
  -- Thanks to Jonathan Marcil for the patch
- Fixed bug #20261 : phpcbf has an endless fixing loop
- Fixed bug #20268 : Incorrect documentation titles in PEAR documentation
- Fixed bug #20296 : new array notion in function comma check fails
- Fixed bug #20297 : phar does not work when renamed it to phpcs
- Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits
- Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage
- Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method
- Fixed bug #20310 : PSR2 does not check for space after function name
- Fixed bug #20322 : Display rules set to type=error even when suppressing warnings
- Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories
- Fixed bug #20346 : Fixer endless loop with Squiz.CSS sniffs
- Fixed bug #20355 : No sniffs are registered with PHAR on Windows
   

* Version 2.0.0a2 (alpha) - API 2.0.0a2 (alpha) - 2014-05-01


- Added report type --report=info to show information about the checked code to make building a standard easier
  -- Checks a number of things, such as what line length you use, and spacing are brackets, but not everything
  -- Still highly experimental
- Generic LineLengthSniff now shows warnings for long lines referring to licence and VCS information
  -- It previously ignored these lines, but at the expense of performance
- Generic DisallowTabIndent and DisallowSpaceIndent sniffs no longer error when detecting mixed indent types
  -- Only the first type of indent found on a line (space or indent) is considered
- Lots of little performance improvements that can add up to a substantial saving over large code bases
  -- Added a "length" array index to tokens so you don't need to call strlen() of them, or deal with encoding
  -- Can now use isset() to find tokens inside the PHP_CodeSniffer_Tokens static vars instead of in_array()
- Custom reports can now specify a $recordErrors member var; this previously only worked for built-in reports
  -- When set to FALSE, error messages will not be recorded and only totals will be returned
  -- This can save significant memory while processing a large code base
- Removed dependence on PHP_Timer
- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON
- The Squiz and PHPCS standards have increased the max padding for statement alignment from 8 to 12
- Squiz EchoedStringsSniff now supports statments without a semicolon, such as PHP embedded in HTML
- Squiz DoubleQuoteUsageSniff now properly replaces escaped double quotes when fixing a doubled quoted string
- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax
- PSR1 CamelCapsMethodNameSniff now ignores magic methods
  -- Thanks to Eser Ozvataf for the patch
- PSR1 SideEffectsSniff now ignores methods named define()
- PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208)
- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses
  -- Thanks to Maurus Cuelenaere for the patch
- PSR2 ControlStructureSpacingSniff now checks TRY and CATCH statements
- Squiz SuperfluousWhitespaceSniff now detects whitespace at the end of block comment lines
  -- Thanks to Klaus Purer for the patch
- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions
  -- Thanks to Max Galbusera for the patch
- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default
- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars
  -- Thanks to Mikuláš Dítě and Adrian Crepaz for the patch
- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241)
- Fixed bug #20200 : Invalid JSON produced with specific error message
- Fixed bug #20204 : Ruleset exclude checks are case sensitive
- Fixed bug #20213 : Invalid error, Inline IF must be declared on single line
- Fixed bug #20225 : array_merge() that takes more than one line generates error
- Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting
- Fixed bug #20234 : phpcbf patch command absolute paths
- Fixed bug #20240 : Squiz block comment sniff fails when newline present
- Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while
  -- Thanks to Alexander Obuhovich for the patch
- Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope
- Fixed bug #20252 : Unitialized string offset when package name starts with underscore
   

* Version 2.0.0a1 (alpha) - API 2.0.0a1 (alpha) - 2014-02-05


- Added the phpcbf script to automatically fix many errors found by the phpcs script
- Added report type --report=diff to show suggested changes to fix coding standard violations
- The --report argument now allows for custom reports to be used
  -- Use the full path to your custom report class as the report name
- The --extensions argument is now respected when passing filenames; not just with directories
- The --extensions argument now allows you to specify the tokenizer for each extension
  -- e.g., --extensions=module/php,es/js
- Command line arguments can now be set in ruleset files
  -- e.g., arg name="report" value="summary" (print summary report; same as --report=summary)
  -- e.g., arg value="sp" (print source and progress information; same as -sp)
  -- The -vvv, --sniffs, --standard and -l command line arguments cannot be set in this way
- Sniff process() methods can not optionally return a token to ignore up to
  -- If returned, the sniff will not be executed again until the passed token is reached in the file
  -- Useful if you are looking for tokens like T_OPEN_TAG but only want to process the first one
- Removed the comment parser classes and replaced it with a simple comment tokenier
  -- T_DOC_COMMENT tokens are now tokenized into T_DOC_COMMENT_* tokens so they can be used more easily
  -- This change requires a significant rewrite of sniffs that use the comment parser
  -- This change requires minor changes to sniffs that listen for T_DOC_COMMENT tokens directly
- Added Generic DocCommentSniff to check generic doc block formatting
  -- Removed doc block formatting checks from PEAR ClassCommentSniff
  -- Removed doc block formatting checks from PEAR FileCommentSniff
  -- Removed doc block formatting checks from PEAR FunctionCommentSniff
  -- Removed doc block formatting checks from Squiz ClassCommentSniff
  -- Removed doc block formatting checks from Squiz FileCommentSniff
  -- Removed doc block formatting checks from Squiz FunctionCommentSniff
  -- Removed doc block formatting checks from Squiz VariableCommentSniff
- Squiz DocCommentAlignmentSniff has had its error codes changed
  -- NoSpaceBeforeTag becomes NoSpaceAfterStar
  -- SpaceBeforeTag becomes SpaceAfterStar
  -- SpaceBeforeAsterisk becomes SpaceBeforeStar
- Generic MultipleStatementAlignment now aligns assignments within a block so they fit within their max padding setting
  -- The sniff previously requested the padding as 1 space if max padding was exceeded
  -- It now aligns the assignment with surrounding assignments if it can
  -- Removed property ignoreMultiline as multi-line assignments are now handled correctly and should not be ignored
- Squiz FunctionClosingBraceSpaceSniff now requires a blank line before the brace in all cases except function args
- Added error Squiz.Commenting.ClassComment.SpacingAfter to ensure there are no blank lines after a class comment
- Added error Squiz.WhiteSpace.MemberVarSpacing.AfterComment to ensure there are no blank lines after a member var comment
  -- Fixes have also been corrected to not strip the member var comment or indent under some circumstances
  -- Thanks to Mark Scherer for help with this fix
- Added error Squiz.Commenting.FunctionCommentThrowTag.Missing to ensure a throw is documented
- Removed error Squiz.Commenting.FunctionCommentThrowTag.WrongType
- Content passed via STDIN can now specify the filename to use so that sniffs can run the correct filename checks
  -- Ensure the first line of the content is: phpcs_input_file: /path/to/file
- Squiz coding standard now enforces no closing PHP tag at the end of a pure PHP file
- Squiz coding standard now enforces a single newline character at the end of the file
- Squiz ClassDeclarationSniff no longer checks for a PHP ending tag after a class definition
- Squiz ControlStructureSpacingSniff now checks TRY and CATCH statements as well
- Removed MySource ChannelExceptionSniff
   

* Version 1.5.6 (stable) - API 1.5.6 (stable) - 2014-12-05


- JS tokenizer now detects xor statements correctly
- The --config-show command now pretty-prints the config values
  -- Thanks to Ken Guest for the patch
- Setting and removing config values now catches exceptions if the config file is not writable
  -- Thanks to Ken Guest for the patch
- Setting and removing config values now prints a message to confirm the action and show old values
- You can now get PHP_CodeSniffer to ignore a single line by putting @codingStandardsIgnoreLine in a comment
  -- When the comment is found, the comment line and the following line will be ignored
  -- Thanks to Andy Bulford for the contribution
- Generic ConstructorNameSniff no longer errors for PHP4 style constructors when __construct() is present
  -- Thanks to Thibaud Fabre for the patch
- Fixed bug #280 : The --config-show option generates error when there is no config file
- Fixed bug #306 : File containing only a namespace declaration raises undefined index notice
- Fixed bug #308 : Squiz InlineIfDeclarationSniff fails on ternary operators inside closure
- Fixed bug #310 : Variadics not recognized by tokenizer
- Fixed bug #311 : Suppression of function prototype breaks checking of lines within function
   

* Version 1.5.5 (stable) - API 1.5.5 (stable) - 2014-09-25


- PHP tokenizer no longer converts class/function names to special tokens types
  -- Class/function names such as parent and true would become special tokens such as T_PARENT and T_TRUE
- Improved closure support in Generic ScopeIndentSniff
- Improved indented PHP tag support in Generic ScopeIndentSniff
- Generic CamelCapsFunctionNameSniff now ignores a single leading underscore
  -- Thanks to Alex Slobodiskiy for the patch
- Standards can now be located within hidden directories (further fix for bug #20323)
  -- Thanks to Klaus Purer for the patch
- Added Generic SyntaxSniff to check for syntax errors in PHP files
  -- Thanks to Blaine Schmeisser for the contribution
- Squiz DiscouragedFunctionsSniff now warns about var_dump()
- PEAR ValidFunctionNameSniff no longer throws an error for _()
- Squiz and PEAR FunctionCommentSnif now support _()
- Generic UpperCaseConstantSniff and LowerCaseConstantSniff now ignore function names
- Fixed bug #248 : FunctionCommentSniff expects ampersand on param name
- Fixed bug #265 : False positives with type hints in ForbiddenFunctionsSniff
- Fixed bug #20373 : Inline comment sniff tab handling way
- Fixed bug #20378 : Report appended to existing file if no errors found in run
- Fixed bug #20381 : Invalid "Comment closer must be on a new line"
  -- Thanks to Brad Kent for the patch
- Fixed bug #20386 : Squiz.Commenting.ClassComment.SpacingBefore thrown if first block comment
   

* Version 1.5.4 (stable) - API 1.5.4 (stable) - 2014-08-06


- Removed use of sys_get_temp_dir() as this is not supported by the min PHP version
- The installed_paths config var now accepts relative paths
  -- The paths are relative to the PHP_CodeSniffer install directory
  -- Thanks to Weston Ruter for the patch
- Generic ScopeIndentSniff now accounts for different open tag indents
- PEAR FunctionDeclarationSniff now ignores short arrays when checking indent
  -- Thanks to Daniel Tschinder for the patch
- PSR2 FunctionCallSignatureSniff now treats multi-line strings as a single-line argument, like arrays and closures
  -- Thanks to Dawid Nowak for the patch
- Generic ForbiddenFunctionsSniff now detects calls to functions in the global namespace
  -- Thanks to Ole Martin Handeland for the patch
- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore namespaces beginning with TRUE/FALSE/NULL
  -- Thanks to Renan Gonçalves for the patch
- Squiz InlineCommentSniff no longer requires a blank line after post-statement comments (request #20299)
- Squiz SelfMemberReferenceSniff now works correctly with namespaces
- Tab characters are now encoded in abstract pattern errors messages
  -- Thanks to Blaine Schmeisser for the patch
- Invalid sniff codes passed to --sniffs now show a friendly error message (request #20313)
- Generic LineLengthSniff now shows a warning if the iconv module is disabled (request #20314)
- Source report no longer shows errors if category or sniff names ends in an uppercase error
  -- Thanks to Jonathan Marcil for the patch
- Fixed bug #20268 : Incorrect documentation titles in PEAR documentation
- Fixed bug #20296 : new array notion in function comma check fails
- Fixed bug #20307 : PHP_CodeSniffer_Standards_AbstractVariableSniff analyze traits
- Fixed bug #20308 : Squiz.ValidVariableNameSniff - wrong variable usage
- Fixed bug #20309 : Use "member variable" term in sniff "processMemberVar" method
- Fixed bug #20310 : PSR2 does not check for space after function name
- Fixed bug #20322 : Display rules set to type=error even when suppressing warnings
- Fixed bug #20323 : PHPCS tries to load sniffs from hidden directories
   

* Version 1.5.3 (stable) - API 1.5.3 (stable) - 2014-05-01


- Improved detection of nested IF statements that use the alternate IF/ENDIF syntax
- PHP tokenizer now supports DEFAULT statements opened with a T_SEMICOLON
- PSR1 CamelCapsMethodNameSniff now ignores magic methods
  -- Thanks to Eser Ozvataf for the patch
- PSR1 SideEffectsSniff now ignores methods named define()
- PSR1 and PEAR ClassDeclarationSniffs now support traits (request #20208)
- PSR2 ControlStructureSpacingSniff now allows newlines before/after parentheses
  -- Thanks to Maurus Cuelenaere for the patch
- Squiz LowercasePHPFunctionsSniff no longer reports errors for namespaced functions
  -- Thanks to Max Galbusera for the patch
- Squiz SwitchDeclarationSniff now allows exit() as a breaking statement for case/default
- Squiz ValidVariableNameSniff and Zend ValidVariableNameSniff now ignore additional PHP reserved vars
  -- Thanks to Mikuláš Dítě and Adrian Crepaz for the patch
- Sniff code Squiz.WhiteSpace.MemberVarSpacing.After changed to Squiz.WhiteSpace.MemberVarSpacing.Incorrect (request #20241)
- Fixed bug #20200 : Invalid JSON produced with specific error message
- Fixed bug #20204 : Ruleset exclude checks are case sensitive
- Fixed bug #20213 : Invalid error, Inline IF must be declared on single line
- Fixed bug #20225 : array_merge() that takes more than one line generates error
- Fixed bug #20230 : Squiz ControlStructureSpacing sniff assumes specific condition formatting
- Fixed bug #20240 : Squiz block comment sniff fails when newline present
- Fixed bug #20247 : The Squiz.WhiteSpace.ControlStructureSpacing sniff and do-while
  -- Thanks to Alexander Obuhovich for the patch
- Fixed bug #20248 : The Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff sniff and empty scope
- Fixed bug #20252 : Unitialized string offset when package name starts with underscore
   

* Version 1.5.2 (stable) - API 1.5.2 (stable) - 2014-02-05


- Improved support for the PHP 5.5. classname::class syntax
  -- PSR2 SwitchDeclarationSniff no longer throws errors when this syntax is used in CASE conditions
- Improved support for negative checks of instanceOf in Squiz ComparisonOperatorUsageSniff
  -- Thanks to Martin Winkel for the patch
- Generic FunctionCallArgumentSpacingSniff now longer complains about space before comma when using here/nowdocs
  -- Thanks to Richard van Velzen for the patch
- Generic LowerCaseConstantSniff and UpperCaseConstantSniff now ignore class constants
  -- Thanks to Kristopher Wilson for the patch
- PEAR FunctionCallSignatureSniff now has settings to specify how many spaces should appear before/after parentheses
  -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change
  -- Default remains at 0 for both
  -- Thanks to Astinus Eberhard for the patch
- PSR2 ControlStructureSpacingSniff now has settings to specify how many spaces should appear before/after parentheses
  -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change
  -- Default remains at 0 for both
  -- Thanks to Astinus Eberhard for the patch
- Squiz ForEachLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses
  -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change
  -- Default remains at 0 for both
  -- Thanks to Astinus Eberhard for the patch
- Squiz ForLoopDeclarationSniff now has settings to specify how many spaces should appear before/after parentheses
  -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change
  -- Default remains at 0 for both
  -- Thanks to Astinus Eberhard for the patch
- Squiz FunctionDeclarationArgumentSpacingSniff now has settings to specify how many spaces should appear before/after parentheses
  -- Override the 'requiredSpacesAfterOpen' and 'requiredSpacesBeforeClose' settings in a ruleset.xml file to change
  -- Default remains at 0 for both
  -- Thanks to Astinus Eberhard for the patch
- Removed UnusedFunctionParameter, CyclomaticComplexity and NestingLevel from the Squiz standard
- Generic FixmeSniff and TodoSniff now work correctly with accented characters
- Fixed bug #20145 : Custom ruleset preferences directory over installed standard
- Fixed bug #20147 : phpcs-svn-pre-commit - no more default error report
- Fixed bug #20151 : Problem handling "if(): ... else: ... endif;" syntax
- Fixed bug #20190 : Invalid regex in Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff
   

* Version 1.5.1 (stable) - API 1.5.1 (stable) - 2013-12-12


- Config values can now be set at runtime using the command line argument [--runtime-set key value]
  -- Runtime values are the same as config values, but are not written to the main config file
  -- Thanks to Wim Godden for the patch
- Config values can now be set in ruleset files
  -- e.g., config name="zend_ca_path" value="/path/to/ZendCodeAnalyzer"
  -- Can not be used to set config values that override command line values, such as show_warnings
  -- Thanks to Jonathan Marcil for helping with the patch
- Added a new installed_paths config value to allow for the setting of directories that contain standards
  -- By default, standards have to be installed into the CodeSniffer/Standards directory to be considered installed
  -- New config value allows a list of paths to be set in addition to this internal path
  -- Installed standards appear when using the -i arg, and can be referenced in rulesets using only their name
  -- Set paths by running: phpcs --config-set installed_paths /path/one,/path/two,...
- PSR2 ClassDeclarationSniff now allows a list of extended interfaces to be split across multiple lines
- Squiz DoubleQuoteUsageSniff now allows \b in double quoted strings
- Generic ForbiddenFunctionsSniff now ignores object creation
  -- This is a further fix for bug #20100 : incorrect Function mysql() has been deprecated report
- Fixed bug #20136 : Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff and Traits
- Fixed bug #20138 : Protected property underscore and camel caps issue (in trait with Zend)
  -- Thanks to Gaetan Rousseau for the patch
- Fixed bug #20139 : No report file generated on success
   

* Version 1.5.0 (stable) - API 1.5.0 (stable) - 2013-11-28


- Doc generation is now working again for installed standards
  -- Includes a fix for limiting the docs to specific sniffs
- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files
  -- E.g., to ignore comments, override a property using:
  -- name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT"
- PSR2 standard now ignores comments when checking indentation rules
- Generic UpperCaseConstantNameSniff no longer reports errors where constants are used (request #20090)
  -- It still reports errors where constants are defined
- Individual messages can now be excluded in ruleset.xml files using the exclude tag (request #20091)
  -- Setting message severity to 0 continues to be supported
- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator
  -- Thanks to Antoine Musso for the patch
- Comment parser now supports non-English characters when splitting comment lines into words
  -- Thanks to Nik Sun for the patch
- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks
  -- Thanks to Maksim Kochkin for the patch
- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values
  -- Missing values will be set to the CLI defaults
  -- Thanks to Maksim Kochkin for the patch
- Fixed bug #20093 : Bug with ternary operator token
- Fixed bug #20097 : CLI.php throws error in php 5.2
- Fixed bug #20100 : incorrect Function mysql() has been deprecated report
- Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s
- Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop
- Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control
- Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag
   

* Version 1.5.0RC4 (beta) - API 1.5.0RC4 (beta) - 2013-09-26


- You can now restrict violations to individual sniff codes using the --sniffs command line argument
 -- Previously, this only restricted violations to an entire sniff and not individual messages
 -- If you have scripts calling PHP_CodeSniffer::process() or creating PHP_CodeSniffer_File objects, you must update your code
 -- The array of restrictions passed to PHP_CodeSniffer::process() must now be an array of sniff codes instead of class names
 -- The PHP_CodeSniffer_File::__construct() method now requires an array of restrictions to be passed
- Doc generation is now working again
- Progress information now shows the percentage complete at the end of each line
- Added report type --report=junit to show the error list in a JUnit compatible format
  -- Thanks to Oleg Lobach for the contribution
- Added support for the PHP 5.4 callable type hint
- Fixed problem where some file content could be ignored when checking STDIN
- Version information is now printed when installed via composer or run from a Git clone (request #20050)
- Added Squiz DisallowBooleanStatementSniff to ban boolean operators outside of control structure conditions
- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings
- Coding standard ignore comments can now appear instead doc blocks as well as inline comments
  -- Thanks to Stuart Langley for the patch
- Generic LineLengthSniff now ignores SVN URL and Head URL comments
  -- Thanks to Karl DeBisschop for the patch
- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Hugo Fonseca for the patch
- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence
- Squiz standard now allows lines to be 120 characters long before warning; up from 85
- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions
- Squiz ClassFileNameSniff no longer throws errors when checking STDIN
- Squiz CSS sniffs no longer generate errors for IE filters
- Squiz CSS IndentationSniff no longer sees comments as blank lines
- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line
- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier'
  -- Thanks to Renat Akhmedyanov for the patch
- Added support for the PSR2 multi-line arguments errata
- The PSR2 standard no longer throws errors for additional spacing after a type hint
- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs
- Fixed cases where code was incorrectly assigned the T_GOTO_LABEL token when used in a complex CASE condition
- Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong
  -- Adds new error message for single-line arrays that end with a comma
- Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses
- Fixed bug #20043 : Mis-interpretation of Foo::class
- Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores
- Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions
- Fixed bug #20051 : Undefined index: scope_opener / scope_closer
  -- Thanks to Anthon Pang for the patch
   

* Version 1.5.0RC3 (beta) - API 1.5.0RC3 (beta) - 2013-07-25


- Added report type --report=json to show the error list and total counts for all checked files
  -- Thanks to Jeffrey Fisher for the contribution
- PHP_CodeSniffer::isCamelCaps now allows for acronyms at the start of a string if the strict flag is FALSE
  -- acronyms are defined as at least 2 uppercase characters in a row
  -- e.g., the following is now valid camel caps with strict set to FALSE: XMLParser
- The PHP tokenizer now tokenizes goto labels as T_GOTO_LABEL instead of T_STRING followed by T_COLON
- The JS tokenizer now has support for the T_THROW token
- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported
  -- Only available since PHP 5.2.11 and 5.3.1
  -- Thanks to Maik Penz for the patch
- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON
  -- Thanks to Arnout Boks for the patch
- Explaining a standard (phpcs -e) that uses namespaces now works correctly
- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs
  -- Thanks to Maik Penz for the patch
- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well
  -- Thanks to Spencer Rinehart for the contribution
- Clearer error message for when the sniff class name does not match the directory structure
- Generated HTML docs now correctly show the open PHP tag in code comparison blocks
- Added Generic InlineHTMLSniff to ensure a file only contains PHP code
- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used
- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles
- Added Squiz NamedColoursSniff to ban the use of colour names
- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon
- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position
- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements
- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the indent setting in a ruleset.xml file to change
  -- Thanks to Andrey Mindubaev for the patch
- Squiz FileExtensionSniff now supports traits
  -- Thanks to Lucas Green for the patch
- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call
- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements
- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions
- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement
- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names
- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements
- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable
  -- Thanks to Maik Penz for the patch
- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes
  -- Thanks to Spencer Rinehart for the patch
- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements
  -- Thanks to Arnout Boks for the patch
- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens
  -- Thanks to Arnout Boks for the patch
- Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff
  -- Thanks to Erik Wiffin for the patch
- Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error
- Fixed bug #19897 : Indenting warnings in templates not consistent
- Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif
- Fixed bug #19930 : option --report-file generate an empty file
- Fixed bug #19935 : notify-send reports do not vanish in gnome-shell
  -- Thanks to Christian Weiske for the patch
- Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function
- Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class
- Fixed bug #19956 : phpcs warns for Type Hint missing Resource
- Fixed bug #19957 : Does not understand trait method aliasing
- Fixed bug #19968 : Permission denied on excluded directory
- Fixed bug #19969 : Sniffs with namespace not recognized in reports
- Fixed bug #19997 : Class names incorrectly detected as constants
   

* Version 1.5.0RC2 (beta) - API 1.5.0RC2 (beta) - 2013-04-04


- Ruleset processing has been rewritten to be more predictable
  -- Provides much better support for relative paths inside ruleset files
  -- May mean that sniffs that were previously ignored are now being included when importing external rulesets
  -- Ruleset processing output can be seen by using the -vv command line argument
  -- Internal sniff registering functions have all changed, so please review custom scripts
- You can now pass multiple coding standards on the command line, comma separated (request #19144)
  -- Works with built-in or custom standards and rulesets, or a mix of both
- You can now exclude directories or whole standards in a ruleset XML file (request #19731)
  -- e.g., exclude "Generic.Commenting" or just "Generic"
  -- You can also pass in a path to a directory instead, if you know it
- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase
  -- The PSR2 and Squiz standards now use this sniff
- Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863)
- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843)
  -- Default remains at 2
  -- Override the "spacing" setting in a ruleset.xml file to change
- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking
  -- Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality
- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions
- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files
- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the indent setting in a ruleset.xml file to change
  -- Thanks to Asher Snyder for the patch
- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored
  -- The first token on the line is checked and the whole line is ignored if the token is in the array
  -- Thanks to Eloy Lafuente for the patch
- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword
  -- Thanks to Anthon Pang for the patch
- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found
  -- This allows you to create wrapper scripts for PHPCS more easily
- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_"
  -- Thanks to Bart S for the patch
- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid
- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file
- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file
- Fixed bug #19819 : Freeze with syntax error in use statement
- Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff
- Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed
- Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes
- Fixed bug #19879 : bitwise and operator interpreted as reference by value
   

* Version 1.5.0RC1 (beta) - API 1.5.0RC1 (beta) - 2013-02-08


- Reports have been completely rewritten to consume far less memory
  -- Each report is incrementally written to the file system during a run and then printed out when the run ends
  -- There is no longer a need to keep the list of errors and warnings in memory during a run
- Multi-file sniff support has been removed because they are too memory intensive
  -- If you have a custom multi-file sniff, you can convert it into a standard sniff quite easily
  -- See CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php for an example
   

* Version 1.4.8 (stable) - API 1.4.8 (stable) - 2013-11-26


- Generic ScopeIndentSniff now allows for ignored tokens to be set via ruleset.xml files
  -- E.g., to ignore comments, override a property using:
  -- name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT"
- PSR2 standard now ignores comments when checking indentation rules
- Squiz OperatorSpacingSniff no longer throws errors for the ?: short ternary operator
  -- Thanks to Antoine Musso for the patch
- Comment parser now supports non-English characters when splitting comment lines into words
  -- Thanks to Nik Sun for the patch
- Exit statements are now recognised as valid closers for CASE and DEFAULT blocks
  -- Thanks to Maksim Kochkin for the patch
- PHP_CodeSniffer_CLI::process() can now be passed an incomplete array of CLI values
  -- Missing values will be set to the CLI defaults
  -- Thanks to Maksim Kochkin for the patch
- Fixed bug #20097 : CLI.php throws error in php 5.2
- Fixed bug #20100 : incorrect Function mysql() has been deprecated report
- Fixed bug #20119 : PHP warning: invalid argument to str_repeat() in SVN blame report with -s
- Fixed bug #20123 : PSR2 complains about an empty second statement in for-loop
- Fixed bug #20131 : PHP errors in svnblame report, if there are files not under version control
- Fixed bug #20133 : Allow "HG: hg_id" as value for @version tag
   

* Version 1.4.7 (stable) - API 1.4.7 (stable) - 2013-09-26


- Added report type --report=junit to show the error list in a JUnit compatible format
  -- Thanks to Oleg Lobach for the contribution
- Added support for the PHP 5.4 callable type hint
- Fixed problem where some file content could be ignored when checking STDIN
- Version information is now printed when installed via composer or run from a Git clone (request #20050)
- The CSS tokenizer is now more reliable when encountering 'list' and 'break' strings
- Coding standard ignore comments can now appear instead doc blocks as well as inline comments
  -- Thanks to Stuart Langley for the patch
- Generic LineLengthSniff now ignores SVN URL and Head URL comments
  -- Thanks to Karl DeBisschop for the patch
- PEAR MultiLineConditionSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- PEAR MultiLineAssignmentSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- PEAR FunctionDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- Squiz SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Szabolcs Sulik for the patch
- Squiz CSS IndentationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the 'indent' setting in a ruleset.xml file to change
  -- Thanks to Hugo Fonseca for the patch
- Squiz and MySource File and Function comment sniffs now allow all tags and don't require a particular licence
- Squiz LowercaseStyleDefinitionSniff no longer throws errors for class names in nested style definitions
- Squiz ClassFileNameSniff no longer throws errors when checking STDIN
- Squiz CSS sniffs no longer generate errors for IE filters
- Squiz CSS IndentationSniff no longer sees comments as blank lines
- Squiz LogicalOperatorSpacingSniff now ignores whitespace at the end of a line
- Squiz.Scope.MethodScope.Missing error message now mentions 'visibility' instead of 'scope modifier'
  -- Thanks to Renat Akhmedyanov for the patch
- Added support for the PSR2 multi-line arguments errata
- The PSR2 standard no longer throws errors for additional spacing after a type hint
- PSR UseDeclarationSniff no longer throws errors for USE statements inside TRAITs
- Fixed bug #20026 : Check for multi-line arrays that should be single-line is slightly wrong
  -- Adds new error message for single-line arrays that end with a comma
- Fixed bug #20029 : ForbiddenFunction sniff incorrectly recognizes methods in USE clauses
- Fixed bug #20043 : Mis-interpretation of Foo::class
- Fixed bug #20044 : PSR1 camelCase check does not ignore leading underscores
- Fixed bug #20045 : Errors about indentation for closures with multi-line 'use' in functions
   

* Version 1.4.6 (stable) - API 1.4.6 (stable) - 2013-07-25


- Added report type --report=json to show the error list and total counts for all checked files
  -- Thanks to Jeffrey Fisher for the contribution
- The JS tokenizer now has support for the T_THROW token
- Symlinked directories inside CodeSniffer/Standards and in ruleset.xml files are now supported
  -- Only available since PHP 5.2.11 and 5.3.1
  -- Thanks to Maik Penz for the patch
- The JS tokenizer now correctly identifies T_INLINE_ELSE tokens instead of leaving them as T_COLON
  -- Thanks to Arnout Boks for the patch
- Explaining a standard (phpcs -e) that uses namespaces now works correctly
- Restricting a check to specific sniffs (phpcs --sniffs=...) now works correctly with namespaced sniffs
  -- Thanks to Maik Penz for the patch
- Docs added for the entire Generic standard, and many sniffs from other standards are now documented as well
  -- Thanks to Spencer Rinehart for the contribution
- Clearer error message for when the sniff class name does not match the directory structure
- Generated HTML docs now correctly show the open PHP tag in code comparison blocks
- Added Generic InlineHTMLSniff to ensure a file only contains PHP code
- Added Squiz ShorthandSizeSniff to check that CSS sizes are using shorthand notation only when 1 or 2 values are used
- Added Squiz ForbiddenStylesSniff to ban the use of some deprecated browser-specific styles
- Added Squiz NamedColoursSniff to ban the use of colour names
- PSR2 standard no longer enforces no whitespace between the closing parenthesis of a function call and the semicolon
- PSR2 ClassDeclarationSniff now ignores empty classes when checking the end brace position
- PSR2 SwitchDeclarationSniff no longer reports errors for empty lines between CASE statements
- PEAR ObjectOperatorIndentSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the indent setting in a ruleset.xml file to change
  -- Thanks to Andrey Mindubaev for the patch
- Squiz FileExtensionSniff now supports traits
  -- Thanks to Lucas Green for the patch
- Squiz ArrayDeclarationSniff no longer reports errors for no comma at the end of a line that contains a function call
- Squiz SwitchDeclarationSniff now supports T_CONTINUE and T_THROW as valid case/default breaking statements
- Squiz CommentedOutCodeSniff is now better at ignoring commented out HTML, XML and regular expressions
- Squiz DisallowComparisonAssignmentSniff no longer throws errors for the third expression in a FOR statement
- Squiz ColourDefinitionSniff no longer throws errors for some CSS class names
- Squiz ControlStructureSpacingSniff now supports all types of CASE/DEFAULT breaking statements
- Generic CallTimePassByReferenceSniff now reports errors for functions called using a variable
  -- Thanks to Maik Penz for the patch
- Generic ConstructorNameSniff no longer throws a notice for abstract constructors inside abstract classes
  -- Thanks to Spencer Rinehart for the patch
- Squiz ComparisonOperatorUsageSniff now checks inside elseif statements
  -- Thanks to Arnout Boks for the patch
- Squiz OperatorSpacingSniff now reports errors for no spacing around inline then and else tokens
  -- Thanks to Arnout Boks for the patch
- Fixed bug #19811 : Comments not ignored in all cases in AbstractPatternSniff
  -- Thanks to Erik Wiffin for the patch
- Fixed bug #19892 : ELSE with no braces causes incorrect SWITCH break statement indentation error
- Fixed bug #19897 : Indenting warnings in templates not consistent
- Fixed bug #19908 : PEAR MultiLineCondition Does Not Apply elseif
- Fixed bug #19913 : Running phpcs in interactive mode causes warnings
  -- Thanks to Harald Franndorfer for the patch
- Fixed bug #19935 : notify-send reports do not vanish in gnome-shell
  -- Thanks to Christian Weiske for the patch
- Fixed bug #19944 : docblock squiz sniff "return void" trips over return in lambda function
- Fixed bug #19953 : PSR2 - Spaces before interface name for abstract class
- Fixed bug #19956 : phpcs warns for Type Hint missing Resource
- Fixed bug #19957 : Does not understand trait method aliasing
- Fixed bug #19968 : Permission denied on excluded directory
- Fixed bug #19969 : Sniffs with namespace not recognized in reports
- Fixed bug #19997 : Class names incorrectly detected as constants
   

* Version 1.4.5 (stable) - API 1.4.5 (stable) - 2013-04-04


- Added Generic LowerCaseKeywordSniff to ensure all PHP keywords are defined in lowercase
  -- The PSR2 and Squiz standards now use this sniff
- Added Generic SAPIUsageSniff to ensure the PHP_SAPI constant is used instead of php_sapi_name() (request #19863)
- Squiz FunctionSpacingSniff now has a setting to specify how many lines there should between functions (request #19843)
  -- Default remains at 2
  -- Override the "spacing" setting in a ruleset.xml file to change
- Squiz LowercasePHPFunctionSniff no longer throws errors for the limited set of PHP keywords it was checking
  -- Add a rule for Generic.PHP.LowerCaseKeyword to your ruleset to replicate this functionality
- Added support for the PHP 5.4 T_CALLABLE token so it can be used in lower PHP versions
- Generic EndFileNoNewlineSniff now supports checking of CSS and JS files
- PSR2 SwitchDeclarationSniff now has a setting to specify how many spaces code should be indented
  -- Default remains at 4; override the indent setting in a ruleset.xml file to change
  -- Thanks to Asher Snyder for the patch
- Generic ScopeIndentSniff now has a setting to specify a list of tokens that should be ignored
  -- The first token on the line is checked and the whole line is ignored if the token is in the array
  -- Thanks to Eloy Lafuente for the patch
- Squiz LowercaseClassKeywordsSniff now checks for the TRAIT keyword
  -- Thanks to Anthon Pang for the patch
- If you create your own PHP_CodeSniffer object, PHPCS will no longer exit when an unknown argument is found
  -- This allows you to create wrapper scripts for PHPCS more easily
- PSR2 MethodDeclarationSniff no longer generates a notice for methods named "_"
  -- Thanks to Bart S for the patch
- Squiz BlockCommentSniff no longer reports that a blank line between a scope closer and block comment is invalid
- Generic DuplicateClassNameSniff no longer reports an invalid error if multiple PHP open tags exist in a file
- Generic DuplicateClassNameSniff no longer reports duplicate errors if multiple PHP open tags exist in a file
- Fixed bug #19819 : Freeze with syntax error in use statement
- Fixed bug #19820 : Wrong message level in Generic_Sniffs_CodeAnalysis_EmptyStatementSniff
- Fixed bug #19859 : CodeSniffer::setIgnorePatterns API changed
- Fixed bug #19871 : findExtendedClassName doesn't return FQCN on namespaced classes
- Fixed bug #19879 : bitwise and operator interpreted as reference by value
   

* Version 1.4.4 (stable) - API 1.4.4 (stable) - 2013-02-07


- Ignored lines no longer cause the summary report to show incorrect error and warning counts
  -- Thanks to Bert Van Hauwaert for the patch
- Added Generic CSSLintSniff to run CSSLint over a CSS file and report warnings
  -- Set full command to run CSSLint using phpcs --config-set csslint_path /path/to/csslint
  -- Thanks to Roman Levishchenko for the contribution
- Added PSR2 ControlStructureSpacingSniff to ensure there are no spaces before and after parenthesis in control structures
  -- Fixes bug #19732 : PSR2: some control structures errors not reported
- Squiz commenting sniffs now support non-English characters when checking for capital letters
  -- Thanks to Roman Levishchenko for the patch
- Generic EndFileNewlineSniff now supports JS and CSS files
  -- Thanks to Denis Ryabkov for the patch
- PSR1 SideEffectsSniff no longer reports constant declarations as side effects
- Notifysend report now supports notify-send versions before 0.7.3
  -- Thanks to Ken Guest for the patch
- PEAR and Squiz FunctionCommentSniffs no longer report errors for misaligned argument comments when they are blank
  -- Thanks to Thomas Peterson for the patch
- Squiz FunctionDeclarationArgumentSpacingSniff now works correctly for equalsSpacing values greater than 0
  -- Thanks to Klaus Purer for the patch
- Squiz SuperfluousWhitespaceSniff no longer throws errors for CSS files with no newline at the end
- Squiz SuperfluousWhitespaceSniff now allows a single newline at the end of JS and CSS files
- Fixed bug #19755 : Token of T_CLASS type has no scope_opener and scope_closer keys
- Fixed bug #19759 : Squiz.PHP.NonExecutableCode fails for return function()...
- Fixed bug #19763 : Use statements for traits not recognised correctly for PSR2 code style
- Fixed bug #19764 : Instead of for traits throws uppercase constant name errors
- Fixed bug #19772 : PSR2_Sniffs_Namespaces_UseDeclarationSniff does not properly recognize last use
- Fixed bug #19775 : False positive in NonExecutableCode sniff when not using curly braces
- Fixed bug #19782 : Invalid found size functions in loop when using object operator
- Fixed bug #19799 : config folder is not created automatically
- Fixed bug #19804 : JS Tokenizer wrong /**/ parsing
   

* Version 1.4.3 (stable) - API 1.4.3 (stable) - 2012-12-04


- Added support for the PHP 5.5 T_FINALLY token to detect try/catch/finally statements
- Added empty CodeSniffer.conf to enable config settings for Composer installs
- Added Generic EndFileNoNewlineSniff to ensure there is no newline at the end of a file
- Autoloader can now load PSR-0 compliant classes
  -- Thanks to Maik Penz for the patch
- Squiz NonExecutableCodeSniff no longer throws error for multi-line RETURNs inside CASE statements
  -- Thanks to Marc Ypes for the patch
- Squiz OperatorSpacingSniff no longer reports errors for negative numbers inside inline THEN statements
  -- Thanks to Klaus Purer for the patch
- Squiz OperatorSpacingSniff no longer reports errors for the assignment of operations involving negative numbers
- Squiz SelfMemberReferenceSniff can no longer get into an infinite loop when checking a static call with a namespace
  -- Thanks to Andy Grunwald for the patch
- Fixed bug #19699 : Generic.Files.LineLength giving false positives when tab-width is used
- Fixed bug #19726 : Wrong number of spaces expected after instanceof static
  - Fixed bug #19727 : PSR2: no error reported when using } elseif {
   

* Version 1.4.2 (stable) - API 1.4.2 (stable) - 2012-11-09


- PHP_CodeSniffer can now be installed using Composer
  -- Require squizlabs/php_codesniffer in your composer.json file
  -- Thanks to Rob Bast, Stephen Rees-Carter, Stefano Kowalke and Ivan Habunek for help with this
- Squiz BlockCommentSniff and InlineCommentSniff no longer report errors for trait block comments
- Squiz SelfMemberReferenceSniff now supports namespaces
  -- Thanks to Andy Grunwald for the patch
- Squiz FileCommentSniff now uses tag names inside the error codes for many messages
  -- This allows you to exclude specific missing, out of order etc., tags
- Squiz SuperfluousWhitespaceSniff now has an option to ignore blank lines
  -- This will stop errors being reported for lines that contain only whitespace
  -- Set the ignoreBlankLines property to TRUE in your ruleset.xml file to enable this
- PSR2 no longer reports errors for whitespace at the end of blank lines
- Fixed gitblame report not working on Windows
  -- Thanks to Rogerio Prado de Jesus
- Fixed an incorrect error in Squiz OperatorSpacingSniff for default values inside a closure definition
- Fixed bug #19691 : SubversionPropertiesSniff fails to find missing properties
  -- Thanks to Kevin Winahradsky for the patch
- Fixed bug #19692 : DisallowMultipleAssignments is triggered by a closure
- Fixed bug #19693 : exclude-patterns no longer work on specific messages
- Fixed bug #19694 : Squiz.PHP.LowercasePHPFunctions incorrectly matches return by ref functions
   

* Version 1.4.1 (stable) - API 1.4.1 (stable) - 2012-11-02


- All ignore patterns have been reverted to being checked against the absolute path of a file
  -- Patterns can be specified to be relative in a rulset.xml file, but nowhere else
  -- e.g., [exclude-pattern type="relative"]^tests/*[/exclude-pattern] (with angle brackets, not square brackets)
- Added support for PHP tokenizing of T_INLINE_ELSE colons, so this token type is now available
  -- Custom sniffs that rely on looking for T_COLON tokens inside inline if statements must be changed to use the new token
  -- Fixes bug #19666 : PSR1.Files.SideEffects throws a notice Undefined index: scope_closer
- Messages can now be changed from errors to warnings (and vice versa) inside ruleset.xml files
  -- As you would with "message" and "severity", specify a "type" tag under a "rule" tag and set the value to "error" or "warning"
- PHP_CodeSniffer will now generate a warning on files that it detects have mixed line endings
  -- This warning has the code Internal.LineEndings.Mixed and can be overriden in a ruleset.xml file
  -- Thanks to Vit Brunner for help with this
- Sniffs inside PHP 5.3 namespaces are now supported, along with the existing underscore-style emulated namespaces
  -- For example: namespace MyStandard\Sniffs\Arrays; class ArrayDeclarationSniff implements \PHP_CodeSniffer_Sniff { ...
  -- Thanks to Till Klampaeckel for the patch
- Generic DuplicateClassNameSniff is no longer a multi-file sniff, so it won't max out your memory
  -- Multi-file sniff support should be considered deprecated as standard sniffs can now do the same thing
- Added Generic DisallowSpaceIndent to check that files are indented using tabs
- Added Generic OneClassPerFileSniff to check that only one class is defined in each file
  -- Thanks to Andy Grunwald for the contribution
- Added Generic OneInterfacePerFileSniff to check that only one interface is defined in each file
  -- Thanks to Andy Grunwald for the contribution
- Added Generic LowercasedFilenameSniff to check that filenames are lowercase
  -- Thanks to Andy Grunwald for the contribution
- Added Generic ClosingPHPTagSniff to check that each open PHP tag has a corresponding close tag
  -- Thanks to Andy Grunwald for the contribution
- Added Generic CharacterBeforePHPOpeningTagSniff to check that the open PHP tag is the first content in a file
  -- Thanks to Andy Grunwald for the contribution
- Fixed incorrect errors in Squiz OperatorBracketSniff and OperatorSpacingSniff for negative numbers in CASE statements
  -- Thanks to Arnout Boks for the patch
- Generic CamelCapsFunctionNameSniff no longer enforces exact case matching for PHP magic methods
- Generic CamelCapsFunctionNameSniff no longer throws errors for overridden SOAPClient methods prefixed with double underscores
  -- Thanks to Dorian Villet for the patch
- PEAR ValidFunctionNameSniff now supports traits
- PSR1 ClassDeclarationSniff no longer throws an error for non-namespaced code if PHP version is less than 5.3.0
- Fixed bug #19616 : Nested switches cause false error in PSR2
- Fixed bug #19629 : PSR2 error for inline comments on multi-line argument lists
- Fixed bug #19644 : Alternative syntax, e.g. if/endif triggers Inline Control Structure error
- Fixed bug #19655 : Closures reporting as multi-line when they are not
- Fixed bug #19675 : Improper indent of nested anonymous function bodies in a call
- Fixed bug #19685 : PSR2 catch-22 with empty third statement in for loop
- Fixed bug #19687 : Anonymous functions inside arrays marked as indented incorrectly in PSR2
   

* Version 1.4.0 (stable) - API 1.4.0 (stable) - 2012-09-26


- Added PSR1 and PSR2 coding standards that can be used to check your code against these guidelines
- PHP 5.4 short array syntax is now detected and tokens are assigned to the open and close characters
  -- New tokens are T_OPEN_SHORT_ARRAY and T_CLOSE_SHORT_ARRAY as PHP does not define its own
- Added the ability to explain a coding standard by listing the sniffs that it includes
  -- The sniff list includes all imported and native sniffs
  -- Explain a standard by using the -e and --standard=[standard] command line arguments
  -- E.g., phpcs -e --standard=Squiz
  -- Thanks to Ben Selby for the idea
- Added report to show results using notify-send
  -- Use --report=notifysend to generate the report
  -- Thanks to Christian Weiske for the contribution
- The JS tokenizer now recognises RETURN as a valid closer for CASE and DEFAULT inside switch statements
- AbstractPatternSniff now sets the ignoreComments option using a public var rather than through the constructor
  -- This allows the setting to be overwritten in ruleset.xml files
  -- Old method remains for backwards compatibility
- Generic LowerCaseConstantSniff and UpperCaseConstantSniff no longer report errors on classes named True, False or Null
- PEAR ValidFunctionNameSniff no longer enforces exact case matching for PHP magic methods
- Squiz SwitchDeclarationSniff now allows RETURN statements to close a CASE or DEFAULT statement
- Squiz BlockCommentSniff now correctly reports an error for blank lines before blocks at the start of a control structure
- Fixed a PHP notice generated when loading custom array settings from a rulset.xml file
- Fixed bug #17908 : CodeSniffer does not recognise optional @params
  -- Thanks to Pete Walker for the patch
- Fixed bug #19538 : Function indentation code sniffer checks inside short arrays
- Fixed bug #19565 : Non-Executable Code Sniff Broken for Case Statements with both return and break
- Fixed bug #19612 : Invalid @package suggestion
   

* Version 1.3.6 (stable) - API 1.3.6 (stable) - 2012-08-08


- Memory usage has been dramatically reduced when using the summary report
  -- Reduced memory is only available when displaying a single summary report to the screen
  -- PHP_CodeSniffer will not generate any messages in this case, storing only error counts instead
  -- Impact is most notable with very high error and warning counts
- Significantly improved the performance of Squiz NonExecutableCodeSniff
- Ignore patterns now check the relative path of a file based on the dir being checked
  -- Allows ignore patterns to become more generic as the path to the code is no longer included when checking
  -- Thanks to Kristof Coomans for the patch
- Sniff settings can now be changed by specifying a special comment format inside a file
  -- e.g., // @codingStandardsChangeSetting PEAR.Functions.FunctionCallSignature allowMultipleArguments false
  -- If you change a setting, don't forget to change it back
- Added Generic EndFileNewlineSniff to ensure PHP files end with a newline character
- PEAR FunctionCallSignatureSniff now includes a setting to force one argument per line in multi-line calls
  -- Set allowMultipleArguments to false
- Squiz standard now enforces one argument per line in multi-line function calls
- Squiz FunctionDeclarationArgumentSpacingSniff now supports closures
- Squiz OperatorSpacingSniff no longer throws an error for negative values inside an inline THEN statement
  -- Thanks to Klaus Purer for the patch
- Squiz FunctionCommentSniff now throws an error for not closing a comment with */
  -- Thanks to Klaus Purer for the patch
- Summary report no longer shows two lines of PHP_Timer output when showing sources
- Fixed undefined variable error in PEAR FunctionCallSignatureSniff for lines with no indent
- Fixed bug #19502 : Generic.Files.LineEndingsSniff fails if no new-lines in file
- Fixed bug #19508 : switch+return: Closing brace indented incorrectly
- Fixed bug #19532 : The PSR-2 standard don't recognize Null in class names
- Fixed bug #19546 : Error thrown for __call() method in traits
   

* Version 1.3.5 (stable) - API 1.3.5 (stable) - 2012-07-12


- Added Generic CamelCapsFunctionNameSniff to just check if function and method names use camel caps
  -- Does not allow underscore prefixes for private/protected methods
  -- Defaults to strict checking, where two uppercase characters can not be next to each other
  -- Strict checking can be disabled in a ruleset.xml file
- Squiz FunctionDeclarationArgumentSpacing now has a setting to specify how many spaces should surround equals signs
  -- Default remains at 0
  -- Override the equalsSpacing setting in a ruleset.xml file to change
- Squiz ClassDeclarationSniff now throws errors for > 1 space before extends/implements class name with ns seperator
- Squiz standard now warns about deprecated functions using Generic DeprecatedFunctionsSniff
- PEAR FunctionDeclarationSniff now reports an error for multiple spaces after the FUNCTION keyword and around USE
- PEAR FunctionDeclarationSniff now supports closures
- Squiz MultiLineFunctionDeclarationSniff now supports closures
- Exclude rules written for Unix systems will now work correctly on Windows
  -- Thanks to Walter Tamboer for the patch
- The PHP tokenizer now recognises T_RETURN as a valid closer for T_CASE and T_DEFAULT inside switch statements
- Fixed duplicate message codes in Generic OpeningFunctionBraceKernighanRitchieSniff
- Fixed bug #18651 : PHPunit Test cases for custom standards are not working on Windows
- Fixed bug #19416 : Shorthand arrays cause bracket spacing errors
- Fixed bug #19421 : phpcs doesn't recognize ${x} as equivalent to $x
- Fixed bug #19428 : PHPCS Report "hgblame" doesn't support windows paths
  -- Thanks to Justin Rovang for the patch
- Fixed bug #19448 : Problem with detecting remote standards
- Fixed bug #19463 : Anonymous functions incorrectly being flagged by NonExecutableCodeSniff
- Fixed bug #19469 : PHP_CodeSniffer_File::getMemberProperties() sets wrong scope
- Fixed bug #19471 : phpcs on Windows, when using Zend standard, doesn't catch problems
  -- Thanks to Ivan Habunek for the patch
- Fixed bug #19478 : Incorrect indent detection in PEAR standard
  -- Thanks to Shane Auckland for the patch
- Fixed bug #19483 : Blame Reports fail with space in directory name
   

* Version 1.3.4 (stable) - API 1.3.4 (stable) - 2012-05-17


- Added missing package.xml entries for new Generic FixmeSniff
  -- Thanks to Jaroslav Hanslík for the patch
- Expected indents for PEAR ScopeClosingBraceSniff and FunctionCallSignatureSniff can now be set in ruleset files
  -- Both sniffs use a variable called "indent"
  -- Thanks to Thomas Despoix for the patch
- Standards designed to be installed in the PHPCS Standards dir will now work outside this dir as well
  -- In particular, allows the Drupal CS to work without needing to symlink it into the PHPCS install
  -- Thanks to Peter Philipp for the patch
- Rule references for standards, directories and specific sniffs can now be relative in ruleset.xml files
  -- For example: ref="../MyStandard/Sniffs/Commenting/DisallowHashCommentsSniff.php"
- Symlinked standards now work correctly, allowing aliasing of installed standards (request #19417)
  -- Thanks to Tom Klingenberg for the patch
- Squiz ObjectInstantiationSniff now allows objects to be returned without assinging them to a variable
- Added Squiz.Commenting.FileComment.MissingShort error message for file comments that only contains tags
  -- Also stops undefined index errors being generated for these comments
- Debug option -vv now shows tokenizer status for CSS files
- Added support for new gjslint error formats
  -- Thanks to Meck for the patch
- Generic ScopeIndentSniff now allows comment indents to not be exact even if the exact flag is set
  -- The start of the comment is still checked for exact indentation as normal
- Fixed an issue in AbstractPatternSniff where comments were not being ignored in some cases
- Fixed an issue in Zend ClosingTagSniff where the closing tag was not always being detected correctly
  -- Thanks to Jonathan Robson for the patch
- Fixed an issue in Generic FunctionCallArgumentSpacingSniff where closures could cause incorrect errors
- Fixed an issue in Generic UpperCaseConstantNameSniff where errors were incorrectly reported on goto statements
  -- Thanks to Tom Klingenberg for the patch
- PEAR FileCommentSniff and ClassCommentSniff now support author emails with a single character in the local part
  -- E.g., a@me.com
  -- Thanks to Denis Shapkin for the patch
- Fixed bug #19290 : Generic indent sniffer fails for anonymous functions
- Fixed bug #19324 : Setting show_warnings configuration option does not work
- Fixed bug #19354 : Not recognizing references passed to method
- Fixed bug #19361 : CSS tokenzier generates errors when PHP embedded in CSS file
- Fixed bug #19374 : HEREDOC/NOWDOC Indentation problems
- Fixed bug #19381 : traits and indetations in traits are not handled properly
- Fixed bug #19394 : Notice in NonExecutableCodeSniff
- Fixed bug #19402 : Syntax error when executing phpcs on Windows with parens in PHP path
  -- Thanks to Tom Klingenberg for the patch
- Fixed bug #19411 : magic method error on __construct()
  -- The fix required a rewrite of AbstractScopeSniff, so please test any sniffs that extend this class
- Fixed bug #19412 : Incorrect error about assigning objects to variables when inside inline IF
- Fixed bug #19413 : php_cs thinks I haven't used a parameter when I have
- Fixed bug #19414 : php_cs seems to not track variables correctly in heredocs
   

* Version 1.3.3 (stable) - API 1.3.3 (stable) - 2012-02-17


- Added new Generic FixmeSniff that shows error messages for all FIXME comments left in your code
  -- Thanks to Sam Graham for the contribution
- The maxPercentage setting in the Squiz CommentedOutCodeSniff can now be overriden in a rulset.xml file
  -- Thanks to Volker Dusch for the patch
- The Checkstyle and XML reports now use XMLWriter
  -- Only change in output is that empty file tags are no longer produced for files with no violations
  -- Thanks to Sebastian Bergmann for the patch
- Added PHP_CodeSniffer_Tokens::$bracketTokens to give sniff writers fast access to open and close bracket tokens
- Fixed an issue in AbstractPatternSniff where EOL tokens were not being correctly checked in some cases
- PHP_CodeSniffer_File::getTokensAsString() now detects incorrect length value (request #19313)
- Fixed bug #19114 : CodeSniffer checks extension even for single file
- Fixed bug #19171 : Show sniff codes option is ignored by some report types
  -- Thanks to Dominic Scheirlinck for the patch
- Fixed bug #19188 : Lots of PHP Notices when analyzing the Symfony framework
  -- First issue was list-style.. lines in CSS files not properly adjusting open/close bracket positions
  -- Second issue was notices caused by bug #19137
- Fixed bug #19208 : UpperCaseConstantName reports class members
  -- Was also a problem with LowerCaseConstantName as well
- Fixed bug #19256 : T_DOC_COMMENT in CSS files breaks ClassDefinitionNameSpacingSniff
  -- Thanks to Klaus Purer for the patch
- Fixed bug #19264 : Squiz.PHP.NonExecutableCode does not handle RETURN in CASE without BREAK
- Fixed bug #19270 : DuplicateClassName does not handle namespaces correctly
- Fixed bug #19283 : CSS @media rules cause false positives
  -- Thanks to Klaus Purer for the patch
   

* Version 1.3.2 (stable) - API 1.3.2 (stable) - 2011-12-01


- Added Generic JSHintSniff to run jshint.js over a JS file and report warnings
  -- Set jshint path using phpcs --config-set jshint_path /path/to/jshint-rhino.js
  -- Set rhino path using phpcs --config-set rhino_path /path/to/rhino
  -- Thanks to Alexander Weiß for the contribution
- Nowdocs are now tokenized using PHP_CodeSniffer specific T_NOWDOC tokens for easier identification
- Generic UpperCaseConstantNameSniff no longer throws errors for namespaces
  -- Thanks to Jaroslav Hanslík for the patch
- Squiz NonExecutableCodeSniff now detects code after thrown exceptions
  -- Thanks to Jaroslav Hanslík for the patch
- Squiz OperatorSpacingSniff now ignores references
  -- Thanks to Jaroslav Hanslík for the patch
- Squiz FunctionCommentSniff now reports a missing function comment if it finds a standard code comment instead
- Squiz FunctionCommentThrownTagSniff no longer reports errors if it can't find a function comment
- Fixed unit tests not running under Windows
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #18964 : "$stackPtr must be of type T_VARIABLE" on heredocs and nowdocs
- Fixed bug #18973 : phpcs is looking for variables in a nowdoc
- Fixed bug #18974 : Blank line causes "Multi-line function call not indented correctly"
  -- Adds new error message to ban empty lines in multi-line function calls
- Fixed bug #18975 : "Closing parenthesis must be on a line by itself" also causes indentation error
   

* Version 1.3.1 (stable) - API 1.3.1 (stable) - 2011-11-03


- All report file command line arguments now work with relative paths (request #17240)
- The extensions command line argument now supports multi-part file extensions (request #17227)
- Added report type --report=hgblame to show number of errors/warnings committed by authors in a Mercurial repository
  -- Has the same functionality as the svnblame report
  -- Thanks to Ben Selby for the patch
- Added T_BACKTICK token type to make detection of backticks easier (request #18799)
- Added pattern matching support to Generic ForbiddenFunctionsSniff
    -- If you are extending it and overriding register() or addError() you will need to review your sniff
- Namespaces are now recognised as scope openers, although they do not require braces (request #18043)
- Added new ByteOrderMarkSniff to Generic standard (request #18194)
  -- Throws an error if a byte order mark is found in any PHP file
  -- Thanks to Piotr Karas for the contribution
- PHP_Timer output is no longer included in reports when being written to a file (request #18252)
  -- Also now shown for all report types if nothing is being printed to the screen
- Generic DeprecatedFunctionSniff now reports functions as deprecated and not simply forbidden (request #18288)
- PHPCS now accepts file contents from STDIN (request #18447)
  -- Example usage: cat temp.php | phpcs [options]  -OR-  phpcs [options] < temp.php
  -- Not every sniff will work correctly due to the lack of a valid file path
- PHP_CodeSniffer_Exception no longer extends PEAR_Exception (request #18483)
  -- PEAR_Exception added a requirement that PEAR had to be installed
  -- PHP_CodeSniffer is not used as a library, so unlikely to have any impact
- PEAR FileCommentSniff now allows GIT IDs in the version tag (request #14874)
- AbstractVariableSniff now supports heredocs
  -- Also includes some variable detection fixes
  -- Thanks to Sam Graham for the patch
- Squiz FileCommentSniff now enforces rule that package names cannot start with the word Squiz
- MySource AssignThisSniff now allows "this" to be assigned to the private var _self
- Fixed issue in Squiz FileCommentSniff where suggested package name was the same as the incorrect package name
- Fixed some issues with Squiz ArrayDeclarationSniff when using function calls in array values
- Fixed doc generation so it actually works again
  -- Also now works when being run from an SVN checkout as well as when installed as a PEAR package
  -- Should fix bug #18949 : Call to private method from static
- PEAR ClassDeclaration sniff now supports indentation checks when using the alternate namespace syntax
  -- PEAR.Classes.ClassDeclaration.SpaceBeforeBrace message now contains 2 variables instead of 1
  -- Sniff allows overriding of the default indent level, which is set to 4
  -- Fixes bug #18933 : Alternative namespace declaration syntax confuses scope sniffs
- Fixed bug #18465 : "self::" does not work in lambda functions
  -- Also corrects conversion of T_FUNCTION tokens to T_CLOSURE, which was not fixing token condition arrays
- Fixed bug #18543 : CSS Tokenizer deletes too many #
- Fixed bug #18624 : @throws namespace problem
  -- Thanks to Gavin Davies for the patch
- Fixed bug #18628 : Generic.Files.LineLength gives incorrect results with Windows line-endings
- Fixed bug #18633 : CSS Tokenizer doesn't replace T_LIST tokens inside some styles
- Fixed bug #18657 : anonymous functions wrongly indented
- Fixed bug #18670 : UpperCaseConstantNameSniff fails on dynamic retrieval of class constant
- Fixed bug #18709 : Code sniffer sniffs file if even if it's in --ignore
  -- Thanks to Artem Lopata for the patch
- Fixed bug #18762 : Incorrect handling of define and constant in UpperCaseConstantNameSniff
  -- Thanks to Thomas Baker for the patch
- Fixed bug #18769 : CSS Tokenizer doesn't replace T_BREAK tokens inside some styles
- Fixed bug #18835 : Unreachable errors of inline returns of closure functions
  -- Thanks to Patrick Schmidt for the patch
- Fixed bug #18839 : Fix miscount of warnings in AbstractSniffUnitTest.php
  -- Thanks to Sam Graham for the patch
- Fixed bug #18844 : Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff with empty body
  -- Thanks to Dmitri Medvedev for the patch
- Fixed bug #18847 : Running Squiz_Sniffs_Classes_ClassDeclarationSniff results in PHP notice
- Fixed bug #18868 : jslint+rhino: errors/warnings not detected
  -- Thanks to Christian Weiske for the patch
- Fixed bug #18879 : phpcs-svn-pre-commit requires escapeshellarg
  -- Thanks to Bjorn Katuin for the patch
- Fixed bug #18951 : weird behaviour with closures and multi-line use () params
   

* Version 1.3.0 (stable) - API 1.3.0 (stable) - 2011-03-17


- Add a new token T_CLOSURE that replaces T_FUNCTION if the function keyword is anonymous
- Many Squiz sniffs no longer report errors when checking closures; they are now ignored
- Fixed some error messages in PEAR MultiLineConditionSniff that were not using placeholders for message data
- AbstractVariableSniff now correctly finds variable names wrapped with curly braces inside double quoted strings
- PEAR FunctionDeclarationSniff now ignores arrays in argument default values when checking multi-line declarations
- Fixed bug #18200 : Using custom named ruleset file as standard no longer works
- Fixed bug #18196 : PEAR MultiLineCondition.SpaceBeforeOpenBrace not consistent with newline chars
- Fixed bug #18204 : FunctionCommentThrowTag picks wrong exception type when throwing function call
- Fixed bug #18222 : Add __invoke method to PEAR standard
- Fixed bug #18235 : Invalid error generation in Squiz.Commenting.FunctionCommentThrowTag
- Fixed bug #18250 : --standard with relative path skips Standards' "implicit" sniffs
- Fixed bug #18274 : Multi-line IF and function call indent rules conflict
- Fixed bug #18282 : Squiz doesn't handle final keyword before function comments
  -- Thanks to Dave Perrett for the patch
- Fixed bug #18336 : Function isUnderscoreName gives php notices
   

* Version 1.3.0RC2 (beta) - API 1.3.0RC2 (beta) - 2011-01-14


- You can now print multiple reports for each run and print each to the screen or a file (request #12434)
  -- Format is --report-[report][=file] (e.g., --report-xml=out.xml)
  -- Printing to screen is done by leaving [file] empty (e.g., --report-xml)
  -- Multiple reports can be specified in this way (e.g., --report-summary --report-xml=out.xml)
  -- The standard --report and --report-file command line arguments are unchanged
- Added -d command line argument to set php.ini settings while running (request #17244)
  -- Usage is: phpcs -d memory_limit=32M -d ...
  -- Thanks to Ben Selby for the patch
- Added -p command line argument to show progress during a run
  -- Dot means pass, E means errors found, W means only warnings found and S means skipped file
  -- Particularly good for runs where you are checking more than 100 files
  -- Enable by default with --config-set show_progress 1
  -- Will not print anything if you are already printing verbose output
  -- This has caused a big change in the way PHP_CodeSniffer processes files (API changes around processing)
- You can now add exclude rules for individual sniffs or error messages (request #17903)
  -- Only available when using a ruleset.xml file to specify rules
  -- Uses the same exclude-pattern tags as normal but allows them inside rule tags
- Using the -vvv option will now print a list of sniffs executed for each file and how long they took to process
- Added Generic ClosureLinterSniff to run Google's gjslint over your JS files
- The XML and CSV reports now include the severity of the error (request #18165)
  -- The Severity column in the CSV report has been renamed to Type, and a new Severity column added for this
- Fixed issue with Squiz FunctionCommentSniff reporting incorrect type hint when default value uses namespace
  -- Thanks to Anti Veeranna for the patch
- Generic FileLengthSniff now uses iconv_strlen to check line length if an encoding is specified (request #14237)
- Generic UnnecessaryStringConcatSniff now allows strings to be combined to form a PHP open or close tag
- Squiz SwitchDeclarationSniff no longer reports indentation errors for BREAK statements inside IF conditions
- Interactive mode now always prints the full error report (ignores command line)
- Improved regular expression detection in JavaScript files
  -- Added new T_TYPEOF token that can be used to target the typeof JS operator
  -- Fixes bug #17611 : Regular expression tokens not recognised
- Squiz ScopeIndentSniff removed
  -- Squiz standard no longer requires additional indents between ob_* methods
  -- Also removed Squiz OutputBufferingIndentSniff that was checking the same thing
- PHP_CodeSniffer_File::getMemberProperties() performance improved significantly
  -- Improves performance of Squiz ValidVariableNameSniff significantly
- Squiz OperatorSpacingSniff performance improved significantly
- Squiz NonExecutableCodeSniff performance improved significantly
  -- Will throw duplicate errors in some cases now, but these should be rare
- MySource IncludeSystemSniff performance improved significantly
- MySource JoinStringsSniff no longer reports an error when using join() on a named JS array
- Warnings are now reported for each file when they cannot be opened instead of stopping the script
  -- Hide warnings with the -n command line argument
  -- Can override the warnings using the code Internal.DetectLineEndings
- Fixed bug #17693 : issue with pre-commit hook script with filenames that start with v
- Fixed bug #17860 : isReference function fails with references in array
  -- Thanks to Lincoln Maskey for the patch
- Fixed bug #17902 : Cannot run tests when tests are symlinked into tests dir
  -- Thanks to Matt Button for the patch
- Fixed bug #17928 : Improve error message for Generic_Sniffs_PHP_UpperCaseConstantSniff
  -- Thanks to Stefano Kowalke for the patch
- Fixed bug #18039 : JS Tokenizer crash when ] is last character in file
- Fixed bug #18047 : Incorrect handling of namespace aliases as constants
  -- Thanks to Dmitri Medvedev for the patch
- Fixed bug #18072 : Impossible to exclude path from processing when symlinked
- Fixed bug #18073 : Squiz.PHP.NonExecutableCode fault
- Fixed bug #18117 : PEAR coding standard: Method constructor not sniffed as a function
- Fixed bug #18135 : Generic FunctionCallArgumentSpacingSniff reports function declaration errors
- Fixed bug #18140 : Generic scope indent in exact mode: strange expected/found values for switch
- Fixed bug #18145 : Sniffs are not loaded for custom ruleset file
  -- Thanks to Scott McCammon for the patch
- Fixed bug #18152 : While and do-while with AbstractPatternSniff
- Fixed bug #18191 : Squiz.PHP.LowercasePHPFunctions does not work with new Date()
- Fixed bug #18193 : CodeSniffer doesn't reconize CR (\r) line endings
   

* Version 1.3.0RC1 (beta) - API 1.3.0RC1 (beta) - 2010-09-03


- Added exclude pattern support to ruleset.xml file so you can specify ignore patterns in a standard (request #17683)
  -- Use new exclude-pattern tags to include the ignore rules into your ruleset.xml file
  -- See CodeSniffer/Standards/PHPCS/ruleset.xml for an example
- Added new --encoding command line argument to specify the encoding of the files being checked
  -- When set to utf-8, stops the XML-based reports from double-encoding
  -- When set to something else, helps the XML-based reports encode to utf-8
  -- Default value is iso-8859-1 but can be changed with --config-set encoding [value]
- The report is no longer printed to screen when using the --report-file command line option (request #17467)
  -- If you want to print it to screen as well, use the -v command line argument
- The SVN and GIT blame reports now also show percentage of reported errors per author (request #17606)
  -- Thanks to Ben Selby for the patch
- Updated the SVN pre-commit hook to work with the new severity levels feature
- Generic SubversionPropertiesSniff now allows properties to have NULL values (request #17682)
  -- A null value indicates that the property should exist but the value should not be checked
- Generic UpperCaseConstantName Sniff now longer complains about the PHPUnit_MAIN_METHOD constant (request #17798)
- Squiz FileComment sniff now checks JS files as well as PHP files
- Squiz FunctionCommentSniff now supports namespaces in type hints
- Fixed a problem in Squiz OutputBufferingIndentSniff where block comments were reported as not indented
- Fixed bug #17092 : Problems with utf8_encode and htmlspecialchars with non-ascii chars
  -- Use the new --encoding=utf-8 command line argument if your files are utf-8 encoded
- Fixed bug #17629 : PHP_CodeSniffer_Tokens::$booleanOperators missing T_LOGICAL_XOR
  -- Thanks to Matthew Turland for the patch
- Fixed bug #17699 : Fatal error generating code coverage with PHPUnit 5.3.0RC1
- Fixed bug #17718 : Namespace 'use' statement: used global class name is recognized as constant
- Fixed bug #17734 : Generic SubversionPropertiesSniff complains on non SVN files
- Fixed bug #17742 : EmbeddedPhpSniff reacts negatively to file without closing php tag
- Fixed bug #17823 : Notice: Please no longer include PHPUnit/Framework.php
   

* Version 1.3.0a1 (alpha) - API 1.3.0a1 (alpha) - 2010-07-15


- All CodingStandard.php files have been replaced by ruleset.xml files
  -- Custom standards will need to be converted over to this new format to continue working
- You can specify a path to your own custom ruleset.xml file by using the --standard command line arg
  -- e.g., phpcs --standard=/path/to/my/ruleset.xml
- Added a new report type --report=gitblame to show how many errors and warnings were committed by each author
  -- Has the same functionality as the svnblame report
  -- Thanks to Ben Selby for the patch
- A new token type T_DOLLAR has been added to allow you to sniff for variable variables (feature request #17095)
  -- Thanks to Ian Young for the patch
- JS tokenizer now supports T_POWER (^) and T_MOD_EQUAL (%=) tokens (feature request #17441)
- If you have PHP_Timer installed, you'll now get a time/memory summary at the end of a script run
  -- Only happens when printing reports that are designed to be read on the command line
- Added Generic DeprecatedFunctionsSniff to warn about the use of deprecated functions (feature request #16694)
  -- Thanks to Sebastian Bergmann for the patch
- Added Squiz LogicalOperatorSniff to ensure that logical operators are surrounded by single spaces
- Added MySource ChannelExceptionSniff to ensure action files only throw ChannelException
- Added new method getClassProperties() for sniffs to use to determine if a class is abstract and/or final
  -- Thanks to Christian Kaps for the patch
- Generic UpperCaseConstantSniff no longer throws errors about namespaces
  -- Thanks to Christian Kaps for the patch
- Squiz OperatorBracketSniff now correctly checks value assignmnets in arrays
- Squiz LongConditionClosingCommentSniff now requires a comment for long CASE statements that use curly braces
- Squiz LongConditionClosingCommentSniff now requires an exact comment match on the brace
- MySource IncludeSystemSniff now ignores DOMDocument usage
- MySource IncludeSystemSniff no longer requires inclusion of systems that are being implemented
- Removed found and expected messages from Squiz ConcatenationSpacingSniff because they were messy and not helpful
- Fixed a problem where Generic CodeAnalysisSniff could show warnings if checking multi-line strings
- Fixed error messages in Squiz ArrayDeclarationSniff reporting incorrect number of found and expected spaces
- Fixed bug #17048 : False positive in Squiz_WhiteSpace_ScopeKeywordSpacingSniff
- Fixed bug #17054 : phpcs more strict than PEAR CS regarding function parameter spacing
- Fixed bug #17096 : Notice: Undefined index: scope_condition in ScopeClosingBraceSniff.php
  -- Moved PEAR.Functions.FunctionCallArgumentSpacing to Generic.Functions.FunctionCallArgumentSpacing
- Fixed bug #17144 : Deprecated: Function eregi() is deprecated
- Fixed bug #17236 : PHP Warning due to token_get_all() in DoubleQuoteUsageSniff
- Fixed bug #17243 : Alternate Switch Syntax causes endless loop of Notices in SwitchDeclaration
- Fixed bug #17313 : Bug with switch case struture
- Fixed bug #17331 : Possible parse error: interfaces may not include member vars
- Fixed bug #17337 : CSS tokenizer fails on quotes urls
- Fixed bug #17420 : Uncaught exception when comment before function brace
- Fixed bug #17503 : closures formatting is not supported
   

* Version 1.2.2 (stable) - API 1.2.2 (stable) - 2010-01-27


- The core PHP_CodeSniffer_File methods now understand the concept of closures (feature request #16866)
  -- Thanks to Christian Kaps for the sample code
- Sniffs can now specify violation codes for each error and warning they add
  -- Future versions will allow you to override messages and severities using these codes
  -- Specifying a code is optional, but will be required if you wish to support overriding
- All reports have been broken into separate classes
  -- Command line usage and report output remains the same
  -- Thanks to Gabriele Santini for the patch
- Added an interactive mode that can be enabled using the -a command line argument
  -- Scans files and stops when it finds a file with errors
  -- Waits for user input to recheck the file (hopefully you fixed the errors) or skip the file
  -- Useful for very large code bases where full rechecks take a while
- The reports now show the correct number of errors and warnings found
- The isCamelCaps method now allows numbers in class names
- The JS tokenizer now correctly identifies boolean and bitwise AND and OR tokens
- The JS tokenzier now correctly identifies regular expressions used in conditions
- PEAR ValidFunctionNameSniff now ignores closures
- Squiz standard now uses the PEAR setting of 85 chars for LineLengthSniff
- Squiz ControlStructureSpacingSniff now ensure there are no spaces around parentheses
- Squiz LongConditionClosingCommentSniff now checks for comments at the end of try/catch statements
- Squiz LongConditionClosingCommentSniff now checks validity of comments for short structures if they exist
- Squiz IncrementDecrementUsageSniff now has better checking to ensure it only looks at simple variable assignments
- Squiz PostStatementCommentSniff no longer throws errors for end function comments
- Squiz InlineCommentSniff no longer throws errors for end function comments
- Squiz OperatorBracketSniff now allows simple arithmetic operations in SWITCH conditions
- Squiz ValidFunctionNameSniff now ignores closures
- Squiz MethodScopeSniff now ignores closures
- Squiz ClosingDeclarationCommentSniff now ignores closures
- Squiz GlobalFunctionSniff now ignores closures
- Squiz DisallowComparisonAssignmentSniff now ignores the assigning of arrays
- Squiz DisallowObjectStringIndexSniff now allows indexes that contain dots and reserved words
- Squiz standard now throws nesting level and cyclomatic complexity errors at much higher levels
- Squiz CommentedOutCodeSniff now ignores common comment framing chacacters
- Squiz ClassCommentSniff now ensures the open comment tag is the only content on the first line
- Squiz FileCommentSniff now ensures the open comment tag is the only content on the first line
- Squiz FunctionCommentSniff now ensures the open comment tag is the only content on the first line
- Squiz VariableCommentSniff now ensures the open comment tag is the only content on the first line
- Squiz NonExecutableCodeSniff now warns about empty return statements that are not required
- Removed ForbiddenStylesSniff from Squiz standard
  -- It is now in in the MySource standard as BrowserSpecificStylesSniff
  -- New BrowserSpecificStylesSniff ignores files with browser-specific suffixes
- MySource IncludeSystemSniff no longer throws errors when extending the Exception class
- MySource IncludeSystemSniff no longer throws errors for the abstract widget class
- MySource IncludeSystemSniff and UnusedSystemSniff now allow includes inside IF statements
- MySource IncludeSystemSniff no longer throws errors for included widgets inside methods
- MySource GetRequestDataSniff now throws errors for using $_FILES
- MySource CreateWidgetTypeCallbackSniff now allows return statements in nested functions
- MySource DisallowSelfActionsSniff now ignores abstract classes
- Fixed a problem with the SVN pre-commit hook for PHP versions without vertical whitespace regex support
- Fixed bug #16740 : False positives for heredoc strings and unused parameter sniff
- Fixed bug #16794 : ValidLogicalOperatorsSniff doesn't report operators not in lowercase
- Fixed bug #16804 : Report filename is shortened too much
- Fixed bug #16821 : Bug in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #16836 : Notice raised when using semicolon to open case
- Fixed bug #16855 : Generic standard sniffs incorrectly for define() method
- Fixed bug #16865 : Two bugs in Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #16902 : Inline If Declaration bug
- Fixed bug #16960 : False positive for late static binding in Squiz/ScopeKeywordSpacingSniff
  -- Thanks to Jakub Tománek for the patch
- Fixed bug #16976 : The phpcs attempts to process symbolic links that don't resolve to files
- Fixed bug #17017 : Including one file in the files sniffed alters errors reported for another file
   

* Version 1.2.1 (stable) - API 1.2.1 (stable) - 2009-11-17


- Added a new report type --report=svnblame to show how many errors and warnings were committed by each author
  -- Also shows the percentage of their code that are errors and warnings
  -- Requires you to have the SVN command in your path
  -- Make sure SVN is storing usernames and passwords (if required) or you will need to enter them for each file
  -- You can also use the -s command line argument to see the different types of errors authors are committing
  -- You can use the -v command line argument to see all authors, even if they have no errors or warnings
- Added a new command line argument --report-width to allow you to set the column width of screen reports
  -- Reports wont accept values less than 70 or else they get too small
  -- Can also be set via a config var: phpcs --config-set report_width 100
- You can now get PHP_CodeSniffer to ignore a whole file by adding @codingStandardsIgnoreFile in the content
  -- If you put it in the first two lines the file wont even be tokenized, so it will be much quicker
- Reports now print their file lists in alphabetical order
- PEAR FunctionDeclarationSniff now reports error for incorrect closing bracket placement in multi-line definitions
- Added Generic CallTimePassByRefenceSniff to prohibit the passing of variables into functions by reference
  -- Thanks to Florian Grandel for the contribution
- Added Squiz DisallowComparisonAssignmentSniff to ban the assignment of comparison values to a variable
- Added Squiz DuplicateStyleDefinitionSniff to check for duplicate CSS styles in a single class block
- Squiz ArrayDeclarationSniff no longer checks the case of array indexes because that is not its job
- Squiz PostStatementCommentSniff now allows end comments for class member functions
- Squiz InlineCommentSniff now supports the checking of JS files
- MySource CreateWidgetTypeCallbackSniff now allows the callback to be passed to another function
- MySource CreateWidgetTypeCallbackSniff now correctly ignores callbacks used inside conditions
- Generic MultipleStatementAlignmentSniff now enforces a single space before equals sign if max padding is reached
- Fixed a problem in the JS tokenizer where regular expressions containing \// were not converted correctly
- Fixed a problem tokenizing CSS files where multiple ID targets on a line would look like comments
- Fixed a problem tokenizing CSS files where class names containing a colon looked like style definitions
- Fixed a problem tokenizing CSS files when style statements had empty url() calls
- Fixed a problem tokenizing CSS colours with the letter E in first half of the code
- Squiz ColonSpacingSniff now ensures it is only checking style definitions in CSS files and not class names
- Squiz DisallowComparisonAssignmentSniff no longer reports errors when assigning the return value of a function
- CSS tokenizer now correctly supports multi-line comments
- When only the case of var names differ for function comments, the error now indicates the case is different
- Fixed an issue with Generic UnnecessaryStringConcatSniff where it incorrectly suggested removing a concat
- Fixed bug #16530 : ScopeIndentSniff reports false positive
- Fixed bug #16533 : Duplicate errors and warnings
- Fixed bug #16563 : Check file extensions problem in phpcs-svn-pre-commit
  -- Thanks to Kaijung Chen for the patch
- Fixed bug #16592 : Object operator indentation incorrect when first operator is on a new line
- Fixed bug #16641 : Notice output
- Fixed bug #16682 : Squiz_Sniffs_Strings_DoubleQuoteUsageSniff reports string "\0" as invalid
- Fixed bug #16683 : Typing error in PHP_CodeSniffer_CommentParser_AbstractParser
- Fixed bug #16684 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff
- Fixed bug #16692 : Spaces in paths in Squiz_Sniffs_Debug_JavaScriptLintSniff
  -- Thanks to Jaroslav Hanslík for the patch
- Fixed bug #16696 : Spelling error in MultiLineConditionSniff
- Fixed bug #16697 : MultiLineConditionSniff incorrect result with inline IF
- Fixed bug #16698 : Notice in JavaScript Tokenizer
- Fixed bug #16736 : Multi-files sniffs aren't processed when FILE is a single directory
  -- Thanks to Alexey Shein for the patch
- Fixed bug #16792 : Bug in Generic_Sniffs_PHP_ForbiddenFunctionsSniff
   

* Version 1.2.0 (stable) - API 1.2.0 (stable) - 2009-08-17


- Installed standards are now favoured over custom standards when using the cmd line arg with relative paths
- Unit tests now use a lot less memory while running
- Squiz standard now uses Generic EmptyStatementSniff but throws errors instead of warnings
- Squiz standard now uses Generic UnusedFunctionParameterSniff
- Removed unused ValidArrayIndexNameSniff from the Squiz standard
- Fixed bug #16424 : SubversionPropertiesSniff print PHP Warning
- Fixed bug #16450 : Constant PHP_CODESNIFFER_VERBOSITY already defined (unit tests)
- Fixed bug #16453 : function declaration long line splitted error
- Fixed bug #16482 : phpcs-svn-pre-commit ignores extensions parameter
   

* Version 1.2.0RC3 (beta) - API 1.2.0RC3 (beta) - 2009-07-07


- You can now use @codingStandardsIgnoreStart and @...End comments to suppress messages (feature request #14002)
- A warning is now included for files without any code when short_open_tag is set to Off (feature request #12952)
- You can now use relative paths to your custom standards with the --standard cmd line arg (feature request #14967)
- You can now override magic methods and functions in PEAR ValidFunctionNameSniff (feature request #15830)
- MySource IncludeSystemSniff now recognises widget action classes
- MySource IncludeSystemSniff now knows about unit test classes and changes rules accordingly
   

* Version 1.2.0RC2 (beta) - API 1.2.0RC2 (beta) - 2009-05-25


- Test suite can now be run using the full path to AllTests.php (feature request #16179)
- Fixed bug #15980 : PHP_CodeSniffer change php current directory
  -- Thanks to Dolly Aswin Harahap for the patch
- Fixed bug #16001 : Notice triggered
- Fixed bug #16054 : phpcs-svn-pre-commit not showing any errors
- Fixed bug #16071 : Fatal error: Uncaught PHP_CodeSniffer_Exception
- Fixed bug #16170 : Undefined Offset -1 in MultiLineConditionSniff.php on line 68
- Fixed bug #16175 : Bug in Squiz-IncrementDecrementUsageSniff
   

* Version 1.2.0RC1 (beta) - API 1.2.0RC1 (beta) - 2009-03-09


- Reports that are output to a file now include a trailing newline at the end of the file
- Fixed sniff names not shown in -vvv token processing output
- Added Generic SubversionPropertiesSniff to check that specific svn props are set for files
  -- Thanks to Jack Bates for the contribution
- The PHP version check can now be overridden in classes that extend PEAR FileCommentSniff
  -- Thanks to Helgi Þormar Þorbjörnsson for the suggestion
- Added Generic ConstructorNameSniff to check for PHP4 constructor name usage
  -- Thanks to Leif Wickland for the contribution
- Squiz standard now supports multi-line function and condition sniffs from PEAR standard
- Squiz standard now uses Generic ConstructorNameSniff
- Added MySource GetRequestDataSniff to ensure REQUEST, GET and POST are not accessed directly
- Squiz OperatorBracketSniff now allows square brackets in simple unbracketed operations
- Fixed the incorrect tokenizing of multi-line block comments in CSS files
- Fixed bug #15383 : Uncaught PHP_CodeSniffer_Exception
- Fixed bug #15408 : An unexpected exception has been caught: Undefined offset: 2
- Fixed bug #15519 : Uncaught PHP_CodeSniffer_Exception
- Fixed bug #15624 : Pre-commit hook fails with PHP errors
- Fixed bug #15661 : Uncaught PHP_CodeSniffer_Exception
- Fixed bug #15722 : "declare(encoding = 'utf-8');" leads to "Missing file doc comment"
- Fixed bug #15910 : Object operator indention not calculated correctly
   

* Version 1.2.0a1 (alpha) - API 1.2.0a1 (alpha) - 2008-12-18


- PHP_CodeSniffer now has a CSS tokenizer for checking CSS files
- Added support for a new multi-file sniff that sniffs all processed files at once
- Added new output format --report=emacs to output errors using the emacs standard compile output format
  -- Thanks to Len Trigg for the contribution
- Reports can now be written to a file using the --report-file command line argument (feature request #14953)
  -- The report is also written to screen when using this argument
- The CheckStyle, CSV and XML reports now include a source for each error and warning (feature request #13242)
  -- A new report type --report=source can be used to show you the most common errors in your files
- Added new command line argument -s to show error sources in all reports
- Added new command line argument --sniffs to specify a list of sniffs to restrict checking to
  -- Uses the sniff source codes that are optionally displayed in reports
- Changed the max width of error lines from 80 to 79 chars to stop blank lines in the default windows cmd window
- PHP_CodeSniffer now has a token for an asperand (@ symbol) so sniffs can listen for them
  -- Thanks to Andy Brockhurst for the patch
- Added Generic DuplicateClassNameSniff that will warn if the same class name is used in multiple files
  -- Not currently used by any standard; more of a multi-file sniff sample than anything useful
- Added Generic NoSilencedErrorsSniff that warns if PHP errors are being silenced using the @ symbol
  -- Thanks to Andy Brockhurst for the contribution
- Added Generic UnnecessaryStringConcatSniff that checks for two strings being concatenated
- Added PEAR FunctionDeclarationSniff to enforce the new multi-line function declaration PEAR standard
- Added PEAR MultiLineAssignmentSniff to enforce the correct indentation of multi-line assignments
- Added PEAR MultiLineConditionSniff to enforce the new multi-line condition PEAR standard
- Added PEAR ObjectOperatorIndentSniff to enforce the new chained function call PEAR standard
- Added MySource DisallowSelfActionSniff to ban the use of self::method() calls in Action classes
- Added MySource DebugCodeSniff to ban the use of Debug::method() calls
- Added MySource CreateWidgetTypeCallback sniff to check callback usage in widget type create methods
- Added Squiz DisallowObjectStringIndexSniff that forces object dot notation in JavaScript files
  -- Thanks to Sertan Danis for the contribution
- Added Squiz DiscouragedFunctionsSniff to warn when using debug functions
- Added Squiz PropertyLabelSniff to check whitespace around colons in JS property and label declarations
- Added Squiz DuplicatePropertySniff to check for duplicate property names in JS classes
- Added Squiz ColonSpacingSniff to check for spacing around colons in CSS style definitions
- Added Squiz SemicolonSpacingSniff to check for spacing around semicolons in CSS style definitions
- Added Squiz IdentationSniff to check for correct indentation of CSS files
- Added Squiz ColourDefinitionSniff to check that CSS colours are defined in uppercase and using shorthand
- Added Squiz EmptyStyleDefinitionSniff to check for CSS style definitions without content
- Added Squiz EmptyClassDefinitionSniff to check for CSS class definitions without content
- Added Squiz ClassDefinitionOpeningBraceSpaceSniff to check for spaces around opening brace of CSS class definitions
- Added Squiz ClassDefinitionClosingBraceSpaceSniff to check for a single blank line after CSS class definitions
- Added Squiz ClassDefinitionNameSpacingSniff to check for a blank lines inside CSS class definition names
- Added Squiz DisallowMultipleStyleDefinitionsSniff to check for multiple style definitions on a single line
- Added Squiz DuplicateClassDefinitionSniff to check for duplicate CSS class blocks that can be merged
- Added Squiz ForbiddenStylesSniff to check for usage of browser specific styles
- Added Squiz OpacitySniff to check for incorrect opacity values in CSS
- Added Squiz LowercaseStyleDefinitionSniff to check for styles that are not defined in lowercase
- Added Squiz MissingColonSniff to check for style definitions where the colon has been forgotten
- Added Squiz MultiLineFunctionDeclarationSniff to check that multi-line declarations contain one param per line
- Added Squiz JSLintSniff to check for JS errors using the jslint.js script through Rhino
  -- Set jslint path using phpcs --config-set jslint_path /path/to/jslint.js
  -- Set rhino path using phpcs --config-set rhino_path /path/to/rhino
- Added Generic TodoSniff that warns about comments that contain the word TODO
- Removed MultipleStatementAlignmentSniff from the PEAR standard as alignment is now optional
- Generic ForbiddenFunctionsSniff now has protected member var to specify if it should use errors or warnings
- Generic MultipleStatementAlignmentSniff now has correct error message if assignment is on a new line
- Generic MultipleStatementAlignmentSniff now has protected member var to allow it to ignore multi-line assignments
- Generic LineEndingsSniff now supports checking of JS files
- Generic LineEndingsSniff now supports checking of CSS files
- Generic DisallowTabIndentSniff now supports checking of CSS files
- Squiz DoubleQuoteUsageSniff now bans the use of variables in double quoted strings in favour of concatenation
- Squiz SuperfluousWhitespaceSniff now supports checking of JS files
- Squiz SuperfluousWhitespaceSniff now supports checking of CSS files
- Squiz DisallowInlineIfSniff now supports checking of JS files
- Squiz SemicolonSpacingSniff now supports checking of JS files
- Squiz PostStatementCommentSniff now supports checking of JS files
- Squiz FunctionOpeningBraceSpacingSniff now supports checking of JS files
- Squiz FunctionClosingBraceSpacingSniff now supports checking of JS files
  -- Empty JS functions must have their opening and closing braces next to each other
- Squiz ControlStructureSpacingSniff now supports checking of JS files
- Squiz LongConditionClosingCommentSniff now supports checking of JS files
- Squiz OperatorSpacingSniff now supports checking of JS files
- Squiz SwitchDeclarationSniff now supports checking of JS files
- Squiz CommentedOutCodeSniff now supports checking of CSS files
- Squiz DisallowSizeFunctionsInLoopsSniff now supports checking of JS files for the use of object.length
- Squiz DisallowSizeFunctionsInLoopsSniff no longer complains about size functions outside of the FOR condition
- Squiz ControlStructureSpacingSniff now bans blank lines at the end of a control structure
- Squiz ForLoopDeclarationSniff no longer throws errors for JS FOR loops without semicolons
- Squiz MultipleStatementAlignmentSniff no longer throws errors if a statement would take more than 8 spaces to align
- Squiz standard now uses Genric TodoSniff
- Squiz standard now uses Genric UnnecessaryStringConcatSniff
- Squiz standard now uses PEAR MultiLineAssignmentSniff
- Squiz standard now uses PEAR MultiLineConditionSniff
- Zend standard now uses OpeningFunctionBraceBsdAllmanSniff (feature request #14647)
- MySource JoinStringsSniff now bans the use of inline array joins and suggests the + operator
- Fixed incorrect errors that can be generated from abstract scope sniffs when moving to a new file
- Core tokenizer now matches orphaned curly braces in the same way as square brackets
- Whitespace tokens at the end of JS files are now added to the token stack
- JavaScript tokenizer now identifies properties and labels as new token types
- JavaScript tokenizer now identifies object definitions as a new token type and matches curly braces for them
- JavaScript tokenizer now identifies DIV_EQUAL and MUL_EQUAL tokens
- Improved regular expression detection in the JavaScript tokenizer
- Improve AbstractPatternSniff support so it can listen for any token type, not just weighted tokens
- Fixed Squiz DoubleQuoteUsageSniff so it works correctly with short_open_tag=Off
- Fixed bug #14409 : Output of warnings to log file
- Fixed bug #14520 : Notice: Undefined offset: 1 in /usr/share/php/PHP/CodeSniffer/File.php on line
- Fixed bug #14637 : Call to processUnknownArguments() misses second parameter $pos
  -- Thanks to Peter Buri for the patch
- Fixed bug #14889 : Lack of clarity: licence or license
- Fixed bug #15008 : Nested Parentheses in Control Structure Sniffs
- Fixed bug #15091 : pre-commit hook attempts to sniff folders
  -- Thanks to Bruce Weirdan for the patch
- Fixed bug #15124 : AbstractParser.php uses deprecated split() function
  -- Thanks to Sebastian Bergmann for the patch
- Fixed bug #15188 : PHPCS vs HEREDOC strings
- Fixed bug #15231 : Notice: Uninitialized string offset: 0 in FileCommentSniff.php on line 555
- Fixed bug #15336 : Notice: Undefined offset: 2 in /usr/share/php/PHP/CodeSniffer/File.php on line
   

* Version 1.1.0 (stable) - API 1.1.0 (stable) - 2008-07-14


- PEAR FileCommentSniff now allows tag orders to be overridden in child classes
  -- Thanks to Jeff Hodsdon for the patch
- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line
- Squiz standard now uses DisallowMultipleStatementsSniff
- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var}
- Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member
- Fixed bug #14168 : Global Function -> Static Method and __autoload()
- Fixed bug #14238 : Line length not checket at last line of a file
- Fixed bug #14249 : wrong detection of scope_opener
- Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array
- Fixed bug #14251 : --extensions option doesn't work
   

* Version 1.1.0RC3 (beta) - API 1.1.0RC3 (beta) - 2008-07-03


- PEAR FileCommentSniff now allows tag orders to be overridden in child classes
  -- Thanks to Jeff Hodsdon for the patch
- Added Generic DisallowMultipleStatementsSniff to ensure there is only one statement per line
- Squiz standard now uses DisallowMultipleStatementsSniff
- Fixed error in Zend ValidVariableNameSniff when checking vars in form: $class->{$var}
- Fixed bug #14077 : Fatal error: Uncaught PHP_CodeSniffer_Exception: $stackPtr is not a class member
- Fixed bug #14168 : Global Function -> Static Method and __autoload()
- Fixed bug #14238 : Line length not checket at last line of a file
- Fixed bug #14249 : wrong detection of scope_opener
- Fixed bug #14250 : ArrayDeclarationSniff emit warnings at malformed array
- Fixed bug #14251 : --extensions option doesn't work
   

* Version 1.1.0RC2 (beta) - API 1.1.0RC2 (beta) - 2008-06-13


- Permission denied errors now stop script execution but still display current errors (feature request #14076)
- Added Squiz ValidArrayIndexNameSniff to ensure array indexes do not use camel case
- Squiz ArrayDeclarationSniff now ensures arrays are not declared with camel case index values
- PEAR ValidVariableNameSniff now alerts about a possible parse error for member vars inside an interface
- Fixed bug #13921 : js parsing fails for comments on last line of file
- Fixed bug #13922 : crash in case of malformed (but tokenized) php file
  -- PEAR and Squiz ClassDeclarationSniff now throw warnings for possible parse errors
  -- Squiz ValidClassNameSniff now throws warning for possible parse errors
  -- Squiz ClosingDeclarationCommentSniff now throws additonal warnings for parse errors
   

* Version 1.1.0RC1 (beta) - API 1.1.0RC1 (beta) - 2008-05-13


- Added support for multiple tokenizers so PHP_CodeSniffer can check more than just PHP files
  -- PHP_CodeSniffer now has a JS tokenizer for checking JavaScript files
  -- Sniffs need to be updated to work with additional tokenizers, or new sniffs written for them
   - phpcs now exits with status 2 if the tokenier extension has been disabled (feature request #13269)
   - Added scripts/phpcs-svn-pre-commit that can be used as an SVN pre-commit hook
 -- Also reworked the way the phpcs script works to make it easier to wrap it with other functionality
 -- Thanks to Jack Bates for the contribution
   - Fixed error in phpcs error message when a supplied file does not exist
   - Fixed a cosmetic error in AbstractPatternSniff where the "found" string was missing some content
   - Added sniffs that implement part of the PMD rule catalog to the Generic standard
 -- Thanks to Manuel Pichler for the contribution of all these sniffs.
   - Squiz FunctionCommentThrowTagSniff no longer throws errors for function that only throw variables
   - Generic ScopeIndentSniff now has private member to enforce exact indent matching
   - Replaced Squiz DisallowCountInLoopsSniff with Squiz DisallowSizeFunctionsInLoopsSniff
 -- Thanks to Jan Miczaika for the sniff
   - Squiz BlockCommentSniff now checks inline doc block comments
   - Squiz InlineCommentSniff now checks inline doc block comments
   - Squiz BlockCommentSniff now checks for no blank line before first comment in a function
   - Squiz DocCommentAlignmentSniff now ignores inline doc block comments
   - Squiz ControlStructureSpacingSniff now ensures no blank lines at the start of control structures
   - Squiz ControlStructureSpacingSniff now ensures no blank lines between control structure closing braces
   - Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are bracketed in string concats
   - Squiz IncrementDecrementUsageSniff now ensures inc/dec ops are not used in arithmetic operations
   - Squiz FunctionCommentSniff no longer throws errors if return value is mixed but function returns void somewhere
   - Squiz OperatorBracketSniff no allows function call brackets to count as operator brackets
   - Squiz DoubleQuoteUsageSniff now supports \x \f and \v (feature request #13365)
   - Squiz ComparisonOperatorUsageSniff now supports JS files
   - Squiz ControlSignatureSniff now supports JS files
   - Squiz ForLoopDeclarationSniff now supports JS files
   - Squiz OperatorBracketSniff now supports JS files
   - Squiz InlineControlStructureSniff now supports JS files
   - Generic LowerCaseConstantSniff now supports JS files
   - Generic DisallowTabIndentSniff now supports JS files
   - Generic MultipleStatementAlignmentSniff now supports JS files
   - Added Squiz ObjectMemberCommaSniff to ensure the last member of a JS object is not followed by a comma
   - Added Squiz ConstantCaseSniff to ensure the PHP constants are uppercase and JS lowercase
   - Added Squiz JavaScriptLintSniff to check JS files with JSL
 -- Set path using phpcs --config-set jsl_path /path/to/jsl
   - Added MySource FirebugConsoleSniff to ban the use of "console" for JS variable and function names
   - Added MySource JoinStringsSniff to enforce the use of join() to concatenate JS strings
   - Added MySource AssignThisSniff to ensure this is only assigned to a var called self
   - Added MySource DisallowNewWidgetSniff to ban manual creation of widget objects
   - Removed warning shown in Zend CodeAnalyzerSniff when the ZCA path is not set
   - Fixed error in Squiz ValidVariableNameSniff when checking vars in the form $obj->$var
   - Fixed error in Squiz DisallowMultipleAssignmentsSniff when checking vars in the form $obj->$var
   - Fixed error in Squiz InlineCommentSniff where comments for class constants were seen as inline
   - Fixed error in Squiz BlockCommentSniff where comments for class constants were not ignored
   - Fixed error in Squiz OperatorBracketSniff where negative numbers were ignored during comparisons
   - Fixed error in Squiz FunctionSpacingSniff where functions after member vars reported incorrect spacing
   - Fixed bug #13062 : Interface comments aren't handled in PEAR standard
 -- Thanks to Manuel Pichler for the path
   - Fixed bug #13119 : php minimum requirement need to be fix
   - Fixed bug #13156 : Bug in Squiz_Sniffs_PHP_NonExecutableCodeSniff
   - Fixed bug #13158 : Strange behaviour in AbstractPatternSniff
   - Fixed bug #13169 : Undefined variables
   - Fixed bug #13178 : Catch exception in File.php
   - Fixed bug #13254 : Notices output in checkstyle report causes XML issues
   - Fixed bug #13446 : crash with src of phpMyAdmin
 -- Thanks to Manuel Pichler for the path
   

* Version 1.1.0a1 (alpha) - API 1.1.0a1 (alpha) - 2008-04-21


- Fixed error in PEAR ValidClassNameSniff when checking class names with double underscores
- Moved Squiz InlineControlStructureSniff into Generic standard
- PEAR standard now throws warnings for inline control structures
- Squiz OutputBufferingIndentSniff now ignores the indentation of inline HTML
- MySource IncludeSystemSniff now ignores usage of ZipArchive
- Removed "function" from error messages for Generic function brace sniffs (feature request #13820)
- Generic UpperCaseConstantSniff no longer throws errors for delcare(ticks = ...)
  -- Thanks to Josh Snyder for the patch
- Squiz ClosingDeclarationCommentSniff and AbstractVariableSniff now throw warnings for possible parse errors
- Fixed bug #13827 : AbstractVariableSniff throws "undefined index"
- Fixed bug #13846 : Bug in Squiz.NonExecutableCodeSniff
- Fixed bug #13849 : infinite loop in PHP_CodeSniffer_File::findNext()
   

* Version 1.0.1 (stable) - API 1.0.1 (stable) - 2008-02-04


- Squiz ArrayDeclarationSniff now throws error if the array keyword is followed by a space
- Squiz ArrayDeclarationSniff now throws error for empty multi-line arrays
- Squiz ArrayDeclarationSniff now throws error for multi-line arrays with a single value
- Squiz DocCommentAlignmentSniff now checks for a single space before tags inside docblocks
- Squiz ForbiddenFunctionsSniff now disallows is_null() to force use of (=== NULL) instead
- Squiz VariableCommentSniff now continues throwing errors after the first one is found
- Squiz SuperfluousWhitespaceSniff now throws errors for multiple blank lines inside functions
- MySource IncludedSystemSniff now checks extended class names
- MySource UnusedSystemSniff now checks extended and implemented class names
- MySource IncludedSystemSniff now supports includeWidget()
- MySource UnusedSystemSniff now supports includeWidget()
- Added PEAR ValidVariableNameSniff to check that only private member vars are prefixed with an underscore
- Added Squiz DisallowCountInLoopsSniff to check for the use of count() in FOR and WHILE loop conditions
- Added MySource UnusedSystemSniff to check for included classes that are never used
- Fixed a problem that caused the parentheses map to sometimes contain incorrect values
- Fixed bug #12767 : Cant run phpcs from dir with PEAR subdir
- Fixed bug #12773 : Reserved variables are not detected in strings
  -- Thanks to Wilfried Loche for the patch
- Fixed bug #12832 : Tab to space conversion does not work
- Fixed bug #12888 : extra space indentation = Notice: Uninitialized string offset...
- Fixed bug #12909 : Default generateDocs function does not work under linux
  -- Thanks to Paul Smith for the patch
- Fixed bug #12957 : PHP 5.3 magic method __callStatic
  -- Thanks to Manuel Pichler for the patch
   

* Version 1.0.0 (stable) - API 1.0.0 (stable) - 2007-12-21


- You can now specify the full path to a coding standard on the command line (feature request #11886)
  -- This allows you to use standards that are stored outside of PHP_CodeSniffer's own Standard dir
  -- You can also specify full paths in the CodingStandard.php include and exclude methods
  -- Classes, dirs and files need to be names as if the standard was part of PHP_CodeSniffer
  -- Thanks to Dirk Thomas for the doc generator patch and testing
- Modified the scope map to keep checking after 3 lines for some tokens (feature request #12561)
  -- Those tokens that must have an opener (like T_CLASS) now keep looking until EOF
  -- Other tokens (like T_FUNCTION) still stop after 3 lines for performance
- You can now esacpe commas in ignore patterns so they can be matched in file names
  -- Thanks to Carsten Wiedmann for the patch
- Config data is now cached in a global var so the file system is not hit so often
  -- You can also set config data temporarily for the script if you are using your own external script
  -- Pass TRUE as the third argument to PHP_CodeSniffer::setConfigData()
- PEAR ClassDeclarationSniff no longer throws errors for multi-line class declarations
- Squiz ClassDeclarationSniff now ensures there is one blank line after a class closing brace
- Squiz ClassDeclarationSniff now throws errors for a missing end PHP tag after the end class tag
- Squiz IncrementDecrementUsageSniff no longer throws errors when -= and += are being used with vars
- Squiz SwitchDeclarationSniff now throws errors for switch statements that do not contain a case statement
  -- Thanks to Sertan Danis for the patch
- MySource IncludeSystemSniff no longer throws errors for the Util package
- Fixed bug #12621 : "space after AS" check is wrong
  -- Thanks to Satoshi Oikawa for the patch
- Fixed bug #12645 : error message is wrong
  -- Thanks to Renoiv for the patch
- Fixed bug #12651 : Increment/Decrement Operators Usage at -1
   

* Version 1.0.0RC3 (beta) - API 1.0.0RC3 (beta) - 2007-11-30


- Added new command line argument --tab-width that will convert tabs to spaces before testing
  -- This allows you to use the existing sniffs that check for spaces even when you use tabs
  -- Can also be set via a config var: phpcs --config-set tab_width 4
  -- A value of zero (the default) tells PHP_CodeSniffer not to replace tabs with spaces
- You can now change the default report format from "full" to something else
    -- Run: phpcs --config-set report_format [format]
- Improved performance by optimising the way the scope map is created during tokenising
- Added new Squiz DisallowInlineIfSniff to disallow the usage of inline IF statements
- Fixed incorrect errors being thrown for nested switches in Squiz SwitchDeclarationSniff
- PEAR FunctionCommentSniff no longer complains about missing comments for @throws tags
- PEAR FunctionCommentSniff now throws error for missing exception class name for @throws tags
- PHP_CodeSniffer_File::isReference() now correctly returns for functions that return references
- Generic LineLengthSniff no longer warns about @version lines with CVS or SVN id tags
- Generic LineLengthSniff no longer warns about @license lines with long URLs
- Squiz FunctionCommentThrowTagSniff no longer complains about throwing variables
- Squiz ComparisonOperatorUsageSniff no longer throws incorrect errors for inline IF statements
- Squiz DisllowMultipleAssignmentsSniff no longer throws errors for assignments in inline IF statements
- Fixed bug #12455 : CodeSniffer treats content inside heredoc as PHP code
- Fixed bug #12471 : Checkstyle report is broken
- Fixed bug #12476 : PHP4 destructors are reported as error
- Fixed bug #12513 : Checkstyle XML messages need to be utf8_encode()d
  -- Thanks to Sebastian Bergmann for the patch.
- Fixed bug #12517 : getNewlineAfter() and dos files
   

* Version 1.0.0RC2 (beta) - API 1.0.0RC2 (beta) - 2007-11-14


- Added a new Checkstyle report format
  -- Like the current XML format but modified to look like Checkstyle output
  -- Thanks to Manuel Pichler for helping get the format correct
- You can now hide warnings by default
    -- Run: phpcs --config-set show_warnings 0
    -- If warnings are hidden by default, use the new -w command line argument to override
- Added new command line argument --config-delete to delete a config value and revert to the default
- Improved overall performance by optimising tokenising and next/prev methods (feature request #12421)
  -- Thanks to Christian Weiske for the patch
- Added FunctionCallSignatureSniff to Squiz standard
- Added @subpackage support to file and class comment sniffs in PEAR standard (feature request #12382)
  -- Thanks to Carsten Wiedmann for the patch
- An error is now displayed if you use a PHP version less than 5.1.0 (feature request #12380)
  -- Thanks to Carsten Wiedmann for the patch
- phpcs now exits with status 2 if it receives invalid input (feature request #12380)
  -- This is distinct from status 1, which indicates errors or warnings were found
- Added new Squiz LanguageConstructSpacingSniff to throw errors for additional whitespace after echo etc.
- Removed Squiz ValidInterfaceNameSniff
- PEAR FunctionCommentSniff no longer complains about unknown tags
- Fixed incorrect errors about missing function comments in PEAR FunctionCommentSniff
- Fixed incorrect function docblock detection in Squiz FunctionCommentSniff
- Fixed incorrect errors for list() in Squiz DisallowMultipleAssignmentsSniff
- Errors no longer thrown if control structure is followed by a CASE's BREAK in Squiz ControlStructureSpacingSniff
- Fixed bug #12368 : Autoloader cannot be found due to include_path override
  -- Thanks to Richard Quadling for the patch
- Fixed bug #12378 : equal sign alignments problem with while()
   

* Version 1.0.0RC1 (beta) - API 1.0.0RC1 (beta) - 2007-11-01


- Main phpcs script can now be run from a CVS checkout without installing the package
- Added a new CSV report format
  -- Header row indicates what position each element is in
  -- Always use the header row to determine positions rather than assuming the format, as it may change
- XML and CSV report formats now contain information about which column the error occurred at
  -- Useful if you want to highlight the token that caused the error in a custom application
- Square bracket tokens now have bracket_opener and bracket_closer set
- Added new Squiz SemicolonSpacingSniff to throw errors if whitespace is found before a semicolon
- Added new Squiz ArrayBracketSpacingSniff to throw errors if whitespace is found around square brackets
- Added new Squiz ObjectOperatorSpacingSniff to throw errors if whitespace is found around object operators
- Added new Squiz DisallowMultipleAssignmentsSniff to throw errors if multiple assignments are on the same line
- Added new Squiz ScopeKeywordSpacingSniff to throw errors if there is not a single space after a scope modifier
- Added new Squiz ObjectInstantiationSniff to throw errors if new objects are not assigned to a variable
- Added new Squiz FunctionDuplicateArgumentSniff to throw errors if argument is declared multiple times in a function
- Added new Squiz FunctionOpeningBraceSpaceSniff to ensure there are no blank lines after a function open brace
- Added new Squiz CommentedOutCodeSniff to warn about comments that looks like they are commented out code blocks
- Added CyclomaticComplexitySniff to Squiz standard
- Added NestingLevelSniff to Squiz standard
- Squiz ForbiddenFunctionsSniff now recommends echo() instead of print()
- Squiz ValidLogicalOperatorsSniff now recommends ^ instead of xor
- Squiz SwitchDeclarationSniff now contains more checks
  -- A single space is required after the case keyword
  -- No space is allowed before the colon in a case or default statement
  -- All switch statements now require a default case
  -- Default case must contain a break statement
  -- Empty default case must contain a comment describing why the default is ignored
  -- Empty case statements are not allowed
  -- Case and default statements must not be followed by a blank line
  -- Break statements must be followed by a blank line or the closing brace
  -- There must be no blank line before a break statement
- Squiz standard is now using the PEAR IncludingFileSniff
- PEAR ClassCommentSniff no longer complains about unknown tags
- PEAR FileCommentSniff no longer complains about unknown tags
- PEAR FileCommentSniff now accepts multiple @copyright tags
- Squiz BlockCommentSniff now checks that comment starts with a capital letter
- Squiz InlineCommentSniff now has better checking to ensure comment starts with a capital letter
- Squiz ClassCommentSniff now checks that short and long comments start with a capital letter
- Squiz FunctionCommentSniff now checks that short, long and param comments start with a capital letter
- Squiz VariableCommentSniff now checks that short and long comments start with a capital letter
- Fixed error with multi-token array indexes in Squiz ArrayDeclarationSniff
- Fixed error with checking shorthand IF statements without a semicolon in Squiz InlineIfDeclarationSniff
- Fixed error where constants used as defulat values in function declarations were seen as type hints
- Fixed bug #12316 : PEAR is no longer the default standard
- Fixed bug #12321 : wrong detection of missing function docblock
   

* Version 0.9.0 (beta) - API 0.9.0 (beta) - 2007-09-24


- Added a config system for setting config data across phpcs runs
- You can now change the default coding standard from PEAR to something else
  -- Run: phpcs --config-set default_standard [standard]
- Added new Zend coding standard to check code against the Zend Framework standards
  -- The complete standard is not yet implemented
  -- Specify --standard=Zend to use
  -- Thanks to Johann-Peter Hartmann for the contribution of some sniffs
  -- Thanks to Holger Kral for the Code Analyzer sniff
   

* Version 0.8.0 (beta) - API 0.8.0 (beta) - 2007-08-08


- Added new XML report format; --report=xml (feature request #11535)
  -- Thanks to Brett Bieber for the patch
- Added new command line argument --ignore to specify a list of files to skip (feature request #11556)
- Added PHPCS and MySource coding standards into the core install
- Scope map no longer gets confused by curly braces that act as string offsets
- Removed CodeSniffer/SniffException.php as it is no longer used
- Unit tests can now be run directly from a CVS checkout
- Made private vars and functions protected in PHP_CodeSniffer class so this package can be overridden
- Added new Metrics category to Generic coding standard
  -- Contains Cyclomatic Complexity and Nesting Level sniffs
  -- Thanks to Johann-Peter Hartmann for the contribution
- Added new Generic DisallowTabIndentSniff to throw errors if tabs are used for indentation (feature request #11738)
  -- PEAR and Squiz standards use this new sniff to throw more specific indentation errors
- Generic MultipleStatementAlignmentSniff has new private var to set a padding size limit (feature request #11555)
- Generic MultipleStatementAlignmentSniff can now handle assignments that span multiple lines (feature request #11561)
- Generic LineLengthSniff now has a max line length after which errors are thrown instead of warnings
  -- BC BREAK: Override the protected member var absoluteLineLimit and set it to zero in custom LineLength sniffs
  -- Thanks to Johann-Peter Hartmann for the contribution
- Comment sniff errors about incorrect tag orders are now more descriptive (feature request #11693)
- Fixed bug #11473 : Invalid CamelCaps name when numbers used in names
   

* Version 0.7.0 (beta) - API 0.7.0 (beta) - 2007-07-02


- BC BREAK: EOL character is now auto-detected and used instead of hard-coded \n
  -- Pattern sniffs must now specify "EOL" instead of "\n" or "\r\n" to use auto-detection
  -- Please use $phpcsFile->eolChar to check for newlines instead of hard-coding "\n" or "\r\n"
  -- Comment parser classes now require you to pass $phpcsFile as an additional argument
- BC BREAK: Included and excluded sniffs now require .php extension
  -- Please update your coding standard classes and add ".php" to all sniff entries
  -- See CodeSniffer/Standards/PEAR/PEARCodingStandard.php for an example

- Fixed error where including a directory of sniffs in a coding standard class did not work
- Coding standard classes can now specify a list of sniffs to exclude as well as include (feature request #11056)
- Two uppercase characters can now be placed side-by-side in class names in Squiz ValidClassNameSniff
- SVN tags now allowed in PEAR file doc blocks (feature request #11038)
  -- Thanks to Torsten Roehr for the patch
- Private methods in commenting sniffs and comment parser are now protected (feature request #11087)
- Added Generic LineEndingsSniff to check the EOL character of a file
- PEAR standard now only throws one error per file for incorrect line endings (eg. /r/n)
- Command line arg -v now shows number of registered sniffs
- Command line arg -vvv now shows list of registered sniffs
- Squiz ControlStructureSpacingSniff no longer throws errors if the control structure is at the end of the script
- Squiz FunctionCommentSniff now throws error for "return void" if function has return statement
- Squiz FunctionCommentSniff now throws error for functions that return void but specify something else
- Squiz ValidVariableNameSniff now allows multiple uppercase letters in a row
- Squiz ForEachLoopDeclarationSniff now throws error for AS keyword not being lowercase
- Squiz SwitchDeclarationSniff now throws errors for CASE/DEFAULT/BREAK keywords not being lowercase
- Squiz ArrayDeclarationSniff now handles multi-token array values when checking alignment
- Squiz standard now enforces a space after cast tokens
- Generic MultipleStatementAlignmentSniff no longer gets confused by assignments inside FOR conditions
- Generic MultipleStatementAlignmentSniff no longer gets confused by the use of list()
- Added Generic SpaceAfterCastSniff to ensure there is a single space after a cast token
- Added Generic NoSpaceAfterCastSniff to ensure there is no whitespace after a cast token
- Added PEAR ClassDeclarationSniff to ensure the opening brace of a class is on the line after the keyword
- Added Squiz ScopeClosingBraceSniff to ensure closing braces are aligned correctly
- Added Squiz EvalSniff to discourage the use of eval()
- Added Squiz LowercaseDeclarationSniff to ensure all declaration keywords are lowercase
- Added Squiz LowercaseClassKeywordsSniff to ensure all class declaration keywords are lowercase
- Added Squiz LowercaseFunctionKeywordsSniff to ensure all function declaration keywords are lowercase
- Added Squiz LowercasePHPFunctionsSniff to ensure all calls to inbuilt PHP functions are lowercase
- Added Squiz CastSpacingSniff to ensure cast statements dont contain whitespace
- Errors no longer thrown when checking 0 length files with verbosity on
- Fixed bug #11105 : getIncludedSniffs() not working anymore
  -- Thanks to Blair Robertson for the patch
- Fixed bug #11120 : Uninitialized string offset in AbstractParser.php on line 200
   

* Version 0.6.0 (beta) - API 0.6.0 (beta) - 2007-05-15


- The number of errors and warnings found is now shown for each file while checking the file if verbosity is enabled
- Now using PHP_EOL instead of hard-coded \n so output looks good on Windows (feature request #10761)
  - Thanks to Carsten Wiedmann for the patch.
- phpcs now exits with status 0 (no errors) or 1 (errors found) (feature request #10348)
- Added new -l command line argument to stop recursion into directories (feature request #10979)
- Fixed variable name error causing incorrect error message in Squiz ValidVariableNameSniff
- Fixed bug #10757 : Error in ControlSignatureSniff
- Fixed bugs #10751, #10777 : Sniffer class paths handled incorrectly in Windows
  - Thanks to Carsten Wiedmann for the patch.
- Fixed bug #10961 : Error "Last parameter comment requires a blank newline after it" thrown
- Fixed bug #10983 : phpcs outputs notices when checking invalid PHP
- Fixed bug #10980 : Incorrect warnings for equals sign
   

* Version 0.5.0 (beta) - API 0.5.0 (beta) - 2007-04-17


- BC BREAK: Coding standards now require a class to be added so PHP_CodeSniffer can get information from them
  - Please read the end user docs for info about the new class required for all coding standards

- Coding standards can now include sniffs from other standards, or whole standards, without writing new sniff files
- PHP_CodeSniffer_File::isReference() now correctly returns for references in function declarations
- PHP_CodeSniffer_File::isReference() now returns false if you don't pass it a T_BITWISE_AND token
- PHP_CodeSniffer_File now stores the absolute path to the file so sniffs can check file locations correctly
- Fixed undefined index error in AbstractVariableSniff for variables inside an interface function definition
- Added MemberVarSpacingSniff to Squiz standard to enforce one-line spacing between member vars
- Add FunctionCommentThrowTagSniff to Squiz standard to check that @throws tags are correct
- Fixed problems caused by references and type hints in Squiz FunctionDeclarationArgumentSpacingSniff
- Fixed problems with errors not being thrown for some misaligned @param comments in Squiz FunctionCommentSniff
- Fixed badly spaced comma error being thrown for "extends" class in Squiz ClassDeclarationSniff
- Errors no longer thrown for class method names in Generic ForbiddenFunctionsSniff
- Errors no longer thrown for type hints in front of references in Generic UpperCaseConstantNameSniff
- Errors no longer thrown for correctly indented buffered lines in Squiz ScopeIndexSniff
- Errors no longer thrown for user-defined functions named as forbidden functions in Generic ForbiddenFunctionsSniff
- Errors no longer thrown on __autoload functions in PEAR ValidFunctionNameSniff
- Errors now thrown for __autoload methods in PEAR ValidFunctionNameSniff
- Errors now thrown if constructors or destructors have @return tags in Squiz FunctionCommentSniff
- Errors now thrown if @throws tags dont start with a capital and end with a full stop in Squiz FunctionCommentSniff
- Errors now thrown for invalid @var tag values in Squiz VariableCommentSniff
- Errors now thrown for missing doc comment in Squiz VariableCommentSniff
- Errors now thrown for unspaced operators in FOR loop declarations in Squiz OperatorSpacingSniff
- Errors now thrown for using ob_get_clean/flush functions to end buffers in Squiz OutputBufferingIndentSniff
- Errors now thrown for all missing member variable comments in Squiz VariableCommentSniff
   

* Version 0.4.0 (beta) - API 0.4.0 (beta) - 2007-02-19


- Standard name specified with --standard command line argument is no longer case sensitive
- Long error and warning messages are now wrapped to 80 characters in the full error report (thanks Endre Czirbesz)
- Shortened a lot of error and warning messages so they don't take up so much room
- Squiz FunctionCommentSniff now checks that param comments start with a capital letter and end with a full stop
- Squiz FunctionSpacingSniff now reports incorrect lines below function on closing brace, not function keyword
- Squiz FileCommentSniff now checks that there are no blank lines between the open PHP tag and the comment
- PHP_CodeSniffer_File::isReference() now returns correctly when checking refs on right side of =>
- Fixed incorrect error with switch closing brace in Squiz SwitchDeclarationSniff
- Fixed missing error when multiple statements are not aligned correctly with object operators
- Fixed incorrect errors for some PHP special variables in Squiz ValidVariableNameSniff
- Fixed incorrect errors for arrays that only contain other arrays in Squiz ArrayDeclarationSniff
- Fixed bug #9844 : throw new Exception(\n accidently reported as error but it ain't
   

* Version 0.3.0 (beta) - API 0.3.0 (beta) - 2007-01-11


- Updated package.xml to version 2
- Specifying coding standard on command line is now optional, even if you have multiple standards installed
  - PHP_CodeSniffer uses the PEAR coding standard by default if no standard is specified
- New command line option, --extensions, to specify a comma separated list of file extensions to check
- Converted all unit tests to PHPUnit 3 format
- Added new coding standard, Squiz, that can be used as an alternative to PEAR
  - also contains more examples of sniffs
  - some may be moved into the Generic coding standard if required
- Added MultipleStatementAlignmentSniff to Generic standard
- Added ScopeIndentSniff to Generic standard
- Added ForbiddenFunctionsSniff to Generic standard
- Added FileCommentSniff to PEAR standard
- Added ClassCommentSniff to PEAR standard
- Added FunctionCommentSniff to PEAR standard
- Change MultipleStatementSniff to MultipleStatementAlignmentSniff in PEAR standard
- Replaced Methods directory with Functions directory in Generic and PEAR standards
  - also renamed some of the sniffs in those directories
- Updated file, class and method comments for all files
- Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens
- Fixed bug #9411 : too few pattern characters cause incorrect error report
   

* Version 0.2.1 (alpha) - API 0.2.1 (alpha) - 2006-11-09


- Fixed bug #9274 : nested_parenthesis element not set for open and close parenthesis tokens
   

* Version 0.2.0 (alpha) - API 0.2.0 (alpha) - 2006-10-13


- Added a generic standards package that will contain generic sniffs to be used in specific coding standards
  - thanks to Frederic Poeydomenge for the idea
- Changed PEAR standard to use generic sniffs where available
- Added LowerCaseConstantSniff to Generic standard
- Added UpperCaseConstantSniff to Generic standard
- Added DisallowShortOpenTagSniff to Generic standard
- Added LineLengthSniff to Generic standard
- Added UpperCaseConstantNameSniff to Generic standard
- Added OpeningMethodBraceBsdAllmanSniff to Generic standard (contrib by Frederic Poeydomenge)
- Added OpeningMethodBraceKernighanRitchieSniff to Generic standard (contrib by Frederic Poeydomenge)
- Added framework for core PHP_CodeSniffer unit tests
- Added unit test for PHP_CodeSniffer:isCamelCaps method
- ScopeClosingBraceSniff now checks indentation of BREAK statements
- Added new command line arg (-vv) to show developer debug output
- Fixed some coding standard errors
- Fixed bug #8834 : Massive memory consumption
- Fixed bug #8836 : path case issues in package.xml
- Fixed bug #8843 : confusion on nested switch()
- Fixed bug #8841 : comments taken as whitespace
- Fixed bug #8884 : another problem with nested switch() statements
   

* Version 0.1.1 (alpha) - API 0.1.1 (alpha) - 2006-09-25


- Added unit tests for all PEAR sniffs
- Exception class now extends from PEAR_Exception
- Fixed summary report so files without errors but with warnings are not shown when warnings are hidden
   

* Version 0.1.0 (alpha) - API 0.1.0 (alpha) - 2006-09-19


- Reorganised package contents to conform to PEAR standards
- Changed version numbering to conform to PEAR standards
- Removed duplicate require_once() of Exception.php from CodeSniffer.php
   

* Version 0.0.5 (alpha) - API 0.0.5 (alpha) - 2006-09-18


- Fixed .bat file for situation where php.ini cannot be found so include_path is not set
   

* Version 0.0.4 (alpha) - API 0.0.4 (alpha) - 2006-08-28


- Added .bat file for easier running of PHP_CodeSniffer on Windows
- Sniff that checks method names now works for PHP4 style code where there is no scope keyword
- Sniff that checks method names now works for PHP4 style constructors
- Sniff that checks method names no longer incorrectly reports error with magic methods
- Sniff that checks method names now reports errors with non-magic methods prefixed with __
- Sniff that checks for constant names no longer incorrectly reports errors with heredoc strings
- Sniff that checks for constant names no longer incorrectly reports errors with created objects
- Sniff that checks indentation no longer incorrectly reports errors with heredoc strings
- Sniff that checks indentation now correctly reports errors with improperly indented multi-line strings
- Sniff that checks function declarations now checks for spaces before and after an equals sign for default values
- Sniff that checks function declarations no longer incorrectly reports errors with multi-line declarations
- Sniff that checks included code no longer incorrectly reports errors when return value is used conditionally
- Sniff that checks opening brace of function no longer incorrectly reports errors with multi-line declarations
- Sniff that checks spacing after commas in function calls no longer reports too many errors for some code
- Sniff that checks control structure declarations now gives more descriptive error message
   

* Version 0.0.3 (alpha) - API 0.0.3 (alpha) - 2006-08-22


- Added sniff to check for invalid class and interface names
- Added sniff to check for invalid function and method names
- Added sniff to warn if line is greater than 85 characters
- Added sniff to check that function calls are in the correct format
- Fixed error where comments were not allowed on the same line as a control structure declaration
- Added command line arg to print current version (--version)
   

* Version 0.0.2 (alpha) - API 0.0.2 (alpha) - 2006-07-25


- Removed the including of checked files to stop errors caused by parsing them
- Removed the use of reflection so checked files do not have to be included
- Memory usage has been greatly reduced
- Much faster tokenising and checking times
- Reworked the PEAR coding standard sniffs (much faster now)
- Fix some bugs with the PEAR scope indentation standard
- Better checking for installed coding standards
- Can now accept multiple files and dirs on the command line
- Added an option to list installed coding standards
- Added an option to print a summary report (number of errors and warnings shown for each file)
- Added an option to hide warnings from reports
- Added an option to print verbose output (so you know what is going on)
- Reordered command line args to put switches first (although order is not enforced)
- Switches can now be specified together (eg. php -nv) as well as separately (phpcs -n -v)
   

* Version 0.0.1 (alpha) - API 0.0.1 (alpha) - 2006-07-19


Initial preview release.
   

