Eike and I were recently looking at how we could most easily update
an unzipped package download for Mars.1 to include the latest
milestone build of Oomph. The experience reminded me of Mickael
Istria's thread from December 3rd titled:
A "releases/latest" URL in the IDE to ease upgrades?
In our case, we first tried adding
http://download.eclipse.org/oomph/updates/milestone/latest to the
Available Software Sites and then doing Help -> Check for
Updates. Apparently there were none, though obviously we do have
updates at our site. We asked ourselves, what's going on with
that?
If you look at Help -> Installation Details, you'll notice that
for a downloaded package there is a single root feature. Only if
you select that root feature is the Update... button enabled. I.e.,
you can only update root installable units, and there is only one
(until you actually install more things using Help -> Install New
Software...). Of course just hitting the Update... button doesn't do
an update either in this scenario. So to update, you must use Help
-> Install New Software... so that it becomes a root unit.
As such, it strikes me that even if we had a new "moving target" URL
from which the user can update, or even if projects contributed
additional URLs for their project updates, the normal p2 update
mechanism will only update if there is actually an update (different
version) for the root installable unit(s). I assume of course that
a new release would always a new version for each of the root units.
In contrast, if you invoke Help -> Perform Setup Tasks... for an
unzipped package, Oomph creates a p2 task for the root installable
units known for the current profile, along with all the enabled
available software site repositories in the preferences, and
performs a p2 update based on that. This actually does an update in
this scenario. Why?
The subtle difference is that Oomph models its p2 task to be based
on requirements whereas p2's normal update mechanism only supports
installable units in its profile change request. To work around
this limitation, Oomph creates a fake artificial root unit (it's a
different synthetic version each time you perform). This artificial
root captures all the requirements of the p2 task; the p2 task we
synthesize currently allows only micro version increments. As a
result of this approach, Perform Setup Tasks... resolves the
requirements of the entire graph from scratch, and therefore finds
updates wherever they might occur in the graph (and are permitted by
the range requirements of the graph). Plain old p2 seems to just
notice that the root unit being requested is the same as the one
already installed, and decides there's nothing that needs to be
done.
I also wanted to point out a subtlety of using the installer to
create installations. The unrestricted set of choices for the
product version includes choices such as "Latest (Neon)", "Latest
Releases (Mars)", "Neon", and "Mars". The subtle difference is that
the two "Latest * (*)" are moving targets. I.e., when Neon
releases, it will become the "Latest Release (...)", and Oomph will
update the installation to that release as soon as it become
available. Similarly, once the Eclipse "O*" version first becomes
available as a repository, "Latest (...)" will become that version
and Oomph will update the installation to the latest bleeding edge.
I mention all this is to point out that there are mechanisms in
place for better updates. Firstly for better support to update an
installation simply by making more update sites known, and secondly
better support for letting the user choose if they want their IDE
stay current with the latest release, as releases become available,
or prefer to remain on their chosen release until they decide they
really want to move to a new one.
Another problem with automatic updates to new releases is the
minimum Java requirements. Someone running Mars with Java 1.7 will
find that the IDE won't launch when updated to to Neon unless they
have 1.8 installed as the default. To make that problem even worse,
Java 1.7 cannot unpack200 *.pack.gz artifacts packed with Java 1.8's
pack200. P2's reaction to that is to assume the download is
corrupt, and to download it again (most likely from the same
mirror); it does that 200 times before giving up and trying a
different artifact form. It eventually does succeed, but it takes a
very very long time.
|