tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Introducing the patchadd binary patch toolchain



On Tue, 28 Apr 2009 17:22:02 +0300
Elad Efrat <elad%NetBSD.org@localhost> wrote:

> Hi,
> 
> Tonnerre Lombard wrote:
> > Salut,
> > 
> > Since we're currently releasing NetBSD 5.0, I would like to give a
> > short introduction to the patchadd binary patch toolchain I am
> > currently developing. It is far from finished, but I have a working
> > prototype which can be deployed for the upcoming release already.
> 
> Did you even take a look at haze before you started working on it? when
> you contacted me about your binary patching idea about a year ago I
> pointed you to it. It has most of the code in place you need to add
> binary patch support:
> 
>       http://mail-index.netbsd.org/tech-userlevel/2007/11/06/0001.html
> 
> I also disagree with agc@ about patchadd being the tool that's furthest
> along -- but perhaps he was referring to patching specifically.
> 
> > The tools
> > =========
> > 
> > The tools, which have been added to pkgsrc/sysutils/patchadd recently,
> 
> So you've added an incomplete tool to update the system into mainline
> pkgsrc? out of pure curiosity (and since this is a tool to update
> NetBSD, supposedly), did you discuss it in a public forum as you do
> now?
> 
> > consist of the following tools:
> > 
> >  - patch_add, a tool to apply binary patches,
> >  - patch_delete, a tool to back out a patch added without -r, and
> >  - patch_info, a tool to display the list of installed patches.
> 
> Why are they all separate tools and not a single one?
> 
> > Still missing are the tools:
> > 
> >  - patch_tool, a tool to figure out which patches still need to be
> >    applied, and optionally install them, and
> >  - mkpatchdir, a tool to generate a directory index in a directory full
> >    of patches.
> >  - Potentially even a tool to generate patch sets from two directories
> >    or such.
> > 
> > I'm working on them and I'm consequently going to rewrite the other
> > tools. Until then, use the existing tools. The future tools will be
> > compatible with the current file format. (And syntax.)
> > 
> > The patch format
> > ================
> > 
> > The second important part about patchadd is how to create a binary
> > patch set to be applied. The format basically follows the instructions
> > laid down in http://github.com/tonnerre/patchadd-tests/
> > 
> > The patch file itself is basically a tar file. The file contains:
> > 
> >  - Arbitrarily named bsdiff(1) patches lifting the file from old to new.
> >  - A file called +INFO, containing pure metadata about the patch one
> >    information per line, such as:
> >    * ABI: the OS ABI (e.g. ABI=NetBSD)
> >    * OS_VERSION: the OS version (e.g. OS_VERSION=5.0)
> >    * MACHINE_ARCH: the machine architecture (e.g. MACHINE_ARCH=vax)
> >    * PATCHTOOLS: the file format version (e.g. PATCHTOOLS=0.1)
> >    * NAME: The name of the patch, frequently the file name. A form for
> >      this would have to be agreed on; I would suggest the pullup
> >      request ID (e.g. NAME=4123). Can be free form though, and does not
> >      have to be the same as the file name.
> >    * VERSION: The version of the patch. A patch can be re-released in a
> >      new version if appropriate, and would be suggested as an upgrade
> >      by patch_tool.
> >    * COMMENT: A punchline describing the text. This should be a short
> >      description which is shown in patch_infos overview output.
> >    * DEPENDS: The name of a different patch file to depend on. This
> >      line may appear as many times as required, but please only add one
> >      dependent patch per line.
> >    * CONFLICTS: The name of a different patch which cannot coexist with
> >      this patch. The same rules as for DEPENDS apply.
> >  - A file called +COMMENT containing a longer description (optional).
> >  - A file called +CONTENTS, containing information about each contained
> >    binary diff (one line per file, tab separated):
> >    * The name of the file in the system to be patched, e.g. /bin/ksh
> >    * The name of the patch file in the diff, free form file name
> >    * The SHA-1 sum the file is expected to be in before patching, and
> >    * the SHA-1 sum the file is supposed to have after patching.
> 
> I don't understand why invent yet another file format and syntax. I also
> highly recommend you think about common uses for updating tools (because
> hopefully that's what we want - a *single* tool to be used to update the
> system, and not a confusing collection) -- therefore, you should think
> on how you can make life easier for people who release patches, write
> security advisories/notes based on the patches, and so on.
> 
> Needless to say, haze did all that almost two years ago.
> 
> > The patch index
> > ===============
> > 
> > The patches shall be kept in a directory called
> > ftp://ftp.netbsd.org/${path}/${arch}/${vers}/, e.g. 
> > ftp://ftp.netbsd.org/pub/NetBSD/misc/tonnerre/binpatches/amd64/5.0/
> > 
> > The directory shall contain a file named patchindex. This file starts
> > with a version statement:
> > 
> > Version 0.1
> > 
> > to indicate that the patch file format version 0.1 is used. This
> > statement is followed by a list of all patch metadata for each patch,
> > starting with the Patch keyword and ending with the EndPatch keyword.
> > Multiple consecutive words in a value have to be quoted. For example:
> > 
> > Patch 4123
> > ABI=NetBSD
> > OS_VERSION=4.0
> > [...]
> > COMMENT="A patch to add a funny hat to stargazer"
> > EndPatch
> > 
> > The patch index is then amended with an OpenSSL s/mime inline text
> > signature executed with the patch signing key.
> > 
> > This index file is used solely for the patch_tool utility. Even without
> > this patch index, people can still safely run patch_add 4123 to add the
> > patch.
> 
> Is that another format and syntax?
> 
> > I think this might be a good point to start from.
> 
> Out of personal interest, can you elaborate on why you chose to write a
> tool from scratch, given nbupdate (agc@) and haze (mine) freely
> available? also, can you elaborate on why you prefer binary patching to
> simply distributing replacement files?

Replacement files are much easier to handle IMHO, and they also dont need to 
depend on teach other when you patch the same file several times.

I dont really understand why would we need another patch tool when we have 
Elad's works already in a working state (And by the way, I think it provides 
better functionality than Tonnere's, at least its more innovative).

Also, Elad, its been a long time a had a look at haze, but how do you handle
larger patch bundles?

-- 
Adam Hoka <adam.hoka%gmail.com@localhost>


Home | Main Index | Thread Index | Old Index