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

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

  •  5
  • Rob Wells  · 技术社区  · 17 年前

    你好,

    /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的建议,将补丁模糊因子降至零后,补丁已成功运行。

    感谢Adam Goode,如果我能再给你一次投票,我会的!这是 relevant paragraph for fuzz 如果您感兴趣,请参阅GNU diffutils手册。

    编辑2: 顺便说一句,在那个模糊段落的底部有一个非常相关的警告:

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

    当你使用 --ignore-whitespace --fuzz=0 --模糊=0 默认情况下,这些类型的问题在补丁时(而不是编译或运行时)失败。

    如果你想将文件保留为上游tarball+补丁,你应该重做补丁,并确保它可以应用于 --模糊=0 .

    推荐文章