代码之家  ›  专栏  ›  技术社区  ›  Rob Wells

为什么GNU补丁在这个差异上失败了?

  •  3
  • Rob Wells  · 技术社区  · 15 年前

    G'day,

    我已经得到了一个要添加到Apache2.2.14的补丁,而一个统一的diff根本没有对该文件进行补丁。我正在使用GNU补丁2.5.4。

    我不得不忽略空白,因为原来的补丁做得不好,也就是说,许多差异似乎是针对tab->空间转换。这些类型的差异甚至不太有用,因为补丁文件已经在交付链的某个位置进行了修改,例如svn存储库、Jira系统、web界面等,因此所有选项卡都已转换为空间!

    /usr/bin/gpatch --verbose --ignore-whitespace -p1 -d . \
        <mod_cache.diff
    

    输出为:

    ...
    
    Hmm...  The next patch looks like a unified diff to me...
    The text leading up to this was:
    --------------------------
    |Index: httpd/modules/cache/mod_cache.h
    |===================================================================
    |--- httpd/modules/cache/mod_cache.h
    |+++ httpd/modules/cache/mod_cache.h
    --------------------------
    Patching file modules/cache/mod_cache.h using Plan A...
    Hunk #1 succeeded at 24.
    Hunk #2 succeeded at 86.
    Hunk #3 succeeded at 138.
    Hunk #4 succeeded at 163.
    Hunk #5 succeeded at 184.
    Hunk #6 succeeded at 217.
    Hunk #7 succeeded at 271.
    Hunk #8 succeeded at 380.
    
    ...
    

    Hunk #2 succeeded at 86.
    

    线

    ...
    
    Index: httpd/modules/cache/mod_cache.h
    ===================================================================
    --- httpd/modules/cache/mod_cache.h
    +++ httpd/modules/cache/mod_cache.h
    @@ -86,9 +86,13 @@
     #define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
     #define DEFAULT_CACHE_EXPIRE    MSEC_ONE_HR
     #define DEFAULT_CACHE_LMFACTOR  (0.1)
    +#define DEFAULT_CACHE_MAXAGE    5
    +#define DEFAULT_CACHE_LOCKPATH "/mod_cache-lock"
    +#define CACHE_LOCKNAME_KEY "mod_cache-lockname"
    +#define CACHE_LOCKFILE_KEY "mod_cache-lockfile"
    
    -/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
    - * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
    +/* Create a set of CACHE_DECLARE(type), CACHE_DECLARE_NONSTD(type) and
    + * CACHE_DECLARE_DATA with appropriate export and import tags for the platform
      */
     #if !defined(WIN32)
     #define CACHE_DECLARE(type)            type
    
    ...
    

    以及消息来源的相关部分, (假定)加上一些上下文,是:

    ...
    
    #define MSEC_ONE_DAY    ((apr_time_t)(86400*APR_USEC_PER_SEC)) /* one day, in microseconds */
    #define MSEC_ONE_HR     ((apr_time_t)(3600*APR_USEC_PER_SEC))  /* one hour, in microseconds */
    #define MSEC_ONE_MIN    ((apr_time_t)(60*APR_USEC_PER_SEC))    /* one minute, in microseconds */
    #define MSEC_ONE_SEC    ((apr_time_t)(APR_USEC_PER_SEC))       /* one second, in microseconds */
    #define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY
    #define DEFAULT_CACHE_EXPIRE    MSEC_ONE_HR
    #define DEFAULT_CACHE_LMFACTOR  (0.1)
    
    /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and 
     * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
     */
    #if !defined(WIN32)
    #define CACHE_DECLARE(type)            type
    #define CACHE_DECLARE_NONSTD(type)     type
    #define CACHE_DECLARE_DATA
    #elif defined(CACHE_DECLARE_STATIC)
    
    ...
    

    所有其他补丁似乎都已成功应用或被忽略。

    你知道为什么这个特殊的差别不起作用吗?

    编辑: 按照下面Adam的建议将补丁模糊因子降低到零后,补丁成功运行。

    多亏了亚当·古德,如果我能再给你一次投票,我会的!这是我的建议 relevant paragraph for fuzz 如果您感兴趣,请参阅GNU diffutils手册。

    编辑2: 顺便说一句,在那一段的底部有一个高度相关的警告:

    补丁通常会产生正确的结果,即使它必须进行许多猜测。但是,只有将修补程序应用于生成修补程序的文件的精确副本时,才能保证结果。

    1 回复  |  直到 15 年前
        1
  •  6
  •   Adam Goode    15 年前

    当你使用 --ignore-whitespace 不要使用 --fuzz=0 --fuzz=0

    如果要将文件保留为上游tarball+修补程序,则应重做修补程序,并确保它可以应用于 --fuzz=0 .