<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-27232680</id><updated>2009-11-22T05:49:46.648+01:00</updated><title type='text'>Plastic SCM blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default?start-index=26&amp;max-results=25'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01839507951800291038</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>193</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27232680.post-6085439832418614960</id><published>2009-10-07T09:30:00.004+02:00</published><updated>2009-10-07T09:33:39.978+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>CodeCamp 2009 - Tarragona</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/SsxD9s067lI/AAAAAAAAArk/wWtAWJQrwj4/s1600-h/codecamplogo.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 87px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/SsxD9s067lI/AAAAAAAAArk/wWtAWJQrwj4/s400/codecamplogo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5389757581339848274" /&gt;&lt;/a&gt;&lt;br /&gt;We'll be attending at the &lt;a href="http://www.codecamp.es/"&gt;next CodeCamp in Tarragona&lt;/a&gt; sharing our experiencies on multi-platform development with Mono/.NET. I'll be covering both GUI and server code, and the challenges you might find when running on Mac OS X, Windows and the different Linux flavours. Hope you join!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6085439832418614960?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6085439832418614960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=6085439832418614960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6085439832418614960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6085439832418614960'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/10/codecamp-2009-tarragona.html' title='CodeCamp 2009 - Tarragona'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/SsxD9s067lI/AAAAAAAAArk/wWtAWJQrwj4/s72-c/codecamplogo.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-90496367247197086</id><published>2009-07-15T07:37:00.005+02:00</published><updated>2009-07-15T15:36:59.328+02:00</updated><title type='text'>6 Ways Plastic SCM Branches Are Better</title><content type='html'>Here is a list of six ways Plastic SCM branches are just better.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Performance - Plastic branches are fast and will always take the same amount of time to create, no performance degradation over time&lt;/li&gt;&lt;li&gt;Automatic Linking - Branches will automatically link to defects&lt;/li&gt;&lt;li&gt;Code Review - Easy to review changes, even in a specific context such as by defect&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rollback - When your worst nightmare occurs, don't panic, just rollback&lt;/li&gt;&lt;li&gt;Replicate - Distributed teams share branching data&lt;/li&gt;&lt;li&gt;Accessibility - Access branch data through ODBC, even the raw file data&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Please watch the 5 minute recording that discusses these 6 items in greater detail.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.org/demos/branchesbetter/branchesbetter.htm"&gt;6 Ways Plastic Branches Are Better&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-90496367247197086?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/90496367247197086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=90496367247197086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/90496367247197086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/90496367247197086'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/07/6-ways-plastic-scm-branch-are-better.html' title='6 Ways Plastic SCM Branches Are Better'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-4836302253908875925</id><published>2009-06-23T16:00:00.007+02:00</published><updated>2009-06-23T17:21:34.353+02:00</updated><title type='text'>It's Not All Technical: The Million Dollar Raspberry Cheesecake with Chocolate Chip Crust</title><content type='html'>I went on a BBQ this weekend and baked a cheesecake for the event. I took a look at a couple recipe's online then went crazy and just sort of whipped up something on my own I thought would be good and it turned out to be tremendous so I thought I would share it with our engineering community here in case anyone also has a sweet tooth for a cheesecake. So good it tastes like a million bucks!&lt;br /&gt;&lt;br /&gt;Ingredients:&lt;br /&gt;&lt;br /&gt;1.5 cups of sugar&lt;br /&gt;1 teaspoon vanilla&lt;br /&gt;3 8oz packages of cream cheese&lt;br /&gt;3 eggs&lt;br /&gt;4 oz heavy whipping cream&lt;br /&gt;1 cup of dark chocolate chips&lt;br /&gt;1 lb chocolate chip cookie dough&lt;br /&gt;3 6oz packages of fresh raspberries&lt;br /&gt;1 package of gelatin (optional)&lt;br /&gt;&lt;br /&gt;Directions: Preheat oven to 350.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Crust&lt;/span&gt;&lt;br /&gt;In a greased 9" springform pan ($10 at local wal-mart) take your 1lb of cookie dough and using your hand smash it flat into the bottom of the pan, spread evenly. Place it in the oven at 350 for 15 minutes. The cookie dough will be still gooey when it comes out and this is OK. Let it cool for 30 minutes, or put it in the fridge to cool for 15.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Filling&lt;/span&gt;&lt;br /&gt;In a mixing bowl add 1 cup of sugar and the 3 packages of cream cheese. Stir together while adding 1 egg at a time making sure each egg is stirred well into the cream cheese before adding the next one. Add the vanilla and heavy cream and continue to stir until it starts looking lusciously smooth.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Topping&lt;/span&gt;&lt;br /&gt;Add 12oz of raspberries (2 of the 3 packages) to a blender with the remaining 1/2 cup of sugar and liquefy into a puree.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Optional&lt;/span&gt;&lt;br /&gt;You can mix up a packet of plain gelatin in 1 cup boiling water and put 1/2 in the cheescake batter and 1/2 in the raspberry puree. It helps makes the cheesecake more firm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Assembly&lt;/span&gt;&lt;br /&gt;Pour 1/2 of the creamcheese batter into the springform pan. Then add the 1 cup of dark chocolate chocolate chips spread around pretty good. Then add the remaining creamcheese over the chips.&lt;br /&gt;&lt;br /&gt;Pour some of the raspberry topping on top of the cheesecake. Not too much, perhaps 1/4 cup,  dripping around the top of the cheesecake and use a knife or something to swirl it into the top of the cheesecake (a chopstick or skewer works well too).&lt;br /&gt;&lt;br /&gt;Put the rest of the raspberry puree sauce into a bowl or plastic container and throw it in the fridge to chill.&lt;br /&gt;&lt;br /&gt;Pop the cheesecake in the oven at 350 for 60 minutes. After you take it out run a knife around the edges and then let it cool for at least an hour. Place the cheesecake in the fridge and let it cool for at least 4 hours.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Serving&lt;/span&gt;&lt;br /&gt;To serve the cheesecake take it out of the springform pan and remove it from bottom plate using a plastic spatula (so as not to damage the pan) it should pop right off but be careful and work around the edges. Put the cheesecake on a serving dish and ring the remaning packet of raspberries around the cheesecake.&lt;br /&gt;&lt;br /&gt;Take out the remaining raspberry puree sauce and when you plate a slice of cheesecake put 1-2 spoonfools of puree on top and 1-2 more around the cheesecake.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusions&lt;/span&gt;&lt;br /&gt;Deliciousness...fattening too, but totally worth it :) the special thing is the cookie dough crust which really makes it one of the best deserts ever.&lt;br /&gt;&lt;br /&gt;Sorry no pictures, the cheesecake was eaten before I thought to blog about it. But it would look something like &lt;a href="http://allrecipes.com/Recipe/Orange-Chocolate-Swirl-Cheesecake/Detail.aspx"&gt;this &lt;/a&gt;except with raspberries.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-4836302253908875925?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/4836302253908875925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=4836302253908875925' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4836302253908875925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4836302253908875925'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/06/its-not-all-technical-million-dollar.html' title='It&apos;s Not All Technical: The Million Dollar Raspberry Cheesecake with Chocolate Chip Crust'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2038078927793634051</id><published>2009-06-12T07:32:00.004+02:00</published><updated>2009-06-12T09:10:32.313+02:00</updated><title type='text'>Parallel Development With Plastic SCM</title><content type='html'>Over the years I have worked with many SCM tools and they all say they support parallel development but they all do it in very different ways with all kinds of strategies and best practices that vary not only from system to system but also from situation to situation. This is one of the reasons why the Appleton/Berczuk book on &lt;a href="http://www.cmcrossroads.com/bradapp/acme/branching/"&gt;branching patterns&lt;/a&gt; is so important, so that SCM admins can determine how best to implement a branching strategy to support their ideal development needs in the given enviroment.&lt;br /&gt;&lt;br /&gt;With that in mind I've put together a 30 minute video to detail how we recommend doing things with Plastic. The first 15  minute talks in general about parallel development and what some of the pro's and con's are while the second 15 minutes is an example demonstrate of how we recommend using Plastic SCM to implement a simple yet effective parallel development environment. I focus on workflow and best practices while also incorporating some additional useful tools like CruiseControl, NUnit, TestComplete and Jira to help facilitate the process.&lt;br /&gt;&lt;br /&gt;Here is the agenda for the video:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Define the problems of serial development&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;Benefits of parallel versus serial development&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;Problems with parallel development&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;How to eliminate or lessen the problems&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;Keys to effectiveness&lt;o:p&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;li&gt;Demonstration of key points in action&lt;/li&gt;&lt;/ol&gt;            I've also added a link to the PPT I created for the presentation.&lt;br /&gt;&lt;br /&gt;Link to video: &lt;a href="http://www.plasticscm.com/demos/paralleldevmovie/Bparalleldev.htm"&gt;http://www.plasticscm.com/demos/paralleldevmovie/Bparalleldev.htm&lt;/a&gt;&lt;br /&gt;Link to PPT: &lt;a href="http://www.plasticscm.com/demos/paralleldevmovie/BetterDevThroughBranching.ppt"&gt;http://www.plasticscm.com/demos/paralleldevmovie/BetterDevThroughBranching.ppt&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2038078927793634051?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2038078927793634051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=2038078927793634051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2038078927793634051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2038078927793634051'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/06/parallel-development-with-plastic-scm.html' title='Parallel Development With Plastic SCM'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2220015199985220772</id><published>2009-05-06T13:00:00.009+02:00</published><updated>2009-05-06T17:13:35.185+02:00</updated><title type='text'>Plastic SCM &amp; PowerBuilder installation guide</title><content type='html'>This post describes how to configure &lt;a href="http://www.sybase.com/products/modelingdevelopment/powerbuilder"&gt;PowerBuilder&lt;/a&gt; environment to use Plastic SCM as the source code control provider. It assumes the Plastic SCM SCC Plug-in is installed and that your client machine can communicate with the Plastic SCM server.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;From Plastic SCM side&lt;/strong&gt;&lt;br /&gt;You have to change the Plastic SCM preferences before start working with PowerBuilder. You must go to Plastic preferences, then click in the "Other options" tab, and enable the option:&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Compare file contents instead of using timestamp for 'quick diff'.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;img id="BLOGGER_PHOTO_ID_5332671422516735186" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 343px; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_MwDksj3Si8Q/SgF0Z7L8rNI/AAAAAAAAAFw/IhNhzD7a2fU/s400/Plasticoptions.PNG" border="0" /&gt;&lt;strong&gt;From PowerBuilder side&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;In order to bind a PowerBuilder workspace with a Plastic SCM one, you must rigth click on the PowerBuilder workspace and then on properties menu option. Then, select the tab "Source control" and you will see a screen like the following one. Select Plastic PLUGIN as Source Control System.&lt;br /&gt;&lt;br /&gt;Also you must enable the following options:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Perform diff on status update&lt;/em&gt;&lt;br /&gt;&lt;em&gt;Supress prompts to overwrite read-only files&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5332671586542036466" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 319px; CURSOR: hand; HEIGHT: 400px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_MwDksj3Si8Q/SgF0jeOoJfI/AAAAAAAAAF4/d-ZaX3fYIYU/s400/Dibujo.PNG" border="0" /&gt; &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Performance considerations&lt;/strong&gt;&lt;/p&gt;By default PowerBuilder calls to the SCC provider with file packages. The default value is 25, so if you want to checkin 100 files, PowerBuilder will call the SCC provider 4 times, and will create 4 different changesets.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is a behavior that we want to avoid, due to our checkin operation being atomic. This value can be changed in the PowerBuilder configuration file (pb.ini), that is placed in the PowerBuilder root installation folder, by default:&lt;/p&gt;&lt;em&gt;c:\Program Files\Sybase\PowerBuilder\pb.ini&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;You must add the following parameter in the &lt;strong&gt;&lt;em&gt;Library section&lt;/em&gt;&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SccMaxArraySize=X, being X the number of files per SCC call. A good value could be 5000.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5332671696593996242" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 312px; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_MwDksj3Si8Q/SgF0p4NDydI/AAAAAAAAAGA/dD_Ixsdn20c/s400/Dibujo2.PNG" border="0" /&gt;&lt;br /&gt;Now Plastic SCM and PowerBuilder are configured to start working. You can take a look at the PowerBuilder documentation about SCC tasks &lt;a href="http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.pb_10.5.pbug/html/pbug/BABBEACC.htm"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2220015199985220772?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2220015199985220772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=2220015199985220772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2220015199985220772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2220015199985220772'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/05/plastic-scm-powerbuilder-installation.html' title='Plastic SCM &amp; PowerBuilder installation guide'/><author><name>Daniel Peñalba</name><uri>http://www.blogger.com/profile/14794998230103982047</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='14423919736581731710'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MwDksj3Si8Q/SgF0Z7L8rNI/AAAAAAAAAFw/IhNhzD7a2fU/s72-c/Plasticoptions.PNG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6408569551138731097</id><published>2009-05-01T21:05:00.003+02:00</published><updated>2009-05-01T21:08:28.383+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><title type='text'>Self documented development through inch-pebble checkins</title><content type='html'>Developers hate writing documentation. But when you find a weird bug or need to understand why a certain change was done, then you wish you had proper documentation. The problem seems hard to solve. Good comments can help and techniques like diff debugging and proper code review tools can help too. But what every developer does on a regular basis is checking in code to his repository. What if the way in which you check in could help self documenting the code?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Side note&lt;/strong&gt;: I find the technique I describe here not only good for self documenting changes but also to capture the way in which lead programmers work in such a way it can be used to teach the newcomers...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Self-documented-development-through-inch-pebble-checkins.html&amp;Itemid=29"&gt;&lt;strong&gt;Read more...&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_z6qpykplUvI/SftIP35DpQI/AAAAAAAAArU/CdsQbuiYlQA/s1600-h/inchpebbles02-multiplecsets.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 287px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/SftIP35DpQI/AAAAAAAAArU/CdsQbuiYlQA/s400/inchpebbles02-multiplecsets.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330934021461615874" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6408569551138731097?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6408569551138731097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=6408569551138731097' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6408569551138731097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6408569551138731097'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/05/self-documented-development-through.html' title='Self documented development through inch-pebble checkins'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_z6qpykplUvI/SftIP35DpQI/AAAAAAAAArU/CdsQbuiYlQA/s72-c/inchpebbles02-multiplecsets.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2243092542356930262</id><published>2009-04-09T13:25:00.017+02:00</published><updated>2009-04-09T14:02:33.523+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><category scheme='http://www.blogger.com/atom/ns#' term='annotate'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Finding who’s to blame – Plastic SCM annotate</title><content type='html'>One of the less known features in Plastic SCM is its ability to track changes on a line basis using the blame (or annotate) command.&lt;br /&gt;I’m going to explain how to use the cm blame | cm annotate command (actually blame and annotate are aliases to the same cm command), and how it can help you identifying changes.&lt;br /&gt;Let’s start with a very simple file with a few lines of code like the one below.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3bZxVNSEI/AAAAAAAAAp4/jxwuukHcxJQ/s1600-h/initialcode.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 271px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3bZxVNSEI/AAAAAAAAAp4/jxwuukHcxJQ/s400/initialcode.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5322651570407295042" /&gt;&lt;/a&gt;&lt;br /&gt;And then let’s start making changes in the main branch and in two new more branches, until we’ve a tree like the one at the following image.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/Sd3bhczch5I/AAAAAAAAAqA/4sZ5oD4wOM4/s1600-h/plasticvtree-before-merge.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 367px; height: 400px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/Sd3bhczch5I/AAAAAAAAAqA/4sZ5oD4wOM4/s400/plasticvtree-before-merge.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5322651702335932306" /&gt;&lt;/a&gt;&lt;br /&gt;At any given point in time we can run a blame command to a given file and identify where the changes came from. Let’s see how Plastic SCM can identify it looking at the next diagram.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3brIZfr0I/AAAAAAAAAqI/zqKI97hSkLU/s1600-h/annotate-before-merge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3brIZfr0I/AAAAAAAAAqI/zqKI97hSkLU/s400/annotate-before-merge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322651868657069890" /&gt;&lt;/a&gt;&lt;br /&gt;What Plastic does is climb the version tree upwards from the starting point you’ve at your workspace. If you start up at revision 1 on /main, changes will only come from this revision itself or the one immediately up. Something different will be displayed if you start from rev 2 at /main/task001.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3b4qDKsoI/AAAAAAAAAqQ/xc7z0RwSHrs/s1600-h/annotate-after-merge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 387px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3b4qDKsoI/AAAAAAAAAqQ/xc7z0RwSHrs/s400/annotate-after-merge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322652101028524674" /&gt;&lt;/a&gt;&lt;br /&gt;The good thing is that the Plastic annotate/blame command is not only restricted to climbing the tree up through the branch, but it can also go through the other branches as soon as there are available paths (created when you merge branches), so properly identifying where changes come from.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3cCihmCaI/AAAAAAAAAqY/ssz0OXN8ofE/s1600-h/annotate-after-two-merge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 350px; height: 400px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/Sd3cCihmCaI/AAAAAAAAAqY/ssz0OXN8ofE/s400/annotate-after-two-merge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322652270807353762" /&gt;&lt;/a&gt;&lt;br /&gt;After merging the two branches, the new revision 3 at /main, will have contributors not only from its previous revs on the branch, but from the other branches. The interesting point to highlight is that changes are not identified as coming from revs 2 and 3, but from the correct ones in the branches.&lt;br /&gt;Considering Plastic SCM promotes using branches as much as possible, and linking branches to tasks/issues/defects on your favorite project management/issue tracking system, you’ll be able to track where exactly changes came from.&lt;br /&gt;Let’s now go through a step by step example, using the command line, to explain how annotate behaves in a real scenario.&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm mkwk wk01 .&lt;br /&gt;Workspace wk01 has been correctly created&lt;br /&gt;&lt;br /&gt;&gt; cm co .&lt;br /&gt;The selected items are about to be checked out. Please wait ...&lt;br /&gt;Item . was correctly checked out&lt;br /&gt;&lt;br /&gt;&gt; cm add hostname.cs&lt;br /&gt;The selected items are about to be added. Please wait ...&lt;br /&gt;Item hostname.cs was correctly added&lt;br /&gt;&lt;br /&gt;&gt; cm ci hostname.cs . -c="initial commit"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Checking in d:\data\code\testwkspaces\wk01 ... Done&lt;br /&gt;Created changeset cs:1@br:/main@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Let's create a couple of smart branches from the CLI&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm mkbr br:/main/task001&lt;br /&gt;&lt;br /&gt;&gt; cm sbb br:/main/task001 cs:1&lt;br /&gt;A new base has been set for the branch br:/main/task001. &lt;br /&gt;A checkpoint changeset cs:2@rep:default@repserver:localhost:8084 has been created&lt;br /&gt;&lt;br /&gt;&gt; cm mkbr br:/main/task002&lt;br /&gt;&lt;br /&gt;&gt; cm sbb br:/main/task002 cs:1&lt;br /&gt;A new base has been set for the branch br:/main/task002. &lt;br /&gt;A checkpoint changeset cs:3@rep:default@repserver:localhost:8084 has been created&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now make a change on the main branch.&lt;br /&gt;&lt;br /&gt;I'll be using a co/ci cycle, but as you'll see below, you can follow a commit-only cycle with Plastic too.&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm co hostname.cs&lt;br /&gt;The selected items are about to be checked out. Please wait ...&lt;br /&gt;Item hostname.cs was correctly checked out&lt;br /&gt;&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&lt;br /&gt;&gt; cm ci hostname.cs -c="class name changed"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:4@br:/main@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now switch to task001.&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm stb br:/main/task001&lt;br /&gt;&gt; cm co hostname.cs&lt;br /&gt;The selected items are about to be checked out. Please wait ...&lt;br /&gt;Item hostname.cs was correctly checked out&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&gt; cm ci hostname.cs -c="variable name changed"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:5@br:/main/task001@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now I'll show a ci only cycle&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&gt; cm ci hostname.cs -c="another var name changed"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:6@br:/main/task001@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&lt;br /&gt;&gt; cm ci hostname.cs -c="more info printed"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:7@br:/main/task001@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now onto task002&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm stb br:/main/task002&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&gt; cm ci hostname.cs -c="usage controlled"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:8@br:/main/task002@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&gt; // edit hostname.cs&lt;br /&gt;&gt; cm ci hostname.cs -c="usage with info"&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:9@br:/main/task002@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's go back to br:/main and run the annotate before merging.&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm stb br:/main&lt;br /&gt;&lt;br /&gt;&gt; cm blame hostname.cs&lt;br /&gt;pablo br:/main#0 using System;&lt;br /&gt;pablo br:/main#0 using System.Net;&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0 namespace gethostname&lt;br /&gt;pablo br:/main#0 {&lt;br /&gt;pablo br:/main#1     class GetHostNameTestProgram&lt;br /&gt;pablo br:/main#0     {&lt;br /&gt;pablo br:/main#0         [STAThread]&lt;br /&gt;pablo br:/main#0         static void Main(string[] args)&lt;br /&gt;pablo br:/main#0         {&lt;br /&gt;pablo br:/main#0             string howtogeek = args[0];&lt;br /&gt;pablo br:/main#0             IPHostEntry hentry = Dns.GetHostByName(howtogeek);&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0             foreach (IPAddress theaddress in hentry.AddressList)&lt;br /&gt;pablo br:/main#0             {&lt;br /&gt;pablo br:/main#0                 Console.WriteLine(theaddress.ToString());&lt;br /&gt;pablo br:/main#0             }&lt;br /&gt;pablo br:/main#0         }&lt;br /&gt;pablo br:/main#0     }&lt;br /&gt;pablo br:/main#0 }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now on the branches:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm stb br:/main/task001&lt;br /&gt;&gt; cm blame hostname.cs&lt;br /&gt;pablo br:/main#0     using System;&lt;br /&gt;pablo br:/main#0     using System.Net;&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0     namespace gethostname&lt;br /&gt;pablo br:/main#0     {&lt;br /&gt;pablo br:/main#0         class Class1&lt;br /&gt;pablo br:/main#0         {&lt;br /&gt;pablo br:/main#0             [STAThread]&lt;br /&gt;pablo br:/main#0             static void Main(string[] args)&lt;br /&gt;pablo br:/main#0             {&lt;br /&gt;pablo br:/main/task001#0         string hostName = args[0];&lt;br /&gt;pablo br:/main/task001#0         IPHostEntry hentry = Dns.GetHostByName(hostName);&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main/task001#2         Console.WriteLine("Addresses: {0}", hostName);&lt;br /&gt;pablo br:/main/task001#1         foreach (IPAddress address in hentry.AddressList)&lt;br /&gt;pablo br:/main#0                 {&lt;br /&gt;pablo br:/main/task001#1             Console.WriteLine(address.ToString());&lt;br /&gt;pablo br:/main#0                 }&lt;br /&gt;pablo br:/main#0             }&lt;br /&gt;pablo br:/main#0         }&lt;br /&gt;pablo br:/main#0    }&lt;br /&gt;&lt;br /&gt;&gt; cm stb br:/main/task002&lt;br /&gt;&lt;br /&gt;&gt; cm annotate hostname.cs&lt;br /&gt;pablo br:/main#0   using System;&lt;br /&gt;pablo br:/main#0   using System.Net;&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0   namespace gethostname&lt;br /&gt;pablo br:/main#0   {&lt;br /&gt;pablo br:/main#0       class Class1&lt;br /&gt;pablo br:/main#0       {&lt;br /&gt;pablo br:/main#0           [STAThread]&lt;br /&gt;pablo br:/main#0           static void Main(string[] args)&lt;br /&gt;pablo br:/main#0           {&lt;br /&gt;pablo br:/main/task002#0       if( args.Lenght == 0 )&lt;br /&gt;pablo br:/main/task002#0       {&lt;br /&gt;pablo br:/main/task002#1           Console.WriteLine("usage: hostname name");&lt;br /&gt;pablo br:/main/task002#1           Console.WriteLine("\tname of your host");&lt;br /&gt;pablo br:/main/task002#0           return;&lt;br /&gt;pablo br:/main/task002#0       }&lt;br /&gt;pablo br:/main/task002#0&lt;br /&gt;pablo br:/main#0               string howtogeek = args[0];&lt;br /&gt;pablo br:/main#0               IPHostEntry hentry = Dns.GetHostByName(howtogeek);&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0               foreach (IPAddress theaddress in hentry.AddressList)&lt;br /&gt;pablo br:/main#0               {&lt;br /&gt;pablo br:/main#0                 Console.WriteLine(theaddress.ToString());&lt;br /&gt;pablo br:/main#0               }&lt;br /&gt;pablo br:/main#0            }&lt;br /&gt;pablo br:/main#0       }&lt;br /&gt;pablo br:/main#0   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's merge the branches back to main:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm stb br:/main&lt;br /&gt;Plastic is updating your workspace. Wait a moment, please ...&lt;br /&gt;Copied hostname.cs&lt;br /&gt;&lt;br /&gt;&gt; cm merge br:/main/task001 --merge&lt;br /&gt;Merge needed on item hostname.cs &lt;br /&gt;from br:/main/task001#2 &lt;br /&gt;to br:/main#1 base br:/main#0. &lt;br /&gt;Changed by both contributors.&lt;br /&gt;Merging hostname.cs&lt;br /&gt;Merge done&lt;br /&gt;&lt;br /&gt;&gt; cm ci hostname.cs&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:10@br:/main@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And blame:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm blame hostname.cs&lt;br /&gt;pablo br:/main#0     using System;&lt;br /&gt;pablo br:/main#0     using System.Net;&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0     namespace gethostname&lt;br /&gt;pablo br:/main#0     {&lt;br /&gt;pablo br:/main#1         class GetHostNameTestProgram&lt;br /&gt;pablo br:/main#0         {&lt;br /&gt;pablo br:/main#0             [STAThread]&lt;br /&gt;pablo br:/main#0             static void Main(string[] args)&lt;br /&gt;pablo br:/main#0             {&lt;br /&gt;pablo br:/main/task001#0         string hostName = args[0];&lt;br /&gt;pablo br:/main/task001#0         IPHostEntry hentry = Dns.GetHostByName(hostName);&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main/task001#2         Console.WriteLine("Addresses: {0}", hostName);&lt;br /&gt;pablo br:/main/task001#1         foreach (IPAddress address in hentry.AddressList)&lt;br /&gt;pablo br:/main#0                 {&lt;br /&gt;pablo br:/main/task001#1             Console.WriteLine(address.ToString());&lt;br /&gt;pablo br:/main#0                 }&lt;br /&gt;pablo br:/main#0             }&lt;br /&gt;pablo br:/main#0         }&lt;br /&gt;pablo br:/main#0     }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Second branch:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt; cm merge br:/main/task002 --merge&lt;br /&gt;Merge needed on item hostname.cs &lt;br /&gt;from br:/main/task002#1 &lt;br /&gt;to br:/main#2 base br:/main#0. &lt;br /&gt;Changed by both contributors.&lt;br /&gt;Merging hostname.cs&lt;br /&gt;Merge done&lt;br /&gt;&lt;br /&gt;&gt; cm ci hostname.cs&lt;br /&gt;The selected items are about to be checked in. Please wait ...&lt;br /&gt;Checking in hostname.cs ... Done&lt;br /&gt;Created changeset cs:11@br:/main@rep:default@repserver:BEARDTONGUE:8084&lt;br /&gt;&lt;br /&gt;&gt; cm blame hostname.cs&lt;br /&gt;pablo br:/main#0     using System;&lt;br /&gt;pablo br:/main#0     using System.Net;&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main#0     namespace gethostname&lt;br /&gt;pablo br:/main#0     {&lt;br /&gt;pablo br:/main#1         class GetHostNameTestProgram&lt;br /&gt;pablo br:/main#0         {&lt;br /&gt;pablo br:/main#0             [STAThread]&lt;br /&gt;pablo br:/main#0             static void Main(string[] args)&lt;br /&gt;pablo br:/main#0             {&lt;br /&gt;pablo br:/main/task002#0         if( args.Lenght == 0 )&lt;br /&gt;pablo br:/main/task002#0         {&lt;br /&gt;pablo br:/main/task002#1             Console.WriteLine("usage: hostname name");&lt;br /&gt;pablo br:/main/task002#1             Console.WriteLine("\t name of your host");&lt;br /&gt;pablo br:/main/task002#0             return;&lt;br /&gt;pablo br:/main/task002#0         }&lt;br /&gt;pablo br:/main/task002#0&lt;br /&gt;pablo br:/main/task001#0         string hostName = args[0];&lt;br /&gt;pablo br:/main/task001#0         IPHostEntry hentry = Dns.GetHostByName(hostName);&lt;br /&gt;pablo br:/main#0&lt;br /&gt;pablo br:/main/task001#2         Console.WriteLine("Addresses: {0}", hostName);&lt;br /&gt;pablo br:/main/task001#1         foreach (IPAddress address in hentry.AddressList)&lt;br /&gt;pablo br:/main#0                 {&lt;br /&gt;pablo br:/main/task001#1             Console.WriteLine(address.ToString());&lt;br /&gt;pablo br:/main#0                 }&lt;br /&gt;pablo br:/main#0             }&lt;br /&gt;pablo br:/main#0         }&lt;br /&gt;pablo br:/main#0     }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How does the vtree look?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3eMeCmGNI/AAAAAAAAAqg/Fu49KcEnwU8/s1600-h/plasticvtree-after-merge.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 378px; height: 400px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3eMeCmGNI/AAAAAAAAAqg/Fu49KcEnwU8/s400/plasticvtree-after-merge.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5322654640425539794" /&gt;&lt;/a&gt;&lt;br /&gt;And finally a graphic explaining the annotate I just showed above.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3egcBW92I/AAAAAAAAAqo/jpzkD7k9I3c/s1600-h/annotate-explained.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 130px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/Sd3egcBW92I/AAAAAAAAAqo/jpzkD7k9I3c/s400/annotate-explained.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5322654983480866658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's also possible to decorate each line with the comment:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;&gt;cm blame hostname.cs --format="'{comment, -24}'{content}"&lt;br /&gt;'initial commit          'using System;&lt;br /&gt;'initial commit          'using System.Net;&lt;br /&gt;'initial commit          '&lt;br /&gt;'initial commit          'namespace gethostname&lt;br /&gt;'initial commit          '{&lt;br /&gt;'class name changed      '  class GetHostNameTestProgram&lt;br /&gt;'initial commit          '  {&lt;br /&gt;'initial commit          '      [STAThread]&lt;br /&gt;'initial commit          '      static void Main(string[] args)&lt;br /&gt;'initial commit          '      {&lt;br /&gt;'usage controlled        '        if( args.Lenght == 0 )&lt;br /&gt;'usage controlled        '        {&lt;br /&gt;'usage with info         '            Console.WriteLine("usage: hostname name");&lt;br /&gt;'usage with info         '            Console.WriteLine("\t name of your host");&lt;br /&gt;'usage controlled        '            return;&lt;br /&gt;'usage controlled        '        }&lt;br /&gt;'usage controlled        '&lt;br /&gt;'variable name changed   '        string hostName = args[0];&lt;br /&gt;'variable name changed   '        IPHostEntry hentry = Dns.GetHostByName(hostName);&lt;br /&gt;'initial commit          '&lt;br /&gt;'more info printed       '        Console.WriteLine("Addresses: {0}", hostName);&lt;br /&gt;'another var name changed'        foreach (IPAddress address in hentry.AddressList)&lt;br /&gt;'initial commit          '        {&lt;br /&gt;'another var name changed'            Console.WriteLine(address.ToString());&lt;br /&gt;'initial commit          '        }&lt;br /&gt;'initial commit          '      }&lt;br /&gt;'initial commit          '  }&lt;br /&gt;'initial commit          '}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;strong&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2243092542356930262?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2243092542356930262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=2243092542356930262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2243092542356930262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2243092542356930262'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/04/finding-whos-to-blame-plastic-scm.html' title='Finding who’s to blame – Plastic SCM annotate'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_z6qpykplUvI/Sd3bZxVNSEI/AAAAAAAAAp4/jxwuukHcxJQ/s72-c/initialcode.PNG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-119725773752614183</id><published>2009-04-03T07:37:00.011+02:00</published><updated>2009-04-03T08:59:56.107+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac'/><title type='text'>Using Changes app</title><content type='html'>&lt;div&gt;As most of us Mac developers will be aware, Xcode comes with FileMerge, but sometimes you just need a little bit extra. I recently came across &lt;a href="http://www.changesapp.com/"&gt;Changes&lt;/a&gt;, here's how to use it with Plastic.&lt;br /&gt;&lt;font style="text-decoration: underline;"&gt;&lt;/font&gt;&lt;br /&gt;After downloading, install the Terminal Utility to give yourself the command line interface. Then, from within a workspace, you can diff two revisions like so (I'm using BASH):&lt;br /&gt;&lt;br /&gt;&lt;font face="courier new"&gt;$ chdiff &amp;lt;(cm cat GameScene.mm#br:/main#1) &amp;lt;(cm cat GameScene.mm#br:/main#LAST)&lt;/font&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;To get this working from within the Plastic GUI client, we'll need to edit the client.conf file which is located in &lt;span style="font-family: courier new;"&gt;~/.plastic/client.conf&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Find the section &lt;font face="courier new"&gt;&amp;lt;DiffTools&amp;gt;&lt;/font&gt;, and a few lines down replace the "mergetool" entry with this:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier new"&gt;&amp;lt;string&amp;gt;/usr/bin/chdiff "@sourcefile" "@destinationfile"&amp;lt;/string&amp;gt;&lt;/font&gt;&lt;br /&gt;Restart the Plastic GUI client and diff away.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_zep8joxjujg/SdWm0V_DJOI/AAAAAAAAAAM/fw_tpJdbFB0/s1600-h/changes_screen.jpg"&gt;&lt;img style="cursor: pointer; width: 386px; height: 400px;" src="http://4.bp.blogspot.com/_zep8joxjujg/SdWm0V_DJOI/AAAAAAAAAAM/fw_tpJdbFB0/s400/changes_screen.jpg" alt="" id="BLOGGER_PHOTO_ID_5320341952993109218" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-119725773752614183?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/119725773752614183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=119725773752614183' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/119725773752614183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/119725773752614183'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/04/using-changes-app.html' title='Using Changes app'/><author><name>thewhiteline</name><uri>http://www.blogger.com/profile/16706216113437319586</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='01070455602276628203'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_zep8joxjujg/SdWm0V_DJOI/AAAAAAAAAAM/fw_tpJdbFB0/s72-c/changes_screen.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-4373261496811495887</id><published>2009-04-01T10:30:00.003+02:00</published><updated>2009-04-01T10:36:37.660+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>stackoverflow campaign</title><content type='html'>We're running a campaign at &lt;a href="http://www.stackoverflow.com"&gt;stackoverflow&lt;/a&gt;, displaying the new collection of funny photos we created for the site.&lt;br /&gt;&lt;br /&gt;I've just found a screenshot showing one of the ads at a post talking about responsible advertising at stackoverflow:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.stackoverflow.com/2009/03/responsible-advertising-feed-a-programmer/"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 255px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SdMm0P1sXCI/AAAAAAAAApw/k887eNWdRZE/s400/stackoverflowcampaign.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319638263901477922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There're 3 more (plus one considered too sexy, which we'll keep secret for some time :-P) you can find at the site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-4373261496811495887?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/4373261496811495887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=4373261496811495887' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4373261496811495887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4373261496811495887'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/04/stackoverflow-campaign.html' title='stackoverflow campaign'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SdMm0P1sXCI/AAAAAAAAApw/k887eNWdRZE/s72-c/stackoverflowcampaign.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7678672231900832382</id><published>2009-03-30T21:13:00.004+02:00</published><updated>2009-03-30T21:16:24.782+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Disintegrating changes with GIT and with Plastic</title><content type='html'>I've just published a post explaining how disintegration (or subtractive merge if you prefer) works in GIT and Plastic SCM.&lt;br /&gt;&lt;br /&gt;You can find the full article &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Disintegrating-changes-with-GIT-and-Plastic.html&amp;Itemid=29"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Disintegrating-changes-with-GIT-and-Plastic.html&amp;Itemid=29"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 359px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SdEaIqd0n3I/AAAAAAAAApo/bcYL6PbyeMo/s400/disintegration04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319061371041914738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Normally I'd just focus on what we do with Plastic SCM, but since GIT is big among OSS developers (and &lt;a href="http://www.go-mono.org/monologue"&gt;Monologue&lt;/a&gt; readers), I thought it could be good to explain how it works there too.&lt;br /&gt;&lt;br /&gt;Enjoy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7678672231900832382?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7678672231900832382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=7678672231900832382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7678672231900832382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7678672231900832382'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/disintegrating-changes-with-git-and.html' title='Disintegrating changes with GIT and with Plastic'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SdEaIqd0n3I/AAAAAAAAApo/bcYL6PbyeMo/s72-c/disintegration04.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5937472106293570768</id><published>2009-03-25T18:35:00.006+01:00</published><updated>2009-03-26T16:55:34.223+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Merge Without Fear</title><content type='html'>Over the years I've talked with many software developers about branching and merging and found there is almost a universal distrust of using branches despite all the benefits that can be provided by branching.&lt;br /&gt;&lt;br /&gt;The main source of this distrust really stems from merging. The branching part everyone can handle it is when you go to integrate changes, generate complex software configurations and perform complex merges against a codeline with many contributors that is the source of the problem.&lt;br /&gt;&lt;br /&gt;Over the years programmers have developed a mistrust, or worse an outright fear, of merging which is really a result of tools that lack proper  branch and merge support. But even with proper merge tracking there is always a fear when doing merges that something will break, something will happen that can not be easily undone and then someone will be left spending hours trying to fix it with the boss screaming over their shoulder the entire time.&lt;br /&gt;&lt;br /&gt;This is where Plastic SCM rises above the rest. We have a simple and effective way to handle merges that makes it a fearless operation.&lt;br /&gt;&lt;br /&gt;There are two aspects that make the process fearless that I will focus on (there is a third which involves rollbacks which I don't get into here).&lt;br /&gt;&lt;br /&gt;1.) You have an opportunity to test the results of your merge before anything gets committed to the database.&lt;br /&gt;2.) You can always undo a merge if the test results are bad.&lt;br /&gt;&lt;br /&gt;Plastic SCM already has excellent merge tracking. This means all your merge history is remembered so you don't double merge or unmerge by accident. Merge tracking makes it possible to do merging over time especially with a large number of contributors. What I focus on in the screencast is the aspect of Plastic merging that allows you to build your project, test it, and then cancel the merge or commit it to the SCM repository depending on the results.&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/Demos/mergenofear/mergenofear.htm"&gt;Merge Without Fear Video&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/Demos/mergenofear/mergenofear.htm"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 157px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/ScuU8T7KJKI/AAAAAAAAApY/bUFL6SLM_ps/s200/mergewithoutfear.PNG" alt="" id="BLOGGER_PHOTO_ID_5317507548902466722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please send feedback to pburma@codicesoftware.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-5937472106293570768?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5937472106293570768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=5937472106293570768' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5937472106293570768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5937472106293570768'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/merge-without-fear.html' title='Merge Without Fear'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/ScuU8T7KJKI/AAAAAAAAApY/bUFL6SLM_ps/s72-c/mergewithoutfear.PNG' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2259435042245879172</id><published>2009-03-24T15:09:00.003+01:00</published><updated>2009-03-24T15:12:11.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Test before you run...</title><content type='html'>I'm posting to my blog at DDJ a couple of hopefully interesting articles about how we stress test Plastic SCM using NUnit (PNUnit to be exact, our humble contribution to the project) and about 100 machines (750K bogomips!!)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/ScjqAAsA06I/AAAAAAAAApQ/PYYOAZcuUp4/s1600-h/pnunitload00b.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/ScjqAAsA06I/AAAAAAAAApQ/PYYOAZcuUp4/s400/pnunitload00b.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5316756646016373666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First article is &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Test-before-you-run...-Part-1-.html&amp;Itemid=29"&gt;here &lt;/a&gt;and the second one &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Test-before-you-run...-Part-II.html&amp;Itemid=29"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hope you like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2259435042245879172?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2259435042245879172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=2259435042245879172' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2259435042245879172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2259435042245879172'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/test-before-you-run.html' title='Test before you run...'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/ScjqAAsA06I/AAAAAAAAApQ/PYYOAZcuUp4/s72-c/pnunitload00b.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5563502271711099445</id><published>2009-03-20T16:13:00.012+01:00</published><updated>2009-03-20T16:41:58.143+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>Setting up a fallback server using replication</title><content type='html'>to work under a wide variety of scenarios.&lt;br /&gt;&lt;br /&gt;Normally when you think about distributed you inmediately jump into the situation where each developer has his own repository and replicates changes back and forth with his peers or a central location (or the one with highest rank in the meritocracy if you prefer :-P).&lt;br /&gt;&lt;br /&gt;But today I'm going to talk about a slightly different set up.&lt;br /&gt;&lt;br /&gt;What if you need to have redundant servers so in case one goes down you can inmediately recover and all developers (normally in a big shop) can continue working with the fallback machine?&lt;br /&gt;&lt;br /&gt;Well, Plastic has several ways to solve this problem (you know, we're flexible!):&lt;br /&gt;&lt;br /&gt;&lt;li&gt; The first one involves taking advantage of one of its supported backends and implement a mirrorer database with MySql or SQL Server. It is adequate when you've seasoned dbas at home, who are already doing the same stuff on a daily basis for their corporate servers.&lt;br /&gt;&lt;li&gt; And the second option, the one I'll be explaining today, relies on the distributed system to implement an equivalent behavior.&lt;br /&gt;&lt;br /&gt;The following figure depicts the situation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/ScO01rFhyOI/AAAAAAAAAoo/Z2Ldoys2k_c/s1600-h/goal.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 273px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/ScO01rFhyOI/AAAAAAAAAoo/Z2Ldoys2k_c/s320/goal.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315290819419293922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, how can we set up this with Plastic?&lt;br /&gt;&lt;br /&gt;First you obviously need a couple of servers, one you're already using on a daily basis and then a second one (probably a clone of the first one), also running Plastic. In order to make things easier to understand, the first server will be called &lt;em&gt;dragon &lt;/em&gt;and the second one &lt;em&gt;pendergast&lt;/em&gt;. &lt;br /&gt;&lt;br /&gt;&lt;em&gt;dragon &lt;/em&gt;will be hosting the master repository and &lt;em&gt;pendergast&lt;/em&gt; a second one, named replica, which will be a clone of master.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Note&lt;/strong&gt;: needless to say servers could be running on different operating systems and even using different database backends.&lt;br /&gt;&lt;br /&gt;Once the servers are up and running, the procedure will be really simple:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Locate which branches to replicate&lt;br /&gt;&lt;li&gt; Replicate them&lt;br /&gt;&lt;li&gt; Run the process repeteadly (e.g. once an hour)&lt;br /&gt;&lt;br /&gt;So, how can we identify which branches deserve our attention and have to be replicated? Easy: we need to know where are the changes made since the last replication, don't we?&lt;br /&gt;&lt;br /&gt;And, how can we know what changes have been done and where? Look at the changesets view and click on the &lt;em&gt;advanced &lt;/em&gt;button, as shown in the following picture.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/ScO3y-0Ey8I/AAAAAAAAApI/mjHyL2HPKEg/s1600-h/querysystem.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 129px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/ScO3y-0Ey8I/AAAAAAAAApI/mjHyL2HPKEg/s400/querysystem.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315294071710075842" /&gt;&lt;/a&gt;&lt;br /&gt;Plastic SCM supports fully distributed development and hence it is flexible enough &lt;br /&gt;&lt;br /&gt;Plastic implements a powerful sql-like query system.&lt;br /&gt;&lt;br /&gt;Most of the views in the Plastic GUI retrieve their data from a Plastic query, and changesets view is one of them. So we just have to take a look to the default query to figure out what do we need.&lt;br /&gt;&lt;br /&gt;In fact, the detailed process to follow is drawn here, including the replication commands to use.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/ScO3smvHaUI/AAAAAAAAApA/Zu2yP86GPJw/s1600-h/flowchart.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 223px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/ScO3smvHaUI/AAAAAAAAApA/Zu2yP86GPJw/s400/flowchart.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5315293962167609666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We will be using a command like the following&lt;br /&gt;&lt;br /&gt;&lt;pre class='shell'&gt;&lt;br /&gt;$ cm find changesets where date &gt;= ‘2009/03/18  19:30:00’ --format={branch} --nototal&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To find changes and:&lt;br /&gt;&lt;br /&gt;&lt;pre class='shell'&gt;&lt;br /&gt;$ cm replicate br:/main/task00X@master@dragon:9090 replica@pendergast:7074&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to replicate.&lt;br /&gt;&lt;br /&gt;Here's the ruby code I used for my replication script:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;if ARGV.size &lt; 2&lt;br /&gt;    puts "Usage: synchservers srcrepspec dstrepspec"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;srcrep = ARGV[0]&lt;br /&gt;dstrep = ARGV[1]&lt;br /&gt;&lt;br /&gt;# find all changes since last replication (one hour)&lt;br /&gt;&lt;br /&gt;date = Time.new - 60*60&lt;br /&gt;&lt;br /&gt;branchescommand = sprintf(&lt;br /&gt;    'cm find "changeset where date &gt;= \'%s\'" --format={branch} --nototal on repository \'%s\'',&lt;br /&gt;    date.strftime('%Y/%m/%d %H:%M:%S'), srcrep )&lt;br /&gt;&lt;br /&gt;output = `#{branchescommand}`&lt;br /&gt;&lt;br /&gt;# build an array of branches&lt;br /&gt;&lt;br /&gt;branches = Array.new&lt;br /&gt;&lt;br /&gt;output.each { |branch| branches &lt;&lt; branch.chomp}&lt;br /&gt;&lt;br /&gt;# run removing duplicates&lt;br /&gt;&lt;br /&gt;branches.uniq.sort.each { |branch| &lt;br /&gt;    replicatecmd = sprintf(&lt;br /&gt;        'cm replicate br:%s@%s rep:%s',&lt;br /&gt;        branch, srcrep, dstrep);&lt;br /&gt;    puts replicatecmd&lt;br /&gt;    system(replicatecmd)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Easy?&lt;br /&gt;&lt;br /&gt;In order to run it you just have to:&lt;br /&gt;&lt;br /&gt;&lt;pre class='code'&gt;&lt;br /&gt;$ synchservers.rb master@dragon:6060 replica@pendergast:9090&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And include it as a cron or scheduled task.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-5563502271711099445?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5563502271711099445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=5563502271711099445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5563502271711099445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5563502271711099445'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/setting-up-fallback-server-using.html' title='Setting up a fallback server using replication'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/ScO01rFhyOI/AAAAAAAAAoo/Z2Ldoys2k_c/s72-c/goal.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3366527972320806461</id><published>2009-03-20T09:53:00.002+01:00</published><updated>2009-03-20T09:57:37.664+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><title type='text'>Live to merge, merge to live (3 parts out)</title><content type='html'>There are already 3 posts out on "live to merge, merge to live" on DDJ's guru blog:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Live-to-merge-merge-to-live....html&amp;Itemid=29"&gt;Part I&lt;/a&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Live-merge-merge-to-live.-Part-II.html&amp;Itemid=29"&gt;Part II - Manual conflicts&lt;/a&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://dobbscodetalk.com/index.php?option=com_myblog&amp;show=Live-to-merge-merge-to-live.-Part-III.html&amp;Itemid=29"&gt;Part III - Tracking&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you find it helpful&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-3366527972320806461?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3366527972320806461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=3366527972320806461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3366527972320806461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3366527972320806461'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/live-to-merge-merge-to-live-3-parts-out.html' title='Live to merge, merge to live (3 parts out)'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6888897154783100126</id><published>2009-03-17T16:02:00.007+01:00</published><updated>2009-03-17T16:25:38.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>SD West 2009</title><content type='html'>SD West 2009 is over and we're just back from our trip to San Francisco. It was great to meet developers there and also some of our competitors such us &lt;a href="http://www.accurev.com"&gt;Accurev&lt;/a&gt; and &lt;a href="http://www.perforce.com"&gt;Perforce&lt;/a&gt;. I actually had a very interesting and friendly talk with &lt;a href="http://damonpoole.blogspot.com/"&gt;Damon Poole&lt;/a&gt;, Accurev's CEO, about a number of different business related things.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/Sb-8ArMB0fI/AAAAAAAAAoI/cNvSLmxlBow/s1600-h/IMG00003.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/Sb-8ArMB0fI/AAAAAAAAAoI/cNvSLmxlBow/s320/IMG00003.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314172805099672050" /&gt;&lt;/a&gt;&lt;br /&gt;We had the opportunity to talk with developers about our newest 2.7 release, which grabbed a lot of attention, especially the new &lt;a href="http://www.plasticscm.com/xpproducts/xpcore/xpdistributed.aspx"&gt;distributed capabilities&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_z6qpykplUvI/Sb-8k7FZupI/AAAAAAAAAoQ/kiLFwlCZFBQ/s1600-h/IMG00004.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/Sb-8k7FZupI/AAAAAAAAAoQ/kiLFwlCZFBQ/s320/IMG00004.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314173427842136722" /&gt;&lt;/a&gt;&lt;br /&gt;It was our first time at SDWest, and it's been a lot of fun. The booth was located just at the entrance of the expo area, so we had lots of visitors. We gave away hundreds of T-shirts (two different designs) most of them during the first day (until we almost run out of them) in just a few minutes. (We'll have to bring more next year!)&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/Sb-9V6AOMnI/AAAAAAAAAoY/eUtjvGgwhiA/s1600-h/IMG00005.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 320px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/Sb-9V6AOMnI/AAAAAAAAAoY/eUtjvGgwhiA/s320/IMG00005.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314174269365564018" /&gt;&lt;/a&gt;&lt;br /&gt;We also gave away Plastic License Cards, a collection of four different pictures which included 2 free Plastic SCM Professional licenses, I don't remember the exact number anymore, but we almost run out of them too.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/Sb--x3VQuKI/AAAAAAAAAog/GRvmBCpx4FA/s1600-h/IMG00006.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 256px; height: 320px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/Sb--x3VQuKI/AAAAAAAAAog/GRvmBCpx4FA/s320/IMG00006.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314175849196468386" /&gt;&lt;/a&gt;&lt;br /&gt;Wednesday evening we attended the Jolt Awards ceremony which was an exciting event. This year was the first time we submitted Plastic SCM to the Jolts, and we were more than happy to se how it was selected as one of the finalists among a number of SCM systems, so our mission was accomplished, but it was good to see how &lt;a href="http://www.openmakesoftware.com/"&gt;Open Make&lt;/a&gt; finally got the Jolt, after several years on the list. (Note to self: publish a tutorial about OpenMake/Plastic integration asap).&lt;br /&gt;&lt;br /&gt;So, we're eager to go back to Santa Clara next year and hopefully unveil there the upcoming Plastic SCM 3.0 :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6888897154783100126?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6888897154783100126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=6888897154783100126' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6888897154783100126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6888897154783100126'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2009/03/sd-west-2009.html' title='SD West 2009'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/Sb-8ArMB0fI/AAAAAAAAAoI/cNvSLmxlBow/s72-c/IMG00003.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1913593420501531960</id><published>2008-12-31T11:58:00.002+01:00</published><updated>2008-12-31T12:08:14.212+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Plastic is a Jolt Finalist!</title><content type='html'>Yes, &lt;a href="http://www.joltawards.com/finalists.html#config"&gt;Jolt Award 2009 Finalists have been announced&lt;/a&gt; and... Plastic SCM is one of them!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_z6qpykplUvI/SVtSfSBTjDI/AAAAAAAAAk8/A1S45jg71Ug/s1600-h/jolthead.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 156px; height: 150px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SVtSfSBTjDI/AAAAAAAAAk8/A1S45jg71Ug/s400/jolthead.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5285909285016144946" /&gt;&lt;/a&gt;Plastic is one of the 5 tools selected for the Change and Configuration Management category, together with systems like Accurev, OpenMake or TeamCity to mention a few.&lt;br /&gt;&lt;br /&gt;Codice is a very young company, so just being on the list is great for us. The Jolt nomination has been an incredible Christmas present for the team.&lt;br /&gt;&lt;br /&gt;We work hard to make Plastic the best version control system out there, and we know there's always lots of work to do, lots of competitors (bigger than us) doing a very good job, so is nice to see how Plastic is making its way through.&lt;br /&gt;&lt;br /&gt;Plastikers, enjoy this and... happy 2009!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1913593420501531960?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1913593420501531960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=1913593420501531960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1913593420501531960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1913593420501531960'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/plastic-is-jolt-finalist.html' title='Plastic is a Jolt Finalist!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SVtSfSBTjDI/AAAAAAAAAk8/A1S45jg71Ug/s72-c/jolthead.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2208406285618007166</id><published>2008-12-31T11:50:00.002+01:00</published><updated>2008-12-31T11:54:54.177+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>Merge to live, live to merge</title><content type='html'>I've just published a new post explaining the basics of merging on the DDJ guru's blog.&lt;br /&gt;&lt;br /&gt;I'm writing a series or articles describing the very basics of merging since I still find people afraid of merging (and lock-prone) very often.&lt;br /&gt;&lt;br /&gt;Here are the links:&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://dobbscodetalk.com/index.php?option=com_content&amp;task=view&amp;id=931&amp;Itemid=33"&gt;Part I&lt;/a&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://dobbscodetalk.com/index.php?option=com_content&amp;task=view&amp;id=963&amp;Itemid=33"&gt;Part II&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2208406285618007166?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2208406285618007166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=2208406285618007166' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2208406285618007166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2208406285618007166'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/merge-to-live-live-to-merge.html' title='Merge to live, live to merge'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3255470130745027564</id><published>2008-12-24T02:27:00.010+01:00</published><updated>2008-12-24T02:50:43.735+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>Plastic on Solaris 10</title><content type='html'>Well, it's been a *real* pain to build mono on Solaris 10!! Compared to this building in OpenSolaris was &lt;em&gt;veeeery&lt;/em&gt; easy.&lt;br /&gt;&lt;br /&gt;I'll try to repeat the process in the coming days and try to create a detailed guide. Building libgdiplus was specially painful, but I guess I've been doing something wrong (I hope!).&lt;br /&gt;&lt;br /&gt;And then, finally, a real "back to the future" screenshot here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_z6qpykplUvI/SVGTAILGbMI/AAAAAAAAAks/nwNNvQxIXdg/s1600-h/solaris10cde2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SVGTAILGbMI/AAAAAAAAAks/nwNNvQxIXdg/s400/solaris10cde2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283165468285627586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I used to love this &lt;em&gt;beauty&lt;/em&gt; about ten years ago, and now it doesn't look that nice anymore (although I still like it :-D).&lt;br /&gt;&lt;br /&gt;And another screenshot, this time with a most modern look &amp; feel:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_z6qpykplUvI/SVGTU8tEBFI/AAAAAAAAAk0/4VW439aPIXA/s1600-h/plasticsolaris10java.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/SVGTU8tEBFI/AAAAAAAAAk0/4VW439aPIXA/s400/plasticsolaris10java.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283165825984103506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I love Solaris, so being able to run the Plastic GUI there is some sort of Christmas present for me... :-) I love Solaris since I started reading the &lt;a href="http://developers.sun.com/solaris/articles/lightprocess.html"&gt;Jim Mauro articles about threading and so on&lt;/a&gt;, and later his &lt;a href="http://www.amazon.com/Solaris-TM-Internals-Jim-Mauro/dp/0130224960"&gt;great book about internals&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But, to be honest, after being using Mac OS X (10.4 &amp; 10.5) for the last three years (and almost on a daily basis during the last weeks) it's clear there's a message for the Solaris folks out there: hire a graphics designer! (ok, if you have one... fire him and hire a new one!!)&lt;br /&gt;&lt;br /&gt;So, what's next? Ok, there's only one OS I like better than Solaris... OpenBSD! So stay tuned..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-3255470130745027564?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3255470130745027564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=3255470130745027564' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3255470130745027564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3255470130745027564'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/plastic-on-solaris-10.html' title='Plastic on Solaris 10'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SVGTAILGbMI/AAAAAAAAAks/nwNNvQxIXdg/s72-c/solaris10cde2.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8755802079055189131</id><published>2008-12-23T13:51:00.004+01:00</published><updated>2008-12-23T14:00:03.121+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>OpenSolaris and MWF</title><content type='html'>Finally! We've Plastic SCM 2.7 GUI running on OpenSolaris! You know Plastic GUI is heavily based on Mono WinForms, don't you? Ok, then check what Mono WinForms can do...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codicesoftware.com/demos/plasticopensolarispreview/plasticopensolaris.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 301px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SVDgRpVdjHI/AAAAAAAAAkc/MfJsOUV5snk/s400/plasticopensolaris.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5282968956663860338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Click on the image or &lt;a href="http://www.codicesoftware.com/demos/plasticopensolarispreview/plasticopensolaris.html"&gt;here &lt;/a&gt;to watch a screencast and see it in action.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8755802079055189131?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8755802079055189131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=8755802079055189131' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8755802079055189131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8755802079055189131'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/opensolaris-and-mwf.html' title='OpenSolaris and MWF'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SVDgRpVdjHI/AAAAAAAAAkc/MfJsOUV5snk/s72-c/plasticopensolaris.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1310355321523923810</id><published>2008-12-06T22:32:00.003+01:00</published><updated>2008-12-06T22:39:50.789+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><title type='text'>White testing Plastic</title><content type='html'>Ever heard of &lt;a href="http://www.codeplex.com/white"&gt;White&lt;/a&gt;? You should.&lt;br /&gt;&lt;br /&gt;White is a promising testing framework based on the &lt;a href="http://msdn.microsoft.com/en-us/library/ms747327.aspx"&gt;UI Automation APIs&lt;/a&gt; which enables you to write tests in C# (or your favorite .NET language).&lt;br /&gt;&lt;br /&gt;Why is it interesting? I think there're several reasons but, for me, the main ones are:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Developers can write GUI tests as they'd write unit tests: from their own development environment, in their language of choice. It makes a huge difference.&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Tests can be integrated with NUnit, or, in our case, with PNUnit, the distributed extension to NUnit which has been integrated in NUnit 2.5 (we run our test suites on several variations of Linux, Windows and MacOS (including x86 and PPC)).&lt;br /&gt;&lt;br /&gt;What to see it in action? Watch the following screencast of White testing Plastic:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/demos/whitetestingplastic/whitetestingplastic.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 223px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/STrw3L-4InI/AAAAAAAAAkM/XFFWJdnX6Tg/s320/whitetestingplastic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5276794744317944434" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1310355321523923810?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1310355321523923810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=1310355321523923810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1310355321523923810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1310355321523923810'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/white-testing-plastic.html' title='White testing Plastic'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/STrw3L-4InI/AAAAAAAAAkM/XFFWJdnX6Tg/s72-c/whitetestingplastic.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1409914548841543344</id><published>2008-12-04T14:41:00.003+01:00</published><updated>2008-12-04T14:47:49.874+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>Distributed development with Plastic</title><content type='html'>Distributed development has been introduced in Plastic in release 2.5, but now with 2.7 we make it even easier to use because it jumps from the command line to the GUI.&lt;br /&gt;&lt;br /&gt;The main difference is that now replicating branching branches back and forth is just a click away although good-ol CLI scripting still allows you to rapidly automate stuff using the cm replicate command.&lt;br /&gt;&lt;br /&gt;This screencast explains in detail how a simple distributed working workflow can work with Plastic.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/demos/distributed_intro/distributed_intro.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 270px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/STffGBEv84I/AAAAAAAAAkE/uI_GkCby-rU/s320/plasticdistributed.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5275930782948389762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can always check the distributed development user's guide for more information, but watching the video will be probably faster... :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1409914548841543344?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1409914548841543344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=1409914548841543344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1409914548841543344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1409914548841543344'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/12/distributed-development-with-plastic.html' title='Distributed development with Plastic'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/STffGBEv84I/AAAAAAAAAkE/uI_GkCby-rU/s72-c/plasticdistributed.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-4700866471203956801</id><published>2008-11-27T11:34:00.005+01:00</published><updated>2008-11-27T11:49:18.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><title type='text'>Announcing Plastic 2.7</title><content type='html'>We're proud to announce a brand new Plastic release: 2.7. It comes with a big number of improvements, new functionalities and fixes.&lt;br /&gt;&lt;br /&gt;Check the release notes here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/opdownloads2/opreleasenotes2.aspx"&gt;http://www.plasticscm.com/opdownloads2/opreleasenotes2.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What's new on 2.7. There's a huge list but just to mention a few:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Distributed development support on the GUI: now all replication operations can be done from the GUI and not only the CLI. It makes distributed development easier than ever. You can replicate branches back and forth with just a few clicks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_z6qpykplUvI/SS54-oIbwcI/AAAAAAAAAjs/mZwHA-2K0HQ/s1600-h/replicationprogress.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/SS54-oIbwcI/AAAAAAAAAjs/mZwHA-2K0HQ/s400/replicationprogress.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5273285231017443778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Visual Studio 2005 &amp; 2008 AddIn: all Plastic SCM features are now included inside Visual Studio 2005 and higher. You can not only run the regular operations but also create branches, workspaces, run merges, inspect changes, display the branch explorer and so on. &lt;a href="http://www.plasticscm.com/demos/vsextended/vsextended.html"&gt;http://www.plasticscm.com/demos/vsextended/vsextended.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_z6qpykplUvI/SS55jiwmf1I/AAAAAAAAAj0/Tr52RJR6p3Y/s1600-h/vstudio2008-07.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 266px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/SS55jiwmf1I/AAAAAAAAAj0/Tr52RJR6p3Y/s320/vstudio2008-07.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5273285865230466898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Enhanced Eclipse integration: we always try to focus on Eclipse users and 2.7 brings a number of new features such us: the ability to create branches, run merges, smart branch support and the new changesets view.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_z6qpykplUvI/SS56VXYajCI/AAAAAAAAAj8/C2r2HrQWjFQ/s1600-h/eclipse2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 265px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/SS56VXYajCI/AAAAAAAAAj8/C2r2HrQWjFQ/s320/eclipse2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5273286721169689634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Xmerge: yes, finally the "cross merge" is out! What's Xmerge? It's a new step ahead on merge tool development: it's not magic (not yet at least) but it will help you dealing with code moved and modified in parallel on the same file. You'll be able to select the conflicting area and merge moved code with the help of Plastic merge tool. Take a look at &lt;a href="http://codicesoftware.blogspot.com/2008/08/xmerge-tool-to-handle-refactors.html"&gt;http://codicesoftware.blogspot.com/2008/08/xmerge-tool-to-handle-refactors.html&lt;/a&gt; and see how it can help dealing with refactors. It is just the first step so expect much more on the coming releases.&lt;br /&gt;&lt;br /&gt;We've also redesigned the screencast page, so if you want to see Plastic in action just take a look here: &lt;a href="http://www.plasticscm.com/xschannel.aspx"&gt;http://www.plasticscm.com/xschannel.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's a highlights video &lt;a href="http://www.plasticscm.com/demos/plastic27short/3.html"&gt;http://www.plasticscm.com/demos/plastic27short/3.html&lt;/a&gt; and several other interesting ones like an introduction to distributed development using Plastic: &lt;a href="http://www.plasticscm.com/demos/distributed_intro/distributed_intro.html"&gt;http://www.plasticscm.com/demos/distributed_intro/distributed_intro.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-4700866471203956801?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/4700866471203956801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=4700866471203956801' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4700866471203956801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4700866471203956801'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/11/announcing-plastic-27.html' title='Announcing Plastic 2.7'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/SS54-oIbwcI/AAAAAAAAAjs/mZwHA-2K0HQ/s72-c/replicationprogress.png' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8421879977196606187</id><published>2008-11-06T09:47:00.002+01:00</published><updated>2008-11-06T09:50:50.465+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mono'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>C# Evaluator</title><content type='html'>A month ago or so one of the most exciting new feaures of the upcoming Mono 2.2 was introduced: &lt;a href="http://tirania.org/blog/archive/2008/Sep-10.html"&gt;the C# Evaluator&lt;/a&gt;.  (Although now, with the new Mono.SIMD, static compilation and so on, I'm not sure which one is the most exciting piece anymore?)&lt;br /&gt;&lt;br /&gt;Since then I wanted to blog about it to share my thoughts about the possibilities of this new piece of software. For the folks being around for a while C# Evaluator probably reminded them the old Windows Scripting Host which allowed us programmers to embed powerful scripting in our applications. Now, having C# as a scripting language for your own customization purposes opens new paths for innovation and great ideas.&lt;br /&gt;&lt;br /&gt;I'm really eager to include some powerful C# scripting inside &lt;a href="http://www.plasticscm.com"&gt;Plastic &lt;/a&gt;, probably in order to create more powerful workspace selector rules or something like that.&lt;br /&gt;&lt;br /&gt;But first I'll try to tell a little bit about how to play with the C# eval in order to learn how it works. First thing is to build and set up the latest mono, so let's start there.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setting up a 2.2 environment&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Once Mono 2.0 was releases I set up a OpenSuse 11 box to play around with it. I was having some trouble building 2.0 on Solaris and OpenSolaris, so having the chance to download and build on Linux was a real pleasure.&lt;br /&gt;&lt;br /&gt;So, first I installed OpenSuse 11 with the development tools that can be configured during the installation process. Then I set up 2.0 downloading it from the official Mono repository (check the mono website and go to downloads).&lt;br /&gt;&lt;br /&gt;And then I just downloaded trunk from the mono repos&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ svn co svn://anonsvn.mono-project.com/source/trunk/mono&lt;br /&gt;$ svn co svn://anonsvn.mono-project.com/source/trunk/mcs&lt;br /&gt;$ svn co svn://anonsvn.mono-project.com/source/trunk/libgdiplus&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And launch the build process&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ autogen.sh --prefix=/home/pablo/monobin&lt;br /&gt;$ make&lt;br /&gt;$ make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Note I generated the binaries on my home dir.&lt;br /&gt;&lt;br /&gt;I built everything under /home/pablo/monobin because I still wanted to use official mono 2.0 for regular operations and 2.2 just for testing and development purposes.&lt;br /&gt;&lt;br /&gt;In order to use the newly compiled mono 2.2 you just have to set up your MONO_PATH env var:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ export MONO_PATH=/home/pablo/monobin&lt;br /&gt;$ export PATH=/home/pablo/monobin/bin/:$PATH&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enter the C# Evaluator&lt;/strong&gt;&lt;br /&gt;Miguel introduced a sample in his blog post (http://tirania.org/blog/archive/2008/Sep-10.html) but he didn't tell how to perform an action I consider very interesting: making the script interact with your own classes. (Of course I bet he didn't do that because it is more than obvious for most of the people out there, but I hope you still find this sample interesting).&lt;br /&gt;&lt;br /&gt;So, as I said, the real beauty of introducing some scripting in your application is not running simple calculations, but making the script interact with your own internal classes or ad-hoc APIs, right?&lt;br /&gt;&lt;br /&gt;So, here you can find some very simple source code (the simplest) showing you how to interact with your own assembly. Note I'm adding the current assembly to the script references, and also introducing a using sentence.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;using Mono.CSharp;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System;&lt;br /&gt;&lt;br /&gt;namespace CSharpEvalTest&lt;br /&gt;{&lt;br /&gt;  public class Test&lt;br /&gt;  {&lt;br /&gt;    public static int val = 1000;&lt;br /&gt;&lt;br /&gt;    static void Main(string [] args)&lt;br /&gt;    {&lt;br /&gt;      Evaluator.Run(&lt;br /&gt;        "using System; using CSharpEvalTest;");&lt;br /&gt;&lt;br /&gt;      Evaluator.ReferenceAssembly(&lt;br /&gt;        Assembly.GetExecutingAssembly());&lt;br /&gt;&lt;br /&gt;      Evaluator.Run("Test.val = 120;");&lt;br /&gt;      Console.WriteLine("val is {0}", val);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;How to build the code?&lt;br /&gt;&lt;br /&gt;Easy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ gmcs test.cs -r:gmcs.exe&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And you're done.&lt;br /&gt;&lt;br /&gt;Remember I've modified both PATH (to get the new gmcs) and MONO_PATH!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8421879977196606187?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8421879977196606187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=8421879977196606187' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8421879977196606187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8421879977196606187'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/11/c-evaluator.html' title='C# Evaluator'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00786604303329594412'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1244382752088146123</id><published>2008-11-03T13:33:00.001+01:00</published><updated>2008-11-03T20:46:16.931+01:00</updated><title type='text'>Branching Basics Video</title><content type='html'>We just finished a new recording on branching basics with Plastic SCM. This part of an ongoing effort to publish a video every week or every other week that documents and outlines Plastic SCM features.&lt;br /&gt;&lt;br /&gt;The purpose of this video is to introduce users to branching with Plastic at a novice level.&lt;br /&gt;&lt;a href="http://www.codicesoftware.com/demos/blog_branching/blog_branching.htm"&gt;&lt;br /&gt;Click For Full Screen Video&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1244382752088146123?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1244382752088146123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=1244382752088146123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1244382752088146123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1244382752088146123'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/11/branching-basics-video.html' title='Branching Basics Video'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7560945262789304011</id><published>2008-11-03T13:30:00.003+01:00</published><updated>2008-11-04T01:08:31.622+01:00</updated><title type='text'>Plastic Quick Start Video</title><content type='html'>Here is a video just recorded to walk users through some of the basic functionality and usability features available with Plastic SCM. This video picks up right after the point of installation and has a running time of 9:36.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/demos/blog_quickstart/blog_quickstart.htm"&gt;Click for Full Screen Video&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7560945262789304011?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7560945262789304011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=27232680&amp;postID=7560945262789304011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7560945262789304011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7560945262789304011'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2008/11/plastic-quick-start-video.html' title='Plastic Quick Start Video'/><author><name>Pat Burma</name><uri>http://www.blogger.com/profile/10131011625336774198</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='10578627280708628860'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>