【问题标题】:post-receive hook fails to update Trac ticket upon push with several commits for the same ticketpost-receive 钩子在推送时无法更新 Trac 票证,同一票证有多个提交
【发布时间】:2012-03-10 22:41:47
【问题描述】:

有一个 Trac 0.11.7 环境,它使用 GitPlugin 与 Git 存储库集成。这个存储库有一个 post-receive 钩子,它是 GitPlugin 团队提供的 copy

当开发人员将他们的更改推送到服务器时,会触发 post-receive 挂钩。如果包中每个票证包含一个提交,那么一切都会完美运行——各个提交消息与各自的票证相关联。

但是,如果同一票证有多个提交,则只有最新的提交与票证相关联,其余提交将出现以下错误:

处理票证 ID 1 时出现意外错误:列票证、时间、 字段不是唯一的

已经分析了钩子(用 python 编写),看起来函数ticket.save_changes(eml, msg, now, db, cnum + 1) 中的参数now 的时间部分在按顺序处理的提交中仅相差毫秒。

Trac 使用的数据库是 SQLite,它很可能不将毫秒作为日期/时间类型的一部分。

解决上述情况的好方法是什么?

【问题讨论】:

    标签: trac githooks


    【解决方案1】:

    为了克服由自动提交引起的限制,即BatchModifyPlugin 也触发了该限制,内部 Trac 时间戳格式已在 0.12 内从 POSIX 秒更改为 POSIX 微秒(自 1970-01-01 0:00 )。

    所以最好的解决方案是升级到 Trac 0.12.3。另一种方法,正如 01es 所建议的那样,是乱用插件。抱歉,但这只是对黑客的一种攻击,不应归咎于该问题。即使自动提交之间的最小间隔也足以让您在开始部署当前稳定的 Trac 版本后立即消失。

    【讨论】:

      【解决方案2】:

      两个最明显的解决方案是迁移到 Trac 支持的替代 RDBMS(例如 MySQL),或者如果同一张票有多个提交,则人为地在时间戳上增加一秒。

      后一种方法更简单,但不太严格,并且在开发人员并发推送可能导致原始问题的多用户环境中可能效果不佳。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多