比较不同版本的相同Debian软件包

有没有办法获取本地安装的软件包与更新后的软件包之间的源代码差异? 这将有助于准确检查哪些部分已经修复、更改或添加。
例如,假设您的系统上安装了linux-libc-dev软件包,
sudo apt-get update && sudo apt-get upgrade

显示
The following packages will be upgraded:
  linux-libc-dev 

但是在升级之前,你想要检查一下与你本地版本的同一个软件包相比,到底有哪些具体的变化。
我们该如何做呢?
5个回答

据我所知,唯一的方法是获取源代码并自己制作差异。您可以使用apt-get获取用于编译软件包的实际源代码。例如:
apt-get source gwibber=2.30.2-0ubuntu3 gwibber=2.30.0.1-0ubuntu1
diff -rupN gwibber-2.30.0.1/ gwibber-2.30.2/

这将以标准补丁格式打印出所有文件之间的所有差异。

1这个还不错。在这个例子中,唯一要改变的是使用“debdiff gwibber_2.30.0.1-0ubuntu1.dsc gwibber_2.30.2-0ubuntu3.dsc”而不是原始diff。 - RAOF
1嗯,它基本上做的是同样的事情,但你可以在任何软件包/ tarball 上使用 diff 命令。也许有人想看看 svn-trunk 和当前 pkg 之间的差异。 - LassePoulsen
我的第二个答案(whatchanged)本质上是自动化的。 - mgunes

这是我组合在一起的另一个解决方案:whatchanged
它将你感兴趣的二进制软件包的名称作为唯一参数。以最近的SRU为例,使用如下:
./whatchanged python_papyon

这是它的功能:
  1. 检查是否有更新候选项;如果没有,则退出
  2. 如果存在候选项,则创建临时目录,并将已安装版本和候选项的源码软件包下载到临时目录中
  3. 使用debdiff比较两个软件包,并将结果输出到标准输出(你可能需要重定向以便更容易阅读)
  4. 清理临时目录。
它可能需要更好地处理在源码获取过程中可能出现的问题,流程控制可能有些问题,并且在版本检查方面可能有更优雅的方式,但在我的有限测试中它运行良好。暂时来说,可以将其视为一个可用的快速解决方案,对改进意见我非常欢迎。如果对一些人有用,我将把它推送到bzr存储库和/或创建一个Launchpad项目。 编辑:与其让它在pastebin上腐烂,我已经为它启动了一个Launchpad项目;你可以使用bzr branch lp:whatchanged获取最新的主干版本。请随意报告错误、分支、用Perl重写等。

太好了!开发工具就是答案 😉 喜欢你的编码风格,不过我可能会选择用 Perl 来编写它。 - LassePoulsen
谢谢,希望对你有用。包装和发布技术细节有时会让开源代码看起来晦涩难懂,这一点一直在我心里,但我还没有找到任何简单的工具来解决这个问题。所以当有人表达了对同样需求的需要时,这给了我动力去自己制作一个简单的原始工具。 - mgunes

这是一种(可能不是最佳的)UDD方法:
拉取您发布的 -updates 分支(假设是 Lucid),该分支(假设如下)应该包含最新的 SRU。
bzr branch lp:ubuntu/lucid-updates/package_name

获取最新版本引入的更改,这些更改(假设如下)应该对应于最新的SRU:
bzr diff -c`bzr revno`

2嗯,这是一个有趣的观点,尽管从某种意义上来说,它可能没有Source Lab那么全面,因为软件包的名称可能不匹配,或者在bzr源代码树中不存在。 - Gödel
只要你知道源包的名称,就可以匹配。你可以使用apt-cache show package_name | grep Source:来查找二进制包是由哪个源包生成的。 - mgunes
@Murat 嗯,<package_name> 这样获取的包在某些软件包上无法工作:bzr branch lp:ubuntu/lucid-updates/$(apt-cache show linux-libc-dev | grep -m 1 Source: | awk "{print \$2}") => bzr: 错误:传输中提供了无效的 URL:"bzr+ssh://bazaar.launchpad.net/+branch/ubuntu/lucid-updates/linux":不支持的协议。 - Gödel
这是因为实际上没有针对内核的Ubuntu分支,恐怕如此。可能是由于内核在git(kernel.ubuntu.com)中维护,所以这可能是一个特殊情况,但我不确定bzr软件包分支的确切范围。您可以在#ubuntu-devel频道上提问。 - mgunes
@Mural 我知道。这就是为什么这种方法比Source Lab的方法不够全面。但是再说一遍,这是一个有趣的观点。 - Gödel
至少解释一下最终会怎样,给你一个赞。 :) - Jorge Castro
http://package-import.ubuntu.com/status显示总共只有1305个软件包导入失败。在超过30000个的情况下,这已经是一个相当不错的成绩了。 - mgunes

如果你想查看软件包存档中的文件差异,可以提取它们的md5sums文件,对其进行排序和比较,然后你就可以大大缩小要比较的实际文件列表。

可能不是“完全”相同的更改,但是apt-listchanges列出了自安装版本以来所做更改的更改日志条目。
它的工作原理是在您完成下载新软件包之后,但在安装开始之前,添加一个步骤,显示即将升级的每个软件包的更改日志条目。然后,您可以选择继续或取消。您可以使用以下命令进行安装。
sudo apt-get install apt-listchanges

然后进行设置
sudo dpkg-reconfigure apt-listchanges

再次强调,问题并不是关于显示ChangeLog的更改。 - Gödel
哎呀,我错过了你说的“源代码差异”的第一行。 - Ken Simon