【问题标题】:Shell script if condition not working in SVN pre-commit hook如果条件在 SVN 预提交钩子中不起作用,则 shell 脚本
【发布时间】:2015-02-03 17:45:18
【问题描述】:

需要帮助

我试图增强预提交钩子,看看如果提交消息中有某个键(“!ignore”),我是否可以忽略解析提交消息

在此之前的 if 条件,例如检查是否有空的提交消息有效。但是,如果条件以某种方式不起作用。

好的,当我使用不包含我的检查密钥“!ignore”的消息“SMARTCOMMITTEST”进行提交时,提交成功,这意味着下面的 If 条件从未执行或未按预期执行。所以试图理解它有什么问题。

SMARTCOMMIT=1 
$SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c || SMARTCOMMIT=0
if [ $SMARTCOMMIT = 0];      
then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

非常感谢 Etan 提供的一些提示...

我像 cmets 中的另一个 if 条件一样更改了条件,然后它起作用了

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep "!ignore" | wc -c)                
if [ "$SMARTCOMMIT" = "0" ];  then
echo "Please use !ignore if you dont want to use smart commits in your commit message." 1>&2
exit 1
fi

这个很好用..

@David W .. 我现在有一种情况要在同一个 if 中检查多个条件

SMARTCOMMIT=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '!ignore' | wc -c)
COMMITMESSAGENOREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '#comment' | wc -c)
COMMITMESSAGEWITHREVIEW=$($SVNLOOK log -t "$TXN" "$REPOS" | grep '+review' | wc -c)
 
if [ "$SMARTCOMMIT" =  "0" -a "$COMMITMESSAGENOREVIEW" = "0" -a "COMMITMESSAGEWITHREVIEW" = "0" ]; then
echo "Please use #comment or +review to enable smart commits or !ignore to not use smart commits." 1>&2
exit 1
fi

我按照link here 中给出的方法进行了尝试,但我仍然没有看到 if 条件被执行。你现在可以帮我解决这个问题吗?

【问题讨论】:

  • [ $SMARTCOMMIT = 0]; 您错过了0 和结束] 之间所需的空间。还要在!ignore 周围使用单引号,以确保禁用历史解析(无论如何应该在脚本中禁用,但单引号更安全)。该命令的|| 部分何时发生? wc 什么时候返回非零值?
  • @EtanReisner 当我在 0 和 ] 之后给出空间时,它仍然不起作用。我假设当提交消息使用字符串 !ignore 时 wc -c 返回一个非零值,因此它会找到它并返回一个非零值并且 Smartcommit=0 不会被设置..
  • 在那种情况下定义“不起作用”? (为了记录,您也没有在原始上下文中解释它。)我假设我关于 wc 的次要 cmets 可能是相关的。
  • 很抱歉我没有关注您的最后评论...
  • 您是否检查过wc 在找到或未找到任何输出时返回非零值?不吐出非零值但返回非零的退出代码?因为它几乎肯定不会。另一方面,grep 在没有打印行时退出非零。这可能对你更有用。而且您还没有解释究竟是什么在这里不起作用。

标签: shell svn grep svnlook


【解决方案1】:

if 语句可以查看命令的退出输出,因此无需根据输出设置环境变量:

shopt extglob > /dev/null  && extglob=1
if ! $SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'
then
    echo 'Please use "!ignore" if you dont want to use smart commits in your commit message.' 1>&2
    exit 1
fi

这运行$SVNLOOK log -t "$TXN" "$REPOS" | grep -q '!ignore'

-q 是安静模式。 grep 如果字符串存在则退出零,如果不存在则退出非零。通过将其放在if ! 中,then 子句仅在找到!ignore 时才会执行。

您必须确保!ignore 被单引号括起来,或者您在! 前面加上\。 Bash 里面有一个 csh 类型的历史机制,没有办法关闭它。每当 shell 看到!,它就假定它与进程 ID 号有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多