如何创建一个没有源代码控制的独立补丁?

时间:2017-03-29 05:06:29

标签: diff solaris patch

我需要在Solaris上修补libidn2。 libidn2是从GNU的网站上用wget获取的。它不是Sun提供的,也不是源代码控制。

该库不使用glibc,并且它没有函数error (int status, int errnum, const char *format, ...)。我制作了原始源文件的副本,我有一个类似功能的差异:

solaris:libidn2-0.16$ diff -u src/idn2.c.bu src/idn2.c
--- src/idn2.c.bu       2017-03-29 00:20:08.621934160 -0400
+++ src/idn2.c  2017-03-29 01:25:12.488402745 -0400
@@ -31,7 +31,9 @@
 #include <unistr.h>

 /* Gnulib headers. */
+#ifndef __sun__
 #include "error.h"
+#endif
 #include "gettext.h"
 #define _(String) dgettext (PACKAGE, String)
 #include "progname.h"
@@ -48,6 +50,18 @@
      year.  */
   "Copyright %s %d Simon Josefsson.";

+#if defined(__sun__)
+static void
+error (int status, int errnum, const char *format, ...)
+{
+    va_list args;
+    va_start(args, format);
+    vfprintf(stderr, format, args);
+    va_end(args);
+    exit(status);
+}
+#endif
+
 static void
 usage (int status)
 {

我一直在阅读diff(1)patch(1)手册页,但我还没有完全了解需要做的事情。我不相信我已经找到了对任务的讨论(也许我没有看到树林中的森林)。

我的问题是,如何将其变成一个独立的补丁?也就是说,如何在重新下载并解压缩libidn2后将其转换成适用的东西?

2 个答案:

答案 0 :(得分:3)

这可能不是正确的答案,但引用不符合评论,我对patch的体验是diff 的输出是&#34;独立补丁&#34;。

您可以从扩展的libidn2源代码tarball的基本目录中运行patch --dry-run < your.diff.output,以便在使用patch应用diff输出时查看会发生什么

在我安装的Solaris 11副本中,patch似乎是GNU补丁,因为它具有--dry-run选项。 The Solaris 11.2 patch man page有这个用于创建补丁的摘录:

  

补丁发送者说明

     

如果你有,你应该记住几件事        将发送补丁。

     

系统地创建补丁。一个好的方法是命令diff -Naur old new,其中oldnew标识旧的        和新目录。旧名称和新名称不应包含任何斜杠。 diff命令的标题应该有        使用传统Unix在Universal Time中的日期和时间        格式,以便修补程序收件人可以使用-Z或--set-utc        选项。这是一个示例命令,使用Bourne shell syn-        税:

                LC_ALL=C TZ=UTC0 diff -Naur gcc-2.7 gcc-2.8
     

告诉收件人如何通过告诉他们来应用补丁        cd到哪个目录,以及要使用的补丁选项。        建议使用选项字符串-Np1。测试你的程序        通过伪装成收件人并将您的补丁应用于        原始文件的副本。

     

...

答案 1 :(得分:-2)

这听起来像XY problem。你的核心问题是“目前我正在为libidn2源应用一个补丁,我希望以后为将来的libidn2版本重做”,对吗? 这正是您想要使用源代码控制的原因!仅仅因为没有从源代码控制存储库中获取上游源,这并不意味着您不能自己加入:

$ mkdir libidn2-source; cd libidn2-source
$ git init
$ git checkout -b upstream
$ wget https://alpha.gnu.org/gnu/libidn/libidn2-0.16.tar.gz
$ tar zxvf libidn2-0.16.tar.gz && rm libidn2-0.16.tar.gz
$ git add .
$ git commit -m "Upstream libidn2-0.16.tar.gz"
$ git checkout -b downstream
$ cp /the/file/in/the/question/src/idn2.c src/idn2.c
$ git add src/idn2.c
$ git commit -m "Added sun specific error fallback function"

# In the future...
$ git checkout upstream
$ wget https://alpha.gnu.org/gnu/libidn/libidn2-latestgreatest.tar.gz
$ tar zxvf libidn2-latestgreatest.tar.gz && rm libidn2-latestgreatest.tar.gz
$ git add .
$ git commit -m "Upstream libidn2-latestgreatest.tar.gz"

# Now for the "apply after a fresh download and unpack of libidn2" part:
$ git rebase upstream downstream

请注意,此处没有任何跟踪和更新免费常备补丁文件。

源似乎在git repo中可用,因此您可能只是克隆它而不是下载和检入tar文件,但是rebase部分将完全相同。