<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>In general, it's better to load updates before saving your own version, or publishing something to the inbox.</div><div><br></div><div>But it is not a big problem if you don't. What happens when updating is that the package from the repository is merged into your system. That's a big advantage over changesets which would just overwrite your own changes.</div><div><br></div><div>So here is what happened:</div><div><br></div><div>You took&nbsp;System-bf.9, modified it, and saved as System-Richo.10, then as System-Richo.11, then as System-Richo.12.</div><div><br></div><div><div>I took&nbsp;System-bf.9, modified it, and saved as System-bf.10, then as System-bf.11, then as System-bf.12, then as&nbsp;System-bf.13.</div><div><br></div></div><div>Then you loaded updates, which merged my changes into your image. Your working copy now has two parents,&nbsp;System-Richo.12 and System-bf.13. That is perfectly fine. Next time you save the package it will be clean again.</div><div><br></div><div>Same if I merged your changes from inbox to my version and published to the main repository. There is not a linear history anymore, but that's what Monticello is about - it allows independent development, and merging later.</div><div><br><div><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: 'Lucida Grande'; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="font-family: Helvetica; "><span class="Apple-style-span" style="font-family: Helvetica; ">- Bert -</span></div><br class="Apple-interchange-newline"></span></div></div><div>Am 13.05.2010 um 12:28 schrieb Ricardo Moran:</div><blockquote type="cite">After uploading this, I clicked "update code from server" and now I have the System package marked dirty. It also has now two ancestors: System-Richo.12 and System-bf.13. If I check the history it is something like this:<div>

<br></div><div>&lt;working copy&gt;</div><div>System-Richo.12</div><div>System-bf.13</div><div>System-Richo.11</div><div>System-bf.12</div><div>System-Richo.10</div><div>System-bf.11</div><div>System-bf.9</div><div>System-bf.10</div>

<div>...</div><div><br></div><div>I think I messed up something, and I don't know how to fix it.</div><div><br></div><div>Richo<br><br><div class="gmail_quote">On Thu, May 13, 2010 at 4:10 PM,  <span dir="ltr">&lt;<a href="mailto:commits@source.squeak.org">commits@source.squeak.org</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">A new version of System was added to project Etoys Inbox:<br>
<a href="http://source.squeak.org/etoysinbox/System-Richo.12.mcz" target="_blank">http://source.squeak.org/etoysinbox/System-Richo.12.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: System-Richo.12<br>
Author: Richo<br>
Time: 13 May 2010, 4:10:15 pm<br>
UUID: 3188de42-860f-5949-9f9a-12f540c657b7<br>
Ancestors: System-Richo.11<br>
<br>
* Removed a lot of stuff used for Localization.<br>
* Modified TextDomainManager to use method properties to store the text domain of each method. This happens in a lazy way. It's also posible to preconfigure the method properties of all methods with translations but it takes forever and it ends up with a Space Low warning (see TextDomainManager class&gt;&gt;updateDomainOfAllMethodsWithTranslations)<br>


