【问题标题】:Use PHP_CodeSniffer for modified lines only仅对修改的行使用 PHP_CodeSniffer
【发布时间】:2012-12-16 08:38:54
【问题描述】:

我正在尝试在 SVN 中构建一个预提交脚本,并且我想在 仅修改后的行(而不是整个文件)上运行 PHP_CodeSniffer。到目前为止,我有这个脚本:

#!/bin/sh

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || exit 1

# Check for code validation before commiting the script using PHP_CodeSniffer
/tmp/pear/download/PHP_CodeSniffer-1.4.3/scripts/phpcs-svn-pre-commit  "$REPOS" -t "$TXN" >&2 || exit 1

# All checks passed, so allow the commit.
exit 0

【问题讨论】:

  • 您也许应该概述一下到目前为止您所尝试的问题是什么。 +1 用于构建它并询问;)
  • phpcs 获取文件,将其解析为 AST 并对其执行分析。所以在检查步骤 - 没有可用的原始行号。我几乎不怀疑这是可能的
  • 就像@zerkms 所说,必须解析整个文件,但可以检查是否有任何更改的行在包含cs 错误的行集中。
  • 虽然内容嗅探器确实会检查“行”,但它无法知道运行时实际发生了什么变化。为什么不在应用更改之前比较文件的输出,然后再应用?它很快,它很脏,而且它可能会起作用......
  • 不,我不会为你做你的工作。

标签: php svn pre-commit-hook codesniffer


【解决方案1】:

2017年,自CodeSniffer 3.0.0发布以来,有new --cache option

或者您可以使用EasyCodingStandard,它默认会这样做

【讨论】:

    【解决方案2】:

    从概念上讲它没有意义。

    phpcs需要知道hole context才能正确分析。

    仅扫描更改的行会删除上下文。

    【讨论】:

    • PHPCS 仅适用于当前文件的上下文。我只知道大约 1 次嗅探,确实需要更多的了解,但它使用了一些先进的技术来做到这一点。 github.com/Symplify/…
    • 我实际上是指整个文件的上下文,而不是整个项目。所以这个说法还是正确的。
    【解决方案3】:

    有一个项目lint-diffs 可以在差异输出文件上运行任何 linter。

    使用phpcs --report=emacs 作为命令。正则表达式可以与示例配置相同。

    【讨论】:

      【解决方案4】:

      这是在 Phabricator 的工具 Arcanist 中的完成方式:

      1. 它对每个更改的文件运行 php 代码嗅探器并收集所有错误
      2. 通过行号限制这些错误,其中仅允许在此提交中更改的行号

      这当然不会涵盖某些特定情况,当 LineA 的更改导致 LineB 的错误时。

      【讨论】:

        【解决方案5】:

        我知道这个话题已经过时了。我构建了自己的解决方案来实现这一目标(仅扫描最近更改的行)。这还为时过早,但有效

        https://github.com/ayeo/sniffer

        【讨论】:

          猜你喜欢
          • 2013-11-18
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 1970-01-01
          • 2012-07-06
          • 2020-11-07
          • 1970-01-01
          • 2012-03-06
          相关资源
          最近更新 更多