Comments follow...<br><br><div class="gmail_quote">On Mon, Jul 14, 2008 at 4:09 PM, C. Scott Ananian &lt;<a href="mailto:cscott@laptop.org">cscott@laptop.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="Ih2E3d">On Mon, Jul 14, 2008 at 3:22 PM, Eben Eliason &lt;<a href="mailto:eben.eliason@gmail.com">eben.eliason@gmail.com</a>&gt; wrote:<br>
&gt; They don&#39;t get it? Or they don&#39;t get how a single integer is supposed to be<br>
&gt; sufficient, and therefor use their own methods? &nbsp;Do you have examples of<br>
&gt; specific &quot;random and bogus&quot; strings we can look at to see what&#39;s been tried?<br>
<br>
</div>On an XO:<br>
$ python2.5<br>
&gt;&gt;&gt; act_page = &#39;<a href="http://wiki.laptop.org/go/Activities" target="_blank">http://wiki.laptop.org/go/Activities</a>&#39;<br>
&gt;&gt;&gt; import urlparse, re, urllib<br>
&gt;&gt;&gt; import bitfrost.update.actutils as actutils<br>
&gt;&gt;&gt; urls = [urlparse.urljoin(act_page, url) for url in re.findall(r&#39;href=&quot;([^&quot;]*)&quot;&#39;, urllib.urlopen(act_page).read()) if url.endswith(&#39;.xo&#39;)]<br>
&gt;&gt;&gt; for u in urls:<br>
... &nbsp; try:<br>
... &nbsp; &nbsp; cp = actutils.activity_info_from_url(u)<br>
... &nbsp; except:<br>
... &nbsp; &nbsp; print &quot;BAD <a href="http://activity.info" target="_blank">activity.info</a>&quot;, u<br>
... &nbsp; &nbsp; continue<br>
... &nbsp; if not cp.has_option(&#39;Activity&#39;,&#39;activity_version&#39;):<br>
... &nbsp; &nbsp; print &quot;MISSING VERSION&quot;, u<br>
... &nbsp; &nbsp; continue<br>
... &nbsp; try:<br>
... &nbsp; &nbsp; pass<br>
... &nbsp; except: pass<br>
... &nbsp; v = cp.get(&#39;Activity&#39;,&#39;activity_version&#39;)<br>
... &nbsp; try:<br>
... &nbsp; &nbsp; assert not v.startswith(&#39;0&#39;)<br>
... &nbsp; &nbsp; assert not &#39;.&#39; in v<br>
... &nbsp; &nbsp; v = int(v)<br>
... &nbsp; except:<br>
... &nbsp; &nbsp; print &quot;BAD VERSION&quot;, u, v<br>
...<br>
MISSING VERSION <a href="http://wiki.laptop.org/images/1/1d/ViewSlides-3.xo" target="_blank">http://wiki.laptop.org/images/1/1d/ViewSlides-3.xo</a><br>
BAD <a href="http://activity.info" target="_blank">activity.info</a> <a href="http://wiki.laptop.org/images/7/7e/Gmail-2.xo" target="_blank">http://wiki.laptop.org/images/7/7e/Gmail-2.xo</a><br>
BAD <a href="http://activity.info" target="_blank">activity.info</a> <a href="http://opteron.9grid.us/olpc/inferno-012808.xo" target="_blank">http://opteron.9grid.us/olpc/inferno-012808.xo</a><br>
MISSING VERSION <a href="http://wiki.laptop.org/images/b/b2/ProducePuzzle.xo" target="_blank">http://wiki.laptop.org/images/b/b2/ProducePuzzle.xo</a><br>
BAD <a href="http://activity.info" target="_blank">activity.info</a> <a href="http://www.linuxuser.at/dl.php?i=ImageQuiz.xo" target="_blank">http://www.linuxuser.at/dl.php?i=ImageQuiz.xo</a><br>
<br>
This is under-reported, since many of the bad activities just set<br>
activity_version=1:<br>
<br>
&gt;&gt;&gt; def bad_ver(v):<br>
... &nbsp; try:<br>
... &nbsp; &nbsp; assert not v.startswith(&#39;0&#39;)<br>
... &nbsp; &nbsp; int(v)<br>
... &nbsp; &nbsp; return False # good<br>
... &nbsp; except:<br>
... &nbsp; &nbsp; return True<br>
...<br>
&gt;&gt;&gt; vers = [v for v in re.findall(r&#39;&lt;span class=&quot;olpc-activity-version&quot;&gt;([^&lt;]*)&lt;/span&gt;&#39;, urllib.urlopen(act_page).read()) if bad_ver(v)]<br>
&gt;&gt;&gt; vers<br>
[&#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;,<br>
&#39;1-beta&#39;, &#39;1.4&#39;, &#39;1.7&#39;, &#39;\xe2\x80\x93&#39;, &#39;0.29&#39;, &#39;3.3&#39;, &#39;\xe2\x80\x93&#39;,<br>
&#39;012808&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;0.4&#39;, &#39;&#39;, &#39;0.33 - beta 3&#39;,<br>
&#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;,<br>
&#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;,<br>
&#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;,<br>
&#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;\xe2\x80\x93&#39;, &#39;0.2&#39;,<br>
&#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;,<br>
&#39;080601&#39;, &#39;080601&#39;, &#39;080601&#39;, &#39;&#39;, &#39;\xe2\x80\x93&#39;, &#39;[beta-1]&#39;,<br>
&#39;\xe2\x80\x93&#39;, &#39;0.1&#39;, &#39;\xe2\x80\x93&#39;, &#39;0.1&#39;]<br>
<div class="Ih2E3d">&gt;&gt;&gt;<br>
<br>
&gt;&gt; &nbsp;b) There is an alternative mechanism already in place for handling<br>
&gt;&gt; dependencies on specific versions, documented in the [[Activity<br>
&gt;&gt; bundles]] entry for &#39;update_url&#39;. &nbsp;Basically, you can specify a<br>
&gt;&gt; different version number as appropriate based on the current OS build,<br>
&gt;&gt; release version, and release major version. &nbsp;So you can say, &quot;version<br>
&gt;&gt; 8 if you are using 8.1, or version 9 if you are using 8.2&quot;.<br>
&gt;<br>
&gt; How does this actually help the user, or the tech support team when someone<br>
&gt; wants to know &quot;what version of chat works with 9.1.0?&quot; &nbsp;Short of saying<br>
&gt; &quot;Well, the system will (should) know if it can support an activity, so<br>
&gt; download it and see...&quot; what do we have? &nbsp;We say &quot;Well, versions 36-38, and<br>
&gt; also 40, and also 42, work with 9.1, but not 39 and 41...those are bugfixes<br>
&gt; for 8.2&quot;. &nbsp;This seems silly to me. &nbsp;Just say versions 4.x and 5.x work with<br>
&gt; 8.2 and 6.x works with 9.1. &nbsp;This also makes displaying multiple versions<br>
&gt; (activity &quot;threads&quot;) possible in the OS. &nbsp;Otherwise how can we reasonable<br>
&gt; sort/group the activities in any way that makes sense?<br>
&gt; - Eben<br>
<br>
</div>Just say, &quot;does the activity updater show an update for your version<br>
of Chat? if so, install it, please.&quot;<br></blockquote><div><br></div><div>I&#39;m not sure this satisfies me. &nbsp;It might accurately handle the use case of updating when upgrading, assuming that activity developers are very careful to add extra info about compatibility into the .info file. &nbsp;It doesn&#39;t however, make it easy to decide what version of an activity to download if I&#39;ve never used it before, and I&#39;m not on the most recent release of Sugar. &nbsp;What if I still have 8.1 even though 8.2 is out, and I find a cool new science activity I want. &nbsp;What version to get? &nbsp;Well, maybe 23. &nbsp;Maybe 32. &nbsp;Maybe 24-31 are all incompatible because of a new API in 8.2, but how would I know? &nbsp;Is the best suggestion to download a really old version and then wait for it to inform me of an update?</div>
<div>&nbsp;<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
The alternative is not going to work, because the activity authors<br>
can&#39;t keep their bundle ids straight, much less collectively agree to<br>
use release-synchronized version numbers in a sane way. You are<br>
proposing a more complicated system, which just introduces more ways<br>
to go wrong w/o actually addressing any part of the real metadata<br>
problem.</blockquote><div><br></div><div>So make the requirements more strict. &nbsp;Don&#39;t run/install a bundle unless it adheres to the format. &nbsp;We should be doing that anyway. &nbsp;Develop can easily handle a major/minor revision checkbox to keep things in sync with little overhead for those that care and NO overhead for those that don&#39;t (let them ignore the possibility of minor releases; it won&#39;t break things). &nbsp;The major-version-number-only approach is a valid subset of a major-minor approach.</div>
<div><br></div><div>Moreover, I&#39;m not sure what&#39;s going on with many of these version numbers. &nbsp;Those of the form 080601 seem to be using dates. &nbsp;OK, that&#39;s wrong. &nbsp;I have no idea what the x90 type of versioning is about, but there are so many it seems there must be a single developer/group using that in a bunch of their own activities, which makes it an endemic and not an epidemic problem. &nbsp;The remainder of them seem to be well formed major.minor numbers (minus a few which append &quot;beta&quot; unnecessarily, since as Brian noted previously using 0 as the major version number can satisfy that).</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
As regard to sorting/grouping: we already discussed that at our last<br>
mini-conference: &nbsp;simple ordering by version number, with group breaks<br>
when signature changes. &nbsp;</blockquote><div><br></div><div>I agree with the signature approach. &nbsp;However, I don&#39;t really know what happens when I have 37, 38, and 39 where 39 is a &quot;bugfix&quot; release of 37, and 39 is a &quot;brand new version&quot;...I&#39;d prefer to see them ordered 37, 39, 38, to coincide with the &quot;level of newness&quot;. &nbsp;This is something we will lose completely without a minor release number. &nbsp;The logical assumption is that &quot;the bigger the number, the better/newer it is&quot;, which is blatantly false when point releases are intermixed with brand new versions with ever-increasing version numbers. &nbsp;I might decide I need to clear up space, and so delete versions 37 and 38, thinking I was keeping the latest and greatest version 39 and be quite disappointed.</div>
<div><br></div><div>- Eben</div></div>