<br>
=============== Diff against System-Richo.11 ===============<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;allMethodsWithTranslations (in category 'accessing') -----<br>
+ allMethodsWithTranslations<br>
+ "Look for #translated calls"<br>
+ | methodsWithTranslations |<br>
+ methodsWithTranslations := TranslatedReceiverFinder new stringReceiversWithContext: #translated.<br>
+ methodsWithTranslations := methodsWithTranslations, (TranslatedReceiverFinder new<br>
+ stringReceiversWithContext: #translatedNoop).<br>
+<br>
+ methodsWithTranslations := methodsWithTranslations collect: [:each | each key compiledMethod].<br>
+<br>
+ "Look for Etoys tiles and vocabularies"<br>
+ methodsWithTranslations := methodsWithTranslations, (EToyVocabulary allPhrasesWithContextToTranslate collect: [:r |<br>
+ &nbsp; &nbsp; &nbsp; (MethodReference new setStandardClass: r second methodSymbol: r third) compiledMethod.<br>
+ ]).<br>
+<br>
+ ^methodsWithTranslations!<br>
<br>
Item was changed:<br>
 &nbsp;----- Method: TextDomainManager classSide&gt;&gt;domainForPackage: (in category 'accessing') -----<br>
 &nbsp;domainForPackage: aPackageInfo<br>
+ "Package names and text domains are synonyms now"<br>
+ &nbsp; &nbsp; &nbsp; ^aPackageInfo name!<br>
- &nbsp; &nbsp; &nbsp; ^self domainForPackageNamed: aPackageInfo name!<br>
<br>
Item was changed:<br>
 &nbsp;Object subclass: #TextDomainManager<br>
 &nbsp; &nbsp; &nbsp; &nbsp;instanceVariableNames: ''<br>
 &nbsp; &nbsp; &nbsp; &nbsp;classVariableNames: 'ClassCategories Classes DefaultDomain DomainInfos LoneClasses Packages'<br>
 &nbsp; &nbsp; &nbsp; &nbsp;poolDictionaries: ''<br>
 &nbsp; &nbsp; &nbsp; &nbsp;category: 'System-Localization'!<br>
+ TextDomainManager class<br>
+ &nbsp; &nbsp; &nbsp; instanceVariableNames: 'defaultDomain'!<br>
<br>
 &nbsp;!TextDomainManager commentStamp: 'tk 1/4/2008 16:08' prior: 0!<br>
 &nbsp;I manages mapping from class category to textdomain.<br>
<br>
 &nbsp;Class variables:<br>
 &nbsp; ClassCategories &nbsp; &nbsp; &nbsp;IdentityDictionary -- classCategory -&gt; domainName<br>
 &nbsp; Classes &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IdentityDictionary -- class name (a Symbol) -&gt; domainName &nbsp; (a cache only!!)<br>
 &nbsp; DefaultDomain &nbsp; &nbsp; &nbsp; &nbsp;String -- the default domain name<br>
 &nbsp; DomainInfos &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Dictionary -- domainName -&gt; a TextDomainInfo<br>
 &nbsp; LoneClasses &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IdentityDictionary -- class name (a Symbol) -&gt; domainName. &nbsp;For classes whose entire category are not all in the same domain (BookMorph and QuickGuideMorph)<br>
<br>
 &nbsp;TextDomainManager registerCategoryPrefix: 'DrGeoII' domain: 'DrGeoII'.<br>
 &nbsp;TextDomainManager unregisterDomain: 'DrGeoII'.<br>
<br>
 &nbsp;TextDomainManager registerClass: #QuickGuideMorph domain: 'quickguides'.<br>
 &nbsp;TextDomainManager registerClass: #QuickGuideHolderMorph &nbsp;domain: 'quickguides'.<br>
 &nbsp;!<br>
+ TextDomainManager class<br>
+ &nbsp; &nbsp; &nbsp; instanceVariableNames: 'defaultDomain'!<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;domainOfMethod: (in category 'accessing') -----<br>
+ domainOfMethod: aCompiledMethod<br>
+ &nbsp; &nbsp; &nbsp; ^ aCompiledMethod<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; propertyValueAt: self textDomainProperty<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifAbsent: [self updateDomainOfMethod: aCompiledMethod] !<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;clearAllDomains (in category 'private') -----<br>
+ clearAllDomains<br>
+ &nbsp; &nbsp; &nbsp; SystemNavigation default<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; allCompiledMethodDo: [:each | each<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; removeProperty: self textDomainProperty<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifAbsent: []] !<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;updateDomainOfAllMethodsWithTranslations (in category 'private') -----<br>
+ updateDomainOfAllMethodsWithTranslations<br>
+ self allMethodsWithTranslations do: [:each|<br>
+ &nbsp; &nbsp; &nbsp; self updateDomainOfMethod: each<br>
+ ]!<br>
<br>
Item was changed:<br>
 &nbsp;----- Method: TextDomainManager classSide&gt;&gt;initialize (in category 'class initialization') -----<br>
 &nbsp;initialize<br>
 &nbsp; &nbsp; &nbsp; &nbsp;" &nbsp; &nbsp; &nbsp; TextDomainManager initialize &nbsp; &nbsp;"<br>
+ &nbsp; &nbsp; &nbsp; self defaultDomain: 'Etoys'; clearAllDomains!<br>
-<br>
- &nbsp; &nbsp; &nbsp; ClassCategories _ IdentityDictionary new.<br>
- &nbsp; &nbsp; &nbsp; Classes _ IdentityDictionary new.<br>
- &nbsp; &nbsp; &nbsp; Packages := Dictionary new.<br>
- &nbsp; &nbsp; &nbsp; DomainInfos _ Dictionary new.<br>
- &nbsp; &nbsp; &nbsp; self defaultDomain: 'Etoys'.<br>
- &nbsp; &nbsp; &nbsp; "self registerClass: #QuickGuideMorph domain: 'quickguides'.<br>
- &nbsp; &nbsp; &nbsp; self registerClass: #QuickGuideHolderMorph &nbsp;domain: 'quickguides'."!<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;textDomainProperty (in category 'private') -----<br>
+ textDomainProperty<br>
+ ^#textDomain!<br>
<br>
Item was changed:<br>
 &nbsp;----- Method: TextDomainManager classSide&gt;&gt;defaultDomain (in category 'accessing') -----<br>
 &nbsp;defaultDomain<br>
+ "I'm not sure we still need a default domain, AFAIK the default domain will only be used when no domain is found. In that case, wouldn't it be better to just look for a translation in all domains?"<br>


+ &nbsp; &nbsp; &nbsp; ^defaultDomain!<br>
- &nbsp; &nbsp; &nbsp; ^DefaultDomain!<br>
<br>
Item was added:<br>
+ ----- Method: TextDomainManager classSide&gt;&gt;updateDomainOfMethod: (in category 'private') -----<br>
+ updateDomainOfMethod: aCompiledMethod<br>
+ &nbsp; &nbsp; &nbsp; "First it looks for the package of the method reference (using<br>
+ &nbsp; &nbsp; &nbsp; the PackageOrganizer: deadly slow). If the method doesn't<br>
+ &nbsp; &nbsp; &nbsp; belong to any package it uses the default domain. Finally it<br>
+ &nbsp; &nbsp; &nbsp; stores the text domain of the method using a method<br>
+ &nbsp; &nbsp; &nbsp; property, this way we gain performance the next time we<br>
+ &nbsp; &nbsp; &nbsp; translate the same method because we avoid the use of<br>
+ &nbsp; &nbsp; &nbsp; PackageOrganizer. Have I mentioned it is really slow? :)"<br>
+ &nbsp; &nbsp; &nbsp; | package |<br>
+ &nbsp; &nbsp; &nbsp; package := PackageOrganizer default<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; packageOfMethod: aCompiledMethod methodReference<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifNone: [].<br>
+ &nbsp; &nbsp; &nbsp; ^ aCompiledMethod<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; propertyValueAt: self textDomainProperty<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; put: (package isNil<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifTrue: [TextDomainManager defaultDomain]<br>
+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ifFalse: [package name])!<br>
<br>
Item was changed:<br>
 &nbsp;----- Method: TextDomainManager classSide&gt;&gt;allKnownDomains (in category 'accessing') -----<br>
 &nbsp;allKnownDomains<br>
