<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Doing application updates via version-control</title>
	<atom:link href="http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/feed/" rel="self" type="application/rss+xml" />
	<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/</link>
	<description>Little boxes made of words, by Jens Alfke</description>
	<lastBuildDate>Sun, 14 Mar 2010 11:32:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: donutello</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2701</link>
		<dc:creator>donutello</dc:creator>
		<pubDate>Thu, 25 Sep 2008 03:06:10 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2701</guid>
		<description>Jens, thank you very much for your response. I ended up abandoning using a tree diff solution and instead will be using bsdiff/bspatch for just the executable binaries and shipping all the files for everything else. bsdiff/bspatch are awesome for diffing of executable binaries. The diffs generated are tiny and bspatch comes with all Macs.</description>
		<content:encoded><![CDATA[<p>Jens, thank you very much for your response. I ended up abandoning using a tree diff solution and instead will be using bsdiff/bspatch for just the executable binaries and shipping all the files for everything else. bsdiff/bspatch are awesome for diffing of executable binaries. The diffs generated are tiny and bspatch comes with all Macs.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jens Alfke</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2700</link>
		<dc:creator>Jens Alfke</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:18:24 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2700</guid>
		<description>dunutello — Hm, I don&#039;t know of a tool that&#039;ll do exactly that. For generating and applying deltas, xdelta (http://xdelta.org) is I think the best that&#039;s out there. I believe the tool can generate and apply diffs to an entire directory tree. If it tries to patch a file that&#039;s been deleted by the user, the patch obviously can&#039;t succeed, but I don&#039;t know whether the tool treats this as a fatal error or not. (In any case it&#039;s open source so you could modify it to ignore missing files.)

There are a couple of &quot;update maker&quot; apps for Windows that do exactly what you want … they&#039;re often used by PC game vendors distributing updates. I haven&#039;t heard of a Mac version of any of them.</description>
		<content:encoded><![CDATA[<p>dunutello — Hm, I don&#8217;t know of a tool that&#8217;ll do exactly that. For generating and applying deltas, xdelta (<a href="http://xdelta.org" rel="nofollow">http://xdelta.org</a>) is I think the best that&#8217;s out there. I believe the tool can generate and apply diffs to an entire directory tree. If it tries to patch a file that&#8217;s been deleted by the user, the patch obviously can&#8217;t succeed, but I don&#8217;t know whether the tool treats this as a fatal error or not. (In any case it&#8217;s open source so you could modify it to ignore missing files.)</p>
<p>There are a couple of &#8220;update maker&#8221; apps for Windows that do exactly what you want … they&#8217;re often used by PC game vendors distributing updates. I haven&#8217;t heard of a Mac version of any of them.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: donutello</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2699</link>
		<dc:creator>donutello</dc:creator>
		<pubDate>Fri, 05 Sep 2008 15:04:53 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2699</guid>
		<description>This is very close to a problem that I&#039;m trying to solve right now. I&#039;m trying to limit the size of my patch downloads but I need to do it with a static installer because of IT requirements. I have already released several versions of the product:

0.0 --&gt; 0.1 --&gt; 1.0 --&gt; 1.1 --&gt; 2.0

The arrows denote the patches I&#039;ve already released, which are built using Package Maker and essentially include an entire copy of the files that have changed. These are huge. I&#039;d like to release a single update to update everything up to the latest respective version. One thing I&#039;ve considered is to create several diffs:
diff0.0-0.1, diff0.1-1.0, diff1.0-1.1, diff1.1-2.0

Then my update will consist of applying these diffs in succession. The diff technology needs to be able to update an entire tree and needs to succeed even for a partial tree. What that means is that if someone removed a file foo.txt from their install, what they should end up with is version 2.0 without the file foo.txt. Also, this should work regardless of what version you have right now so applying diff0.0-0.1 to someone who has 0.1 or 1.0 should do nothing.

I started looking at rsync yesterday and it appears to do exactly what I want. I have run into several bugs in the version of rsync that&#039;s shipped with Leopard but I suppose I could always ship a newer version of rsync with my updater. I&#039;m going to continue investigating rsync.

My question is: Are there any other binary diff technologies that I should consider? Using rsync seems a little like using a battle tank to flatten a house - it will do the job but is not exactly what it was designed to do.</description>
		<content:encoded><![CDATA[<p>This is very close to a problem that I&#8217;m trying to solve right now. I&#8217;m trying to limit the size of my patch downloads but I need to do it with a static installer because of IT requirements. I have already released several versions of the product:</p>
<p>0.0 &#8212;&#38;gt; 0.1 &#8212;&#38;gt; 1.0 &#8212;&#38;gt; 1.1 &#8212;&#38;gt; 2.0</p>
<p>The arrows denote the patches I&#8217;ve already released, which are built using Package Maker and essentially include an entire copy of the files that have changed. These are huge. I&#8217;d like to release a single update to update everything up to the latest respective version. One thing I&#8217;ve considered is to create several diffs:<br />
diff0.0-0.1, diff0.1-1.0, diff1.0-1.1, diff1.1-2.0</p>
<p>Then my update will consist of applying these diffs in succession. The diff technology needs to be able to update an entire tree and needs to succeed even for a partial tree. What that means is that if someone removed a file foo.txt from their install, what they should end up with is version 2.0 without the file foo.txt. Also, this should work regardless of what version you have right now so applying diff0.0-0.1 to someone who has 0.1 or 1.0 should do nothing.</p>
<p>I started looking at rsync yesterday and it appears to do exactly what I want. I have run into several bugs in the version of rsync that&#8217;s shipped with Leopard but I suppose I could always ship a newer version of rsync with my updater. I&#8217;m going to continue investigating rsync.</p>
<p>My question is: Are there any other binary diff technologies that I should consider? Using rsync seems a little like using a battle tank to flatten a house - it will do the job but is not exactly what it was designed to do.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jens Alfke</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2698</link>
		<dc:creator>Jens Alfke</dc:creator>
		<pubDate>Sun, 03 Aug 2008 18:14:34 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2698</guid>
		<description>@John — What Clark said. Breaking into pieces only makes the total download [slightly] larger. Version control is extremely reliable; zillions of developers rely on it every day, and modern systems use digests to verify the integrity of updates.</description>
		<content:encoded><![CDATA[<p>@John — What Clark said. Breaking into pieces only makes the total download [slightly] larger. Version control is extremely reliable; zillions of developers rely on it every day, and modern systems use digests to verify the integrity of updates.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Clark Cox</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2697</link>
		<dc:creator>Clark Cox</dc:creator>
		<pubDate>Sun, 03 Aug 2008 17:57:36 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2697</guid>
		<description>John,

how is version control unreliable? Things like this are well within the primary use of version control (i.e. distributing only the small deltas when something changes so as to not have to upload/download the entire blob of data).

Breaking the file into parts does nothing to solve the problem, unless the parts are small enough, or the changes localized enough that most of the parts do not have to be redownloaded. After implementing the code to decide which parts to download, and which parts to not dlownload, you&#039;ve basically reinvented the wheel.</description>
		<content:encoded><![CDATA[<p>John,</p>
<p>how is version control unreliable? Things like this are well within the primary use of version control (i.e. distributing only the small deltas when something changes so as to not have to upload/download the entire blob of data).</p>
<p>Breaking the file into parts does nothing to solve the problem, unless the parts are small enough, or the changes localized enough that most of the parts do not have to be redownloaded. After implementing the code to decide which parts to download, and which parts to not dlownload, you&#8217;ve basically reinvented the wheel.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John Joyce</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2696</link>
		<dc:creator>John Joyce</dc:creator>
		<pubDate>Sun, 03 Aug 2008 17:29:41 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2696</guid>
		<description>How about something more practical?
Just improve Sparkle.
If your update is so large and it is a concern, (Apple&#039;s own range from 5mb - 1 or 2 gb!)
Simply break the file into parts to download (like RAR does) then download, reassemble, confirm success, install.
Version control is too unreliable.</description>
		<content:encoded><![CDATA[<p>How about something more practical?<br />
Just improve Sparkle.<br />
If your update is so large and it is a concern, (Apple&#8217;s own range from 5mb - 1 or 2 gb!)<br />
Simply break the file into parts to download (like RAR does) then download, reassemble, confirm success, install.<br />
Version control is too unreliable.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: n[ate]vw</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2695</link>
		<dc:creator>n[ate]vw</dc:creator>
		<pubDate>Tue, 08 Jul 2008 17:43:57 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2695</guid>
		<description>Daniel mentioned code signing in the very second comment, and from what I can tell it won&#039;t be an issue. I was worried that the presence of the repository metadata (which could vary based on local configuration) would mess up the signing, but you can omit parts of your bundle from being verified.

Apple themselves point out you can patch the signature file itself (http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/chapter_3_section_5.html). So code signing should, as Daniel said, not be a problem.

That said, bending a version control system to update an app doesn&#039;t seem like a great win for me. You don&#039;t need merge tracking, shelving, cloning, pushing and could even go without history. All most apps need is a simple stack of binary diffs, treated like an Undo/Redo queue or even just a Redo queue. Seems like, compared to getting a SCM system updating seamlessly and efficiently, that&#039;s not such a big deal.</description>
		<content:encoded><![CDATA[<p>Daniel mentioned code signing in the very second comment, and from what I can tell it won&#8217;t be an issue. I was worried that the presence of the repository metadata (which could vary based on local configuration) would mess up the signing, but you can omit parts of your bundle from being verified.</p>
<p>Apple themselves point out you can patch the signature file itself (<a href="http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/chapter_3_section_5.html" rel="nofollow">http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/chapter_3_section_5.html</a>). So code signing should, as Daniel said, not be a problem.</p>
<p>That said, bending a version control system to update an app doesn&#8217;t seem like a great win for me. You don&#8217;t need merge tracking, shelving, cloning, pushing and could even go without history. All most apps need is a simple stack of binary diffs, treated like an Undo/Redo queue or even just a Redo queue. Seems like, compared to getting a SCM system updating seamlessly and efficiently, that&#8217;s not such a big deal.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Pedro Melo</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2693</link>
		<dc:creator>Pedro Melo</dc:creator>
		<pubDate>Mon, 07 Jul 2008 10:11:18 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2693</guid>
		<description>@Aaron, didn&#039;t knew about binary delta in svn 1.4, I stand corrected.

Thanks,</description>
		<content:encoded><![CDATA[<p>@Aaron, didn&#8217;t knew about binary delta in svn 1.4, I stand corrected.</p>
<p>Thanks,</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Pedro Melo</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2694</link>
		<dc:creator>Pedro Melo</dc:creator>
		<pubDate>Mon, 07 Jul 2008 10:11:18 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2694</guid>
		<description>@Aaron, didn&#039;t knew about binary delta in svn 1.4, I stand corrected.

Thanks,</description>
		<content:encoded><![CDATA[<p>@Aaron, didn&#8217;t knew about binary delta in svn 1.4, I stand corrected.</p>
<p>Thanks,</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jakub</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/comment-page-2/#comment-2692</link>
		<dc:creator>jakub</dc:creator>
		<pubDate>Mon, 07 Jul 2008 10:04:09 +0000</pubDate>
		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/#comment-2692</guid>
		<description>Hi,
     I was originally posting the question at apple developers.

I think the idea is nice, but I would rather prefer a straightforward system of doing things:

1. In configuration give the app a server and name of RSS file describing new versions.
2. the app automatically check and download needed update files.
3. automatically unpack the download
4. automatically run a script altering the app tree if needed and applying binary or any other diffs in any format you want (e.g. bsdiff - a great tool for small binary diffs)

Updating from v1.0 to 1.5 will go something like download update to 1.1, 1.2, 1.3, 1.4, 1.5 and run all the scripts in that order. I know it doesn&#039;t support downgrades, but e.g. with antivirus software, downgrade is a thing you really don&#039;t want to let your customers do.

I think using svn, rsync or whatever can be difficult for the software providers. Suppose you have a product used by millions of users that need update every day (e.g. antivirus again). Running own reliable rsync server is really a complicated task.

On the other hand, there are some providers (e.g. akamai), who are specialized for this and can make your updates available to the world reliably. But these companies are billing you for a megabytes of data downloaded from their servers. So you just want to post there update files as small as possible and not to deploy a whole rsync server.</description>
		<content:encoded><![CDATA[<p>Hi,<br />
     I was originally posting the question at apple developers.</p>
<p>I think the idea is nice, but I would rather prefer a straightforward system of doing things:</p>
<p>1. In configuration give the app a server and name of RSS file describing new versions.<br />
2. the app automatically check and download needed update files.<br />
3. automatically unpack the download<br />
4. automatically run a script altering the app tree if needed and applying binary or any other diffs in any format you want (e.g. bsdiff - a great tool for small binary diffs)</p>
<p>Updating from v1.0 to 1.5 will go something like download update to 1.1, 1.2, 1.3, 1.4, 1.5 and run all the scripts in that order. I know it doesn&#8217;t support downgrades, but e.g. with antivirus software, downgrade is a thing you really don&#8217;t want to let your customers do.</p>
<p>I think using svn, rsync or whatever can be difficult for the software providers. Suppose you have a product used by millions of users that need update every day (e.g. antivirus again). Running own reliable rsync server is really a complicated task.</p>
<p>On the other hand, there are some providers (e.g. akamai), who are specialized for this and can make your updates available to the world reliably. But these companies are billing you for a megabytes of data downloaded from their servers. So you just want to post there update files as small as possible and not to deploy a whole rsync server.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->