+ "Every package has it's own text domain now so it's not necessary to keep a registry of all domains, we can simply return all the packages in the image.<br>
+ PROBLEM: If a package doesn't contain translations, it won't have a mo file but the GetTextTranslator will try to load it anyway. This happens when we switch languages. So far I tested it briefly and it seems to work..."<br>


+ ^PackageOrganizer default packageNames!<br>
- &nbsp; &nbsp; &nbsp; | domains |<br>
- &nbsp; &nbsp; &nbsp; domains _ Set new.<br>
- &nbsp; &nbsp; &nbsp; domains addAll: Packages values.<br>
- &nbsp; &nbsp; &nbsp; domains add: self defaultDomain.<br>
- &nbsp; &nbsp; &nbsp; ^domains<br>
- !<br>
<br>
Item was changed:<br>
 &nbsp;----- Method: TextDomainManager classSide&gt;&gt;defaultDomain: (in category 'accessing') -----<br>
 &nbsp;defaultDomain: aDomainName<br>
+ &nbsp; &nbsp; &nbsp; defaultDomain := aDomainName!<br>
- &nbsp; &nbsp; &nbsp; DefaultDomain _ aDomainName!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;unregisterDomain: (in category 'accessing') -----<br>
- unregisterDomain: domainName<br>
- &nbsp; &nbsp; &nbsp; DomainInfos removeKey: domainName.<br>
- &nbsp; &nbsp; &nbsp; self refresh.<br>
- &nbsp; &nbsp; &nbsp; NaturalLanguageTranslator domainUnregistered: domainName.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;categories (in category 'accessing') -----<br>
- categories<br>
- &nbsp; &nbsp; &nbsp; ^categories!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;matchedPackages (in category 'accessing') -----<br>
- matchedPackages<br>
- "Returns all the packages with this domain"<br>
- ^PackageInfo allPackages select: [:package | self includesPackage: package name]!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;registerPackage:domain: (in category 'accessing') -----<br>
- registerPackage: aPackageName domain: aDomainName<br>
- &nbsp; &nbsp; &nbsp; | domInfo |<br>
- &nbsp; &nbsp; &nbsp; domInfo _ self domainInfoFor: aDomainName.<br>
- &nbsp; &nbsp; &nbsp; domInfo packages add: aPackageName asSymbol.<br>
- &nbsp; &nbsp; &nbsp; "self refresh."<br>
- &nbsp; &nbsp; &nbsp; Packages at: aPackageName put: aDomainName<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;refresh (in category 'private') -----<br>
- refresh<br>
- &nbsp; &nbsp; &nbsp; Packages := Dictionary new.<br>
- &nbsp; &nbsp; &nbsp; DomainInfos keysAndValuesDo: [:domainName :domainInfo |<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; domainInfo matchedPackages do: [:package |<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Packages at: package name ifPresent: [:err| self error: 'Package ', (package name asString) , ' &nbsp;belongs to multiple domains'].<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Packages at: package name put: domainName.<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]<br>
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ]<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;domainInfoFor: (in category 'private') -----<br>
- domainInfoFor: domainName<br>
- &nbsp; &nbsp; &nbsp; ^DomainInfos at: domainName ifAbsentPut: [ self registerDomain: domainName]!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;domainInfos (in category 'private') -----<br>
- domainInfos<br>
- &nbsp; &nbsp; &nbsp; ^DomainInfos!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;domainForClass: (in category 'accessing') -----<br>
- domainForClass: aClass<br>
- &nbsp; &nbsp; &nbsp; ^Classes at: aClass theNonMetaClass name ifAbsent: [self defaultDomain]!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;packages (in category 'accessing') -----<br>
- packages<br>
- &nbsp; &nbsp; &nbsp; ^packages!<br>
<br>
Item was removed:<br>
- Object subclass: #TextDomainInfo<br>
- &nbsp; &nbsp; &nbsp; instanceVariableNames: 'categoryPrefixes categories packages'<br>
- &nbsp; &nbsp; &nbsp; classVariableNames: ''<br>
- &nbsp; &nbsp; &nbsp; poolDictionaries: ''<br>
- &nbsp; &nbsp; &nbsp; category: 'System-Localization'!<br>
-<br>
- !TextDomainInfo commentStamp: '&lt;historical&gt;' prior: 0!<br>
- I hold criteria for deciding wheter a systemCategory belongs to domain.<br>
- - categoryPrefixes is collection of prefix of class category.<br>
- - categories is for specifying fine grained criterion.<br>
- !<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;includesPackage: (in category 'accessing') -----<br>
- includesPackage: packageName<br>
- &nbsp; &nbsp; &nbsp; ^packages includes: packageName!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;initialize (in category 'initialize-release') -----<br>
- initialize<br>
- &nbsp; &nbsp; &nbsp; categoryPrefixes _ Set new.<br>
- &nbsp; &nbsp; &nbsp; categories _ IdentitySet new.<br>
- &nbsp; &nbsp; &nbsp; packages := Set new. !<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;registerDomain: (in category 'accessing') -----<br>
- registerDomain: domainName<br>
- &nbsp; &nbsp; &nbsp; | domInfo |<br>
- &nbsp; &nbsp; &nbsp; domInfo _ TextDomainInfo new.<br>
- &nbsp; &nbsp; &nbsp; DomainInfos at: domainName put: domInfo.<br>
- &nbsp; &nbsp; &nbsp; NaturalLanguageTranslator domainRegistered: domainName.<br>
- &nbsp; &nbsp; &nbsp; ^domInfo!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainInfo&gt;&gt;categoryPrefixes (in category 'accessing') -----<br>
- categoryPrefixes<br>
- &nbsp; &nbsp; &nbsp; ^categoryPrefixes!<br>
<br>
Item was removed:<br>
- ----- Method: TextDomainManager classSide&gt;&gt;domainForPackageNamed: (in category 'accessing') -----<br>
- domainForPackageNamed: packageName<br>
- &nbsp; &nbsp; &nbsp; ^Packages at: packageName ifAbsent: [self defaultDomain]!<br>
<br>
_______________________________________________<br>
etoys-dev mailing list<br>
<a href="mailto:etoys-dev@squeakland.org">etoys-dev@squeakland.org</a><br>
<a href="http://lists.squeakland.org/mailman/listinfo/etoys-dev" target="_blank">http://lists.squeakland.org/mailman/listinfo/etoys-dev</a><br>
</blockquote></div><br></div>
_______________________________________________<br>etoys-dev mailing list<br><a href="mailto:etoys-dev@squeakland.org">etoys-dev@squeakland.org</a><br><a href="http://lists.squeakland.org/mailman/listinfo/etoys-dev">http://lists.squeakland.org/mailman/listinfo/etoys-dev</a><br></blockquote></div><div><br></div></body></html>